Changeset 470


Ignore:
Timestamp:
01/30/14 15:55:42 (10 years ago)
Author:
ymipsl
Message:

Enhancement : using new field attribute "detect_missing_value=true" adn defining a default value, the temporal operator (average, minimum, maximum, accumulate ...) detect missing value in the field and don't take them into account to perform the operation.

YM

Location:
XIOS/trunk/src
Files:
14 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/config/field_attribute.conf

    r464 r470  
    55DECLARE_ATTRIBUTE(StdString, unit) 
    66DECLARE_ATTRIBUTE(StdString, operation) 
     7DECLARE_ATTRIBUTE(bool,      detect_missing_value) 
    78 
    89DECLARE_ATTRIBUTE(StdString, freq_op) 
  • XIOS/trunk/src/functor/accumulate.cpp

    r443 r470  
    99 
    1010      CAccumulate::CAccumulate(CArray<double,1>& doutput) 
    11          : SuperClass(StdString("average"), doutput) 
     11         : SuperClass(StdString("accumulate"), doutput) 
     12      { /* Ne rien faire de plus */ } 
     13 
     14      CAccumulate::CAccumulate(CArray<double,1>& doutput, double missingValue) 
     15         : SuperClass(StdString("accumulate"), doutput, missingValue) 
    1216      { /* Ne rien faire de plus */ } 
    1317 
     
    2024                                 CArray<double,1>& _doutput) 
    2125      { 
    22 /* 
    23          const double * it1  = _dinput->data(), 
    24                       * end1 = _dinput->data() + _dinput->num_elements();  
    25                double * it   = _doutput->data(); 
    26          if (this->nbcall == 1) 
    27               for (; it1 != end1; it1++, it++) *it  = *it1; 
    28          else for (; it1 != end1; it1++, it++) *it += *it1;                
    29 */ 
    3026        if (this->nbcall == 1) _doutput=_dinput ; 
    31         else _doutput+=_dinput ; 
     27        else  
     28        { 
     29          if (hasMissingValue) 
     30          { 
     31            int i, n =_dinput.numElements() ; 
     32            const double * in=_dinput.dataFirst() ; 
     33            double* out=_doutput.dataFirst(); 
     34            for (i=0; i<n; ++i,++in,++out)  
     35              if (*in!=missingValue) 
     36              { 
     37                if(*out!=missingValue) *out  += *in; 
     38                else *out=*in ; 
     39              } 
     40          } 
     41          else _doutput+=_dinput ; 
     42        } 
     43      } 
    3244       
    33       } 
    3445       
    3546      void CAccumulate::final(void) 
    3647      { 
    37 /*          double * it1  = this->getDataOutput()->data(), 
    38                  * end1 = this->getDataOutput()->data() + this->getDataOutput()->num_elements(); 
    39           for (; it1 != end1; it1++) *it1 /= this->nbcall; 
    40           this->nbcall = 0;                                                    
    41 */ 
    42 //        doutput/=this->nbcall;  
    4348        this->nbcall = 0;  
    4449      } 
  • XIOS/trunk/src/functor/accumulate.hpp

    r449 r470  
    2222            //CAccumulate(const CFunData & data); 
    2323            CAccumulate(CArray<double,1>& doutput); 
     24            CAccumulate(CArray<double,1>& doutput, double missingValue); 
    2425            //CAccumulate(const CAccumulate & accumulate);         // Not implemented. 
    2526            //CAccumulate(const CAccumulate * const accumulate);   // Not implemented. 
  • XIOS/trunk/src/functor/average.cpp

    r380 r470  
    1212      { /* Ne rien faire de plus */ } 
    1313 
     14      CAverage::CAverage(CArray<double,1>& doutput, double missingValue) 
     15         : SuperClass(StdString("average"), doutput, missingValue) 
     16      { /* Ne rien faire de plus */ } 
     17 
    1418      CAverage::~CAverage(void) 
    1519      { /* Ne rien faire de plus */ } 
     
    2024                                 CArray<double,1>& _doutput) 
    2125      { 
    22 /* 
    23          const double * it1  = _dinput->data(), 
    24                       * end1 = _dinput->data() + _dinput->num_elements();  
    25                double * it   = _doutput->data(); 
    26          if (this->nbcall == 1) 
    27               for (; it1 != end1; it1++, it++) *it  = *it1; 
    28          else for (; it1 != end1; it1++, it++) *it += *it1;                
    29 */ 
    30         if (this->nbcall == 1) _doutput=_dinput ; 
    31         else _doutput+=_dinput ; 
     26        if (hasMissingValue) 
     27        { 
     28          if (nbcalls.numElements()==0)  
     29          { 
     30             nbcalls.resize(_dinput.numElements()) ; 
     31             nbcalls=0 ; 
     32          } 
     33        } 
     34         
     35        if (this->nbcall == 1)  
     36        { 
     37          _doutput=_dinput ; 
     38          if (hasMissingValue)  
     39          { 
     40            int i, n =_dinput.numElements() ; 
     41            const double * in=_dinput.dataFirst() ; 
     42            int* nc=nbcalls.dataFirst() ; 
     43            for (i=0; i<n; ++i,++nc)  
     44              if (*in!=missingValue) (*nc) ++; 
     45          } 
     46        } 
     47        else 
     48        { 
     49          if (hasMissingValue) 
     50          { 
     51            int i, n =_dinput.numElements() ; 
     52            const double * in=_dinput.dataFirst() ; 
     53            double* out=_doutput.dataFirst(); 
     54            int* nc=nbcalls.dataFirst() ; 
     55            for (i=0; i<n; ++i,++in,++out,++nc)  
     56              if (*in!=missingValue)  
     57              { 
     58                if (*nc != 0) (*out)  += *in; 
     59                else *out = *in ; 
     60                (*nc) ++; 
     61              }  
     62          } 
     63          else _doutput+=_dinput ; 
     64        } 
    3265       
    3366      } 
     
    3568      void CAverage::final(void) 
    3669      { 
    37 /*          double * it1  = this->getDataOutput()->data(), 
    38                  * end1 = this->getDataOutput()->data() + this->getDataOutput()->num_elements(); 
    39           for (; it1 != end1; it1++) *it1 /= this->nbcall; 
    40           this->nbcall = 0;                                                    
    41 */ 
    42         doutput/=this->nbcall;  
     70        if (hasMissingValue) 
     71        { 
     72          int i, n = nbcalls.numElements() ; 
     73          double* out= doutput.dataFirst(); 
     74          int* nc=nbcalls.dataFirst() ; 
     75          for (i=0; i<n; ++i, ++out,++nc)  
     76            if (*nc!=0)  
     77            { 
     78              *out  /= *nc; 
     79              *nc = 0 ; 
     80            } 
     81         
     82        }   
     83        else doutput/=this->nbcall;  
    4384        this->nbcall = 0;  
     85 
    4486      } 
    4587   } // namespace func 
  • XIOS/trunk/src/functor/average.hpp

    r449 r470  
    2222            //CAverage(const CFunData & data); 
    2323            CAverage(CArray<double,1>& doutput); 
     24            CAverage(CArray<double,1>& doutput, double missingValue); 
    2425            //CAverage(const CAverage & average);         // Not implemented. 
    2526            //CAverage(const CAverage * const average);   // Not implemented. 
  • XIOS/trunk/src/functor/instant.cpp

    r369 r470  
    1010      CInstant::CInstant(CArray<double,1>& doutput) 
    1111         : SuperClass(StdString("instant"), doutput) 
     12      { /* Ne rien faire de plus */ } 
     13  
     14      CInstant::CInstant(CArray<double,1>& doutput, double missingValue) 
     15         : SuperClass(StdString("instant"), doutput, missingValue) 
    1216      { /* Ne rien faire de plus */ } 
    1317 
  • XIOS/trunk/src/functor/instant.hpp

    r449 r470  
    2222            //CInstant(const CFunData & data); 
    2323            CInstant(CArray<double,1>& doutput); 
    24             //CInstant(const CInstant & instant);         // Not implemented. 
     24            CInstant(CArray<double,1>& doutput, double missingValue); 
     25           //CInstant(const CInstant & instant);         // Not implemented. 
    2526            //CInstant(const CInstant * const instant);   // Not implemented. 
    2627 
  • XIOS/trunk/src/functor/maximum.cpp

    r369 r470  
    1414      { /* Ne rien faire de plus */ } 
    1515 
     16      CMaximum::CMaximum(CArray<double,1>& doutput, double missingValue) 
     17         : SuperClass(StdString("maximum"), doutput, missingValue) 
     18      { /* Ne rien faire de plus */ } 
     19 
    1620      CMaximum::~CMaximum(void) 
    1721      { /* Ne rien faire de plus */ } 
     
    2630              double * it   = _doutput.dataFirst(); 
    2731         if (this->nbcall == 1) for (; it1 != end1; it1++, it++) *it = *it1; 
    28          else for (; it1 != end1; it1++, it++) *it = std::max(*it1, *it); 
     32         else  
     33         { 
     34           if (hasMissingValue)  
     35           {  
     36             for (; it1 != end1; it1++, it++)  
     37               if (*it1 != missingValue) 
     38               { 
     39                 if ( *it != missingValue) *it = std::max(*it1, *it); 
     40                 else *it=*it1 ;   
     41               } 
     42           } 
     43           else for (; it1 != end1; it1++, it++) *it = std::max(*it1, *it); 
     44         } 
    2945 
    3046 
  • XIOS/trunk/src/functor/maximum.hpp

    r449 r470  
    2222            //CMaximum(const CFunData & data); 
    2323            CMaximum(CArray<double,1>& doutput); 
     24            CMaximum(CArray<double,1>& doutput, double missingValue); 
    2425            //CMaximum(const CMaximum & Maximum);         // Not implemented. 
    2526            //CMaximum(const CMaximum * const Maximum);   // Not implemented. 
  • XIOS/trunk/src/functor/minimum.cpp

    r369 r470  
    1111      CMinimum::CMinimum(CArray<double,1>& doutput) 
    1212         : SuperClass(StdString("minimum"), doutput) 
     13      { /* Ne rien faire de plus */ } 
     14 
     15      CMinimum::CMinimum(CArray<double,1>& doutput, double missingValue) 
     16         : SuperClass(StdString("minimum"), doutput, missingValue) 
    1317      { /* Ne rien faire de plus */ } 
    1418 
     
    2630         
    2731        if (this->nbcall == 1)  for (; it1 != end1; it1++, it++) *it = *it1; 
    28         else for (; it1 != end1; it1++, it++) *it = std::min(*it1, *it); 
     32        else  
     33        { 
     34          if (hasMissingValue)  
     35          {  
     36            for (; it1 != end1; it1++, it++)  
     37              if (*it1!=missingValue) 
     38              { 
     39                if (*it != missingValue) *it = std::min(*it1, *it); 
     40                else *it=*it1 ; 
     41              } 
     42          } 
     43          else for (; it1 != end1; it1++, it++) *it = std::min(*it1, *it); 
     44        } 
    2945 
    3046      } 
  • XIOS/trunk/src/functor/minimum.hpp

    r449 r470  
    2222            //CMinimum(const CFunData & data); 
    2323            CMinimum(CArray<double,1>& doutput); 
     24            CMinimum(CArray<double,1>& doutput, double missingValue); 
    2425            //CMinimum(const CMinimum & Minimum);         // Not implemented. 
    2526            //CMinimum(const CMinimum * const Minimum);   // Not implemented. 
  • XIOS/trunk/src/functor/once.cpp

    r369 r470  
    1010      COnce::COnce(CArray<double,1>& doutput) 
    1111         : SuperClass(StdString("once"), doutput) 
     12      { /* Ne rien faire de plus */ } 
     13 
     14      COnce::COnce(CArray<double,1>& doutput, double missingValue) 
     15         : SuperClass(StdString("once"), doutput, missingValue) 
    1216      { /* Ne rien faire de plus */ } 
    1317 
  • XIOS/trunk/src/functor/once.hpp

    r449 r470  
    2121            //COnce(void);                       // Not implemented. 
    2222            COnce(CArray<double,1>& doutput); 
     23            COnce(CArray<double,1>& doutput, double missingValue); 
    2324            //COnce(const COnce & once);         // Not implemented. 
    2425            //COnce(const COnce * const once);   // Not implemented. 
  • XIOS/trunk/src/node/field.cpp

    r466 r470  
    458458        else isOnceOperation=false; 
    459459        isFirstOperation=true; 
    460  
     460         
     461           
    461462#define DECLARE_FUNCTOR(MType, mtype)              \ 
    462463   if  (operation.getValue().compare(#mtype) == 0) \ 
    463464   {                                               \ 
    464       boost::shared_ptr<func::CFunctor>            \ 
    465             foperation_(new C##MType(this->data)); \ 
    466       this->foperation = foperation_;              \ 
     465      if (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value==true) \ 
     466      { \ 
     467        boost::shared_ptr<func::CFunctor> foperation_(new C##MType(this->data,default_value)); \ 
     468        this->foperation = foperation_; \  
     469      } \ 
     470      else \ 
     471      { \ 
     472        boost::shared_ptr<func::CFunctor> foperation_(new C##MType(this->data)); \ 
     473        this->foperation = foperation_;  \ 
     474      } \ 
    467475      return;                                      \ 
    468476   } 
Note: See TracChangeset for help on using the changeset viewer.