Ignore:
Timestamp:
06/28/17 15:25:20 (7 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).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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.