source: XIOS/dev/dev_ym/XIOS_COUPLING/src/node/context.hpp @ 1787

Last change on this file since 1787 was 1784, checked in by ymipsl, 5 years ago
  • Preparing coupling functionalities.
  • Make some cleaner things

YM

  • 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: 12.8 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 "data_output.hpp"
[639]11#include "garbage_collector.hpp"
[697]12#include "registry.hpp"
[382]13#include "mpi.hpp"
[1761]14#include "services_manager.hpp"
15#include "server_context.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;
[1784]28   class CCouplerIn ;
29   class CCouplerOut ;
[219]30   ///--------------------------------------------------------------
31
32   // Declare/Define CFileAttribute
33   BEGIN_DECLARE_ATTRIBUTE_MAP(CContext)
34#  include "context_attribute.conf"
35   END_DECLARE_ATTRIBUTE_MAP(CContext)
36
37   ///--------------------------------------------------------------
[509]38  /*!
39  \class CContext
40   This class corresponds to the concrete presentation of context in xml file and in play an essential role in XIOS
41   Each object of this class contains all root definition of elements: files, fiels, domains, axis, etc, ... from which
42   we can have access to each element.
43   In fact, every thing must a be inside a particuliar context. After the xml file (iodef.xml) is parsed,
44   object of the class is created and its contains all information of other elements in the xml file.
45  */
[219]46   class CContext
47      : public CObjectTemplate<CContext>
48      , public CContextAttributes
49   {
[300]50         public :
51         enum EEventId
52         {
53           EVENT_ID_CLOSE_DEFINITION,EVENT_ID_UPDATE_CALENDAR,
[509]54           EVENT_ID_CREATE_FILE_HEADER,EVENT_ID_CONTEXT_FINALIZE,
[1025]55           EVENT_ID_POST_PROCESS, EVENT_ID_SEND_REGISTRY,
56           EVENT_ID_POST_PROCESS_GLOBAL_ATTRIBUTES,
[1764]57           EVENT_ID_PROCESS_GRID_ENABLED_FIELDS,
58           EVENT_ID_CONTEXT_FINALIZE_CLIENT,
[549]59         };
[509]60
[219]61         /// typedef ///
62         typedef CObjectTemplate<CContext>   SuperClass;
63         typedef CContextAttributes SuperClassAttribute;
64
65      public :
66
67         typedef CContextAttributes RelAttributes;
68         typedef CContext           RelGroup;
69
70         //---------------------------------------------------------
71
72      public :
73
74         /// Constructeurs ///
75         CContext(void);
76         explicit CContext(const StdString & id);
77         CContext(const CContext & context);       // Not implemented yet.
78         CContext(const CContext * const context); // Not implemented yet.
79
80         /// Destructeur ///
81         virtual ~CContext(void);
82
83         //---------------------------------------------------------
84
85      public :
[509]86
[219]87         /// Mutateurs ///
[1542]88         void setCalendar(std::shared_ptr<CCalendar> newCalendar);
[509]89
[219]90         /// Accesseurs ///
[1542]91         std::shared_ptr<CCalendar>      getCalendar(void) const;
[219]92
93      public :
[509]94         // Initialize server or client
[1761]95         void init(CServerContext* parentServerContext, MPI_Comm intraComm, int serviceType);
96         void initClient(MPI_Comm intraComm, int serviceType);
97         
98         void initServer(MPI_Comm intraComm, int serviceType );
99         void createClientInterComm(MPI_Comm interCommClient, MPI_Comm interCommServer)  ;
100         void createServerInterComm(void)  ;
101
[549]102         bool isInitialized(void);
[219]103
[1622]104         StdString dumpClassAttributes(void);
105
[509]106         // Put sever or client into loop state
[1761]107         bool eventLoop(bool enableEventsProcessing=true);
[1764]108         void globalEventLoop(void);
[597]109
[509]110         // Finalize a context
[549]111         void finalize(void);
[1764]112
[1071]113         bool isFinalized(void);
[509]114
[1130]115         void closeDefinition(void);
116
[509]117         // Some functions to process context
[1232]118         void findAllEnabledFieldsInFiles(const std::vector<CFile*>& activeFiles);
119         // void findAllEnabledFields(void);
120         // void findAllEnabledFieldsInReadModeFiles(void);
[775]121         void readAttributesOfEnabledFieldsInReadModeFiles();
[549]122         void solveAllInheritance(bool apply=true);
[300]123         void findEnabledFiles(void);
[1784]124         void findEnabledCouplerIn(void);
125         void findEnabledCouplerOut(void);
126         void createCouplerInterCommunicator(void) ;
[1232]127         void findEnabledWriteModeFiles(void);
[598]128         void findEnabledReadModeFiles(void);
[549]129         void closeAllFile(void);
130         void updateCalendar(int step);
[1232]131         void createFileHeader(void);
132         void initReadFiles(void);
[676]133         void checkAxisDomainsGridsEligibilityForCompressedOutput();
[711]134         void prepareTimeseries(void);
[1784]135         void solveOnlyRefOfEnabledFields(void);         
[640]136         void buildFilterGraphOfEnabledFields();
[1358]137         void postProcessFilterGraph();
[598]138         void startPrefetchingOfEnabledReadModeFiles();
[1358]139         void doPreTimestepOperationsForEnabledReadModeFiles();
[1318]140         void doPostTimestepOperationsForEnabledReadModeFiles();
[593]141         void findFieldsWithReadAccess(void);
142         void solveAllRefOfFieldsWithReadAccess();
[640]143         void buildFilterGraphOfFieldsWithReadAccess();
[509]144         void postProcessing();
[1025]145         void postProcessingGlobalAttributes();         
[509]146
[1784]147         void solveAllRefOfEnabledFieldsAndTransform(void);
[1099]148         void checkGridEnabledFields();
[1232]149         void checkGridEnabledFieldsInFiles(const std::vector<CFile*>& activeFiles);
[1239]150         void sendGridEnabledFieldsInFiles(const std::vector<CFile*>& activeFiles); 
151         void sendGridComponentEnabledFieldsInFiles(const std::vector<CFile*>& activeFiles)       ;
[1025]152
[1330]153         std::map<int, StdSize> getAttributesBufferSize(std::map<int, StdSize>& maxEventSize, CContextClient* contextClient, bool bufferForWriting = false);
154         std::map<int, StdSize> getDataBufferSize(std::map<int, StdSize>& maxEventSize, CContextClient* contextClient, bool bufferForWriting = false);
155         void setClientServerBuffer(CContextClient* contextClient, bool bufferForWriting = false);
[509]156
[1212]157         // Distribute files (in write mode) among secondary-server pools according to the estimated data flux
[1208]158         void distributeFiles(void);
[1349]159         void distributeFileOverBandwith() ;
160         void distributeFileOverMemoryBandwith() ;
161         
[509]162         // Send context close definition
[549]163         void sendCloseDefinition(void);
[509]164         // There are something to send on closing context defintion
[549]165         void sendUpdateCalendar(int step);
166         void sendCreateFileHeader(void);
[1232]167         void sendEnabledFiles(const std::vector<CFile*>& activeFiles);
168         void sendEnabledFieldsInFiles(const std::vector<CFile*>& activeFiles);
169         void sendRefDomainsAxisScalars(const std::vector<CFile*>& activeFiles);
170         void sendRefGrid(const std::vector<CFile*>& activeFiles);
[509]171         void sendPostProcessing();
[1025]172         void sendPostProcessingGlobalAttributes();
173         void sendProcessingGridOfEnabledFields();
[983]174         //!< after be gathered to the root process of the context, merged registry is sent to the root process of the servers
175         void sendRegistry(void) ;
[1764]176         void sendFinalizeClient(CContextClient* contextClient, const string& contextClientId);
[983]177
[1764]178
[511]179         const StdString& getIdServer();
[1761]180         void setIdServer(const StdString& idServer);
[1009]181         const StdString& getIdServer(const int srvPoolNb);
[1761]182         std::string getContextId() {return contextId_;}
[511]183
[509]184         // Client side: Receive and process messages
[549]185         static void recvUpdateCalendar(CEventServer& event);
186         void recvUpdateCalendar(CBufferIn& buffer);
187         static void recvCloseDefinition(CEventServer& event);
188         static void recvCreateFileHeader(CEventServer& event);
189         void recvCreateFileHeader(CBufferIn& buffer);
[509]190         static void recvSolveInheritanceContext(CEventServer& event);
191         void recvSolveInheritanceContext(CBufferIn& buffer);
192         static void recvPostProcessing(CEventServer& event);
193         void recvPostProcessing(CBufferIn& buffer);
[1025]194         static void recvProcessingGridOfEnabledFields(CEventServer& event);
195         static void recvPostProcessingGlobalAttributes(CEventServer& event);
196         void recvPostProcessingGlobalAttributes(CBufferIn& buffer);
[697]197         static void recvRegistry(CEventServer& event) ;
[983]198         void recvRegistry(CBufferIn& buffer) ; //!< registry is received by the servers
[1764]199         static void recvFinalizeClient(CEventServer& event) ;
200         void recvFinalizeClient(CBufferIn& buffer);
201         
[1130]202         void freeComms(void);                  //!< Free internally allcoated communicators
203         void releaseClientBuffers(void);       //! Deallocate buffers allocated by clientContexts
[1054]204
[509]205         // dispatch event
[549]206         static bool dispatchEvent(CEventServer& event);
[509]207
208      public:
209        // Get current context
210        static CContext* getCurrent(void);
211
212        // Get context root
213        static CContextGroup* getRoot(void);
214
215        // Set current context
216        static void setCurrent(const string& id);
217
218        // Create new context
219        static CContext* create(const string& id = "");
220
221        /// Accesseurs statiques ///
222        static StdString GetName(void);
223        static StdString GetDefName(void);
224        static ENodeType GetType(void);
225
226        static CContextGroup* GetContextGroup(void);
227
228        // Some functions to visualize structure of current context
229        static void ShowTree(StdOStream & out = std::clog);
230        static void CleanTree(void);
[1761]231        int getServiceType(void) {return serviceType_;}
[509]232
[219]233      public :
[509]234         // Parse xml node and write all info into context
[219]235         virtual void parse(xml::CXMLNode & node);
236
[509]237         // Visualize a context
[219]238         virtual StdString toString(void) const;
[509]239
240
241         // Solve all inheritance relation in current context
242         virtual void solveDescInheritance(bool apply, const CAttributeMap * const parent = 0);
243
244         // Verify if all root definition in a context have children
245         virtual bool hasChild(void) const;
246
[1761]247         bool isProcessingEvent(void) {return isProcessingEvent_;}
248         bool setProcessingEvent(void) {isProcessingEvent_=true ;}
249         bool unsetProcessingEvent(void) {isProcessingEvent_=false ;}
[1784]250         MPI_Comm getIntraComm(void) { return intraComm_ ;}
[1054]251
[1784]252         void addCouplingChanel(const std::string& contextId, bool out) ;
253
[300]254      public :
[509]255         // Calendar of context
[1542]256         std::shared_ptr<CCalendar>   calendar;
[509]257
[598]258         // List of all enabled files (files on which fields are written or read)
[347]259         std::vector<CFile*> enabledFiles;
[598]260         // List of all enabled files in read mode (files on which fields are read)
261         std::vector<CFile*> enabledReadModeFiles;
[1208]262         // List of all enabled files in write mode
263         std::vector<CFile*> enabledWriteModeFiles;
[509]264
[1784]265         std::vector<CCouplerIn*> enabledCouplerIn;
266         std::vector<CCouplerOut*> enabledCouplerOut;
267
268
[740]269         // List of all enabled fields whose instant data is accessible from the public API
270         // but which are not part of a file
[593]271         std::vector<CField*> fieldsWithReadAccess;
272
[509]273         // Context root
[1542]274         static std::shared_ptr<CContextGroup> root;
[219]275
[509]276         // Determine context on client or not
[549]277         bool hasClient;
[300]278
[509]279         // Determine context on server or not
[549]280         bool hasServer;
[509]281
[1130]282         CContextServer* server;    //!< Concrete context server
283         CContextClient* client;    //!< Concrete contex client
[1071]284         std::vector<CContextServer*> serverPrimServer;
285         std::vector<CContextClient*> clientPrimServer;
[1784]286         std::map<std::string, CContextClient*> couplerClient_ ;
287         std::map<std::string, CContextServer*> couplerServer_ ;
288
289
[1761]290         std::vector<std::string> primServerId_;
[1071]291
[1130]292         CRegistry* registryIn ;    //!< input registry which is read from file
293         CRegistry* registryOut ;   //!< output registry which will be written into file at the finalize
[775]294
[1761]295
296        MPI_Comm intraComm_ ; //! context intra communicator
[1784]297        int intraCommRank_ ; //! context intra communicator rank
298        int intraCommSize_ ; //! context intra communicator size
299       
[509]300      private:
301         bool isPostProcessed;
[1025]302         bool allProcessed;
[1139]303         bool finalized;
[1764]304         int countChildContextFinalized_;        //!< Counter of child contexts (for now it is the number of secondary server pools)
[511]305         StdString idServer_;
[639]306         CGarbageCollector garbageCollector;
[1639]307         std::list<MPI_Comm> comms; //!< Communicators allocated internally
[509]308
[1761]309         int serviceType_;  //!< service associated to the context
310         string contextId_ ; //!< context client id for the servers. For clients this is same as getId()
311         bool isProcessingEvent_ ;
312         CServerContext* parentServerContext_ ;
313
[509]314      public: // Some function maybe removed in the near future
315        // virtual void toBinary  (StdOStream & os) const;
316        // virtual void fromBinary(StdIStream & is);
[219]317   }; // class CContext
318
319   ///--------------------------------------------------------------
320
321   // Declare/Define CContextGroup and CContextDefinition
322   DECLARE_GROUP(CContext);
323
324   ///--------------------------------------------------------------
325
[335]326} // namespace xios
[219]327
[591]328#endif // __XIOS_CContext__
Note: See TracBrowser for help on using the repository browser.