From 1312f1d7b5ad162ec202ac1f33af5601b549e39f Mon Sep 17 00:00:00 2001 From: Kristian Bendiksen Date: Mon, 13 Sep 2021 10:34:03 +0200 Subject: [PATCH] 7962 ensemble fracture stats skip zero width (#7992) * #7962 Ensemble Fracture Statistics: Add option to exclude zero width fractures * #7962 Ensemble Fracture Statistics: fix data accessor used in statistics plot. * #7962 Ensemble Fracture Statistics: Update referring plots. * Ensemble Fracture Statistics: parameter name * Fixes by misspell-fixer (#7994) Co-authored-by: kriben Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: kriben --- .../RimEnsembleFractureStatistics.cpp | 46 +++++++++++ .../RimEnsembleFractureStatistics.h | 3 + ...igEnsembleFractureStatisticsCalculator.cpp | 79 +++++++++++++------ .../RigEnsembleFractureStatisticsCalculator.h | 20 +++-- 4 files changed, 117 insertions(+), 31 deletions(-) diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimEnsembleFractureStatistics.cpp b/ApplicationLibCode/ProjectDataModel/Completions/RimEnsembleFractureStatistics.cpp index 6c71d2c2df..25eba60bf3 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimEnsembleFractureStatistics.cpp +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimEnsembleFractureStatistics.cpp @@ -33,6 +33,7 @@ #include "RigStatisticsMath.h" #include "RigStimPlanFractureDefinition.h" +#include "RimEnsembleFractureStatisticsPlot.h" #include "RimFractureTemplateCollection.h" #include "RimHistogramCalculator.h" #include "RimProject.h" @@ -127,6 +128,14 @@ RimEnsembleFractureStatistics::RimEnsembleFractureStatistics() m_filePathsTable.uiCapability()->setUiReadOnly( true ); m_filePathsTable.xmlCapability()->disableIO(); + CAF_PDM_InitField( &m_excludeZeroWidthFractures, + "ExcludeZeroWidthFractures", + true, + "Exclude Zero Width Fractures", + "", + "", + "" ); + CAF_PDM_InitFieldNoDefault( &m_statisticsTable, "StatisticsTable", "Statistics Table", "", "", "" ); m_statisticsTable.uiCapability()->setUiEditorTypeName( caf::PdmUiTextEditor::uiEditorTypeName() ); m_statisticsTable.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::HIDDEN ); @@ -283,6 +292,19 @@ void RimEnsembleFractureStatistics::fieldChangedByUi( const caf::PdmFieldHandle* RimProject::current()->scheduleCreateDisplayModelAndRedrawAllViews(); } } + else if ( changedField == &m_excludeZeroWidthFractures ) + { + loadAndUpdateData(); + + // Update referring plots + std::vector referringObjects; + this->objectsWithReferringPtrFields( referringObjects ); + for ( caf::PdmObjectHandle* obj : referringObjects ) + { + auto plot = dynamic_cast( obj ); + if ( plot ) plot->loadDataAndUpdate(); + } + } } //-------------------------------------------------------------------------------------------------- @@ -292,6 +314,7 @@ void RimEnsembleFractureStatistics::defineUiOrdering( QString uiConfigName, caf: { caf::PdmUiOrdering* settingsGroup = uiOrdering.addNewGroup( "Settings" ); settingsGroup->add( nameField() ); + settingsGroup->add( &m_excludeZeroWidthFractures ); settingsGroup->add( &m_meshAlignmentType ); settingsGroup->add( &m_meshType ); settingsGroup->add( &m_numSamplesX ); @@ -332,6 +355,15 @@ void RimEnsembleFractureStatistics::loadAndUpdateData() std::vector> stimPlanFractureDefinitions = readFractureDefinitions( m_filePaths.v(), unitSystem ); + if ( m_excludeZeroWidthFractures() ) + { + size_t numBeforeFiltering = stimPlanFractureDefinitions.size(); + stimPlanFractureDefinitions = + RigEnsembleFractureStatisticsCalculator::removeZeroWidthDefinitions( stimPlanFractureDefinitions ); + size_t numRemoved = numBeforeFiltering - stimPlanFractureDefinitions.size(); + RiaLogging::info( QString( "Excluded %1 zero width fractures." ).arg( numRemoved ) ); + } + m_statisticsTable = generateStatisticsTable( stimPlanFractureDefinitions ); } @@ -345,6 +377,12 @@ std::vector RimEnsembleFractureStatistics::computeStatistics() std::vector> stimPlanFractureDefinitions = readFractureDefinitions( m_filePaths.v(), unitSystem ); + if ( m_excludeZeroWidthFractures() ) + { + stimPlanFractureDefinitions = + RigEnsembleFractureStatisticsCalculator::removeZeroWidthDefinitions( stimPlanFractureDefinitions ); + } + std::set> availableResults = findAllResultNames( stimPlanFractureDefinitions ); std::map, std::shared_ptr> statisticsGridsAll; @@ -489,6 +527,14 @@ std::vector> return results; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimEnsembleFractureStatistics::excludeZeroWidthFractures() const +{ + return m_excludeZeroWidthFractures; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimEnsembleFractureStatistics.h b/ApplicationLibCode/ProjectDataModel/Completions/RimEnsembleFractureStatistics.h index 4e534bea9b..e0115a48ce 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimEnsembleFractureStatistics.h +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimEnsembleFractureStatistics.h @@ -104,6 +104,8 @@ public: const QString& resultName, MeshAlignmentType meshAlignmentType ); + bool excludeZeroWidthFractures() const; + protected: void defineEditorAttribute( const caf::PdmFieldHandle* field, QString uiConfigName, @@ -195,6 +197,7 @@ protected: caf::PdmField> m_filePaths; caf::PdmField m_filePathsTable; caf::PdmField m_statisticsTable; + caf::PdmField m_excludeZeroWidthFractures; caf::PdmField m_computeStatistics; caf::PdmField m_numSamplesX; caf::PdmField m_numSamplesY; diff --git a/ApplicationLibCode/ReservoirDataModel/RigEnsembleFractureStatisticsCalculator.cpp b/ApplicationLibCode/ReservoirDataModel/RigEnsembleFractureStatisticsCalculator.cpp index a2747c16d0..a575ba36ee 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigEnsembleFractureStatisticsCalculator.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigEnsembleFractureStatisticsCalculator.cpp @@ -61,50 +61,55 @@ RigHistogramData RigEnsembleFractureStatisticsCalculator::createStatisticsData( PropertyType propertyType, int numBins ) { - std::vector> defs = esf->readFractureDefinitions(); + std::vector> fractureDefinitions = esf->readFractureDefinitions(); - return createStatisticsData( defs, propertyType, numBins ); + if ( esf->excludeZeroWidthFractures() ) + { + fractureDefinitions = RigEnsembleFractureStatisticsCalculator::removeZeroWidthDefinitions( fractureDefinitions ); + } + + return createStatisticsData( fractureDefinitions, propertyType, numBins ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RigHistogramData RigEnsembleFractureStatisticsCalculator::createStatisticsData( - const std::vector>& defs, + const std::vector>& fractureDefinitions, PropertyType propertyType, int numBins ) { std::vector samples; if ( propertyType == PropertyType::HEIGHT ) { - samples = calculateGridStatistics( defs, &RigEnsembleFractureStatisticsCalculator::calculateHeight ); + samples = calculateGridStatistics( fractureDefinitions, &RigEnsembleFractureStatisticsCalculator::calculateHeight ); } else if ( propertyType == PropertyType::AREA ) { - samples = calculateGridStatistics( defs, &RigEnsembleFractureStatisticsCalculator::calculateArea ); + samples = calculateGridStatistics( fractureDefinitions, &RigEnsembleFractureStatisticsCalculator::calculateArea ); } else if ( propertyType == PropertyType::WIDTH ) { - samples = - calculateAreaWeightedStatistics( defs, &RigEnsembleFractureStatisticsCalculator::calculateAreaWeightedWidth ); + samples = calculateAreaWeightedStatistics( fractureDefinitions, + &RigEnsembleFractureStatisticsCalculator::calculateAreaWeightedWidth ); } else if ( propertyType == PropertyType::PERMEABILITY ) { samples = - calculateAreaWeightedStatistics( defs, + calculateAreaWeightedStatistics( fractureDefinitions, &RigEnsembleFractureStatisticsCalculator::calculateAreaWeightedPermeability ); } else if ( propertyType == PropertyType::XF ) { - samples = calculateGridStatistics( defs, &RigEnsembleFractureStatisticsCalculator::calculateXf ); + samples = calculateGridStatistics( fractureDefinitions, &RigEnsembleFractureStatisticsCalculator::calculateXf ); } else if ( propertyType == PropertyType::KFWF ) { - samples = calculateGridStatistics( defs, &RigEnsembleFractureStatisticsCalculator::calculateKfWf ); + samples = calculateGridStatistics( fractureDefinitions, &RigEnsembleFractureStatisticsCalculator::calculateKfWf ); } else if ( propertyType == PropertyType::FORMATION_DIP ) { - samples = calculateFormationDip( defs ); + samples = calculateFormationDip( fractureDefinitions ); } RigHistogramData histogramData; @@ -138,17 +143,17 @@ RigHistogramData RigEnsembleFractureStatisticsCalculator::createStatisticsData( /// //-------------------------------------------------------------------------------------------------- std::vector RigEnsembleFractureStatisticsCalculator::calculateGridStatistics( - const std::vector>& defs, + const std::vector>& fractureDefinitions, double( func )( cvf::cref ) ) { std::vector samples; - if ( defs.empty() ) return samples; + if ( fractureDefinitions.empty() ) return samples; // TODO: heuristic to find conductivity name? - QString conductivityResultName = defs[0]->conductivityResultNames()[0]; + QString conductivityResultName = fractureDefinitions[0]->conductivityResultNames()[0]; std::vector> grids = - RimEnsembleFractureStatistics::createFractureGrids( defs, + RimEnsembleFractureStatistics::createFractureGrids( fractureDefinitions, RiaDefines::EclipseUnitSystem::UNITS_METRIC, conductivityResultName, RimEnsembleFractureStatistics::MeshAlignmentType::PERFORATION_DEPTH ); @@ -236,24 +241,25 @@ double RigEnsembleFractureStatisticsCalculator::calculateKfWf( cvf::cref RigEnsembleFractureStatisticsCalculator::calculateAreaWeightedStatistics( - const std::vector>& defs, + const std::vector>& fractureDefinitions, double( func )( cvf::cref, cvf::cref, RiaDefines::EclipseUnitSystem, const QString& ) ) { std::vector samples; - if ( defs.empty() ) return samples; + if ( fractureDefinitions.empty() ) return samples; // TODO: heuristic to find conductivity name? - QString conductivityResultName = defs[0]->conductivityResultNames()[0]; + QString conductivityResultName = fractureDefinitions[0]->conductivityResultNames()[0]; std::vector> grids = - RimEnsembleFractureStatistics::createFractureGrids( defs, + RimEnsembleFractureStatistics::createFractureGrids( fractureDefinitions, RiaDefines::EclipseUnitSystem::UNITS_METRIC, conductivityResultName, RimEnsembleFractureStatistics::MeshAlignmentType::PERFORATION_DEPTH ); - auto [widthResultName, widthResultUnit] = RimStimPlanFractureTemplate::widthParameterNameAndUnit( defs[0] ); + auto [widthResultName, widthResultUnit] = + RimStimPlanFractureTemplate::widthParameterNameAndUnit( fractureDefinitions[0] ); std::vector> widthGrids = - RimEnsembleFractureStatistics::createFractureGrids( defs, + RimEnsembleFractureStatistics::createFractureGrids( fractureDefinitions, RiaDefines::EclipseUnitSystem::UNITS_METRIC, widthResultName, RimEnsembleFractureStatistics::MeshAlignmentType::PERFORATION_DEPTH ); @@ -348,12 +354,12 @@ double RigEnsembleFractureStatisticsCalculator::calculateXf( cvf::cref RigEnsembleFractureStatisticsCalculator::calculateFormationDip( - const std::vector>& defs ) + const std::vector>& fractureDefinitions ) { std::vector formationDips; - for ( auto def : defs ) + for ( auto fractureDefinition : fractureDefinitions ) { - formationDips.push_back( def->formationDip() ); + formationDips.push_back( fractureDefinition->formationDip() ); } return formationDips; @@ -376,3 +382,28 @@ double RigEnsembleFractureStatisticsCalculator::convertUnit( double } return value; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector> RigEnsembleFractureStatisticsCalculator::removeZeroWidthDefinitions( + const std::vector>& fractureDefinitions ) +{ + std::vector samples = + calculateAreaWeightedStatistics( fractureDefinitions, + &RigEnsembleFractureStatisticsCalculator::calculateAreaWeightedWidth ); + + std::vector> filteredFractureDefinitions; + + int index = 0; + for ( double sample : samples ) + { + if ( sample > 0.0 ) + { + filteredFractureDefinitions.push_back( fractureDefinitions[index] ); + } + index++; + } + + return filteredFractureDefinitions; +} diff --git a/ApplicationLibCode/ReservoirDataModel/RigEnsembleFractureStatisticsCalculator.h b/ApplicationLibCode/ReservoirDataModel/RigEnsembleFractureStatisticsCalculator.h index 0fab640daf..3c1c234bc6 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigEnsembleFractureStatisticsCalculator.h +++ b/ApplicationLibCode/ReservoirDataModel/RigEnsembleFractureStatisticsCalculator.h @@ -52,22 +52,28 @@ public: static RigHistogramData createStatisticsData( const RimEnsembleFractureStatistics* esf, PropertyType propertyType, int numBins ); - static RigHistogramData createStatisticsData( const std::vector>& defs, - PropertyType propertyType, - int numBins ); + static RigHistogramData + createStatisticsData( const std::vector>& fractureDefinitions, + PropertyType propertyType, + int numBins ); + + static std::vector> + removeZeroWidthDefinitions( const std::vector>& fractureDefinitions ); private: - static std::vector calculateGridStatistics( const std::vector>& defs, - double( func )( cvf::cref ) ); + static std::vector + calculateGridStatistics( const std::vector>& fractureDefinitions, + double( func )( cvf::cref ) ); static std::vector - calculateAreaWeightedStatistics( const std::vector>& defs, + calculateAreaWeightedStatistics( const std::vector>& fractureDefinitions, double( func )( cvf::cref, cvf::cref, RiaDefines::EclipseUnitSystem, const QString& ) ); - static std::vector calculateFormationDip( const std::vector>& defs ); + static std::vector + calculateFormationDip( const std::vector>& fractureDefinitions ); static double calculateHeight( cvf::cref fractureGrid ); static double calculateArea( cvf::cref fractureGrid );