Skip to content

Commit 75ebd7f

Browse files
authored
Well target updates (#14619)
Support well target mapping calculations for ensembles.
1 parent 04be720 commit 75ebd7f

19 files changed

Lines changed: 246 additions & 79 deletions

ApplicationLibCode/Application/RiaApplication.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
#include "RimCellFilterCollection.h"
6565
#include "RimCommandRouter.h"
6666
#include "RimCompletionTemplateCollection.h"
67+
#include "RimEclipseCase.h"
6768
#include "RimEclipseCaseCollection.h"
6869
#include "RimEclipseCaseEnsemble.h"
6970
#include "RimEclipseView.h"
@@ -115,6 +116,7 @@
115116
#include "RimWellPath.h"
116117
#include "RimWellPathCollection.h"
117118
#include "RimWellPathFracture.h"
119+
#include "RimWellTargetMapping.h"
118120
#include "VerticalFlowPerformance/RimVfpDataCollection.h"
119121
#include "VerticalFlowPerformance/RimVfpPlotCollection.h"
120122

@@ -865,6 +867,15 @@ bool RiaApplication::loadProject( const QString& projectFileName, ProjectLoadAct
865867
{
866868
view->loadDataAndUpdate();
867869
}
870+
871+
for ( auto wellTargetMapping : gridEnsemble->wellTargetMappings() )
872+
{
873+
if ( !wellTargetMapping->ensembleStatisticsCase() ) continue;
874+
for ( auto view : wellTargetMapping->ensembleStatisticsCase()->views() )
875+
{
876+
view->loadDataAndUpdate();
877+
}
878+
}
868879
}
869880
}
870881

ApplicationLibCode/Commands/RicCloseCaseFeature.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,16 @@ CAF_CMD_SOURCE_INIT( RicCloseCaseFeature, "RicCloseCaseFeature" );
5151
//--------------------------------------------------------------------------------------------------
5252
bool RicCloseCaseFeature::isCommandEnabled() const
5353
{
54-
return !selectedCases().empty();
54+
if ( !selectedCases().empty() )
55+
{
56+
for ( auto ecase : selectedCases() )
57+
{
58+
if ( !ecase->isDeletable() ) return false;
59+
}
60+
61+
return true;
62+
}
63+
return false;
5564
}
5665

5766
//--------------------------------------------------------------------------------------------------

ApplicationLibCode/Commands/RicNewWellTargetMappingFeature.cpp

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,16 +39,11 @@ bool RicNewWellTargetMappingFeature::isCommandEnabled() const
3939
{
4040
if ( auto gridEnsembles = caf::selectedObjectsByTypeStrict<RimReservoirGridEnsemble*>(); !gridEnsembles.empty() )
4141
{
42-
// Computation of well target mappings for individual grids is implemented in RimWellTargetMapping::generateEnsembleStatistics().
43-
//
44-
// If there is a future need to support well target mappings for ensembles with individual grids, the implementation in
45-
// RimWellTargetMapping::generateEnsembleStatistics() will need to be updated, and this check can be removed.
46-
//
47-
// The main performance reason is the memory consumption of loading all grids in the ensemble into memory at the same time, which is
48-
// currently needed in order to compute the well target mapping for ensembles with individual grids. For ensembles with shared grid,
49-
// only the shared grid needs to be loaded, which is much more memory efficient.
50-
51-
return false;
42+
return true;
43+
}
44+
if ( auto cases = caf::selectedObjectsByType<RimEclipseCase*>(); !cases.empty() )
45+
{
46+
return ( cases.front()->ensemble() == nullptr );
5247
}
5348
return true;
5449
}

ApplicationLibCode/ProjectDataModel/ContourMap/RimStatisticsContourMap.cpp

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -614,6 +614,11 @@ void RimStatisticsContourMap::onComputeStatisticsClicked()
614614
void RimStatisticsContourMap::computeStatistics()
615615
{
616616
computeStatisticsForMaps( { this } );
617+
618+
if ( auto ensemble = firstAncestorOrThisOfType<RimReservoirGridEnsemble>() )
619+
{
620+
ensemble->reloadMetaDataIfNeeded();
621+
}
617622
}
618623

619624
//--------------------------------------------------------------------------------------------------
@@ -682,7 +687,7 @@ void RimStatisticsContourMap::computeStatisticsForMaps( const std::vector<RimSta
682687

683688
// The bounding box is empty unless the primary case is open with active cell info
684689
cvf::BoundingBox gridBoundingBox = primaryCase->activeCellsBoundingBox();
685-
gridBoundingBox.expandPercent( map->m_boundingBoxExpPercent() );
690+
gridBoundingBox.expandPercent( map->m_boundingBoxExpPercent(), map->m_boundingBoxExpPercent() );
686691

687692
double sampleSpacing = 1.0;
688693
if ( auto mainGrid = primaryCase->mainGrid() ) sampleSpacing = map->sampleSpacingFactor() * mainGrid->characteristicIJCellSize();
@@ -722,12 +727,7 @@ void RimStatisticsContourMap::computeStatisticsForMaps( const std::vector<RimSta
722727
RiaLogging::info( std::format( "Computing statistics for {} ensemble contour map(s)", contexts.size() ) );
723728

724729
// All maps belong to the same ensemble, so the realization cases are shared
725-
auto cases = contexts.front().map->ensembleCases();
726-
auto casesInViews = contexts.front().map->ensembleCasesInViews();
727-
728-
std::set<RimEclipseCase*> primaryCases;
729-
for ( const auto& ctx : contexts )
730-
primaryCases.insert( ctx.map->eclipseCase() );
730+
auto cases = contexts.front().map->ensembleCases();
731731

732732
const size_t nCases = cases.size();
733733
caf::ProgressInfo progInfo( nCases, QString( "Reading Eclipse Ensemble" ) );
@@ -739,6 +739,8 @@ void RimStatisticsContourMap::computeStatisticsForMaps( const std::vector<RimSta
739739
{
740740
auto task = progInfo.task( QString( "Processing Case %1 of %2" ).arg( i++ ).arg( nCases ) );
741741

742+
bool closeCase = !eCase->isReservoirCaseOpen();
743+
742744
RifReaderSettings oldSettings = eCase->readerSettings();
743745
eCase->setReaderSettings( readerSettings );
744746

@@ -796,7 +798,7 @@ void RimStatisticsContourMap::computeStatisticsForMaps( const std::vector<RimSta
796798
// Release the grid data for cases that were opened only to compute statistics. A case is kept open if it has
797799
// its own views, if it is the primary case of one of the contour maps, or if it is displayed in one of the
798800
// ensemble views.
799-
if ( eCase->views().empty() && !primaryCases.contains( eCase ) && !casesInViews.contains( eCase ) )
801+
if ( closeCase )
800802
{
801803
eCase->closeReservoirCase();
802804
}
@@ -981,6 +983,12 @@ void RimStatisticsContourMap::ensureResultsComputed()
981983
}
982984

983985
computeStatisticsForMaps( maps );
986+
987+
// contour map calculations on shared grids clears the ensemble meta data, reload it
988+
if ( auto ensemble = firstAncestorOrThisOfType<RimReservoirGridEnsemble>() )
989+
{
990+
ensemble->reloadMetaDataIfNeeded();
991+
}
984992
}
985993

986994
//--------------------------------------------------------------------------------------------------

ApplicationLibCode/ProjectDataModel/RimEclipseCase.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1119,6 +1119,15 @@ bool RimEclipseCase::ensureReservoirCaseIsOpen()
11191119
return openReservoirCase();
11201120
}
11211121

1122+
//--------------------------------------------------------------------------------------------------
1123+
///
1124+
//--------------------------------------------------------------------------------------------------
1125+
bool RimEclipseCase::isReservoirCaseOpen() const
1126+
{
1127+
// for most grid case types, this is a sufficient test
1128+
return eclipseCaseData() != nullptr;
1129+
}
1130+
11221131
//--------------------------------------------------------------------------------------------------
11231132
///
11241133
//--------------------------------------------------------------------------------------------------
@@ -1468,3 +1477,11 @@ RimFaultDistanceCollection* RimEclipseCase::faultDistanceCollection() const
14681477
{
14691478
return m_dataAnalyticsCollection ? m_dataAnalyticsCollection->faultDistanceCollection() : nullptr;
14701479
}
1480+
1481+
//--------------------------------------------------------------------------------------------------
1482+
///
1483+
//--------------------------------------------------------------------------------------------------
1484+
RimReservoirGridEnsemble* RimEclipseCase::ensemble() const
1485+
{
1486+
return firstAncestorOrThisOfType<RimReservoirGridEnsemble>();
1487+
}

ApplicationLibCode/ProjectDataModel/RimEclipseCase.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ class RimReservoirCellResultsStorage;
6060
class RimEclipseResultAddressCollection;
6161
class RimEclipseViewCollection;
6262
class RimResultNameAlias;
63+
class RimReservoirGridEnsemble;
6364

6465
namespace caf
6566
{
@@ -87,6 +88,7 @@ class RimEclipseCase : public RimCase
8788

8889
bool ensureReservoirCaseIsOpen();
8990
bool openReservoirCase();
91+
virtual bool isReservoirCaseOpen() const;
9092
virtual void closeReservoirCase();
9193
virtual bool openEclipseGridFile() = 0;
9294
virtual void reloadEclipseGridFile();
@@ -155,6 +157,8 @@ class RimEclipseCase : public RimCase
155157

156158
void updateFormationNamesData() override;
157159

160+
RimReservoirGridEnsemble* ensemble() const;
161+
158162
protected:
159163
void initAfterRead() override;
160164
void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override;

ApplicationLibCode/ProjectDataModel/RimEclipseResultCase.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,14 @@ void RimEclipseResultCase::closeReservoirCase()
415415
m_activeCellInfoIsReadFromFile = false;
416416
}
417417

418+
//--------------------------------------------------------------------------------------------------
419+
///
420+
//--------------------------------------------------------------------------------------------------
421+
bool RimEclipseResultCase::isReservoirCaseOpen() const
422+
{
423+
return RimEclipseCase::isReservoirCaseOpen() && m_gridAndWellDataIsReadFromFile && m_activeCellInfoIsReadFromFile;
424+
}
425+
418426
//--------------------------------------------------------------------------------------------------
419427
///
420428
//--------------------------------------------------------------------------------------------------

ApplicationLibCode/ProjectDataModel/RimEclipseResultCase.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ class RimEclipseResultCase : public RimEclipseCase
5858
bool hasSourSimFile();
5959

6060
bool openEclipseGridFile() override;
61+
62+
bool isReservoirCaseOpen() const override;
6163
void closeReservoirCase() override;
6264

6365
bool importGridAndResultMetaData( bool showTimeStepFilter );

ApplicationLibCode/ProjectDataModel/RimEclipseStatisticsCase.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,8 @@ RimEclipseStatisticsCase::RimEclipseStatisticsCase()
141141
m_activeFormationNames.uiCapability()->setUiHidden( true );
142142

143143
m_displayNameOption = RimCaseDisplayNameTools::DisplayName::CUSTOM;
144+
145+
setDeletable( true );
144146
}
145147

146148
//--------------------------------------------------------------------------------------------------

ApplicationLibCode/ProjectDataModel/RimGridView.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -405,10 +405,9 @@ void RimGridView::onCreatePartCollectionFromSelection( cvf::Collection<cvf::Part
405405
{
406406
RiuEclipseSelectionItem* eclipseSelItem = static_cast<RiuEclipseSelectionItem*>( items[i] );
407407

408-
if ( eclipseSelItem && eclipseSelItem->m_view == this && eclipseSelItem->m_resultDefinition->eclipseCase() )
408+
if ( eclipseSelItem && eclipseSelItem->m_view == this && eclipseSelItem->m_resultDefinition->eclipseCase() &&
409+
eclipseSelItem->m_resultDefinition->eclipseCase()->eclipseCaseData() )
409410
{
410-
CAF_ASSERT( eclipseSelItem->m_resultDefinition->eclipseCase()->eclipseCaseData() );
411-
412411
RivSingleCellPartGenerator partGen( eclipseSelItem->m_resultDefinition->eclipseCase()->eclipseCaseData(),
413412
eclipseSelItem->m_gridIndex,
414413
eclipseSelItem->m_gridLocalCellIndex,

0 commit comments

Comments
 (0)