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

Last change on this file since 598 was 598, checked in by rlacroix, 6 years ago

Add the infrastructure to request fields from the server.

This will be used to read input files so add a new file attribute mode to define whether data is written or read from a file.

Currently the data is not actually read and random data is transfered for those fields in read mode.

  • 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.8 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, CContext* cxtClient = 0);
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
96         bool checkBuffersAndListen(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 findEnabledReadModeFiles(void);
108         void closeAllFile(void);
109         void updateCalendar(int step);
110         void createFileHeader(void );
111         void solveAllRefOfEnabledFields(bool sendToServer);
112         void buildAllExpressionOfEnabledFields();
113         void startPrefetchingOfEnabledReadModeFiles();
114         void checkPrefetchingOfEnabledReadModeFiles();
115         void findFieldsWithReadAccess(void);
116         void solveAllRefOfFieldsWithReadAccess();
117         void buildAllExpressionOfFieldsWithReadAccess();
118         void postProcessing();
119
120         std::map<int, StdSize>& getDataSize();
121         void setClientServerBuffer();
122
123         // Send context close definition
124         void sendCloseDefinition(void);
125         // There are something to send on closing context defintion
126         void sendUpdateCalendar(int step);
127         void sendCreateFileHeader(void);
128         void sendEnabledFiles();
129         void sendEnabledFields();
130         void sendRefDomainsAxis();
131         void sendRefGrid();
132         void sendPostProcessing();
133
134         const StdString& getIdServer();
135
136         // Client side: Receive and process messages
137         static void recvUpdateCalendar(CEventServer& event);
138         void recvUpdateCalendar(CBufferIn& buffer);
139         static void recvCloseDefinition(CEventServer& event);
140         static void recvCreateFileHeader(CEventServer& event);
141         void recvCreateFileHeader(CBufferIn& buffer);
142         static void recvSolveInheritanceContext(CEventServer& event);
143         void recvSolveInheritanceContext(CBufferIn& buffer);
144         static void recvPostProcessing(CEventServer& event);
145         void recvPostProcessing(CBufferIn& buffer);
146
147         // dispatch event
148         static bool dispatchEvent(CEventServer& event);
149
150      public:
151        // Get current context
152        static CContext* getCurrent(void);
153
154        // Get context root
155        static CContextGroup* getRoot(void);
156
157        // Set current context
158        static void setCurrent(const string& id);
159
160        // Create new context
161        static CContext* create(const string& id = "");
162
163        /// Accesseurs statiques ///
164        static StdString GetName(void);
165        static StdString GetDefName(void);
166        static ENodeType GetType(void);
167
168        static CContextGroup* GetContextGroup(void);
169
170        // Some functions to visualize structure of current context
171        static void ShowTree(StdOStream & out = std::clog);
172        static void CleanTree(void);
173
174      public :
175         // Parse xml node and write all info into context
176         virtual void parse(xml::CXMLNode & node);
177
178         // Visualize a context
179         virtual StdString toString(void) const;
180
181
182         // Solve all inheritance relation in current context
183         virtual void solveDescInheritance(bool apply, const CAttributeMap * const parent = 0);
184
185         // Verify if all root definition in a context have children
186         virtual bool hasChild(void) const;
187
188      public :
189         // Calendar of context
190         boost::shared_ptr<CCalendar>   calendar;
191
192         // List of all enabled files (files on which fields are written or read)
193         std::vector<CFile*> enabledFiles;
194         // List of all enabled files in read mode (files on which fields are read)
195         std::vector<CFile*> enabledReadModeFiles;
196
197         // List of all fields whose instant data is accessible from the public API
198         std::vector<CField*> fieldsWithReadAccess;
199
200         // Context root
201         static shared_ptr<CContextGroup> root;
202
203         // Determine context on client or not
204         bool hasClient;
205
206         // Determine context on server or not
207         bool hasServer;
208
209         // Concrete context server
210         CContextServer* server;
211
212         // Concrete contex client
213         CContextClient* client;
214
215      private:
216         bool isPostProcessed;
217         bool finalized;
218         std::map<int, StdSize> dataSize_;
219         StdString idServer_;
220
221
222      public: // Some function maybe removed in the near future
223        // virtual void toBinary  (StdOStream & os) const;
224        // virtual void fromBinary(StdIStream & is);
225        // void solveAllGridRef(void);
226        // void solveAllOperation(void);
227        // void solveAllExpression(void);
228        // void solveFieldRefInheritance(bool apply);
229
230   }; // class CContext
231
232   ///--------------------------------------------------------------
233
234   // Declare/Define CContextGroup and CContextDefinition
235   DECLARE_GROUP(CContext);
236
237   ///--------------------------------------------------------------
238
239} // namespace xios
240
241#endif // __XIOS_CContext__
Note: See TracBrowser for help on using the repository browser.