From 03e1d4e7620e039f65012ab3314ed4391e3d64b5 Mon Sep 17 00:00:00 2001 From: Kristian Bendiksen Date: Thu, 2 May 2024 09:35:43 +0200 Subject: [PATCH] #11405 Fault reactivation: fix unexpected temperature change outside reservoir. No change in temperature is expected outside of reservoir between first (geostatic) and other time steps when exporting reactivation model. I.e. the temperature gradient and "top of reservoir" temperature from the geostatic step should be used on all time steps. Fixes #11405. --- .../Faults/RimFaultReactivationDataAccess.cpp | 3 +- ...ultReactivationDataAccessorTemperature.cpp | 33 +++++++++++++------ ...FaultReactivationDataAccessorTemperature.h | 4 ++- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultReactivationDataAccess.cpp b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultReactivationDataAccess.cpp index 46bdb8f00e..73c1db1713 100644 --- a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultReactivationDataAccess.cpp +++ b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultReactivationDataAccess.cpp @@ -58,7 +58,8 @@ RimFaultReactivationDataAccess::RimFaultReactivationDataAccess( const RimFaultRe double seabedDepth = -model.seaBedDepth(); m_accessors.push_back( std::make_shared( eCase, porePressureGradient, seabedDepth ) ); m_accessors.push_back( std::make_shared( eCase, 0.0001 ) ); - m_accessors.push_back( std::make_shared( eCase, topTemperature, seabedDepth ) ); + m_accessors.push_back( + std::make_shared( eCase, topTemperature, seabedDepth, timeSteps.front() ) ); std::vector stressProperties = { RimFaultReactivation::Property::StressTop, RimFaultReactivation::Property::DepthTop, diff --git a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultReactivationDataAccessorTemperature.cpp b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultReactivationDataAccessorTemperature.cpp index be16499b68..e647dfe84f 100644 --- a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultReactivationDataAccessorTemperature.cpp +++ b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultReactivationDataAccessorTemperature.cpp @@ -42,12 +42,14 @@ //-------------------------------------------------------------------------------------------------- RimFaultReactivationDataAccessorTemperature::RimFaultReactivationDataAccessorTemperature( RimEclipseCase* eclipseCase, double seabedTemperature, - double seabedDepth ) + double seabedDepth, + size_t firstTimeStep ) : m_eclipseCase( eclipseCase ) , m_caseData( nullptr ) , m_mainGrid( nullptr ) , m_seabedTemperature( seabedTemperature ) , m_seabedDepth( seabedDepth ) + , m_firstTimeStep( firstTimeStep ) { if ( m_eclipseCase ) { @@ -75,14 +77,23 @@ void RimFaultReactivationDataAccessorTemperature::updateResultAccessor() m_resultAccessor = RigResultAccessorFactory::createFromResultAddress( m_caseData, 0, RiaDefines::PorosityModelType::MATRIX_MODEL, m_timeStep, resVarAddress ); - if ( m_resultAccessor.notNull() ) + // Only create the first time step accessor once: it is always the same. + if ( m_resultAccessor0.isNull() ) { - auto [wellPaths, extractors] = - RimFaultReactivationDataAccessorWellLogExtraction::createEclipseWellPathExtractors( *m_model, *m_caseData, m_seabedDepth ); - m_wellPaths = wellPaths; - m_extractors = extractors; + m_resultAccessor0 = RigResultAccessorFactory::createFromResultAddress( m_caseData, + 0, + RiaDefines::PorosityModelType::MATRIX_MODEL, + m_firstTimeStep, + resVarAddress ); + if ( m_resultAccessor0.notNull() ) + { + auto [wellPaths, extractors] = + RimFaultReactivationDataAccessorWellLogExtraction::createEclipseWellPathExtractors( *m_model, *m_caseData, m_seabedDepth ); + m_wellPaths = wellPaths; + m_extractors = extractors; - m_gradient = computeGradient(); + m_gradient = computeGradient(); + } } } @@ -99,7 +110,7 @@ double RimFaultReactivationDataAccessorTemperature::computeGradient() const auto wellPath = m_wellPaths.find( gridPart )->second; auto [values, intersections] = - RimFaultReactivationDataAccessorWellLogExtraction::extractValuesAndIntersections( *m_resultAccessor.p(), *extractor.p(), *wellPath ); + RimFaultReactivationDataAccessorWellLogExtraction::extractValuesAndIntersections( *m_resultAccessor0.p(), *extractor.p(), *wellPath ); int lastOverburdenIndex = RimFaultReactivationDataAccessorWellLogExtraction::findLastOverburdenIndex( values ); if ( lastOverburdenIndex != -1 ) @@ -144,7 +155,7 @@ double RimFaultReactivationDataAccessorTemperature::valueAtPosition( const cvf:: double bottomDepth, size_t elementIndex ) const { - if ( ( m_mainGrid != nullptr ) && m_resultAccessor.notNull() ) + if ( ( m_mainGrid != nullptr ) && m_resultAccessor.notNull() && m_resultAccessor0.notNull() ) { auto cellIdx = m_mainGrid->findReservoirCellIndexFromPoint( position ); if ( cellIdx != cvf::UNDEFINED_SIZE_T ) @@ -159,8 +170,10 @@ double RimFaultReactivationDataAccessorTemperature::valueAtPosition( const cvf:: CAF_ASSERT( m_wellPaths.find( gridPart ) != m_wellPaths.end() ); auto wellPath = m_wellPaths.find( gridPart )->second; + // Use data from first time step when not in reservoir. This ensures that the only difference between the + // timesteps in the fault-reactivation model is in the reservoir. auto [values, intersections] = - RimFaultReactivationDataAccessorWellLogExtraction::extractValuesAndIntersections( *m_resultAccessor.p(), *extractor.p(), *wellPath ); + RimFaultReactivationDataAccessorWellLogExtraction::extractValuesAndIntersections( *m_resultAccessor0.p(), *extractor.p(), *wellPath ); auto [value, pos] = RimFaultReactivationDataAccessorWellLogExtraction::calculateTemperature( intersections, position, m_seabedTemperature, m_gradient ); diff --git a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultReactivationDataAccessorTemperature.h b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultReactivationDataAccessorTemperature.h index d8b5b1fce0..0ae440d3e8 100644 --- a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultReactivationDataAccessorTemperature.h +++ b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultReactivationDataAccessorTemperature.h @@ -38,7 +38,7 @@ class RigEclipseWellLogExtractor; class RimFaultReactivationDataAccessorTemperature : public RimFaultReactivationDataAccessor { public: - RimFaultReactivationDataAccessorTemperature( RimEclipseCase* eclipseCase, double seabedTemperature, double seabedDepth ); + RimFaultReactivationDataAccessorTemperature( RimEclipseCase* eclipseCase, double seabedTemperature, double seabedDepth, size_t firstTimeStep ); ~RimFaultReactivationDataAccessorTemperature(); bool isMatching( RimFaultReactivation::Property property ) const override; @@ -60,7 +60,9 @@ private: double m_seabedTemperature; double m_seabedDepth; double m_gradient; + size_t m_firstTimeStep; + cvf::ref m_resultAccessor0; cvf::ref m_resultAccessor; std::map> m_wellPaths;