Ignore:
Timestamp:
01/10/17 13:52:53 (7 years ago)
Author:
mhnguyen
Message:

Improving missing-value processing
If detect_missing_value is activated, then all missing value will be converted to
NaN (Not-a-number) in input of data flow then they will be reconverted to missing value on output

+) Update SourceFilter?, TemporalFilter? and SpatialTransformFilter? with new processing
+) Update all transformations with new processing

Test
+) On Curie
+) Work

Location:
XIOS/trunk/src/transformation/Functions
Files:
11 edited

Legend:

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

    r979 r1018  
    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                                       const double& defaultValue) 
    3234{ 
    3335  if (resetWeight_) { weights_.resize(flagInitial.size()); weights_ = 1.0; resetWeight_ = false; } 
     36  bool hasMissingValue = NumTraits<double>::isnan(defaultValue); 
    3437 
    35   int nbLocalIndex = localIndex.size(); 
    36   int currentlocalIndex = 0; 
    37   double currentWeight  = 0.0; 
    38   for (int idx = 0; idx < nbLocalIndex; ++idx) 
     38  if (hasMissingValue) 
    3939  { 
    40     currentlocalIndex = localIndex[idx].first; 
    41     currentWeight     = localIndex[idx].second; 
     40    int nbLocalIndex = localIndex.size(); 
     41    int currentlocalIndex = 0; 
     42    double currentWeight  = 0.0; 
     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    } 
     61  } 
     62  else 
     63  { 
     64    int nbLocalIndex = localIndex.size(); 
     65    int currentlocalIndex = 0; 
     66    double currentWeight  = 0.0; 
     67    for (int idx = 0; idx < nbLocalIndex; ++idx) 
     68    { 
     69      currentlocalIndex = localIndex[idx].first; 
     70      currentWeight     = localIndex[idx].second; 
    4271 
    43     if (flagInitial[currentlocalIndex]) 
    44     { 
    45       dataOut(currentlocalIndex) = *(dataInput + idx); 
    46       flagInitial[currentlocalIndex] = false; 
    47     } 
    48     else 
    49     { 
    50       dataOut(currentlocalIndex)  += *(dataInput + idx); 
    51       weights_(currentlocalIndex) += 1.0; 
     72      if (flagInitial[currentlocalIndex]) 
     73      { 
     74        dataOut(currentlocalIndex) = *(dataInput + idx); 
     75        flagInitial[currentlocalIndex] = false; 
     76      } 
     77      else 
     78      { 
     79        dataOut(currentlocalIndex)  += *(dataInput + idx); 
     80        weights_(currentlocalIndex) += 1.0; 
     81      } 
    5282    } 
    5383  } 
  • XIOS/trunk/src/transformation/Functions/average_reduction.hpp

    r979 r1018  
    2626                     const double* dataInput, 
    2727                     CArray<double,1>& dataOut, 
    28                      std::vector<bool>& flagInitial); 
     28                     std::vector<bool>& flagInitial, 
     29                     const double& defaultValue); 
    2930 
    3031  virtual void updateData(CArray<double,1>& dataOut); 
  • XIOS/trunk/src/transformation/Functions/extract.cpp

    r895 r1018  
    2929                                       const double* dataInput, 
    3030                                       CArray<double,1>& dataOut, 
    31                                        std::vector<bool>& flagInitial) 
     31                                       std::vector<bool>& flagInitial, 
     32                                       const double& defaultValue) 
    3233{ 
    3334  int nbLocalIndex = localIndex.size(); 
  • XIOS/trunk/src/transformation/Functions/extract.hpp

    r895 r1018  
    2626                     const double* dataInput, 
    2727                     CArray<double,1>& dataOut, 
    28                      std::vector<bool>& flagInitial); 
     28                     std::vector<bool>& flagInitial, 
     29                     const double& defaultValue); 
    2930 
    3031  virtual ~CExtractReductionAlgorithm() {} 
  • XIOS/trunk/src/transformation/Functions/max_reduction.cpp

    r979 r1018  
    88 */ 
    99#include "max_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                                   const double& defaultValue) 
    3234{ 
    33   int nbLocalIndex = localIndex.size(); 
    34   int currentlocalIndex = 0; 
    35   double currentWeight  = 0.0; 
    36   for (int idx = 0; idx < nbLocalIndex; ++idx) 
     35  bool hasMissingValue = NumTraits<double>::isnan(defaultValue); 
     36 
     37  if (hasMissingValue) 
    3738  { 
    38     currentlocalIndex = localIndex[idx].first; 
    39     currentWeight     = localIndex[idx].second; 
    40     if (flagInitial[currentlocalIndex]) 
     39    int nbLocalIndex = localIndex.size(); 
     40    int currentlocalIndex = 0;     
     41    for (int idx = 0; idx < nbLocalIndex; ++idx) 
    4142    { 
    42       dataOut(currentlocalIndex) = *(dataInput + idx); 
    43       flagInitial[currentlocalIndex] = false; 
     43      currentlocalIndex = localIndex[idx].first;       
     44      if (!NumTraits<double>::isnan(*(dataInput + idx))) 
     45      { 
     46        if (flagInitial[currentlocalIndex]) 
     47        { 
     48          dataOut(currentlocalIndex) = *(dataInput + idx); 
     49          flagInitial[currentlocalIndex] = false; 
     50        } 
     51        else 
     52        { 
     53          dataOut(currentlocalIndex) = std::max(*(dataInput + idx), dataOut(currentlocalIndex)); 
     54        } 
     55      } 
    4456    } 
    45     else 
     57  } 
     58  else 
     59  { 
     60    int nbLocalIndex = localIndex.size(); 
     61    int currentlocalIndex = 0;     
     62    for (int idx = 0; idx < nbLocalIndex; ++idx) 
    4663    { 
    47       dataOut(currentlocalIndex) = std::max(*(dataInput + idx), dataOut(currentlocalIndex)); 
     64      currentlocalIndex = localIndex[idx].first;       
     65      if (flagInitial[currentlocalIndex]) 
     66      { 
     67        dataOut(currentlocalIndex) = *(dataInput + idx); 
     68        flagInitial[currentlocalIndex] = false; 
     69      } 
     70      else 
     71      { 
     72        dataOut(currentlocalIndex) = std::max(*(dataInput + idx), dataOut(currentlocalIndex)); 
     73      } 
    4874    } 
    4975  } 
  • XIOS/trunk/src/transformation/Functions/max_reduction.hpp

    r979 r1018  
    2626                     const double* dataInput, 
    2727                     CArray<double,1>& dataOut, 
    28                      std::vector<bool>& flagInitial); 
     28                     std::vector<bool>& flagInitial, 
     29                     const double& defaultValue); 
    2930 
    3031  virtual ~CMaxReductionAlgorithm() {} 
  • XIOS/trunk/src/transformation/Functions/min_reduction.cpp

    r979 r1018  
    33   \author Ha NGUYEN 
    44   \since 27 June 2016 
    5    \date 27 June 2016 
     5   \date 9 Jan 2017 
    66 
    77   \brief min reduction 
    88 */ 
    99#include "min_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                                   const double& defaultValue) 
    3234{ 
    33   int nbLocalIndex = localIndex.size(); 
    34   int currentlocalIndex = 0; 
    35   for (int idx = 0; idx < nbLocalIndex; ++idx) 
     35  bool hasMissingValue = NumTraits<double>::isnan(defaultValue); 
     36 
     37  if (hasMissingValue) 
    3638  { 
    37     currentlocalIndex = localIndex[idx].first; 
    38     if (flagInitial[currentlocalIndex]) 
     39    int nbLocalIndex = localIndex.size(); 
     40    int currentlocalIndex = 0; 
     41    for (int idx = 0; idx < nbLocalIndex; ++idx) 
    3942    { 
    40       dataOut(currentlocalIndex) = *(dataInput + idx); 
    41       flagInitial[currentlocalIndex] = false; 
     43      currentlocalIndex = localIndex[idx].first; 
     44      if (!NumTraits<double>::isnan(*(dataInput + idx))) 
     45      { 
     46        if (flagInitial[currentlocalIndex]) 
     47        { 
     48          dataOut(currentlocalIndex) = *(dataInput + idx); 
     49          flagInitial[currentlocalIndex] = false; 
     50        } 
     51        else 
     52        { 
     53          dataOut(currentlocalIndex) = std::min(*(dataInput + idx), dataOut(currentlocalIndex)); 
     54        } 
     55      } 
    4256    } 
    43     else 
     57  } 
     58  else 
     59  { 
     60    int nbLocalIndex = localIndex.size(); 
     61    int currentlocalIndex = 0; 
     62    for (int idx = 0; idx < nbLocalIndex; ++idx) 
    4463    { 
    45       dataOut(currentlocalIndex) = std::min(*(dataInput + idx), dataOut(currentlocalIndex)); 
     64      currentlocalIndex = localIndex[idx].first; 
     65      if (flagInitial[currentlocalIndex]) 
     66      { 
     67        dataOut(currentlocalIndex) = *(dataInput + idx); 
     68        flagInitial[currentlocalIndex] = false; 
     69      } 
     70      else 
     71      { 
     72        dataOut(currentlocalIndex) = std::min(*(dataInput + idx), dataOut(currentlocalIndex)); 
     73      } 
    4674    } 
    4775  } 
  • XIOS/trunk/src/transformation/Functions/min_reduction.hpp

    r979 r1018  
    2626                     const double* dataInput, 
    2727                     CArray<double,1>& dataOut, 
    28                      std::vector<bool>& flagInitial); 
     28                     std::vector<bool>& flagInitial, 
     29                     const double& defaultValue); 
    2930 
    3031  virtual ~CMinReductionAlgorithm() {} 
  • XIOS/trunk/src/transformation/Functions/reduction.hpp

    r979 r1018  
    4545                     const double* dataInput, 
    4646                     CArray<double,1>& dataOut, 
    47                      std::vector<bool>& flagInitial) = 0; 
     47                     std::vector<bool>& flagInitial, 
     48                     const double& defaultValue) = 0; 
    4849  /*! 
    4950    Update local data  
  • XIOS/trunk/src/transformation/Functions/sum_reduction.cpp

    r979 r1018  
    33   \author Ha NGUYEN 
    44   \since 27 June 2016 
    5    \date 27 June 2016 
     5   \date 9 Jan 2017 
    66 
    77   \brief sum reduction 
    88 */ 
    99#include "sum_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                                   const double& defaultValue) 
    3234{ 
    33   int nbLocalIndex = localIndex.size(); 
    34   int currentlocalIndex = 0; 
    35   double currentWeight  = 0.0; 
    36   for (int idx = 0; idx < nbLocalIndex; ++idx) 
     35  bool hasMissingValue = NumTraits<double>::isnan(defaultValue); 
     36  if (hasMissingValue) 
    3737  { 
    38     currentlocalIndex = localIndex[idx].first; 
    39     currentWeight     = localIndex[idx].second; 
    40     if (flagInitial[currentlocalIndex]) 
     38    int nbLocalIndex = localIndex.size(); 
     39    int currentlocalIndex = 0;     
     40    for (int idx = 0; idx < nbLocalIndex; ++idx) 
    4141    { 
    42       dataOut(currentlocalIndex) = *(dataInput + idx); 
    43       flagInitial[currentlocalIndex] = false; 
    44     } 
    45     else 
     42      currentlocalIndex = localIndex[idx].first;    
     43      if (!NumTraits<double>::isnan(*(dataInput + idx))) 
     44      {    
     45        if (flagInitial[currentlocalIndex]) 
     46        { 
     47          dataOut(currentlocalIndex) = *(dataInput + idx); 
     48          flagInitial[currentlocalIndex] = false; 
     49        } 
     50        else 
     51        { 
     52          dataOut(currentlocalIndex) += *(dataInput + idx); 
     53        } 
     54      } 
     55    }     
     56  } 
     57  else 
     58  { 
     59    int nbLocalIndex = localIndex.size(); 
     60    int currentlocalIndex = 0;     
     61    for (int idx = 0; idx < nbLocalIndex; ++idx) 
    4662    { 
    47       dataOut(currentlocalIndex) += *(dataInput + idx); 
     63      currentlocalIndex = localIndex[idx].first;       
     64      if (flagInitial[currentlocalIndex]) 
     65      { 
     66        dataOut(currentlocalIndex) = *(dataInput + idx); 
     67        flagInitial[currentlocalIndex] = false; 
     68      } 
     69      else 
     70      { 
     71        dataOut(currentlocalIndex) += *(dataInput + idx); 
     72      } 
    4873    } 
    4974  } 
  • XIOS/trunk/src/transformation/Functions/sum_reduction.hpp

    r979 r1018  
    2626                     const double* dataInput, 
    2727                     CArray<double,1>& dataOut, 
    28                      std::vector<bool>& flagInitial); 
     28                     std::vector<bool>& flagInitial, 
     29                     const double& defaultValue); 
    2930 
    3031  virtual ~CSumReductionAlgorithm() {} 
Note: See TracChangeset for help on using the changeset viewer.