source: XIOS/dev/XIOS_DEV_CMIP6/src/node/context.hpp @ 1234

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

Fixing the blocking problem where there are more servers than the number of grid band distribution

+) Correct this problem not only for writing but also for reading
+) Allow "zero-size" domain, axis (i.e: domain, axis with ni = 0, and/or nj=0)

Test
+) On Curie
+) Work in both cases: Read and Write data

  • 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: 10.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 "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         bool isFinalized(void);
102
103         void closeDefinition(void);
104
105         // Some functions to process context
106         void findAllEnabledFieldsInFiles(const std::vector<CFile*>& activeFiles);
107         // void findAllEnabledFields(void);
108         // void findAllEnabledFieldsInReadModeFiles(void);
109         void readAttributesOfEnabledFieldsInReadModeFiles();
110         void solveAllInheritance(bool apply=true);
111         void findEnabledFiles(void);
112         void findEnabledWriteModeFiles(void);
113         void findEnabledReadModeFiles(void);
114         void closeAllFile(void);
115         void updateCalendar(int step);
116         void createFileHeader(void);
117         void initReadFiles(void);
118         void checkAxisDomainsGridsEligibilityForCompressedOutput();
119         void prepareTimeseries(void);
120         void solveOnlyRefOfEnabledFields(bool sendToServer);         
121         void buildFilterGraphOfEnabledFields();
122         void startPrefetchingOfEnabledReadModeFiles();
123         void checkPrefetchingOfEnabledReadModeFiles();
124         void findFieldsWithReadAccess(void);
125         void solveAllRefOfFieldsWithReadAccess();
126         void buildFilterGraphOfFieldsWithReadAccess();
127         void postProcessing();
128         void postProcessingGlobalAttributes();         
129
130         void solveAllRefOfEnabledFieldsAndTransform(bool sendToServer);
131         void checkGridEnabledFields();
132         void checkGridEnabledFieldsInFiles(const std::vector<CFile*>& activeFiles);
133         void sendGridEnabledFieldsInFiles(const std::vector<CFile*>& activeFiles);         
134
135//         std::map<int, StdSize> getAttributesBufferSize(std::map<int, StdSize>& maxEventSize);
136//         std::map<int, StdSize> getDataBufferSize(std::map<int, StdSize>& maxEventSize);
137//         void setClientServerBuffer();
138         std::map<int, StdSize> getAttributesBufferSize(std::map<int, StdSize>& maxEventSize, CContextClient* contextClient);
139         std::map<int, StdSize> getDataBufferSize(std::map<int, StdSize>& maxEventSize, CContextClient* contextClient);
140         void setClientServerBuffer(CContextClient* contextClient);
141
142         // Distribute files (in write mode) among secondary-server pools according to the estimated data flux
143         void distributeFiles(void);
144
145         // Send context close definition
146         void sendCloseDefinition(void);
147         // There are something to send on closing context defintion
148         void sendUpdateCalendar(int step);
149         void sendCreateFileHeader(void);
150         void sendEnabledFiles(const std::vector<CFile*>& activeFiles);
151         void sendEnabledFieldsInFiles(const std::vector<CFile*>& activeFiles);
152         void sendRefDomainsAxisScalars(const std::vector<CFile*>& activeFiles);
153         void sendRefGrid(const std::vector<CFile*>& activeFiles);
154         void sendPostProcessing();
155         void sendPostProcessingGlobalAttributes();
156         void sendProcessingGridOfEnabledFields();
157         //!< after be gathered to the root process of the context, merged registry is sent to the root process of the servers
158         void sendRegistry(void) ;
159
160         const StdString& getIdServer();
161         const StdString& getIdServer(const int srvPoolNb);
162
163         // Client side: Receive and process messages
164         static void recvUpdateCalendar(CEventServer& event);
165         void recvUpdateCalendar(CBufferIn& buffer);
166         static void recvCloseDefinition(CEventServer& event);
167         static void recvCreateFileHeader(CEventServer& event);
168         void recvCreateFileHeader(CBufferIn& buffer);
169         static void recvSolveInheritanceContext(CEventServer& event);
170         void recvSolveInheritanceContext(CBufferIn& buffer);
171         static void recvPostProcessing(CEventServer& event);
172         void recvPostProcessing(CBufferIn& buffer);
173         static void recvProcessingGridOfEnabledFields(CEventServer& event);
174         static void recvPostProcessingGlobalAttributes(CEventServer& event);
175         void recvPostProcessingGlobalAttributes(CBufferIn& buffer);
176         static void recvRegistry(CEventServer& event) ;
177         void recvRegistry(CBufferIn& buffer) ; //!< registry is received by the servers
178
179         void freeComms(void);                  //!< Free internally allcoated communicators
180         void releaseClientBuffers(void);       //! Deallocate buffers allocated by clientContexts
181
182         // dispatch event
183         static bool dispatchEvent(CEventServer& event);
184
185      public:
186        // Get current context
187        static CContext* getCurrent(void);
188
189        // Get context root
190        static CContextGroup* getRoot(void);
191
192        // Set current context
193        static void setCurrent(const string& id);
194
195        // Create new context
196        static CContext* create(const string& id = "");
197
198        /// Accesseurs statiques ///
199        static StdString GetName(void);
200        static StdString GetDefName(void);
201        static ENodeType GetType(void);
202
203        static CContextGroup* GetContextGroup(void);
204
205        // Some functions to visualize structure of current context
206        static void ShowTree(StdOStream & out = std::clog);
207        static void CleanTree(void);
208
209      public :
210         // Parse xml node and write all info into context
211         virtual void parse(xml::CXMLNode & node);
212
213         // Visualize a context
214         virtual StdString toString(void) const;
215
216
217         // Solve all inheritance relation in current context
218         virtual void solveDescInheritance(bool apply, const CAttributeMap * const parent = 0);
219
220         // Verify if all root definition in a context have children
221         virtual bool hasChild(void) const;
222
223
224      public :
225         // Calendar of context
226         boost::shared_ptr<CCalendar>   calendar;
227
228         // List of all enabled files (files on which fields are written or read)
229         std::vector<CFile*> enabledFiles;
230         // List of all enabled files in read mode (files on which fields are read)
231         std::vector<CFile*> enabledReadModeFiles;
232         // List of all enabled files in write mode
233         std::vector<CFile*> enabledWriteModeFiles;
234
235         // List of all enabled fields whose instant data is accessible from the public API
236         // but which are not part of a file
237         std::vector<CField*> fieldsWithReadAccess;
238
239         // Context root
240         static shared_ptr<CContextGroup> root;
241
242         // Determine context on client or not
243         bool hasClient;
244
245         // Determine context on server or not
246         bool hasServer;
247
248         CContextServer* server;    //!< Concrete context server
249         CContextClient* client;    //!< Concrete contex client
250         std::vector<CContextServer*> serverPrimServer;
251         std::vector<CContextClient*> clientPrimServer;
252
253         CRegistry* registryIn ;    //!< input registry which is read from file
254         CRegistry* registryOut ;   //!< output registry which will be written into file at the finalize
255
256      private:
257         bool isPostProcessed;
258         bool allProcessed;
259         bool finalized;
260         int countChildCtx_;        //!< Counter of child contexts (for now it is the number of secondary server pools)
261         StdString idServer_;
262         CGarbageCollector garbageCollector;
263         std::list<MPI_Comm> comms; //!< Communicators allocated internally
264
265      public: // Some function maybe removed in the near future
266        // virtual void toBinary  (StdOStream & os) const;
267        // virtual void fromBinary(StdIStream & is);
268   }; // class CContext
269
270   ///--------------------------------------------------------------
271
272   // Declare/Define CContextGroup and CContextDefinition
273   DECLARE_GROUP(CContext);
274
275   ///--------------------------------------------------------------
276
277} // namespace xios
278
279#endif // __XIOS_CContext__
Note: See TracBrowser for help on using the repository browser.