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
This commit is contained in:
Magne Sjaastad
2022-11-18 12:50:04 +01:00
committed by GitHub
parent e7c864c6d8
commit 6a859e0860
9 changed files with 53 additions and 33 deletions

View File

@@ -24,9 +24,7 @@
#include "RigEclipseCaseData.h" #include "RigEclipseCaseData.h"
#include "RimEclipseCase.h" #include "RimEclipseCase.h"
#include "RimEclipseCaseCollection.h"
#include "RimEclipseView.h" #include "RimEclipseView.h"
#include "RimOilField.h"
#include "RimProject.h" #include "RimProject.h"
#include "RiuMainWindow.h" #include "RiuMainWindow.h"
@@ -55,19 +53,7 @@ RiaCompletionTypeCalculationScheduler* RiaCompletionTypeCalculationScheduler::in
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RiaCompletionTypeCalculationScheduler::scheduleRecalculateCompletionTypeAndRedrawAllViews() void RiaCompletionTypeCalculationScheduler::scheduleRecalculateCompletionTypeAndRedrawAllViews()
{ {
std::vector<RimEclipseCase*> eclipseCases = auto eclipseCases = RimProject::current()->eclipseCases();
RimProject::current()->activeOilField()->analysisModels->cases().children();
scheduleRecalculateCompletionTypeAndRedrawAllViews( eclipseCases );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RiaCompletionTypeCalculationScheduler::scheduleRecalculateCompletionTypeAndRedrawAllViews( RimEclipseCase* eclipseCase )
{
std::vector<RimEclipseCase*> eclipseCases;
eclipseCases.push_back( eclipseCase );
scheduleRecalculateCompletionTypeAndRedrawAllViews( eclipseCases ); scheduleRecalculateCompletionTypeAndRedrawAllViews( eclipseCases );
} }
@@ -93,10 +79,23 @@ void RiaCompletionTypeCalculationScheduler::scheduleRecalculateCompletionTypeAnd
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RiaCompletionTypeCalculationScheduler::clearCompletionTypeResultsInAllCases() void RiaCompletionTypeCalculationScheduler::clearCompletionTypeResultsInAllCases()
{ {
std::vector<RimEclipseCase*> eclipseCases = auto eclipseCases = RimProject::current()->eclipseCases();
RimProject::current()->activeOilField()->analysisModels->cases().children();
clearCompletionTypeResults( 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<RimEclipseView*>( view ) )
{
eclipseView->scheduleReservoirGridGeometryRegen();
}
}
}
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@@ -124,18 +123,15 @@ void RiaCompletionTypeCalculationScheduler::performScheduledUpdates()
{ {
std::set<RimEclipseCase*> uniqueCases( m_eclipseCasesToRecalculate.begin(), m_eclipseCasesToRecalculate.end() ); std::set<RimEclipseCase*> uniqueCases( m_eclipseCasesToRecalculate.begin(), m_eclipseCasesToRecalculate.end() );
Rim3dView* activeView = RiaApplication::instance()->activeReservoirView();
for ( RimEclipseCase* eclipseCase : uniqueCases ) for ( RimEclipseCase* eclipseCase : uniqueCases )
{ {
if ( eclipseCase ) if ( eclipseCase )
{ {
for ( const auto& w : eclipseCase->views() ) for ( auto view : eclipseCase->views() )
{ {
RimEclipseView* eclView = dynamic_cast<RimEclipseView*>( w ); if ( auto eclipseView = dynamic_cast<RimEclipseView*>( view ) )
if ( eclView )
{ {
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 // 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. // Also current index in project tree is changed. Restore both to initial state.
Rim3dView* activeView = RiaApplication::instance()->activeReservoirView();
if ( activeView && activeView->viewer() ) if ( activeView && activeView->viewer() )
{ {
RiaApplication::instance()->setActiveReservoirView( activeView ); RiaApplication::instance()->setActiveReservoirView( activeView );

View File

@@ -38,7 +38,7 @@ public:
void scheduleRecalculateCompletionTypeAndRedrawAllViews(); void scheduleRecalculateCompletionTypeAndRedrawAllViews();
void clearCompletionTypeResultsInAllCases(); void clearCompletionTypeResultsInAllCases();
void scheduleRecalculateCompletionTypeAndRedrawAllViews( RimEclipseCase* eclipseCase ); void scheduleRecalculateCompletionTypeAndRedrawAllViews( const std::vector<RimEclipseCase*>& eclipseCases );
void clearCompletionTypeResults( const std::vector<RimEclipseCase*>& eclipseCases ); void clearCompletionTypeResults( const std::vector<RimEclipseCase*>& eclipseCases );
void performScheduledUpdates() override; void performScheduledUpdates() override;
@@ -50,8 +50,6 @@ private:
RiaCompletionTypeCalculationScheduler( const RiaCompletionTypeCalculationScheduler& o ) = delete; RiaCompletionTypeCalculationScheduler( const RiaCompletionTypeCalculationScheduler& o ) = delete;
void operator=( const RiaCompletionTypeCalculationScheduler& o ) = delete; void operator=( const RiaCompletionTypeCalculationScheduler& o ) = delete;
void scheduleRecalculateCompletionTypeAndRedrawAllViews( const std::vector<RimEclipseCase*>& eclipseCases );
private: private:
std::vector<caf::PdmPointer<RimEclipseCase>> m_eclipseCasesToRecalculate; std::vector<caf::PdmPointer<RimEclipseCase>> m_eclipseCasesToRecalculate;
}; };

View File

@@ -852,6 +852,8 @@ void RivReservoirViewPartMgr::computePropertyVisibility( cvf::UByteArray*
if ( propertyFilter->isActive() && propertyFilter->resultDefinition()->hasResult() ) if ( propertyFilter->isActive() && propertyFilter->resultDefinition()->hasResult() )
{ {
propertyFilter->resultDefinition()->loadResult();
const RimCellFilter::FilterModeType filterType = propertyFilter->filterMode(); const RimCellFilter::FilterModeType filterType = propertyFilter->filterMode();
RigEclipseCaseData* eclipseCase = propFilterColl->reservoirView()->eclipseCase()->eclipseCaseData(); RigEclipseCaseData* eclipseCase = propFilterColl->reservoirView()->eclipseCase()->eclipseCaseData();

View File

@@ -92,7 +92,8 @@ void RimEllipseFractureTemplate::fieldChangedByUi( const caf::PdmFieldHandle* ch
RimFractureTemplate::fieldChangedByUi( changedField, oldValue, newValue ); RimFractureTemplate::fieldChangedByUi( changedField, oldValue, newValue );
if ( changedField == &m_halfLength || changedField == &m_height || changedField == &m_width || 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; m_scaleApplyButton = false;
@@ -396,7 +397,8 @@ void RimEllipseFractureTemplate::onLoadDataAndUpdateGeometryHasChanged()
this->firstAncestorOrThisOfType( eclipseCase ); this->firstAncestorOrThisOfType( eclipseCase );
if ( eclipseCase ) if ( eclipseCase )
{ {
RiaCompletionTypeCalculationScheduler::instance()->scheduleRecalculateCompletionTypeAndRedrawAllViews( eclipseCase ); RiaCompletionTypeCalculationScheduler::instance()->scheduleRecalculateCompletionTypeAndRedrawAllViews(
{ eclipseCase } );
} }
else else
{ {

View File

@@ -295,7 +295,7 @@ void RimFracture::fieldChangedByUi( const caf::PdmFieldHandle* changedField, con
if ( eclipseCase ) if ( eclipseCase )
{ {
RiaCompletionTypeCalculationScheduler::instance()->scheduleRecalculateCompletionTypeAndRedrawAllViews( RiaCompletionTypeCalculationScheduler::instance()->scheduleRecalculateCompletionTypeAndRedrawAllViews(
eclipseCase ); { eclipseCase } );
} }
else else
{ {

View File

@@ -50,6 +50,8 @@ public:
void updateDependentObjects() override; void updateDependentObjects() override;
void removeDependentObjects() override; void removeDependentObjects() override;
RimEclipseCase* destinationEclipseCase() const;
protected: protected:
void onChildrenUpdated( caf::PdmChildArrayFieldHandle* childArray, void onChildrenUpdated( caf::PdmChildArrayFieldHandle* childArray,
std::vector<caf::PdmObjectHandle*>& updatedObjects ) override; std::vector<caf::PdmObjectHandle*>& updatedObjects ) override;
@@ -57,7 +59,6 @@ protected:
RimGridCalculationVariable* createVariable() override; RimGridCalculationVariable* createVariable() override;
std::pair<bool, QString> validateVariables(); std::pair<bool, QString> validateVariables();
RimEclipseCase* destinationEclipseCase() const;
std::vector<RimEclipseCase*> inputCases() const; std::vector<RimEclipseCase*> inputCases() const;
std::vector<double> getInputVectorForVariable( RimGridCalculationVariable* v, std::vector<double> getInputVectorForVariable( RimGridCalculationVariable* v,

View File

@@ -1370,7 +1370,7 @@ void RimProject::reloadCompletionTypeResultsForEclipseCase( RimEclipseCase* ecli
views[viewIdx]->scheduleCreateDisplayModelAndRedraw(); views[viewIdx]->scheduleCreateDisplayModelAndRedraw();
} }
RiaCompletionTypeCalculationScheduler::instance()->scheduleRecalculateCompletionTypeAndRedrawAllViews( eclipseCase ); RiaCompletionTypeCalculationScheduler::instance()->scheduleRecalculateCompletionTypeAndRedrawAllViews( { eclipseCase } );
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@@ -1596,7 +1596,8 @@ void RimStimPlanModel::updateViewsAndPlots()
this->firstAncestorOrThisOfType( eclipseCase ); this->firstAncestorOrThisOfType( eclipseCase );
if ( eclipseCase ) if ( eclipseCase )
{ {
RiaCompletionTypeCalculationScheduler::instance()->scheduleRecalculateCompletionTypeAndRedrawAllViews( eclipseCase ); RiaCompletionTypeCalculationScheduler::instance()->scheduleRecalculateCompletionTypeAndRedrawAllViews(
{ eclipseCase } );
} }
else else
{ {

View File

@@ -28,6 +28,7 @@
#include "RiaResultNames.h" #include "RiaResultNames.h"
#include "RigAllanDiagramData.h" #include "RigAllanDiagramData.h"
#include "RigCaseCellResultCalculator.h" #include "RigCaseCellResultCalculator.h"
#include "RigEclipseAllanFaultsStatCalc.h"
#include "RigEclipseCaseData.h" #include "RigEclipseCaseData.h"
#include "RigEclipseMultiPropertyStatCalc.h" #include "RigEclipseMultiPropertyStatCalc.h"
#include "RigEclipseNativeStatCalc.h" #include "RigEclipseNativeStatCalc.h"
@@ -39,6 +40,8 @@
#include "RimCompletionCellIntersectionCalc.h" #include "RimCompletionCellIntersectionCalc.h"
#include "RimEclipseCase.h" #include "RimEclipseCase.h"
#include "RimGridCalculation.h"
#include "RimGridCalculationCollection.h"
#include "RimProject.h" #include "RimProject.h"
#include "RifReaderEclipseOutput.h" #include "RifReaderEclipseOutput.h"
@@ -49,7 +52,6 @@
#include <QDateTime> #include <QDateTime>
#include "RigEclipseAllanFaultsStatCalc.h"
#include <algorithm> #include <algorithm>
#include <cmath> #include <cmath>
@@ -2897,6 +2899,23 @@ void RigCaseCellResultsData::computeCompletionTypeForTimeStep( size_t timeStep )
if ( !eclipseCase ) return; 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<RimGridCalculation*>( userCalculation );
if ( gridCalculation && gridCalculation->destinationEclipseCase() != eclipseCase ) continue;
QString generatedPropertyName = userCalculation->findLeftHandSide( userCalculation->expression() );
if ( generatedPropertyName == propertyName )
{
userCalculation->calculate();
}
}
}
RimCompletionCellIntersectionCalc::calculateCompletionTypeResult( eclipseCase, completionTypeResult, timeStep ); RimCompletionCellIntersectionCalc::calculateCompletionTypeResult( eclipseCase, completionTypeResult, timeStep );
} }