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 <kriben@users.noreply.github.com>

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: kriben <kriben@users.noreply.github.com>
This commit is contained in:
Kristian Bendiksen 2021-09-13 10:34:03 +02:00 committed by GitHub
parent 7b1185cec4
commit 1312f1d7b5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 117 additions and 31 deletions

View File

@ -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<caf::PdmObjectHandle*> referringObjects;
this->objectsWithReferringPtrFields( referringObjects );
for ( caf::PdmObjectHandle* obj : referringObjects )
{
auto plot = dynamic_cast<RimEnsembleFractureStatisticsPlot*>( 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<cvf::ref<RigStimPlanFractureDefinition>> 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<QString> RimEnsembleFractureStatistics::computeStatistics()
std::vector<cvf::ref<RigStimPlanFractureDefinition>> stimPlanFractureDefinitions =
readFractureDefinitions( m_filePaths.v(), unitSystem );
if ( m_excludeZeroWidthFractures() )
{
stimPlanFractureDefinitions =
RigEnsembleFractureStatisticsCalculator::removeZeroWidthDefinitions( stimPlanFractureDefinitions );
}
std::set<std::pair<QString, QString>> availableResults = findAllResultNames( stimPlanFractureDefinitions );
std::map<std::pair<RimEnsembleFractureStatistics::StatisticsType, QString>, std::shared_ptr<RigSlice2D>> statisticsGridsAll;
@ -489,6 +527,14 @@ std::vector<cvf::ref<RigStimPlanFractureDefinition>>
return results;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
bool RimEnsembleFractureStatistics::excludeZeroWidthFractures() const
{
return m_excludeZeroWidthFractures;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------

View File

@ -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<std::vector<caf::FilePath>> m_filePaths;
caf::PdmField<QString> m_filePathsTable;
caf::PdmField<QString> m_statisticsTable;
caf::PdmField<bool> m_excludeZeroWidthFractures;
caf::PdmField<bool> m_computeStatistics;
caf::PdmField<int> m_numSamplesX;
caf::PdmField<int> m_numSamplesY;

View File

@ -61,50 +61,55 @@ RigHistogramData RigEnsembleFractureStatisticsCalculator::createStatisticsData(
PropertyType propertyType,
int numBins )
{
std::vector<cvf::ref<RigStimPlanFractureDefinition>> defs = esf->readFractureDefinitions();
std::vector<cvf::ref<RigStimPlanFractureDefinition>> 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<cvf::ref<RigStimPlanFractureDefinition>>& defs,
const std::vector<cvf::ref<RigStimPlanFractureDefinition>>& fractureDefinitions,
PropertyType propertyType,
int numBins )
{
std::vector<double> 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<double> RigEnsembleFractureStatisticsCalculator::calculateGridStatistics(
const std::vector<cvf::ref<RigStimPlanFractureDefinition>>& defs,
const std::vector<cvf::ref<RigStimPlanFractureDefinition>>& fractureDefinitions,
double( func )( cvf::cref<RigFractureGrid> ) )
{
std::vector<double> 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<cvf::cref<RigFractureGrid>> 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<RigFrac
///
//--------------------------------------------------------------------------------------------------
std::vector<double> RigEnsembleFractureStatisticsCalculator::calculateAreaWeightedStatistics(
const std::vector<cvf::ref<RigStimPlanFractureDefinition>>& defs,
const std::vector<cvf::ref<RigStimPlanFractureDefinition>>& fractureDefinitions,
double( func )( cvf::cref<RigFractureGrid>, cvf::cref<RigFractureGrid>, RiaDefines::EclipseUnitSystem, const QString& ) )
{
std::vector<double> 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<cvf::cref<RigFractureGrid>> 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<cvf::cref<RigFractureGrid>> 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<RigFractu
///
//--------------------------------------------------------------------------------------------------
std::vector<double> RigEnsembleFractureStatisticsCalculator::calculateFormationDip(
const std::vector<cvf::ref<RigStimPlanFractureDefinition>>& defs )
const std::vector<cvf::ref<RigStimPlanFractureDefinition>>& fractureDefinitions )
{
std::vector<double> 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<cvf::ref<RigStimPlanFractureDefinition>> RigEnsembleFractureStatisticsCalculator::removeZeroWidthDefinitions(
const std::vector<cvf::ref<RigStimPlanFractureDefinition>>& fractureDefinitions )
{
std::vector<double> samples =
calculateAreaWeightedStatistics( fractureDefinitions,
&RigEnsembleFractureStatisticsCalculator::calculateAreaWeightedWidth );
std::vector<cvf::ref<RigStimPlanFractureDefinition>> filteredFractureDefinitions;
int index = 0;
for ( double sample : samples )
{
if ( sample > 0.0 )
{
filteredFractureDefinitions.push_back( fractureDefinitions[index] );
}
index++;
}
return filteredFractureDefinitions;
}

View File

@ -52,22 +52,28 @@ public:
static RigHistogramData
createStatisticsData( const RimEnsembleFractureStatistics* esf, PropertyType propertyType, int numBins );
static RigHistogramData createStatisticsData( const std::vector<cvf::ref<RigStimPlanFractureDefinition>>& defs,
PropertyType propertyType,
int numBins );
static RigHistogramData
createStatisticsData( const std::vector<cvf::ref<RigStimPlanFractureDefinition>>& fractureDefinitions,
PropertyType propertyType,
int numBins );
static std::vector<cvf::ref<RigStimPlanFractureDefinition>>
removeZeroWidthDefinitions( const std::vector<cvf::ref<RigStimPlanFractureDefinition>>& fractureDefinitions );
private:
static std::vector<double> calculateGridStatistics( const std::vector<cvf::ref<RigStimPlanFractureDefinition>>& defs,
double( func )( cvf::cref<RigFractureGrid> ) );
static std::vector<double>
calculateGridStatistics( const std::vector<cvf::ref<RigStimPlanFractureDefinition>>& fractureDefinitions,
double( func )( cvf::cref<RigFractureGrid> ) );
static std::vector<double>
calculateAreaWeightedStatistics( const std::vector<cvf::ref<RigStimPlanFractureDefinition>>& defs,
calculateAreaWeightedStatistics( const std::vector<cvf::ref<RigStimPlanFractureDefinition>>& fractureDefinitions,
double( func )( cvf::cref<RigFractureGrid>,
cvf::cref<RigFractureGrid>,
RiaDefines::EclipseUnitSystem,
const QString& ) );
static std::vector<double> calculateFormationDip( const std::vector<cvf::ref<RigStimPlanFractureDefinition>>& defs );
static std::vector<double>
calculateFormationDip( const std::vector<cvf::ref<RigStimPlanFractureDefinition>>& fractureDefinitions );
static double calculateHeight( cvf::cref<RigFractureGrid> fractureGrid );
static double calculateArea( cvf::cref<RigFractureGrid> fractureGrid );