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

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

Some update on XIOS_COUPLING branch...

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: 13.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
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_POST_PROCESS, EVENT_ID_SEND_REGISTRY,
56           EVENT_ID_POST_PROCESS_GLOBAL_ATTRIBUTES,
57           EVENT_ID_PROCESS_GRID_ENABLED_FIELDS,
58           EVENT_ID_CONTEXT_FINALIZE_CLIENT,
59         };
60
61         /// typedef ///
62         typedef CObjectTemplate<CContext>   SuperClass;
63         typedef CContextAttributes SuperClassAttribute;
64
65      public :
66
67         typedef CContextAttributes RelAttributes;
68         typedef CContext           RelGroup;
69
70         //---------------------------------------------------------
71
72      public :
73
74         /// Constructeurs ///
75         CContext(void);
76         explicit CContext(const StdString & id);
77         CContext(const CContext & context);       // Not implemented yet.
78         CContext(const CContext * const context); // Not implemented yet.
79
80         /// Destructeur ///
81         virtual ~CContext(void);
82
83         //---------------------------------------------------------
84
85      public :
86
87         /// Mutateurs ///
88         void setCalendar(std::shared_ptr<CCalendar> newCalendar);
89
90         /// Accesseurs ///
91         std::shared_ptr<CCalendar>      getCalendar(void) const;
92
93      public :
94         // Initialize server or client
95         void init(CServerContext* parentServerContext, MPI_Comm intraComm, int serviceType);
96         void initClient(MPI_Comm intraComm, int serviceType);
97         
98         void initServer(MPI_Comm intraComm, int serviceType );
99         void createClientInterComm(MPI_Comm interCommClient, MPI_Comm interCommServer)  ;
100         void createServerInterComm(void)  ;
101
102         bool isInitialized(void);
103
104         StdString dumpClassAttributes(void);
105
106         // Put sever or client into loop state
107         bool eventLoop(bool enableEventsProcessing=true);
108         void globalEventLoop(void);
109
110         // Finalize a context
111         void finalize(void);
112
113         bool isFinalized(void);
114
115         void closeDefinition(void);
116         void closeDefinition_old(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 checkAxisDomainsGridsEligibilityForCompressedOutput();
140         void prepareTimeseries(void);
141         void solveOnlyRefOfEnabledFields(void);         
142         void buildFilterGraphOfEnabledFields();
143         void postProcessFilterGraph();
144         void startPrefetchingOfEnabledReadModeFiles();
145         void doPreTimestepOperationsForEnabledReadModeFiles();
146         void doPostTimestepOperationsForEnabledReadModeFiles();
147         void findFieldsWithReadAccess(void);
148         void solveAllRefOfFieldsWithReadAccess();
149         void buildFilterGraphOfFieldsWithReadAccess();
150         void postProcessing();
151         void postProcessingGlobalAttributes();         
152
153         void solveAllRefOfEnabledFieldsAndTransform(void);
154         void checkGridEnabledFields();
155         void checkGridEnabledFieldsInFiles(const std::vector<CFile*>& activeFiles);
156         void sendGridEnabledFieldsInFiles(const std::vector<CFile*>& activeFiles); 
157         void sendGridComponentEnabledFieldsInFiles(const std::vector<CFile*>& activeFiles)       ;
158
159         std::map<int, StdSize> getAttributesBufferSize(std::map<int, StdSize>& maxEventSize, CContextClient* contextClient, bool bufferForWriting = false);
160         std::map<int, StdSize> getDataBufferSize(std::map<int, StdSize>& maxEventSize, CContextClient* contextClient, bool bufferForWriting = false);
161         void setClientServerBuffer(CContextClient* contextClient, bool bufferForWriting = false); // old interface to be removed
162         void setClientServerBuffer(vector<CField*>& fields, bool bufferForWriting) ; 
163
164         // Distribute files (in write mode) among secondary-server pools according to the estimated data flux
165         void distributeFiles(const std::vector<CFile*>& files);
166         void distributeFileOverBandwith(const std::vector<CFile*>& files) ;
167         void distributeFileOverMemoryBandwith(const std::vector<CFile*>& files) ;
168         
169         // Send context close definition
170         void sendCloseDefinition(void);
171         // There are something to send on closing context defintion
172         void sendUpdateCalendar(int step);
173         void sendCreateFileHeader(void);
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         void sendRefGrid(const std::vector<CFile*>& activeFiles);
178         void sendPostProcessing();
179         void sendPostProcessingGlobalAttributes();
180         void sendProcessingGridOfEnabledFields();
181         //!< after be gathered to the root process of the context, merged registry is sent to the root process of the servers
182         void sendRegistry(void) ;
183         void sendFinalizeClient(CContextClient* contextClient, const string& contextClientId);
184         
185         public:
186         void sendContextToFileServer(CContextClient* client) ;
187         private:
188         std::set<CContextClient*> sendToFileServer_done_ ;
189         
190         public: 
191         std::string getContextId() {return contextId_;}
192
193         // Client side: Receive and process messages
194         static void recvUpdateCalendar(CEventServer& event);
195         void recvUpdateCalendar(CBufferIn& buffer);
196         static void recvCloseDefinition(CEventServer& event);
197         static void recvCreateFileHeader(CEventServer& event);
198         void recvCreateFileHeader(CBufferIn& buffer);
199         static void recvSolveInheritanceContext(CEventServer& event);
200         void recvSolveInheritanceContext(CBufferIn& buffer);
201         static void recvPostProcessing(CEventServer& event);
202         void recvPostProcessing(CBufferIn& buffer);
203         static void recvProcessingGridOfEnabledFields(CEventServer& event);
204         static void recvPostProcessingGlobalAttributes(CEventServer& event);
205         void recvPostProcessingGlobalAttributes(CBufferIn& buffer);
206         static void recvRegistry(CEventServer& event) ;
207         void recvRegistry(CBufferIn& buffer) ; //!< registry is received by the servers
208         static void recvFinalizeClient(CEventServer& event) ;
209         void recvFinalizeClient(CBufferIn& buffer);
210         
211         void freeComms(void);                  //!< Free internally allcoated communicators
212         void releaseClientBuffers(void);       //! Deallocate buffers allocated by clientContexts
213
214         // dispatch event
215         static bool dispatchEvent(CEventServer& event);
216
217      public:
218        // Get current context
219        static CContext* getCurrent(void);
220
221        // Get context root
222        static CContextGroup* getRoot(void);
223
224        // Set current context
225        static void setCurrent(const string& id);
226
227        // Create new context
228        static CContext* create(const string& id = "");
229
230        /// Accesseurs statiques ///
231        static StdString GetName(void);
232        static StdString GetDefName(void);
233        static ENodeType GetType(void);
234
235        static CContextGroup* GetContextGroup(void);
236
237        // Some functions to visualize structure of current context
238        static void ShowTree(StdOStream & out = std::clog);
239        static void CleanTree(void);
240        int getServiceType(void) {return serviceType_;}
241
242      public :
243         // Parse xml node and write all info into context
244         virtual void parse(xml::CXMLNode & node);
245
246         // Visualize a context
247         virtual StdString toString(void) const;
248
249
250         // Solve all inheritance relation in current context
251         virtual void solveDescInheritance(bool apply, const CAttributeMap * const parent = 0);
252
253         // Verify if all root definition in a context have children
254         virtual bool hasChild(void) const;
255
256         bool isProcessingEvent(void) {return isProcessingEvent_;}
257         bool setProcessingEvent(void) {isProcessingEvent_=true ;}
258         bool unsetProcessingEvent(void) {isProcessingEvent_=false ;}
259         MPI_Comm getIntraComm(void) {return intraComm_ ;}
260         int getIntraCommRank(void) {return intraCommRank_;}
261         int getIntraCommSize(void) {return intraCommSize_;}
262
263         void addCouplingChanel(const std::string& contextId, bool out) ;
264
265      public :
266         // Calendar of context
267         std::shared_ptr<CCalendar>   calendar;
268
269         // List of all enabled files (files on which fields are written or read)
270         std::vector<CFile*> enabledFiles;
271         // List of all enabled files in read mode (files on which fields are read)
272         std::vector<CFile*> enabledReadModeFiles;
273         // List of all enabled files in write mode
274         std::vector<CFile*> enabledWriteModeFiles;
275
276         std::vector<CCouplerIn*> enabledCouplerIn;
277         std::vector<CCouplerOut*> enabledCouplerOut;
278
279
280         // List of all enabled fields whose instant data is accessible from the public API
281         // but which are not part of a file
282         std::vector<CField*> fieldsWithReadAccess_;
283
284         // Context root
285         static std::shared_ptr<CContextGroup> root;
286
287         // Determine context on client or not
288         bool hasClient;
289
290         // Determine context on server or not
291         bool hasServer;
292
293         CContextServer* server;    //!< Concrete context server
294         CContextClient* client;    //!< Concrete contex client
295         std::vector<CContextServer*> serverPrimServer;
296         std::vector<CContextClient*> clientPrimServer;
297         std::map<std::string, CContextClient*> couplerClient_ ;
298         std::map<std::string, CContextServer*> couplerServer_ ;
299
300
301         std::vector<std::string> primServerId_;
302
303         CRegistry* registryIn ;    //!< input registry which is read from file
304         CRegistry* registryOut ;   //!< output registry which will be written into file at the finalize
305
306
307        MPI_Comm intraComm_ ; //! context intra communicator
308        int intraCommRank_ ; //! context intra communicator rank
309        int intraCommSize_ ; //! context intra communicator size
310       
311      private:
312         bool isPostProcessed;
313         bool allProcessed;
314         bool finalized;
315         int countChildContextFinalized_;        //!< Counter of child contexts (for now it is the number of secondary server pools)
316         CGarbageCollector garbageCollector;
317         std::list<MPI_Comm> comms; //!< Communicators allocated internally
318
319         int serviceType_;  //!< service associated to the context
320         string contextId_ ; //!< context client id for the servers. For clients this is same as getId()
321         bool isProcessingEvent_ ;
322         CServerContext* parentServerContext_ ;
323
324      public: // Some function maybe removed in the near future
325        // virtual void toBinary  (StdOStream & os) const;
326        // virtual void fromBinary(StdIStream & is);
327   }; // class CContext
328
329   ///--------------------------------------------------------------
330
331   // Declare/Define CContextGroup and CContextDefinition
332   DECLARE_GROUP(CContext);
333
334   ///--------------------------------------------------------------
335
336} // namespace xios
337
338#endif // __XIOS_CContext__
Note: See TracBrowser for help on using the repository browser.