source: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/context.hpp @ 2130

Last change on this file since 2130 was 2130, checked in by ymipsl, 3 years ago

New management of client-server buffers.

  • buffers can grow automatically in intialization phase
  • buffers is evaluated after the close context definition phase and fixed at optimal value.

YM

  • Property copyright set to
    Software name : XIOS (Xml I/O Server)
    http://forge.ipsl.jussieu.fr/ioserver
    Creation date : January 2009
    Licence : CeCCIL version2
    see license file in root directory : Licence_CeCILL_V2-en.txt
    or http://www.cecill.info/licences/Licence_CeCILL_V2-en.html
    Holder : CEA/LSCE (Laboratoire des Sciences du CLimat et de l'Environnement)
    CNRS/IPSL (Institut Pierre Simon Laplace)
    Project Manager : Yann Meurdesoif
    yann.meurdesoif@cea.fr
File size: 15.7 KB
RevLine 
[591]1#ifndef __XIOS_CContext__
2#define __XIOS_CContext__
[219]3
[591]4/// XIOS headers ///
5#include "xios_spl.hpp"
[352]6//#include "node_type.hpp"
[549]7#include "calendar_wrapper.hpp"
[219]8
9#include "declare_group.hpp"
[300]10#include "data_output.hpp"
[639]11#include "garbage_collector.hpp"
[697]12#include "registry.hpp"
[382]13#include "mpi.hpp"
[1761]14#include "services_manager.hpp"
15#include "server_context.hpp"
[2022]16#include "event_scheduler.hpp"
[300]17
[219]18
[2022]19namespace xios
20{
[549]21   class CContextClient;
22   class CContextServer;
[509]23
24
[219]25   /// ////////////////////// Déclarations ////////////////////// ///
26   class CContextGroup;
27   class CContextAttributes;
28   class CContext;
[352]29   class CFile;
[1784]30   class CCouplerIn ;
31   class CCouplerOut ;
[219]32   ///--------------------------------------------------------------
33
34   // Declare/Define CFileAttribute
35   BEGIN_DECLARE_ATTRIBUTE_MAP(CContext)
36#  include "context_attribute.conf"
37   END_DECLARE_ATTRIBUTE_MAP(CContext)
38
39   ///--------------------------------------------------------------
[509]40  /*!
41  \class CContext
42   This class corresponds to the concrete presentation of context in xml file and in play an essential role in XIOS
43   Each object of this class contains all root definition of elements: files, fiels, domains, axis, etc, ... from which
44   we can have access to each element.
45   In fact, every thing must a be inside a particuliar context. After the xml file (iodef.xml) is parsed,
46   object of the class is created and its contains all information of other elements in the xml file.
47  */
[219]48   class CContext
49      : public CObjectTemplate<CContext>
50      , public CContextAttributes
51   {
[300]52         public :
53         enum EEventId
54         {
55           EVENT_ID_CLOSE_DEFINITION,EVENT_ID_UPDATE_CALENDAR,
[509]56           EVENT_ID_CREATE_FILE_HEADER,EVENT_ID_CONTEXT_FINALIZE,
[1973]57           EVENT_ID_SEND_REGISTRY,
[1764]58           EVENT_ID_CONTEXT_FINALIZE_CLIENT,
[1875]59           EVENT_ID_COUPLER_IN_READY,
60           EVENT_ID_COUPLER_IN_CLOSE_DEFINITION,
61           EVENT_ID_COUPLER_IN_CONTEXT_FINALIZED,
[549]62         };
[509]63
[219]64         /// typedef ///
65         typedef CObjectTemplate<CContext>   SuperClass;
66         typedef CContextAttributes SuperClassAttribute;
67
68      public :
69
70         typedef CContextAttributes RelAttributes;
71         typedef CContext           RelGroup;
72
73         //---------------------------------------------------------
74
75      public :
76
77         /// Constructeurs ///
78         CContext(void);
79         explicit CContext(const StdString & id);
80         CContext(const CContext & context);       // Not implemented yet.
81         CContext(const CContext * const context); // Not implemented yet.
82
83         /// Destructeur ///
84         virtual ~CContext(void);
85
86         //---------------------------------------------------------
87
88      public :
[509]89
[219]90         /// Mutateurs ///
[1542]91         void setCalendar(std::shared_ptr<CCalendar> newCalendar);
[509]92
[219]93         /// Accesseurs ///
[1542]94         std::shared_ptr<CCalendar>      getCalendar(void) const;
[219]95
96      public :
[509]97         // Initialize server or client
[1761]98         void init(CServerContext* parentServerContext, MPI_Comm intraComm, int serviceType);
99         void initClient(MPI_Comm intraComm, int serviceType);
100         
101         void initServer(MPI_Comm intraComm, int serviceType );
102         void createClientInterComm(MPI_Comm interCommClient, MPI_Comm interCommServer)  ;
103         void createServerInterComm(void)  ;
104
[549]105         bool isInitialized(void);
[219]106
[1622]107         StdString dumpClassAttributes(void);
108
[509]109         // Put sever or client into loop state
[1761]110         bool eventLoop(bool enableEventsProcessing=true);
[2123]111         bool scheduledEventLoop(bool enableEventsProcessing=true) ; 
[1764]112         void globalEventLoop(void);
[597]113
[509]114         // Finalize a context
[549]115         void finalize(void);
[1764]116
[1071]117         bool isFinalized(void);
[509]118
[1130]119         void closeDefinition(void);
120
[1869]121         // to be removed     
122         std::vector<CField*> findAllEnabledFieldsInFiles(const std::vector<CFile*>& activeFiles);
[509]123         // Some functions to process context
[1869]124         std::vector<CField*> findAllEnabledFieldsInFileOut(const std::vector<CFile*>& activeFiles);
125         std::vector<CField*> findAllEnabledFieldsInFileIn(const std::vector<CFile*>& activeFiles);
126         std::vector<CField*> findAllEnabledFieldsCouplerOut(const std::vector<CCouplerOut*>& activeCouplerOut);
127         std::vector<CField*> findAllEnabledFieldsCouplerIn(const std::vector<CCouplerIn*>& activeCouplerIn);
[1232]128         // void findAllEnabledFields(void);
129         // void findAllEnabledFieldsInReadModeFiles(void);
[775]130         void readAttributesOfEnabledFieldsInReadModeFiles();
[549]131         void solveAllInheritance(bool apply=true);
[300]132         void findEnabledFiles(void);
[1784]133         void findEnabledCouplerIn(void);
134         void findEnabledCouplerOut(void);
135         void createCouplerInterCommunicator(void) ;
[1232]136         void findEnabledWriteModeFiles(void);
[598]137         void findEnabledReadModeFiles(void);
[549]138         void closeAllFile(void);
139         void updateCalendar(int step);
[1232]140         void createFileHeader(void);
141         void initReadFiles(void);
[1973]142         void prepareTimeseries(void);
[1358]143         void postProcessFilterGraph();
[598]144         void startPrefetchingOfEnabledReadModeFiles();
[1358]145         void doPreTimestepOperationsForEnabledReadModeFiles();
[1318]146         void doPostTimestepOperationsForEnabledReadModeFiles();
[593]147         void findFieldsWithReadAccess(void);
[1875]148         void triggerLateFields(void) ;
[2002]149         
[1330]150         std::map<int, StdSize> getAttributesBufferSize(std::map<int, StdSize>& maxEventSize, CContextClient* contextClient, bool bufferForWriting = false);
151         std::map<int, StdSize> getDataBufferSize(std::map<int, StdSize>& maxEventSize, CContextClient* contextClient, bool bufferForWriting = false);
[509]152
[1212]153         // Distribute files (in write mode) among secondary-server pools according to the estimated data flux
[1869]154         void distributeFiles(const std::vector<CFile*>& files);
155         void distributeFileOverBandwith(const std::vector<CFile*>& files) ;
156         void distributeFileOverMemoryBandwith(const std::vector<CFile*>& files) ;
[1349]157         
[509]158         // Send context close definition
[549]159         void sendCloseDefinition(void);
[1875]160       public:
161         void sendCloseDefinition(CContextClient* client) ;
162       private:
163         set<CContextClient*> sendCloseDefinition_done_ ;
164       public:
[509]165         // There are something to send on closing context defintion
[549]166         void sendUpdateCalendar(int step);
167         void sendCreateFileHeader(void);
[1232]168         void sendEnabledFiles(const std::vector<CFile*>& activeFiles);
169         void sendEnabledFieldsInFiles(const std::vector<CFile*>& activeFiles);
170         void sendRefDomainsAxisScalars(const std::vector<CFile*>& activeFiles);
[983]171         //!< after be gathered to the root process of the context, merged registry is sent to the root process of the servers
172         void sendRegistry(void) ;
[1764]173         void sendFinalizeClient(CContextClient* contextClient, const string& contextClientId);
[1870]174         
175         public:
176         void sendContextToFileServer(CContextClient* client) ;
177         private:
178         std::set<CContextClient*> sendToFileServer_done_ ;
179         
180         public: 
[1761]181         std::string getContextId() {return contextId_;}
[511]182
[509]183         // Client side: Receive and process messages
[549]184         static void recvUpdateCalendar(CEventServer& event);
185         void recvUpdateCalendar(CBufferIn& buffer);
186         static void recvCloseDefinition(CEventServer& event);
187         static void recvCreateFileHeader(CEventServer& event);
188         void recvCreateFileHeader(CBufferIn& buffer);
[509]189         static void recvSolveInheritanceContext(CEventServer& event);
190         void recvSolveInheritanceContext(CBufferIn& buffer);
[697]191         static void recvRegistry(CEventServer& event) ;
[983]192         void recvRegistry(CBufferIn& buffer) ; //!< registry is received by the servers
[1764]193         static void recvFinalizeClient(CEventServer& event) ;
194         void recvFinalizeClient(CBufferIn& buffer);
[1875]195       
196       public:
197         void sendCouplerInReady(CContextClient* client);
198       private:
199         set<CContextClient*> sendCouplerInReady_done_;
200       public:
201         static void recvCouplerInReady(CEventServer& event) ;
202         void recvCouplerInReady(CBufferIn& buffer) ; //!< coupler is ready to receive grid definition.
203         set<CContextClient*> couplerInReady_;
204         bool isCouplerInReady(CContextClient* client) { return couplerInReady_.count(client)!=0 ;}
[1054]205
[1875]206       public:
207        void sendCouplerInCloseDefinition(CContextClient* client) ;
208        set<CContextClient*> sendCouplerInCloseDefinition_done_;
209        static void recvCouplerInCloseDefinition(CEventServer& event) ;
210        void recvCouplerInCloseDefinition(CBufferIn& buffer) ; //!< coupler has finished it defintion, data can be sent     
211        set<CContextClient*> couplerInCloseDefinition_ ;
212        bool isCouplerInCloseDefinition(CContextClient* client) { return couplerInCloseDefinition_.count(client)!=0 ;}
213
214       public:
215        void sendCouplerInContextFinalized(CContextClient* client) ;
216        set<CContextClient*> sendCouplerInContextFinalized_done_;
217        static void recvCouplerInContextFinalized(CEventServer& event) ;
218        void recvCouplerInContextFinalized(CBufferIn& buffer) ; //!< coupler has finished it defintion, data can be sent     
219        set<CContextClient*> couplerInContextFinalized_ ;
220        bool isCouplerInContextFinalized(CContextClient* client) { return couplerInContextFinalized_.count(client)!=0 ;}
221
222       public: 
223        void freeComms(void);                  //!< Free internally allcoated communicators
224        void releaseClientBuffers(void);       //! Deallocate buffers allocated by clientContexts
225
[509]226         // dispatch event
[549]227         static bool dispatchEvent(CEventServer& event);
[509]228
229      public:
230        // Get current context
231        static CContext* getCurrent(void);
232
233        // Get context root
234        static CContextGroup* getRoot(void);
235
236        // Set current context
237        static void setCurrent(const string& id);
238
239        // Create new context
240        static CContext* create(const string& id = "");
241
242        /// Accesseurs statiques ///
243        static StdString GetName(void);
244        static StdString GetDefName(void);
245        static ENodeType GetType(void);
246
247        static CContextGroup* GetContextGroup(void);
248
249        // Some functions to visualize structure of current context
250        static void ShowTree(StdOStream & out = std::clog);
251        static void CleanTree(void);
[1761]252        int getServiceType(void) {return serviceType_;}
[509]253
[219]254      public :
[509]255         // Parse xml node and write all info into context
[219]256         virtual void parse(xml::CXMLNode & node);
257
[509]258         // Visualize a context
[219]259         virtual StdString toString(void) const;
[509]260
261
262         // Solve all inheritance relation in current context
263         virtual void solveDescInheritance(bool apply, const CAttributeMap * const parent = 0);
264
265         // Verify if all root definition in a context have children
266         virtual bool hasChild(void) const;
267
[1761]268         bool isProcessingEvent(void) {return isProcessingEvent_;}
269         bool setProcessingEvent(void) {isProcessingEvent_=true ;}
270         bool unsetProcessingEvent(void) {isProcessingEvent_=false ;}
[1869]271         MPI_Comm getIntraComm(void) {return intraComm_ ;}
272         int getIntraCommRank(void) {return intraCommRank_;}
273         int getIntraCommSize(void) {return intraCommSize_;}
[1054]274
[1784]275         void addCouplingChanel(const std::string& contextId, bool out) ;
276
[300]277      public :
[509]278         // Calendar of context
[1542]279         std::shared_ptr<CCalendar>   calendar;
[509]280
[598]281         // List of all enabled files (files on which fields are written or read)
[347]282         std::vector<CFile*> enabledFiles;
[598]283         // List of all enabled files in read mode (files on which fields are read)
284         std::vector<CFile*> enabledReadModeFiles;
[1208]285         // List of all enabled files in write mode
286         std::vector<CFile*> enabledWriteModeFiles;
[509]287
[1784]288         std::vector<CCouplerIn*> enabledCouplerIn;
289         std::vector<CCouplerOut*> enabledCouplerOut;
290
291
[740]292         // List of all enabled fields whose instant data is accessible from the public API
293         // but which are not part of a file
[1869]294         std::vector<CField*> fieldsWithReadAccess_;
[1875]295         std::vector<CField*> couplerInFields_;
296         std::vector<CField*> fileInFields_;
[593]297
[1875]298
[509]299         // Context root
[1542]300         static std::shared_ptr<CContextGroup> root;
[219]301
[509]302         // Determine context on client or not
[549]303         bool hasClient;
[300]304
[509]305         // Determine context on server or not
[549]306         bool hasServer;
[509]307
[1130]308         CContextServer* server;    //!< Concrete context server
309         CContextClient* client;    //!< Concrete contex client
[1071]310         std::vector<CContextServer*> serverPrimServer;
311         std::vector<CContextClient*> clientPrimServer;
[1784]312
[1875]313         // list of slave servers (IO server or others)
314         set<CContextClient*> slaveServers_ ;
315      private:
316         // the map containing context client associated to it string id for coupling out ;
317         std::map<std::string, CContextClient*> couplerOutClient_ ;
318         // the map containing context server associated to it string id for coupling out ;
319         std::map<std::string, CContextServer*> couplerOutServer_ ;
320         // the map containing context client associated to it string id for coupling in ;
321         std::map<std::string, CContextClient*> couplerInClient_ ;
322         // the map containing context server associated to it string id for coupling in ;
323         std::map<std::string, CContextServer*> couplerInServer_ ;
324      public:
325         CContextClient* getCouplerInClient(const string& contextId) { return couplerInClient_[contextId] ;}
326         CContextServer* getCouplerInServer(const string& contextId) { return couplerInServer_[contextId] ;}
327         CContextClient* getCouplerOutClient(const string& contextId) { return couplerOutClient_[contextId] ;}
328         CContextServer* getCouplerOutServer(const string& contextId) { return couplerOutServer_[contextId] ;}
329     
330 
[1761]331         std::vector<std::string> primServerId_;
[1071]332
[1130]333         CRegistry* registryIn ;    //!< input registry which is read from file
334         CRegistry* registryOut ;   //!< output registry which will be written into file at the finalize
[775]335
[1761]336
337        MPI_Comm intraComm_ ; //! context intra communicator
[1784]338        int intraCommRank_ ; //! context intra communicator rank
339        int intraCommSize_ ; //! context intra communicator size
340       
[509]341      private:
[2022]342         CEventScheduler* eventScheduler_ ; //! The local event scheduler for context
343         size_t hashId_ ; //! the local hashId for scheduler
344         size_t timeLine_=0 ;
345         void initEventScheduler(void) ;
346
[509]347         bool isPostProcessed;
[1025]348         bool allProcessed;
[1139]349         bool finalized;
[1764]350         int countChildContextFinalized_;        //!< Counter of child contexts (for now it is the number of secondary server pools)
[639]351         CGarbageCollector garbageCollector;
[1639]352         std::list<MPI_Comm> comms; //!< Communicators allocated internally
[509]353
[1761]354         int serviceType_;  //!< service associated to the context
355         string contextId_ ; //!< context client id for the servers. For clients this is same as getId()
356         bool isProcessingEvent_ ;
[2130]357    private:     
[1761]358         CServerContext* parentServerContext_ ;
[2130]359    public:
360         CServerContext* getParentServerContext(void) { return parentServerContext_; }
361    private: 
362      bool lockedContext_=false;
363    public: 
364        void lockContext(void) {lockedContext_=true; }
365        void unlockContext(void) {lockedContext_=true; }
366        bool isLockedContext(void) { return lockedContext_;}
[509]367      public: // Some function maybe removed in the near future
368        // virtual void toBinary  (StdOStream & os) const;
369        // virtual void fromBinary(StdIStream & is);
[219]370   }; // class CContext
371
372   ///--------------------------------------------------------------
373
374   // Declare/Define CContextGroup and CContextDefinition
375   DECLARE_GROUP(CContext);
376
377   ///--------------------------------------------------------------
378
[335]379} // namespace xios
[219]380
[591]381#endif // __XIOS_CContext__
Note: See TracBrowser for help on using the repository browser.