diff --git a/ApplicationCode/Commands/GridCrossPlotCommands/RicCreateSaturationPressurePlotsFeature.cpp b/ApplicationCode/Commands/GridCrossPlotCommands/RicCreateSaturationPressurePlotsFeature.cpp index 9ab2046d7d..3d815c67e8 100644 --- a/ApplicationCode/Commands/GridCrossPlotCommands/RicCreateSaturationPressurePlotsFeature.cpp +++ b/ApplicationCode/Commands/GridCrossPlotCommands/RicCreateSaturationPressurePlotsFeature.cpp @@ -112,16 +112,18 @@ void RicCreateSaturationPressurePlotsFeature::onActionTriggered(bool isChecked) caf::PdmObject* objectToSelect = nullptr; - if (eclipseResultCase) + if (eclipseResultCase && eclipseResultCase->ensureReservoirCaseIsOpen()) { - eclipseResultCase->ensureReservoirCaseIsOpen(); + eclipseResultCase->ensureDeckIsParsedForEquilData(); + + RigEclipseCaseData* eclipseCaseData = eclipseResultCase->eclipseCaseData(); bool requiredInputDataPresent = false; - if (!eclipseResultCase->eclipseCaseData()->equilData().empty()) + if (!eclipseCaseData->equilData().empty()) { - if (eclipseResultCase->eclipseCaseData() && eclipseResultCase->eclipseCaseData()->results(RiaDefines::MATRIX_MODEL)) + if (eclipseCaseData && eclipseCaseData->results(RiaDefines::MATRIX_MODEL)) { - RigCaseCellResultsData* resultData = eclipseResultCase->eclipseCaseData()->results(RiaDefines::MATRIX_MODEL); + RigCaseCellResultsData* resultData = eclipseCaseData->results(RiaDefines::MATRIX_MODEL); if (resultData->hasResultEntry(RigEclipseResultAddress(RiaDefines::DYNAMIC_NATIVE, "PRESSURE")) && resultData->hasResultEntry(RigEclipseResultAddress(RiaDefines::DYNAMIC_NATIVE, "PDEW")) && diff --git a/ApplicationCode/FileInterface/RifReaderEclipseOutput.cpp b/ApplicationCode/FileInterface/RifReaderEclipseOutput.cpp index bc3cbc8b82..44ed44c141 100644 --- a/ApplicationCode/FileInterface/RifReaderEclipseOutput.cpp +++ b/ApplicationCode/FileInterface/RifReaderEclipseOutput.cpp @@ -404,7 +404,7 @@ bool RifReaderEclipseOutput::open(const QString& fileName, RigEclipseCaseData* e } { - auto task = progress.task("Reading faults", 5); + auto task = progress.task("Reading faults", 10); if (isFaultImportEnabled()) { @@ -417,12 +417,6 @@ bool RifReaderEclipseOutput::open(const QString& fileName, RigEclipseCaseData* e } } - { - auto task = progress.task("Reading EQUIL", 5); - - importEquilData(fileSet, eclipseCase); - } - m_eclipseCase = eclipseCase; { @@ -641,51 +635,39 @@ void RifReaderEclipseOutput::importFaults(const QStringList& fileSet, cvf::Colle //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RifReaderEclipseOutput::importEquilData(const QStringList& fileSet, RigEclipseCaseData* eclipseCase) +void RifReaderEclipseOutput::importEquilData(const QString& deckFileName, + const QString& includeStatementAbsolutePathPrefix, + RigEclipseCaseData* eclipseCase) { - QString dataFileName; - - for (const QString& fileName : fileSet) + QFile data(deckFileName); + if (data.open(QFile::ReadOnly)) { - if (fileName.endsWith(".DATA")) + const QString keyword("EQUIL"); + const QString keywordToStopParsing("SCHEDULE"); + const qint64 startPositionInFile = 0; + std::vector> pathAliasDefinitions; + QStringList keywordContent; + std::vector fileNamesContainingKeyword; + bool isStopParsingKeywordDetected = false; + + RifEclipseInputFileTools::readKeywordAndParseIncludeStatementsRecursively(keyword, + keywordToStopParsing, + data, + startPositionInFile, + pathAliasDefinitions, + &keywordContent, + &fileNamesContainingKeyword, + &isStopParsingKeywordDetected, + includeStatementAbsolutePathPrefix); + std::vector equilItems; + for (const auto& s : keywordContent) { - dataFileName = fileName; + RigEquil equilRec = RigEquil::parseString(s); + + equilItems.push_back(equilRec); } - } - if (!dataFileName.isEmpty()) - { - QFile data(dataFileName); - if (data.open(QFile::ReadOnly)) - { - const QString keyword("EQUIL"); - const QString keywordToStopParsing("SCHEDULE"); - const qint64 startPositionInFile = 0; - std::vector> pathAliasDefinitions; - QStringList keywordContent; - std::vector fileNamesContainingKeyword; - bool isStopParsingKeywordDetected = false; - const QString includeStatementAbsolutePathPrefix = faultIncludeFileAbsolutePathPrefix(); - - RifEclipseInputFileTools::readKeywordAndParseIncludeStatementsRecursively(keyword, - keywordToStopParsing, - data, - startPositionInFile, - pathAliasDefinitions, - &keywordContent, - &fileNamesContainingKeyword, - &isStopParsingKeywordDetected, - includeStatementAbsolutePathPrefix); - std::vector equilItems; - for (const auto& s : keywordContent) - { - RigEquil equilRec = RigEquil::parseString(s); - - equilItems.push_back(equilRec); - } - - eclipseCase->setEquilData(equilItems); - } + eclipseCase->setEquilData(equilItems); } } diff --git a/ApplicationCode/FileInterface/RifReaderEclipseOutput.h b/ApplicationCode/FileInterface/RifReaderEclipseOutput.h index b2c52eacfd..8efcb14c05 100644 --- a/ApplicationCode/FileInterface/RifReaderEclipseOutput.h +++ b/ApplicationCode/FileInterface/RifReaderEclipseOutput.h @@ -76,6 +76,10 @@ public: const cvf::Vec3st& refinement); static void transferCoarseningInfo(const ecl_grid_type* eclGrid, RigGridBase* grid); + + static void importEquilData(const QString& deckFileName, + const QString& includeStatementAbsolutePathPrefix, + RigEclipseCaseData* eclipseCase); std::set availablePhases() const override; @@ -89,7 +93,6 @@ private: RigWellResultPoint createWellResultPoint(const RigGridBase* grid, const well_conn_type* ert_connection, int ertBranchId, int ertSegmentId, const char* wellName); void importFaults(const QStringList& fileSet, cvf::Collection* faults); - void importEquilData(const QStringList& fileSet, RigEclipseCaseData* eclipseCase); void openInitFile(); diff --git a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimSaturationPressurePlot.cpp b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimSaturationPressurePlot.cpp index c550e20869..77daf8b802 100644 --- a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimSaturationPressurePlot.cpp +++ b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimSaturationPressurePlot.cpp @@ -18,6 +18,9 @@ #include "RimSaturationPressurePlot.h" +#include "RiaColorTables.h" +#include "RiaLogging.h" + #include "RigCaseCellResultsData.h" #include "RigEclipseCaseData.h" #include "RigEquil.h" @@ -29,7 +32,6 @@ #include "RimPlotAxisProperties.h" #include "CellFilters/RimPlotCellPropertyFilter.h" -#include "RiaColorTables.h" CAF_PDM_SOURCE_INIT(RimSaturationPressurePlot, "RimSaturationPressurePlot"); @@ -48,6 +50,15 @@ void RimSaturationPressurePlot::assignCaseAndEquilibriumRegion(RiaDefines::Poros RimEclipseResultCase* eclipseResultCase, int zeroBasedEquilRegionIndex) { + CVF_ASSERT(eclipseResultCase && eclipseResultCase->eclipseCaseData()); + + auto equilData = eclipseResultCase->eclipseCaseData()->equilData(); + if (zeroBasedEquilRegionIndex >= equilData.size()) + { + RiaLogging::error("Invalid equilibrium region index"); + return; + } + setShowInfoBox(false); nameConfig()->addDataSetNames = false; @@ -56,8 +67,7 @@ void RimSaturationPressurePlot::assignCaseAndEquilibriumRegion(RiaDefines::Poros nameConfig()->setCustomName(plotTitle); - auto equilData = eclipseResultCase->eclipseCaseData()->equilData(); - auto eq = equilData[zeroBasedEquilRegionIndex]; + auto eq = equilData[zeroBasedEquilRegionIndex]; double gasOilContactDepth = eq.gasOilContactDepth(); double waterOilContactDepth = eq.waterOilContactDepth(); diff --git a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimSaturationPressurePlotCollection.cpp b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimSaturationPressurePlotCollection.cpp index f565370e90..d7bd12655f 100644 --- a/ApplicationCode/ProjectDataModel/GridCrossPlots/RimSaturationPressurePlotCollection.cpp +++ b/ApplicationCode/ProjectDataModel/GridCrossPlots/RimSaturationPressurePlotCollection.cpp @@ -74,6 +74,7 @@ std::vector } } + eclipseResultCase->ensureDeckIsParsedForEquilData(); std::vector equilData = eclipseCaseData->equilData(); for (size_t i = 0; i < equilData.size(); i++) { diff --git a/ApplicationCode/ProjectDataModel/RimEclipseCase.cpp b/ApplicationCode/ProjectDataModel/RimEclipseCase.cpp index 0299fe52ee..27ad009261 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipseCase.cpp +++ b/ApplicationCode/ProjectDataModel/RimEclipseCase.cpp @@ -28,6 +28,8 @@ #include "CompletionExportCommands/RicWellPathExportCompletionDataFeatureImpl.h" +#include "RifReaderSettings.h" + #include "RigActiveCellInfo.h" #include "RigCaseCellResultsData.h" #include "RigEclipseCaseData.h" @@ -63,6 +65,9 @@ #include "cafPdmUiTreeOrdering.h" #include "cafProgressInfo.h" +#include "cafUtils.h" +#include + CAF_PDM_XML_ABSTRACT_SOURCE_INIT(RimEclipseCase, "RimReservoir"); //------------------------------------------------------------------------------------------------ @@ -154,6 +159,33 @@ const RigEclipseCaseData* RimEclipseCase::eclipseCaseData() const return m_rigEclipseCase.p(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEclipseCase::ensureDeckIsParsedForEquilData() +{ + if (m_rigEclipseCase.notNull()) + { + QString includeFileAbsolutePathPrefix; + { + RiaPreferences* prefs = RiaApplication::instance()->preferences(); + if (prefs->readerSettings()) + { + includeFileAbsolutePathPrefix = prefs->readerSettings()->faultIncludeFileAbsolutePathPrefix(); + } + } + + QString dataDeckFile; + { + QFileInfo fi(gridFileName()); + + dataDeckFile = caf::Utils::constructFullFileName(fi.absolutePath(), fi.baseName(), ".DATA"); + } + + m_rigEclipseCase->ensureDeckIsParsedForEquilData(dataDeckFile, includeFileAbsolutePathPrefix); + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -518,7 +550,7 @@ void RimEclipseCase::computeCachedData() if (rigEclipseCase) { caf::ProgressInfo pInf(30, ""); - + { auto task = pInf.task("", 1); rigEclipseCase->computeActiveCellBoundingBoxes(); diff --git a/ApplicationCode/ProjectDataModel/RimEclipseCase.h b/ApplicationCode/ProjectDataModel/RimEclipseCase.h index 73601c6307..ab94d5c59d 100644 --- a/ApplicationCode/ProjectDataModel/RimEclipseCase.h +++ b/ApplicationCode/ProjectDataModel/RimEclipseCase.h @@ -75,6 +75,7 @@ public: RigEclipseCaseData* eclipseCaseData(); const RigEclipseCaseData* eclipseCaseData() const; + void ensureDeckIsParsedForEquilData(); cvf::Color3f defaultWellColor(const QString& wellName); const RigMainGrid* mainGrid() const; diff --git a/ApplicationCode/ProjectDataModel/RimPlotAxisAnnotation.cpp b/ApplicationCode/ProjectDataModel/RimPlotAxisAnnotation.cpp index 0815ebbec1..20661ee764 100644 --- a/ApplicationCode/ProjectDataModel/RimPlotAxisAnnotation.cpp +++ b/ApplicationCode/ProjectDataModel/RimPlotAxisAnnotation.cpp @@ -231,6 +231,8 @@ std::vector RimPlotAxisAnnotation::equilItems() const { if (m_sourceCase && m_sourceCase->eclipseCaseData()) { + m_sourceCase->ensureDeckIsParsedForEquilData(); + return m_sourceCase->eclipseCaseData()->equilData(); } diff --git a/ApplicationCode/ReservoirDataModel/RigEclipseCaseData.cpp b/ApplicationCode/ReservoirDataModel/RigEclipseCaseData.cpp index d1acf036d7..06d354953e 100644 --- a/ApplicationCode/ReservoirDataModel/RigEclipseCaseData.cpp +++ b/ApplicationCode/ReservoirDataModel/RigEclipseCaseData.cpp @@ -22,6 +22,8 @@ #include "RiaApplication.h" +#include "RifReaderEclipseOutput.h" + #include "RigActiveCellInfo.h" #include "RigCaseCellResultsData.h" #include "RigEquil.h" @@ -44,6 +46,7 @@ /// //-------------------------------------------------------------------------------------------------- RigEclipseCaseData::RigEclipseCaseData(RimEclipseCase* ownerCase) + : m_hasParsedDeckForEquilData(false) { m_mainGrid = new RigMainGrid(); m_ownerCase = ownerCase; @@ -550,6 +553,19 @@ const RigVirtualPerforationTransmissibilities* RigEclipseCaseData::virtualPerfor return m_virtualPerforationTransmissibilities.p(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigEclipseCaseData::ensureDeckIsParsedForEquilData(const QString& dataDeckFile, const QString& includeFileAbsolutePathPrefix) +{ + if (!m_hasParsedDeckForEquilData) + { + RifReaderEclipseOutput::importEquilData(dataDeckFile, includeFileAbsolutePathPrefix, this); + + m_hasParsedDeckForEquilData = true; + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -751,4 +767,3 @@ const std::vector* RigEclipseCaseData::resultValues(RiaDefines::Porosity return swatResults; } - diff --git a/ApplicationCode/ReservoirDataModel/RigEclipseCaseData.h b/ApplicationCode/ReservoirDataModel/RigEclipseCaseData.h index b996d8d9a0..d5b0b0b543 100644 --- a/ApplicationCode/ReservoirDataModel/RigEclipseCaseData.h +++ b/ApplicationCode/ReservoirDataModel/RigEclipseCaseData.h @@ -119,6 +119,7 @@ public: void clearWellCellsInGridCache() { m_wellCellsInGrid.clear(); } + void ensureDeckIsParsedForEquilData(const QString& dataDeckFile, const QString& includeFileAbsolutePathPrefix); std::vector equilData() const; void setEquilData(const std::vector& equilObjects); @@ -145,6 +146,7 @@ private: RiaEclipseUnitTools::UnitSystem m_unitsType; + bool m_hasParsedDeckForEquilData; std::vector m_equil; mutable std::map, cvf::Collection> m_simWellBranchCache;