From 47429b1c6b66c9e12dcacb2a00da80cd3d3b5e9c Mon Sep 17 00:00:00 2001 From: Rebecca Cox Date: Wed, 15 Nov 2017 16:27:51 +0100 Subject: [PATCH] #2146 Num Flooded PV: Add weighted mean calulator --- .../ReservoirDataModel/CMakeLists_files.cmake | 3 +- .../RigWeightedMeanCalc.cpp | 111 ++++++++++++++++++ .../ReservoirDataModel/RigWeightedMeanCalc.h | 38 ++++++ 3 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 ApplicationCode/ReservoirDataModel/RigWeightedMeanCalc.cpp create mode 100644 ApplicationCode/ReservoirDataModel/RigWeightedMeanCalc.h diff --git a/ApplicationCode/ReservoirDataModel/CMakeLists_files.cmake b/ApplicationCode/ReservoirDataModel/CMakeLists_files.cmake index 5fee48662b..59fbda7c9e 100644 --- a/ApplicationCode/ReservoirDataModel/CMakeLists_files.cmake +++ b/ApplicationCode/ReservoirDataModel/CMakeLists_files.cmake @@ -63,7 +63,7 @@ ${CEE_CURRENT_LIST_DIR}RigEclipseResultInfo.h ${CEE_CURRENT_LIST_DIR}RigTofAccumulatedPhaseFractionsCalculator.h ${CEE_CURRENT_LIST_DIR}RigTransmissibilityEquations.h ${CEE_CURRENT_LIST_DIR}RigNumberOfFloodedPoreVolumesCalculator.h - +${CEE_CURRENT_LIST_DIR}RigWeightedMeanCalc.h ) if (RESINSIGHT_ENABLE_PROTOTYPE_FEATURE_FRACTURES) @@ -133,6 +133,7 @@ ${CEE_CURRENT_LIST_DIR}RigEclipseResultInfo.cpp ${CEE_CURRENT_LIST_DIR}RigTofAccumulatedPhaseFractionsCalculator.cpp ${CEE_CURRENT_LIST_DIR}RigTransmissibilityEquations.cpp ${CEE_CURRENT_LIST_DIR}RigNumberOfFloodedPoreVolumesCalculator.cpp +${CEE_CURRENT_LIST_DIR}RigWeightedMeanCalc.cpp ) if (RESINSIGHT_ENABLE_PROTOTYPE_FEATURE_FRACTURES) diff --git a/ApplicationCode/ReservoirDataModel/RigWeightedMeanCalc.cpp b/ApplicationCode/ReservoirDataModel/RigWeightedMeanCalc.cpp new file mode 100644 index 0000000000..328bdc1757 --- /dev/null +++ b/ApplicationCode/ReservoirDataModel/RigWeightedMeanCalc.cpp @@ -0,0 +1,111 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2017- Statoil ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RigWeightedMeanCalc.h" + +#include "RiaDefines.h" + +#include "RigActiveCellInfo.h" +#include "RigFlowDiagResults.h" + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigWeightedMeanCalc::weightedMeanOverCells(const std::vector* weights, + const std::vector* values, + const cvf::UByteArray* cellVisibilities, + const RigActiveCellInfo* actCellInfo, + bool isUsingActiveIndex, + double *result) +{ + if (!(weights && values && cellVisibilities && actCellInfo && result)) return; + + if (weights->empty() || values->empty()) return; + if (weights->size() != values->size()) return; + + double weightedSum = 0.0; + double weightSum = 0.0; + + for (size_t cIdx = 0; cIdx < cellVisibilities->size(); ++cIdx) + { + if (!(*cellVisibilities)[cIdx]) continue; + + size_t cellResultIndex = cIdx; + if (isUsingActiveIndex) + { + cellResultIndex = actCellInfo->cellResultIndex(cIdx); + } + + if (cellResultIndex == cvf::UNDEFINED_SIZE_T || cellResultIndex > values->size()) continue; + + double weight = (*weights)[cellResultIndex]; + double value = (*values)[cellResultIndex]; + + if (weight == HUGE_VAL || value == HUGE_VAL) + { + continue; + } + + weightedSum += weight * value; + weightSum += weight; + } + + if (weightSum != 0) + { + *result = weightedSum / weightSum; + } + else + { + *result = HUGE_VAL; + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigWeightedMeanCalc::weightedMean(const std::vector* weights, const std::vector* values, double* result) +{ + if (!weights || !values) return; + if (weights->size() != values->size()) return; + + double weightedSum = 0; + double weightSum = 0; + + for (size_t i = 0; i < values->size(); i++) + { + double weight = weights->at(i); + double value = values->at(i); + + if (weight == HUGE_VAL || value == HUGE_VAL) + { + continue; + } + + weightedSum += weight * value; + weightSum += weight; + } + + if (weightSum != 0) + { + *result = weightedSum / weightSum; + } + else + { + *result = HUGE_VAL; + } +} diff --git a/ApplicationCode/ReservoirDataModel/RigWeightedMeanCalc.h b/ApplicationCode/ReservoirDataModel/RigWeightedMeanCalc.h new file mode 100644 index 0000000000..4bb078247f --- /dev/null +++ b/ApplicationCode/ReservoirDataModel/RigWeightedMeanCalc.h @@ -0,0 +1,38 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2017- Statoil ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cvfArray.h" + +#include + +class RigActiveCellInfo; + +class RigWeightedMeanCalc +{ +public: + static void weightedMeanOverCells(const std::vector* weights, + const std::vector* values, + const cvf::UByteArray* cellVisibilities, + const RigActiveCellInfo* actCellInfo, + bool isUsingActiveIndex, + double *result); + + static void weightedMean(const std::vector* weights, const std::vector* values, double *result); +};