mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
Results Storage: A huge refactorisation to make way for storing generated properties to an internal file.
This does not yet compile due to a unfortunate mix of perforce, cmake setup and unit_test project shortcomings. Need to move RigStatistics into ProjectDataModel and rename it before this is running again. p4#: 20945
This commit is contained in:
@@ -22,6 +22,9 @@ include_directories(
|
||||
${ResInsight_SOURCE_DIR}/cafProjectDataModel
|
||||
|
||||
${ResInsight_SOURCE_DIR}/CommonCode
|
||||
|
||||
#Remove when RigStatistics is out
|
||||
${ResInsight_SOURCE_DIR}/ApplicationCode/ModelVisualization
|
||||
)
|
||||
|
||||
# Populate the filenames into variable lists
|
||||
|
||||
@@ -425,7 +425,7 @@ cvf::ref<cvf::StructGridScalarDataAccess> RigEclipseCase::dataAccessObject(const
|
||||
return NULL;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@@ -438,3 +438,4 @@ void RigEclipseCase::closeReaderInterface()
|
||||
readerInterface->close();
|
||||
}
|
||||
}
|
||||
*/
|
||||
@@ -68,7 +68,7 @@ public:
|
||||
bool findSharedSourceFace(cvf::StructGridInterface::FaceType& sharedSourceFace, const RigWellResultCell& sourceWellCellResult, const RigWellResultCell& otherWellCellResult) const;
|
||||
|
||||
void computeCachedData();
|
||||
void closeReaderInterface();
|
||||
//void closeReaderInterface();
|
||||
|
||||
private:
|
||||
void computeActiveCellData();
|
||||
|
||||
@@ -280,146 +280,6 @@ double RigReservoirCellResults::cellScalarResult( size_t scalarResultIndex, size
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
size_t RigReservoirCellResults::findOrLoadScalarResultForTimeStep(RimDefines::ResultCatType type, const QString& resultName, size_t timeStepIndex)
|
||||
{
|
||||
// Special handling for SOIL
|
||||
if (type == RimDefines::DYNAMIC_NATIVE && resultName.toUpper() == "SOIL")
|
||||
{
|
||||
loadOrComputeSOILForTimeStep(timeStepIndex);
|
||||
}
|
||||
|
||||
size_t resultGridIndex = cvf::UNDEFINED_SIZE_T;
|
||||
|
||||
resultGridIndex = findScalarResultIndex(type, resultName);
|
||||
|
||||
if (resultGridIndex == cvf::UNDEFINED_SIZE_T) return cvf::UNDEFINED_SIZE_T;
|
||||
|
||||
if (type == RimDefines::GENERATED)
|
||||
{
|
||||
return cvf::UNDEFINED_SIZE_T;
|
||||
}
|
||||
|
||||
if (m_readerInterface.notNull())
|
||||
{
|
||||
size_t timeStepCount = m_resultInfos[resultGridIndex].m_timeStepDates.size();
|
||||
|
||||
bool resultLoadingSucess = true;
|
||||
|
||||
if (type == RimDefines::DYNAMIC_NATIVE && timeStepCount > 0)
|
||||
{
|
||||
m_cellScalarResults[resultGridIndex].resize(timeStepCount);
|
||||
|
||||
std::vector<double>& values = m_cellScalarResults[resultGridIndex][timeStepIndex];
|
||||
if (values.size() == 0)
|
||||
{
|
||||
if (!m_readerInterface->dynamicResult(resultName, RifReaderInterface::MATRIX_RESULTS, timeStepIndex, &values))
|
||||
{
|
||||
resultLoadingSucess = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (type == RimDefines::STATIC_NATIVE)
|
||||
{
|
||||
m_cellScalarResults[resultGridIndex].resize(1);
|
||||
|
||||
std::vector<double>& values = m_cellScalarResults[resultGridIndex][0];
|
||||
if (!m_readerInterface->staticResult(resultName, RifReaderInterface::MATRIX_RESULTS, &values))
|
||||
{
|
||||
resultLoadingSucess = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!resultLoadingSucess)
|
||||
{
|
||||
// Error logging
|
||||
CVF_ASSERT(false);
|
||||
}
|
||||
}
|
||||
|
||||
return resultGridIndex;
|
||||
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
size_t RigReservoirCellResults::findOrLoadScalarResult(RimDefines::ResultCatType type, const QString& resultName)
|
||||
{
|
||||
size_t resultGridIndex = cvf::UNDEFINED_SIZE_T;
|
||||
|
||||
resultGridIndex = findScalarResultIndex(type, resultName);
|
||||
|
||||
if (resultGridIndex == cvf::UNDEFINED_SIZE_T) return cvf::UNDEFINED_SIZE_T;
|
||||
|
||||
if (cellScalarResults(resultGridIndex).size()) return resultGridIndex;
|
||||
|
||||
if (type == RimDefines::GENERATED)
|
||||
{
|
||||
return cvf::UNDEFINED_SIZE_T;
|
||||
}
|
||||
|
||||
if (m_readerInterface.notNull())
|
||||
{
|
||||
// Add one more result to result container
|
||||
size_t timeStepCount = m_resultInfos[resultGridIndex].m_timeStepDates.size();
|
||||
|
||||
bool resultLoadingSucess = true;
|
||||
|
||||
if (type == RimDefines::DYNAMIC_NATIVE && timeStepCount > 0)
|
||||
{
|
||||
m_cellScalarResults[resultGridIndex].resize(timeStepCount);
|
||||
|
||||
size_t i;
|
||||
for (i = 0; i < timeStepCount; i++)
|
||||
{
|
||||
std::vector<double>& values = m_cellScalarResults[resultGridIndex][i];
|
||||
if (!m_readerInterface->dynamicResult(resultName, RifReaderInterface::MATRIX_RESULTS, i, &values))
|
||||
{
|
||||
resultLoadingSucess = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (type == RimDefines::STATIC_NATIVE)
|
||||
{
|
||||
m_cellScalarResults[resultGridIndex].resize(1);
|
||||
|
||||
std::vector<double>& values = m_cellScalarResults[resultGridIndex][0];
|
||||
if (!m_readerInterface->staticResult(resultName, RifReaderInterface::MATRIX_RESULTS, &values))
|
||||
{
|
||||
resultLoadingSucess = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!resultLoadingSucess)
|
||||
{
|
||||
// Remove last scalar result because loading of result failed
|
||||
m_cellScalarResults[resultGridIndex].clear();
|
||||
}
|
||||
}
|
||||
|
||||
return resultGridIndex;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RigReservoirCellResults::setReaderInterface(RifReaderInterface* readerInterface)
|
||||
{
|
||||
m_readerInterface = readerInterface;
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
RifReaderInterface* RigReservoirCellResults::readerInterface()
|
||||
{
|
||||
return m_readerInterface.p();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@@ -464,234 +324,6 @@ size_t RigReservoirCellResults::findScalarResultIndex(const QString& resultName)
|
||||
return scalarResultIndex;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RigReservoirCellResults::loadOrComputeSOIL()
|
||||
{
|
||||
for (size_t timeStepIdx = 0; timeStepIdx < maxTimeStepCount(); timeStepIdx++)
|
||||
{
|
||||
loadOrComputeSOILForTimeStep(timeStepIdx);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RigReservoirCellResults::loadOrComputeSOILForTimeStep(size_t timeStepIndex)
|
||||
{
|
||||
size_t scalarIndexSWAT = findOrLoadScalarResultForTimeStep(RimDefines::DYNAMIC_NATIVE, "SWAT", timeStepIndex);
|
||||
size_t scalarIndexSGAS = findOrLoadScalarResultForTimeStep(RimDefines::DYNAMIC_NATIVE, "SGAS", timeStepIndex);
|
||||
|
||||
// Early exit if none of SWAT or SGAS is present
|
||||
if (scalarIndexSWAT == cvf::UNDEFINED_SIZE_T && scalarIndexSGAS == cvf::UNDEFINED_SIZE_T)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
size_t soilResultValueCount = 0;
|
||||
size_t soilTimeStepCount = 0;
|
||||
|
||||
std::vector<double>* swatForTimeStep = NULL;
|
||||
std::vector<double>* sgasForTimeStep = NULL;
|
||||
if (scalarIndexSWAT != cvf::UNDEFINED_SIZE_T)
|
||||
{
|
||||
swatForTimeStep = &(cellScalarResults(scalarIndexSWAT, timeStepIndex));
|
||||
if (swatForTimeStep->size() == 0)
|
||||
{
|
||||
swatForTimeStep = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
soilResultValueCount = swatForTimeStep->size();
|
||||
soilTimeStepCount = m_resultInfos[scalarIndexSWAT].m_timeStepDates.size();
|
||||
}
|
||||
}
|
||||
|
||||
if (scalarIndexSGAS != cvf::UNDEFINED_SIZE_T)
|
||||
{
|
||||
sgasForTimeStep = &(cellScalarResults(scalarIndexSGAS, timeStepIndex));
|
||||
if (sgasForTimeStep->size() == 0)
|
||||
{
|
||||
sgasForTimeStep = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
soilResultValueCount = qMax(soilResultValueCount, sgasForTimeStep->size());
|
||||
|
||||
size_t sgasTimeStepCount = m_resultInfos[scalarIndexSGAS].m_timeStepDates.size();
|
||||
soilTimeStepCount = qMax(soilTimeStepCount, sgasTimeStepCount);
|
||||
}
|
||||
}
|
||||
|
||||
size_t soilResultGridIndex = findOrLoadScalarResult(RimDefines::DYNAMIC_NATIVE, "SOIL");
|
||||
if (soilResultGridIndex == cvf::UNDEFINED_SIZE_T)
|
||||
{
|
||||
soilResultGridIndex = addEmptyScalarResult(RimDefines::DYNAMIC_NATIVE, "SOIL");
|
||||
CVF_ASSERT(soilResultGridIndex != cvf::UNDEFINED_SIZE_T);
|
||||
|
||||
m_cellScalarResults[soilResultGridIndex].resize(soilTimeStepCount);
|
||||
|
||||
for (size_t timeStepIdx = 0; timeStepIdx < soilTimeStepCount; timeStepIdx++)
|
||||
{
|
||||
m_cellScalarResults[soilResultGridIndex][timeStepIdx].resize(soilResultValueCount);
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<double>& soilForTimeStep = cellScalarResults(soilResultGridIndex, timeStepIndex);
|
||||
|
||||
#pragma omp parallel for
|
||||
for (int idx = 0; idx < static_cast<int>(soilResultValueCount); idx++)
|
||||
{
|
||||
double soilValue = 1.0;
|
||||
if (sgasForTimeStep)
|
||||
{
|
||||
soilValue -= sgasForTimeStep->at(idx);
|
||||
}
|
||||
|
||||
if (swatForTimeStep)
|
||||
{
|
||||
soilValue -= swatForTimeStep->at(idx);
|
||||
}
|
||||
|
||||
soilForTimeStep[idx] = soilValue;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RigReservoirCellResults::computeDepthRelatedResults()
|
||||
{
|
||||
size_t depthResultGridIndex = findOrLoadScalarResult(RimDefines::STATIC_NATIVE, "DEPTH");
|
||||
size_t dxResultGridIndex = findOrLoadScalarResult(RimDefines::STATIC_NATIVE, "DX");
|
||||
size_t dyResultGridIndex = findOrLoadScalarResult(RimDefines::STATIC_NATIVE, "DY");
|
||||
size_t dzResultGridIndex = findOrLoadScalarResult(RimDefines::STATIC_NATIVE, "DZ");
|
||||
size_t topsResultGridIndex = findOrLoadScalarResult(RimDefines::STATIC_NATIVE, "TOPS");
|
||||
size_t bottomResultGridIndex = findOrLoadScalarResult(RimDefines::STATIC_NATIVE, "BOTTOM");
|
||||
|
||||
bool computeDepth = false;
|
||||
bool computeDx = false;
|
||||
bool computeDy = false;
|
||||
bool computeDz = false;
|
||||
bool computeTops = false;
|
||||
bool computeBottom = false;
|
||||
|
||||
size_t resultValueCount = m_ownerMainGrid->cells().size();
|
||||
|
||||
if (depthResultGridIndex == cvf::UNDEFINED_SIZE_T)
|
||||
{
|
||||
depthResultGridIndex = addStaticScalarResult(RimDefines::STATIC_NATIVE, "DEPTH", resultValueCount);
|
||||
computeDepth = true;
|
||||
}
|
||||
|
||||
if (dxResultGridIndex == cvf::UNDEFINED_SIZE_T)
|
||||
{
|
||||
dxResultGridIndex = addStaticScalarResult(RimDefines::STATIC_NATIVE, "DX", resultValueCount);
|
||||
computeDx = true;
|
||||
}
|
||||
|
||||
if (dyResultGridIndex == cvf::UNDEFINED_SIZE_T)
|
||||
{
|
||||
dyResultGridIndex = addStaticScalarResult(RimDefines::STATIC_NATIVE, "DY", resultValueCount);
|
||||
computeDy = true;
|
||||
}
|
||||
|
||||
if (dzResultGridIndex == cvf::UNDEFINED_SIZE_T)
|
||||
{
|
||||
dzResultGridIndex = addStaticScalarResult(RimDefines::STATIC_NATIVE, "DZ", resultValueCount);
|
||||
computeDz = true;
|
||||
}
|
||||
|
||||
if (topsResultGridIndex == cvf::UNDEFINED_SIZE_T)
|
||||
{
|
||||
topsResultGridIndex = addStaticScalarResult(RimDefines::STATIC_NATIVE, "TOPS", resultValueCount);
|
||||
computeTops = true;
|
||||
}
|
||||
|
||||
if (bottomResultGridIndex == cvf::UNDEFINED_SIZE_T)
|
||||
{
|
||||
bottomResultGridIndex = addStaticScalarResult(RimDefines::STATIC_NATIVE, "BOTTOM", resultValueCount);
|
||||
computeBottom = true;
|
||||
}
|
||||
|
||||
std::vector< std::vector<double> >& depth = cellScalarResults(depthResultGridIndex);
|
||||
std::vector< std::vector<double> >& dx = cellScalarResults(dxResultGridIndex);
|
||||
std::vector< std::vector<double> >& dy = cellScalarResults(dyResultGridIndex);
|
||||
std::vector< std::vector<double> >& dz = cellScalarResults(dzResultGridIndex);
|
||||
std::vector< std::vector<double> >& tops = cellScalarResults(topsResultGridIndex);
|
||||
std::vector< std::vector<double> >& bottom = cellScalarResults(bottomResultGridIndex);
|
||||
|
||||
size_t cellIdx = 0;
|
||||
for (cellIdx = 0; cellIdx < m_ownerMainGrid->cells().size(); cellIdx++)
|
||||
{
|
||||
const RigCell& cell = m_ownerMainGrid->cells()[cellIdx];
|
||||
|
||||
if (computeDepth)
|
||||
{
|
||||
depth[0][cellIdx] = cvf::Math::abs(cell.center().z());
|
||||
}
|
||||
|
||||
if (computeDx)
|
||||
{
|
||||
cvf::Vec3d cellWidth = cell.faceCenter(cvf::StructGridInterface::NEG_I) - cell.faceCenter(cvf::StructGridInterface::POS_I);
|
||||
dx[0][cellIdx] = cvf::Math::abs(cellWidth.x());
|
||||
}
|
||||
|
||||
if (computeDy)
|
||||
{
|
||||
cvf::Vec3d cellWidth = cell.faceCenter(cvf::StructGridInterface::NEG_J) - cell.faceCenter(cvf::StructGridInterface::POS_J);
|
||||
dy[0][cellIdx] = cvf::Math::abs(cellWidth.y());
|
||||
}
|
||||
|
||||
if (computeDz)
|
||||
{
|
||||
cvf::Vec3d cellWidth = cell.faceCenter(cvf::StructGridInterface::NEG_K) - cell.faceCenter(cvf::StructGridInterface::POS_K);
|
||||
dz[0][cellIdx] = cvf::Math::abs(cellWidth.z());
|
||||
}
|
||||
|
||||
if (computeTops)
|
||||
{
|
||||
tops[0][cellIdx] = cvf::Math::abs(cell.faceCenter(cvf::StructGridInterface::NEG_K).z());
|
||||
}
|
||||
|
||||
if (computeBottom)
|
||||
{
|
||||
bottom[0][cellIdx] = cvf::Math::abs(cell.faceCenter(cvf::StructGridInterface::POS_K).z());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
size_t RigReservoirCellResults::findOrLoadScalarResult(const QString& resultName)
|
||||
{
|
||||
size_t scalarResultIndex = cvf::UNDEFINED_SIZE_T;
|
||||
|
||||
scalarResultIndex = this->findOrLoadScalarResult(RimDefines::STATIC_NATIVE, resultName);
|
||||
|
||||
if (scalarResultIndex == cvf::UNDEFINED_SIZE_T)
|
||||
{
|
||||
scalarResultIndex = this->findOrLoadScalarResult(RimDefines::DYNAMIC_NATIVE, resultName);
|
||||
}
|
||||
|
||||
if (scalarResultIndex == cvf::UNDEFINED_SIZE_T)
|
||||
{
|
||||
scalarResultIndex = this->findScalarResultIndex(RimDefines::GENERATED, resultName);
|
||||
}
|
||||
|
||||
if (scalarResultIndex == cvf::UNDEFINED_SIZE_T)
|
||||
{
|
||||
scalarResultIndex = this->findScalarResultIndex(RimDefines::INPUT_PROPERTY, resultName);
|
||||
}
|
||||
|
||||
return scalarResultIndex;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
/// Adds an empty scalar set, and returns the scalarResultIndex to it.
|
||||
/// if resultName already exists, it returns the scalarResultIndex to the existing result.
|
||||
@@ -793,6 +425,10 @@ void RigReservoirCellResults::setTimeStepDates(size_t scalarResultIndex, const s
|
||||
CVF_ASSERT(scalarResultIndex < m_resultInfos.size() );
|
||||
|
||||
m_resultInfos[scalarResultIndex].m_timeStepDates = dates;
|
||||
|
||||
// We need this. But not yet ...
|
||||
//std::vector< std::vector<double> >& dataValues = this->cellScalarResults(scalarResultIndex);
|
||||
//dataValues.resize(dates.size());
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
@@ -800,7 +436,7 @@ void RigReservoirCellResults::setTimeStepDates(size_t scalarResultIndex, const s
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
size_t RigReservoirCellResults::maxTimeStepCount() const
|
||||
{
|
||||
int maxTsCount = 0;
|
||||
size_t maxTsCount = 0;
|
||||
|
||||
std::vector<ResultInfo>::const_iterator it;
|
||||
for (it = m_resultInfos.begin(); it != m_resultInfos.end(); it++)
|
||||
|
||||
@@ -35,49 +35,45 @@ class RigReservoirCellResults : public cvf::Object
|
||||
public:
|
||||
RigReservoirCellResults(RigMainGrid* ownerGrid);
|
||||
|
||||
void setReaderInterface(RifReaderInterface* readerInterface);
|
||||
RifReaderInterface* readerInterface();
|
||||
//void setReaderInterface(RifReaderInterface* readerInterface);
|
||||
//RifReaderInterface* readerInterface();
|
||||
|
||||
// Max and min values of the results
|
||||
void recalculateMinMax(size_t scalarResultIndex);
|
||||
void minMaxCellScalarValues(size_t scalarResultIndex, double& min, double& max);
|
||||
void minMaxCellScalarValues(size_t scalarResultIndex, size_t timeStepIndex, double& min, double& max);
|
||||
const std::vector<size_t>& cellScalarValuesHistogram(size_t scalarResultIndex);
|
||||
void p10p90CellScalarValues(size_t scalarResultIndex, double& p10, double& p90);
|
||||
void meanCellScalarValues(size_t scalarResultIndex, double& meanValue);
|
||||
void recalculateMinMax(size_t scalarResultIndex);
|
||||
void minMaxCellScalarValues(size_t scalarResultIndex, double& min, double& max);
|
||||
void minMaxCellScalarValues(size_t scalarResultIndex, size_t timeStepIndex, double& min, double& max);
|
||||
const std::vector<size_t>& cellScalarValuesHistogram(size_t scalarResultIndex);
|
||||
void p10p90CellScalarValues(size_t scalarResultIndex, double& p10, double& p90);
|
||||
void meanCellScalarValues(size_t scalarResultIndex, double& meanValue);
|
||||
|
||||
// Access meta-information about the results
|
||||
size_t resultCount() const;
|
||||
size_t timeStepCount(size_t scalarResultIndex) const;
|
||||
size_t maxTimeStepCount() const;
|
||||
QStringList resultNames(RimDefines::ResultCatType type) const;
|
||||
bool isUsingGlobalActiveIndex(size_t scalarResultIndex) const;
|
||||
size_t resultCount() const;
|
||||
size_t timeStepCount(size_t scalarResultIndex) const;
|
||||
size_t maxTimeStepCount() const;
|
||||
QStringList resultNames(RimDefines::ResultCatType type) const;
|
||||
bool isUsingGlobalActiveIndex(size_t scalarResultIndex) const;
|
||||
|
||||
QDateTime timeStepDate(size_t scalarResultIndex, size_t timeStepIndex) const;
|
||||
std::vector<QDateTime> timeStepDates(size_t scalarResultIndex) const;
|
||||
void setTimeStepDates(size_t scalarResultIndex, const std::vector<QDateTime>& dates);
|
||||
QDateTime timeStepDate(size_t scalarResultIndex, size_t timeStepIndex) const;
|
||||
std::vector<QDateTime> timeStepDates(size_t scalarResultIndex) const;
|
||||
void setTimeStepDates(size_t scalarResultIndex, const std::vector<QDateTime>& dates);
|
||||
|
||||
// Find or create a slot for the results
|
||||
size_t findOrLoadScalarResultForTimeStep(RimDefines::ResultCatType type, const QString& resultName, size_t timeStepIndex);
|
||||
size_t findOrLoadScalarResult(RimDefines::ResultCatType type, const QString& resultName);
|
||||
size_t findOrLoadScalarResult(const QString& resultName); ///< Simplified search. Assumes unique names across types.
|
||||
size_t findScalarResultIndex(RimDefines::ResultCatType type, const QString& resultName) const;
|
||||
size_t findScalarResultIndex(const QString& resultName) const;
|
||||
size_t addEmptyScalarResult(RimDefines::ResultCatType type, const QString& resultName);
|
||||
QString makeResultNameUnique(const QString& resultNameProposal) const;
|
||||
|
||||
void removeResult(const QString& resultName);
|
||||
void clearAllResults();
|
||||
size_t findScalarResultIndex(RimDefines::ResultCatType type, const QString& resultName) const;
|
||||
size_t findScalarResultIndex(const QString& resultName) const;
|
||||
|
||||
size_t addEmptyScalarResult(RimDefines::ResultCatType type, const QString& resultName);
|
||||
QString makeResultNameUnique(const QString& resultNameProposal) const;
|
||||
|
||||
void removeResult(const QString& resultName);
|
||||
void clearAllResults();
|
||||
|
||||
void loadOrComputeSOIL();
|
||||
void loadOrComputeSOILForTimeStep(size_t timeStepIndex);
|
||||
void computeDepthRelatedResults();
|
||||
|
||||
// Access the results data
|
||||
const std::vector< std::vector<double> > & cellScalarResults(size_t scalarResultIndex) const;
|
||||
std::vector< std::vector<double> > & cellScalarResults(size_t scalarResultIndex);
|
||||
std::vector<double>& cellScalarResults(size_t scalarResultIndex, size_t timeStepIndex);
|
||||
double cellScalarResult(size_t scalarResultIndex, size_t timeStepIndex, size_t resultValueIndex);
|
||||
const std::vector< std::vector<double> > & cellScalarResults(size_t scalarResultIndex) const;
|
||||
std::vector< std::vector<double> > & cellScalarResults(size_t scalarResultIndex);
|
||||
std::vector<double>& cellScalarResults(size_t scalarResultIndex, size_t timeStepIndex);
|
||||
double cellScalarResult(size_t scalarResultIndex, size_t timeStepIndex, size_t resultValueIndex);
|
||||
|
||||
static RifReaderInterface::PorosityModelResultType convertFromProjectModelPorosityModel(RimDefines::PorosityModelType porosityModel);
|
||||
|
||||
@@ -97,8 +93,10 @@ public:
|
||||
|
||||
const std::vector<ResultInfo>& infoForEachResultIndex() { return m_resultInfos;}
|
||||
|
||||
private:
|
||||
size_t addStaticScalarResult(RimDefines::ResultCatType type, const QString& resultName, size_t resultValueCount);
|
||||
public:
|
||||
size_t addStaticScalarResult(RimDefines::ResultCatType type,
|
||||
const QString& resultName,
|
||||
size_t resultValueCount);
|
||||
|
||||
private:
|
||||
std::vector< std::vector< std::vector<double> > > m_cellScalarResults; ///< Scalar results on the complete reservoir for each Result index (ResultVariable) and timestep
|
||||
@@ -113,7 +111,7 @@ private:
|
||||
|
||||
private:
|
||||
std::vector<ResultInfo> m_resultInfos;
|
||||
cvf::ref<RifReaderInterface> m_readerInterface;
|
||||
|
||||
RigMainGrid* m_ownerMainGrid;
|
||||
|
||||
};
|
||||
|
||||
@@ -18,7 +18,11 @@
|
||||
|
||||
#include "RigStatistics.h"
|
||||
#include "RigReservoirCellResults.h"
|
||||
#include "RimReservoirView.h"
|
||||
#include "RimReservoir.h"
|
||||
#include "RigEclipseCase.h"
|
||||
|
||||
//#include "RigEclipseCase.h"
|
||||
#include <QDebug>
|
||||
#include "cafProgressInfo.h"
|
||||
|
||||
@@ -30,7 +34,8 @@ void RigStatistics::addNamedResult(RigReservoirCellResults* destinationCellResul
|
||||
// Use time step dates from first result in first source case
|
||||
CVF_ASSERT(m_sourceCases.size() > 0);
|
||||
|
||||
std::vector<QDateTime> sourceTimeStepDates = m_sourceCases[0]->results(RifReaderInterface::MATRIX_RESULTS)->timeStepDates(0);
|
||||
std::vector<QDateTime> sourceTimeStepDates = m_sourceCases[0]->results(RifReaderInterface::MATRIX_RESULTS)->cellResults()->timeStepDates(0);
|
||||
|
||||
size_t destinationScalarResultIndex = destinationCellResults->addEmptyScalarResult(resultType, resultName);
|
||||
CVF_ASSERT(destinationScalarResultIndex != cvf::UNDEFINED_SIZE_T);
|
||||
|
||||
@@ -38,6 +43,7 @@ void RigStatistics::addNamedResult(RigReservoirCellResults* destinationCellResul
|
||||
std::vector< std::vector<double> >& dataValues = destinationCellResults->cellScalarResults(destinationScalarResultIndex);
|
||||
dataValues.resize(sourceTimeStepDates.size());
|
||||
|
||||
|
||||
// Initializes the size of the destination dataset to active union cell count
|
||||
for (int i = 0; i < sourceTimeStepDates.size(); i++)
|
||||
{
|
||||
@@ -58,7 +64,7 @@ void RigStatistics::computeActiveCellUnion()
|
||||
|
||||
CVF_ASSERT(m_destinationCase);
|
||||
|
||||
RigMainGrid* mainGrid = m_sourceCases[0]->mainGrid();
|
||||
RigMainGrid* mainGrid = m_sourceCases[0]->reservoirData()->mainGrid();
|
||||
CVF_ASSERT(mainGrid);
|
||||
|
||||
m_destinationCase->activeCellInfo(RifReaderInterface::MATRIX_RESULTS)->setGlobalCellCount(mainGrid->cells().size());
|
||||
@@ -84,7 +90,7 @@ void RigStatistics::computeActiveCellUnion()
|
||||
|
||||
if (activeM[localGridCellIdx] == 0)
|
||||
{
|
||||
if (m_sourceCases[caseIdx]->activeCellInfo(RifReaderInterface::MATRIX_RESULTS)->isActiveInMatrixModel(globalCellIdx))
|
||||
if (m_sourceCases[caseIdx]->reservoirData()->activeCellInfo(RifReaderInterface::MATRIX_RESULTS)->isActiveInMatrixModel(globalCellIdx))
|
||||
{
|
||||
activeM[localGridCellIdx] = 1;
|
||||
}
|
||||
@@ -92,7 +98,7 @@ void RigStatistics::computeActiveCellUnion()
|
||||
|
||||
if (activeF[localGridCellIdx] == 0)
|
||||
{
|
||||
if (m_sourceCases[caseIdx]->activeCellInfo(RifReaderInterface::FRACTURE_RESULTS)->isActiveInMatrixModel(globalCellIdx))
|
||||
if (m_sourceCases[caseIdx]->reservoirData()->activeCellInfo(RifReaderInterface::FRACTURE_RESULTS)->isActiveInMatrixModel(globalCellIdx))
|
||||
{
|
||||
activeF[localGridCellIdx] = 1;
|
||||
}
|
||||
@@ -143,20 +149,20 @@ void RigStatistics::buildSourceMetaData(RimDefines::ResultCatType resultType, co
|
||||
{
|
||||
if (m_sourceCases.size() == 0) return;
|
||||
|
||||
std::vector<QDateTime> timeStepDates = m_sourceCases[0]->results(RifReaderInterface::MATRIX_RESULTS)->timeStepDates(0);
|
||||
std::vector<QDateTime> timeStepDates = m_sourceCases[0]->results(RifReaderInterface::MATRIX_RESULTS)->cellResults()->timeStepDates(0);
|
||||
|
||||
for (size_t caseIdx = 1; caseIdx < m_sourceCases.size(); caseIdx++)
|
||||
{
|
||||
RigEclipseCase* eclipseCase = m_sourceCases.at(caseIdx);
|
||||
RigEclipseCase* eclipseCase = m_sourceCases.at(caseIdx)->reservoirData();
|
||||
|
||||
RigReservoirCellResults* matrixResults = eclipseCase->results(RifReaderInterface::MATRIX_RESULTS);
|
||||
RimReservoirCellResultsCacher* matrixResults = m_sourceCases[caseIdx]->results(RifReaderInterface::MATRIX_RESULTS);
|
||||
size_t scalarResultIndex = matrixResults->findOrLoadScalarResult(resultType, resultName);
|
||||
if (scalarResultIndex == cvf::UNDEFINED_SIZE_T)
|
||||
{
|
||||
size_t scalarResultIndex = matrixResults->addEmptyScalarResult(resultType, resultName);
|
||||
matrixResults->setTimeStepDates(scalarResultIndex, timeStepDates);
|
||||
size_t scalarResultIndex = matrixResults->cellResults()->addEmptyScalarResult(resultType, resultName);
|
||||
matrixResults->cellResults()->setTimeStepDates(scalarResultIndex, timeStepDates);
|
||||
|
||||
std::vector< std::vector<double> >& dataValues = matrixResults->cellScalarResults(scalarResultIndex);
|
||||
std::vector< std::vector<double> >& dataValues = matrixResults->cellResults()->cellScalarResults(scalarResultIndex);
|
||||
dataValues.resize(timeStepDates.size());
|
||||
}
|
||||
}
|
||||
@@ -183,13 +189,13 @@ void RigStatistics::evaluateStatistics(const QList<QPair<RimDefines::ResultCatTy
|
||||
// Build SGAS/SWAT meta data, SOIL is automatically generated as part of RigReservoirCellResults::findOrLoadScalarResultForTimeStep
|
||||
if (resultName.toUpper() == "SOIL")
|
||||
{
|
||||
size_t swatIndex = m_sourceCases.at(0)->results(RifReaderInterface::MATRIX_RESULTS)->findScalarResultIndex(resultType, "SWAT");
|
||||
size_t swatIndex = m_sourceCases.at(0)->results(RifReaderInterface::MATRIX_RESULTS)->cellResults()->findScalarResultIndex(resultType, "SWAT");
|
||||
if (swatIndex != cvf::UNDEFINED_SIZE_T)
|
||||
{
|
||||
buildSourceMetaData(resultType, "SWAT");
|
||||
}
|
||||
|
||||
size_t sgasIndex = m_sourceCases.at(0)->results(RifReaderInterface::MATRIX_RESULTS)->findScalarResultIndex(resultType, "SGAS");
|
||||
size_t sgasIndex = m_sourceCases.at(0)->results(RifReaderInterface::MATRIX_RESULTS)->cellResults()->findScalarResultIndex(resultType, "SGAS");
|
||||
if (sgasIndex != cvf::UNDEFINED_SIZE_T)
|
||||
{
|
||||
buildSourceMetaData(resultType, "SGAS");
|
||||
@@ -248,11 +254,11 @@ void RigStatistics::evaluateStatistics(const QList<QPair<RimDefines::ResultCatTy
|
||||
cvf::Collection<cvf::StructGridScalarDataAccess> dataAccesObjectList;
|
||||
for (size_t caseIdx = 0; caseIdx < m_sourceCases.size(); caseIdx++)
|
||||
{
|
||||
RigEclipseCase* eclipseCase = m_sourceCases.at(caseIdx);
|
||||
RimReservoir* eclipseCase = m_sourceCases.at(caseIdx);
|
||||
|
||||
size_t scalarResultIndex = eclipseCase->results(RifReaderInterface::MATRIX_RESULTS)->findOrLoadScalarResultForTimeStep(resultType, resultName, dataAccessTimeStepIndex);
|
||||
|
||||
cvf::ref<cvf::StructGridScalarDataAccess> dataAccessObject = eclipseCase->dataAccessObject(grid, RifReaderInterface::MATRIX_RESULTS, dataAccessTimeStepIndex, scalarResultIndex);
|
||||
cvf::ref<cvf::StructGridScalarDataAccess> dataAccessObject = eclipseCase->reservoirData()->dataAccessObject(grid, RifReaderInterface::MATRIX_RESULTS, dataAccessTimeStepIndex, scalarResultIndex);
|
||||
if (dataAccessObject.notNull())
|
||||
{
|
||||
dataAccesObjectList.push_back(dataAccessObject.p());
|
||||
@@ -355,13 +361,13 @@ void RigStatistics::evaluateStatistics(const QList<QPair<RimDefines::ResultCatTy
|
||||
|
||||
for (size_t caseIdx = 0; caseIdx < m_sourceCases.size(); caseIdx++)
|
||||
{
|
||||
RigEclipseCase* eclipseCase = m_sourceCases.at(caseIdx);
|
||||
RimReservoir* eclipseCase = m_sourceCases.at(caseIdx);
|
||||
|
||||
// When one time step is completed, close all result files.
|
||||
// Microsoft note: On Windows, the maximum number of files open at the same time is 512
|
||||
// http://msdn.microsoft.com/en-us/library/kdfaxaay%28vs.71%29.aspx
|
||||
//
|
||||
eclipseCase->closeReaderInterface();
|
||||
eclipseCase->results(RifReaderInterface::MATRIX_RESULTS)->readerInterface()->close();
|
||||
}
|
||||
|
||||
info.setProgress(timeIndicesIdx);
|
||||
@@ -378,7 +384,7 @@ void RigStatistics::debugOutput(RimDefines::ResultCatType resultType, const QStr
|
||||
|
||||
qDebug() << resultName << "timeIdx : " << timeStepIdx;
|
||||
|
||||
size_t scalarResultIndex = m_destinationCase->results(RifReaderInterface::MATRIX_RESULTS)->findOrLoadScalarResult(resultType, resultName);
|
||||
size_t scalarResultIndex = m_destinationCase->results(RifReaderInterface::MATRIX_RESULTS)->findScalarResultIndex(resultType, resultName);
|
||||
|
||||
cvf::ref<cvf::StructGridScalarDataAccess> dataAccessObject = m_destinationCase->dataAccessObject(m_destinationCase->mainGrid(), RifReaderInterface::MATRIX_RESULTS, timeStepIdx, scalarResultIndex);
|
||||
if (dataAccessObject.isNull()) return;
|
||||
@@ -392,7 +398,8 @@ void RigStatistics::debugOutput(RimDefines::ResultCatType resultType, const QStr
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
RigStatistics::RigStatistics(cvf::Collection<RigEclipseCase>& sourceCases, const std::vector<size_t>& timeStepIndices, const RigStatisticsConfig& statisticsConfig, RigEclipseCase* destinationCase) : m_sourceCases(sourceCases),
|
||||
RigStatistics::RigStatistics(const std::vector<RimReservoir*>& sourceCases, const std::vector<size_t>& timeStepIndices, const RigStatisticsConfig& statisticsConfig, RigEclipseCase* destinationCase)
|
||||
: m_sourceCases(sourceCases),
|
||||
m_statisticsConfig(statisticsConfig),
|
||||
m_destinationCase(destinationCase),
|
||||
m_globalCellCount(0),
|
||||
@@ -400,7 +407,7 @@ RigStatistics::RigStatistics(cvf::Collection<RigEclipseCase>& sourceCases, const
|
||||
{
|
||||
if (sourceCases.size() > 0)
|
||||
{
|
||||
m_globalCellCount = sourceCases[0]->mainGrid()->cells().size();
|
||||
m_globalCellCount = sourceCases[0]->reservoirData()->mainGrid()->cells().size();
|
||||
}
|
||||
|
||||
CVF_ASSERT(m_destinationCase);
|
||||
|
||||
@@ -22,12 +22,17 @@
|
||||
#include "cvfObject.h"
|
||||
#include "cvfCollection.h"
|
||||
|
||||
#include "RigEclipseCase.h"
|
||||
|
||||
|
||||
#include <vector>
|
||||
#include <math.h>
|
||||
|
||||
#include <QPair>
|
||||
#include "RimDefines.h"
|
||||
|
||||
class RimReservoir;
|
||||
class RigEclipseCase;
|
||||
class RigReservoirCellResults;
|
||||
|
||||
class RigStatisticsEvaluator
|
||||
{
|
||||
@@ -124,7 +129,7 @@ public:
|
||||
class RigStatistics
|
||||
{
|
||||
public:
|
||||
RigStatistics(cvf::Collection<RigEclipseCase>& sourceCases,
|
||||
RigStatistics(const std::vector<RimReservoir*>& sourceCases,
|
||||
const std::vector<size_t>& timeStepIndices,
|
||||
const RigStatisticsConfig& statisticsConfig,
|
||||
RigEclipseCase* destinationCase);
|
||||
@@ -140,7 +145,7 @@ private:
|
||||
void buildSourceMetaData(RimDefines::ResultCatType resultType, const QString& resultName);
|
||||
|
||||
private:
|
||||
cvf::Collection<RigEclipseCase> m_sourceCases;
|
||||
std::vector<RimReservoir*> m_sourceCases;
|
||||
std::vector<size_t> m_timeStepIndices;
|
||||
|
||||
size_t m_globalCellCount;
|
||||
|
||||
Reference in New Issue
Block a user