From 11253f2dbd8db096d22fce45f5832a1b74037690 Mon Sep 17 00:00:00 2001 From: Gaute Lindkvist Date: Thu, 6 Sep 2018 19:58:28 +0200 Subject: [PATCH] Make RiaWeightedAverageCalculator a template class. --- .../Application/Tools/CMakeLists_files.cmake | 2 +- .../Tools/RiaWeightedAverageCalculator.h | 11 ++++-- ...r.cpp => RiaWeightedAverageCalculator.inl} | 37 +++++++++++++------ .../RimStimPlanFractureTemplate.cpp | 17 ++++++--- .../UnitTests/RiaWeightedAverage-Test.cpp | 9 ++--- 5 files changed, 48 insertions(+), 28 deletions(-) rename ApplicationCode/Application/Tools/{RiaWeightedAverageCalculator.cpp => RiaWeightedAverageCalculator.inl} (65%) diff --git a/ApplicationCode/Application/Tools/CMakeLists_files.cmake b/ApplicationCode/Application/Tools/CMakeLists_files.cmake index 7de31c36b1..0abbebfb1c 100644 --- a/ApplicationCode/Application/Tools/CMakeLists_files.cmake +++ b/ApplicationCode/Application/Tools/CMakeLists_files.cmake @@ -34,6 +34,7 @@ ${CMAKE_CURRENT_LIST_DIR}/RiaArcCurveCalculator.h ${CMAKE_CURRENT_LIST_DIR}/RiaJCurveCalculator.h ${CMAKE_CURRENT_LIST_DIR}/RiaOffshoreSphericalCoords.h ${CMAKE_CURRENT_LIST_DIR}/RiaWeightedAverageCalculator.h +${CMAKE_CURRENT_LIST_DIR}/RiaWeightedAverageCalculator.inl ${CMAKE_CURRENT_LIST_DIR}/RiaWeightedGeometricMeanCalculator.h ) @@ -70,7 +71,6 @@ ${CMAKE_CURRENT_LIST_DIR}/RiaPolyArcLineSampler.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaSCurveCalculator.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaArcCurveCalculator.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaJCurveCalculator.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaWeightedAverageCalculator.cpp ${CMAKE_CURRENT_LIST_DIR}/RiaWeightedGeometricMeanCalculator.cpp ) diff --git a/ApplicationCode/Application/Tools/RiaWeightedAverageCalculator.h b/ApplicationCode/Application/Tools/RiaWeightedAverageCalculator.h index b9cae5cff2..8080956f28 100644 --- a/ApplicationCode/Application/Tools/RiaWeightedAverageCalculator.h +++ b/ApplicationCode/Application/Tools/RiaWeightedAverageCalculator.h @@ -21,17 +21,20 @@ //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- +template class RiaWeightedAverageCalculator { public: RiaWeightedAverageCalculator(); - void addValueAndWeight(double value, double weight); + void addValueAndWeight(T value, double weight); - double weightedAverage() const; + T weightedAverage() const; double aggregatedWeight() const; - + bool validAggregatedWeight() const; private: - double m_aggregatedValue; + T m_aggregatedValue; double m_aggregatedWeight; }; + +#include "RiaWeightedAverageCalculator.inl" \ No newline at end of file diff --git a/ApplicationCode/Application/Tools/RiaWeightedAverageCalculator.cpp b/ApplicationCode/Application/Tools/RiaWeightedAverageCalculator.inl similarity index 65% rename from ApplicationCode/Application/Tools/RiaWeightedAverageCalculator.cpp rename to ApplicationCode/Application/Tools/RiaWeightedAverageCalculator.inl index 4d3874edb9..e561fa7f81 100644 --- a/ApplicationCode/Application/Tools/RiaWeightedAverageCalculator.cpp +++ b/ApplicationCode/Application/Tools/RiaWeightedAverageCalculator.inl @@ -16,15 +16,14 @@ // ///////////////////////////////////////////////////////////////////////////////// -#include "RiaWeightedAverageCalculator.h" - #include "cvfAssert.h" //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RiaWeightedAverageCalculator::RiaWeightedAverageCalculator() - : m_aggregatedValue(0.0) +template +RiaWeightedAverageCalculator::RiaWeightedAverageCalculator() + : m_aggregatedValue(T{}) , m_aggregatedWeight(0.0) { } @@ -32,31 +31,45 @@ RiaWeightedAverageCalculator::RiaWeightedAverageCalculator() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RiaWeightedAverageCalculator::addValueAndWeight(double value, double weight) +template +void RiaWeightedAverageCalculator::addValueAndWeight(T value, double weight) { CVF_ASSERT(weight >= 0.0); - m_aggregatedValue += value * weight; + m_aggregatedValue = m_aggregatedValue + value * weight; m_aggregatedWeight += weight; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -double RiaWeightedAverageCalculator::weightedAverage() const +template +T RiaWeightedAverageCalculator::weightedAverage() const { - if (m_aggregatedWeight > 1e-7) + bool validWeights = validAggregatedWeight(); + CVF_TIGHT_ASSERT(validWeights); + if (validWeights) { - return m_aggregatedValue / m_aggregatedWeight; + return m_aggregatedValue * (1.0 / m_aggregatedWeight); } - - return 0.0; + return T{}; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -double RiaWeightedAverageCalculator::aggregatedWeight() const +template +double RiaWeightedAverageCalculator::aggregatedWeight() const { return m_aggregatedWeight; } + + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +template +bool RiaWeightedAverageCalculator::validAggregatedWeight() const +{ + return m_aggregatedWeight > 1.0e-12; +} \ No newline at end of file diff --git a/ApplicationCode/ProjectDataModel/Completions/RimStimPlanFractureTemplate.cpp b/ApplicationCode/ProjectDataModel/Completions/RimStimPlanFractureTemplate.cpp index fe5f9ca6cd..88f8f1bf6f 100644 --- a/ApplicationCode/ProjectDataModel/Completions/RimStimPlanFractureTemplate.cpp +++ b/ApplicationCode/ProjectDataModel/Completions/RimStimPlanFractureTemplate.cpp @@ -477,8 +477,8 @@ FractureWidthAndConductivity nameUnit.first, nameUnit.second, m_activeTimeStepIndex, fractureTemplateUnit()); } - RiaWeightedAverageCalculator widthCalc; - RiaWeightedAverageCalculator conductivityCalc; + RiaWeightedAverageCalculator widthCalc; + RiaWeightedAverageCalculator conductivityCalc; RigWellPathStimplanIntersector intersector(rimWellPath->wellPathGeometry(), fractureInstance); for (const auto& v : intersector.intersections()) @@ -497,10 +497,15 @@ FractureWidthAndConductivity intersectionLength); } } - - weightedConductivity = conductivityCalc.weightedAverage(); - weightedWidth = widthCalc.weightedAverage(); - totalLength = widthCalc.aggregatedWeight(); + if (conductivityCalc.validAggregatedWeight()) + { + weightedConductivity = conductivityCalc.weightedAverage(); + } + if (widthCalc.validAggregatedWeight()) + { + weightedWidth = widthCalc.weightedAverage(); + totalLength = widthCalc.aggregatedWeight(); + } } if (totalLength > 1e-7) diff --git a/ApplicationCode/UnitTests/RiaWeightedAverage-Test.cpp b/ApplicationCode/UnitTests/RiaWeightedAverage-Test.cpp index 34a35514cc..211176f6a9 100644 --- a/ApplicationCode/UnitTests/RiaWeightedAverage-Test.cpp +++ b/ApplicationCode/UnitTests/RiaWeightedAverage-Test.cpp @@ -9,15 +9,14 @@ TEST(RiaWeightedAverageCalculator, BasicUsage) { { - RiaWeightedAverageCalculator calc; + RiaWeightedAverageCalculator calc; EXPECT_DOUBLE_EQ(0.0, calc.aggregatedWeight()); - EXPECT_DOUBLE_EQ(0.0, calc.weightedAverage()); + EXPECT_FALSE(calc.validAggregatedWeight()); } - { - RiaWeightedAverageCalculator calc; + RiaWeightedAverageCalculator calc; std::vector values {3.0, 6.0}; std::vector weights {1.0, 2.0}; @@ -26,7 +25,7 @@ TEST(RiaWeightedAverageCalculator, BasicUsage) { calc.addValueAndWeight(values[i], weights[i]); } - + EXPECT_TRUE(calc.validAggregatedWeight()); EXPECT_DOUBLE_EQ(3.0, calc.aggregatedWeight()); EXPECT_DOUBLE_EQ(5.0, calc.weightedAverage()); }