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

Last change on this file since 593 was 593, checked in by rlacroix, 9 years ago

Add a new interface xios_recv_field to get local instant data from a field.

  • 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: 7.4 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
14#include "mpi.hpp"
15
16
17namespace xios {
18   class CContextClient;
19   class CContextServer;
20
21
22   /// ////////////////////// Déclarations ////////////////////// ///
23   class CContextGroup;
24   class CContextAttributes;
25   class CContext;
26   class CFile;
27   ///--------------------------------------------------------------
28
29   // Declare/Define CFileAttribute
30   BEGIN_DECLARE_ATTRIBUTE_MAP(CContext)
31#  include "context_attribute.conf"
32   END_DECLARE_ATTRIBUTE_MAP(CContext)
33
34   ///--------------------------------------------------------------
35  /*!
36  \class CContext
37   This class corresponds to the concrete presentation of context in xml file and in play an essential role in XIOS
38   Each object of this class contains all root definition of elements: files, fiels, domains, axis, etc, ... from which
39   we can have access to each element.
40   In fact, every thing must a be inside a particuliar context. After the xml file (iodef.xml) is parsed,
41   object of the class is created and its contains all information of other elements in the xml file.
42  */
43   class CContext
44      : public CObjectTemplate<CContext>
45      , public CContextAttributes
46   {
47         public :
48         enum EEventId
49         {
50           EVENT_ID_CLOSE_DEFINITION,EVENT_ID_UPDATE_CALENDAR,
51           EVENT_ID_CREATE_FILE_HEADER,EVENT_ID_CONTEXT_FINALIZE,
52           EVENT_ID_POST_PROCESS
53         };
54
55         /// typedef ///
56         typedef CObjectTemplate<CContext>   SuperClass;
57         typedef CContextAttributes SuperClassAttribute;
58
59      public :
60
61         typedef CContextAttributes RelAttributes;
62         typedef CContext           RelGroup;
63
64         //---------------------------------------------------------
65
66      public :
67
68         /// Constructeurs ///
69         CContext(void);
70         explicit CContext(const StdString & id);
71         CContext(const CContext & context);       // Not implemented yet.
72         CContext(const CContext * const context); // Not implemented yet.
73
74         /// Destructeur ///
75         virtual ~CContext(void);
76
77         //---------------------------------------------------------
78
79      public :
80
81         /// Mutateurs ///
82         void setCalendar(boost::shared_ptr<CCalendar> newCalendar);
83
84         /// Accesseurs ///
85         boost::shared_ptr<CCalendar>      getCalendar(void) const;
86
87      public :
88         // Initialize server or client
89         void initServer(MPI_Comm intraComm, MPI_Comm interComm);
90         void initClient(MPI_Comm intraComm, MPI_Comm interComm, CContext* cxtServer=0);
91         bool isInitialized(void);
92
93         // Put sever or client into loop state
94         bool eventLoop(void);
95         bool serverLoop(void);
96         void clientLoop(void);
97
98         // Finalize a context
99         void finalize(void);
100         void closeDefinition(void);
101
102         // Some functions to process context
103         void findAllEnabledFields(void);
104         void processEnabledFiles(void);
105         void solveAllInheritance(bool apply=true);
106         void findEnabledFiles(void);
107         void closeAllFile(void);
108         void updateCalendar(int step);
109         void createFileHeader(void );
110         void solveAllRefOfEnabledFields(bool sendToServer);
111         void buildAllExpressionOfEnabledFields();
112         void findFieldsWithReadAccess(void);
113         void solveAllRefOfFieldsWithReadAccess();
114         void buildAllExpressionOfFieldsWithReadAccess();
115         void postProcessing();
116
117         std::map<int, StdSize>& getDataSize();
118         void setClientServerBuffer();
119
120         // Send context close definition
121         void sendCloseDefinition(void);
122         // There are something to send on closing context defintion
123         void sendUpdateCalendar(int step);
124         void sendCreateFileHeader(void);
125         void sendEnabledFiles();
126         void sendEnabledFields();
127         void sendRefDomainsAxis();
128         void sendRefGrid();
129         void sendPostProcessing();
130
131         const StdString& getIdServer();
132
133         // Client side: Receive and process messages
134         static void recvUpdateCalendar(CEventServer& event);
135         void recvUpdateCalendar(CBufferIn& buffer);
136         static void recvCloseDefinition(CEventServer& event);
137         static void recvCreateFileHeader(CEventServer& event);
138         void recvCreateFileHeader(CBufferIn& buffer);
139         static void recvSolveInheritanceContext(CEventServer& event);
140         void recvSolveInheritanceContext(CBufferIn& buffer);
141         static void recvPostProcessing(CEventServer& event);
142         void recvPostProcessing(CBufferIn& buffer);
143
144         // dispatch event
145         static bool dispatchEvent(CEventServer& event);
146
147      public:
148        // Get current context
149        static CContext* getCurrent(void);
150
151        // Get context root
152        static CContextGroup* getRoot(void);
153
154        // Set current context
155        static void setCurrent(const string& id);
156
157        // Create new context
158        static CContext* create(const string& id = "");
159
160        /// Accesseurs statiques ///
161        static StdString GetName(void);
162        static StdString GetDefName(void);
163        static ENodeType GetType(void);
164
165        static CContextGroup* GetContextGroup(void);
166
167        // Some functions to visualize structure of current context
168        static void ShowTree(StdOStream & out = std::clog);
169        static void CleanTree(void);
170
171      public :
172         // Parse xml node and write all info into context
173         virtual void parse(xml::CXMLNode & node);
174
175         // Visualize a context
176         virtual StdString toString(void) const;
177
178
179         // Solve all inheritance relation in current context
180         virtual void solveDescInheritance(bool apply, const CAttributeMap * const parent = 0);
181
182         // Verify if all root definition in a context have children
183         virtual bool hasChild(void) const;
184
185      public :
186         // Calendar of context
187         boost::shared_ptr<CCalendar>   calendar;
188
189         // List of all enabled files (files on which fields are written)
190         std::vector<CFile*> enabledFiles;
191
192         // List of all fields whose instant data is accessible from the public API
193         std::vector<CField*> fieldsWithReadAccess;
194
195         // Context root
196         static shared_ptr<CContextGroup> root;
197
198         // Determine context on client or not
199         bool hasClient;
200
201         // Determine context on server or not
202         bool hasServer;
203
204         // Concrete context server
205         CContextServer* server;
206
207         // Concrete contex client
208         CContextClient* client;
209
210      private:
211         bool isPostProcessed;
212         std::map<int, StdSize> dataSize_;
213         StdString idServer_;
214
215
216      public: // Some function maybe removed in the near future
217        // virtual void toBinary  (StdOStream & os) const;
218        // virtual void fromBinary(StdIStream & is);
219        // void solveAllGridRef(void);
220        // void solveAllOperation(void);
221        // void solveAllExpression(void);
222        // void solveFieldRefInheritance(bool apply);
223
224   }; // class CContext
225
226   ///--------------------------------------------------------------
227
228   // Declare/Define CContextGroup and CContextDefinition
229   DECLARE_GROUP(CContext);
230
231   ///--------------------------------------------------------------
232
233} // namespace xios
234
235#endif // __XIOS_CContext__
Note: See TracBrowser for help on using the repository browser.