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

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

Tracking memory leak : release memory statically alocated

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_CONTEXT_FINALIZE_CLIENT,
58           EVENT_ID_COUPLER_IN_READY,
59           EVENT_ID_COUPLER_IN_CLOSE_DEFINITION,
60           EVENT_ID_COUPLER_IN_CONTEXT_FINALIZED,
61         };
62
63         /// typedef ///
64         typedef CObjectTemplate<CContext>   SuperClass;
65         typedef CContextAttributes SuperClassAttribute;
66
67      public :
68
69         typedef CContextAttributes RelAttributes;
70         typedef CContext           RelGroup;
71
72         //---------------------------------------------------------
73
74      public :
75
76         /// Constructeurs ///
77         CContext(void);
78         explicit CContext(const StdString & id);
79         CContext(const CContext & context);       // Not implemented yet.
80         CContext(const CContext * const context); // Not implemented yet.
81
82         /// Destructeur ///
83         virtual ~CContext(void);
84
85         static void releaseStaticAllocation(void) ;
86
87         //---------------------------------------------------------
88
89      public :
90
91         /// Mutateurs ///
92         void setCalendar(std::shared_ptr<CCalendar> newCalendar);
93
94         /// Accesseurs ///
95         std::shared_ptr<CCalendar>      getCalendar(void) const;
96
97      public :
98         // Initialize server or client
99         void init(CServerContext* parentServerContext, MPI_Comm intraComm, int serviceType);
100         void initClient(MPI_Comm intraComm, int serviceType);
101         
102         void initServer(MPI_Comm intraComm, int serviceType );
103         void createClientInterComm(MPI_Comm interCommClient, MPI_Comm interCommServer)  ;
104         void createServerInterComm(void)  ;
105
106         bool isInitialized(void);
107
108         StdString dumpClassAttributes(void);
109
110         // Put sever or client into loop state
111         bool eventLoop(bool enableEventsProcessing=true);
112         bool scheduledEventLoop(bool enableEventsProcessing=true) ; 
113         void globalEventLoop(void);
114
115         // Finalize a context
116         void finalize(void);
117
118         bool isFinalized(void);
119
120         void closeDefinition(void);
121
122         // to be removed     
123         std::vector<CField*> findAllEnabledFieldsInFiles(const std::vector<CFile*>& activeFiles);
124         // Some functions to process context
125         std::vector<CField*> findAllEnabledFieldsInFileOut(const std::vector<CFile*>& activeFiles);
126         std::vector<CField*> findAllEnabledFieldsInFileIn(const std::vector<CFile*>& activeFiles);
127         std::vector<CField*> findAllEnabledFieldsCouplerOut(const std::vector<CCouplerOut*>& activeCouplerOut);
128         std::vector<CField*> findAllEnabledFieldsCouplerIn(const std::vector<CCouplerIn*>& activeCouplerIn);
129         // void findAllEnabledFields(void);
130         // void findAllEnabledFieldsInReadModeFiles(void);
131         void readAttributesOfEnabledFieldsInReadModeFiles();
132         void solveAllInheritance(bool apply=true);
133         void findEnabledFiles(void);
134         void findEnabledCouplerIn(void);
135         void findEnabledCouplerOut(void);
136         void createCouplerInterCommunicator(void) ;
137         void findEnabledWriteModeFiles(void);
138         void findEnabledReadModeFiles(void);
139         void closeAllFile(void);
140         void updateCalendar(int step);
141         void createFileHeader(void);
142         void initReadFiles(void);
143         void prepareTimeseries(void);
144         void postProcessFilterGraph();
145         void startPrefetchingOfEnabledReadModeFiles();
146         void doPreTimestepOperationsForEnabledReadModeFiles();
147         void doPostTimestepOperationsForEnabledReadModeFiles();
148         void findFieldsWithReadAccess(void);
149         void triggerLateFields(void) ;
150         
151         std::map<int, StdSize> getAttributesBufferSize(std::map<int, StdSize>& maxEventSize, CContextClient* contextClient, bool bufferForWriting = false);
152         std::map<int, StdSize> getDataBufferSize(std::map<int, StdSize>& maxEventSize, CContextClient* contextClient, bool bufferForWriting = false);
153
154         // Distribute files (in write mode) among secondary-server pools according to the estimated data flux
155         void distributeFiles(const std::vector<CFile*>& files);
156         void distributeFileOverBandwith(const std::vector<CFile*>& files) ;
157         void distributeFileOverMemoryBandwith(const std::vector<CFile*>& files) ;
158         
159         // Send context close definition
160         void sendCloseDefinition(void);
161       public:
162         void sendCloseDefinition(CContextClient* client) ;
163       private:
164         set<CContextClient*> sendCloseDefinition_done_ ;
165       public:
166         // There are something to send on closing context defintion
167         void sendUpdateCalendar(int step);
168         void sendCreateFileHeader(void);
169         void sendEnabledFiles(const std::vector<CFile*>& activeFiles);
170         void sendEnabledFieldsInFiles(const std::vector<CFile*>& activeFiles);
171         void sendRefDomainsAxisScalars(const std::vector<CFile*>& activeFiles);
172         //!< after be gathered to the root process of the context, merged registry is sent to the root process of the servers
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 recvFinalizeClient(CEventServer& event) ;
192         void recvFinalizeClient(CBufferIn& buffer);
193       
194       public:
195         void sendCouplerInReady(CContextClient* client);
196       private:
197         set<CContextClient*> sendCouplerInReady_done_;
198       public:
199         static void recvCouplerInReady(CEventServer& event) ;
200         void recvCouplerInReady(CBufferIn& buffer) ; //!< coupler is ready to receive grid definition.
201         set<CContextClient*> couplerInReady_;
202         bool isCouplerInReady(CContextClient* client) { return couplerInReady_.count(client)!=0 ;}
203
204       public:
205        void sendCouplerInCloseDefinition(CContextClient* client) ;
206        set<CContextClient*> sendCouplerInCloseDefinition_done_;
207        static void recvCouplerInCloseDefinition(CEventServer& event) ;
208        void recvCouplerInCloseDefinition(CBufferIn& buffer) ; //!< coupler has finished it defintion, data can be sent     
209        set<CContextClient*> couplerInCloseDefinition_ ;
210        bool isCouplerInCloseDefinition(CContextClient* client) { return couplerInCloseDefinition_.count(client)!=0 ;}
211
212       public:
213        void sendCouplerInContextFinalized(CContextClient* client) ;
214        set<CContextClient*> sendCouplerInContextFinalized_done_;
215        static void recvCouplerInContextFinalized(CEventServer& event) ;
216        void recvCouplerInContextFinalized(CBufferIn& buffer) ; //!< coupler has finished it defintion, data can be sent     
217        set<CContextClient*> couplerInContextFinalized_ ;
218        bool isCouplerInContextFinalized(CContextClient* client) { return couplerInContextFinalized_.count(client)!=0 ;}
219
220       public: 
221        void freeComms(void);                  //!< Free internally allcoated communicators
222        void releaseClientBuffers(void);       //! Deallocate buffers allocated by clientContexts
223
224         // dispatch event
225         static bool dispatchEvent(CEventServer& event);
226
227      public:
228        // Get current context
229        static CContext* getCurrent(void);
230
231        // Get context root
232        static CContextGroup* getRoot(void);
233       
234        // Set current context
235        static void setCurrent(const string& id);
236
237        // Create new context
238        static CContext* create(const string& id = "");
239
240        /// Accesseurs statiques ///
241        static StdString GetName(void);
242        static StdString GetDefName(void);
243        static ENodeType GetType(void);
244
245        static CContextGroup* GetContextGroup(void);
246
247        // Some functions to visualize structure of current context
248        static void ShowTree(StdOStream & out = std::clog);
249        static void CleanTree(void);
250        static void removeContext(const std::string& contextId);
251        static void removeAllContexts(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=nullptr ;    //!< input registry which is read from file
334         CRegistry* registryOut=nullptr ;   //!< 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.