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

Last change on this file since 1129 was 1129, checked in by mhnguyen, 3 years ago

Updating two-level server.
Each client now can play the role of server: It can forward data to other clients or write data like a server.
Each client must combine all data received from other client(s) before forward them or write them on files

+) Correct some bugs of exchange data_index in domain and axis
+) Reorder some functions in context.cpp to make sure that all necessary attributes are available before computing index
+) Add the mapping index for client to write data.

Test
+) On Curie
+) test_client and test_complete
+) Mode:

  • Only one level: Correct
  • Two levels: Work if using ddt (bug)

+) Only zoom is tested but other transformations should work
+) No reading test

  • 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 buildFilterGraphOfEnabledFields();
118         void startPrefetchingOfEnabledReadModeFiles();
119         void checkPrefetchingOfEnabledReadModeFiles();
120         void findFieldsWithReadAccess(void);
121         void solveAllRefOfFieldsWithReadAccess();
122         void buildFilterGraphOfFieldsWithReadAccess();
123         void postProcessing();
124         void postProcessingGlobalAttributes();         
125
126         void solveAllRefOfEnabledFieldsAndTransform(bool sendToServer);
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.