Changeset 1315


Ignore:
Timestamp:
10/25/17 16:36:53 (7 years ago)
Author:
rlacroix
Message:

Fix the default "freq_offset" for fields read from files.

Also throw an error when trying to use an invalid operation for such fields (currently only "instant" are supported).

Location:
XIOS
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/XIOS_DEV_CMIP6/src/node/field.cpp

    r1308 r1315  
    942942    if (!isReferenceSolvedAndTransformed) solveAllEnabledFieldsAndTransform(); 
    943943 
     944     checkAttributes(); 
     945 
    944946     const bool detectMissingValues = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true); 
    945947     const double defaultValue  = detectMissingValues ? default_value : (!default_value.isEmpty() ? default_value : 0.0); 
     
    10121014         // Check if the data is to be read from a file 
    10131015         else if (file && !file->mode.isEmpty() && file->mode == CFile::mode_attr::read) 
    1014            instantDataFilter = serverSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid, true, 
    1015                                                                                                        freq_offset.isEmpty() ? NoneDu : freq_offset, 
    1016                                                                                                        true, 
     1016           instantDataFilter = serverSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid, true, freq_offset, true, 
    10171017                                                                                                       detectMissingValues, defaultValue)); 
    10181018         else // The data might be passed from the model 
     
    10921092     if (!selfReferenceFilter) 
    10931093     { 
     1094       checkAttributes(); 
     1095 
    10941096       const bool detectMissingValues = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true); 
    10951097       const double defaultValue  = detectMissingValues ? default_value : (!default_value.isEmpty() ? default_value : 0.0); 
     
    10981100       { 
    10991101         if (!serverSourceFilter) 
    1100            serverSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid, true, 
    1101                                                                                    freq_offset.isEmpty() ? NoneDu : freq_offset, 
    1102                                                                                    true, 
     1102           serverSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid, true, freq_offset, true, 
    11031103                                                                                   detectMissingValues, defaultValue)); 
    11041104 
     
    11461146               << "An operation must be defined for field \"" << getId() << "\"."); 
    11471147 
     1148       checkAttributes(); 
     1149 
    11481150       const bool detectMissingValues = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true); 
    1149        checkAttributes() ;    
    11501151       boost::shared_ptr<CTemporalFilter> temporalFilter(new CTemporalFilter(gc, operation, 
    11511152                                                                             CContext::getCurrent()->getCalendar()->getInitDate(), 
     
    11841185               << "An operation must be defined for field \"" << getId() << "\"."); 
    11851186 
     1187       checkAttributes(); 
     1188 
    11861189       const bool detectMissingValues = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true); 
    1187        checkAttributes() ;    
    11881190       boost::shared_ptr<CTemporalFilter> temporalFilter(new CTemporalFilter(gc, operation, 
    11891191                                                                             CContext::getCurrent()->getCalendar()->getInitDate(), 
     
    15761578   void CField::checkAttributes(void) 
    15771579   { 
     1580     bool isFieldRead = file && !file->mode.isEmpty() && file->mode == CFile::mode_attr::read; 
     1581     if (isFieldRead && operation.getValue() != "instant") 
     1582       ERROR("void CField::checkAttributes(void)", 
     1583             << "Unsupported operation for field '" << getFieldOutputName() << "'." << std::endl 
     1584             << "Currently only \"instant\" is supported for fields read from file.") 
     1585 
    15781586     if (freq_op.isEmpty()) 
    15791587     { 
    1580        if (operation.getValue()=="instant") 
     1588       if (operation.getValue() == "instant") 
    15811589         freq_op.setValue(file->output_freq.getValue()); 
    15821590       else 
     
    15841592     } 
    15851593     if (freq_offset.isEmpty()) 
    1586        freq_offset.setValue(freq_op.getValue()-TimeStep); 
     1594       freq_offset.setValue(isFieldRead ? NoneDu : (freq_op.getValue() - TimeStep)); 
    15871595   } 
    15881596 
  • XIOS/trunk/src/node/field.cpp

    r1307 r1315  
    788788     if (!areAllReferenceSolved) solveAllReferenceEnabledField(false); 
    789789 
     790     checkAttributes(); 
     791 
    790792     const bool detectMissingValues = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true); 
    791793     const double defaultValue  = detectMissingValues ? default_value : (!default_value.isEmpty() ? default_value : 0.0); 
     
    821823       // Check if the data is to be read from a file 
    822824       else if (file && !file->mode.isEmpty() && file->mode == CFile::mode_attr::read) 
    823          instantDataFilter = serverSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid, 
    824                                                                                                      freq_offset.isEmpty() ? NoneDu : freq_offset, 
    825                                                                                                      true, 
     825         instantDataFilter = serverSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid, freq_offset, true, 
    826826                                                                                                     detectMissingValues, defaultValue)); 
    827827       else // The data might be passed from the model 
     
    900900     if (!selfReferenceFilter) 
    901901     { 
     902       checkAttributes(); 
     903 
    902904       const bool detectMissingValues = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true); 
    903905       const double defaultValue  = detectMissingValues ? default_value : (!default_value.isEmpty() ? default_value : 0.0); 
     
    906908       { 
    907909         if (!serverSourceFilter) 
    908            serverSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid, 
    909                                                                                    freq_offset.isEmpty() ? NoneDu : freq_offset, 
    910                                                                                    true, 
     910           serverSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid, freq_offset, true, 
    911911                                                                                   detectMissingValues, defaultValue)); 
    912912 
     
    954954               << "An operation must be defined for field \"" << getId() << "\"."); 
    955955 
     956       checkAttributes(); 
     957 
    956958       const bool detectMissingValues = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true); 
    957        checkAttributes() ; 
    958959       boost::shared_ptr<CTemporalFilter> temporalFilter(new CTemporalFilter(gc, operation, 
    959960                                                                             CContext::getCurrent()->getCalendar()->getInitDate(), 
     
    991992               << "An operation must be defined for field \"" << getId() << "\"."); 
    992993 
     994       checkAttributes(); 
     995 
    993996       const bool detectMissingValues = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true); 
    994        checkAttributes(); 
    995997       boost::shared_ptr<CTemporalFilter> temporalFilter(new CTemporalFilter(gc, operation, 
    996998                                                                             CContext::getCurrent()->getCalendar()->getInitDate(), 
     
    14421444   void CField::checkAttributes(void) 
    14431445   { 
     1446     bool isFieldRead = file && !file->mode.isEmpty() && file->mode == CFile::mode_attr::read; 
     1447     if (isFieldRead && operation.getValue() != "instant") 
     1448       ERROR("void CField::checkAttributes(void)", 
     1449             << "Unsupported operation for field '" << getFieldOutputName() << "'." << std::endl 
     1450             << "Currently only \"instant\" is supported for fields read from file.") 
     1451 
    14441452     if (freq_op.isEmpty()) 
    14451453     { 
    1446        if (operation.getValue()=="instant") 
     1454       if (operation.getValue() == "instant") 
    14471455         freq_op.setValue(file->output_freq.getValue()); 
    14481456       else 
     
    14501458     } 
    14511459     if (freq_offset.isEmpty()) 
    1452        freq_offset.setValue(freq_op.getValue()-TimeStep); 
     1460       freq_offset.setValue(isFieldRead ? NoneDu : (freq_op.getValue() - TimeStep)); 
    14531461   } 
    14541462 
Note: See TracChangeset for help on using the changeset viewer.