///////////////////////////////////////////////////////////////////////////////// // // 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" #include // Needed for HUGE_VAL on Linux //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RigWeightedMeanCalc::weightedMeanOverCells( const std::vector* weights, const std::vector* values, const cvf::UByteArray* cellVisibilities, bool isUsingVisibleCells, const RigActiveCellInfo* actCellInfo, bool isUsingActiveIndex, double* result ) { if ( !( weights && values && result ) ) return; if ( !cellVisibilities && isUsingVisibleCells ) return; if ( !actCellInfo && isUsingActiveIndex ) return; if ( weights->empty() || values->empty() ) return; double weightedSum = 0.0; double weightSum = 0.0; for ( size_t cIdx = 0; cIdx < actCellInfo->reservoirCellCount(); ++cIdx ) { if ( isUsingVisibleCells ) { if ( !( *cellVisibilities )[cIdx] ) continue; } size_t cellResultIndex = actCellInfo->cellResultIndex( cIdx ); if ( cellResultIndex == cvf::UNDEFINED_SIZE_T || cellResultIndex > weights->size() ) { continue; } double value; if ( isUsingActiveIndex ) { value = ( *values )[cellResultIndex]; } else { value = ( *values )[cIdx]; } double weight = ( *weights )[cellResultIndex]; if ( weight == HUGE_VAL || value == HUGE_VAL ) { continue; } weightedSum += weight * value; weightSum += weight; } if ( weightSum != 0 ) { *result = weightedSum / weightSum; } else { *result = HUGE_VAL; } }