Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions ApplicationLibCode/Application/RiaApplication.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@
#include "RimOsduWellPathDataLoader.h"
#include "RimPlotWindow.h"
#include "RimProject.h"
#include "RimReservoirGridEnsemble.h"
#include "RimScriptCollection.h"
#include "RimSeismicData.h"
#include "RimSeismicDataCollection.h"
Expand Down Expand Up @@ -826,6 +827,22 @@ bool RiaApplication::loadProject( const QString& projectFileName, ProjectLoadAct
}
}

// Load all reservoir grid ensemble views
{
auto reservoirGridEnsembles = m_project->activeOilField()->analysisModels()->reservoirGridEnsembles.childrenByType();

for ( auto gridEnsemble : reservoirGridEnsembles )
{
gridEnsemble->loadDataAndUpdate();

auto views = gridEnsemble->allViews();
for ( auto view : views )
{
view->loadDataAndUpdate();
}
}
}

if ( m_project->viewLinkerCollection() && m_project->viewLinkerCollection()->viewLinker() )
{
m_project->viewLinkerCollection()->viewLinker()->updateOverrides();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ caf::PdmScriptResponse RicfComputeCaseGroupStatistics::execute()
{
for ( RimIdenticalGridCaseGroup* group : RimProject::current()->activeOilField()->analysisModels()->caseGroups )
{
for ( RimEclipseCase* c : group->statisticsCaseCollection->reservoirs )
for ( RimEclipseCase* c : group->statisticsCaseCollection()->reservoirs )
{
caseIds.push_back( c->caseId() );
}
Expand All @@ -67,7 +67,7 @@ caf::PdmScriptResponse RicfComputeCaseGroupStatistics::execute()
bool foundCase = false;
for ( RimIdenticalGridCaseGroup* group : RimProject::current()->activeOilField()->analysisModels()->caseGroups )
{
for ( RimEclipseCase* c : group->statisticsCaseCollection->reservoirs )
for ( RimEclipseCase* c : group->statisticsCaseCollection()->reservoirs )
{
if ( c->caseId() == caseId )
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
#include "RimEclipseCase.h"
#include "RimEclipseStatisticsCase.h"
#include "RimEclipseStatisticsCaseCollection.h"
#include "RimIdenticalGridCaseGroup.h"
#include "RimReservoirGridEnsembleBase.h"

#include "cafCmdFeatureManager.h"
#include "cafSelectionManager.h"
Expand All @@ -43,10 +43,8 @@ bool RicComputeStatisticsFeature::isCommandEnabled() const
RimEclipseStatisticsCase* statisticsCase = selection[0];
if ( statisticsCase )
{
RimIdenticalGridCaseGroup* gridCaseGroup = statisticsCase->firstAncestorOrThisOfType<RimIdenticalGridCaseGroup>();

RimCaseCollection* caseCollection = gridCaseGroup ? gridCaseGroup->caseCollection() : nullptr;
return caseCollection ? !caseCollection->reservoirs.empty() : false;
auto* ensembleBase = statisticsCase->gridEnsembleBase();
return ensembleBase ? !ensembleBase->sourceCases().empty() : false;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include "RimEclipseStatisticsCaseCollection.h"
#include "RimIdenticalGridCaseGroup.h"
#include "RimProject.h"
#include "RimReservoirGridEnsembleBase.h"

#include "Riu3DMainWindowTools.h"

Expand Down Expand Up @@ -93,30 +94,26 @@ caf::PdmUiItem* RicNewStatisticsCaseFeature::selectedValidUIItem()
//--------------------------------------------------------------------------------------------------
RimEclipseStatisticsCase* RicNewStatisticsCaseFeature::addStatisticalCalculation( caf::PdmUiItem* uiItem )
{
RimIdenticalGridCaseGroup* caseGroup = nullptr;
RimCaseCollection* caseCollection = nullptr;

if ( dynamic_cast<RimEclipseStatisticsCase*>( uiItem ) )
if ( auto* statCase = dynamic_cast<RimEclipseStatisticsCase*>( uiItem ) )
{
RimEclipseStatisticsCase* currentObject = dynamic_cast<RimEclipseStatisticsCase*>( uiItem );
caseGroup = currentObject->parentStatisticsCaseCollection()->parentCaseGroup();
caseCollection = statCase->parentStatisticsCaseCollection();
}
else if ( dynamic_cast<RimCaseCollection*>( uiItem ) )
else if ( auto* caseColl = dynamic_cast<RimCaseCollection*>( uiItem ) )
{
RimCaseCollection* statColl = dynamic_cast<RimCaseCollection*>( uiItem );
caseGroup = statColl->parentCaseGroup();
caseCollection = caseColl;
}

if ( caseGroup )
{
RimProject* proj = RimProject::current();
RimEclipseStatisticsCase* createdObject = caseGroup->createAndAppendStatisticsCase();
proj->assignCaseIdToCase( createdObject );
if ( !caseCollection ) return nullptr;

caseGroup->updateConnectedEditors();
return createdObject;
}
else
{
return nullptr;
}
auto* ensembleBase = caseCollection->parentGridEnsembleBase();
if ( !ensembleBase ) return nullptr;

auto* createdObject = ensembleBase->createAndAppendStatisticsCase();
RimProject::current()->assignCaseIdToCase( createdObject );

caseCollection->parentField()->ownerObject()->uiCapability()->updateConnectedEditors();

return createdObject;
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
set(SOURCE_GROUP_HEADER_FILES
${CMAKE_CURRENT_LIST_DIR}/RicImportEnsembleFileSetFeature.h
${CMAKE_CURRENT_LIST_DIR}/RicCreateEnsembleFromFileSetFeature.h
${CMAKE_CURRENT_LIST_DIR}/RicCreateReservoirGridEnsembleFromFileSetFeature.h
)

set(SOURCE_GROUP_SOURCE_FILES
${CMAKE_CURRENT_LIST_DIR}/RicImportEnsembleFileSetFeature.cpp
${CMAKE_CURRENT_LIST_DIR}/RicCreateEnsembleFromFileSetFeature.cpp
${CMAKE_CURRENT_LIST_DIR}/RicCreateReservoirGridEnsembleFromFileSetFeature.cpp
)

list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES})
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2026 Equinor ASA
//
// ResInsight is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.
//
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////

#include "RicCreateReservoirGridEnsembleFromFileSetFeature.h"

#include "RiaLogging.h"

#include "EnsembleFileSet/RimEnsembleFileSet.h"
#include "RimEclipseCaseCollection.h"
#include "RimEclipseView.h"
#include "RimOilField.h"
#include "RimProject.h"
#include "RimReservoirGridEnsemble.h"

#include "Riu3DMainWindowTools.h"

#include "cafProgressInfo.h"
#include "cafSelectionManagerTools.h"

#include <QAction>
#include <QFileInfo>

CAF_CMD_SOURCE_INIT( RicCreateReservoirGridEnsembleFromFileSetFeature, "RicCreateReservoirGridEnsembleFromFileSetFeature" );

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RicCreateReservoirGridEnsembleFromFileSetFeature::isCommandEnabled() const
{
return !caf::selectedObjectsByType<RimEnsembleFileSet*>().empty();
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicCreateReservoirGridEnsembleFromFileSetFeature::onActionTriggered( bool isChecked )
{
std::vector<RimEnsembleFileSet*> selectedFileSets = caf::selectedObjectsByType<RimEnsembleFileSet*>();

if ( selectedFileSets.empty() ) return;

RimProject* project = RimProject::current();
RimEclipseCaseCollection* eclipseCaseColl = project->activeOilField()->analysisModels();

for ( RimEnsembleFileSet* fileSet : selectedFileSets )
{
// Get grid file paths from the file set
QStringList gridFiles = fileSet->createPaths( ".EGRID" );
if ( gridFiles.empty() )
{
gridFiles = fileSet->createPaths( ".GRID" );
}

// Filter out non-existing files
QStringList existingGridFiles;
for ( const QString& filePath : gridFiles )
{
if ( QFileInfo::exists( filePath ) )
{
existingGridFiles.append( filePath );
}
else
{
RiaLogging::warning( QString( "Grid file does not exist: %1" ).arg( filePath ) );
}
}
gridFiles = existingGridFiles;

if ( gridFiles.empty() )
{
RiaLogging::warning( QString( "No existing grid files found for ensemble '%1'" ).arg( fileSet->name() ) );
continue;
}

// Always create RimReservoirGridEnsemble
RiaLogging::info(
QString( "Creating Reservoir Grid Ensemble for '%1' with %2 grid files." ).arg( fileSet->name() ).arg( gridFiles.size() ) );

RimReservoirGridEnsemble* gridEnsemble = new RimReservoirGridEnsemble();
gridEnsemble->setEnsembleFileSet( fileSet );
gridEnsemble->createGridCasesFromEnsembleFileSet();

project->assignIdToCaseGroup( gridEnsemble );
eclipseCaseColl->reservoirGridEnsembles.push_back( gridEnsemble );

gridEnsemble->loadDataAndUpdate();

// Create view for first case if available
auto allCases = gridEnsemble->cases();
if ( !allCases.empty() )
{
RimEclipseView* view = gridEnsemble->addViewForCase( allCases[0] );
if ( view )
{
view->loadDataAndUpdate();
}
}

Riu3DMainWindowTools::selectAsCurrentItem( gridEnsemble );
}

eclipseCaseColl->updateAllRequiredEditors();
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RicCreateReservoirGridEnsembleFromFileSetFeature::setupActionLook( QAction* actionToSetup )
{
actionToSetup->setIcon( QIcon( ":/GridCaseGroup16x16.png" ) );
actionToSetup->setText( "Create Reservoir Grid Ensemble" );
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2026 Equinor ASA
//
// ResInsight is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or
// FITNESS FOR A PARTICULAR PURPOSE.
//
// See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
// for more details.
//
/////////////////////////////////////////////////////////////////////////////////

#pragma once

#include "cafCmdFeature.h"

//==================================================================================================
///
//==================================================================================================
class RicCreateReservoirGridEnsembleFromFileSetFeature : public caf::CmdFeature
{
CAF_CMD_HEADER_INIT;

protected:
bool isCommandEnabled() const override;
void onActionTriggered( bool isChecked ) override;
void setupActionLook( QAction* actionToSetup ) override;
};
15 changes: 11 additions & 4 deletions ApplicationLibCode/Commands/RicCloseCaseFeature.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
#include "RimMainPlotCollection.h"
#include "RimOilField.h"
#include "RimProject.h"
#include "RimReservoirGridEnsemble.h"
#include "RimSummaryCaseMainCollection.h"
#include "RimWellLogPlotCollection.h"

Expand Down Expand Up @@ -147,10 +148,16 @@ void RicCloseCaseFeature::deleteEclipseCase( RimEclipseCase* eclipseCase )
if ( RimIdenticalGridCaseGroup::isStatisticsCaseCollection( caseCollection ) )
{
RimIdenticalGridCaseGroup* caseGroup = caseCollection->parentCaseGroup();
CVF_ASSERT( caseGroup );

caseGroup->statisticsCaseCollection()->reservoirs.removeChild( eclipseCase );
caseGroup->updateConnectedEditors();
if ( caseGroup )
{
caseGroup->statisticsCaseCollection()->reservoirs.removeChild( eclipseCase );
caseGroup->updateConnectedEditors();
}
else if ( RimReservoirGridEnsemble* ensemble = caseCollection->parentGridEnsemble() )
{
caseCollection->reservoirs.removeChild( eclipseCase );
ensemble->updateConnectedEditors();
}
}
else
{
Expand Down
25 changes: 25 additions & 0 deletions ApplicationLibCode/FileInterface/RifReaderOpmCommon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,31 @@ RifReaderOpmCommon::~RifReaderOpmCommon()
{
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RifReaderOpmCommon::GridDimensions RifReaderOpmCommon::readGridDimensions( const QString& gridFileName )
{
GridDimensions result;

try
{
Opm::EclIO::EGrid opmGrid( gridFileName.toStdString() );

const auto& dims = opmGrid.dimension();
result.i = dims[0];
result.j = dims[1];
result.k = dims[2];
result.activeCellCount = opmGrid.activeCells();
}
catch ( std::exception& e )
{
RiaLogging::debug( QString( "Failed to read grid dimensions from %1: %2" ).arg( gridFileName ).arg( e.what() ) );
}

return result;
}

//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
Expand Down
10 changes: 10 additions & 0 deletions ApplicationLibCode/FileInterface/RifReaderOpmCommon.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,14 @@ class ProgressInfo;
class RifReaderOpmCommon : public RifReaderInterface
{
public:
struct GridDimensions
{
size_t i = 0;
size_t j = 0;
size_t k = 0;
size_t activeCellCount = 0;
};

RifReaderOpmCommon();
~RifReaderOpmCommon() override;

Expand All @@ -64,6 +72,8 @@ class RifReaderOpmCommon : public RifReaderInterface
std::vector<QDateTime> timeStepsOnFile( QString gridFileName );
std::set<RiaDefines::PhaseType> availablePhases() const override;

static GridDimensions readGridDimensions( const QString& gridFileName );

protected:
virtual bool importGrid( RigMainGrid* mainGrid, RigEclipseCaseData* caseData );

Expand Down
Loading
Loading