Ignore:
Timestamp:
08/25/15 16:52:45 (9 years ago)
Author:
rlacroix
Message:

Add support for indexed output.

If the new field attribute "indexed_output" is set to true and a mask is defined (either at grid, domain or axis level), the indexed data will be outputed instead of the full data with missing values.

See http://cfconventions.org/Data/cf-conventions/cf-conventions-1.5/build/cf-conventions.html#compression-by-gathering for more information.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/node/grid.cpp

    r671 r676  
    2525      : CObjectTemplate<CGrid>(), CGridAttributes() 
    2626      , isChecked(false), isDomainAxisChecked(false) 
    27       , vDomainGroup_(), vAxisGroup_(), axisList_(), isAxisListSet(false), isDomListSet(false), clientDistribution_(0), isIndexSent(false) 
    28       , serverDistribution_(0), clientServerMap_(0), writtenDataSize_(0), globalDim_() 
    29       , connectedDataSize_(), connectedServerRank_(), isDataDistributed_(true), transformations_(0), isTransformed_(false) 
     27      , vDomainGroup_(), vAxisGroup_(), axisList_(), isAxisListSet(false), isDomListSet(false) 
     28      , clientDistribution_(0), isIndexSent(false) , serverDistribution_(0), clientServerMap_(0) 
     29      , writtenDataSize_(0), numberWrittenIndexes_(0), totalNumberWrittenIndexes_(0), offsetWrittenIndexes_(0) 
     30      , globalDim_(), connectedDataSize_(), connectedServerRank_(), isDataDistributed_(true), isCompressible_(false) 
     31      , transformations_(0), isTransformed_(false) 
    3032      , axisPositionInGrid_(), positionDimensionDistributed_(1) 
    3133   { 
     
    3739      : CObjectTemplate<CGrid>(id), CGridAttributes() 
    3840      , isChecked(false), isDomainAxisChecked(false) 
    39       , vDomainGroup_(), vAxisGroup_(), axisList_(), isAxisListSet(false), isDomListSet(false), clientDistribution_(0), isIndexSent(false) 
    40       , serverDistribution_(0), clientServerMap_(0), writtenDataSize_(0), globalDim_() 
    41       , connectedDataSize_(), connectedServerRank_(), isDataDistributed_(true), transformations_(0), isTransformed_(false) 
     41      , vDomainGroup_(), vAxisGroup_(), axisList_(), isAxisListSet(false), isDomListSet(false) 
     42      , clientDistribution_(0), isIndexSent(false) , serverDistribution_(0), clientServerMap_(0) 
     43      , writtenDataSize_(0), numberWrittenIndexes_(0), totalNumberWrittenIndexes_(0), offsetWrittenIndexes_(0) 
     44      , globalDim_(), connectedDataSize_(), connectedServerRank_(), isDataDistributed_(true), isCompressible_(false) 
     45      , transformations_(0), isTransformed_(false) 
    4246      , axisPositionInGrid_(), positionDimensionDistributed_(1) 
    4347   { 
     
    149153   } 
    150154 
     155   //--------------------------------------------------------------- 
     156 
     157   /*! 
     158    * Test whether the data defined on the grid can be outputted in a compressed way. 
     159    *  
     160    * \return true if and only if a mask was defined for this grid 
     161    */ 
     162   bool CGrid::isCompressible(void) const 
     163   { 
     164      return isCompressible_; 
     165   } 
     166 
     167   //--------------------------------------------------------------- 
     168 
     169   void CGrid::addRelFileCompressed(const StdString& filename) 
     170   { 
     171      this->relFilesCompressed.insert(filename); 
     172   } 
     173 
     174   bool CGrid::isWrittenCompressed(const StdString& filename) const 
     175   { 
     176      return (this->relFilesCompressed.find(filename) != this->relFilesCompressed.end()); 
     177   } 
     178 
     179   //--------------------------------------------------------------- 
     180 
    151181   void CGrid::solveDomainAxisRef(bool areAttributesChecked) 
    152182   { 
     
    157187     computeGridGlobalDimension(getDomains(), getAxis(), axis_domain_order); 
    158188     this->isDomainAxisChecked = areAttributesChecked; 
     189   } 
     190 
     191   void CGrid::checkEligibilityForCompressedOutput() 
     192   { 
     193     // We don't check if the mask is valid here, just if a mask has been defined at this point. 
     194     isCompressible_ = !mask1.isEmpty() || !mask2.isEmpty() || !mask3.isEmpty(); 
    159195   } 
    160196 
     
    488524   } 
    489525 
     526   void CGrid::outputCompressedField(int rank, const CArray<double,1>& stored, double* field) 
     527   { 
     528     const CArray<size_t,1>& out_i = compressedOutIndexFromClient[rank]; 
     529     StdSize numElements = stored.numElements(); 
     530     for (StdSize n = 0; n < numElements; ++n) 
     531     { 
     532       field[out_i(n)] = stored(n); 
     533     } 
     534   } 
     535 
    490536   //---------------------------------------------------------------- 
    491537 
     
    518564    } 
    519565    isDataDistributed_ = false; 
     566  } 
     567 
     568  void CGrid::computeCompressedIndex() 
     569  { 
     570    compressedOutIndexFromClient = outIndexFromClient; 
     571 
     572    std::map<size_t, size_t> indexes; 
     573 
     574    { 
     575      std::map<int, CArray<size_t,1> >::const_iterator it = compressedOutIndexFromClient.begin(); 
     576      std::map<int, CArray<size_t,1> >::const_iterator itEnd = compressedOutIndexFromClient.end(); 
     577      for (; it != itEnd; ++it) 
     578      { 
     579        for (int i = 0; i < it->second.numElements(); ++i) 
     580          indexes.insert(std::make_pair(it->second(i), 0)); 
     581      } 
     582    } 
     583 
     584    { 
     585      std::map<size_t, size_t>::iterator it = indexes.begin(); 
     586      std::map<size_t, size_t>::iterator itEnd = indexes.end(); 
     587      for (size_t i = 0; it != itEnd; ++it, ++i) 
     588        it->second = i; 
     589    } 
     590 
     591    { 
     592      std::map<int, CArray<size_t,1> >::iterator it = compressedOutIndexFromClient.begin(); 
     593      std::map<int, CArray<size_t,1> >::iterator itEnd = compressedOutIndexFromClient.end(); 
     594      for (; it != itEnd; ++it) 
     595      { 
     596        for (int i = 0; i < it->second.numElements(); ++i) 
     597          it->second(i) = indexes[it->second(i)]; 
     598      } 
     599    } 
    520600  } 
    521601 
     
    547627 
    548628        listMsg.push_back(CMessage()); 
    549         listMsg.back() << getId( )<< isDataDistributed_ << listOutIndex.back(); 
     629        listMsg.back() << getId( )<< isDataDistributed_ << isCompressible_ << listOutIndex.back(); 
    550630 
    551631        event.push(rank, 1, listMsg.back()); 
     
    589669 
    590670          listMsg.push_back(CMessage()); 
    591           listMsg.back() << getId() << isDataDistributed_ << listOutIndex.back(); 
     671          listMsg.back() << getId() << isDataDistributed_ << isCompressible_ << listOutIndex.back(); 
    592672 
    593673          event.push(rank, 1, listMsg.back()); 
     
    650730 
    651731        listMsg.push_back(CMessage()); 
    652         listMsg.back() << getId() << isDataDistributed_ << listOutIndex.back(); 
     732        listMsg.back() << getId() << isDataDistributed_ << isCompressible_ << listOutIndex.back(); 
    653733 
    654734        event.push(rank, nbSenders[rank], listMsg.back()); 
     
    741821  } 
    742822 
     823  /*! 
     824    Returns the number of indexes written by each server. 
     825    \return the number of indexes written by each server 
     826  */ 
     827  int CGrid::getNumberWrittenIndexes() const 
     828  { 
     829    return numberWrittenIndexes_; 
     830  } 
     831 
     832  /*! 
     833    Returns the total number of indexes written by the servers. 
     834    \return the total number of indexes written by the servers 
     835  */ 
     836  int CGrid::getTotalNumberWrittenIndexes() const 
     837  { 
     838    return totalNumberWrittenIndexes_; 
     839  } 
     840 
     841  /*! 
     842    Returns the offset of indexes written by each server. 
     843    \return the offset of indexes written by each server 
     844  */ 
     845  int CGrid::getOffsetWrittenIndexes() const 
     846  { 
     847    return offsetWrittenIndexes_; 
     848  } 
     849 
    743850  const CDistributionServer* CGrid::getDistributionServer() const 
    744851  { 
     
    762869    CContext* context = CContext::getCurrent(); 
    763870    CContextServer* server = context->server; 
     871    numberWrittenIndexes_ = totalNumberWrittenIndexes_ = offsetWrittenIndexes_ = 0; 
    764872 
    765873    for (int n = 0; n < ranks.size(); n++) 
     
    768876      CBufferIn& buffer = *buffers[n]; 
    769877 
    770       buffer >> isDataDistributed_; 
     878      buffer >> isDataDistributed_ >> isCompressible_; 
    771879      size_t dataSize = 0; 
    772880 
    773881      if (isScalarGrid()) 
    774882      { 
    775         writtenDataSize_ = 1; 
     883        writtenDataSize_ = numberWrittenIndexes_ = totalNumberWrittenIndexes_ = 1; 
    776884        CArray<size_t,1> outIndex; 
    777885        buffer >> outIndex; 
     
    849957      outIndexFromClient.insert(std::make_pair(rank, outIndex)); 
    850958      connectedDataSize_[rank] = outIndex.numElements(); 
    851     } 
     959      numberWrittenIndexes_ += outIndex.numElements(); 
     960    } 
     961 
     962    if (isDataDistributed_) 
     963    { 
     964      MPI_Allreduce(&numberWrittenIndexes_, &totalNumberWrittenIndexes_, 1, MPI_INT, MPI_SUM, server->intraComm); 
     965      MPI_Scan(&numberWrittenIndexes_, &offsetWrittenIndexes_, 1, MPI_INT, MPI_SUM, server->intraComm); 
     966      offsetWrittenIndexes_ -= numberWrittenIndexes_; 
     967    } 
     968    else 
     969      totalNumberWrittenIndexes_ = numberWrittenIndexes_; 
    852970 
    853971    nbSenders = CClientServerMappingDistributed::computeConnectedClients(context->client->serverSize, context->client->clientSize, context->client->intraComm, ranks); 
Note: See TracChangeset for help on using the changeset viewer.