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

Last change on this file since 1984 was 1984, checked in by ymipsl, 4 years ago

intermediate commit for new tranformation engine?
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.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
17
18namespace xios {
19   class CContextClient;
20   class CContextServer;
21
22
23   /// ////////////////////// Déclarations ////////////////////// ///
24   class CContextGroup;
25   class CContextAttributes;
26   class CContext;
27   class CFile;
28   class CCouplerIn ;
29   class CCouplerOut ;
30   ///--------------------------------------------------------------
31
32   // Declare/Define CFileAttribute
33   BEGIN_DECLARE_ATTRIBUTE_MAP(CContext)
34#  include "context_attribute.conf"
35   END_DECLARE_ATTRIBUTE_MAP(CContext)
36
37   ///--------------------------------------------------------------
38  /*!
39  \class CContext
40   This class corresponds to the concrete presentation of context in xml file and in play an essential role in XIOS
41   Each object of this class contains all root definition of elements: files, fiels, domains, axis, etc, ... from which
42   we can have access to each element.
43   In fact, every thing must a be inside a particuliar context. After the xml file (iodef.xml) is parsed,
44   object of the class is created and its contains all information of other elements in the xml file.
45  */
46   class CContext
47      : public CObjectTemplate<CContext>
48      , public CContextAttributes
49   {
50         public :
51         enum EEventId
52         {
53           EVENT_ID_CLOSE_DEFINITION,EVENT_ID_UPDATE_CALENDAR,
54           EVENT_ID_CREATE_FILE_HEADER,EVENT_ID_CONTEXT_FINALIZE,
55           EVENT_ID_SEND_REGISTRY,
56           EVENT_ID_CONTEXT_FINALIZE_CLIENT,
57           EVENT_ID_COUPLER_IN_READY,
58           EVENT_ID_COUPLER_IN_CLOSE_DEFINITION,
59           EVENT_ID_COUPLER_IN_CONTEXT_FINALIZED,
60         };
61
62         /// typedef ///
63         typedef CObjectTemplate<CContext>   SuperClass;
64         typedef CContextAttributes SuperClassAttribute;
65
66      public :
67
68         typedef CContextAttributes RelAttributes;
69         typedef CContext           RelGroup;
70
71         //---------------------------------------------------------
72
73      public :
74
75         /// Constructeurs ///
76         CContext(void);
77         explicit CContext(const StdString & id);
78         CContext(const CContext & context);       // Not implemented yet.
79         CContext(const CContext * const context); // Not implemented yet.
80
81         /// Destructeur ///
82         virtual ~CContext(void);
83
84         //---------------------------------------------------------
85
86      public :
87
88         /// Mutateurs ///
89         void setCalendar(std::shared_ptr<CCalendar> newCalendar);
90
91         /// Accesseurs ///
92         std::shared_ptr<CCalendar>      getCalendar(void) const;
93
94      public :
95         // Initialize server or client
96         void init(CServerContext* parentServerContext, MPI_Comm intraComm, int serviceType);
97         void initClient(MPI_Comm intraComm, int serviceType);
98         
99         void initServer(MPI_Comm intraComm, int serviceType );
100         void createClientInterComm(MPI_Comm interCommClient, MPI_Comm interCommServer)  ;
101         void createServerInterComm(void)  ;
102
103         bool isInitialized(void);
104
105         StdString dumpClassAttributes(void);
106
107         // Put sever or client into loop state
108         bool eventLoop(bool enableEventsProcessing=true);
109         void globalEventLoop(void);
110
111         // Finalize a context
112         void finalize(void);
113
114         bool isFinalized(void);
115
116         void closeDefinition(void);
117
118         // to be removed     
119         std::vector<CField*> findAllEnabledFieldsInFiles(const std::vector<CFile*>& activeFiles);
120         // Some functions to process context
121         std::vector<CField*> findAllEnabledFieldsInFileOut(const std::vector<CFile*>& activeFiles);
122         std::vector<CField*> findAllEnabledFieldsInFileIn(const std::vector<CFile*>& activeFiles);
123         std::vector<CField*> findAllEnabledFieldsCouplerOut(const std::vector<CCouplerOut*>& activeCouplerOut);
124         std::vector<CField*> findAllEnabledFieldsCouplerIn(const std::vector<CCouplerIn*>& activeCouplerIn);
125         // void findAllEnabledFields(void);
126         // void findAllEnabledFieldsInReadModeFiles(void);
127         void readAttributesOfEnabledFieldsInReadModeFiles();
128         void solveAllInheritance(bool apply=true);
129         void findEnabledFiles(void);
130         void findEnabledCouplerIn(void);
131         void findEnabledCouplerOut(void);
132         void createCouplerInterCommunicator(void) ;
133         void findEnabledWriteModeFiles(void);
134         void findEnabledReadModeFiles(void);
135         void closeAllFile(void);
136         void updateCalendar(int step);
137         void createFileHeader(void);
138         void initReadFiles(void);
139         void prepareTimeseries(void);
140         void solveOnlyRefOfEnabledFields(void);         
141         void postProcessFilterGraph();
142         void startPrefetchingOfEnabledReadModeFiles();
143         void doPreTimestepOperationsForEnabledReadModeFiles();
144         void doPostTimestepOperationsForEnabledReadModeFiles();
145         void findFieldsWithReadAccess(void);
146         void triggerLateFields(void) ;
147         void solveAllRefOfEnabledFieldsAndTransform(void);
148 
149         std::map<int, StdSize> getAttributesBufferSize(std::map<int, StdSize>& maxEventSize, CContextClient* contextClient, bool bufferForWriting = false);
150         std::map<int, StdSize> getDataBufferSize(std::map<int, StdSize>& maxEventSize, CContextClient* contextClient, bool bufferForWriting = false);
151         void setClientServerBuffer(CContextClient* contextClient, bool bufferForWriting = false); // old interface to be removed
152         void setClientServerBuffer(vector<CField*>& fields, bool bufferForWriting) ; 
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 sendRegistry(void) ;
174         void sendFinalizeClient(CContextClient* contextClient, const string& contextClientId);
175         
176         public:
177         void sendContextToFileServer(CContextClient* client) ;
178         private:
179         std::set<CContextClient*> sendToFileServer_done_ ;
180         
181         public: 
182         std::string getContextId() {return contextId_;}
183
184         // Client side: Receive and process messages
185         static void recvUpdateCalendar(CEventServer& event);
186         void recvUpdateCalendar(CBufferIn& buffer);
187         static void recvCloseDefinition(CEventServer& event);
188         static void recvCreateFileHeader(CEventServer& event);
189         void recvCreateFileHeader(CBufferIn& buffer);
190         static void recvSolveInheritanceContext(CEventServer& event);
191         void recvSolveInheritanceContext(CBufferIn& buffer);
192         static void recvRegistry(CEventServer& event) ;
193         void recvRegistry(CBufferIn& buffer) ; //!< registry is received by the servers
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        void releaseClientBuffers(void);       //! Deallocate buffers allocated by clientContexts
226
227         // dispatch event
228         static bool dispatchEvent(CEventServer& event);
229
230      public:
231        // Get current context
232        static CContext* getCurrent(void);
233
234        // Get context root
235        static CContextGroup* getRoot(void);
236
237        // Set current context
238        static void setCurrent(const string& id);
239
240        // Create new context
241        static CContext* create(const string& id = "");
242
243        /// Accesseurs statiques ///
244        static StdString GetName(void);
245        static StdString GetDefName(void);
246        static ENodeType GetType(void);
247
248        static CContextGroup* GetContextGroup(void);
249
250        // Some functions to visualize structure of current context
251        static void ShowTree(StdOStream & out = std::clog);
252        static void CleanTree(void);
253        int getServiceType(void) {return serviceType_;}
254
255      public :
256         // Parse xml node and write all info into context
257         virtual void parse(xml::CXMLNode & node);
258
259         // Visualize a context
260         virtual StdString toString(void) const;
261
262
263         // Solve all inheritance relation in current context
264         virtual void solveDescInheritance(bool apply, const CAttributeMap * const parent = 0);
265
266         // Verify if all root definition in a context have children
267         virtual bool hasChild(void) const;
268
269         bool isProcessingEvent(void) {return isProcessingEvent_;}
270         bool setProcessingEvent(void) {isProcessingEvent_=true ;}
271         bool unsetProcessingEvent(void) {isProcessingEvent_=false ;}
272         MPI_Comm getIntraComm(void) {return intraComm_ ;}
273         int getIntraCommRank(void) {return intraCommRank_;}
274         int getIntraCommSize(void) {return intraCommSize_;}
275
276         void addCouplingChanel(const std::string& contextId, bool out) ;
277
278      public :
279         // Calendar of context
280         std::shared_ptr<CCalendar>   calendar;
281
282         // List of all enabled files (files on which fields are written or read)
283         std::vector<CFile*> enabledFiles;
284         // List of all enabled files in read mode (files on which fields are read)
285         std::vector<CFile*> enabledReadModeFiles;
286         // List of all enabled files in write mode
287         std::vector<CFile*> enabledWriteModeFiles;
288
289         std::vector<CCouplerIn*> enabledCouplerIn;
290         std::vector<CCouplerOut*> enabledCouplerOut;
291
292
293         // List of all enabled fields whose instant data is accessible from the public API
294         // but which are not part of a file
295         std::vector<CField*> fieldsWithReadAccess_;
296         std::vector<CField*> couplerInFields_;
297         std::vector<CField*> fileInFields_;
298
299
300         // Context root
301         static std::shared_ptr<CContextGroup> root;
302
303         // Determine context on client or not
304         bool hasClient;
305
306         // Determine context on server or not
307         bool hasServer;
308
309         CContextServer* server;    //!< Concrete context server
310         CContextClient* client;    //!< Concrete contex client
311         std::vector<CContextServer*> serverPrimServer;
312         std::vector<CContextClient*> clientPrimServer;
313
314         // list of slave servers (IO server or others)
315         set<CContextClient*> slaveServers_ ;
316      private:
317         // the map containing context client associated to it string id for coupling out ;
318         std::map<std::string, CContextClient*> couplerOutClient_ ;
319         // the map containing context server associated to it string id for coupling out ;
320         std::map<std::string, CContextServer*> couplerOutServer_ ;
321         // the map containing context client associated to it string id for coupling in ;
322         std::map<std::string, CContextClient*> couplerInClient_ ;
323         // the map containing context server associated to it string id for coupling in ;
324         std::map<std::string, CContextServer*> couplerInServer_ ;
325      public:
326         CContextClient* getCouplerInClient(const string& contextId) { return couplerInClient_[contextId] ;}
327         CContextServer* getCouplerInServer(const string& contextId) { return couplerInServer_[contextId] ;}
328         CContextClient* getCouplerOutClient(const string& contextId) { return couplerOutClient_[contextId] ;}
329         CContextServer* getCouplerOutServer(const string& contextId) { return couplerOutServer_[contextId] ;}
330     
331 
332         std::vector<std::string> primServerId_;
333
334         CRegistry* registryIn ;    //!< input registry which is read from file
335         CRegistry* registryOut ;   //!< output registry which will be written into file at the finalize
336
337
338        MPI_Comm intraComm_ ; //! context intra communicator
339        int intraCommRank_ ; //! context intra communicator rank
340        int intraCommSize_ ; //! context intra communicator size
341       
342      private:
343         bool isPostProcessed;
344         bool allProcessed;
345         bool finalized;
346         int countChildContextFinalized_;        //!< Counter of child contexts (for now it is the number of secondary server pools)
347         CGarbageCollector garbageCollector;
348         std::list<MPI_Comm> comms; //!< Communicators allocated internally
349
350         int serviceType_;  //!< service associated to the context
351         string contextId_ ; //!< context client id for the servers. For clients this is same as getId()
352         bool isProcessingEvent_ ;
353         CServerContext* parentServerContext_ ;
354
355      public: // Some function maybe removed in the near future
356        // virtual void toBinary  (StdOStream & os) const;
357        // virtual void fromBinary(StdIStream & is);
358   }; // class CContext
359
360   ///--------------------------------------------------------------
361
362   // Declare/Define CContextGroup and CContextDefinition
363   DECLARE_GROUP(CContext);
364
365   ///--------------------------------------------------------------
366
367} // namespace xios
368
369#endif // __XIOS_CContext__
Note: See TracBrowser for help on using the repository browser.