Skip to content

Commit e86a8fa

Browse files
committed
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
1 parent 4770abd commit e86a8fa

2 files changed

Lines changed: 39 additions & 16 deletions

File tree

‎ApplicationLibCode/ReservoirDataModel/RigEnsembleFractureStatisticsCalculator.cpp‎

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -285,25 +285,27 @@ std::vector<double> RigEnsembleFractureStatisticsCalculator::calculateAreaWeight
285285
// TODO: heuristic to find conductivity name?
286286
QString conductivityResultName = fractureDefinitions[0]->conductivityResultNames()[0];
287287

288-
std::vector<cvf::cref<RigFractureGrid>> grids =
289-
RimEnsembleFractureStatistics::createFractureGrids( fractureDefinitions,
290-
RiaDefines::EclipseUnitSystem::UNITS_METRIC,
291-
conductivityResultName,
292-
RimEnsembleFractureStatistics::MeshAlignmentType::PERFORATION_DEPTH );
293-
294288
auto [widthResultName, widthResultUnit] = RimStimPlanFractureTemplate::widthParameterNameAndUnit( fractureDefinitions[0] );
295-
std::vector<cvf::cref<RigFractureGrid>> widthGrids =
296-
RimEnsembleFractureStatistics::createFractureGrids( fractureDefinitions,
297-
RiaDefines::EclipseUnitSystem::UNITS_METRIC,
298-
widthResultName,
299-
RimEnsembleFractureStatistics::MeshAlignmentType::PERFORATION_DEPTH );
300-
301-
CAF_ASSERT( grids.size() == widthGrids.size() );
302289

303-
for ( size_t i = 0; i < grids.size(); i++ )
290+
// Create the grids one definition at a time, as a definition can lack conductivity or width data. This keeps the two grids paired.
291+
for ( const auto& definition : fractureDefinitions )
304292
{
305-
double result = func( grids[i], widthGrids[i], RiaDefines::EclipseUnitSystem::UNITS_METRIC, widthResultUnit );
306-
samples.push_back( result );
293+
std::vector<cvf::ref<RigStimPlanFractureDefinition>> singleDefinition = { definition };
294+
295+
auto grids = RimEnsembleFractureStatistics::createFractureGrids( singleDefinition,
296+
RiaDefines::EclipseUnitSystem::UNITS_METRIC,
297+
conductivityResultName,
298+
RimEnsembleFractureStatistics::MeshAlignmentType::PERFORATION_DEPTH );
299+
300+
auto widthGrids =
301+
RimEnsembleFractureStatistics::createFractureGrids( singleDefinition,
302+
RiaDefines::EclipseUnitSystem::UNITS_METRIC,
303+
widthResultName,
304+
RimEnsembleFractureStatistics::MeshAlignmentType::PERFORATION_DEPTH );
305+
306+
if ( grids.empty() || widthGrids.empty() ) continue;
307+
308+
samples.push_back( func( grids.front(), widthGrids.front(), RiaDefines::EclipseUnitSystem::UNITS_METRIC, widthResultUnit ) );
307309
}
308310

309311
return samples;

‎ApplicationLibCode/UnitTests/RigEnsembleFractureStatisticsCalculator-Test.cpp‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,24 @@ TEST( RigEnsembleFractureStatisticsCalculatorTest, EmptyDefinitionsProduceInvali
5151
EXPECT_FALSE( histogramData.isHistogramVectorValid() );
5252
}
5353
}
54+
55+
//--------------------------------------------------------------------------------------------------
56+
/// A definition with conductivity data but no width data must not produce mismatched grid lists
57+
//--------------------------------------------------------------------------------------------------
58+
TEST( RigEnsembleFractureStatisticsCalculatorTest, MissingWidthDataDoesNotCrash )
59+
{
60+
cvf::ref<RigStimPlanFractureDefinition> definition = new RigStimPlanFractureDefinition;
61+
definition->addTimeStep( 1.0 );
62+
definition->setDataAtTimeValue( "Conductivity", "md-m", { { 1.0, 1.0 }, { 1.0, 1.0 } }, 1.0 );
63+
64+
std::vector<cvf::ref<RigStimPlanFractureDefinition>> definitions = { definition };
65+
66+
auto width = RigEnsembleFractureStatisticsCalculator::calculateProperty( definitions,
67+
RigEnsembleFractureStatisticsCalculator::PropertyType::WIDTH );
68+
EXPECT_TRUE( width.empty() );
69+
70+
auto permeability =
71+
RigEnsembleFractureStatisticsCalculator::calculateProperty( definitions,
72+
RigEnsembleFractureStatisticsCalculator::PropertyType::PERMEABILITY );
73+
EXPECT_TRUE( permeability.empty() );
74+
}

0 commit comments

Comments
 (0)