source: XIOS3/trunk/src/node/context.hpp @ 2407

Last change on this file since 2407 was 2407, checked in by ymipsl, 21 months ago

Implement separate "reader" and "writer" service. Default reader live on same ressources that "writer" or "gatherer" services.

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: 16.4 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_COLLECTIVE=100,
56           EVENT_ID_CLOSE_DEFINITION,EVENT_ID_UPDATE_CALENDAR,
57           EVENT_ID_CONTEXT_FINALIZE,
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           EVENT_ID_NO_COLLECTIVE=1000,
63         };
64
65         /// typedef ///
66         typedef CObjectTemplate<CContext>   SuperClass;
67         typedef CContextAttributes SuperClassAttribute;
68
69      public :
70
71         typedef CContextAttributes RelAttributes;
72         typedef CContext           RelGroup;
73
74         //---------------------------------------------------------
75
76      public :
77
78         /// Constructeurs ///
79         CContext(void);
80         explicit CContext(const StdString & id);
81         CContext(const CContext & context);       // Not implemented yet.
82         CContext(const CContext * const context); // Not implemented yet.
83
84         /// Destructeur ///
85         virtual ~CContext(void);
86
87         static void releaseStaticAllocation(void) ;
88
89         //---------------------------------------------------------
90
91      public :
92
93         /// Mutateurs ///
94         void setCalendar(std::shared_ptr<CCalendar> newCalendar);
95
96         /// Accesseurs ///
97         std::shared_ptr<CCalendar>      getCalendar(void) const;
98
99      public :
100         // Initialize server or client
101         void init(CServerContext* parentServerContext, MPI_Comm intraComm, int serviceType);
102         void initClient(MPI_Comm intraComm, int serviceType);
103         
104         void initServer(MPI_Comm intraComm, int serviceType );
105         void createClientInterComm(MPI_Comm interCommClient, MPI_Comm interCommServer)  ;
106 
107         void createServerInterComm(void)  ;
108         void createServerInterComm_old(void)  ;
109         void createServerInterComm(const string& poolId, const string& serverId, vector<pair<string, pair<CContextClient*,CContextServer*>>>& clientServers ) ;
110 
111
112         bool isInitialized(void);
113
114         StdString dumpClassAttributes(void);
115
116         // Put sever or client into loop state
117         bool eventLoop(bool enableEventsProcessing=true);
118         bool scheduledEventLoop(bool enableEventsProcessing=true) ; 
119         void globalEventLoop(void);
120
121         // Finalize a context
122         void finalize(void);
123
124         bool isFinalized(void);
125
126         void closeDefinition(void);
127
128         // to be removed     
129         std::vector<CField*> findAllEnabledFieldsInFiles(const std::vector<CFile*>& activeFiles);
130         // Some functions to process context
131         std::vector<CField*> findAllEnabledFieldsInFileOut(const std::vector<CFile*>& activeFiles);
132         std::vector<CField*> findAllEnabledFieldsInFileIn(const std::vector<CFile*>& activeFiles);
133         std::vector<CField*> findAllEnabledFieldsCouplerOut(const std::vector<CCouplerOut*>& activeCouplerOut);
134         std::vector<CField*> findAllEnabledFieldsCouplerIn(const std::vector<CCouplerIn*>& activeCouplerIn);
135         // void findAllEnabledFields(void);
136         // void findAllEnabledFieldsInReadModeFiles(void);
137         void readAttributesOfEnabledFieldsInReadModeFiles();
138         void solveAllInheritance(bool apply=true);
139         void findEnabledFiles(void);
140         void findEnabledCouplerIn(void);
141         void findEnabledCouplerOut(void);
142         void createCouplerInterCommunicator(void) ;
143         void findEnabledWriteModeFiles(void);
144         void findEnabledReadModeFiles(void);
145         void closeAllFile(void);
146         void updateCalendar(int step);
147         void createFileHeader(void);
148         void initReadFiles(void);
149         void prepareTimeseries(void);
150         void postProcessFilterGraph();
151         void startPrefetchingOfEnabledReadModeFiles();
152         void doPreTimestepOperationsForEnabledReadModeFiles();
153         void doPostTimestepOperationsForEnabledReadModeFiles();
154         void findFieldsWithReadAccess(void);
155         void triggerLateFields(void) ;
156         
157         std::map<int, StdSize> getAttributesBufferSize(std::map<int, StdSize>& maxEventSize, CContextClient* contextClient, bool bufferForWriting = false);
158         std::map<int, StdSize> getDataBufferSize(std::map<int, StdSize>& maxEventSize, CContextClient* contextClient, bool bufferForWriting = false);
159
160         // Distribute files (in write mode) among secondary-server pools according to the estimated data flux
161         void distributeFiles(const std::vector<CFile*>& files);
162         void distributeFileOverOne(const vector<CFile*>& files) ; //!< Distribute files over one single server (no distribution)
163         void distributeFileOverBandwith(const std::vector<CFile*>& files) ; //!< Distribute files overs servers to balance the I/O bandwith
164         void distributeFileOverMemoryBandwith(const std::vector<CFile*>& files) ; //!< Distribute files overs servers to minimize the memory consumption
165         
166       public:
167         // Send context close definition
168         void sendCloseDefinition(CContextClient* client) ;
169       private:
170         set<CContextClient*> sendCloseDefinition_done_ ;
171       public:
172         // There are something to send on closing context defintion
173         void sendUpdateCalendar(int step);
174         void sendEnabledFiles(const std::vector<CFile*>& activeFiles);
175         void sendEnabledFieldsInFiles(const std::vector<CFile*>& activeFiles);
176         void sendRefDomainsAxisScalars(const std::vector<CFile*>& activeFiles);
177         //!< after be gathered to the root process of the context, merged registry is sent to the root process of the servers
178         void sendFinalizeClient(CContextClient* contextClient, const string& contextClientId);
179         
180         public:
181         void sendContextToFileServer(CContextClient* client) ;
182         private:
183         std::set<CContextClient*> sendToFileServer_done_ ;
184         
185         public: 
186         std::string getContextId() {return contextId_;}
187
188         // Client side: Receive and process messages
189         static void recvUpdateCalendar(CEventServer& event);
190         void recvUpdateCalendar(CBufferIn& buffer);
191         static void recvCloseDefinition(CEventServer& event);
192         static void recvSolveInheritanceContext(CEventServer& event);
193         void recvSolveInheritanceContext(CBufferIn& buffer);
194         static void recvFinalizeClient(CEventServer& event) ;
195         void recvFinalizeClient(CBufferIn& buffer);
196       
197       public:
198         void sendCouplerInReady(CContextClient* client);
199       private:
200         set<CContextClient*> sendCouplerInReady_done_;
201       public:
202         static void recvCouplerInReady(CEventServer& event) ;
203         void recvCouplerInReady(CBufferIn& buffer) ; //!< coupler is ready to receive grid definition.
204         set<CContextClient*> couplerInReady_;
205         bool isCouplerInReady(CContextClient* client) { return couplerInReady_.count(client)!=0 ;}
206
207       public:
208        void sendCouplerInCloseDefinition(CContextClient* client) ;
209        set<CContextClient*> sendCouplerInCloseDefinition_done_;
210        static void recvCouplerInCloseDefinition(CEventServer& event) ;
211        void recvCouplerInCloseDefinition(CBufferIn& buffer) ; //!< coupler has finished it defintion, data can be sent     
212        set<CContextClient*> couplerInCloseDefinition_ ;
213        bool isCouplerInCloseDefinition(CContextClient* client) { return couplerInCloseDefinition_.count(client)!=0 ;}
214
215       public:
216        void sendCouplerInContextFinalized(CContextClient* client) ;
217        set<CContextClient*> sendCouplerInContextFinalized_done_;
218        static void recvCouplerInContextFinalized(CEventServer& event) ;
219        void recvCouplerInContextFinalized(CBufferIn& buffer) ; //!< coupler has finished it defintion, data can be sent     
220        set<CContextClient*> couplerInContextFinalized_ ;
221        bool isCouplerInContextFinalized(CContextClient* client) { return couplerInContextFinalized_.count(client)!=0 ;}
222
223       public: 
224        void freeComms(void);                  //!< Free internally allcoated communicators
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        static void removeContext(const std::string& contextId);
253        static void removeAllContexts(void) ;
254        int getServiceType(void) {return serviceType_;}
255
256      public :
257         // Parse xml node and write all info into context
258         virtual void parse(xml::CXMLNode & node);
259
260         // Visualize a context
261         virtual StdString toString(void) const;
262
263
264         // Solve all inheritance relation in current context
265         virtual void solveDescInheritance(bool apply, const CAttributeMap * const parent = 0);
266
267         // Verify if all root definition in a context have children
268         virtual bool hasChild(void) const;
269
270         bool isProcessingEvent(void) {return isProcessingEvent_;}
271         bool setProcessingEvent(void) {isProcessingEvent_=true ;}
272         bool unsetProcessingEvent(void) {isProcessingEvent_=false ;}
273         MPI_Comm getIntraComm(void) {return intraComm_ ;}
274         int getIntraCommRank(void) {return intraCommRank_;}
275         int getIntraCommSize(void) {return intraCommSize_;}
276
277         void addCouplingChanel(const std::string& contextId, bool out) ;
278
279      public :
280         // Calendar of context
281         std::shared_ptr<CCalendar>   calendar;
282
283         // List of all enabled files (files on which fields are written or read)
284         std::vector<CFile*> enabledFiles;
285         // List of all enabled files in read mode (files on which fields are read)
286         std::vector<CFile*> enabledReadModeFiles;
287         // List of all enabled files in write mode
288         std::vector<CFile*> enabledWriteModeFiles;
289
290         std::vector<CCouplerIn*> enabledCouplerIn;
291         std::vector<CCouplerOut*> enabledCouplerOut;
292
293
294         // List of all enabled fields whose instant data is accessible from the public API
295         // but which are not part of a file
296         std::vector<CField*> fieldsWithReadAccess_;
297         std::vector<CField*> couplerInFields_;
298         std::vector<CField*> fileInFields_;
299
300
301         // Context root
302         static std::shared_ptr<CContextGroup> root;
303
304         // Determine context on client or not
305         bool hasClient;
306
307         // Determine context on server or not
308         bool hasServer;
309
310
311      private:
312        std::string defaultReaderId ;
313        std::string defaultWriterId ;
314        std::string defaultGathererId ;
315
316        std::vector<CContextClient*> writerClientOut_ ;
317        std::vector<CContextServer*> writerServerOut_ ;
318        std::vector<CContextClient*> writerClientIn_ ;
319        std::vector<CContextServer*> writerServerIn_ ;
320
321        std::vector<CContextClient*> readerClientOut_ ;
322        std::vector<CContextServer*> readerServerOut_ ;
323        std::vector<CContextClient*> readerClientIn_ ;
324        std::vector<CContextServer*> readerServerIn_ ;
325
326
327        std::map<std::string, CContextClient*> clients_ ;
328        std::map<std::string, CContextClient*> servers_ ;
329        std::map<CContextClient*, std::string> clientsId_ ;
330        std::map<CContextServer*, std::string> serversId_ ;
331
332        // list of slave servers (IO server or others)
333        std::vector<CContextClient*> slaveServers_ ;
334
335        // the map containing context client associated to it string id for coupling out ;
336        std::map<std::string, CContextClient*> couplerOutClient_ ;
337        // the map containing context server associated to it string id for coupling out ;
338        std::map<std::string, CContextServer*> couplerOutServer_ ;
339        // the map containing context client associated to it string id for coupling in ;
340        std::map<std::string, CContextClient*> couplerInClient_ ;
341        // the map containing context server associated to it string id for coupling in ;
342        std::map<std::string, CContextServer*> couplerInServer_ ;
343      public:
344         CContextClient* getCouplerInClient(const string& contextId) { return couplerInClient_[contextId] ;}
345         CContextServer* getCouplerInServer(const string& contextId) { return couplerInServer_[contextId] ;}
346         CContextClient* getCouplerOutClient(const string& contextId) { return couplerOutClient_[contextId] ;}
347         CContextServer* getCouplerOutServer(const string& contextId) { return couplerOutServer_[contextId] ;}
348
349         CRegistry* registryIn=nullptr ;    //!< input registry which is read from file
350         CRegistry* registryOut=nullptr ;   //!< output registry which will be written into file at the finalize
351
352
353        MPI_Comm intraComm_ ; //! context intra communicator
354        int intraCommRank_ ; //! context intra communicator rank
355        int intraCommSize_ ; //! context intra communicator size
356       
357      private:
358         shared_ptr<CEventScheduler> eventScheduler_ ; //! The local event scheduler for context
359         size_t hashId_ ; //! the local hashId for scheduler
360         size_t timeLine_=0 ;
361         void initEventScheduler(void) ;
362
363         bool isPostProcessed;
364         bool allProcessed;
365         bool finalized;
366         int countChildContextFinalized_;        //!< Counter of child contexts (for now it is the number of secondary server pools)
367         CGarbageCollector garbageCollector;
368         std::list<MPI_Comm> comms; //!< Communicators allocated internally
369
370         int serviceType_;  //!< service associated to the context
371         string contextId_ ; //!< context client id for the servers. For clients this is same as getId()
372         bool isProcessingEvent_ ;
373    private:     
374         CServerContext* parentServerContext_ ;
375    public:
376         CServerContext* getParentServerContext(void) { return parentServerContext_; }
377    private: 
378      bool lockedContext_=false;
379    public: 
380        void lockContext(void) {lockedContext_=true; }
381        void unlockContext(void) {lockedContext_=false; }
382        bool isLockedContext(void) { return lockedContext_;}
383      public: // Some function maybe removed in the near future
384        // virtual void toBinary  (StdOStream & os) const;
385        // virtual void fromBinary(StdIStream & is);
386   }; // class CContext
387
388   ///--------------------------------------------------------------
389
390   // Declare/Define CContextGroup and CContextDefinition
391   DECLARE_GROUP(CContext);
392
393   ///--------------------------------------------------------------
394
395} // namespace xios
396
397#endif // __XIOS_CContext__
Note: See TracBrowser for help on using the repository browser.