#14222 Well target mapping: Avoid clamp crash with invalid min/max bounds

std::clamp() invokes undefined behavior when the low bound is greater
than the high bound. In resetMinimumCellValuesToDefault(), the
minimum/maximum bounds for saturation, pressure, permeability and
transmissibility are derived from case data and can end up inverted
when no data is available, which crashed or produced garbage values.
This commit is contained in:
Magne Sjaastad
2026-08-31 12:20:48 +02:00
parent f8a55787fd
commit cda9551dbb
@@ -687,11 +687,22 @@ void RimWellTargetMapping::setDefaults()
//--------------------------------------------------------------------------------------------------
void RimWellTargetMapping::resetMinimumCellValuesToDefault()
{
m_saturationOil = std::clamp( m_defaultSaturationOil, m_minimumSaturationOil, m_maximumSaturationOil );
m_saturationGas = std::clamp( m_defaultSaturationGas, m_minimumSaturationGas, m_maximumSaturationGas );
m_pressure = std::clamp( m_defaultPressure, m_minimumPressure, m_maximumPressure );
m_permeability = std::clamp( m_defaultPermeability, m_minimumPermeability, m_maximumPermeability );
m_transmissibility = std::clamp( m_defaultTransmissibility, std::max( m_minimumTransmissibility, 0.1 ), m_maximumTransmissibility );
auto clampIfValid = []( double defaultValue, double minValue, double maxValue ) -> double
{
// Only clamp if we have valid bounds (min <= max)
if ( minValue <= maxValue )
{
return std::clamp( defaultValue, minValue, maxValue );
}
// If bounds are invalid (no data), just return the default value
return defaultValue;
};
m_saturationOil = clampIfValid( m_defaultSaturationOil, m_minimumSaturationOil, m_maximumSaturationOil );
m_saturationGas = clampIfValid( m_defaultSaturationGas, m_minimumSaturationGas, m_maximumSaturationGas );
m_pressure = clampIfValid( m_defaultPressure, m_minimumPressure, m_maximumPressure );
m_permeability = clampIfValid( m_defaultPermeability, m_minimumPermeability, m_maximumPermeability );
m_transmissibility = clampIfValid( m_defaultTransmissibility, std::max( m_minimumTransmissibility, 0.1 ), m_maximumTransmissibility );
}
//--------------------------------------------------------------------------------------------------