Ignore:
Timestamp:
05/26/15 16:13:48 (9 years ago)
Author:
rlacroix
Message:

Implement reading fields from NetCDF files.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/input/nc4_data_input.cpp

    r501 r599  
    11#include "nc4_data_input.hpp" 
     2 
     3#include "context.hpp" 
     4#include "context_server.hpp" 
    25 
    36namespace xios 
    47{ 
    5       /// ////////////////////// Définitions ////////////////////// /// 
    6       CNc4DataInput::CNc4DataInput(void) 
    7       { /* ne rien faire de plus */ } 
     8  CNc4DataInput::CNc4DataInput(const StdString& filename, MPI_Comm comm_file, bool multifile, bool isCollective /*= true*/) 
     9    : SuperClass() 
     10    , SuperClassWriter(filename, &comm_file, multifile) 
     11    , comm_file(comm_file) 
     12    , filename(filename) 
     13    , isCollective(isCollective) 
     14  { 
     15    SuperClass::type = multifile ? MULTI_FILE : ONE_FILE; 
     16  } 
    817 
    9       CNc4DataInput::~CNc4DataInput(void) 
    10       { /* ne rien faire de plus */ } 
     18  CNc4DataInput::~CNc4DataInput(void) 
     19  { /* Nothing more to do */ } 
    1120 
     21  StdSize CNc4DataInput::getFieldNbRecords_(CField* field) 
     22  { 
     23    StdString fieldId = !field->name.isEmpty() ? field->name.getValue() : field->getBaseFieldReference()->getId(); 
     24 
     25    if (SuperClassWriter::isTemporal(fieldId)) 
     26    { 
     27      return SuperClassWriter::getDimensions(&fieldId)[SuperClassWriter::getUnlimitedDimensionName()]; 
     28    } 
     29 
     30    return 1; 
     31  } 
     32 
     33  void CNc4DataInput::readFieldData_(CField* field) 
     34  { 
     35    CContext* context = CContext::getCurrent(); 
     36    CContextServer* server = context->server; 
     37 
     38    CGrid* grid = field->grid; 
     39 
     40    if (!grid->doGridHaveDataToWrite()) 
     41      if (SuperClass::type==MULTI_FILE || !isCollective) return; 
     42 
     43    StdString fieldId = !field->name.isEmpty() ? field->name.getValue() : field->getBaseFieldReference()->getId(); 
     44 
     45    CArray<double,1> fieldData(grid->getWrittenDataSize()); 
     46    if (!field->default_value.isEmpty()) fieldData = field->default_value; 
     47 
     48    switch (SuperClass::type) 
     49    { 
     50      case MULTI_FILE: 
     51        SuperClassWriter::getData(fieldData, fieldId, isCollective, field->getNStep() - 1); 
     52        break; 
     53      case ONE_FILE: 
     54      { 
     55        std::vector<int> nZoomBeginGlobal = grid->getDistributionServer()->getZoomBeginGlobal(); 
     56        std::vector<int> nZoomBeginServer = grid->getDistributionServer()->getZoomBeginServer(); 
     57        std::vector<int> nZoomSizeServer  = grid->getDistributionServer()->getZoomSizeServer(); 
     58 
     59        int ssize = nZoomBeginGlobal.size(); 
     60 
     61        std::vector<StdSize> start(ssize); 
     62        std::vector<StdSize> count(ssize); 
     63 
     64        for (int i = 0; i < ssize; ++i) 
     65        { 
     66          start[i] = nZoomBeginServer[ssize - i - 1] - nZoomBeginGlobal[ssize - i - 1]; 
     67          count[i] = nZoomSizeServer[ssize - i - 1]; 
     68        } 
     69 
     70        SuperClassWriter::getData(fieldData, fieldId, isCollective, field->getNStep() - 1, &start, &count); 
     71        break; 
     72      } 
     73    } 
     74 
     75    field->inputField(fieldData); 
     76 
     77    if (!field->scale_factor.isEmpty() || !field->add_offset.isEmpty()) 
     78    { 
     79      double scaleFactor = 1.0, addOffset = 0.0; 
     80      if (!field->scale_factor.isEmpty()) scaleFactor = field->scale_factor; 
     81      if (!field->add_offset.isEmpty()) addOffset = field->add_offset; 
     82      field->invertScaleFactorAddOffset(scaleFactor, addOffset); 
     83    } 
     84  } 
     85 
     86  void CNc4DataInput::closeFile_(void) 
     87  { 
     88    SuperClassWriter::close(); 
     89  } 
    1290} // namespace xios 
Note: See TracChangeset for help on using the changeset viewer.