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

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

Support creating the timeseries automatically.

Fields which should be outputted as timeseries must have the ts_enabled attribute set to true.

Files have a new attribute timeseries which must be one of:

  • none: no timeseries are outputted, only the regular file (default behavior when the attribute is ommited).
  • only: only the timeseries are outputted, the regular file is not created.
  • both: both the timeseries and the regular files are outputted.
  • exclusive: the timeseries are outputted and a regular file is created with only the fields which were not marked for output as a timeserie (if any).

The name of the files created for the timeseries is composed of a prefix followed by the name of the variable. The file attribute ts_prefix can be used to control the prefix used (by default, the name of the regular file is used).

All the attributes of the regular file are inherited by the files created for the timeseries. The field attribute ts_split_freq can be used to configure the splitting for each timeseries (by default, the splitting frequency of the regular file is used).

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