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

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

Support reentrant workflows and workflows with temporal integration for fields read from files.

  • 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.7 KB
RevLine 
[591]1#ifndef __XIOS_CContext__
2#define __XIOS_CContext__
[219]3
[591]4/// XIOS headers ///
5#include "xios_spl.hpp"
[352]6//#include "node_type.hpp"
[549]7#include "calendar_wrapper.hpp"
[219]8
9#include "declare_group.hpp"
[300]10//#include "context_client.hpp"
11//#include "context_server.hpp"
12#include "data_output.hpp"
[639]13#include "garbage_collector.hpp"
[697]14#include "registry.hpp"
[382]15#include "mpi.hpp"
[300]16
[219]17
[335]18namespace xios {
[549]19   class CContextClient;
20   class CContextServer;
[509]21
22
[219]23   /// ////////////////////// Déclarations ////////////////////// ///
24   class CContextGroup;
25   class CContextAttributes;
26   class CContext;
[352]27   class CFile;
[219]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   ///--------------------------------------------------------------
[509]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  */
[219]44   class CContext
45      : public CObjectTemplate<CContext>
46      , public CContextAttributes
47   {
[300]48         public :
49         enum EEventId
50         {
51           EVENT_ID_CLOSE_DEFINITION,EVENT_ID_UPDATE_CALENDAR,
[509]52           EVENT_ID_CREATE_FILE_HEADER,EVENT_ID_CONTEXT_FINALIZE,
[697]53           EVENT_ID_POST_PROCESS, EVENT_ID_SEND_REGISTRY
[549]54         };
[509]55
[219]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 :
[509]81
[219]82         /// Mutateurs ///
[343]83         void setCalendar(boost::shared_ptr<CCalendar> newCalendar);
[509]84
[219]85         /// Accesseurs ///
[343]86         boost::shared_ptr<CCalendar>      getCalendar(void) const;
[219]87
88      public :
[509]89         // Initialize server or client
[597]90         void initServer(MPI_Comm intraComm, MPI_Comm interComm, CContext* cxtClient = 0);
91         void initClient(MPI_Comm intraComm, MPI_Comm interComm, CContext* cxtServer = 0);
[549]92         bool isInitialized(void);
[219]93
[509]94         // Put sever or client into loop state
[597]95         bool checkBuffersAndListen(void);
96
[509]97         // Finalize a context
[549]98         void finalize(void);
99         void closeDefinition(void);
[509]100
101         // Some functions to process context
[300]102         void findAllEnabledFields(void);
[775]103         void findAllEnabledFieldsInReadModeFiles(void);
104         void readAttributesOfEnabledFieldsInReadModeFiles();
[549]105         void solveAllInheritance(bool apply=true);
[300]106         void findEnabledFiles(void);
[598]107         void findEnabledReadModeFiles(void);
[549]108         void closeAllFile(void);
109         void updateCalendar(int step);
110         void createFileHeader(void );
[676]111         void checkAxisDomainsGridsEligibilityForCompressedOutput();
[711]112         void prepareTimeseries(void);
[823]113         void solveOnlyRefOfEnabledFields(bool sendToServer);
[509]114         void solveAllRefOfEnabledFields(bool sendToServer);
[640]115         void buildFilterGraphOfEnabledFields();
[1358]116         void postProcessFilterGraph();
[598]117         void startPrefetchingOfEnabledReadModeFiles();
[1358]118         void doPreTimestepOperationsForEnabledReadModeFiles();
[1318]119         void doPostTimestepOperationsForEnabledReadModeFiles();
[593]120         void findFieldsWithReadAccess(void);
121         void solveAllRefOfFieldsWithReadAccess();
[640]122         void buildFilterGraphOfFieldsWithReadAccess();
[509]123         void postProcessing();
124
[917]125         std::map<int, StdSize> getAttributesBufferSize(std::map<int, StdSize>& maxEventSize);
126         std::map<int, StdSize> getDataBufferSize(std::map<int, StdSize>& maxEventSize);
[509]127         void setClientServerBuffer();
128
129         // Send context close definition
[549]130         void sendCloseDefinition(void);
[509]131         // There are something to send on closing context defintion
[549]132         void sendUpdateCalendar(int step);
133         void sendCreateFileHeader(void);
[509]134         void sendEnabledFiles();
135         void sendEnabledFields();
136         void sendRefDomainsAxis();
137         void sendRefGrid();
138         void sendPostProcessing();
[697]139         void sendRegistry(void) ; //!< after be gathered to the root process of the context, merged registry is sent to the root process of the servers
[511]140         const StdString& getIdServer();
141
[509]142         // Client side: Receive and process messages
[549]143         static void recvUpdateCalendar(CEventServer& event);
144         void recvUpdateCalendar(CBufferIn& buffer);
145         static void recvCloseDefinition(CEventServer& event);
146         static void recvCreateFileHeader(CEventServer& event);
147         void recvCreateFileHeader(CBufferIn& buffer);
[509]148         static void recvSolveInheritanceContext(CEventServer& event);
149         void recvSolveInheritanceContext(CBufferIn& buffer);
150         static void recvPostProcessing(CEventServer& event);
151         void recvPostProcessing(CBufferIn& buffer);
[697]152         static void recvRegistry(CEventServer& event) ;
153         void recvRegistry(CBufferIn& buffer) ; //!< registry is received by the root process of the servers
[509]154
155         // dispatch event
[549]156         static bool dispatchEvent(CEventServer& event);
[509]157
158      public:
159        // Get current context
160        static CContext* getCurrent(void);
161
162        // Get context root
163        static CContextGroup* getRoot(void);
164
165        // Set current context
166        static void setCurrent(const string& id);
167
168        // Create new context
169        static CContext* create(const string& id = "");
170
171        /// Accesseurs statiques ///
172        static StdString GetName(void);
173        static StdString GetDefName(void);
174        static ENodeType GetType(void);
175
176        static CContextGroup* GetContextGroup(void);
177
178        // Some functions to visualize structure of current context
179        static void ShowTree(StdOStream & out = std::clog);
180        static void CleanTree(void);
181
[219]182      public :
[509]183         // Parse xml node and write all info into context
[219]184         virtual void parse(xml::CXMLNode & node);
185
[509]186         // Visualize a context
[219]187         virtual StdString toString(void) const;
[509]188
189
190         // Solve all inheritance relation in current context
191         virtual void solveDescInheritance(bool apply, const CAttributeMap * const parent = 0);
192
193         // Verify if all root definition in a context have children
194         virtual bool hasChild(void) const;
195
[300]196      public :
[509]197         // Calendar of context
198         boost::shared_ptr<CCalendar>   calendar;
199
[598]200         // List of all enabled files (files on which fields are written or read)
[347]201         std::vector<CFile*> enabledFiles;
[598]202         // List of all enabled files in read mode (files on which fields are read)
203         std::vector<CFile*> enabledReadModeFiles;
[509]204
[740]205         // List of all enabled fields whose instant data is accessible from the public API
206         // but which are not part of a file
[593]207         std::vector<CField*> fieldsWithReadAccess;
208
[509]209         // Context root
[549]210         static shared_ptr<CContextGroup> root;
[219]211
[509]212         // Determine context on client or not
[549]213         bool hasClient;
[300]214
[509]215         // Determine context on server or not
[549]216         bool hasServer;
[509]217
218         // Concrete context server
[549]219         CContextServer* server;
[509]220
221         // Concrete contex client
[549]222         CContextClient* client;
[775]223         CRegistry* registryIn ;  //!< input registry which is read from file
[697]224         CRegistry* registryOut ; //!< output registry which will be wrote on file at the finalize
[775]225
[509]226      private:
227         bool isPostProcessed;
[597]228         bool finalized;
[511]229         StdString idServer_;
[639]230         CGarbageCollector garbageCollector;
[655]231         std::list<MPI_Comm> comms; //!< Communicators allocated internally
[509]232
233      public: // Some function maybe removed in the near future
234        // virtual void toBinary  (StdOStream & os) const;
235        // virtual void fromBinary(StdIStream & is);
[219]236   }; // class CContext
237
238   ///--------------------------------------------------------------
239
240   // Declare/Define CContextGroup and CContextDefinition
241   DECLARE_GROUP(CContext);
242
243   ///--------------------------------------------------------------
244
[335]245} // namespace xios
[219]246
[591]247#endif // __XIOS_CContext__
Note: See TracBrowser for help on using the repository browser.