source: XIOS/trunk/src/node/context.hpp @ 775

Last change on this file since 775 was 775, checked in by mhnguyen, 8 years ago

Implementing the reading of attributes of an axis from a file

+) 3d grid can be read directly from a file
+) Clean some redundant codes
+) Add new attribute declaration that allows to output only desired attributes

Test
+) On Curie
+) test_remap passes and result is correct

  • 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: 8.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         };
55
56         /// typedef ///
57         typedef CObjectTemplate<CContext>   SuperClass;
58         typedef CContextAttributes SuperClassAttribute;
59
60      public :
61
62         typedef CContextAttributes RelAttributes;
63         typedef CContext           RelGroup;
64
65         //---------------------------------------------------------
66
67      public :
68
69         /// Constructeurs ///
70         CContext(void);
71         explicit CContext(const StdString & id);
72         CContext(const CContext & context);       // Not implemented yet.
73         CContext(const CContext * const context); // Not implemented yet.
74
75         /// Destructeur ///
76         virtual ~CContext(void);
77
78         //---------------------------------------------------------
79
80      public :
81
82         /// Mutateurs ///
83         void setCalendar(boost::shared_ptr<CCalendar> newCalendar);
84
85         /// Accesseurs ///
86         boost::shared_ptr<CCalendar>      getCalendar(void) const;
87
88      public :
89         // Initialize server or client
90         void initServer(MPI_Comm intraComm, MPI_Comm interComm, CContext* cxtClient = 0);
91         void initClient(MPI_Comm intraComm, MPI_Comm interComm, CContext* cxtServer = 0);
92         bool isInitialized(void);
93
94         // Put sever or client into loop state
95         bool eventLoop(void);
96
97         bool checkBuffersAndListen(void);
98
99         // Finalize a context
100         void finalize(void);
101         void closeDefinition(void);
102
103         // Some functions to process context
104         void findAllEnabledFields(void);
105         void findAllEnabledFieldsInReadModeFiles(void);
106         void readAttributesOfEnabledFieldsInReadModeFiles();
107         void solveAllInheritance(bool apply=true);
108         void findEnabledFiles(void);
109         void findEnabledReadModeFiles(void);
110         void closeAllFile(void);
111         void updateCalendar(int step);
112         void createFileHeader(void );
113         void checkAxisDomainsGridsEligibilityForCompressedOutput();
114         void prepareTimeseries(void);
115         void solveAllRefOfEnabledFields(bool sendToServer);
116         void buildFilterGraphOfEnabledFields();
117         void startPrefetchingOfEnabledReadModeFiles();
118         void checkPrefetchingOfEnabledReadModeFiles();
119         void findFieldsWithReadAccess(void);
120         void solveAllRefOfFieldsWithReadAccess();
121         void buildFilterGraphOfFieldsWithReadAccess();
122         void postProcessing();
123
124         std::map<int, StdSize> getAttributesBufferSize();
125         std::map<int, StdSize> getDataBufferSize();
126         void setClientServerBuffer();
127
128         // Send context close definition
129         void sendCloseDefinition(void);
130         // There are something to send on closing context defintion
131         void sendUpdateCalendar(int step);
132         void sendCreateFileHeader(void);
133         void sendEnabledFiles();
134         void sendEnabledFields();
135         void sendRefDomainsAxis();
136         void sendRefGrid();
137         void sendPostProcessing();
138         void sendRegistry(void) ; //!< after be gathered to the root process of the context, merged registry is sent to the root process of the servers
139         const StdString& getIdServer();
140
141         // Client side: Receive and process messages
142         static void recvUpdateCalendar(CEventServer& event);
143         void recvUpdateCalendar(CBufferIn& buffer);
144         static void recvCloseDefinition(CEventServer& event);
145         static void recvCreateFileHeader(CEventServer& event);
146         void recvCreateFileHeader(CBufferIn& buffer);
147         static void recvSolveInheritanceContext(CEventServer& event);
148         void recvSolveInheritanceContext(CBufferIn& buffer);
149         static void recvPostProcessing(CEventServer& event);
150         void recvPostProcessing(CBufferIn& buffer);
151         static void recvRegistry(CEventServer& event) ;
152         void recvRegistry(CBufferIn& buffer) ; //!< registry is received by the root process of the servers
153
154         // dispatch event
155         static bool dispatchEvent(CEventServer& event);
156
157      public:
158        // Get current context
159        static CContext* getCurrent(void);
160
161        // Get context root
162        static CContextGroup* getRoot(void);
163
164        // Set current context
165        static void setCurrent(const string& id);
166
167        // Create new context
168        static CContext* create(const string& id = "");
169
170        /// Accesseurs statiques ///
171        static StdString GetName(void);
172        static StdString GetDefName(void);
173        static ENodeType GetType(void);
174
175        static CContextGroup* GetContextGroup(void);
176
177        // Some functions to visualize structure of current context
178        static void ShowTree(StdOStream & out = std::clog);
179        static void CleanTree(void);
180
181      public :
182         // Parse xml node and write all info into context
183         virtual void parse(xml::CXMLNode & node);
184
185         // Visualize a context
186         virtual StdString toString(void) const;
187
188
189         // Solve all inheritance relation in current context
190         virtual void solveDescInheritance(bool apply, const CAttributeMap * const parent = 0);
191
192         // Verify if all root definition in a context have children
193         virtual bool hasChild(void) const;
194
195      public :
196         // Calendar of context
197         boost::shared_ptr<CCalendar>   calendar;
198
199         // List of all enabled files (files on which fields are written or read)
200         std::vector<CFile*> enabledFiles;
201         // List of all enabled files in read mode (files on which fields are read)
202         std::vector<CFile*> enabledReadModeFiles;
203
204         // List of all enabled fields whose instant data is accessible from the public API
205         // but which are not part of a file
206         std::vector<CField*> fieldsWithReadAccess;
207
208         // Context root
209         static shared_ptr<CContextGroup> root;
210
211         // Determine context on client or not
212         bool hasClient;
213
214         // Determine context on server or not
215         bool hasServer;
216
217         // Concrete context server
218         CContextServer* server;
219
220         // Concrete contex client
221         CContextClient* client;
222         CRegistry* registryIn ;  //!< input registry which is read from file
223         CRegistry* registryOut ; //!< output registry which will be wrote on file at the finalize
224
225      private:
226         bool isPostProcessed;
227         bool finalized;
228         StdString idServer_;
229         CGarbageCollector garbageCollector;
230         std::list<MPI_Comm> comms; //!< Communicators allocated internally
231
232      public: // Some function maybe removed in the near future
233        // virtual void toBinary  (StdOStream & os) const;
234        // virtual void fromBinary(StdIStream & is);
235   }; // class CContext
236
237   ///--------------------------------------------------------------
238
239   // Declare/Define CContextGroup and CContextDefinition
240   DECLARE_GROUP(CContext);
241
242   ///--------------------------------------------------------------
243
244} // namespace xios
245
246#endif // __XIOS_CContext__
Note: See TracBrowser for help on using the repository browser.