source: XIOS/trunk/src/transformation/Functions/average_reduction.cpp @ 1154

Last change on this file since 1154 was 1154, checked in by mhnguyen, 4 years ago

Correcting a bug: activating detect_missing_value on field source doesn't work correctly

+) If all source data corresponding to a destination data are NaN, this destination data
will turn to be NaN even its default value is zero

Test
+) On Curie
+) Work

File size: 2.5 KB
Line 
1/*!
2   \file average.cpp
3   \author Ha NGUYEN
4   \since 8 Sep 2016
5   \date 9 Jan 2017
6
7   \brief average reduction
8 */
9#include "average_reduction.hpp"
10#include "utils.hpp"
11
12namespace xios {
13
14CAverageReductionAlgorithm::CAverageReductionAlgorithm()
15  : CReductionAlgorithm(), resetWeight_(true)
16{
17}
18
19CReductionAlgorithm* CAverageReductionAlgorithm::create()
20{
21  return (new CAverageReductionAlgorithm());
22}
23
24bool CAverageReductionAlgorithm::registerTrans()
25{
26  return registerOperation(TRANS_REDUCE_AVERAGE, CAverageReductionAlgorithm::create);
27}
28
29void CAverageReductionAlgorithm::apply(const std::vector<std::pair<int,double> >& localIndex,
30                                       const double* dataInput,
31                                       CArray<double,1>& dataOut,
32                                       std::vector<bool>& flagInitial,                     
33                                       bool ignoreMissingValue)
34{
35  if (resetWeight_) { weights_.resize(flagInitial.size()); weights_ = 1.0; resetWeight_ = false; } 
36
37  if (ignoreMissingValue)
38  {
39    int nbLocalIndex = localIndex.size();
40    int currentlocalIndex = 0;
41    double currentWeight  = 0.0;   
42
43    for (int idx = 0; idx < nbLocalIndex; ++idx)
44    {
45      currentlocalIndex = localIndex[idx].first;
46      currentWeight     = localIndex[idx].second;
47      if (!NumTraits<double>::isnan(*(dataInput + idx)))
48      {
49        if (flagInitial[currentlocalIndex])
50        {
51          dataOut(currentlocalIndex) = *(dataInput + idx);
52          flagInitial[currentlocalIndex] = false;
53        }
54        else
55        {
56          dataOut(currentlocalIndex)  += *(dataInput + idx);
57          weights_(currentlocalIndex) += 1.0;
58        }
59      }
60      else
61      {
62        if (flagInitial[currentlocalIndex]) 
63          dataOut(currentlocalIndex) = std::numeric_limits<double>::quiet_NaN();
64      }
65    }
66  }
67  else
68  {
69    int nbLocalIndex = localIndex.size();
70    int currentlocalIndex = 0;
71    double currentWeight  = 0.0;
72    for (int idx = 0; idx < nbLocalIndex; ++idx)
73    {
74      currentlocalIndex = localIndex[idx].first;
75      currentWeight     = localIndex[idx].second;
76
77      if (flagInitial[currentlocalIndex])
78      {
79        dataOut(currentlocalIndex) = *(dataInput + idx);
80        flagInitial[currentlocalIndex] = false;
81      }
82      else
83      {
84        dataOut(currentlocalIndex)  += *(dataInput + idx);
85        weights_(currentlocalIndex) += 1.0;
86      }
87    }
88  }
89}
90
91void CAverageReductionAlgorithm::updateData(CArray<double,1>& dataOut)
92{
93  dataOut /= weights_;
94  resetWeight_ = true;
95}
96
97}
Note: See TracBrowser for help on using the repository browser.