StimPlanModel: use data from input cases when available

This commit is contained in:
Kristian Bendiksen 2021-06-18 13:18:06 +02:00 committed by Magne Sjaastad
parent 5dd7822b5f
commit f498138f4e
2 changed files with 51 additions and 23 deletions

View File

@ -39,6 +39,7 @@
#include "RimStimPlanModelCalculator.h"
#include "RimStimPlanModelTemplate.h"
#include "RimStimPlanModelWellLogCalculator.h"
#include "cafAssert.h"
#include <limits>
@ -448,49 +449,70 @@ bool RimStimPlanModelPressureCalculator::buildPressureTablesPerEqlNum( const Rim
EqlNumToDepthValuePairMap& valuesPerEqlNum,
const std::set<int>& presentEqlNums )
{
RimEclipseCase* eclipseCase = stimPlanModel->eclipseCaseForProperty( RiaDefines::CurveProperty::EQLNUM );
// TODO: too naive??
int gridIndex = 0;
const RigGridBase* grid = eclipseCase->mainGrid()->gridByIndex( gridIndex );
RimEclipseCase* eqlNumEclipseCase = stimPlanModel->eclipseCaseForProperty( RiaDefines::CurveProperty::EQLNUM );
CAF_ASSERT( eqlNumEclipseCase != nullptr );
RigEclipseCaseData* caseData = eclipseCase->eclipseCaseData();
const RigGridBase* eqlNumGrid = eqlNumEclipseCase->mainGrid()->gridByIndex( gridIndex );
CAF_ASSERT( eqlNumGrid != nullptr );
RigEclipseCaseData* eqlNumCaseData = eqlNumEclipseCase->eclipseCaseData();
CAF_ASSERT( eqlNumCaseData != nullptr );
RiaDefines::PorosityModelType porosityModel = RiaDefines::PorosityModelType::MATRIX_MODEL;
const std::vector<double>& eqlNumValues =
RimStimPlanModelWellLogCalculator::loadResults( caseData,
RimStimPlanModelWellLogCalculator::loadResults( eqlNumCaseData,
porosityModel,
RiaDefines::ResultCatType::STATIC_NATIVE,
"EQLNUM" );
RimEclipseCase* pressureEclipseCase =
stimPlanModel->eclipseCaseForProperty( RiaDefines::CurveProperty::INITIAL_PRESSURE );
CAF_ASSERT( pressureEclipseCase != nullptr );
const RigGridBase* pressureGrid = pressureEclipseCase->mainGrid()->gridByIndex( gridIndex );
CAF_ASSERT( pressureGrid );
RigEclipseCaseData* pressureCaseData = pressureEclipseCase->eclipseCaseData();
CAF_ASSERT( pressureCaseData );
const std::vector<double>& pressureValues =
RimStimPlanModelWellLogCalculator::loadResults( caseData,
RimStimPlanModelWellLogCalculator::loadResults( pressureCaseData,
porosityModel,
RiaDefines::ResultCatType::DYNAMIC_NATIVE,
"PRESSURE" );
if ( eqlNumValues.size() != pressureValues.size() )
auto eqlNumActiveCellInfo = eqlNumCaseData->activeCellInfo( porosityModel );
size_t eqlNumCellCount = eqlNumActiveCellInfo->reservoirCellCount();
auto pressureActiveCellInfo = pressureCaseData->activeCellInfo( porosityModel );
if ( eqlNumGrid->cellCountI() != pressureGrid->cellCountI() ||
eqlNumGrid->cellCountJ() != pressureGrid->cellCountJ() || eqlNumGrid->cellCountK() != pressureGrid->cellCountK() )
{
RiaLogging::error( "Unexpected result size for EQLNUM and PRESSURE found for pressure calculation." );
RiaLogging::error( "Unexpected number of cells when building pressure per EQLNUM table. " );
RiaLogging::error( "Grid needs to have identical geometry." );
RiaLogging::error( QString( "EQLNUM grid dimensions: [ %1, %2, %3]" )
.arg( eqlNumGrid->cellCountI() )
.arg( eqlNumGrid->cellCountJ() )
.arg( eqlNumGrid->cellCountK() ) );
RiaLogging::error( QString( "PRESSURE grid dimensions: [ %1, %2, %3]" )
.arg( pressureGrid->cellCountI() )
.arg( pressureGrid->cellCountJ() )
.arg( pressureGrid->cellCountK() ) );
return false;
}
auto activeCellInfo = caseData->activeCellInfo( porosityModel );
size_t cellCount = activeCellInfo->reservoirActiveCellCount();
if ( cellCount != pressureValues.size() )
for ( size_t cellIndex = 0; cellIndex < eqlNumCellCount; cellIndex++ )
{
RiaLogging::error( "Unexpected number of active cells in pressure calculation." );
return false;
}
for ( size_t cellIndex = 0; cellIndex < cellCount; cellIndex++ )
{
size_t resultIdx = activeCellInfo->cellResultIndex( cellIndex );
size_t resultIdx = eqlNumActiveCellInfo->cellResultIndex( cellIndex );
int eqlNum = static_cast<int>( eqlNumValues[resultIdx] );
double pressure = pressureValues[resultIdx];
size_t pressureResultIdx = pressureActiveCellInfo->cellResultIndex( cellIndex );
double pressure = pressureValues[pressureResultIdx];
if ( presentEqlNums.count( eqlNum ) > 0 && !std::isinf( pressure ) )
{
cvf::Vec3d center = grid->cell( cellIndex ).center();
cvf::Vec3d center = eqlNumGrid->cell( cellIndex ).center();
valuesPerEqlNum[eqlNum].push_back( std::make_pair( -center.z(), pressure ) );
}
}

View File

@ -584,6 +584,12 @@ const std::vector<double>& RimStimPlanModelWellLogCalculator::loadResults( RigEc
int timeStepIndex = 0;
RigEclipseResultAddress resultAddress( resultType, propertyName );
if ( !resultData->hasResultEntry( resultAddress ) && resultType != RiaDefines::ResultCatType::INPUT_PROPERTY )
{
return loadResults( caseData, porosityModel, RiaDefines::ResultCatType::INPUT_PROPERTY, propertyName );
}
CAF_ASSERT( resultData->hasResultEntry( resultAddress ) );
resultData->ensureKnownResultLoaded( resultAddress );
return caseData->results( porosityModel )->cellScalarResults( resultAddress, timeStepIndex );
}