Changeset 1961


Ignore:
Timestamp:
10/12/20 11:26:40 (4 years ago)
Author:
ymipsl
Message:

Rewrite file writing filter.
YM

Location:
XIOS/dev/dev_ym/XIOS_COUPLING/src
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/data_output.cpp

    r1882 r1961  
    122122      //---------------------------------------------------------------- 
    123123 
    124       void CDataOutput::writeFieldData(CField* field, const CArray<double,1>& data) 
     124      int CDataOutput::writeFieldData(CField* field, const CArray<double,1>& data, const CDate& lastWrite, const CDate& currentWrite, int nstep) 
    125125      TRY 
    126126      { 
    127 //         CGrid* grid = CGrid::get(field->grid_ref.getValue()); 
    128 //         CDomain* domain = CDomain::get(grid->domain_ref.getValue()); 
    129          this->writeFieldData_(field, data); 
     127        return this->writeFieldData_(field, data, lastWrite, currentWrite, nstep); 
    130128      } 
    131129      CATCH 
     130 
    132131 
    133132      ///---------------------------------------------------------------- 
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/data_output.hpp

    r1882 r1961  
    2828            void writeFieldGrid(CField* field); 
    2929            void writeTimeDimension(void); 
    30             void writeFieldData(CField* field, const CArray<double,1>& data); 
     30            int  writeFieldData(CField* field, const CArray<double,1>& data, const CDate& lastWrite, const CDate& currentWrite, int nstep); 
    3131 
    3232            virtual void definition_start(void) = 0; 
     
    5252            virtual void syncFile_      (void)               = 0; 
    5353            virtual void writeField_    (CField*     field)  = 0; 
    54             virtual void writeFieldData_(CField*     field, const CArray<double,1>& data)  = 0; 
     54            virtual int writeFieldData_ (CField*     field, const CArray<double,1>& data, const CDate& lastWrite, const CDate& currentWrite, int nstep)  = 0; 
    5555            virtual void writeDomain_   (CDomain*    domain) = 0; 
    5656            virtual void writeAxis_     (CAxis*      axis)   = 0; 
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/file_writer_store_filter.cpp

    r1935 r1961  
    22#include "exception.hpp" 
    33#include "field.hpp" 
     4#include "file.hpp" 
     5#include "context.hpp" 
    46 
    57namespace xios 
     
    79  CFileWriterStoreFilter::CFileWriterStoreFilter(CGarbageCollector& gc, CField* field) 
    810    : CInputPin(gc, 1) 
    9     , field(field) 
     11    , field_(field) 
     12 
    1013  { 
    11     if (!field) 
    12       ERROR("CFileWriterStoreFilter::CFileWriterStoreFilter(CField* field)", 
    13             "The field cannot be null."); 
     14    CContext* context = CContext::getCurrent(); 
     15 
     16    if (!field) ERROR("CFileWriterStoreFilter::CFileWriterStoreFilter(CField* field)", "The field cannot be null."); 
     17    file_ = field->getFileOut() ; 
     18    grid_= field->getGrid() ; 
     19    freqWrite_ = file_->output_freq ; 
     20    lastWrite_ = context->getCalendar()->getInitDate(); 
     21    if (!file_->isEmptyZone() && (field->getGrid()->doGridHaveDataToWrite() || file_->type == CFile::type_attr::one_file)) 
     22         needToWrite_=true ; 
     23    else needToWrite_=false; 
     24    lastFileSplit_ = file_->getLastSplit() ; 
     25    nstep_ = 0 ; 
     26    if (!field->scale_factor.isEmpty()) { scaleFactor_ = field->scale_factor ; hasScaleFactor_ = true ; } 
     27    if (!field->add_offset.isEmpty()) { addOffset_ = field->add_offset ; hasAddOffset_ = true ; } 
     28    if (!field->prec.isEmpty() && field->prec == 2) hasRounding_ = true ; 
     29    if (!field->default_value.isEmpty()) {hasDefaultValue_=true ; defaultValue_ = field->default_value ;} 
    1430  } 
    1531 
    1632  void CFileWriterStoreFilter::onInputReady(std::vector<CDataPacketPtr> data) 
    1733  { 
    18     field->writeUpdateData(data[0]->data); 
     34    const CDate currentWrite = lastWrite_ + freqWrite_; 
     35    if (needToWrite_) 
     36    { 
     37      file_->checkWriteFile(); 
     38      if (file_->getLastSplit() != lastFileSplit_) 
     39      { 
     40        nstep_ = 0 ; 
     41        lastFileSplit_ = file_->getLastSplit() ; 
     42      } 
     43      nstep_ = nstep_+1; 
     44       
     45      CArray<double,1> dataIn = data[0]->data ; 
     46      CArray<double,1> fieldData ; 
     47 
     48      if (hasAddOffset_ || hasScaleFactor_ || hasRounding_) dataIn = data[0]->data ; 
     49      else dataIn.reference(data[0]->data) ; 
     50 
     51      if (hasAddOffset_)   dataIn = dataIn - addOffset_ ; 
     52      if (hasScaleFactor_) dataIn = dataIn / scaleFactor_; 
     53      if (hasRounding_)    dataIn = round(dataIn); 
     54 
     55      if (hasDefaultValue_) 
     56      { 
     57        size_t nbData=dataIn.numElements() ; 
     58        for (size_t idx = 0; idx < nbData; ++idx) if ( NumTraits<double>::isNan(dataIn(idx)) ) dataIn(idx)=defaultValue_ ; 
     59      } 
     60 
     61      if (field_->getUseCompressedOutput()) fieldData.reference(dataIn) ; 
     62      else 
     63      { 
     64        fieldData.resize(grid_->getWorkflowToFullConnector()->getDstSize()); 
     65        if (hasDefaultValue_) grid_->getWorkflowToFullConnector()->transfer(dataIn, fieldData, defaultValue_ ) ; 
     66        else grid_->getWorkflowToFullConnector()->transfer(dataIn, fieldData ) ; 
     67      }   
     68      nstep_ = file_->getDataOutput()->writeFieldData(field_, fieldData, lastWrite_,currentWrite, nstep_); 
     69    } 
     70 
     71    lastWrite_ = currentWrite ; 
     72 
    1973  } 
    2074 
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/filter/file_writer_store_filter.hpp

    r1935 r1961  
    77{ 
    88  class CField; 
     9  class CFile; 
     10  class CGrid; 
    911 
    1012  /*! 
     
    4648 
    4749    private: 
    48       CField* field; //<! The associated field 
    49       std::map<Time, CDataPacketPtr> packets; //<! The stored packets 
     50      CField* field_; //<! The associated field 
     51      CFile* file_ ; 
     52      CGrid* grid_ ; 
     53      CDate lastWrite_ ; 
     54      CDate lastFileSplit_ ; 
     55      CDuration freqWrite_ ; 
     56      int nstep_ ; 
     57      bool needToWrite_ ; 
     58      double scaleFactor_ = 1.0; 
     59      double addOffset_ = 0.0; 
     60      bool hasScaleFactor_ = false ; 
     61      bool hasAddOffset_ = false ; 
     62      double defaultValue_ ; 
     63      bool hasDefaultValue_=false; 
     64      bool hasRounding_=false ; 
     65 
    5066  }; // class CFileWriterStoreFilter 
    5167} // namespace xios 
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/io/nc4_data_output.cpp

    r1959 r1961  
    17131713        } 
    17141714 
    1715         if (compressedOutput && grid->isCompressible()) 
     1715        while (!dimIdList.empty()) 
    17161716        { 
    1717           dims.push_back(grid->getId() + "_points"); 
    1718           field->setUseCompressedOutput(); 
    1719         } 
    1720         else 
    1721         { 
    1722           while (!dimIdList.empty()) 
    1723           { 
    1724             dims.push_back(dimIdList.back()); 
    1725             dimIdList.pop_back(); 
    1726           } 
     1717          dims.push_back(dimIdList.back()); 
     1718          dimIdList.pop_back(); 
    17271719        } 
    17281720 
     
    20702062      //--------------------------------------------------------------- 
    20712063 
    2072       void CNc4DataOutput::writeFieldData_ (CField*  field, const CArray<double,1>& data) 
     2064      int CNc4DataOutput::writeFieldData_ (CField*  field, const CArray<double,1>& data, const CDate& lastWrite, 
     2065                                           const CDate& currentWrite, int nstep) 
    20732066      { 
    20742067        CContext* context = CContext::getCurrent(); 
    20752068        CGrid* grid = field->getGrid(); 
    2076         CArray<double,1> dataIn(data.copy()) ; 
    2077  
    2078         if (field->getNStep()<1)  
     2069        
     2070        if (nstep<1)  
    20792071        { 
    2080           return; 
     2072          return nstep; 
    20812073        } 
    20822074         
     
    20842076          if (SuperClass::type == MULTI_FILE || !isCollective) 
    20852077          { 
    2086             return; 
     2078            return nstep; 
    20872079          } 
    20882080 
     
    21092101            factorUnit=context->getCalendar()->getDayLengthInSeconds() ; 
    21102102            else factorUnit=1 ; 
    2111             field->resetNStep(getRecordFromTime(field->last_Write_srv,factorUnit) + 1); 
     2103            nstep = getRecordFromTime(field->last_Write_srv,factorUnit) + 1; 
    21122104          } 
    21132105 
     
    21282120        if (wtime) 
    21292121        { 
    2130           Time lastWrite = field->last_Write_srv; 
    2131           Time lastLastWrite = field->lastlast_Write_srv; 
    2132  
    21332122           
    21342123          if (field->hasTimeInstant) 
    21352124          { 
    2136             time_data(0) = time_data_bound(1) = lastWrite; 
    2137             time_data_bound(0) = time_data_bound(1) = lastWrite; 
     2125            time_data(0) = time_data_bound(1) = (Time) lastWrite; 
     2126            time_data_bound(0) = time_data_bound(1) = (Time) currentWrite; 
    21382127            if (timeCounterType==instant) 
    21392128            { 
     
    21472136          else if (field->hasTimeCentered) 
    21482137          { 
    2149             time_data(0) = (lastWrite + lastLastWrite) / 2; 
    2150             time_data_bound(0) = lastLastWrite; 
    2151             time_data_bound(1) = lastWrite; 
     2138            time_data(0) = ((Time)currentWrite + (Time)lastWrite) / 2; 
     2139            time_data_bound(0) = (Time)lastWrite; 
     2140            time_data_bound(1) = (Time)currentWrite; 
    21522141            if (timeCounterType==centered) 
    21532142            { 
     
    21622151          if (timeCounterType==record) 
    21632152          { 
    2164             time_counter(0) = field->getNStep() - 1; 
    2165             time_counter_bound(0) = time_counter_bound(1) = field->getNStep() - 1; 
     2153            time_counter(0) = nstep - 1; 
     2154            time_counter_bound(0) = time_counter_bound(1) = nstep - 1; 
    21662155            wtimeCounter=true ; 
    21672156          } 
     
    21792168         bool isRoot = (context->intraCommRank_ == 0); 
    21802169 
    2181          if (!field->scale_factor.isEmpty() || !field->add_offset.isEmpty()) 
    2182          { 
    2183            double scaleFactor = 1.0; 
    2184            double addOffset = 0.0; 
    2185            if (!field->scale_factor.isEmpty()) scaleFactor = field->scale_factor; 
    2186            if (!field->add_offset.isEmpty()) addOffset = field->add_offset; 
    2187            field->scaleFactorAddOffset(dataIn, scaleFactor, addOffset); 
    2188          } 
    2189  
    21902170         try 
    21912171         { 
    2192            size_t writtenSize; 
    2193            if (field->getUseCompressedOutput()) 
    2194              writtenSize = grid->getNumberWrittenIndexes(); 
    2195            else 
    2196              writtenSize = grid->getWrittenDataSize(); 
    2197  
    2198            CArray<double,1> fieldData(writtenSize); 
    2199            if (!field->default_value.isEmpty()) fieldData = field->default_value; 
    2200  
    2201            if (field->getUseCompressedOutput()) fieldData.reference(dataIn) ; 
    2202              // field->outputCompressedField(dataIn, fieldData); 
    2203            else 
    2204            { 
    2205              //field->outputField(dataIn, fieldData); 
    2206              if (!field->default_value.isEmpty()) field->getGrid()->getWorkflowToFullConnector()->transfer(dataIn, fieldData, (double)field->default_value ) ; 
    2207              else field->getGrid()->getWorkflowToFullConnector()->transfer(dataIn, fieldData ) ; 
    2208            } 
    2209  
    2210            if (!field->prec.isEmpty() && field->prec == 2) fieldData = round(fieldData); 
    2211  
    22122172           switch (SuperClass::type) 
    22132173           { 
     
    22152175              { 
    22162176                 CTimer::get("Files : writing data").resume(); 
    2217                  SuperClassWriter::writeData(fieldData, fieldid, isCollective, field->getNStep() - 1); 
     2177                 SuperClassWriter::writeData(data, fieldid, isCollective, nstep - 1); 
    22182178                 CTimer::get("Files : writing data").suspend(); 
    22192179                 if (wtime) 
     
    22222182                   if ( wtimeData) 
    22232183                   { 
    2224                        SuperClassWriter::writeTimeAxisData(time_data, timeAxisId, isCollective, field->getNStep() - 1, isRoot); 
    2225                        SuperClassWriter::writeTimeAxisDataBounds(time_data_bound, timeAxisBoundId, isCollective, field->getNStep() - 1, isRoot); 
     2184                       SuperClassWriter::writeTimeAxisData(time_data, timeAxisId, isCollective, nstep - 1, isRoot); 
     2185                       SuperClassWriter::writeTimeAxisDataBounds(time_data_bound, timeAxisBoundId, isCollective, nstep - 1, isRoot); 
    22262186                  } 
    22272187                   if (wtimeCounter) 
    22282188                   { 
    2229                      SuperClassWriter::writeTimeAxisData(time_counter, getTimeCounterName(), isCollective, field->getNStep() - 1,isRoot); 
    2230                      if (timeCounterType!=record) SuperClassWriter::writeTimeAxisDataBounds(time_counter_bound, timeBoundId, isCollective, field->getNStep() - 1, isRoot); 
     2189                     SuperClassWriter::writeTimeAxisData(time_counter, getTimeCounterName(), isCollective, nstep - 1,isRoot); 
     2190                     if (timeCounterType!=record) SuperClassWriter::writeTimeAxisDataBounds(time_counter_bound, timeBoundId, isCollective, nstep - 1, isRoot); 
    22312191                   } 
    22322192                   CTimer::get("Files : writing time axis").suspend(); 
     
    23162276                    } 
    23172277                  } 
    2318               } 
     2278                } 
    23192279                else 
    23202280                { 
     
    23682328 
    23692329                CTimer::get("Files : writing data").resume(); 
    2370                 SuperClassWriter::writeData(fieldData, fieldid, isCollective, field->getNStep() - 1, &start, &count); 
     2330                SuperClassWriter::writeData(data, fieldid, isCollective, nstep - 1, &start, &count); 
    23712331                CTimer::get("Files : writing data").suspend(); 
    23722332 
     
    23762336                   if ( wtimeData) 
    23772337                   { 
    2378                      SuperClassWriter::writeTimeAxisData(time_data, timeAxisId, isCollective, field->getNStep() - 1, isRoot); 
    2379                      SuperClassWriter::writeTimeAxisDataBounds(time_data_bound, timeAxisBoundId, isCollective, field->getNStep() - 1, isRoot); 
     2338                     SuperClassWriter::writeTimeAxisData(time_data, timeAxisId, isCollective, nstep - 1, isRoot); 
     2339                     SuperClassWriter::writeTimeAxisDataBounds(time_data_bound, timeAxisBoundId, isCollective, nstep - 1, isRoot); 
    23802340                   } 
    23812341                   if (wtimeCounter) 
    23822342                   { 
    2383                      SuperClassWriter::writeTimeAxisData(time_counter, getTimeCounterName(), isCollective, field->getNStep() - 1,isRoot); 
    2384                      if (timeCounterType!=record) SuperClassWriter::writeTimeAxisDataBounds(time_counter_bound, timeBoundId, isCollective, field->getNStep() - 1, isRoot); 
     2343                     SuperClassWriter::writeTimeAxisData(time_counter, getTimeCounterName(), isCollective, nstep - 1,isRoot); 
     2344                     if (timeCounterType!=record) SuperClassWriter::writeTimeAxisDataBounds(time_counter_bound, timeBoundId, isCollective, nstep - 1, isRoot); 
    23852345 
    23862346                   } 
     
    23912351              } 
    23922352            } 
     2353            return nstep ; 
    23932354         } 
    23942355         catch (CNetCdfException& e) 
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/io/nc4_data_output.hpp

    r1882 r1961  
    5656            virtual void writeAttribute_(CVariable* var); 
    5757            virtual void writeAttribute_(CVariable* var, const string& fieldId); 
    58             virtual void writeFieldData_(CField* field, const CArray<double,1>& data); 
     58            virtual int  writeFieldData_(CField* field, const CArray<double,1>& data, const CDate& lastWrite, const CDate& currentWrite, int nstep); 
    5959            virtual void writeFile_     (CFile* file); 
    6060            virtual void closeFile_     (void); 
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/node/field.cpp

    r1949 r1961  
    163163  CATCH 
    164164 
    165    
     165/*   
    166166  void CField::writeUpdateData(const CArray<double,1>& data) 
    167167  TRY 
     
    169169    const CDate writeDate = last_Write_srv + freq_write_srv; 
    170170    last_Write_srv = writeDate; 
    171     // grid_->computeWrittenIndex(); -> obselete function need to be removed 
    172     /* 
    173     recvDataSrv.resize(data.numElements()) ; 
    174     recvDataSrv = data ; 
    175     */ 
    176171    writeField(data); 
    177172    lastlast_Write_srv = last_Write_srv; 
    178173  } 
    179174  CATCH_DUMP_ATTR 
    180  
    181  
     175*/ 
     176 
     177/* 
    182178  void CField::writeField(const CArray<double,1>& data) 
    183179  TRY 
     
    194190  } 
    195191  CATCH_DUMP_ATTR 
    196  
     192*/ 
     193   
    197194  /* 
    198195    Send a request for reading data. 
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/node/field.hpp

    r1935 r1961  
    203203        void recvUpdateDataFromCoupler(std::map<int,CBufferIn*>& rankBuffers); // old interface to be removed 
    204204         
    205         void writeField(const CArray<double,1>& data); 
     205//        void writeField(const CArray<double,1>& data); 
    206206        bool sendReadDataRequest(const CDate& tsDataRequested); 
    207207        bool sendReadDataRequestIfNeeded(void); 
     
    246246        void recvAddVariableGroup(CBufferIn& buffer);         
    247247        void sendAddAllVariables(CContextClient* client); 
    248         void writeUpdateData(const CArray<double,1>& data); 
     248        //void writeUpdateData(const CArray<double,1>& data); 
    249249 
    250250        const std::vector<StdString>& getRefDomainAxisIds(); 
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/node/file.cpp

    r1934 r1961  
    318318    { 
    319319      CContext* context = CContext::getCurrent(); 
    320       // Done by classical server or secondary server 
    321       // This condition should be changed soon 
    322 //ym      if (CServer::serverLevel == 0 || CServer::serverLevel == 2) 
    323        if (context->getServiceType()==CServicesManager::IO_SERVER || context->getServiceType()==CServicesManager::OUT_SERVER) 
    324        { 
    325         if (mode.isEmpty() || mode.getValue() == mode_attr::write) 
    326         { 
    327           CTimer::get("Files : create headers").resume(); 
    328           if (!isOpen) createHeader(); 
    329           CTimer::get("Files : create headers").suspend(); 
    330           checkSync(); 
    331         }         
    332         checkSplit(); // REally need this? 
    333       } 
     320 
     321      if (mode.isEmpty() || mode.getValue() == mode_attr::write) 
     322      { 
     323        CTimer::get("Files : create headers").resume(); 
     324        if (!isOpen) createHeader(); 
     325        CTimer::get("Files : create headers").suspend(); 
     326        checkSync(); 
     327      }         
     328      checkSplit();  
    334329    } 
    335330    CATCH_DUMP_ATTR 
     
    417412          lastSplit = lastSplit + split_freq.getValue(); 
    418413          std::vector<CField*>::iterator it, end = this->enabledFields.end(); 
    419           for (it = this->enabledFields.begin(); it != end; it++) 
     414/*          for (it = this->enabledFields.begin(); it != end; it++) 
    420415          { 
    421416            (*it)->resetNStep(); 
    422417            (*it)->resetNStepMax(); 
    423           } 
     418          }*/ 
    424419          if (mode.isEmpty() || mode.getValue() == mode_attr::write) 
    425420            createHeader(); 
     
    432427    } 
    433428    CATCH_DUMP_ATTR 
     429 
    434430 
    435431   /*! 
  • XIOS/dev/dev_ym/XIOS_COUPLING/src/node/file.hpp

    r1871 r1961  
    179179         CDate lastSync; 
    180180         CDate lastSplit; 
     181          
     182         const CDate& getLastSplit(void) { return lastSplit ; } 
     183         
    181184         int nbAxis, nbDomains; 
    182185         bool isOpen;          
Note: See TracChangeset for help on using the changeset viewer.