Files
ResInsight/ApplicationLibCode/ProjectDataModel/RimEclipseCaseCollection.cpp
T
Magne Sjaastad 1e071247d8 #15110: Remove duplicate nodes from RigMainGrid node table
Merge identical nodes when grid geometry is finalized and remap cell corner indices. Partial shared node indices in the quad overlap calculation are now resolved geometrically, keeping fault and NNC geometry unchanged. Log the node count reduction with thousand grouping and the removed share of nodes.
2026-11-05 18:33:07 +01:00

215 lines
7.9 KiB
C++

/////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2011- Statoil ASA
// Copyright (C) 2013- Ceetron Solutions AS
// Copyright (C) 2011-2012 Ceetron AS
//
// 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 "RimEclipseCaseCollection.h"
#include "RiaApplication.h"
#include "RigEclipseCaseData.h"
#include "RigGridManager.h"
#include "RigMainGrid.h"
#include "RimCaseCollection.h"
#include "RimEclipseCase.h"
#include "RimEclipseCaseEnsemble.h"
#include "RimEclipseStatisticsCase.h"
#include "RimIdenticalGridCaseGroup.h"
#include "RimProject.h"
#include "RimReservoirGridEnsemble.h"
#include "cafCmdFeatureMenuBuilder.h"
#include "cafPdmFieldReorderCapability.h"
CAF_PDM_SOURCE_INIT( RimEclipseCaseCollection, "ResInsightAnalysisModels" );
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimEclipseCaseCollection::RimEclipseCaseCollection()
{
CAF_PDM_InitObject( "Grid Models", ":/Cases16x16.png" );
CAF_PDM_InitFieldNoDefault( &cases, "Reservoirs", "" );
caf::PdmFieldReorderCapability::addToField( &cases );
CAF_PDM_InitFieldNoDefault( &caseGroups, "CaseGroups", "" );
CAF_PDM_InitFieldNoDefault( &caseEnsembles, "CaseEnsembles", "" );
CAF_PDM_InitFieldNoDefault( &reservoirGridEnsembles, "ReservoirGridEnsembles", "" );
m_gridCollection = new RigGridManager;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimEclipseCaseCollection::~RimEclipseCaseCollection()
{
close();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimEclipseCaseCollection::close()
{
m_gridCollection->clear();
cases.deleteChildren();
caseGroups.deleteChildren();
caseEnsembles.deleteChildren();
reservoirGridEnsembles.deleteChildren();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RimIdenticalGridCaseGroup* RimEclipseCaseCollection::createIdenticalCaseGroupFromMainCase( RimEclipseCase* mainCase )
{
CAF_ASSERT( mainCase );
registerCaseInGridCollection( mainCase );
RimIdenticalGridCaseGroup* group = new RimIdenticalGridCaseGroup;
assert( RimProject::current() );
RimProject::current()->assignIdToCaseGroup( group );
group->addCase( mainCase );
RimEclipseCase* createdCase = group->createAndAppendStatisticsCase();
RimProject::current()->assignCaseIdToCase( createdCase );
caseGroups().push_back( group );
return group;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimEclipseCaseCollection::removeCaseFromAllGroups( RimEclipseCase* reservoir )
{
m_gridCollection->removeCase( reservoir->eclipseCaseData() );
for ( size_t i = 0; i < caseGroups.size(); i++ )
{
RimIdenticalGridCaseGroup* cg = caseGroups()[i];
cg->removeCase( reservoir );
}
cases().removeChild( reservoir );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimEclipseCaseCollection::appendMenuItems( caf::CmdFeatureMenuBuilder& menuBuilder ) const
{
menuBuilder << "RicImportGridModelFeature";
menuBuilder << "RicImportGridAndSummaryEnsembleFeature";
menuBuilder << "Separator";
menuBuilder.subMenuStart( "More", QIcon( ":/import.svg" ) );
menuBuilder << importMenuFeatureNames();
menuBuilder.subMenuEnd();
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RigMainGrid* RimEclipseCaseCollection::registerCaseInGridCollection( RimEclipseCase* rimEclipseCase )
{
CAF_ASSERT( rimEclipseCase && rimEclipseCase->eclipseCaseData() );
RigEclipseCaseData* rigEclipseCase = rimEclipseCase->eclipseCaseData();
// Grids are compared node by node, so all grids must use the same (deduplicated) node layout
rigEclipseCase->mainGrid()->removeDuplicateNodes();
RigMainGrid* equalGrid = m_gridCollection->findEqualGrid( rigEclipseCase->mainGrid() );
if ( equalGrid )
{
// Replace the grid with an already registered grid
rigEclipseCase->setMainGrid( equalGrid );
}
else
{
// This is the first insertion of this grid, compute cached data
rigEclipseCase->mainGrid()->computeCachedData();
rimEclipseCase->ensureFaultDataIsComputed();
equalGrid = rigEclipseCase->mainGrid();
}
m_gridCollection->addCase( rigEclipseCase );
return equalGrid;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimEclipseCaseCollection::insertCaseInCaseGroup( RimIdenticalGridCaseGroup* caseGroup, RimEclipseCase* rimReservoir )
{
CAF_ASSERT( rimReservoir );
registerCaseInGridCollection( rimReservoir );
caseGroup->addCase( rimReservoir );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimEclipseCaseCollection::recomputeStatisticsForAllCaseGroups()
{
const size_t numCaseGroups = caseGroups.size();
for ( size_t caseGrpIdx = 0; caseGrpIdx < numCaseGroups; ++caseGrpIdx )
{
RimIdenticalGridCaseGroup* caseGroup = caseGroups[caseGrpIdx];
RimCaseCollection* statisticsCaseCollection = caseGroup->statisticsCaseCollection();
const size_t numStatisticsCases = statisticsCaseCollection->reservoirs.size();
for ( size_t caseIdx = 0; caseIdx < numStatisticsCases; caseIdx++ )
{
RimEclipseStatisticsCase* statisticsCase = dynamic_cast<RimEclipseStatisticsCase*>( statisticsCaseCollection->reservoirs[caseIdx] );
if ( statisticsCase )
{
statisticsCase->clearComputedStatistics();
statisticsCase->computeStatistics();
}
}
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
QStringList RimEclipseCaseCollection::importMenuFeatureNames()
{
return { "RicImportEclipseCasesFeature",
"RicImportEclipseCaseTimeStepFilterFeature",
"Separator",
"RicCreateGridCaseGroupFromFilesFeature",
"RicCreateGridCaseEnsemblesFromFilesFeature",
"RicEclipseCaseNewGroupFeature" };
}