Ignore:
Timestamp:
06/06/17 17:58:16 (7 years ago)
Author:
oabramkina
Message:

Two server levels: merging with trunk r1137.
There are bugs.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/dev_olga/src/transformation/Functions/average_reduction.cpp

    r979 r1158  
    33   \author Ha NGUYEN 
    44   \since 8 Sep 2016 
    5    \date 8 Sep 2016 
     5   \date 9 Jan 2017 
    66 
    77   \brief average reduction 
    88 */ 
    99#include "average_reduction.hpp" 
     10#include "utils.hpp" 
    1011 
    1112namespace xios { 
     
    2930                                       const double* dataInput, 
    3031                                       CArray<double,1>& dataOut, 
    31                                        std::vector<bool>& flagInitial) 
     32                                       std::vector<bool>& flagInitial,                      
     33                                       bool ignoreMissingValue) 
    3234{ 
    33   if (resetWeight_) { weights_.resize(flagInitial.size()); weights_ = 1.0; resetWeight_ = false; } 
     35  if (resetWeight_) { weights_.resize(flagInitial.size()); weights_ = 1.0; resetWeight_ = false; }   
    3436 
    35   int nbLocalIndex = localIndex.size(); 
    36   int currentlocalIndex = 0; 
    37   double currentWeight  = 0.0; 
    38   for (int idx = 0; idx < nbLocalIndex; ++idx) 
     37  if (ignoreMissingValue) 
    3938  { 
    40     currentlocalIndex = localIndex[idx].first; 
    41     currentWeight     = localIndex[idx].second; 
     39    int nbLocalIndex = localIndex.size(); 
     40    int currentlocalIndex = 0; 
     41    double currentWeight  = 0.0; 
    4242 
    43     if (flagInitial[currentlocalIndex]) 
     43    dataOut=std::numeric_limits<double>::quiet_NaN(); 
     44 
     45    for (int idx = 0; idx < nbLocalIndex; ++idx) 
    4446    { 
    45       dataOut(currentlocalIndex) = *(dataInput + idx); 
    46       flagInitial[currentlocalIndex] = false; 
     47      currentlocalIndex = localIndex[idx].first; 
     48      currentWeight     = localIndex[idx].second; 
     49      if (!NumTraits<double>::isnan(*(dataInput + idx))) 
     50      { 
     51        if (flagInitial[currentlocalIndex]) 
     52        { 
     53          dataOut(currentlocalIndex) = *(dataInput + idx); 
     54          flagInitial[currentlocalIndex] = false; 
     55        } 
     56        else 
     57        { 
     58          dataOut(currentlocalIndex)  += *(dataInput + idx); 
     59          weights_(currentlocalIndex) += 1.0; 
     60        } 
     61      } 
    4762    } 
    48     else 
     63  } 
     64  else 
     65  { 
     66    int nbLocalIndex = localIndex.size(); 
     67    int currentlocalIndex = 0; 
     68    double currentWeight  = 0.0; 
     69    for (int idx = 0; idx < nbLocalIndex; ++idx) 
    4970    { 
    50       dataOut(currentlocalIndex)  += *(dataInput + idx); 
    51       weights_(currentlocalIndex) += 1.0; 
     71      currentlocalIndex = localIndex[idx].first; 
     72      currentWeight     = localIndex[idx].second; 
     73 
     74      if (flagInitial[currentlocalIndex]) 
     75      { 
     76        dataOut(currentlocalIndex) = *(dataInput + idx); 
     77        flagInitial[currentlocalIndex] = false; 
     78      } 
     79      else 
     80      { 
     81        dataOut(currentlocalIndex)  += *(dataInput + idx); 
     82        weights_(currentlocalIndex) += 1.0; 
     83      } 
    5284    } 
    5385  } 
Note: See TracChangeset for help on using the changeset viewer.