Ignore:
Timestamp:
02/13/12 19:35:25 (12 years ago)
Author:
ymipsl
Message:

nouvelle version de developpement de xios

  • nouvelle interface fortran
  • recodage complet de la couche de communication
  • et bien d'autres choses...

YM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XMLIO_V2/dev/common/src/node/context.cpp

    r286 r300  
    11#include "context.hpp" 
    2  
    32#include "tree_manager.hpp" 
    43 
     
    1110 
    1211#include "data_treatment.hpp" 
     12#include "context_client.hpp" 
     13#include "context_server.hpp" 
     14#include "nc4_data_output.hpp" 
    1315 
    1416namespace xmlioserver { 
     
    1921   CContext::CContext(void) 
    2022      : CObjectTemplate<CContext>(), CContextAttributes() 
    21       , calendar() 
     23      , calendar(),hasClient(false),hasServer(false) 
    2224   { /* Ne rien faire de plus */ } 
    2325 
    2426   CContext::CContext(const StdString & id) 
    2527      : CObjectTemplate<CContext>(id), CContextAttributes() 
    26       , calendar() 
     28      , calendar(),hasClient(false),hasServer(false) 
    2729   { /* Ne rien faire de plus */ } 
    2830 
    2931   CContext::~CContext(void) 
    30    { /* Ne rien faire de plus */ } 
     32   {  
     33     if (hasClient) delete client ; 
     34     if (hasServer) delete server ; 
     35   } 
    3136 
    3237   //---------------------------------------------------------------- 
     
    299304   } 
    300305   ///--------------------------------------------------------------- 
    301  
     306    
     307   void CContext::initClient(MPI_Comm intraComm, MPI_Comm interComm) 
     308   { 
     309     hasClient=true ; 
     310     client = new CContextClient(this,intraComm, interComm) ; 
     311   }  
     312 
     313   void CContext::initServer(MPI_Comm intraComm,MPI_Comm interComm) 
     314   { 
     315     hasServer=true ; 
     316     server = new CContextServer(this,intraComm,interComm) ; 
     317   }  
     318 
     319   bool CContext::eventLoop(void) 
     320   { 
     321     return server->eventLoop() ; 
     322   }  
     323    
     324   void CContext::finalize(void) 
     325   { 
     326      if (hasClient && !hasServer) 
     327      { 
     328         client->finalize() ; 
     329      } 
     330      if (hasServer) 
     331      { 
     332        closeAllFile() ; 
     333      } 
     334   } 
     335        
     336        
     337  
     338    
     339   void CContext::closeDefinition(void) 
     340   { 
     341      if (hasClient && !hasServer) sendCloseDefinition() ; 
     342       
     343      solveCalendar();          
     344          
     345      // Résolution des héritages pour le context actuel. 
     346      this->solveAllInheritance(); 
     347 
     348      //Initialisation du vecteur 'enabledFiles' contenant la liste des fichiers à sortir. 
     349      this->findEnabledFiles(); 
     350 
     351      //Recherche des champs à sortir (enable à true + niveau de sortie correct) 
     352      // pour chaque fichier précédemment listé. 
     353      this->findAllEnabledFields(); 
     354 
     355      // Résolution des références de grilles pour chacun des champs. 
     356      this->solveAllGridRef(); 
     357 
     358      // Traitement des opérations. 
     359      this->solveAllOperation(); 
     360 
     361      // Nettoyage de l'arborescence 
     362      CleanTree(); 
     363      if (hasClient) sendCreateFileHeader() ; 
     364   } 
     365    
     366   void CContext::findAllEnabledFields(void) 
     367   { 
     368     for (unsigned int i = 0; i < this->enabledFiles.size(); i++) 
     369     (void)this->enabledFiles[i]->getEnabledFields(); 
     370   } 
     371 
     372   void CContext::solveAllGridRef(void) 
     373   { 
     374     for (unsigned int i = 0; i < this->enabledFiles.size(); i++) 
     375     this->enabledFiles[i]->solveEFGridRef(); 
     376   } 
     377 
     378   void CContext::solveAllOperation(void) 
     379   { 
     380      for (unsigned int i = 0; i < this->enabledFiles.size(); i++) 
     381      this->enabledFiles[i]->solveEFOperation(); 
     382   } 
     383 
     384   void CContext::solveAllInheritance(void) 
     385   { 
     386     // Résolution des héritages descendants (càd des héritages de groupes) 
     387     // pour chacun des contextes. 
     388      solveDescInheritance(); 
     389 
     390     // Résolution des héritages par référence au niveau des fichiers. 
     391      const std::vector<boost::shared_ptr<CFile> > & allFiles 
     392             = CObjectFactory::GetObjectVector<CFile>(); 
     393 
     394      for (unsigned int i = 0; i < allFiles.size(); i++) 
     395         allFiles[i]->solveFieldRefInheritance(); 
     396   } 
     397 
     398   void CContext::findEnabledFiles(void) 
     399   { 
     400      const std::vector<boost::shared_ptr<CFile> > & allFiles 
     401          = CObjectFactory::GetObjectVector<CFile>(); 
     402 
     403      for (unsigned int i = 0; i < allFiles.size(); i++) 
     404         if (!allFiles[i]->enabled.isEmpty()) // Si l'attribut 'enabled' est défini. 
     405            if (allFiles[i]->enabled.getValue()) // Si l'attribut 'enabled' est fixé à vrai. 
     406               enabledFiles.push_back(allFiles[i]); 
     407 
     408      if (enabledFiles.size() == 0) 
     409         DEBUG(<<"Aucun fichier ne va être sorti dans le contexte nommé \"" 
     410               << getId() << "\" !"); 
     411   } 
     412 
     413   void CContext::closeAllFile(void) 
     414   { 
     415     std::vector<boost::shared_ptr<CFile> >::const_iterator 
     416            it = this->enabledFiles.begin(), end = this->enabledFiles.end(); 
     417          
     418     for (; it != end; it++) 
     419     { 
     420       info(30)<<"Closing File : "<<(*it)->getId()<<endl; 
     421       (*it)->close(); 
     422     } 
     423   } 
     424    
     425   bool CContext::dispatchEvent(CEventServer& event) 
     426   { 
     427       
     428      if (SuperClass::dispatchEvent(event)) return true ; 
     429      else 
     430      { 
     431        switch(event.type) 
     432        { 
     433           case EVENT_ID_CLOSE_DEFINITION : 
     434             recvCloseDefinition(event) ; 
     435             return true ; 
     436             break ; 
     437           case EVENT_ID_UPDATE_CALENDAR : 
     438             recvUpdateCalendar(event) ; 
     439             return true ; 
     440             break ; 
     441           case EVENT_ID_CREATE_FILE_HEADER : 
     442             recvCreateFileHeader(event) ; 
     443             return true ; 
     444             break ; 
     445           default : 
     446             ERROR("bool CContext::dispatchEvent(CEventServer& event)", 
     447                    <<"Unknown Event") ; 
     448           return false ; 
     449         } 
     450      } 
     451   } 
     452    
     453   void CContext::sendCloseDefinition(void) 
     454   { 
     455 
     456     CEventClient event(getType(),EVENT_ID_CLOSE_DEFINITION) ;    
     457     if (client->isServerLeader()) 
     458     { 
     459       CMessage msg ; 
     460       msg<<this->getId() ; 
     461       event.push(client->getServerLeader(),1,msg) ; 
     462       client->sendEvent(event) ; 
     463     } 
     464     else client->sendEvent(event) ; 
     465   } 
     466    
     467   void CContext::recvCloseDefinition(CEventServer& event) 
     468   { 
     469       
     470      CBufferIn* buffer=event.subEvents.begin()->buffer; 
     471      string id; 
     472      *buffer>>id ; 
     473      get(id)->closeDefinition() ; 
     474   } 
     475    
     476   void CContext::sendUpdateCalendar(int step) 
     477   { 
     478     if (!hasServer) 
     479     { 
     480       CEventClient event(getType(),EVENT_ID_UPDATE_CALENDAR) ;    
     481       if (client->isServerLeader()) 
     482       { 
     483         CMessage msg ; 
     484         msg<<this->getId()<<step ; 
     485         event.push(client->getServerLeader(),1,msg) ; 
     486         client->sendEvent(event) ; 
     487       } 
     488       else client->sendEvent(event) ; 
     489     } 
     490   } 
     491    
     492   void CContext::recvUpdateCalendar(CEventServer& event) 
     493   { 
     494       
     495      CBufferIn* buffer=event.subEvents.begin()->buffer; 
     496      string id; 
     497      *buffer>>id ; 
     498      get(id)->recvUpdateCalendar(*buffer) ; 
     499   } 
     500    
     501   void CContext::recvUpdateCalendar(CBufferIn& buffer) 
     502   { 
     503      int step ; 
     504      buffer>>step ; 
     505      updateCalendar(step) ; 
     506   } 
     507    
     508   void CContext::sendCreateFileHeader(void) 
     509   { 
     510 
     511     CEventClient event(getType(),EVENT_ID_CREATE_FILE_HEADER) ;    
     512     if (client->isServerLeader()) 
     513     { 
     514       CMessage msg ; 
     515       msg<<this->getId() ; 
     516       event.push(client->getServerLeader(),1,msg) ; 
     517       client->sendEvent(event) ; 
     518     } 
     519     else client->sendEvent(event) ; 
     520   } 
     521    
     522   void CContext::recvCreateFileHeader(CEventServer& event) 
     523   { 
     524       
     525      CBufferIn* buffer=event.subEvents.begin()->buffer; 
     526      string id; 
     527      *buffer>>id ; 
     528      get(id)->recvCreateFileHeader(*buffer) ; 
     529   } 
     530    
     531   void CContext::recvCreateFileHeader(CBufferIn& buffer) 
     532   { 
     533      createFileHeader() ; 
     534   } 
     535    
     536   void CContext::updateCalendar(int step) 
     537   { 
     538      calendar->update(step) ; 
     539   } 
     540  
     541   void CContext::createFileHeader(void ) 
     542   { 
     543      vector<shared_ptr<CFile> >::const_iterator it ; 
     544          
     545      for (it=enabledFiles.begin(); it != enabledFiles.end(); it++) 
     546      { 
     547/*         shared_ptr<CFile> file = *it; 
     548         StdString filename = (!file->name.isEmpty()) ?   file->name.getValue() : file->getId(); 
     549         StdOStringStream oss; 
     550         if (! output_dir.isEmpty()) oss << output_dir.getValue(); 
     551         oss << filename; 
     552         if (!file->name_suffix.isEmpty()) oss << file->name_suffix.getValue(); 
     553 
     554         bool multifile=true ; 
     555         if (!file->type.isEmpty()) 
     556         { 
     557           StdString str=file->type.getValue() ;  
     558           if (str.compare("one_file")==0) multifile=false ; 
     559           else if (str.compare("multi_file")==0) multifile=true ; 
     560           else ERROR("void Context::createDataOutput(void)", 
     561                      "incorrect file <type> attribut : must be <multi_file> or <one_file>, " 
     562                      <<"having : <"<<str<<">") ; 
     563         }  
     564         if (multifile)  
     565         { 
     566            if (server->intraCommSize > 1) oss << "_" << server->intraCommRank; 
     567         } 
     568         oss << ".nc"; 
     569 
     570         shared_ptr<io::CDataOutput> dout(new T(oss.str(), false,server->intraComm,multifile)); 
     571*/ 
     572         (*it)->createHeader(); 
     573      } 
     574   }  
     575    
     576   shared_ptr<CContext> CContext::current(void) 
     577   { 
     578     return CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId()) ; 
     579   } 
     580    
    302581} // namespace tree 
    303582} // namespace xmlioserver 
Note: See TracChangeset for help on using the changeset viewer.