/*! \file min.cpp \author Ha NGUYEN \since 27 June 2016 \date 9 Jan 2017 \brief min reduction */ #include "min_reduction.hpp" #include "utils.hpp" namespace xios { CMinReductionAlgorithm::CMinReductionAlgorithm() : CReductionAlgorithm() { } CReductionAlgorithm* CMinReductionAlgorithm::create() { return (new CMinReductionAlgorithm()); } bool CMinReductionAlgorithm::registerTrans() { return registerOperation(TRANS_REDUCE_MIN, CMinReductionAlgorithm::create); } void CMinReductionAlgorithm::apply(const std::vector >& localIndex, const double* dataInput, CArray& dataOut, std::vector& flagInitial, const double& defaultValue) { bool hasMissingValue = NumTraits::isnan(defaultValue); if (hasMissingValue) { int nbLocalIndex = localIndex.size(); int currentlocalIndex = 0; for (int idx = 0; idx < nbLocalIndex; ++idx) { currentlocalIndex = localIndex[idx].first; if (!NumTraits::isnan(*(dataInput + idx))) { if (flagInitial[currentlocalIndex]) { dataOut(currentlocalIndex) = *(dataInput + idx); flagInitial[currentlocalIndex] = false; } else { dataOut(currentlocalIndex) = std::min(*(dataInput + idx), dataOut(currentlocalIndex)); } } } } else { int nbLocalIndex = localIndex.size(); int currentlocalIndex = 0; for (int idx = 0; idx < nbLocalIndex; ++idx) { currentlocalIndex = localIndex[idx].first; if (flagInitial[currentlocalIndex]) { dataOut(currentlocalIndex) = *(dataInput + idx); flagInitial[currentlocalIndex] = false; } else { dataOut(currentlocalIndex) = std::min(*(dataInput + idx), dataOut(currentlocalIndex)); } } } } }