mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-11 16:06:04 -06:00
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:
parent
7b1185cec4
commit
1312f1d7b5
@ -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;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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 );
|
||||
|
Loading…
Reference in New Issue
Block a user