mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
Added support for building of metadata from existing time steps
Improved statistics calculation for opening single time step files Close all dynamic access files when a time step statistics is complete p4#: 20756
This commit is contained in:
@@ -43,8 +43,10 @@ public:
|
||||
virtual ~RifEclipseRestartDataAccess();
|
||||
|
||||
virtual bool open(const QStringList& fileSet) = 0;
|
||||
virtual void setFileSet(const QStringList& fileSet) {};
|
||||
virtual void close() = 0;
|
||||
|
||||
virtual void setTimeSteps(const QList<QDateTime>& timeSteps) {};
|
||||
virtual size_t timeStepCount() = 0;
|
||||
virtual QList<QDateTime> timeSteps() = 0;
|
||||
|
||||
|
||||
@@ -42,20 +42,19 @@ RifEclipseRestartFilesetAccess::~RifEclipseRestartFilesetAccess()
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
bool RifEclipseRestartFilesetAccess::open(const QStringList& fileSet)
|
||||
{
|
||||
setFileSet(fileSet);
|
||||
|
||||
int numFiles = fileSet.size();
|
||||
|
||||
caf::ProgressInfo progInfo(numFiles,"");
|
||||
|
||||
int i;
|
||||
for (i = 0; i < numFiles; i++)
|
||||
if (m_fileNames.size() > 0)
|
||||
{
|
||||
progInfo.setProgressDescription(fileSet[i]);
|
||||
caf::ProgressInfo progInfo(m_fileNames.size(), "");
|
||||
|
||||
openTimeStep(i);
|
||||
int i;
|
||||
for (i = 0; i < m_fileNames.size(); i++)
|
||||
{
|
||||
progInfo.setProgressDescription(m_fileNames[i]);
|
||||
|
||||
progInfo.incrementProgress();
|
||||
openTimeStep(i);
|
||||
|
||||
progInfo.incrementProgress();
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -95,12 +94,21 @@ void RifEclipseRestartFilesetAccess::close()
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RifEclipseRestartFilesetAccess::setTimeSteps(const QList<QDateTime>& timeSteps)
|
||||
{
|
||||
CVF_ASSERT(m_fileNames.size() == timeSteps.size());
|
||||
m_timeSteps = timeSteps;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
/// Get the number of time steps
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
size_t RifEclipseRestartFilesetAccess::timeStepCount()
|
||||
{
|
||||
return m_ecl_files.size();
|
||||
return m_timeSteps.size();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@@ -108,29 +116,31 @@ size_t RifEclipseRestartFilesetAccess::timeStepCount()
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
QList<QDateTime> RifEclipseRestartFilesetAccess::timeSteps()
|
||||
{
|
||||
QList<QDateTime> timeSteps;
|
||||
|
||||
size_t numSteps = timeStepCount();
|
||||
size_t i;
|
||||
for (i = 0; i < numSteps; i++)
|
||||
if (m_timeSteps.size() == 0)
|
||||
{
|
||||
QList<QDateTime> stepTime;
|
||||
size_t numSteps = m_fileNames.size();
|
||||
size_t i;
|
||||
for (i = 0; i < numSteps; i++)
|
||||
{
|
||||
QList<QDateTime> stepTime;
|
||||
|
||||
openTimeStep(i);
|
||||
openTimeStep(i);
|
||||
|
||||
RifEclipseOutputFileTools::timeSteps(m_ecl_files[i], &stepTime);
|
||||
RifEclipseOutputFileTools::timeSteps(m_ecl_files[i], &stepTime);
|
||||
|
||||
if (stepTime.size() == 1)
|
||||
{
|
||||
timeSteps.push_back(stepTime[0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
timeSteps.push_back(QDateTime());
|
||||
if (stepTime.size() == 1)
|
||||
{
|
||||
m_timeSteps.push_back(stepTime[0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_timeSteps.push_back(QDateTime());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return timeSteps;
|
||||
return m_timeSteps;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
||||
@@ -39,6 +39,7 @@ public:
|
||||
void setFileSet(const QStringList& fileSet);
|
||||
void close();
|
||||
|
||||
void setTimeSteps(const QList<QDateTime>& timeSteps);
|
||||
size_t timeStepCount();
|
||||
QList<QDateTime> timeSteps();
|
||||
|
||||
@@ -52,5 +53,7 @@ private:
|
||||
|
||||
private:
|
||||
QStringList m_fileNames;
|
||||
QList<QDateTime> m_timeSteps;
|
||||
|
||||
std::vector< ecl_file_type* > m_ecl_files;
|
||||
};
|
||||
|
||||
@@ -392,7 +392,7 @@ bool RifReaderEclipseOutput::open(const QString& fileName, RigEclipseCase* eclip
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
bool RifReaderEclipseOutput::openAndReadActiveCellData(const QString& fileName, RigEclipseCase* eclipseCase)
|
||||
bool RifReaderEclipseOutput::openAndReadActiveCellData(const QString& fileName, RigEclipseCase* mainEclipseCase, RigEclipseCase* eclipseCase)
|
||||
{
|
||||
CVF_ASSERT(eclipseCase);
|
||||
|
||||
@@ -402,8 +402,6 @@ bool RifReaderEclipseOutput::openAndReadActiveCellData(const QString& fileName,
|
||||
return false;
|
||||
}
|
||||
|
||||
caf::ProgressInfo progInfo(100, "");
|
||||
|
||||
close();
|
||||
|
||||
// Get set of files
|
||||
@@ -417,23 +415,21 @@ bool RifReaderEclipseOutput::openAndReadActiveCellData(const QString& fileName,
|
||||
eclipseCase->results(RifReaderInterface::MATRIX_RESULTS)->setReaderInterface(this);
|
||||
eclipseCase->results(RifReaderInterface::FRACTURE_RESULTS)->setReaderInterface(this);
|
||||
|
||||
progInfo.setNextProgressIncrement(50);
|
||||
progInfo.setProgressDescription("Reading active cell information");
|
||||
|
||||
if (!readActiveCellInfo())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
progInfo.incrementProgress();
|
||||
|
||||
progInfo.setNextProgressIncrement(50);
|
||||
progInfo.setProgressDescription("Reading meta data");
|
||||
|
||||
// Reading of metadata and well cells is not performed here
|
||||
//if (!buildMetaData()) return false;
|
||||
// readWellCells();
|
||||
|
||||
m_dynamicResultsAccess = createDynamicResultsAccess(m_fileSet);
|
||||
|
||||
QList<QDateTime> mainCaseTimeSteps = mainEclipseCase->results(RifReaderInterface::MATRIX_RESULTS)->readerInterface()->timeSteps();
|
||||
m_dynamicResultsAccess->setTimeSteps(mainCaseTimeSteps);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -528,12 +524,14 @@ bool RifReaderEclipseOutput::buildMetaData()
|
||||
progInfo.setNextProgressIncrement(m_fileSet.size());
|
||||
|
||||
// Create access object for dynamic results
|
||||
m_dynamicResultsAccess = dynamicResultsAccess(m_fileSet);
|
||||
m_dynamicResultsAccess = createDynamicResultsAccess(m_fileSet);
|
||||
if (m_dynamicResultsAccess.isNull())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
m_dynamicResultsAccess->open(m_fileSet);
|
||||
|
||||
|
||||
progInfo.incrementProgress();
|
||||
|
||||
@@ -573,46 +571,46 @@ bool RifReaderEclipseOutput::buildMetaData()
|
||||
|
||||
progInfo.incrementProgress();
|
||||
|
||||
if (!openInitFile())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
openInitFile();
|
||||
|
||||
progInfo.incrementProgress();
|
||||
|
||||
QStringList resultNames;
|
||||
std::vector<size_t> resultNamesDataItemCounts;
|
||||
RifEclipseOutputFileTools::findKeywordsAndDataItemCounts(m_ecl_init_file, &resultNames, &resultNamesDataItemCounts);
|
||||
|
||||
if (m_ecl_init_file)
|
||||
{
|
||||
QStringList matrixResultNames = validKeywordsForPorosityModel(resultNames, resultNamesDataItemCounts, m_eclipseCase->activeCellInfo(), RifReaderInterface::MATRIX_RESULTS, 1);
|
||||
QStringList resultNames;
|
||||
std::vector<size_t> resultNamesDataItemCounts;
|
||||
RifEclipseOutputFileTools::findKeywordsAndDataItemCounts(m_ecl_init_file, &resultNames, &resultNamesDataItemCounts);
|
||||
|
||||
QList<QDateTime> staticDate;
|
||||
if (m_timeSteps.size() > 0)
|
||||
{
|
||||
staticDate.push_back(m_timeSteps.front());
|
||||
QStringList matrixResultNames = validKeywordsForPorosityModel(resultNames, resultNamesDataItemCounts, m_eclipseCase->activeCellInfo(), RifReaderInterface::MATRIX_RESULTS, 1);
|
||||
|
||||
QList<QDateTime> staticDate;
|
||||
if (m_timeSteps.size() > 0)
|
||||
{
|
||||
staticDate.push_back(m_timeSteps.front());
|
||||
}
|
||||
|
||||
for (int i = 0; i < matrixResultNames.size(); ++i)
|
||||
{
|
||||
size_t resIndex = matrixModelResults->addEmptyScalarResult(RimDefines::STATIC_NATIVE, matrixResultNames[i]);
|
||||
matrixModelResults->setTimeStepDates(resIndex, staticDate);
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < matrixResultNames.size(); ++i)
|
||||
{
|
||||
size_t resIndex = matrixModelResults->addEmptyScalarResult(RimDefines::STATIC_NATIVE, matrixResultNames[i]);
|
||||
matrixModelResults->setTimeStepDates(resIndex, staticDate);
|
||||
}
|
||||
}
|
||||
QStringList fractureResultNames = validKeywordsForPorosityModel(resultNames, resultNamesDataItemCounts, m_eclipseCase->activeCellInfo(), RifReaderInterface::FRACTURE_RESULTS, 1);
|
||||
|
||||
{
|
||||
QStringList fractureResultNames = validKeywordsForPorosityModel(resultNames, resultNamesDataItemCounts, m_eclipseCase->activeCellInfo(), RifReaderInterface::FRACTURE_RESULTS, 1);
|
||||
QList<QDateTime> staticDate;
|
||||
if (m_timeSteps.size() > 0)
|
||||
{
|
||||
staticDate.push_back(m_timeSteps.front());
|
||||
}
|
||||
|
||||
QList<QDateTime> staticDate;
|
||||
if (m_timeSteps.size() > 0)
|
||||
{
|
||||
staticDate.push_back(m_timeSteps.front());
|
||||
}
|
||||
|
||||
for (int i = 0; i < fractureResultNames.size(); ++i)
|
||||
{
|
||||
size_t resIndex = fractureModelResults->addEmptyScalarResult(RimDefines::STATIC_NATIVE, fractureResultNames[i]);
|
||||
fractureModelResults->setTimeStepDates(resIndex, staticDate);
|
||||
for (int i = 0; i < fractureResultNames.size(); ++i)
|
||||
{
|
||||
size_t resIndex = fractureModelResults->addEmptyScalarResult(RimDefines::STATIC_NATIVE, fractureResultNames[i]);
|
||||
fractureModelResults->setTimeStepDates(resIndex, staticDate);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -622,7 +620,7 @@ bool RifReaderEclipseOutput::buildMetaData()
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
/// Create results access object (.UNRST or .X0001 ... .XNNNN)
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
RifEclipseRestartDataAccess* RifReaderEclipseOutput::dynamicResultsAccess(const QStringList& fileSet)
|
||||
RifEclipseRestartDataAccess* RifReaderEclipseOutput::createDynamicResultsAccess(const QStringList& fileSet)
|
||||
{
|
||||
RifEclipseRestartDataAccess* resultsAccess = NULL;
|
||||
|
||||
@@ -631,11 +629,7 @@ RifEclipseRestartDataAccess* RifReaderEclipseOutput::dynamicResultsAccess(const
|
||||
if (unrstFileName.size() > 0)
|
||||
{
|
||||
resultsAccess = new RifEclipseUnifiedRestartFileAccess();
|
||||
if (!resultsAccess->open(QStringList(unrstFileName)))
|
||||
{
|
||||
delete resultsAccess;
|
||||
return NULL;
|
||||
}
|
||||
resultsAccess->setFileSet(QStringList(unrstFileName));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -644,17 +638,10 @@ RifEclipseRestartDataAccess* RifReaderEclipseOutput::dynamicResultsAccess(const
|
||||
if (restartFiles.size() > 0)
|
||||
{
|
||||
resultsAccess = new RifEclipseRestartFilesetAccess();
|
||||
if (!resultsAccess->open(restartFiles))
|
||||
{
|
||||
delete resultsAccess;
|
||||
return NULL;
|
||||
}
|
||||
resultsAccess->setFileSet(restartFiles);
|
||||
}
|
||||
}
|
||||
|
||||
// !! could add support for formatted result files
|
||||
// !! consider priorities in case multiple types exist (.UNRST, .XNNNN, ...)
|
||||
|
||||
return resultsAccess;
|
||||
}
|
||||
|
||||
@@ -693,7 +680,16 @@ bool RifReaderEclipseOutput::staticResult(const QString& result, PorosityModelRe
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
bool RifReaderEclipseOutput::dynamicResult(const QString& result, PorosityModelResultType matrixOrFracture, size_t stepIndex, std::vector<double>* values)
|
||||
{
|
||||
CVF_ASSERT(m_dynamicResultsAccess.notNull());
|
||||
if (m_dynamicResultsAccess.isNull())
|
||||
{
|
||||
m_dynamicResultsAccess = createDynamicResultsAccess(m_fileSet);
|
||||
}
|
||||
|
||||
if (m_dynamicResultsAccess.isNull())
|
||||
{
|
||||
CVF_ASSERT(false);
|
||||
return false;
|
||||
}
|
||||
|
||||
std::vector<double> fileValues;
|
||||
if (!m_dynamicResultsAccess->results(result, stepIndex, m_eclipseCase->mainGrid()->gridCount(), &fileValues))
|
||||
@@ -1020,3 +1016,11 @@ bool RifReaderEclipseOutput::openInitFile()
|
||||
return false;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
QList<QDateTime> RifReaderEclipseOutput::timeSteps()
|
||||
{
|
||||
return m_timeSteps;
|
||||
}
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@ public:
|
||||
virtual ~RifReaderEclipseOutput();
|
||||
|
||||
bool open(const QString& fileName, RigEclipseCase* eclipseCase);
|
||||
virtual bool openAndReadActiveCellData(const QString& fileName, RigEclipseCase* eclipseCase);
|
||||
virtual bool openAndReadActiveCellData(const QString& fileName, RigEclipseCase* mainEclipseCase, RigEclipseCase* eclipseCase);
|
||||
void close();
|
||||
|
||||
bool staticResult(const QString& result, PorosityModelResultType matrixOrFracture, std::vector<double>* values);
|
||||
@@ -58,14 +58,15 @@ private:
|
||||
void readWellCells();
|
||||
|
||||
bool openInitFile();
|
||||
bool openDynamicAccess();
|
||||
|
||||
void extractResultValuesBasedOnPorosityModel(PorosityModelResultType matrixOrFracture, std::vector<double>* values, const std::vector<double>& fileValues);
|
||||
|
||||
static RifEclipseRestartDataAccess* staticResultsAccess(const QStringList& fileSet);
|
||||
static RifEclipseRestartDataAccess* dynamicResultsAccess(const QStringList& fileSet);
|
||||
static RifEclipseRestartDataAccess* createDynamicResultsAccess(const QStringList& fileSet);
|
||||
|
||||
QStringList validKeywordsForPorosityModel(const QStringList& keywords, const std::vector<size_t>& keywordDataItemCounts, const RigActiveCellInfo* activeCellInfo, PorosityModelResultType matrixOrFracture, size_t timeStepCount) const;
|
||||
|
||||
virtual QList<QDateTime> timeSteps();
|
||||
private:
|
||||
QString m_fileName; // Name of file used to start accessing Eclipse output files
|
||||
QStringList m_fileSet; // Set of files in filename's path with same base name as filename
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
|
||||
#include <QString>
|
||||
#include <QStringList>
|
||||
#include <QDateTime>
|
||||
|
||||
|
||||
class RigEclipseCase;
|
||||
@@ -47,9 +48,11 @@ public:
|
||||
virtual ~RifReaderInterface() {}
|
||||
|
||||
virtual bool open(const QString& fileName, RigEclipseCase* eclipseCase) = 0;
|
||||
virtual bool openAndReadActiveCellData(const QString& fileName, RigEclipseCase* eclipseCase) { return true; };
|
||||
virtual bool openAndReadActiveCellData(const QString& fileName, RigEclipseCase* mainEclipseCase, RigEclipseCase* eclipseCase) { return true; };
|
||||
virtual void close() = 0;
|
||||
|
||||
virtual bool staticResult(const QString& result, PorosityModelResultType matrixOrFracture, std::vector<double>* values) = 0;
|
||||
virtual bool dynamicResult(const QString& result, PorosityModelResultType matrixOrFracture, size_t stepIndex, std::vector<double>* values) = 0;
|
||||
|
||||
virtual QList<QDateTime> timeSteps() { QList<QDateTime> timeSteps; return timeSteps; }
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user