Changeset 1076


Ignore:
Timestamp:
03/16/17 15:04:53 (7 years ago)
Author:
mhnguyen
Message:

Correcting behavior of detecting_missing_value:

  • Missing value detection is activated only when detecting_missing_value = true

and a default_value is defined.

  • By default, undefined value by the computation of vertical (horizontal) interpolation will be NaN (not a number).

They are only converted to default_value if missing value detection is activated

Test

  • On Curie
  • Work
Location:
XIOS/trunk
Files:
24 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/inputs/REMAP/iodef.xml

    r1064 r1076  
    55   <calendar type="Gregorian" start_date="2012-03-01 15:00:00" time_origin="2012-02-28 15:00:00 + 1d" /> 
    66   <field_definition level="1" > 
    7     <field_group id="fields_src" operation="instant" default_value="100000"> 
     7    <field_group id="fields_src" operation="instant" detect_missing_value=".false."> 
    88       <field id="src_field_2D" domain_ref="src_domain" /> 
    9        <field id="src_field_2D_clone" domain_ref="src_domain_clone" detect_missing_value=".TRUE." /> 
     9       <field id="src_field_2D_clone" domain_ref="src_domain_clone" /> 
    1010       <field id="src_field_3D" domain_ref="src_domain" axis_ref="src_axis"  /> 
    11        <field id="src_field_3D_clone" grid_ref="src_grid_3D" detect_missing_value=".TRUE."  />        
     11       <field id="src_field_3D_clone" grid_ref="src_grid_3D"   />        
    1212       <field id="src_field_3D_pression" grid_ref="src_grid_3D"  /> 
    13        <field id="src_field_4D" grid_ref="src_grid_4D" detect_missing_value=".TRUE." />        
     13       <field id="src_field_4D" grid_ref="src_grid_4D" />        
    1414    </field_group> 
    1515    <field_group  id="fields_dst"> 
    1616      <field id="dst_field_2D" field_ref="src_field_2D" domain_ref="dst_domain"/> 
    1717      <field id="dst_field_2D_regular_pole" field_ref="src_field_2D" domain_ref="dst_domain_regular_pole"/> 
    18       <field id="dst_field_2D_clone" field_ref="src_field_2D_clone" domain_ref="dst_domain_regular_pole"  expr="@this" operation="average" detect_missing_value=".true."/> 
     18      <field id="dst_field_2D_clone" field_ref="src_field_2D_clone" domain_ref="dst_domain_regular_pole"  expr="@this" operation="average" /> 
    1919      <field id="dst_field_2D_extract" field_ref="src_field_3D_clone" grid_ref="dst_grid_2D_extract"/> 
    2020      <field id="dst_field_3D" field_ref="src_field_3D" grid_ref="dst_grid_3D"/> 
     
    3737        <file id="output_2D" name="output_2D" > 
    3838          <field field_ref="src_field_2D" name="field_src" /> 
    39           <field field_ref="src_field_2D_clone" name="field_src_clone" /> 
     39          <field field_ref="src_field_2D_clone" name="field_src_clone" default_value="100000" /> 
    4040          <field field_ref="src_field_2D" name="field_dst_regular_0"  domain_ref="dst_domain_regular_pole" /> 
    4141          <field field_ref="dst_field_2D" name="field_dst_regular_1" /> 
    4242          <field field_ref="dst_field_2D_regular_pole" name="field_dst_regular_2" /> 
    43           <field field_ref="dst_field_2D_clone" name="field_dst_regular_3" /> 
     43          <field field_ref="dst_field_2D_clone" name="field_dst_regular_3" detect_missing_value=".false." default_value="100000" /> 
    4444          <field field_ref="dst_field_2D_extract" name="field_dst_regular_4" /> 
    4545        </file>  
  • XIOS/trunk/src/filter/spatial_transform_filter.cpp

    r1042 r1076  
    2626      const std::vector<StdString>& auxInputs = gridTransformation->getAuxInputs(); 
    2727      size_t inputCount = 1 + (auxInputs.empty() ? 0 : auxInputs.size()); 
    28       double defaultValue  = (hasMissingValue) ? std::numeric_limits<double>::quiet_NaN() : missingValue; 
     28      double defaultValue  = (hasMissingValue) ? std::numeric_limits<double>::quiet_NaN() : 0.0; 
    2929      boost::shared_ptr<CSpatialTransformFilter> filter(new CSpatialTransformFilter(gc, engine, defaultValue, inputCount)); 
    3030 
     
    117117 
    118118    // Get default value for output data 
    119     double defaultValue = 0.0; 
    120     if (0 != dataDest.numElements()) defaultValue = dataDest(0); 
     119    bool ignoreMissingValue = false;  
     120    double defaultValue = std::numeric_limits<double>::quiet_NaN(); 
     121    if (0 != dataDest.numElements()) ignoreMissingValue = NumTraits<double>::isnan(dataDest(0)); 
    121122 
    122123    const std::list<CGridTransformation::SendingIndexGridSourceMap>& listLocalIndexSend = gridTransformation->getLocalIndexToSendFromGridSource(); 
     
    203204                         dataCurrentDest, 
    204205                         localInitFlag, 
    205                          defaultValue); 
     206                         ignoreMissingValue); 
    206207 
    207208        currentBuff += countSize; 
  • XIOS/trunk/src/test/test_remap.f90

    r1064 r1076  
    9090  DO i=1,src_ni 
    9191    src_field_3D(i,:) = src_field_2D(i) 
    92     IF ((23.5 < src_lat(i)) .AND. (src_lat(i) < 65.5) .AND. (0 < src_lon(i)) .AND. (src_lon(i) < 30)) THEN 
     92    IF ((0 < src_lat(i)) .AND. (src_lat(i) < 25.5) .AND. (30 < src_lon(i)) .AND. (src_lon(i) < 60)) THEN 
    9393      src_mask_2D(i)=.FALSE. 
    94       src_field_2D(i) = missing_value 
     94      ! src_field_2D(i) = missing_value 
    9595    ELSE 
    9696      src_mask_2D(i)=.TRUE.       
     
    192192  CALL xios_get_domain_attr("src_domain_unstructured_read", ni=src_tmp_ni, nj=src_tmp_nj) 
    193193  ALLOCATE(tmp_field_2(src_tmp_ni*src_tmp_nj)) 
    194  
    195   DO ts=1,1 
    196     CALL xios_recv_field("src_field_regular", tmp_field_0) 
    197     CALL xios_recv_field("src_field_curvilinear", tmp_field_1) 
    198     CALL xios_recv_field("src_field_unstructured", tmp_field_2) 
     194   
     195  CALL xios_recv_field("src_field_regular", tmp_field_0) 
     196  CALL xios_recv_field("src_field_curvilinear", tmp_field_1) 
     197  CALL xios_recv_field("src_field_unstructured", tmp_field_2) 
     198 
     199  DO ts=1,10 
    199200    CALL xios_update_calendar(ts) 
    200201    CALL xios_send_field("src_field_2D",src_field_2D) 
  • XIOS/trunk/src/transformation/Functions/average_reduction.cpp

    r1043 r1076  
    3030                                       const double* dataInput, 
    3131                                       CArray<double,1>& dataOut, 
    32                                        std::vector<bool>& flagInitial, 
    33                                        const double& defaultValue) 
     32                                       std::vector<bool>& flagInitial,                      
     33                                       bool ignoreMissingValue) 
    3434{ 
    35   if (resetWeight_) { weights_.resize(flagInitial.size()); weights_ = 1.0; resetWeight_ = false; } 
    36   bool hasMissingValue = NumTraits<double>::isnan(defaultValue); 
     35  if (resetWeight_) { weights_.resize(flagInitial.size()); weights_ = 1.0; resetWeight_ = false; }   
    3736 
    38   if (hasMissingValue) 
     37  if (ignoreMissingValue) 
    3938  { 
    4039    int nbLocalIndex = localIndex.size(); 
  • XIOS/trunk/src/transformation/Functions/average_reduction.hpp

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

    r1018 r1076  
    3030                                       CArray<double,1>& dataOut, 
    3131                                       std::vector<bool>& flagInitial, 
    32                                        const double& defaultValue) 
     32                                       bool ignoreMissingValue) 
    3333{ 
    3434  int nbLocalIndex = localIndex.size(); 
  • XIOS/trunk/src/transformation/Functions/extract.hpp

    r1018 r1076  
    2727                     CArray<double,1>& dataOut, 
    2828                     std::vector<bool>& flagInitial, 
    29                      const double& defaultValue); 
     29                     bool ignoreMissingValue); 
    3030 
    3131  virtual ~CExtractReductionAlgorithm() {} 
  • XIOS/trunk/src/transformation/Functions/max_reduction.cpp

    r1043 r1076  
    3131                                   CArray<double,1>& dataOut, 
    3232                                   std::vector<bool>& flagInitial, 
    33                                    const double& defaultValue) 
    34 { 
    35   bool hasMissingValue = NumTraits<double>::isnan(defaultValue); 
    36  
    37   if (hasMissingValue) 
     33                                   bool ignoreMissingValue) 
     34{  
     35  if (ignoreMissingValue) 
    3836  { 
    3937    int nbLocalIndex = localIndex.size(); 
  • XIOS/trunk/src/transformation/Functions/max_reduction.hpp

    r1018 r1076  
    2727                     CArray<double,1>& dataOut, 
    2828                     std::vector<bool>& flagInitial, 
    29                      const double& defaultValue); 
     29                     bool ignoreMissingValue); 
    3030 
    3131  virtual ~CMaxReductionAlgorithm() {} 
  • XIOS/trunk/src/transformation/Functions/min_reduction.cpp

    r1043 r1076  
    3131                                   CArray<double,1>& dataOut, 
    3232                                   std::vector<bool>& flagInitial, 
    33                                    const double& defaultValue) 
     33                                   bool ignoreMissingValue) 
    3434{ 
    35   bool hasMissingValue = NumTraits<double>::isnan(defaultValue); 
    36  
    37   if (hasMissingValue) 
     35  if (ignoreMissingValue) 
    3836  { 
    3937    int nbLocalIndex = localIndex.size(); 
  • XIOS/trunk/src/transformation/Functions/min_reduction.hpp

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

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

    r1043 r1076  
    3131                                   CArray<double,1>& dataOut, 
    3232                                   std::vector<bool>& flagInitial, 
    33                                    const double& defaultValue) 
     33                                   bool ignoreMissingValue) 
    3434{ 
    35   bool hasMissingValue = NumTraits<double>::isnan(defaultValue); 
    36  
    37   if (hasMissingValue) 
     35  if (ignoreMissingValue) 
    3836  { 
    3937    int nbLocalIndex = localIndex.size(); 
  • XIOS/trunk/src/transformation/Functions/sum_reduction.hpp

    r1018 r1076  
    2727                     CArray<double,1>& dataOut, 
    2828                     std::vector<bool>& flagInitial, 
    29                      const double& defaultValue); 
     29                     bool ignoreMissingValue); 
    3030 
    3131  virtual ~CSumReductionAlgorithm() {} 
  • XIOS/trunk/src/transformation/axis_algorithm_extract_domain.cpp

    r1018 r1076  
    6868                                        const double* dataInput, 
    6969                                        CArray<double,1>& dataOut, 
    70                                         std::vector<bool>& flagInitial, 
    71                                         const double& defaultValue) 
     70                                        std::vector<bool>& flagInitial,                      
     71                                        bool ignoreMissingValue) 
    7272{ 
    73   reduction_->apply(localIndex, dataInput, dataOut, flagInitial, defaultValue); 
     73  reduction_->apply(localIndex, dataInput, dataOut, flagInitial, ignoreMissingValue); 
    7474} 
    7575 
  • XIOS/trunk/src/transformation/axis_algorithm_extract_domain.hpp

    r933 r1076  
    3333                     const double* dataInput, 
    3434                     CArray<double,1>& dataOut, 
    35                      std::vector<bool>& flagInitial, 
    36                      const double& defaultValue); 
     35                     std::vector<bool>& flagInitial,                      
     36                     bool ignoreMissingValue); 
    3737 
    3838  virtual ~CAxisAlgorithmExtractDomain(); 
  • XIOS/trunk/src/transformation/axis_algorithm_reduce_domain.cpp

    r1018 r1076  
    7676                                       const double* dataInput, 
    7777                                       CArray<double,1>& dataOut, 
    78                                        std::vector<bool>& flagInitial, 
    79                                        const double& defaultValue) 
     78                                       std::vector<bool>& flagInitial,                      
     79                                       bool ignoreMissingValue) 
    8080{ 
    81   reduction_->apply(localIndex, dataInput, dataOut, flagInitial, defaultValue); 
     81  reduction_->apply(localIndex, dataInput, dataOut, flagInitial, ignoreMissingValue); 
    8282} 
    8383 
  • XIOS/trunk/src/transformation/axis_algorithm_reduce_domain.hpp

    r979 r1076  
    3232                     const double* dataInput, 
    3333                     CArray<double,1>& dataOut, 
    34                      std::vector<bool>& flagInitial, 
    35                      const double& defaultValue); 
     34                     std::vector<bool>& flagInitial,                      
     35                     bool ignoreMissingValue); 
    3636 
    3737  virtual void updateData(CArray<double,1>& dataOut); 
  • XIOS/trunk/src/transformation/generic_algorithm_transformation.cpp

    r1018 r1076  
    3030                                            CArray<double,1>& dataOut, 
    3131                                            std::vector<bool>& flagInitial, 
    32                                             const double& defaultValue) 
    33 { 
    34   int nbLocalIndex = localIndex.size();   
    35   bool hasMissingValue = NumTraits<double>::isnan(defaultValue);   
    36   if (hasMissingValue) 
     32                                            bool ignoreMissingValue) 
     33{ 
     34  int nbLocalIndex = localIndex.size();    
     35  double defaultValue = std::numeric_limits<double>::quiet_NaN(); 
     36  if (ignoreMissingValue) 
    3737  { 
    3838    for (int idx = 0; idx < nbLocalIndex; ++idx) 
  • XIOS/trunk/src/transformation/generic_algorithm_transformation.hpp

    r979 r1076  
    6363    \param [in/out] dataOut Array contains local data 
    6464    \param [in/out] flagInitial vector of boolean to mark the local index already initialized. True means there is a need for initalization 
     65    \param [in] ignoreMissingValue don't count missing value in operation if this flag is true 
    6566  */ 
    6667  virtual void apply(const std::vector<std::pair<int,double> >& localIndex, 
    6768                     const double* dataInput, 
    6869                     CArray<double,1>& dataOut, 
    69                      std::vector<bool>& flagInitial, 
    70                      const double& defaultValue); 
     70                     std::vector<bool>& flagInitial,                      
     71                     bool ignoreMissingValue); 
    7172 
    7273  /*! 
  • XIOS/trunk/src/transformation/scalar_algorithm_extract_axis.cpp

    r1018 r1076  
    5555                                         const double* dataInput, 
    5656                                         CArray<double,1>& dataOut, 
    57                                          std::vector<bool>& flagInitial, 
    58                                          const double& defaultValue) 
     57                                         std::vector<bool>& flagInitial,                      
     58                                         bool ignoreMissingValue) 
    5959{ 
    60   reduction_->apply(localIndex, dataInput, dataOut, flagInitial, defaultValue); 
     60  reduction_->apply(localIndex, dataInput, dataOut, flagInitial, ignoreMissingValue); 
    6161} 
    6262 
  • XIOS/trunk/src/transformation/scalar_algorithm_extract_axis.hpp

    r980 r1076  
    3232                     const double* dataInput, 
    3333                     CArray<double,1>& dataOut, 
    34                      std::vector<bool>& flagInitial, 
    35                      const double& defaultValue); 
     34                     std::vector<bool>& flagInitial,                      
     35                     bool ignoreMissingValue); 
    3636 
    3737  virtual ~CScalarAlgorithmExtractAxis(); 
  • XIOS/trunk/src/transformation/scalar_algorithm_reduce_domain.cpp

    r1018 r1076  
    8181                                         const double* dataInput, 
    8282                                         CArray<double,1>& dataOut, 
    83                                          std::vector<bool>& flagInitial, 
    84                                          const double& defaultValue) 
     83                                         std::vector<bool>& flagInitial,                      
     84                                         bool ignoreMissingValue) 
    8585{ 
    86   reduction_->apply(localIndex, dataInput, dataOut, flagInitial, defaultValue); 
     86  reduction_->apply(localIndex, dataInput, dataOut, flagInitial, ignoreMissingValue); 
    8787} 
    8888 
  • XIOS/trunk/src/transformation/scalar_algorithm_reduce_domain.hpp

    r979 r1076  
    3232                     const double* dataInput, 
    3333                     CArray<double,1>& dataOut, 
    34                      std::vector<bool>& flagInitial, 
    35                      const double& defaultValue); 
     34                     std::vector<bool>& flagInitial,                      
     35                     bool ignoreMissingValue); 
    3636 
    3737  virtual void updateData(CArray<double,1>& dataOut); 
Note: See TracChangeset for help on using the changeset viewer.