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

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

Implementing buffer size auto-detection for mode client -server

+) Process xml tree in client side then send all the information to server
+) Only information enabled fields in enabled files are sent to server
+) Some important change in structure of code which must be refactored

Test
+) On Curie
+) Only mode client-server
+) Passed for all tests

  • 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.2 KB
Line 
1#ifndef __XMLIO_CContext__
2#define __XMLIO_CContext__
3
4/// xios headers ///
5#include "xmlioserver_spl.hpp"
6//#include "node_type.hpp"
7#include "calendar.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) ;
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         // Process all information of calendar
99         void solveCalendar(void);
100
101         // Finalize a context
102         void finalize(void) ;
103         void closeDefinition(void) ;
104
105         // Some functions to process context
106         void findAllEnabledFields(void);
107         void processEnabledFiles(void) ;
108         void solveAllInheritance(bool apply=true) ;
109         void findEnabledFiles(void);
110         void closeAllFile(void) ;
111         void updateCalendar(int step) ;
112         void createFileHeader(void ) ;
113         void solveAllRefOfEnabledFields(bool sendToServer);
114         void buildAllExpressionOfEnabledFields();
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         // Client side: Receive and process messages
132         static void recvUpdateCalendar(CEventServer& event) ;
133         void recvUpdateCalendar(CBufferIn& buffer) ;
134         static void recvCloseDefinition(CEventServer& event) ;
135         static void recvCreateFileHeader(CEventServer& event) ;
136         void recvCreateFileHeader(CBufferIn& buffer) ;
137         static void recvSolveInheritanceContext(CEventServer& event);
138         void recvSolveInheritanceContext(CBufferIn& buffer);
139         static void recvPostProcessing(CEventServer& event);
140         void recvPostProcessing(CBufferIn& buffer);
141
142         // dispatch event
143         static bool dispatchEvent(CEventServer& event) ;
144
145      public:
146        // Get current context
147        static CContext* getCurrent(void);
148
149        // Get context root
150        static CContextGroup* getRoot(void);
151
152        // Set current context
153        static void setCurrent(const string& id);
154
155        // Create new context
156        static CContext* create(const string& id = "");
157
158        /// Accesseurs statiques ///
159        static StdString GetName(void);
160        static StdString GetDefName(void);
161        static ENodeType GetType(void);
162
163        static CContextGroup* GetContextGroup(void);
164
165        // Some functions to visualize structure of current context
166        static void ShowTree(StdOStream & out = std::clog);
167        static void CleanTree(void);
168
169      public :
170         // Parse xml node and write all info into context
171         virtual void parse(xml::CXMLNode & node);
172
173         // Visualize a context
174         virtual StdString toString(void) const;
175
176
177         // Solve all inheritance relation in current context
178         virtual void solveDescInheritance(bool apply, const CAttributeMap * const parent = 0);
179
180         // Verify if all root definition in a context have children
181         virtual bool hasChild(void) const;
182
183      public :
184         // Calendar of context
185         boost::shared_ptr<CCalendar>   calendar;
186
187         // List of all enabled files (files on which fields are written)
188         std::vector<CFile*> enabledFiles;
189
190         // Context root
191         static shared_ptr<CContextGroup> root ;
192
193         // Determine context on client or not
194         bool hasClient ;
195
196         // Determine context on server or not
197         bool hasServer ;
198
199         // Concrete context server
200         CContextServer* server ;
201
202         // Concrete contex client
203         CContextClient* client ;
204
205      private:
206         bool isPostProcessed;
207         std::map<int, StdSize> dataSize_;
208
209
210      public: // Some function maybe removed in the near future
211        // virtual void toBinary  (StdOStream & os) const;
212        // virtual void fromBinary(StdIStream & is);
213        // void solveAllGridRef(void);
214        // void solveAllOperation(void);
215        // void solveAllExpression(void);
216        // void solveFieldRefInheritance(bool apply);
217
218   }; // class CContext
219
220   ///--------------------------------------------------------------
221
222   // Declare/Define CContextGroup and CContextDefinition
223   DECLARE_GROUP(CContext);
224
225   ///--------------------------------------------------------------
226
227} // namespace xios
228
229#endif // __XMLIO_CContext__
Note: See TracBrowser for help on using the repository browser.