#4281 Saturation pressure plots : Delay loading of EQUIL until required

This commit is contained in:
Magne Sjaastad 2019-04-04 15:19:30 +02:00
parent 733be4f539
commit a812190af3
10 changed files with 108 additions and 58 deletions

View File

@ -112,16 +112,18 @@ void RicCreateSaturationPressurePlotsFeature::onActionTriggered(bool isChecked)
caf::PdmObject* objectToSelect = nullptr; caf::PdmObject* objectToSelect = nullptr;
if (eclipseResultCase) if (eclipseResultCase && eclipseResultCase->ensureReservoirCaseIsOpen())
{ {
eclipseResultCase->ensureReservoirCaseIsOpen(); eclipseResultCase->ensureDeckIsParsedForEquilData();
RigEclipseCaseData* eclipseCaseData = eclipseResultCase->eclipseCaseData();
bool requiredInputDataPresent = false; 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")) && if (resultData->hasResultEntry(RigEclipseResultAddress(RiaDefines::DYNAMIC_NATIVE, "PRESSURE")) &&
resultData->hasResultEntry(RigEclipseResultAddress(RiaDefines::DYNAMIC_NATIVE, "PDEW")) && resultData->hasResultEntry(RigEclipseResultAddress(RiaDefines::DYNAMIC_NATIVE, "PDEW")) &&

View File

@ -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()) 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; 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; QFile data(deckFileName);
if (data.open(QFile::ReadOnly))
for (const QString& fileName : fileSet)
{ {
if (fileName.endsWith(".DATA")) const QString keyword("EQUIL");
const QString keywordToStopParsing("SCHEDULE");
const qint64 startPositionInFile = 0;
std::vector<std::pair<QString, QString>> pathAliasDefinitions;
QStringList keywordContent;
std::vector<QString> fileNamesContainingKeyword;
bool isStopParsingKeywordDetected = false;
RifEclipseInputFileTools::readKeywordAndParseIncludeStatementsRecursively(keyword,
keywordToStopParsing,
data,
startPositionInFile,
pathAliasDefinitions,
&keywordContent,
&fileNamesContainingKeyword,
&isStopParsingKeywordDetected,
includeStatementAbsolutePathPrefix);
std::vector<RigEquil> equilItems;
for (const auto& s : keywordContent)
{ {
dataFileName = fileName; RigEquil equilRec = RigEquil::parseString(s);
equilItems.push_back(equilRec);
} }
}
if (!dataFileName.isEmpty()) eclipseCase->setEquilData(equilItems);
{
QFile data(dataFileName);
if (data.open(QFile::ReadOnly))
{
const QString keyword("EQUIL");
const QString keywordToStopParsing("SCHEDULE");
const qint64 startPositionInFile = 0;
std::vector<std::pair<QString, QString>> pathAliasDefinitions;
QStringList keywordContent;
std::vector<QString> fileNamesContainingKeyword;
bool isStopParsingKeywordDetected = false;
const QString includeStatementAbsolutePathPrefix = faultIncludeFileAbsolutePathPrefix();
RifEclipseInputFileTools::readKeywordAndParseIncludeStatementsRecursively(keyword,
keywordToStopParsing,
data,
startPositionInFile,
pathAliasDefinitions,
&keywordContent,
&fileNamesContainingKeyword,
&isStopParsingKeywordDetected,
includeStatementAbsolutePathPrefix);
std::vector<RigEquil> equilItems;
for (const auto& s : keywordContent)
{
RigEquil equilRec = RigEquil::parseString(s);
equilItems.push_back(equilRec);
}
eclipseCase->setEquilData(equilItems);
}
} }
} }

View File

@ -76,6 +76,10 @@ public:
const cvf::Vec3st& refinement); const cvf::Vec3st& refinement);
static void transferCoarseningInfo(const ecl_grid_type* eclGrid, RigGridBase* grid); static void transferCoarseningInfo(const ecl_grid_type* eclGrid, RigGridBase* grid);
static void importEquilData(const QString& deckFileName,
const QString& includeStatementAbsolutePathPrefix,
RigEclipseCaseData* eclipseCase);
std::set<RiaDefines::PhaseType> availablePhases() const override; std::set<RiaDefines::PhaseType> 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); 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<RigFault>* faults); void importFaults(const QStringList& fileSet, cvf::Collection<RigFault>* faults);
void importEquilData(const QStringList& fileSet, RigEclipseCaseData* eclipseCase);
void openInitFile(); void openInitFile();

View File

@ -18,6 +18,9 @@
#include "RimSaturationPressurePlot.h" #include "RimSaturationPressurePlot.h"
#include "RiaColorTables.h"
#include "RiaLogging.h"
#include "RigCaseCellResultsData.h" #include "RigCaseCellResultsData.h"
#include "RigEclipseCaseData.h" #include "RigEclipseCaseData.h"
#include "RigEquil.h" #include "RigEquil.h"
@ -29,7 +32,6 @@
#include "RimPlotAxisProperties.h" #include "RimPlotAxisProperties.h"
#include "CellFilters/RimPlotCellPropertyFilter.h" #include "CellFilters/RimPlotCellPropertyFilter.h"
#include "RiaColorTables.h"
CAF_PDM_SOURCE_INIT(RimSaturationPressurePlot, "RimSaturationPressurePlot"); CAF_PDM_SOURCE_INIT(RimSaturationPressurePlot, "RimSaturationPressurePlot");
@ -48,6 +50,15 @@ void RimSaturationPressurePlot::assignCaseAndEquilibriumRegion(RiaDefines::Poros
RimEclipseResultCase* eclipseResultCase, RimEclipseResultCase* eclipseResultCase,
int zeroBasedEquilRegionIndex) 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); setShowInfoBox(false);
nameConfig()->addDataSetNames = false; nameConfig()->addDataSetNames = false;
@ -56,8 +67,7 @@ void RimSaturationPressurePlot::assignCaseAndEquilibriumRegion(RiaDefines::Poros
nameConfig()->setCustomName(plotTitle); nameConfig()->setCustomName(plotTitle);
auto equilData = eclipseResultCase->eclipseCaseData()->equilData(); auto eq = equilData[zeroBasedEquilRegionIndex];
auto eq = equilData[zeroBasedEquilRegionIndex];
double gasOilContactDepth = eq.gasOilContactDepth(); double gasOilContactDepth = eq.gasOilContactDepth();
double waterOilContactDepth = eq.waterOilContactDepth(); double waterOilContactDepth = eq.waterOilContactDepth();

View File

@ -74,6 +74,7 @@ std::vector<RimSaturationPressurePlot*>
} }
} }
eclipseResultCase->ensureDeckIsParsedForEquilData();
std::vector<RigEquil> equilData = eclipseCaseData->equilData(); std::vector<RigEquil> equilData = eclipseCaseData->equilData();
for (size_t i = 0; i < equilData.size(); i++) for (size_t i = 0; i < equilData.size(); i++)
{ {

View File

@ -28,6 +28,8 @@
#include "CompletionExportCommands/RicWellPathExportCompletionDataFeatureImpl.h" #include "CompletionExportCommands/RicWellPathExportCompletionDataFeatureImpl.h"
#include "RifReaderSettings.h"
#include "RigActiveCellInfo.h" #include "RigActiveCellInfo.h"
#include "RigCaseCellResultsData.h" #include "RigCaseCellResultsData.h"
#include "RigEclipseCaseData.h" #include "RigEclipseCaseData.h"
@ -63,6 +65,9 @@
#include "cafPdmUiTreeOrdering.h" #include "cafPdmUiTreeOrdering.h"
#include "cafProgressInfo.h" #include "cafProgressInfo.h"
#include "cafUtils.h"
#include <QFileInfo>
CAF_PDM_XML_ABSTRACT_SOURCE_INIT(RimEclipseCase, "RimReservoir"); CAF_PDM_XML_ABSTRACT_SOURCE_INIT(RimEclipseCase, "RimReservoir");
//------------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------------
@ -154,6 +159,33 @@ const RigEclipseCaseData* RimEclipseCase::eclipseCaseData() const
return m_rigEclipseCase.p(); 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) if (rigEclipseCase)
{ {
caf::ProgressInfo pInf(30, ""); caf::ProgressInfo pInf(30, "");
{ {
auto task = pInf.task("", 1); auto task = pInf.task("", 1);
rigEclipseCase->computeActiveCellBoundingBoxes(); rigEclipseCase->computeActiveCellBoundingBoxes();

View File

@ -75,6 +75,7 @@ public:
RigEclipseCaseData* eclipseCaseData(); RigEclipseCaseData* eclipseCaseData();
const RigEclipseCaseData* eclipseCaseData() const; const RigEclipseCaseData* eclipseCaseData() const;
void ensureDeckIsParsedForEquilData();
cvf::Color3f defaultWellColor(const QString& wellName); cvf::Color3f defaultWellColor(const QString& wellName);
const RigMainGrid* mainGrid() const; const RigMainGrid* mainGrid() const;

View File

@ -231,6 +231,8 @@ std::vector<RigEquil> RimPlotAxisAnnotation::equilItems() const
{ {
if (m_sourceCase && m_sourceCase->eclipseCaseData()) if (m_sourceCase && m_sourceCase->eclipseCaseData())
{ {
m_sourceCase->ensureDeckIsParsedForEquilData();
return m_sourceCase->eclipseCaseData()->equilData(); return m_sourceCase->eclipseCaseData()->equilData();
} }

View File

@ -22,6 +22,8 @@
#include "RiaApplication.h" #include "RiaApplication.h"
#include "RifReaderEclipseOutput.h"
#include "RigActiveCellInfo.h" #include "RigActiveCellInfo.h"
#include "RigCaseCellResultsData.h" #include "RigCaseCellResultsData.h"
#include "RigEquil.h" #include "RigEquil.h"
@ -44,6 +46,7 @@
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
RigEclipseCaseData::RigEclipseCaseData(RimEclipseCase* ownerCase) RigEclipseCaseData::RigEclipseCaseData(RimEclipseCase* ownerCase)
: m_hasParsedDeckForEquilData(false)
{ {
m_mainGrid = new RigMainGrid(); m_mainGrid = new RigMainGrid();
m_ownerCase = ownerCase; m_ownerCase = ownerCase;
@ -550,6 +553,19 @@ const RigVirtualPerforationTransmissibilities* RigEclipseCaseData::virtualPerfor
return m_virtualPerforationTransmissibilities.p(); 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<double>* RigEclipseCaseData::resultValues(RiaDefines::Porosity
return swatResults; return swatResults;
} }

View File

@ -119,6 +119,7 @@ public:
void clearWellCellsInGridCache() { m_wellCellsInGrid.clear(); } void clearWellCellsInGridCache() { m_wellCellsInGrid.clear(); }
void ensureDeckIsParsedForEquilData(const QString& dataDeckFile, const QString& includeFileAbsolutePathPrefix);
std::vector<RigEquil> equilData() const; std::vector<RigEquil> equilData() const;
void setEquilData(const std::vector<RigEquil>& equilObjects); void setEquilData(const std::vector<RigEquil>& equilObjects);
@ -145,6 +146,7 @@ private:
RiaEclipseUnitTools::UnitSystem m_unitsType; RiaEclipseUnitTools::UnitSystem m_unitsType;
bool m_hasParsedDeckForEquilData;
std::vector<RigEquil> m_equil; std::vector<RigEquil> m_equil;
mutable std::map<std::tuple<QString, bool, bool>, cvf::Collection<RigWellPath>> m_simWellBranchCache; mutable std::map<std::tuple<QString, bool, bool>, cvf::Collection<RigWellPath>> m_simWellBranchCache;