source: XIOS/dev/dev_olga/src/node/context.hpp @ 1099

Last change on this file since 1099 was 1099, checked in by mhnguyen, 7 years ago

Updating 2-level server

+) Make some changes in the way data rebuilt on each level of server
+) Make some changes in the order of functions call during close context to make sure that each server receives the global indexes before calculating index to send to next level
+) Modify some functions to make sure data sent to the correct server pool

Test
+) On Curie
+) Only test_client

  • 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: 9.5 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 "context_client.hpp"
11//#include "context_server.hpp"
12#include "data_output.hpp"
13#include "garbage_collector.hpp"
14#include "registry.hpp"
15#include "mpi.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   ///--------------------------------------------------------------
29
30   // Declare/Define CFileAttribute
31   BEGIN_DECLARE_ATTRIBUTE_MAP(CContext)
32#  include "context_attribute.conf"
33   END_DECLARE_ATTRIBUTE_MAP(CContext)
34
35   ///--------------------------------------------------------------
36  /*!
37  \class CContext
38   This class corresponds to the concrete presentation of context in xml file and in play an essential role in XIOS
39   Each object of this class contains all root definition of elements: files, fiels, domains, axis, etc, ... from which
40   we can have access to each element.
41   In fact, every thing must a be inside a particuliar context. After the xml file (iodef.xml) is parsed,
42   object of the class is created and its contains all information of other elements in the xml file.
43  */
44   class CContext
45      : public CObjectTemplate<CContext>
46      , public CContextAttributes
47   {
48         public :
49         enum EEventId
50         {
51           EVENT_ID_CLOSE_DEFINITION,EVENT_ID_UPDATE_CALENDAR,
52           EVENT_ID_CREATE_FILE_HEADER,EVENT_ID_CONTEXT_FINALIZE,
53           EVENT_ID_POST_PROCESS, EVENT_ID_SEND_REGISTRY,
54           EVENT_ID_POST_PROCESS_GLOBAL_ATTRIBUTES,
55           EVENT_ID_PROCESS_GRID_ENABLED_FIELDS
56         };
57
58         /// typedef ///
59         typedef CObjectTemplate<CContext>   SuperClass;
60         typedef CContextAttributes SuperClassAttribute;
61
62      public :
63
64         typedef CContextAttributes RelAttributes;
65         typedef CContext           RelGroup;
66
67         //---------------------------------------------------------
68
69      public :
70
71         /// Constructeurs ///
72         CContext(void);
73         explicit CContext(const StdString & id);
74         CContext(const CContext & context);       // Not implemented yet.
75         CContext(const CContext * const context); // Not implemented yet.
76
77         /// Destructeur ///
78         virtual ~CContext(void);
79
80         //---------------------------------------------------------
81
82      public :
83
84         /// Mutateurs ///
85         void setCalendar(boost::shared_ptr<CCalendar> newCalendar);
86
87         /// Accesseurs ///
88         boost::shared_ptr<CCalendar>      getCalendar(void) const;
89
90      public :
91         // Initialize server or client
92         void initClient(MPI_Comm intraComm, MPI_Comm interComm, CContext* cxtServer = 0);
93         void initServer(MPI_Comm intraComm, MPI_Comm interComm, CContext* cxtClient = 0);
94         bool isInitialized(void);
95
96         // Put sever or client into loop state
97         bool checkBuffersAndListen(void);
98
99         // Finalize a context
100         void finalize(void);
101         void closeDefinition(void);
102         bool isFinalized(void);
103
104         // Some functions to process context
105         void findAllEnabledFields(void);
106         void findAllEnabledFieldsInReadModeFiles(void);
107         void readAttributesOfEnabledFieldsInReadModeFiles();
108         void solveAllInheritance(bool apply=true);
109         void findEnabledFiles(void);
110         void findEnabledReadModeFiles(void);
111         void closeAllFile(void);
112         void updateCalendar(int step);
113         void createFileHeader(void );
114         void checkAxisDomainsGridsEligibilityForCompressedOutput();
115         void prepareTimeseries(void);
116         void solveOnlyRefOfEnabledFields(bool sendToServer);
117         void solveAllRefOfEnabledFields(bool sendToServer);
118         void buildFilterGraphOfEnabledFields();
119         void startPrefetchingOfEnabledReadModeFiles();
120         void checkPrefetchingOfEnabledReadModeFiles();
121         void findFieldsWithReadAccess(void);
122         void solveAllRefOfFieldsWithReadAccess();
123         void buildFilterGraphOfFieldsWithReadAccess();
124         void postProcessing();
125         void postProcessingGlobalAttributes();         
126
127         void solveAllEnabledFields();
128         void checkGridEnabledFields();
129         void sendGridEnabledFields();
130
131         std::map<int, StdSize> getAttributesBufferSize(std::map<int, StdSize>& maxEventSize);
132         std::map<int, StdSize> getDataBufferSize(std::map<int, StdSize>& maxEventSize);
133         void setClientServerBuffer();
134
135         // Send context close definition
136         void sendCloseDefinition(void);
137         // There are something to send on closing context defintion
138         void sendUpdateCalendar(int step);
139         void sendCreateFileHeader(void);
140         void sendEnabledFiles();
141         void sendEnabledFields();
142         void sendRefDomainsAxis();
143         void sendRefGrid();
144         void sendPostProcessing();
145         void sendPostProcessingGlobalAttributes();
146         void sendProcessingGridOfEnabledFields();
147         //!< after be gathered to the root process of the context, merged registry is sent to the root process of the servers
148         void sendRegistry(void) ;
149
150         const StdString& getIdServer();
151         const StdString& getIdServer(const int srvPoolNb);
152
153         // Client side: Receive and process messages
154         static void recvUpdateCalendar(CEventServer& event);
155         void recvUpdateCalendar(CBufferIn& buffer);
156         static void recvCloseDefinition(CEventServer& event);
157         static void recvCreateFileHeader(CEventServer& event);
158         void recvCreateFileHeader(CBufferIn& buffer);
159         static void recvSolveInheritanceContext(CEventServer& event);
160         void recvSolveInheritanceContext(CBufferIn& buffer);
161         static void recvPostProcessing(CEventServer& event);
162         void recvPostProcessing(CBufferIn& buffer);
163         static void recvProcessingGridOfEnabledFields(CEventServer& event);
164         static void recvPostProcessingGlobalAttributes(CEventServer& event);
165         void recvPostProcessingGlobalAttributes(CBufferIn& buffer);
166         static void recvRegistry(CEventServer& event) ;
167         void recvRegistry(CBufferIn& buffer) ; //!< registry is received by the servers
168
169         void freeComms(void); //!< Free internally allcoated communicators
170
171         // dispatch event
172         static bool dispatchEvent(CEventServer& event);
173
174      public:
175        // Get current context
176        static CContext* getCurrent(void);
177
178        // Get context root
179        static CContextGroup* getRoot(void);
180
181        // Set current context
182        static void setCurrent(const string& id);
183
184        // Create new context
185        static CContext* create(const string& id = "");
186
187        /// Accesseurs statiques ///
188        static StdString GetName(void);
189        static StdString GetDefName(void);
190        static ENodeType GetType(void);
191
192        static CContextGroup* GetContextGroup(void);
193
194        // Some functions to visualize structure of current context
195        static void ShowTree(StdOStream & out = std::clog);
196        static void CleanTree(void);
197
198      public :
199         // Parse xml node and write all info into context
200         virtual void parse(xml::CXMLNode & node);
201
202         // Visualize a context
203         virtual StdString toString(void) const;
204
205
206         // Solve all inheritance relation in current context
207         virtual void solveDescInheritance(bool apply, const CAttributeMap * const parent = 0);
208
209         // Verify if all root definition in a context have children
210         virtual bool hasChild(void) const;
211
212
213      public :
214         // Calendar of context
215         boost::shared_ptr<CCalendar>   calendar;
216
217         // List of all enabled files (files on which fields are written or read)
218         std::vector<CFile*> enabledFiles;
219         // List of all enabled files in read mode (files on which fields are read)
220         std::vector<CFile*> enabledReadModeFiles;
221
222         // List of all enabled fields whose instant data is accessible from the public API
223         // but which are not part of a file
224         std::vector<CField*> fieldsWithReadAccess;
225
226         // Context root
227         static shared_ptr<CContextGroup> root;
228
229         // Determine context on client or not
230         bool hasClient;
231
232         // Determine context on server or not
233         bool hasServer;
234
235         CContextServer* server;  //!< Concrete context server
236         CContextClient* client;  //!< Concrete contex client
237         std::vector<CContextServer*> serverPrimServer;
238         std::vector<CContextClient*> clientPrimServer;
239
240         CRegistry* registryIn ;  //!< input registry which is read from file
241         CRegistry* registryOut ; //!< output registry which will be wrote on file at the finalize
242
243      private:
244         bool isPostProcessed;
245         bool allProcessed;
246         bool finalized;
247         StdString idServer_;
248         CGarbageCollector garbageCollector;
249         std::list<MPI_Comm> comms; //!< Communicators allocated internally
250
251      public: // Some function maybe removed in the near future
252        // virtual void toBinary  (StdOStream & os) const;
253        // virtual void fromBinary(StdIStream & is);
254   }; // class CContext
255
256   ///--------------------------------------------------------------
257
258   // Declare/Define CContextGroup and CContextDefinition
259   DECLARE_GROUP(CContext);
260
261   ///--------------------------------------------------------------
262
263} // namespace xios
264
265#endif // __XIOS_CContext__
Note: See TracBrowser for help on using the repository browser.