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
4 changed files with 117 additions and 31 deletions

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 );