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

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

Bug fix : bad value for unlockContext(), so context was never unlocked.

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
Line 
1#ifndef __XIOS_CContext__
2#define __XIOS_CContext__
3
4/// XIOS headers ///
5#include "xios_spl.hpp"
6//#include "node_type.hpp"
7#include "calendar_wrapper.hpp"
8
9#include "declare_group.hpp"
10#include "data_output.hpp"
11#include "garbage_collector.hpp"
12#include "registry.hpp"
13#include "mpi.hpp"
14#include "services_manager.hpp"
15#include "server_context.hpp"
16#include "event_scheduler.hpp"
17
18
19namespace xios
20{
21   class CContextClient;
22   class CContextServer;
23
24
25   /// ////////////////////// Déclarations ////////////////////// ///
26   class CContextGroup;
27   class CContextAttributes;
28   class CContext;
29   class CFile;
30   class CCouplerIn ;
31   class CCouplerOut ;
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   ///--------------------------------------------------------------
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  */
48   class CContext
49      : public CObjectTemplate<CContext>
50      , public CContextAttributes
51   {
52         public :
53         enum EEventId
54         {
55           EVENT_ID_CLOSE_DEFINITION,EVENT_ID_UPDATE_CALENDAR,
56           EVENT_ID_CREATE_FILE_HEADER,EVENT_ID_CONTEXT_FINALIZE,
57           EVENT_ID_SEND_REGISTRY,
58           EVENT_ID_CONTEXT_FINALIZE_CLIENT,
59           EVENT_ID_COUPLER_IN_READY,
60           EVENT_ID_COUPLER_IN_CLOSE_DEFINITION,
61           EVENT_ID_COUPLER_IN_CONTEXT_FINALIZED,
62         };
63
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 :
89
90         /// Mutateurs ///
91         void setCalendar(std::shared_ptr<CCalendar> newCalendar);
92
93         /// Accesseurs ///
94         std::shared_ptr<CCalendar>      getCalendar(void) const;
95
96      public :
97         // Initialize server or client
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
105         bool isInitialized(void);
106
107         StdString dumpClassAttributes(void);
108
109         // Put sever or client into loop state
110         bool eventLoop(bool enableEventsProcessing=true);
111         bool scheduledEventLoop(bool enableEventsProcessing=true) ; 
112         void globalEventLoop(void);
113
114         // Finalize a context
115         void finalize(void);
116
117         bool isFinalized(void);
118
119         void closeDefinition(void);
120
121         // to be removed     
122         std::vector<CField*> findAllEnabledFieldsInFiles(const std::vector<CFile*>& activeFiles);
123         // Some functions to process context
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);
128         // void findAllEnabledFields(void);
129         // void findAllEnabledFieldsInReadModeFiles(void);
130         void readAttributesOfEnabledFieldsInReadModeFiles();
131         void solveAllInheritance(bool apply=true);
132         void findEnabledFiles(void);
133         void findEnabledCouplerIn(void);
134         void findEnabledCouplerOut(void);
135         void createCouplerInterCommunicator(void) ;
136         void findEnabledWriteModeFiles(void);
137         void findEnabledReadModeFiles(void);
138         void closeAllFile(void);
139         void updateCalendar(int step);
140         void createFileHeader(void);
141         void initReadFiles(void);
142         void prepareTimeseries(void);
143         void postProcessFilterGraph();
144         void startPrefetchingOfEnabledReadModeFiles();
145         void doPreTimestepOperationsForEnabledReadModeFiles();
146         void doPostTimestepOperationsForEnabledReadModeFiles();
147         void findFieldsWithReadAccess(void);
148         void triggerLateFields(void) ;
149         
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);
152
153         // Distribute files (in write mode) among secondary-server pools according to the estimated data flux
154         void distributeFiles(const std::vector<CFile*>& files);
155         void distributeFileOverBandwith(const std::vector<CFile*>& files) ;
156         void distributeFileOverMemoryBandwith(const std::vector<CFile*>& files) ;
157         
158         // Send context close definition
159         void sendCloseDefinition(void);
160       public:
161         void sendCloseDefinition(CContextClient* client) ;
162       private:
163         set<CContextClient*> sendCloseDefinition_done_ ;
164       public:
165         // There are something to send on closing context defintion
166         void sendUpdateCalendar(int step);
167         void sendCreateFileHeader(void);
168         void sendEnabledFiles(const std::vector<CFile*>& activeFiles);
169         void sendEnabledFieldsInFiles(const std::vector<CFile*>& activeFiles);
170         void sendRefDomainsAxisScalars(const std::vector<CFile*>& activeFiles);
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) ;
173         void sendFinalizeClient(CContextClient* contextClient, const string& contextClientId);
174         
175         public:
176         void sendContextToFileServer(CContextClient* client) ;
177         private:
178         std::set<CContextClient*> sendToFileServer_done_ ;
179         
180         public: 
181         std::string getContextId() {return contextId_;}
182
183         // Client side: Receive and process messages
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);
189         static void recvSolveInheritanceContext(CEventServer& event);
190         void recvSolveInheritanceContext(CBufferIn& buffer);
191         static void recvRegistry(CEventServer& event) ;
192         void recvRegistry(CBufferIn& buffer) ; //!< registry is received by the servers
193         static void recvFinalizeClient(CEventServer& event) ;
194         void recvFinalizeClient(CBufferIn& buffer);
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 ;}
205
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
226         // dispatch event
227         static bool dispatchEvent(CEventServer& event);
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);
252        int getServiceType(void) {return serviceType_;}
253
254      public :
255         // Parse xml node and write all info into context
256         virtual void parse(xml::CXMLNode & node);
257
258         // Visualize a context
259         virtual StdString toString(void) const;
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
268         bool isProcessingEvent(void) {return isProcessingEvent_;}
269         bool setProcessingEvent(void) {isProcessingEvent_=true ;}
270         bool unsetProcessingEvent(void) {isProcessingEvent_=false ;}
271         MPI_Comm getIntraComm(void) {return intraComm_ ;}
272         int getIntraCommRank(void) {return intraCommRank_;}
273         int getIntraCommSize(void) {return intraCommSize_;}
274
275         void addCouplingChanel(const std::string& contextId, bool out) ;
276
277      public :
278         // Calendar of context
279         std::shared_ptr<CCalendar>   calendar;
280
281         // List of all enabled files (files on which fields are written or read)
282         std::vector<CFile*> enabledFiles;
283         // List of all enabled files in read mode (files on which fields are read)
284         std::vector<CFile*> enabledReadModeFiles;
285         // List of all enabled files in write mode
286         std::vector<CFile*> enabledWriteModeFiles;
287
288         std::vector<CCouplerIn*> enabledCouplerIn;
289         std::vector<CCouplerOut*> enabledCouplerOut;
290
291
292         // List of all enabled fields whose instant data is accessible from the public API
293         // but which are not part of a file
294         std::vector<CField*> fieldsWithReadAccess_;
295         std::vector<CField*> couplerInFields_;
296         std::vector<CField*> fileInFields_;
297
298
299         // Context root
300         static std::shared_ptr<CContextGroup> root;
301
302         // Determine context on client or not
303         bool hasClient;
304
305         // Determine context on server or not
306         bool hasServer;
307
308         CContextServer* server;    //!< Concrete context server
309         CContextClient* client;    //!< Concrete contex client
310         std::vector<CContextServer*> serverPrimServer;
311         std::vector<CContextClient*> clientPrimServer;
312
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 
331         std::vector<std::string> primServerId_;
332
333         CRegistry* registryIn ;    //!< input registry which is read from file
334         CRegistry* registryOut ;   //!< output registry which will be written into file at the finalize
335
336
337        MPI_Comm intraComm_ ; //! context intra communicator
338        int intraCommRank_ ; //! context intra communicator rank
339        int intraCommSize_ ; //! context intra communicator size
340       
341      private:
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
347         bool isPostProcessed;
348         bool allProcessed;
349         bool finalized;
350         int countChildContextFinalized_;        //!< Counter of child contexts (for now it is the number of secondary server pools)
351         CGarbageCollector garbageCollector;
352         std::list<MPI_Comm> comms; //!< Communicators allocated internally
353
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_ ;
357    private:     
358         CServerContext* parentServerContext_ ;
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_=false; }
366        bool isLockedContext(void) { return lockedContext_;}
367      public: // Some function maybe removed in the near future
368        // virtual void toBinary  (StdOStream & os) const;
369        // virtual void fromBinary(StdIStream & is);
370   }; // class CContext
371
372   ///--------------------------------------------------------------
373
374   // Declare/Define CContextGroup and CContextDefinition
375   DECLARE_GROUP(CContext);
376
377   ///--------------------------------------------------------------
378
379} // namespace xios
380
381#endif // __XIOS_CContext__
Note: See TracBrowser for help on using the repository browser.