Ignore:
Timestamp:
10/12/16 11:17:49 (8 years ago)
Author:
mhnguyen
Message:

Ticket 106: Reading a scalar from file

+) Add method to read scalar value
+) Modify the way to send/receive scalar (and non-distributed) data

Test
+) On Curie
+) OK

File:
1 edited

Legend:

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

    r963 r967  
    66#include "domain.hpp" 
    77#include "axis.hpp" 
     8#include "scalar.hpp" 
    89 
    910namespace xios 
     
    1718    , readMetaDataDomains_(), readValueDomains_() 
    1819    , readMetaDataAxis_(), readValueAxis_() 
     20    , readMetaDataScalar_(), readValueScalar_() 
    1921  { 
    2022    SuperClass::type = multifile ? MULTI_FILE : ONE_FILE; 
     
    113115            count.push_back(nZoomSizeServer[idx]); 
    114116            --idx; 
    115            } 
     117          } 
     118          else 
     119          { 
     120            if (1 == axisDomainOrder.numElements()) 
     121            { 
     122              start.push_back(0); 
     123              count.push_back(1); 
     124            } 
     125            --idx; 
     126          } 
    116127        } 
    117128 
     
    140151    std::vector<CDomain*> domainP = grid->getDomains(); 
    141152    std::vector<CAxis*> axisP = grid->getAxis(); 
     153    std::vector<CScalar*> scalarP = grid->getScalars(); 
    142154    int gridDim = domainP.size() * 2 + axisP.size(); 
     155 
     156    // Nothing to do with scalar without timestep 
     157    if ((0 == gridDim) && (!SuperClassWriter::isTemporal(fieldId)))  
     158      return; 
    143159 
    144160    // Verify the compatibility of dimension of declared grid and real grid in file 
     
    163179    } 
    164180 
    165     int mapSize = dimSizeMap.size() - 1; 
    166181    std::list<std::pair<StdString, StdSize> > listDimSize; 
    167182/* 
     
    174189    // Now process domain and axis 
    175190    CArray<int,1> axisDomainOrder = grid->axis_domain_order; 
    176     int numElement = domainP.size() + axisP.size(); 
     191    int numElement = domainP.size() + axisP.size() + scalarP.size(); 
    177192    int elementPosition = 0; 
    178     int idxDomain = 0, idxAxis = 0; 
     193    int idxDomain = 0, idxAxis = 0, idxScalar = 0; 
    179194 
    180195    std::pair<std::set<StdString>::iterator,bool> it; 
     
    210225        } 
    211226        ++idxAxis; 
     227        ++elementPosition; 
     228      } 
     229      else 
     230      { 
     231        if (readAttributeValues) 
     232        { 
     233          it = readValueScalar_.insert(scalarP[idxScalar]->getId()); 
     234          if (it.second) readScalarAttributeValueFromFile(scalarP[idxScalar], listDimSize, elementPosition, fieldId); 
     235        } 
     236        else 
     237        { 
     238          it = readMetaDataScalar_.insert(scalarP[idxScalar]->getId()); 
     239          if (it.second) readScalarAttributesFromFile(scalarP[idxScalar], listDimSize, elementPosition, fieldId); 
     240        } 
     241        ++idxScalar; 
    212242        ++elementPosition; 
    213243      } 
     
    443473  } 
    444474 
     475  /*! 
     476    Read attributes of a scalar from a file 
     477    \param [in] scalar scalar whose attributes are read from the file 
     478    \param [in] dimSizeMap Dimensions and and their corresponding names and size read from file 
     479    \param [in] emelentPosition position of scalar in grid 
     480    \param [in] fieldId id (or name) associated with the grid 
     481  */ 
     482  void CNc4DataInput::readScalarAttributesFromFile(CScalar* scalar, std::list<std::pair<StdString, StdSize> >& dimSizeMap, 
     483                                                  int elementPosition, const StdString& fieldId) 
     484  { 
     485//    std::list<std::pair<StdString, StdSize> >::const_iterator itMapN = dimSizeMap.begin(), 
     486//                                                              iteMap = dimSizeMap.end(); 
     487//    for (int i = 0; i < elementPosition; ++i, ++itMapN) {} 
     488//    axis->n_glo.setValue(itMapN->second); 
     489  } 
     490 
     491  /*! 
     492    Read attribute value of an axis from a file 
     493    \param [in] axis axis whose attributes are read from the file 
     494    \param [in] dimSizeMap Dimensions and and their corresponding names and size read from file 
     495    \param [in] emelentPosition position of axis in grid 
     496    \param [in] fieldId id (or name) associated with the grid 
     497  */ 
     498  void CNc4DataInput::readScalarAttributeValueFromFile(CScalar* scalar, std::list<std::pair<StdString, StdSize> >& dimSizeMap, 
     499                                                      int elementPosition, const StdString& fieldId) 
     500  { 
     501//    std::list<std::pair<StdString, StdSize> >::const_iterator itMapN = dimSizeMap.begin(), 
     502//                                                              iteMap = dimSizeMap.end(); 
     503//    for (int i = 0; i < elementPosition; ++i, ++itMapN) {} 
     504// 
     505//    { // Read axis value 
     506//      std::vector<StdSize> nBegin(1, 0), nSize(1, itMapN->second); 
     507//      CArray<double,1> readAxisValue(itMapN->second); 
     508//      readFieldVariableValue(readAxisValue, itMapN->first, nBegin, nSize, true); 
     509//      int begin = 0, n = itMapN->second; 
     510//      if (!axis->begin.isEmpty()) begin = axis->begin.getValue(); 
     511//      if (!axis->n.isEmpty()) n = axis->n.getValue(); 
     512//      axis->value.resize(n); 
     513//      for (int i = 0; i < n; ++i) axis->value(i) = readAxisValue(begin + i); 
     514//    } 
     515  } 
     516 
    445517  void CNc4DataInput::closeFile_(void) 
    446518  { 
Note: See TracChangeset for help on using the changeset viewer.