Ignore:
Timestamp:
12/06/17 08:34:41 (7 years ago)
Author:
rlacroix
Message:

Support reentrant workflows and workflows with temporal integration for fields read from files.

Location:
XIOS/dev/XIOS_DEV_CMIP6/src/node
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/XIOS_DEV_CMIP6/src/node/context.cpp

    r1357 r1358  
    665665    { 
    666666      buildFilterGraphOfFieldsWithReadAccess(); 
     667      postProcessFilterGraph(); 
    667668    } 
    668669     
     
    782783   } 
    783784 
     785   void CContext::postProcessFilterGraph() 
     786   { 
     787     int size = enabledFiles.size(); 
     788     for (int i = 0; i < size; ++i) 
     789     { 
     790        enabledFiles[i]->postProcessFilterGraph(); 
     791     } 
     792   } 
     793 
    784794   void CContext::startPrefetchingOfEnabledReadModeFiles() 
    785795   { 
     
    788798     { 
    789799        enabledReadModeFiles[i]->prefetchEnabledReadModeFields(); 
     800     } 
     801   } 
     802 
     803   void CContext::doPreTimestepOperationsForEnabledReadModeFiles() 
     804   { 
     805     int size = enabledReadModeFiles.size(); 
     806     for (int i = 0; i < size; ++i) 
     807     { 
     808        enabledReadModeFiles[i]->doPreTimestepOperationsForEnabledReadModeFields(); 
    790809     } 
    791810   } 
     
    18371856      if (prevStep < step) 
    18381857      { 
     1858        if (hasClient && !hasServer) // For now we only use server level 1 to read data 
     1859        { 
     1860          doPreTimestepOperationsForEnabledReadModeFiles(); 
     1861        } 
     1862 
    18391863        info(50) << "updateCalendar : before : " << calendar->getCurrentDate() << endl; 
    18401864        calendar->update(step); 
  • XIOS/dev/XIOS_DEV_CMIP6/src/node/context.hpp

    r1349 r1358  
    120120         void solveOnlyRefOfEnabledFields(bool sendToServer);          
    121121         void buildFilterGraphOfEnabledFields(); 
     122         void postProcessFilterGraph(); 
    122123         void startPrefetchingOfEnabledReadModeFiles(); 
     124         void doPreTimestepOperationsForEnabledReadModeFiles(); 
    123125         void doPostTimestepOperationsForEnabledReadModeFiles(); 
    124126         void findFieldsWithReadAccess(void); 
  • XIOS/dev/XIOS_DEV_CMIP6/src/node/field.cpp

    r1344 r1358  
    4242      , wasDataRequestedFromServer(false) 
    4343      , wasDataAlreadyReceivedFromServer(false) 
     44      , mustAutoTrigger(false) 
    4445      , isEOF(false), nstepMaxRead(false) 
    4546   { setVirtualVariableGroup(CVariableGroup::create(getId() + "_virtual_variable_group")); } 
     
    5859      , wasDataRequestedFromServer(false) 
    5960      , wasDataAlreadyReceivedFromServer(false) 
     61      , mustAutoTrigger(false) 
    6062      , isEOF(false), nstepMaxRead(false) 
    6163   { setVirtualVariableGroup(CVariableGroup::create(getId() + "_virtual_variable_group")); } 
     
    569571 
    570572    // Check if data previously requested has been received as expected 
    571     if (wasDataRequestedFromServer && (!isEOF || currentDate <= dateEOF)) 
     573    if (wasDataRequestedFromServer && !isEOF) 
    572574    { 
    573575      CTimer timer("CField::checkForLateDataFromServer"); 
     
    577579      { 
    578580        const CDate nextDataDue = wasDataAlreadyReceivedFromServer ? (lastDataReceivedFromServer + file->output_freq) : context->getCalendar()->getInitDate(); 
    579         isDataLate = nextDataDue < currentDate; 
     581        isDataLate = (nextDataDue <= currentDate); 
    580582 
    581583        if (isDataLate) 
     
    594596              << "Late data at timestep = " << currentDate); 
    595597    } 
     598  } 
     599 
     600  void CField::checkIfMustAutoTrigger(void) 
     601  { 
     602    mustAutoTrigger = serverSourceFilter ? serverSourceFilter->mustAutoTrigger() : false; 
     603  } 
     604 
     605  void CField::autoTriggerIfNeeded(void) 
     606  { 
     607    if (mustAutoTrigger) 
     608      serverSourceFilter->trigger(CContext::getCurrent()->getCalendar()->getCurrentDate()); 
    596609  } 
    597610 
  • XIOS/dev/XIOS_DEV_CMIP6/src/node/field.hpp

    r1330 r1358  
    174174        void recvReadDataReady(vector<int> ranks, vector<CBufferIn*> buffers); 
    175175        void checkForLateDataFromServer(void); 
     176        void checkIfMustAutoTrigger(void); 
     177        void autoTriggerIfNeeded(void); 
    176178        void outputField(CArray<double,3>& fieldOut); 
    177179        void outputField(CArray<double,2>& fieldOut); 
     
    221223         CDate lastDataRequestedFromServer, lastDataReceivedFromServer, dateEOF; 
    222224         bool wasDataRequestedFromServer, wasDataAlreadyReceivedFromServer; 
     225         bool mustAutoTrigger; 
    223226 
    224227         map<int,boost::shared_ptr<func::CFunctor> > foperation_srv; 
  • XIOS/dev/XIOS_DEV_CMIP6/src/node/file.cpp

    r1318 r1358  
    854854 
    855855   /*! 
     856    * Post-process the filter graph for each active field. 
     857    */ 
     858   void CFile::postProcessFilterGraph() 
     859   { 
     860     int size = this->enabledFields.size(); 
     861     for (int i = 0; i < size; ++i) 
     862     { 
     863       this->enabledFields[i]->checkIfMustAutoTrigger(); 
     864     } 
     865   } 
     866 
     867   /*! 
    856868     Prefetching the data for enabled fields read from file. 
    857869   */ 
     
    867879 
    868880   /*! 
     881     Do all pre timestep operations for enabled fields in read mode: 
     882      - Check that the data excepted from server has been received 
     883      - Check if some filters must auto-trigger 
     884   */ 
     885   void CFile::doPreTimestepOperationsForEnabledReadModeFields(void) 
     886   { 
     887     if (mode.isEmpty() || mode.getValue() != mode_attr::read) 
     888       return; 
     889 
     890     int size = this->enabledFields.size(); 
     891     for (int i = 0; i < size; ++i) 
     892     { 
     893       this->enabledFields[i]->checkForLateDataFromServer(); 
     894       this->enabledFields[i]->autoTriggerIfNeeded(); 
     895     } 
     896   } 
     897 
     898   /*! 
    869899     Do all post timestep operations for enabled fields in read mode: 
    870900      - Prefetch the data read from file when needed 
    871       - Check that the data excepted from server has been received 
    872901   */ 
    873902   void CFile::doPostTimestepOperationsForEnabledReadModeFields(void) 
     
    879908     for (int i = 0; i < size; ++i) 
    880909     { 
    881        this->enabledFields[i]->checkForLateDataFromServer(); 
    882910       this->enabledFields[i]->sendReadDataRequestIfNeeded(); 
    883911     } 
  • XIOS/dev/XIOS_DEV_CMIP6/src/node/file.hpp

    r1318 r1358  
    110110          
    111111         void buildFilterGraphOfEnabledFields(CGarbageCollector& gc); 
     112         void postProcessFilterGraph(); 
    112113         void prefetchEnabledReadModeFields(); 
     114         void doPreTimestepOperationsForEnabledReadModeFields(); 
    113115         void doPostTimestepOperationsForEnabledReadModeFields(); 
    114116 
Note: See TracChangeset for help on using the changeset viewer.