From 4049d5ca933a3df30f7ca3897024a678e7e557d2 Mon Sep 17 00:00:00 2001 From: Kristian Bendiksen Date: Thu, 20 Aug 2020 22:22:04 +0200 Subject: [PATCH] #6301 Make sure mud weight window parameters consistent. The values are now propagated from rim to rig. --- .../ProjectDataModel/RimGeoMechCase.cpp | 2 + .../RimMudWeightWindowParameters.cpp | 84 +++++++++++++++++++ .../RimMudWeightWindowParameters.h | 10 +++ 3 files changed, 96 insertions(+) diff --git a/ApplicationCode/ProjectDataModel/RimGeoMechCase.cpp b/ApplicationCode/ProjectDataModel/RimGeoMechCase.cpp index 1473b3de96..f1a423a20f 100644 --- a/ApplicationCode/ProjectDataModel/RimGeoMechCase.cpp +++ b/ApplicationCode/ProjectDataModel/RimGeoMechCase.cpp @@ -381,6 +381,8 @@ RimGeoMechCase::CaseOpenStatus RimGeoMechCase::openGeoMechCase( std::string* err m_geoMechCaseData = geoMechCaseData; + m_mudWeightWindowParameters->updateFemPartResults(); + return CASE_OPEN_OK; } diff --git a/ApplicationCode/ProjectDataModel/RimMudWeightWindowParameters.cpp b/ApplicationCode/ProjectDataModel/RimMudWeightWindowParameters.cpp index 4c57211deb..7008019c37 100644 --- a/ApplicationCode/ProjectDataModel/RimMudWeightWindowParameters.cpp +++ b/ApplicationCode/ProjectDataModel/RimMudWeightWindowParameters.cpp @@ -158,6 +158,19 @@ RimMudWeightWindowParameters::RimMudWeightWindowParameters( void ) CAF_PDM_InitField( &m_obg0Address, "obg0Address", QString( "" ), "Value", "", "", "" ); m_obg0Address.uiCapability()->setUiEditorTypeName( caf::PdmUiListEditor::uiEditorTypeName() ); + m_parameterFields[RimMudWeightWindowParameters::ParameterType::WELL_DEVIATION] = + std::make_tuple( &m_wellDeviationType, &m_wellDeviationFixed, &m_wellDeviationAddress ); + m_parameterFields[RimMudWeightWindowParameters::ParameterType::WELL_AZIMUTH] = + std::make_tuple( &m_wellAzimuthType, &m_wellAzimuthFixed, &m_wellAzimuthAddress ); + m_parameterFields[RimMudWeightWindowParameters::ParameterType::UCS] = + std::make_tuple( &m_UCSType, &m_UCSFixed, &m_UCSAddress ); + m_parameterFields[RimMudWeightWindowParameters::ParameterType::POISSONS_RATIO] = + std::make_tuple( &m_poissonsRatioType, &m_poissonsRatioFixed, &m_poissonsRatioAddress ); + m_parameterFields[RimMudWeightWindowParameters::ParameterType::K0_FG] = + std::make_tuple( &m_K0_FGType, &m_K0_FGFixed, &m_K0_FGAddress ); + m_parameterFields[RimMudWeightWindowParameters::ParameterType::OBG0] = + std::make_tuple( &m_obg0Type, &m_obg0Fixed, &m_obg0Address ); + CAF_PDM_InitField( &m_airGap, "AirGap", 0.0, "Air Gap", "", "", "" ); CAF_PDM_InitField( &m_shMultiplier, "SHMultiplier", 1.05, "SH Multplier for FG in Shale", "", "", "" ); @@ -620,3 +633,74 @@ QList return options; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimMudWeightWindowParameters::updateFemPartResults() const +{ + RimGeoMechCase* geoMechCase = nullptr; + firstAncestorOrThisOfType( geoMechCase ); + if ( !geoMechCase ) + { + return; + } + + RigGeoMechCaseData* rigCaseData = geoMechCase->geoMechData(); + if ( !rigCaseData ) + { + return; + } + + for ( size_t i = 0; i < caf::AppEnum::size(); ++i ) + { + updateFemPartsForParameter( caf::AppEnum::fromIndex( i ), rigCaseData ); + } + + // Make sure the reference layer is valid + int referenceLayer = m_referenceLayer(); + if ( referenceLayer == -1 ) + { + referenceLayer = + (int)rigCaseData->femParts()->part( 0 )->getOrCreateStructGrid()->reservoirIJKBoundingBox().first.z(); + } + + rigCaseData->femPartResults()->setMudWeightWindowParameters( m_airGap, + m_upperLimitType.value(), + m_lowerLimitType.value(), + referenceLayer, + m_fractureGradientCalculationType.value(), + m_shMultiplier, + m_porePressureNonReservoirSource.value(), + m_userDefinedPPNonReservoir, + m_porePressureNonReservoirAddress ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimMudWeightWindowParameters::updateFemPartsForParameter( ParameterType parameterType, + RigGeoMechCaseData* rigCaseData ) const +{ + auto it = m_parameterFields.find( parameterType ); + if ( it == m_parameterFields.end() ) return; + + caf::PdmField>* typeField = std::get<0>( it->second ); + caf::PdmField* fixedField = std::get<1>( it->second ); + caf::PdmField* addressField = std::get<2>( it->second ); + + if ( rigCaseData->femPartResults() ) + { + if ( typeField->value() == RimMudWeightWindowParameters::SourceType::FIXED || + typeField->value() == RimMudWeightWindowParameters::SourceType::GRID ) + { + rigCaseData->femPartResults()->setCalculationParameters( parameterType, "", fixedField->value() ); + } + else if ( typeField->value() == RimMudWeightWindowParameters::SourceType::PER_ELEMENT ) + { + rigCaseData->femPartResults()->setCalculationParameters( parameterType, + addressField->value(), + fixedField->value() ); + } + } +} diff --git a/ApplicationCode/ProjectDataModel/RimMudWeightWindowParameters.h b/ApplicationCode/ProjectDataModel/RimMudWeightWindowParameters.h index 43f0a04e34..496cab3f5e 100644 --- a/ApplicationCode/ProjectDataModel/RimMudWeightWindowParameters.h +++ b/ApplicationCode/ProjectDataModel/RimMudWeightWindowParameters.h @@ -21,7 +21,10 @@ #include "cafPdmField.h" #include "cafPdmObject.h" +#include + class RimGeoMechCase; +class RigGeoMechCaseData; //================================================================================================== /// @@ -97,6 +100,8 @@ public: double airGap() const; + void updateFemPartResults() const; + private: void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; @@ -120,6 +125,8 @@ private: caf::PdmField* addressField, bool typeFieldChanged ); + void updateFemPartsForParameter( ParameterType parameterType, RigGeoMechCaseData* rigCaseData ) const; + private: caf::PdmField> m_wellDeviationType; caf::PdmField m_wellDeviationFixed; @@ -145,6 +152,9 @@ private: caf::PdmField m_obg0Fixed; caf::PdmField m_obg0Address; + typedef std::tuple>*, caf::PdmField*, caf::PdmField*> ParameterPdmFields; + std::map m_parameterFields; + caf::PdmField m_airGap; caf::PdmField m_shMultiplier; caf::PdmField m_userDefinedPPNonReservoir;