Changeset 1186


Ignore:
Timestamp:
06/28/17 15:25:20 (4 years ago)
Author:
rlacroix
Message:

Fix: Ensure "detect_missing_value" is always applied.

Missing values are know handled as expected for input fields (both from file or from model).

Location:
XIOS/trunk/src
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/filter/file_writer_filter.cpp

    r1119 r1186  
    1717  void CFileWriterFilter::onInputReady(std::vector<CDataPacketPtr> data) 
    1818  { 
    19     bool ignoreMissingValue = (!field->detect_missing_value.isEmpty() &&  
    20                                !field->default_value.isEmpty() &&  
    21                                field->detect_missing_value == true); 
    22     if (ignoreMissingValue) 
     19    CDataPacketPtr packet = data[0]; 
     20 
     21    const bool detectMissingValue = (!field->detect_missing_value.isEmpty() 
     22                                      && !field->default_value.isEmpty() 
     23                                      && field->detect_missing_value == true); 
     24    if (detectMissingValue) 
    2325    { 
    24       double missingValue = field->default_value; 
    25       size_t nbData = data[0]->data.numElements(); 
     26      const double missingValue = field->default_value; 
     27      const size_t nbData = packet->data.numElements(); 
    2628      for (size_t idx = 0; idx < nbData; ++idx) 
    2729      { 
    28         if (NumTraits<double>::isnan(data[0]->data(idx))) 
    29           data[0]->data(idx) = missingValue; 
     30        if (NumTraits<double>::isnan(packet->data(idx))) 
     31          packet->data(idx) = missingValue; 
    3032      } 
    31     }     
     33    } 
    3234 
    33     field->sendUpdateData(data[0]->data); 
     35    field->sendUpdateData(packet->data); 
    3436  } 
    3537 
  • XIOS/trunk/src/filter/source_filter.cpp

    r1018 r1186  
    3737    if (hasMissingValue) 
    3838    { 
    39       double nanValue = std::numeric_limits<double>::quiet_NaN(); 
    40       size_t nbData = packet->data.numElements(); 
     39      const double nanValue = std::numeric_limits<double>::quiet_NaN(); 
     40      const size_t nbData = packet->data.numElements(); 
    4141      for (size_t idx = 0; idx < nbData; ++idx) 
    4242      { 
     
    8282    } 
    8383 
     84    // Convert missing values to NaN 
     85    if (hasMissingValue) 
     86    { 
     87      const double nanValue = std::numeric_limits<double>::quiet_NaN(); 
     88      const size_t nbData = packet->data.numElements(); 
     89      for (size_t idx = 0; idx < nbData; ++idx) 
     90      { 
     91        if (defaultValue == packet->data(idx)) 
     92          packet->data(idx) = nanValue; 
     93      } 
     94    } 
     95 
    8496    onOutputReady(packet); 
    8597  } 
  • XIOS/trunk/src/filter/source_filter.hpp

    r1018 r1186  
    6262      CGrid* grid; //!< The grid attached to the data the filter can accept 
    6363      const CDuration offset; //!< The offset applied to the timestamp of all packets 
    64       bool hasMissingValue; 
    65       double defaultValue; 
     64      const bool hasMissingValue; 
     65      const double defaultValue; 
    6666  }; // class CSourceFilter 
    6767} // namespace xios 
  • XIOS/trunk/src/filter/store_filter.cpp

    r1119 r1186  
    66namespace xios 
    77{ 
    8   CStoreFilter::CStoreFilter(CGarbageCollector& gc, CContext* context, CGrid* grid) 
     8  CStoreFilter::CStoreFilter(CGarbageCollector& gc, CContext* context, CGrid* grid, 
     9                             bool detectMissingValues /*= false*/, double missingValue /*= 0.0*/) 
    910    : CInputPin(gc, 1) 
    1011    , gc(gc) 
    1112    , context(context) 
    1213    , grid(grid) 
     14    , detectMissingValues(detectMissingValues) 
     15    , missingValue(missingValue) 
    1316  { 
    1417    if (!context) 
     
    7578  void CStoreFilter::onInputReady(std::vector<CDataPacketPtr> data) 
    7679  { 
    77     packets.insert(std::make_pair(data[0]->timestamp, data[0])); 
     80    CDataPacketPtr packet = data[0]; 
     81 
     82    packets.insert(std::make_pair(packet->timestamp, packet)); 
    7883    // The packet is always destroyed by the garbage collector 
    7984    // so we register but never unregister 
    80     gc.registerObject(this, data[0]->timestamp); 
     85    gc.registerObject(this, packet->timestamp); 
     86 
     87    if (detectMissingValues) 
     88    { 
     89      const size_t nbData = packet->data.numElements(); 
     90      for (size_t idx = 0; idx < nbData; ++idx) 
     91      { 
     92        if (NumTraits<double>::isnan(packet->data(idx))) 
     93          packet->data(idx) = missingValue; 
     94      } 
     95    } 
    8196  } 
    8297 
  • XIOS/trunk/src/filter/store_filter.hpp

    r1119 r1186  
    2222       * \param context the context to which the data belongs 
    2323       * \param grid the grid to which the data is attached 
     24       * \param detectMissingValues whether missing values should be detected 
     25       * \param missingValue the value to use to replace missing values 
    2426       */ 
    25       CStoreFilter(CGarbageCollector& gc, CContext* context, CGrid* grid); 
     27      CStoreFilter(CGarbageCollector& gc, CContext* context, CGrid* grid, 
     28                   bool detectMissingValues = false, double missingValue = 0.0); 
    2629 
    2730      /*! 
     
    7578      CContext* context; //!< The context to which the data belongs 
    7679      CGrid* grid; //!< The grid attached to the data the filter can accept 
     80      const bool detectMissingValues; //!< Whether missing values should be detected 
     81      const double missingValue; //!< The value to use to replace missing values 
    7782      std::map<Time, CDataPacketPtr> packets; //<! The stored packets 
    7883  }; // class CStoreFilter 
  • XIOS/trunk/src/node/field.cpp

    r1181 r1186  
    788788     if (!areAllReferenceSolved) solveAllReferenceEnabledField(false); 
    789789 
     790     const bool detectMissingValues = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true); 
     791     const double defaultValue  = detectMissingValues ? default_value : (!default_value.isEmpty() ? default_value : 0.0); 
     792 
    790793     // Start by building a filter which can provide the field's instant data 
    791794     if (!instantDataFilter) 
     
    804807           if (grid && grid != gridRef && grid->hasTransform()) 
    805808           { 
    806              bool hasMissingValue = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true); 
    807              double defaultValue  = hasMissingValue ? default_value : (!default_value.isEmpty() ? default_value : 0.0); 
    808              std::pair<boost::shared_ptr<CFilter>, boost::shared_ptr<CFilter> > filters = CSpatialTransformFilter::buildFilterGraph(gc, gridRef, grid, hasMissingValue, defaultValue); 
     809             std::pair<boost::shared_ptr<CFilter>, boost::shared_ptr<CFilter> > filters = CSpatialTransformFilter::buildFilterGraph(gc, gridRef, grid, detectMissingValues, defaultValue); 
    809810 
    810811             filter->connectOutput(filters.first, 0); 
     
    822823         instantDataFilter = serverSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid, 
    823824                                                                                                     freq_offset.isEmpty() ? NoneDu : freq_offset, 
    824                                                                                                      true)); 
     825                                                                                                     true, 
     826                                                                                                     detectMissingValues, defaultValue)); 
    825827       else // The data might be passed from the model 
    826828       { 
    827829          if (check_if_active.isEmpty()) check_if_active = false; 
    828           bool ignoreMissingValue = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true); 
    829           double defaultValue  = ignoreMissingValue ? default_value : (!default_value.isEmpty() ? default_value : 0.0); 
    830830          instantDataFilter = clientSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid, NoneDu, false, 
    831                                                                                                       ignoreMissingValue, defaultValue));       } 
     831                                                                                                      detectMissingValues, defaultValue)); 
     832       } 
    832833     } 
    833834 
     
    837838       if (!read_access.isEmpty() && read_access) 
    838839       { 
    839          storeFilter = boost::shared_ptr<CStoreFilter>(new CStoreFilter(gc, CContext::getCurrent(), grid)); 
     840         storeFilter = boost::shared_ptr<CStoreFilter>(new CStoreFilter(gc, CContext::getCurrent(), grid, 
     841                                                                        detectMissingValues, defaultValue)); 
    840842         instantDataFilter->connectOutput(storeFilter, 0); 
    841843       } 
     
    898900     if (!selfReferenceFilter) 
    899901     { 
     902       const bool detectMissingValues = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true); 
     903       const double defaultValue  = detectMissingValues ? default_value : (!default_value.isEmpty() ? default_value : 0.0); 
     904 
    900905       if (file && !file->mode.isEmpty() && file->mode == CFile::mode_attr::read) 
    901906       { 
     
    903908           serverSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid, 
    904909                                                                                   freq_offset.isEmpty() ? NoneDu : freq_offset, 
    905                                                                                    true)); 
     910                                                                                   true, 
     911                                                                                   detectMissingValues, defaultValue)); 
    906912 
    907913         selfReferenceFilter = serverSourceFilter; 
     
    918924         { 
    919925           if (check_if_active.isEmpty()) check_if_active = false; 
    920            bool ignoreMissingValue = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true); 
    921            double defaultValue  = ignoreMissingValue ? default_value : (!default_value.isEmpty() ? default_value : 0.0);  
    922926           clientSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid, NoneDu, false, 
    923                                                                                    ignoreMissingValue, defaultValue)); 
     927                                                                                   detectMissingValues, defaultValue)); 
    924928         } 
    925929 
     
    955959         freq_offset.setValue(NoneDu); 
    956960 
    957        const bool ignoreMissingValue = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true); 
     961       const bool detectMissingValues = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true); 
    958962        
    959963       boost::shared_ptr<CTemporalFilter> temporalFilter(new CTemporalFilter(gc, operation, 
    960964                                                                             CContext::getCurrent()->getCalendar()->getInitDate(), 
    961965                                                                             freq_op, freq_offset, outFreq, 
    962                                                                              ignoreMissingValue, ignoreMissingValue ? default_value : 0.0)); 
     966                                                                             detectMissingValues, detectMissingValues ? default_value : 0.0)); 
    963967       instantDataFilter->connectOutput(temporalFilter, 0); 
    964968 
     
    995999       if (freq_offset.isEmpty()) freq_offset.setValue(NoneDu); 
    9961000 
    997        const bool ignoreMissingValue = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true); 
     1001       const bool detectMissingValues = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true); 
    9981002 
    9991003       boost::shared_ptr<CTemporalFilter> temporalFilter(new CTemporalFilter(gc, operation, 
    10001004                                                                             CContext::getCurrent()->getCalendar()->getInitDate(), 
    10011005                                                                             freq_op, freq_offset, outFreq, 
    1002                                                                              ignoreMissingValue, ignoreMissingValue ? default_value : 0.0)); 
     1006                                                                             detectMissingValues, detectMissingValues ? default_value : 0.0)); 
    10031007       selfReferenceFilter->connectOutput(temporalFilter, 0); 
    10041008       return temporalFilter ; 
Note: See TracChangeset for help on using the changeset viewer.