From 95d1c98bee2be0db5d6e4e1825e57a5f245ee951 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Sun, 7 Apr 2013 17:27:45 +0200 Subject: [PATCH] Read grid dimensions and verify equality before adding a result case Harmonized and refactored creation of RimResultCases p4#: 21156 --- .../Application/RiaApplication.cpp | 56 ++++++++++--------- .../RimIdenticalGridCaseGroup.cpp | 34 +++++++++-- .../RimIdenticalGridCaseGroup.h | 2 + .../ProjectDataModel/RimUiTreeModelPdm.cpp | 38 ++++++++++--- .../ReservoirDataModel/RigGridManager.cpp | 23 ++++++++ .../ReservoirDataModel/RigGridManager.h | 5 +- 6 files changed, 117 insertions(+), 41 deletions(-) diff --git a/ApplicationCode/Application/RiaApplication.cpp b/ApplicationCode/Application/RiaApplication.cpp index c534ebc91d..503d3e2d9d 100644 --- a/ApplicationCode/Application/RiaApplication.cpp +++ b/ApplicationCode/Application/RiaApplication.cpp @@ -56,6 +56,7 @@ #include "RiaImageCompareReporter.h" #include "RiaImageFileCompare.h" #include "cafProgressInfo.h" +#include "RigGridManager.h" namespace caf { @@ -494,10 +495,7 @@ bool RiaApplication::openEclipseCase(const QString& caseName, const QString& cas QFileInfo gridFileName(caseFileName); QString casePath = gridFileName.absolutePath(); - RimResultCase* rimResultReservoir = new RimResultCase(); - rimResultReservoir->caseName = caseName; - rimResultReservoir->caseFileName = caseFileName; - rimResultReservoir->caseDirectory = casePath; + RimResultCase* rimResultReservoir = new RimResultCase(caseName, caseFileName, casePath); m_project->reservoirs.push_back(rimResultReservoir); @@ -1356,11 +1354,11 @@ bool RiaApplication::addEclipseCases(const QStringList& fileNames) { if (fileNames.size() == 0) return true; - // First file is read completely including grid. // The main grid from the first case is reused directly in for the other cases. // When reading active cell info, only the total cell count is tested for consistency - RigCaseData* mainEclipseCase = NULL; + RimResultCase* mainResultCase = NULL; + std::vector< std::vector > mainCaseGridDimensions; { QString firstFileName = fileNames[0]; @@ -1369,46 +1367,54 @@ bool RiaApplication::addEclipseCases(const QStringList& fileNames) QString caseName = gridFileName.completeBaseName(); QString casePath = gridFileName.absolutePath(); - RimResultCase* rimResultReservoir = new RimResultCase(); - rimResultReservoir->caseName = caseName; - rimResultReservoir->caseFileName = firstFileName; - rimResultReservoir->caseDirectory = casePath; - - m_project->reservoirs.push_back(rimResultReservoir); - + RimResultCase* rimResultReservoir = new RimResultCase(caseName, firstFileName, casePath); if (!rimResultReservoir->openEclipseGridFile()) { + delete rimResultReservoir; + return false; } + rimResultReservoir->readGridDimensions(mainCaseGridDimensions); + + m_project->reservoirs.push_back(rimResultReservoir); m_project->moveEclipseCaseIntoCaseGroup(rimResultReservoir); - mainEclipseCase = rimResultReservoir->reservoirData(); + mainResultCase = rimResultReservoir; } caf::ProgressInfo info(fileNames.size(), "Reading Active Cell data"); for (int i = 1; i < fileNames.size(); i++) { - QString fileName = fileNames[i]; - QFileInfo gridFileName(fileName); + QString caseFileName = fileNames[i]; + QFileInfo gridFileName(caseFileName); QString caseName = gridFileName.completeBaseName(); QString casePath = gridFileName.absolutePath(); - RimResultCase* rimResultReservoir = new RimResultCase(); - rimResultReservoir->caseName = caseName; - rimResultReservoir->caseFileName = fileName; - rimResultReservoir->caseDirectory = casePath; + RimResultCase* rimResultReservoir = new RimResultCase(caseName, caseFileName, casePath); - m_project->reservoirs.push_back(rimResultReservoir); + std::vector< std::vector > caseGridDimensions; + rimResultReservoir->readGridDimensions(caseGridDimensions); - if (!rimResultReservoir->openAndReadActiveCellData(mainEclipseCase)) + bool identicalGrid = RigGridManager::isGridDimensionsEqual(mainCaseGridDimensions, caseGridDimensions); + if (identicalGrid) { - return false; + if (rimResultReservoir->openAndReadActiveCellData(mainResultCase->reservoirData())) + { + m_project->reservoirs.push_back(rimResultReservoir); + m_project->moveEclipseCaseIntoCaseGroup(rimResultReservoir); + } + else + { + delete rimResultReservoir; + } + } + else + { + delete rimResultReservoir; } - - m_project->moveEclipseCaseIntoCaseGroup(rimResultReservoir); info.setProgress(i); } diff --git a/ApplicationCode/ProjectDataModel/RimIdenticalGridCaseGroup.cpp b/ApplicationCode/ProjectDataModel/RimIdenticalGridCaseGroup.cpp index c59972e211..919bc329d6 100644 --- a/ApplicationCode/ProjectDataModel/RimIdenticalGridCaseGroup.cpp +++ b/ApplicationCode/ProjectDataModel/RimIdenticalGridCaseGroup.cpp @@ -30,6 +30,7 @@ #include "RimResultCase.h" #include "cafProgressInfo.h" #include "RigActiveCellInfo.h" +#include "RigGridManager.h" CAF_PDM_SOURCE_INIT(RimIdenticalGridCaseGroup, "RimIdenticalGridCaseGroup"); @@ -78,15 +79,15 @@ void RimIdenticalGridCaseGroup::addCase(RimCase* reservoir) if (!reservoir) return; - RigMainGrid* incomingMainGrid = reservoir->reservoirData()->mainGrid(); - if (!m_mainGrid) { - m_mainGrid = incomingMainGrid; + m_mainGrid = reservoir->reservoirData()->mainGrid(); + } + else + { + reservoir->reservoirData()->setMainGrid(m_mainGrid); } - CVF_ASSERT(m_mainGrid == incomingMainGrid); - caseCollection()->reservoirs().push_back(reservoir); if (statisticsCaseCollection->reservoirs().size() == 0) @@ -423,3 +424,26 @@ RimCase* RimIdenticalGridCaseGroup::mainCase() return NULL; } } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimIdenticalGridCaseGroup::canCaseBeAdded(RimCase* reservoir) const +{ + CVF_ASSERT(reservoir && reservoir->reservoirData() && reservoir->reservoirData()->mainGrid()); + + if (!m_mainGrid) + { + // Empty case group, reservoir can be added + return true; + } + + RigMainGrid* incomingMainGrid = reservoir->reservoirData()->mainGrid(); + + if (RigGridManager::isEqual(m_mainGrid, incomingMainGrid)) + { + return true; + } + + return false; +} diff --git a/ApplicationCode/ProjectDataModel/RimIdenticalGridCaseGroup.h b/ApplicationCode/ProjectDataModel/RimIdenticalGridCaseGroup.h index c35eedb77e..fb9201a1fd 100644 --- a/ApplicationCode/ProjectDataModel/RimIdenticalGridCaseGroup.h +++ b/ApplicationCode/ProjectDataModel/RimIdenticalGridCaseGroup.h @@ -49,7 +49,9 @@ public: void addCase(RimCase* reservoir); void removeCase(RimCase* reservoir); + bool contains(RimCase* reservoir) const; + bool canCaseBeAdded(RimCase* reservoir) const; RimStatisticsCase* createAndAppendStatisticsCase(); diff --git a/ApplicationCode/ProjectDataModel/RimUiTreeModelPdm.cpp b/ApplicationCode/ProjectDataModel/RimUiTreeModelPdm.cpp index 93e635d901..f0dce14774 100644 --- a/ApplicationCode/ProjectDataModel/RimUiTreeModelPdm.cpp +++ b/ApplicationCode/ProjectDataModel/RimUiTreeModelPdm.cpp @@ -37,6 +37,7 @@ #include "RimInputCase.h" #include "RimStatisticsCase.h" #include "RimResultCase.h" +#include "RigGridManager.h" //-------------------------------------------------------------------------------------------------- /// @@ -592,19 +593,29 @@ void RimUiTreeModelPdm::addObjects(const QModelIndex& itemIndex, caf::PdmObjectG CVF_ASSERT(proj); RimIdenticalGridCaseGroup* gridCaseGroup = gridCaseGroupFromItemIndex(itemIndex); - if (gridCaseGroup) { std::vector > typedObjects; pdmObjects.createCopyByType(&typedObjects); - RigCaseData* mainEclipseCase = NULL; - if (gridCaseGroup->caseCollection()->reservoirs().size() > 0) + if (typedObjects.size() == 0) { - RimCase* mainReservoir = gridCaseGroup->caseCollection()->reservoirs()[0]; - mainEclipseCase = mainReservoir->reservoirData(); + return; } + RimResultCase* mainResultCase = NULL; + std::vector< std::vector > mainCaseGridDimensions; + + // Read out main grid and main grid dimensions if present in case group + if (gridCaseGroup->mainCase()) + { + mainResultCase = dynamic_cast(gridCaseGroup->mainCase()); + CVF_ASSERT(mainResultCase); + + mainResultCase->readGridDimensions(mainCaseGridDimensions); + } + + // Add cases to case group for (size_t i = 0; i < typedObjects.size(); i++) { RimResultCase* rimResultReservoir = typedObjects[i]; @@ -614,14 +625,25 @@ void RimUiTreeModelPdm::addObjects(const QModelIndex& itemIndex, caf::PdmObjectG continue; } - if (gridCaseGroup->mainGrid() == NULL) + if (!mainResultCase) { rimResultReservoir->openEclipseGridFile(); - mainEclipseCase = rimResultReservoir->reservoirData(); + rimResultReservoir->readGridDimensions(mainCaseGridDimensions); + + mainResultCase = rimResultReservoir; } else { - if (!rimResultReservoir->openAndReadActiveCellData(mainEclipseCase)) + std::vector< std::vector > caseGridDimensions; + rimResultReservoir->readGridDimensions(caseGridDimensions); + + bool identicalGrid = RigGridManager::isGridDimensionsEqual(mainCaseGridDimensions, caseGridDimensions); + if (!identicalGrid) + { + continue; + } + + if (!rimResultReservoir->openAndReadActiveCellData(mainResultCase->reservoirData())) { CVF_ASSERT(false); } diff --git a/ApplicationCode/ReservoirDataModel/RigGridManager.cpp b/ApplicationCode/ReservoirDataModel/RigGridManager.cpp index 2c7fbbba91..e1b6eb459d 100644 --- a/ApplicationCode/ReservoirDataModel/RigGridManager.cpp +++ b/ApplicationCode/ReservoirDataModel/RigGridManager.cpp @@ -96,6 +96,29 @@ void RigGridManager::clear() m_caseToGrid.clear(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RigGridManager::isGridDimensionsEqual(const std::vector< std::vector >& mainCaseGridDimensions, const std::vector< std::vector >& caseGridDimensions) +{ + if (mainCaseGridDimensions.size() != caseGridDimensions.size()) + { + return false; + } + + for (size_t j = 0; j < mainCaseGridDimensions.size(); j++) + { + if (mainCaseGridDimensions[j].size() != 3) return false; + if (caseGridDimensions[j].size() != 3) return false; + + if (mainCaseGridDimensions[j][0] != caseGridDimensions[j][0]) return false; + if (mainCaseGridDimensions[j][1] != caseGridDimensions[j][1]) return false; + if (mainCaseGridDimensions[j][2] != caseGridDimensions[j][2]) return false; + } + + return true; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ReservoirDataModel/RigGridManager.h b/ApplicationCode/ReservoirDataModel/RigGridManager.h index 3d6dada127..7f5f2adc45 100644 --- a/ApplicationCode/ReservoirDataModel/RigGridManager.h +++ b/ApplicationCode/ReservoirDataModel/RigGridManager.h @@ -38,10 +38,9 @@ public: void clear(); -private: - static bool isEqual(RigMainGrid* gridA, RigMainGrid* gridB); - + static bool isGridDimensionsEqual(const std::vector< std::vector >& mainCaseGridDimensions, const std::vector< std::vector >& caseGridDimensions); +private: class CaseToGridMap : public cvf::Object { public: