From 0c13f132fa6fd34df5815430afd623f2b59b9882 Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Fri, 15 May 2020 07:32:33 +0200 Subject: [PATCH] #5932 NNC data : Compute geometry when NNC data is asked for --- .../FileInterface/RifReaderEclipseOutput.cpp | 23 +++--- .../RivNNCGeometryGenerator.cpp | 2 +- .../RivNNCGeometryGenerator.h | 4 +- .../RivReservoirFaultsPartMgr.cpp | 3 + .../RimFaultInViewCollection.cpp | 78 ------------------- .../RimFaultInViewCollection.h | 2 - .../RigCaseCellResultsData.cpp | 7 -- .../ReservoirDataModel/RigMainGrid.cpp | 7 -- .../ReservoirDataModel/RigMainGrid.h | 3 +- .../ReservoirDataModel/RigNNCData.cpp | 78 ++++++++++++++++++- .../ReservoirDataModel/RigNNCData.h | 23 ++++-- .../RigReservoirBuilderMock.cpp | 2 +- 12 files changed, 112 insertions(+), 120 deletions(-) diff --git a/ApplicationCode/FileInterface/RifReaderEclipseOutput.cpp b/ApplicationCode/FileInterface/RifReaderEclipseOutput.cpp index c1e6e57145..2978d73883 100644 --- a/ApplicationCode/FileInterface/RifReaderEclipseOutput.cpp +++ b/ApplicationCode/FileInterface/RifReaderEclipseOutput.cpp @@ -447,23 +447,26 @@ bool RifReaderEclipseOutput::open( const QString& fileName, RigEclipseCaseData* if ( isNNCsEnabled() ) { caf::ProgressInfo nncProgress( 10, "" ); + RigMainGrid* mainGrid = eclipseCase->mainGrid(); { auto subNncTask = nncProgress.task( "Reading static NNC data" ); - transferStaticNNCData( mainEclGrid, m_ecl_init_file, eclipseCase->mainGrid() ); + transferStaticNNCData( mainEclGrid, m_ecl_init_file, mainGrid ); } // This test should probably be improved to test more directly for presence of NNC data if ( m_eclipseCase->results( RiaDefines::PorosityModelType::MATRIX_MODEL )->hasFlowDiagUsableFluxes() ) { auto subNncTask = nncProgress.task( "Reading dynamic NNC data" ); - transferDynamicNNCData( mainEclGrid, eclipseCase->mainGrid() ); + transferDynamicNNCData( mainEclGrid, mainGrid ); } - { - auto subNncTask = nncProgress.task( "Processing connections", 8 ); - eclipseCase->mainGrid()->nncData()->processNativeConnections( *( eclipseCase->mainGrid() ) ); - } + RigActiveCellInfo* activeCellInfo = + m_eclipseCase->activeCellInfo( RiaDefines::PorosityModelType::MATRIX_MODEL ); + + bool includeInactiveCells = RiaPreferences::current()->readerSettings()->includeInactiveCellsInFaultGeometry; + + mainGrid->nncData()->setSourceDataForProcessing( mainGrid, activeCellInfo, includeInactiveCells ); } } @@ -742,11 +745,9 @@ void RifReaderEclipseOutput::transferStaticNNCData( const ecl_grid_type* mainEcl transmissibilityValuesTemp.push_back( transValues[nIdx] ); } - mainGrid->nncData()->setConnections( nncConnections ); - - std::vector& transmissibilityValues = - mainGrid->nncData()->makeStaticConnectionScalarResult( RiaDefines::propertyNameCombTrans() ); - transmissibilityValues = transmissibilityValuesTemp; + mainGrid->nncData()->setNativeConnections( nncConnections ); + mainGrid->nncData()->makeScalarResultAndSetValues( RiaDefines::propertyNameCombTrans(), + transmissibilityValuesTemp ); } ecl_nnc_data_free( tran_data ); diff --git a/ApplicationCode/ModelVisualization/RivNNCGeometryGenerator.cpp b/ApplicationCode/ModelVisualization/RivNNCGeometryGenerator.cpp index 8698450521..c2f8f7d85d 100644 --- a/ApplicationCode/ModelVisualization/RivNNCGeometryGenerator.cpp +++ b/ApplicationCode/ModelVisualization/RivNNCGeometryGenerator.cpp @@ -32,7 +32,7 @@ /// //-------------------------------------------------------------------------------------------------- RivNNCGeometryGenerator::RivNNCGeometryGenerator( bool includeAllan, - const RigNNCData* nncData, + RigNNCData* nncData, const cvf::Vec3d& offset, const cvf::Array* nncIndexes ) : m_includeAllanDiagramGeometry( includeAllan ) diff --git a/ApplicationCode/ModelVisualization/RivNNCGeometryGenerator.h b/ApplicationCode/ModelVisualization/RivNNCGeometryGenerator.h index 548911d61a..1919a9ffea 100644 --- a/ApplicationCode/ModelVisualization/RivNNCGeometryGenerator.h +++ b/ApplicationCode/ModelVisualization/RivNNCGeometryGenerator.h @@ -43,7 +43,7 @@ class RivNNCGeometryGenerator : public cvf::Object { public: RivNNCGeometryGenerator( bool includeAllan, - const RigNNCData* nncData, + RigNNCData* nncData, const cvf::Vec3d& offset, const cvf::Array* nncIndexes ); @@ -70,7 +70,7 @@ private: bool m_includeAllanDiagramGeometry; // Input - cvf::cref m_nncData; + cvf::ref m_nncData; cvf::cref> m_nncIndexes; cvf::cref m_cellVisibility; cvf::cref m_grid; diff --git a/ApplicationCode/ModelVisualization/RivReservoirFaultsPartMgr.cpp b/ApplicationCode/ModelVisualization/RivReservoirFaultsPartMgr.cpp index 84e49f478a..65bfa3e986 100644 --- a/ApplicationCode/ModelVisualization/RivReservoirFaultsPartMgr.cpp +++ b/ApplicationCode/ModelVisualization/RivReservoirFaultsPartMgr.cpp @@ -201,6 +201,9 @@ void RivReservoirFaultsPartMgr::appendPartsToModel( cvf::ModelBasicList* model ) if ( showNncs ) { + RigMainGrid* mainGrid = m_reservoirView->mainGrid(); + mainGrid->nncData()->ensureConnectionDataIsProcecced(); + if ( showCompleteNncGeo ) { rivFaultPart->appendCompleteNNCFacesToModel( &parts ); diff --git a/ApplicationCode/ProjectDataModel/RimFaultInViewCollection.cpp b/ApplicationCode/ProjectDataModel/RimFaultInViewCollection.cpp index 50a3026b2f..fc761145d3 100644 --- a/ApplicationCode/ProjectDataModel/RimFaultInViewCollection.cpp +++ b/ApplicationCode/ProjectDataModel/RimFaultInViewCollection.cpp @@ -89,15 +89,6 @@ RimFaultInViewCollection::RimFaultInViewCollection() "", "" ); - CAF_PDM_InitFieldNoDefault( &noCommonAreaNnncCollection, - "NoCommonAreaNnncCollection", - "NNCs With No Common Area", - "", - "", - "" ); - noCommonAreaNnncCollection = new RimNoCommonAreaNncCollection; - noCommonAreaNnncCollection.uiCapability()->setUiHidden( true ); - CAF_PDM_InitFieldNoDefault( &faults, "Faults", "Faults", "", "", "" ); faults.uiCapability()->setUiHidden( true ); } @@ -108,8 +99,6 @@ RimFaultInViewCollection::RimFaultInViewCollection() RimFaultInViewCollection::~RimFaultInViewCollection() { faults.deleteAllChildObjects(); - - delete noCommonAreaNnncCollection(); } //-------------------------------------------------------------------------------------------------- @@ -262,73 +251,6 @@ void RimFaultInViewCollection::syncronizeFaults() QString toolTip = QString( "Fault count (%1)" ).arg( newFaults.size() ); setUiToolTip( toolTip ); - - // NNCs - this->noCommonAreaNnncCollection()->noCommonAreaNncs().deleteAllChildObjects(); - - RigMainGrid* mainGrid = parentView()->mainGrid(); - const RigConnectionContainer& nncConnections = mainGrid->nncData()->connections(); - for ( size_t connIndex = 0; connIndex < nncConnections.size(); connIndex++ ) - { - if ( !nncConnections[connIndex].hasCommonArea() ) - { - RimNoCommonAreaNNC* noCommonAreaNnc = new RimNoCommonAreaNNC(); - - QString firstConnectionText; - QString secondConnectionText; - - { - size_t gridLocalCellIndex; - const RigGridBase* hostGrid = - mainGrid->gridAndGridLocalIdxFromGlobalCellIdx( nncConnections[connIndex].c1GlobIdx(), - &gridLocalCellIndex ); - - size_t i, j, k; - if ( hostGrid->ijkFromCellIndex( gridLocalCellIndex, &i, &j, &k ) ) - { - // Adjust to 1-based Eclipse indexing - i++; - j++; - k++; - - if ( !hostGrid->isMainGrid() ) - { - QString gridName = QString::fromStdString( hostGrid->gridName() ); - firstConnectionText = gridName + " "; - } - firstConnectionText += QString( "[%1 %2 %3] - " ).arg( i ).arg( j ).arg( k ); - } - } - - { - size_t gridLocalCellIndex; - const RigGridBase* hostGrid = - mainGrid->gridAndGridLocalIdxFromGlobalCellIdx( nncConnections[connIndex].c2GlobIdx(), - &gridLocalCellIndex ); - - size_t i, j, k; - if ( hostGrid->ijkFromCellIndex( gridLocalCellIndex, &i, &j, &k ) ) - { - // Adjust to 1-based Eclipse indexing - i++; - j++; - k++; - - if ( !hostGrid->isMainGrid() ) - { - QString gridName = QString::fromStdString( hostGrid->gridName() ); - secondConnectionText = gridName + " "; - } - secondConnectionText += QString( "[%1 %2 %3]" ).arg( i ).arg( j ).arg( k ); - } - } - - noCommonAreaNnc->name = firstConnectionText + secondConnectionText; - this->noCommonAreaNnncCollection()->noCommonAreaNncs().push_back( noCommonAreaNnc ); - } - - this->noCommonAreaNnncCollection()->updateName(); - } } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ProjectDataModel/RimFaultInViewCollection.h b/ApplicationCode/ProjectDataModel/RimFaultInViewCollection.h index 766a349c90..5da5a6840e 100644 --- a/ApplicationCode/ProjectDataModel/RimFaultInViewCollection.h +++ b/ApplicationCode/ProjectDataModel/RimFaultInViewCollection.h @@ -77,8 +77,6 @@ public: caf::PdmChildArrayField faults; RimFaultInView* findFaultByName( QString name ); - caf::PdmChildField noCommonAreaNnncCollection; - void uiOrderingFaults( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ); private: diff --git a/ApplicationCode/ReservoirDataModel/RigCaseCellResultsData.cpp b/ApplicationCode/ReservoirDataModel/RigCaseCellResultsData.cpp index adec138a5c..c43063a212 100644 --- a/ApplicationCode/ReservoirDataModel/RigCaseCellResultsData.cpp +++ b/ApplicationCode/ReservoirDataModel/RigCaseCellResultsData.cpp @@ -3105,13 +3105,6 @@ void RigCaseCellResultsData::computeAllanResults( RigCaseCellResultsData* cellRe if ( cellResultsData && cellResultsData->activeFormationNames() && !cellResultsData->activeFormationNames()->formationNames().empty() ) { - // If import of NNC is disabled in preferences, we must make ensure that computed NNC connections are in place - if ( mainGrid->nncData()->nativeConnectionCount() == mainGrid->nncData()->connections().size() ) - { - mainGrid->nncData()->computeCompleteSetOfNncs( mainGrid, cellResultsData->activeCellInfo(), includeInactiveCells ); - mainGrid->distributeNNCsToFaults(); - } - auto fnNamesResAddr = RigEclipseResultAddress( RiaDefines::ResultCatType::FORMATION_NAMES, RiaDefines::activeFormationNamesResultName() ); auto fnAllanResultResAddr = diff --git a/ApplicationCode/ReservoirDataModel/RigMainGrid.cpp b/ApplicationCode/ReservoirDataModel/RigMainGrid.cpp index 999dda9034..e9ec36e294 100644 --- a/ApplicationCode/ReservoirDataModel/RigMainGrid.cpp +++ b/ApplicationCode/ReservoirDataModel/RigMainGrid.cpp @@ -555,13 +555,6 @@ void RigMainGrid::calculateFaults( const RigActiveCellInfo* activeCellInfo, bool } } } - - if ( computeNncs ) - { - this->nncData()->computeCompleteSetOfNncs( this, activeCellInfo, includeInactiveCells ); - } - - distributeNNCsToFaults(); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ReservoirDataModel/RigMainGrid.h b/ApplicationCode/ReservoirDataModel/RigMainGrid.h index 89c07d25b6..ab5e6caf13 100644 --- a/ApplicationCode/ReservoirDataModel/RigMainGrid.h +++ b/ApplicationCode/ReservoirDataModel/RigMainGrid.h @@ -66,7 +66,8 @@ public: size_t totalTemporaryGridCellCount() const; - RigNNCData* nncData(); + RigNNCData* nncData(); + void setFaults( const cvf::Collection& faults ); const cvf::Collection& faults() const; cvf::Collection& faults(); diff --git a/ApplicationCode/ReservoirDataModel/RigNNCData.cpp b/ApplicationCode/ReservoirDataModel/RigNNCData.cpp index 85b6db83fc..11b0970d71 100644 --- a/ApplicationCode/ReservoirDataModel/RigNNCData.cpp +++ b/ApplicationCode/ReservoirDataModel/RigNNCData.cpp @@ -23,15 +23,39 @@ #include "RigEclipseResultAddress.h" #include "RigMainGrid.h" +#include "RiaLogging.h" + +#include "cafProgressInfo.h" + #include "cvfGeometryTools.h" +#include + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RigNNCData::RigNNCData() + : m_connectionsAreProcessed( false ) + , m_mainGrid( nullptr ) + , m_activeCellInfo( nullptr ) + , m_computeNncForInactiveCells( false ) { } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigNNCData::setSourceDataForProcessing( RigMainGrid* mainGrid, + const RigActiveCellInfo* activeCellInfo, + bool includeInactiveCells ) +{ + m_mainGrid = mainGrid; + m_activeCellInfo = activeCellInfo; + m_computeNncForInactiveCells = includeInactiveCells; + + m_connectionsAreProcessed = false; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -67,7 +91,6 @@ void RigNNCData::computeCompleteSetOfNncs( const RigMainGrid* mainGrid, const RigActiveCellInfo* activeCellInfo, bool includeInactiveCells ) { - m_nativeConnectionCount = m_connections.size(); RigConnectionContainer otherConnections = RigCellFaceGeometryTools::computeOtherNncs( mainGrid, m_connections, activeCellInfo, includeInactiveCells ); @@ -91,9 +114,42 @@ void RigNNCData::computeCompleteSetOfNncs( const RigMainGrid* mainGrid, //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RigNNCData::setConnections( RigConnectionContainer& connections ) +void RigNNCData::ensureConnectionDataIsProcecced() { - m_connections = connections; + if ( m_connectionsAreProcessed ) return; + + if ( m_mainGrid ) + { + caf::ProgressInfo progressInfo( 3, "Computing NNC Data" ); + + RiaLogging::info( "NNC geometry computation - starting process" ); + + processNativeConnections( *m_mainGrid ); + progressInfo.incrementProgress(); + + computeCompleteSetOfNncs( m_mainGrid, m_activeCellInfo, m_computeNncForInactiveCells ); + progressInfo.incrementProgress(); + + m_connectionsAreProcessed = true; + + m_mainGrid->distributeNNCsToFaults(); + + RiaLogging::info( "NNC geometry computation - completed process" ); + + RiaLogging::info( QString( "Native NNC count : %1" ).arg( nativeConnectionCount() ) ); + RiaLogging::info( QString( "Computed NNC count : %2" ).arg( m_connections.size() ) ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigNNCData::setNativeConnections( RigConnectionContainer& connections ) +{ + m_connections = connections; + m_nativeConnectionCount = m_connections.size(); + + m_connectionsAreProcessed = false; } //-------------------------------------------------------------------------------------------------- @@ -107,8 +163,10 @@ size_t RigNNCData::nativeConnectionCount() const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -const RigConnectionContainer& RigNNCData::connections() const +RigConnectionContainer& RigNNCData::connections() { + ensureConnectionDataIsProcecced(); + return m_connections; } @@ -117,12 +175,24 @@ const RigConnectionContainer& RigNNCData::connections() const //-------------------------------------------------------------------------------------------------- std::vector& RigNNCData::makeStaticConnectionScalarResult( QString nncDataType ) { + ensureConnectionDataIsProcecced(); + std::vector>& results = m_connectionResults[nncDataType]; results.resize( 1 ); results[0].resize( m_connections.size(), HUGE_VAL ); return results[0]; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigNNCData::makeScalarResultAndSetValues( const QString& nncDataType, const std::vector& values ) +{ + std::vector>& results = m_connectionResults[nncDataType]; + results.resize( 1 ); + results[0] = values; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationCode/ReservoirDataModel/RigNNCData.h b/ApplicationCode/ReservoirDataModel/RigNNCData.h index e1902435f6..05440ffde7 100644 --- a/ApplicationCode/ReservoirDataModel/RigNNCData.h +++ b/ApplicationCode/ReservoirDataModel/RigNNCData.h @@ -49,19 +49,20 @@ public: RigNNCData(); - void processNativeConnections( const RigMainGrid& mainGrid ); - void computeCompleteSetOfNncs( const RigMainGrid* mainGrid, - const RigActiveCellInfo* activeCellInfo, - bool includeInactiveCells ); + void ensureConnectionDataIsProcecced(); + void setSourceDataForProcessing( RigMainGrid* mainGrid, + const RigActiveCellInfo* activeCellInfo, + bool includeInactiveCells ); - void setConnections( RigConnectionContainer& connections ); + void setNativeConnections( RigConnectionContainer& connections ); size_t nativeConnectionCount() const; - const RigConnectionContainer& connections() const; + RigConnectionContainer& connections(); std::vector& makeStaticConnectionScalarResult( QString nncDataType ); const std::vector* staticConnectionScalarResult( const RigEclipseResultAddress& resVarAddr ) const; const std::vector* staticConnectionScalarResultByName( const QString& nncDataType ) const; + void makeScalarResultAndSetValues( const QString& nncDataType, const std::vector& values ); std::vector>& makeDynamicConnectionScalarResult( QString nncDataType, size_t timeStepCount ); const std::vector>* dynamicConnectionScalarResult( const RigEclipseResultAddress& resVarAddr ) const; @@ -91,9 +92,19 @@ private: const QString getNNCDataTypeFromScalarResultIndex( const RigEclipseResultAddress& resVarAddr ) const; bool isNative( QString nncDataType ) const; + void processNativeConnections( const RigMainGrid& mainGrid ); + void computeCompleteSetOfNncs( const RigMainGrid* mainGrid, + const RigActiveCellInfo* activeCellInfo, + bool includeInactiveCells ); + private: RigConnectionContainer m_connections; size_t m_nativeConnectionCount; std::map>> m_connectionResults; std::map m_resultAddrToNNCDataType; + + bool m_connectionsAreProcessed; + RigMainGrid* m_mainGrid; + const RigActiveCellInfo* m_activeCellInfo; + bool m_computeNncForInactiveCells; }; diff --git a/ApplicationCode/ReservoirDataModel/RigReservoirBuilderMock.cpp b/ApplicationCode/ReservoirDataModel/RigReservoirBuilderMock.cpp index d806f1176a..09627e330a 100644 --- a/ApplicationCode/ReservoirDataModel/RigReservoirBuilderMock.cpp +++ b/ApplicationCode/ReservoirDataModel/RigReservoirBuilderMock.cpp @@ -558,7 +558,7 @@ void RigReservoirBuilderMock::addFaults( RigEclipseCaseData* eclipseCase ) addNnc( grid, i1, j1, k1, i2, j2, k2, nncConnections ); } - grid->nncData()->setConnections( nncConnections ); + grid->nncData()->setNativeConnections( nncConnections ); std::vector& tranVals = grid->nncData()->makeStaticConnectionScalarResult( RiaDefines::propertyNameCombTrans() );