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

Last change on this file since 1330 was 1330, checked in by oabramkina, 6 years ago

Adding buffer evaluation in case of reading.

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