mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
Adjust value ranges using floor and ceil
* Use regression curve icon in grid cross plot * #10481 Use ceil and floor when adjusting precision for ranges
This commit is contained in:
parent
20d762fa33
commit
d36bf92b55
@ -70,7 +70,23 @@ double RiaNumericalTools::computeTenExponentFloor( double value )
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
double RiaNumericalTools::roundToNumSignificantDigits( double value, double numSignificantDigits )
|
||||
double RiaNumericalTools::roundToNumSignificantDigitsFloor( double value, double numSignificantDigits )
|
||||
{
|
||||
return roundToNumSignificantDigits( value, numSignificantDigits, RoundToSignificantDigitsMode::FLOOR );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
double RiaNumericalTools::roundToNumSignificantDigitsCeil( double value, double numSignificantDigits )
|
||||
{
|
||||
return roundToNumSignificantDigits( value, numSignificantDigits, RoundToSignificantDigitsMode::CEIL );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
///
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
double RiaNumericalTools::roundToNumSignificantDigits( double value, double numSignificantDigits, RoundToSignificantDigitsMode mode )
|
||||
{
|
||||
double absoluteValue = cvf::Math::abs( value );
|
||||
if ( absoluteValue == 0.0 )
|
||||
@ -83,11 +99,20 @@ double RiaNumericalTools::roundToNumSignificantDigits( double value, double numS
|
||||
|
||||
double factor = pow( 10.0, numSignificantDigits - logDecValue );
|
||||
|
||||
double tmp = value * factor;
|
||||
double integerPart;
|
||||
double fraction = modf( tmp, &integerPart );
|
||||
double tmp = value * factor;
|
||||
double integerPart = 0.0;
|
||||
modf( tmp, &integerPart );
|
||||
|
||||
if ( cvf::Math::abs( fraction ) >= 0.5 ) ( integerPart >= 0 ) ? integerPart++ : integerPart--;
|
||||
double candidateValue = integerPart / factor;
|
||||
|
||||
if ( mode == RoundToSignificantDigitsMode::CEIL && candidateValue < value )
|
||||
{
|
||||
integerPart++;
|
||||
}
|
||||
else if ( mode == RoundToSignificantDigitsMode::FLOOR && value < candidateValue )
|
||||
{
|
||||
integerPart--;
|
||||
}
|
||||
|
||||
double roundedValue = integerPart / factor;
|
||||
|
||||
|
@ -25,6 +25,14 @@ double roundToClosestPowerOfTenFloor( double value );
|
||||
double computeTenExponentCeil( double value );
|
||||
double computeTenExponentFloor( double value );
|
||||
|
||||
double roundToNumSignificantDigits( double value, double numSignificantDigits );
|
||||
double roundToNumSignificantDigitsFloor( double value, double numSignificantDigits );
|
||||
double roundToNumSignificantDigitsCeil( double value, double numSignificantDigits );
|
||||
|
||||
enum class RoundToSignificantDigitsMode
|
||||
{
|
||||
CEIL,
|
||||
FLOOR
|
||||
};
|
||||
double roundToNumSignificantDigits( double value, double numSignificantDigits, RoundToSignificantDigitsMode mode );
|
||||
|
||||
}; // namespace RiaNumericalTools
|
||||
|
@ -127,7 +127,7 @@ RimGridCrossPlotDataSet::RimGridCrossPlotDataSet()
|
||||
CAF_PDM_InitFieldNoDefault( &m_crossPlotCurves, "CrossPlotCurves", "Curves" );
|
||||
m_crossPlotCurves.uiCapability()->setUiTreeHidden( true );
|
||||
|
||||
CAF_PDM_InitFieldNoDefault( &m_crossPlotRegressionCurves, "CrossPlotRegressionCurves", "Regression Curves" );
|
||||
CAF_PDM_InitFieldNoDefault( &m_crossPlotRegressionCurves, "CrossPlotRegressionCurves", "Regression Curves", ":/regression-curve.svg" );
|
||||
|
||||
CAF_PDM_InitField( &m_useCustomColor, "UseCustomColor", false, "Use Custom Color" );
|
||||
CAF_PDM_InitField( &m_customColor, "CustomColor", cvf::Color3f( cvf::Color3f::BLACK ), "Custom Color" );
|
||||
|
@ -376,8 +376,8 @@ void RimGridCrossPlotRegressionCurve::defineEditorAttribute( const caf::PdmField
|
||||
if ( auto* myAttr = dynamic_cast<caf::PdmUiDoubleSliderEditorAttribute*>( attribute ) )
|
||||
{
|
||||
auto [min, max] = m_dataRangeX;
|
||||
myAttr->m_minimum = RiaNumericalTools::roundToNumSignificantDigits( min, 2 );
|
||||
myAttr->m_maximum = RiaNumericalTools::roundToNumSignificantDigits( max, 2 );
|
||||
myAttr->m_minimum = RiaNumericalTools::roundToNumSignificantDigitsFloor( min, 2 );
|
||||
myAttr->m_maximum = RiaNumericalTools::roundToNumSignificantDigitsCeil( max, 2 );
|
||||
myAttr->m_decimals = 3;
|
||||
}
|
||||
}
|
||||
@ -386,8 +386,8 @@ void RimGridCrossPlotRegressionCurve::defineEditorAttribute( const caf::PdmField
|
||||
if ( auto* myAttr = dynamic_cast<caf::PdmUiDoubleSliderEditorAttribute*>( attribute ) )
|
||||
{
|
||||
auto [min, max] = m_dataRangeY;
|
||||
myAttr->m_minimum = RiaNumericalTools::roundToNumSignificantDigits( min, 2 );
|
||||
myAttr->m_maximum = RiaNumericalTools::roundToNumSignificantDigits( max, 2 );
|
||||
myAttr->m_minimum = RiaNumericalTools::roundToNumSignificantDigitsFloor( min, 2 );
|
||||
myAttr->m_maximum = RiaNumericalTools::roundToNumSignificantDigitsCeil( max, 2 );
|
||||
myAttr->m_decimals = 3;
|
||||
}
|
||||
}
|
||||
|
@ -258,11 +258,11 @@ void RimRegularLegendConfig::fieldChangedByUi( const caf::PdmFieldHandle* change
|
||||
{
|
||||
if ( m_userDefinedMaxValue == m_userDefinedMaxValue.defaultValue() && m_globalAutoMax != cvf::UNDEFINED_DOUBLE )
|
||||
{
|
||||
m_userDefinedMaxValue = RiaNumericalTools::roundToNumSignificantDigits( m_globalAutoMax, m_precision );
|
||||
m_userDefinedMaxValue = RiaNumericalTools::roundToNumSignificantDigitsCeil( m_globalAutoMax, m_precision );
|
||||
}
|
||||
if ( m_userDefinedMinValue == m_userDefinedMinValue.defaultValue() && m_globalAutoMin != cvf::UNDEFINED_DOUBLE )
|
||||
{
|
||||
m_userDefinedMinValue = RiaNumericalTools::roundToNumSignificantDigits( m_globalAutoMin, m_precision );
|
||||
m_userDefinedMinValue = RiaNumericalTools::roundToNumSignificantDigitsFloor( m_globalAutoMin, m_precision );
|
||||
}
|
||||
}
|
||||
updateFieldVisibility();
|
||||
@ -403,24 +403,24 @@ void RimRegularLegendConfig::updateLegend()
|
||||
|
||||
if ( m_rangeMode == RangeModeType::AUTOMATIC_ALLTIMESTEPS )
|
||||
{
|
||||
adjustedMin = RiaNumericalTools::roundToNumSignificantDigits( m_globalAutoMin, m_precision );
|
||||
adjustedMax = RiaNumericalTools::roundToNumSignificantDigits( m_globalAutoMax, m_precision );
|
||||
adjustedMin = RiaNumericalTools::roundToNumSignificantDigitsFloor( m_globalAutoMin, m_precision );
|
||||
adjustedMax = RiaNumericalTools::roundToNumSignificantDigitsCeil( m_globalAutoMax, m_precision );
|
||||
|
||||
posClosestToZero = m_globalAutoPosClosestToZero;
|
||||
negClosestToZero = m_globalAutoNegClosestToZero;
|
||||
}
|
||||
else if ( m_rangeMode == RangeModeType::AUTOMATIC_CURRENT_TIMESTEP )
|
||||
{
|
||||
adjustedMin = RiaNumericalTools::roundToNumSignificantDigits( m_localAutoMin, m_precision );
|
||||
adjustedMax = RiaNumericalTools::roundToNumSignificantDigits( m_localAutoMax, m_precision );
|
||||
adjustedMin = RiaNumericalTools::roundToNumSignificantDigitsFloor( m_localAutoMin, m_precision );
|
||||
adjustedMax = RiaNumericalTools::roundToNumSignificantDigitsCeil( m_localAutoMax, m_precision );
|
||||
|
||||
posClosestToZero = m_localAutoPosClosestToZero;
|
||||
negClosestToZero = m_localAutoNegClosestToZero;
|
||||
}
|
||||
else
|
||||
{
|
||||
adjustedMin = RiaNumericalTools::roundToNumSignificantDigits( m_userDefinedMinValue, m_precision );
|
||||
adjustedMax = RiaNumericalTools::roundToNumSignificantDigits( m_userDefinedMaxValue, m_precision );
|
||||
adjustedMin = RiaNumericalTools::roundToNumSignificantDigitsFloor( m_userDefinedMinValue, m_precision );
|
||||
adjustedMax = RiaNumericalTools::roundToNumSignificantDigitsCeil( m_userDefinedMaxValue, m_precision );
|
||||
|
||||
posClosestToZero = m_globalAutoPosClosestToZero;
|
||||
negClosestToZero = m_globalAutoNegClosestToZero;
|
||||
@ -626,11 +626,11 @@ void RimRegularLegendConfig::disableAllTimeStepsRange( bool doDisable )
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimRegularLegendConfig::setAutomaticRanges( double globalMin, double globalMax, double localMin, double localMax )
|
||||
{
|
||||
double candidateGlobalAutoMin = RiaNumericalTools::roundToNumSignificantDigits( globalMin, m_precision );
|
||||
double candidateGlobalAutoMax = RiaNumericalTools::roundToNumSignificantDigits( globalMax, m_precision );
|
||||
double candidateGlobalAutoMin = RiaNumericalTools::roundToNumSignificantDigitsFloor( globalMin, m_precision );
|
||||
double candidateGlobalAutoMax = RiaNumericalTools::roundToNumSignificantDigitsCeil( globalMax, m_precision );
|
||||
|
||||
double candidateLocalAutoMin = RiaNumericalTools::roundToNumSignificantDigits( localMin, m_precision );
|
||||
double candidateLocalAutoMax = RiaNumericalTools::roundToNumSignificantDigits( localMax, m_precision );
|
||||
double candidateLocalAutoMin = RiaNumericalTools::roundToNumSignificantDigitsFloor( localMin, m_precision );
|
||||
double candidateLocalAutoMax = RiaNumericalTools::roundToNumSignificantDigitsCeil( localMax, m_precision );
|
||||
|
||||
m_globalAutoMin = candidateGlobalAutoMin;
|
||||
m_globalAutoMax = candidateGlobalAutoMax;
|
||||
|
@ -205,11 +205,11 @@ void RimTernaryLegendConfig::updateLegend()
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
void RimTernaryLegendConfig::setAutomaticRanges( TernaryArrayIndex ternaryIndex, double globalMin, double globalMax, double localMin, double localMax )
|
||||
{
|
||||
double candidateGlobalAutoMin = RiaNumericalTools::roundToNumSignificantDigits( globalMin, precision );
|
||||
double candidateGlobalAutoMax = RiaNumericalTools::roundToNumSignificantDigits( globalMax, precision );
|
||||
double candidateGlobalAutoMin = RiaNumericalTools::roundToNumSignificantDigitsFloor( globalMin, precision );
|
||||
double candidateGlobalAutoMax = RiaNumericalTools::roundToNumSignificantDigitsCeil( globalMax, precision );
|
||||
|
||||
double candidateLocalAutoMin = RiaNumericalTools::roundToNumSignificantDigits( localMin, precision );
|
||||
double candidateLocalAutoMax = RiaNumericalTools::roundToNumSignificantDigits( localMax, precision );
|
||||
double candidateLocalAutoMin = RiaNumericalTools::roundToNumSignificantDigitsFloor( localMin, precision );
|
||||
double candidateLocalAutoMax = RiaNumericalTools::roundToNumSignificantDigitsCeil( localMax, precision );
|
||||
|
||||
m_globalAutoMin[ternaryIndex] = candidateGlobalAutoMin;
|
||||
m_globalAutoMax[ternaryIndex] = candidateGlobalAutoMax;
|
||||
|
@ -95,6 +95,7 @@ set(SOURCE_GROUP_SOURCE_FILES
|
||||
${CMAKE_CURRENT_LIST_DIR}/RimSummaryRegressionAnalysisCurve-Test.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/RimWellLogCalculatedCurve-Test.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/RigWellLogCurveData-Test.cpp
|
||||
${CMAKE_CURRENT_LIST_DIR}/RiaNumericalTools-Test.cpp
|
||||
)
|
||||
|
||||
if(RESINSIGHT_ENABLE_GRPC)
|
||||
|
76
ApplicationLibCode/UnitTests/RiaNumericalTools-Test.cpp
Normal file
76
ApplicationLibCode/UnitTests/RiaNumericalTools-Test.cpp
Normal file
@ -0,0 +1,76 @@
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
#include "RiaNumericalTools.h"
|
||||
|
||||
TEST( RiaNumericalTools, LogTenFunctions )
|
||||
{
|
||||
{
|
||||
// Negative values will return zero
|
||||
double value = -0.0015;
|
||||
|
||||
auto exponentCeil = RiaNumericalTools::computeTenExponentCeil( value );
|
||||
EXPECT_EQ( 0.0f, exponentCeil );
|
||||
|
||||
auto exponentFloor = RiaNumericalTools::computeTenExponentFloor( value );
|
||||
EXPECT_EQ( 0.0f, exponentFloor );
|
||||
}
|
||||
|
||||
{
|
||||
double value = 0.15;
|
||||
|
||||
auto exponentCeil = RiaNumericalTools::computeTenExponentCeil( value );
|
||||
EXPECT_EQ( 0.0f, exponentCeil );
|
||||
|
||||
auto exponentFloor = RiaNumericalTools::computeTenExponentFloor( value );
|
||||
EXPECT_EQ( -1.0f, exponentFloor );
|
||||
}
|
||||
|
||||
{
|
||||
double value = 1.5;
|
||||
|
||||
auto exponentCeil = RiaNumericalTools::computeTenExponentCeil( value );
|
||||
EXPECT_EQ( 1.0f, exponentCeil );
|
||||
|
||||
auto exponentFloor = RiaNumericalTools::computeTenExponentFloor( value );
|
||||
EXPECT_EQ( 0.0f, exponentFloor );
|
||||
}
|
||||
|
||||
{
|
||||
double value = 15;
|
||||
|
||||
auto exponentCeil = RiaNumericalTools::computeTenExponentCeil( value );
|
||||
EXPECT_EQ( 2.0f, exponentCeil );
|
||||
|
||||
auto exponentFloor = RiaNumericalTools::computeTenExponentFloor( value );
|
||||
EXPECT_EQ( 1.0f, exponentFloor );
|
||||
}
|
||||
}
|
||||
|
||||
TEST( RiaNumericalTools, RoundToSignificant )
|
||||
{
|
||||
struct TestValues
|
||||
{
|
||||
double value;
|
||||
double expectedCeil;
|
||||
double expectedFloor;
|
||||
};
|
||||
|
||||
TestValues testValues[] = {
|
||||
{ -0.00152, -0.0015, -0.0016 },
|
||||
{ -15, -15, -15 },
|
||||
{ -159, -150, -160 },
|
||||
{ 0.02, 0.02, 0.02 },
|
||||
{ 152, 160.0, 150.0 },
|
||||
{ 1520, 1600.0, 1500.0 },
|
||||
{ 15913, 16000.0, 15000.0 },
|
||||
};
|
||||
|
||||
for ( const auto& testValue : testValues )
|
||||
{
|
||||
auto valueCeil = RiaNumericalTools::roundToNumSignificantDigitsCeil( testValue.value, 2 );
|
||||
EXPECT_EQ( testValue.expectedCeil, valueCeil );
|
||||
|
||||
auto valueFloor = RiaNumericalTools::roundToNumSignificantDigitsFloor( testValue.value, 2 );
|
||||
EXPECT_EQ( testValue.expectedFloor, valueFloor );
|
||||
}
|
||||
}
|
@ -1,6 +1,5 @@
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
#include "RiaNumericalTools.h"
|
||||
#include "RiaTestDataDirectory.h"
|
||||
#include "RifColorLegendData.h"
|
||||
#include "RigFormationNames.h"
|
||||
@ -84,47 +83,3 @@ TEST( RifColorLegendData, ReadLYRFileWithColorHTML )
|
||||
EXPECT_EQ( 0.0f, formationColor.g() );
|
||||
EXPECT_EQ( 0.0f, formationColor.b() );
|
||||
}
|
||||
|
||||
TEST( RiaNumericalTools, LogTenFunctions )
|
||||
{
|
||||
{
|
||||
// Negative values will return zero
|
||||
double value = -0.0015;
|
||||
|
||||
auto exponentCeil = RiaNumericalTools::computeTenExponentCeil( value );
|
||||
EXPECT_EQ( 0.0f, exponentCeil );
|
||||
|
||||
auto exponentFloor = RiaNumericalTools::computeTenExponentFloor( value );
|
||||
EXPECT_EQ( 0.0f, exponentFloor );
|
||||
}
|
||||
|
||||
{
|
||||
double value = 0.15;
|
||||
|
||||
auto exponentCeil = RiaNumericalTools::computeTenExponentCeil( value );
|
||||
EXPECT_EQ( 0.0f, exponentCeil );
|
||||
|
||||
auto exponentFloor = RiaNumericalTools::computeTenExponentFloor( value );
|
||||
EXPECT_EQ( -1.0f, exponentFloor );
|
||||
}
|
||||
|
||||
{
|
||||
double value = 1.5;
|
||||
|
||||
auto exponentCeil = RiaNumericalTools::computeTenExponentCeil( value );
|
||||
EXPECT_EQ( 1.0f, exponentCeil );
|
||||
|
||||
auto exponentFloor = RiaNumericalTools::computeTenExponentFloor( value );
|
||||
EXPECT_EQ( 0.0f, exponentFloor );
|
||||
}
|
||||
|
||||
{
|
||||
double value = 15;
|
||||
|
||||
auto exponentCeil = RiaNumericalTools::computeTenExponentCeil( value );
|
||||
EXPECT_EQ( 2.0f, exponentCeil );
|
||||
|
||||
auto exponentFloor = RiaNumericalTools::computeTenExponentFloor( value );
|
||||
EXPECT_EQ( 1.0f, exponentFloor );
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user