mirror of
https://github.com/OPM/ResInsight.git
synced 2026-10-24 22:27:55 -05:00
Fix crash when width data is missing in ensemble fracture statistics
Conductivity and width grids were built as separate lists; a missing width grid shortened one list and widthGrids[i] went out of range. Build the grids per definition so they stay paired. Crash stack (signature 642357244e71): [3] cvf::cref<RigFractureGrid>::cref(cvf::cref<RigFractureGrid> const&) at cvfObject.inl:410 [4] RigEnsembleFractureStatisticsCalculator::calculateProperty(...) at RigEnsembleFractureStatisticsCalculator.cpp:156 [5] RimStimPlanFractureTemplate::generatePropertiesTable() const at RimStimPlanFractureTemplate.cpp:791 [6] RimStimPlanFractureTemplate::loadDataAndUpdate() at RimStimPlanFractureTemplate.cpp:221 [7] RicMeshFractureTemplateHelper<RimStimPlanFractureTemplate>::createNewTemplatesFromFiles(...) at RicMeshFractureTemplateHelper.inl:149 [8] RicMeshFractureTemplateHelper<RimStimPlanFractureTemplate>::createNewTemplates(...) at RicMeshFractureTemplateHelper.inl:89 [9] RicNewStimPlanFractureTemplateFeature::createNewTemplates() at RicNewStimPlanFractureTemplateFeature.cpp:58 [10] RicNewStimPlanFractureTemplateFeature::onActionTriggered(bool) at RicNewStimPlanFractureTemplateFeature.cpp:78
This commit is contained in:
1 parent
c7473c2549
commit
72df8a69f5
2 files changed
+39
-16
No files matched your search
@@ -285,25 +285,27 @@ std::vector<double> RigEnsembleFractureStatisticsCalculator::calculateAreaWeight
|
||||
// TODO: heuristic to find conductivity name?
|
||||
QString conductivityResultName = fractureDefinitions[0]->conductivityResultNames()[0];
|
||||
|
||||
std::vector<cvf::cref<RigFractureGrid>> grids =
|
||||
RimEnsembleFractureStatistics::createFractureGrids( fractureDefinitions,
|
||||
RiaDefines::EclipseUnitSystem::UNITS_METRIC,
|
||||
conductivityResultName,
|
||||
RimEnsembleFractureStatistics::MeshAlignmentType::PERFORATION_DEPTH );
|
||||
|
||||
auto [widthResultName, widthResultUnit] = RimStimPlanFractureTemplate::widthParameterNameAndUnit( fractureDefinitions[0] );
|
||||
std::vector<cvf::cref<RigFractureGrid>> widthGrids =
|
||||
RimEnsembleFractureStatistics::createFractureGrids( fractureDefinitions,
|
||||
RiaDefines::EclipseUnitSystem::UNITS_METRIC,
|
||||
widthResultName,
|
||||
RimEnsembleFractureStatistics::MeshAlignmentType::PERFORATION_DEPTH );
|
||||
|
||||
CAF_ASSERT( grids.size() == widthGrids.size() );
|
||||
|
||||
for ( size_t i = 0; i < grids.size(); i++ )
|
||||
// Create the grids one definition at a time, as a definition can lack conductivity or width data. This keeps the two grids paired.
|
||||
for ( const auto& definition : fractureDefinitions )
|
||||
{
|
||||
double result = func( grids[i], widthGrids[i], RiaDefines::EclipseUnitSystem::UNITS_METRIC, widthResultUnit );
|
||||
samples.push_back( result );
|
||||
std::vector<cvf::ref<RigStimPlanFractureDefinition>> singleDefinition = { definition };
|
||||
|
||||
auto grids = RimEnsembleFractureStatistics::createFractureGrids( singleDefinition,
|
||||
RiaDefines::EclipseUnitSystem::UNITS_METRIC,
|
||||
conductivityResultName,
|
||||
RimEnsembleFractureStatistics::MeshAlignmentType::PERFORATION_DEPTH );
|
||||
|
||||
auto widthGrids =
|
||||
RimEnsembleFractureStatistics::createFractureGrids( singleDefinition,
|
||||
RiaDefines::EclipseUnitSystem::UNITS_METRIC,
|
||||
widthResultName,
|
||||
RimEnsembleFractureStatistics::MeshAlignmentType::PERFORATION_DEPTH );
|
||||
|
||||
if ( grids.empty() || widthGrids.empty() ) continue;
|
||||
|
||||
samples.push_back( func( grids.front(), widthGrids.front(), RiaDefines::EclipseUnitSystem::UNITS_METRIC, widthResultUnit ) );
|
||||
}
|
||||
|
||||
return samples;
|
||||
|
||||
@@ -51,3 +51,24 @@ TEST( RigEnsembleFractureStatisticsCalculatorTest, EmptyDefinitionsProduceInvali
|
||||
EXPECT_FALSE( histogramData.isHistogramVectorValid() );
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
/// A definition with conductivity data but no width data must not produce mismatched grid lists
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
TEST( RigEnsembleFractureStatisticsCalculatorTest, MissingWidthDataDoesNotCrash )
|
||||
{
|
||||
cvf::ref<RigStimPlanFractureDefinition> definition = new RigStimPlanFractureDefinition;
|
||||
definition->addTimeStep( 1.0 );
|
||||
definition->setDataAtTimeValue( "Conductivity", "md-m", { { 1.0, 1.0 }, { 1.0, 1.0 } }, 1.0 );
|
||||
|
||||
std::vector<cvf::ref<RigStimPlanFractureDefinition>> definitions = { definition };
|
||||
|
||||
auto width = RigEnsembleFractureStatisticsCalculator::calculateProperty( definitions,
|
||||
RigEnsembleFractureStatisticsCalculator::PropertyType::WIDTH );
|
||||
EXPECT_TRUE( width.empty() );
|
||||
|
||||
auto permeability =
|
||||
RigEnsembleFractureStatisticsCalculator::calculateProperty( definitions,
|
||||
RigEnsembleFractureStatisticsCalculator::PropertyType::PERMEABILITY );
|
||||
EXPECT_TRUE( permeability.empty() );
|
||||
}
|
||||
Reference in new issue
Block a user