From 6a859e086014377b3dc38f9f83351db5624ace34 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Fri, 18 Nov 2022 12:50:04 +0100 Subject: [PATCH] Fix update issues related to fracture calculations * Make sure property filter is updated when completion type is cleared * Clear geometry cache in views to make sure geometry is recreated * Calculate required input parameters to completion type calculations * Recompute values when depth changes --- .../RiaCompletionTypeCalculationScheduler.cpp | 43 +++++++++---------- .../RiaCompletionTypeCalculationScheduler.h | 4 +- .../RivReservoirViewPartMgr.cpp | 2 + .../RimEllipseFractureTemplate.cpp | 6 ++- .../Completions/RimFracture.cpp | 2 +- .../ProjectDataModel/RimGridCalculation.h | 3 +- .../ProjectDataModel/RimProject.cpp | 2 +- .../StimPlanModel/RimStimPlanModel.cpp | 3 +- .../RigCaseCellResultsData.cpp | 21 ++++++++- 9 files changed, 53 insertions(+), 33 deletions(-) diff --git a/ApplicationLibCode/Application/RiaCompletionTypeCalculationScheduler.cpp b/ApplicationLibCode/Application/RiaCompletionTypeCalculationScheduler.cpp index c103de733d..abfb803bdf 100644 --- a/ApplicationLibCode/Application/RiaCompletionTypeCalculationScheduler.cpp +++ b/ApplicationLibCode/Application/RiaCompletionTypeCalculationScheduler.cpp @@ -24,9 +24,7 @@ #include "RigEclipseCaseData.h" #include "RimEclipseCase.h" -#include "RimEclipseCaseCollection.h" #include "RimEclipseView.h" -#include "RimOilField.h" #include "RimProject.h" #include "RiuMainWindow.h" @@ -55,19 +53,7 @@ RiaCompletionTypeCalculationScheduler* RiaCompletionTypeCalculationScheduler::in //-------------------------------------------------------------------------------------------------- void RiaCompletionTypeCalculationScheduler::scheduleRecalculateCompletionTypeAndRedrawAllViews() { - std::vector eclipseCases = - RimProject::current()->activeOilField()->analysisModels->cases().children(); - - scheduleRecalculateCompletionTypeAndRedrawAllViews( eclipseCases ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RiaCompletionTypeCalculationScheduler::scheduleRecalculateCompletionTypeAndRedrawAllViews( RimEclipseCase* eclipseCase ) -{ - std::vector eclipseCases; - eclipseCases.push_back( eclipseCase ); + auto eclipseCases = RimProject::current()->eclipseCases(); scheduleRecalculateCompletionTypeAndRedrawAllViews( eclipseCases ); } @@ -93,10 +79,23 @@ void RiaCompletionTypeCalculationScheduler::scheduleRecalculateCompletionTypeAnd //-------------------------------------------------------------------------------------------------- void RiaCompletionTypeCalculationScheduler::clearCompletionTypeResultsInAllCases() { - std::vector eclipseCases = - RimProject::current()->activeOilField()->analysisModels->cases().children(); + auto eclipseCases = RimProject::current()->eclipseCases(); clearCompletionTypeResults( eclipseCases ); + + // Clear geometry cache in views to recreate potential property filter geometry + for ( auto eclipseCase : eclipseCases ) + { + if ( !eclipseCase ) continue; + + for ( auto view : eclipseCase->views() ) + { + if ( auto eclipseView = dynamic_cast( view ) ) + { + eclipseView->scheduleReservoirGridGeometryRegen(); + } + } + } } //-------------------------------------------------------------------------------------------------- @@ -124,18 +123,15 @@ void RiaCompletionTypeCalculationScheduler::performScheduledUpdates() { std::set uniqueCases( m_eclipseCasesToRecalculate.begin(), m_eclipseCasesToRecalculate.end() ); - Rim3dView* activeView = RiaApplication::instance()->activeReservoirView(); - for ( RimEclipseCase* eclipseCase : uniqueCases ) { if ( eclipseCase ) { - for ( const auto& w : eclipseCase->views() ) + for ( auto view : eclipseCase->views() ) { - RimEclipseView* eclView = dynamic_cast( w ); - if ( eclView ) + if ( auto eclipseView = dynamic_cast( view ) ) { - eclView->calculateCompletionTypeAndRedrawIfRequired(); + eclipseView->calculateCompletionTypeAndRedrawIfRequired(); } } } @@ -146,6 +142,7 @@ void RiaCompletionTypeCalculationScheduler::performScheduledUpdates() // Recalculation of completion type causes active view to be set to potentially a different view // Also current index in project tree is changed. Restore both to initial state. + Rim3dView* activeView = RiaApplication::instance()->activeReservoirView(); if ( activeView && activeView->viewer() ) { RiaApplication::instance()->setActiveReservoirView( activeView ); diff --git a/ApplicationLibCode/Application/RiaCompletionTypeCalculationScheduler.h b/ApplicationLibCode/Application/RiaCompletionTypeCalculationScheduler.h index 1f7ad10416..661aa61b29 100644 --- a/ApplicationLibCode/Application/RiaCompletionTypeCalculationScheduler.h +++ b/ApplicationLibCode/Application/RiaCompletionTypeCalculationScheduler.h @@ -38,7 +38,7 @@ public: void scheduleRecalculateCompletionTypeAndRedrawAllViews(); void clearCompletionTypeResultsInAllCases(); - void scheduleRecalculateCompletionTypeAndRedrawAllViews( RimEclipseCase* eclipseCase ); + void scheduleRecalculateCompletionTypeAndRedrawAllViews( const std::vector& eclipseCases ); void clearCompletionTypeResults( const std::vector& eclipseCases ); void performScheduledUpdates() override; @@ -50,8 +50,6 @@ private: RiaCompletionTypeCalculationScheduler( const RiaCompletionTypeCalculationScheduler& o ) = delete; void operator=( const RiaCompletionTypeCalculationScheduler& o ) = delete; - void scheduleRecalculateCompletionTypeAndRedrawAllViews( const std::vector& eclipseCases ); - private: std::vector> m_eclipseCasesToRecalculate; }; diff --git a/ApplicationLibCode/ModelVisualization/RivReservoirViewPartMgr.cpp b/ApplicationLibCode/ModelVisualization/RivReservoirViewPartMgr.cpp index 0c17667f84..e0906c6ae2 100644 --- a/ApplicationLibCode/ModelVisualization/RivReservoirViewPartMgr.cpp +++ b/ApplicationLibCode/ModelVisualization/RivReservoirViewPartMgr.cpp @@ -852,6 +852,8 @@ void RivReservoirViewPartMgr::computePropertyVisibility( cvf::UByteArray* if ( propertyFilter->isActive() && propertyFilter->resultDefinition()->hasResult() ) { + propertyFilter->resultDefinition()->loadResult(); + const RimCellFilter::FilterModeType filterType = propertyFilter->filterMode(); RigEclipseCaseData* eclipseCase = propFilterColl->reservoirView()->eclipseCase()->eclipseCaseData(); diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimEllipseFractureTemplate.cpp b/ApplicationLibCode/ProjectDataModel/Completions/RimEllipseFractureTemplate.cpp index 1de09133ee..09c4da2d22 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimEllipseFractureTemplate.cpp +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimEllipseFractureTemplate.cpp @@ -92,7 +92,8 @@ void RimEllipseFractureTemplate::fieldChangedByUi( const caf::PdmFieldHandle* ch RimFractureTemplate::fieldChangedByUi( changedField, oldValue, newValue ); if ( changedField == &m_halfLength || changedField == &m_height || changedField == &m_width || - changedField == &m_permeability || changedField == &m_scaleApplyButton ) + changedField == &m_permeability || changedField == &m_scaleApplyButton || + changedField == &m_wellPathDepthAtFracture ) { m_scaleApplyButton = false; @@ -396,7 +397,8 @@ void RimEllipseFractureTemplate::onLoadDataAndUpdateGeometryHasChanged() this->firstAncestorOrThisOfType( eclipseCase ); if ( eclipseCase ) { - RiaCompletionTypeCalculationScheduler::instance()->scheduleRecalculateCompletionTypeAndRedrawAllViews( eclipseCase ); + RiaCompletionTypeCalculationScheduler::instance()->scheduleRecalculateCompletionTypeAndRedrawAllViews( + { eclipseCase } ); } else { diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimFracture.cpp b/ApplicationLibCode/ProjectDataModel/Completions/RimFracture.cpp index 6208c136da..115b34f120 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimFracture.cpp +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimFracture.cpp @@ -295,7 +295,7 @@ void RimFracture::fieldChangedByUi( const caf::PdmFieldHandle* changedField, con if ( eclipseCase ) { RiaCompletionTypeCalculationScheduler::instance()->scheduleRecalculateCompletionTypeAndRedrawAllViews( - eclipseCase ); + { eclipseCase } ); } else { diff --git a/ApplicationLibCode/ProjectDataModel/RimGridCalculation.h b/ApplicationLibCode/ProjectDataModel/RimGridCalculation.h index 79c259e43e..7d6dacaefd 100644 --- a/ApplicationLibCode/ProjectDataModel/RimGridCalculation.h +++ b/ApplicationLibCode/ProjectDataModel/RimGridCalculation.h @@ -50,6 +50,8 @@ public: void updateDependentObjects() override; void removeDependentObjects() override; + RimEclipseCase* destinationEclipseCase() const; + protected: void onChildrenUpdated( caf::PdmChildArrayFieldHandle* childArray, std::vector& updatedObjects ) override; @@ -57,7 +59,6 @@ protected: RimGridCalculationVariable* createVariable() override; std::pair validateVariables(); - RimEclipseCase* destinationEclipseCase() const; std::vector inputCases() const; std::vector getInputVectorForVariable( RimGridCalculationVariable* v, diff --git a/ApplicationLibCode/ProjectDataModel/RimProject.cpp b/ApplicationLibCode/ProjectDataModel/RimProject.cpp index c51f66f1bd..97f4251cb2 100644 --- a/ApplicationLibCode/ProjectDataModel/RimProject.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimProject.cpp @@ -1370,7 +1370,7 @@ void RimProject::reloadCompletionTypeResultsForEclipseCase( RimEclipseCase* ecli views[viewIdx]->scheduleCreateDisplayModelAndRedraw(); } - RiaCompletionTypeCalculationScheduler::instance()->scheduleRecalculateCompletionTypeAndRedrawAllViews( eclipseCase ); + RiaCompletionTypeCalculationScheduler::instance()->scheduleRecalculateCompletionTypeAndRedrawAllViews( { eclipseCase } ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModel.cpp b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModel.cpp index c93eb50154..14f216bef8 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModel.cpp +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModel.cpp @@ -1596,7 +1596,8 @@ void RimStimPlanModel::updateViewsAndPlots() this->firstAncestorOrThisOfType( eclipseCase ); if ( eclipseCase ) { - RiaCompletionTypeCalculationScheduler::instance()->scheduleRecalculateCompletionTypeAndRedrawAllViews( eclipseCase ); + RiaCompletionTypeCalculationScheduler::instance()->scheduleRecalculateCompletionTypeAndRedrawAllViews( + { eclipseCase } ); } else { diff --git a/ApplicationLibCode/ReservoirDataModel/RigCaseCellResultsData.cpp b/ApplicationLibCode/ReservoirDataModel/RigCaseCellResultsData.cpp index 99c5d87e96..0a3e69e5f1 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigCaseCellResultsData.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigCaseCellResultsData.cpp @@ -28,6 +28,7 @@ #include "RiaResultNames.h" #include "RigAllanDiagramData.h" #include "RigCaseCellResultCalculator.h" +#include "RigEclipseAllanFaultsStatCalc.h" #include "RigEclipseCaseData.h" #include "RigEclipseMultiPropertyStatCalc.h" #include "RigEclipseNativeStatCalc.h" @@ -39,6 +40,8 @@ #include "RimCompletionCellIntersectionCalc.h" #include "RimEclipseCase.h" +#include "RimGridCalculation.h" +#include "RimGridCalculationCollection.h" #include "RimProject.h" #include "RifReaderEclipseOutput.h" @@ -49,7 +52,6 @@ #include -#include "RigEclipseAllanFaultsStatCalc.h" #include #include @@ -2897,6 +2899,23 @@ void RigCaseCellResultsData::computeCompletionTypeForTimeStep( size_t timeStep ) if ( !eclipseCase ) return; + // If permeabilities are generated by calculations, make sure that generated data is calculated + // See RicExportFractureCompletionsImpl::generateCompdatValues() + for ( const QString& propertyName : { "PERMX", "PERMY", "PERMZ" } ) + { + for ( auto userCalculation : RimProject::current()->gridCalculationCollection()->calculations() ) + { + auto gridCalculation = dynamic_cast( userCalculation ); + if ( gridCalculation && gridCalculation->destinationEclipseCase() != eclipseCase ) continue; + + QString generatedPropertyName = userCalculation->findLeftHandSide( userCalculation->expression() ); + if ( generatedPropertyName == propertyName ) + { + userCalculation->calculate(); + } + } + } + RimCompletionCellIntersectionCalc::calculateCompletionTypeResult( eclipseCase, completionTypeResult, timeStep ); }