Ignore:
Timestamp:
02/23/12 14:57:50 (12 years ago)
Author:
ymipsl
Message:

Add splitting file functionality
new file attribut "split_freq" to put the frequency of splitting

YM

File:
1 edited

Legend:

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

    r318 r321  
    141141      return false ; 
    142142    } 
    143        
     143     
     144   void CFile::initFile(void) 
     145   { 
     146      shared_ptr<CContext> context=CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId()) ; 
     147      date::CDate& currentDate=context->calendar->getCurrentDate() ; 
     148       
     149      if (! sync_freq.isEmpty()) syncFreq = date::CDuration::FromString(sync_freq.getValue()); 
     150      if (! split_freq.isEmpty()) splitFreq = date::CDuration::FromString(split_freq.getValue()); 
     151      if (! output_freq.isEmpty()) outputFreq = date::CDuration::FromString(output_freq.getValue()); 
     152      lastSync=new date::CDate(currentDate) ; 
     153      lastSplit=new date::CDate(currentDate) ; 
     154      isOpen=false ; 
     155    } 
     156     
     157    void CFile::checkFile(void) 
     158    { 
     159      if (!isOpen) createHeader() ; 
     160      checkSync() ; 
     161      checkSplit() ; 
     162    } 
     163       
     164      
     165   bool CFile::checkSync(void) 
     166   { 
     167     shared_ptr<CContext> context=CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId()) ; 
     168     date::CDate& currentDate=context->calendar->getCurrentDate() ; 
     169     if (! sync_freq.isEmpty()) 
     170     { 
     171       if (*lastSync+syncFreq < currentDate) 
     172       { 
     173         *lastSync=currentDate ; 
     174         data_out->syncFile() ; 
     175         return true ; 
     176        } 
     177      } 
     178      return false ; 
     179    } 
     180     
     181     
     182    bool CFile::checkSplit(void) 
     183    { 
     184      shared_ptr<CContext> context=CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId()) ; 
     185      date::CDate& currentDate=context->calendar->getCurrentDate() ; 
     186      if (! split_freq.isEmpty()) 
     187      { 
     188        if (*lastSplit+splitFreq < currentDate) 
     189        { 
     190          *lastSplit=currentDate-outputFreq ; 
     191         
     192          std::vector<boost::shared_ptr<CField> >::iterator it, end = this->enabledFields.end(); 
     193          for (it = this->enabledFields.begin() ;it != end; it++)  (*it)->resetNStep() ; 
     194          createHeader() ; 
     195          return true ; 
     196        } 
     197      } 
     198      return false ; 
     199    } 
     200     
    144201   void CFile::createHeader(void) 
    145202   { 
    146203      shared_ptr<CContext> context=CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId()) ; 
    147  
    148       if (! sync_freq.isEmpty()) syncFreq = date::CDuration::FromString(sync_freq.getValue()); 
    149       lastSync=new date::CDate(context->calendar->getCurrentDate()) ; 
     204      date::CDate& currentDate=context->calendar->getCurrentDate() ; 
    150205       
    151206      std::vector<boost::shared_ptr<CField> >::iterator it, end = this->enabledFields.end(); 
     
    168223         oss << filename; 
    169224         if (!name_suffix.isEmpty()) oss << name_suffix.getValue(); 
    170  
     225//         if (!split_freq.isEmpty()) oss<<"-["<<currentDate.toString()<<"]" ; 
     226         if (!split_freq.isEmpty()) oss<<"_"<<lastSplit->getStryyyymmdd()<<"-"<< (*lastSplit+(splitFreq-1*date::Second)).getStryyyymmdd(); 
    171227         bool multifile=true ; 
    172228         if (!type.isEmpty()) 
     
    187243         oss << ".nc"; 
    188244 
     245         if (isOpen) data_out->closeFile() ; 
     246          
    189247         data_out=shared_ptr<io::CDataOutput>(new io::CNc4DataOutput(oss.str(), false,server->intraComm,multifile)); 
     248         isOpen=true ; 
    190249 
    191250         data_out->writeFile(CObjectFactory::GetObject<CFile>(this)); 
     
    208267   void CFile::close(void) 
    209268   { 
     269     delete lastSync ; 
     270     delete lastSplit ; 
    210271     if (!AllDomainEmpty ||  type.getValue()=="one_file") 
    211        this->data_out->closeFile(); 
    212      delete lastSync ; 
     272       if (isOpen)  
     273       { 
     274         this->data_out->closeFile(); 
     275       } 
    213276   } 
    214277   //---------------------------------------------------------------- 
Note: See TracChangeset for help on using the changeset viewer.