source: XIOS3/dev/XIOS_ATTACHED/src/node/grid.hpp @ 2482

Last change on this file since 2482 was 2482, checked in by ymipsl, 15 months ago

First guess in supression of attached mode replaced by online reader and write filters

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
  • Property svn:executable set to *
File size: 17.4 KB
RevLine 
[591]1#ifndef __XIOS_CGrid__
2#define __XIOS_CGrid__
[219]3
[591]4/// XIOS headers ///
5#include "xios_spl.hpp"
[219]6#include "group_factory.hpp"
7
8#include "declare_group.hpp"
9#include "domain.hpp"
10#include "axis.hpp"
[887]11#include "scalar.hpp"
[369]12#include "array_new.hpp"
13#include "attribute_array.hpp"
[552]14#include "distribution_server.hpp"
[553]15#include "client_server_mapping.hpp"
[567]16#include "utils.hpp"
[619]17#include "transformation_enum.hpp"
[1918]18#include "grid_local_connector.hpp"
19#include "grid_elements.hpp"
[1930]20#include "grid_scatterer_connector.hpp"
21#include "grid_gatherer_connector.hpp"
[1984]22#include "transformation_path.hpp"
23#include "filter.hpp"
[1999]24#include "grid_algorithm.hpp"
[219]25
[1930]26
[335]27namespace xios {
[509]28
[1564]29   /// ////////////////////// Declarations ////////////////////// ///
[219]30
31   class CGridGroup;
32   class CGridAttributes;
[540]33   class CDomainGroup;
34   class CAxisGroup;
[887]35   class CScalarGroup;
[219]36   class CGrid;
[551]37   class CDistributionClient;
[552]38   class CDistributionServer;
[553]39   class CServerDistributionDescription;
40   class CClientServerMapping;
[2011]41 
[219]42   ///--------------------------------------------------------------
43
44   // Declare/Define CGridAttribute
45   BEGIN_DECLARE_ATTRIBUTE_MAP(CGrid)
46#  include "grid_attribute.conf"
47   END_DECLARE_ATTRIBUTE_MAP(CGrid)
48
49   ///--------------------------------------------------------------
50
51   class CGrid
52      : public CObjectTemplate<CGrid>
53      , public CGridAttributes
54   {
55         /// typedef ///
56         typedef CObjectTemplate<CGrid>   SuperClass;
57         typedef CGridAttributes SuperClassAttribute;
58
[1930]59      private:
60       
61        // define a structure to store elements (CDomain, CAxis, CScalar) using a void* and a type to cast the pointer
62         enum EElementType { TYPE_SCALAR, TYPE_AXIS, TYPE_DOMAIN } ;
63         struct SElement {void* ptr ; EElementType type ; CScalar* scalar ;  CAxis* axis ; CDomain* domain ; } ;
64         vector<SElement> elements_ ;
65         bool elementsComputed_ = false ; 
66         /** retrieve the vector of elements as a structure containing a void* and the type of pointer */
67         vector<SElement>& getElements(void) { if (!elementsComputed_) computeElements() ; return elements_ ; } 
68         void computeElements(void) ;
69         /** List order of axis and domain in a grid, if there is a domain, it will take value 2, axis 1, scalar 0 */
70         std::vector<int> order_;
71
[676]72      public:
[219]73
74         typedef CGridAttributes RelAttributes;
75         typedef CGridGroup      RelGroup;
76
[300]77         enum EEventId
78         {
[2326]79           EVENT_ID_COLLECTIVE=100,
[1973]80           EVENT_ID_ADD_DOMAIN, EVENT_ID_ADD_AXIS, EVENT_ID_ADD_SCALAR,
[1943]81           EVENT_ID_SEND_MASK,
[2326]82           EVENT_ID_NO_COLLECTIVE=1000,
[1943]83
[650]84         };
[509]85
[219]86         /// Constructeurs ///
87         CGrid(void);
[650]88         explicit CGrid(const StdString& id);
89         CGrid(const CGrid& grid);       // Not implemented yet.
90         CGrid(const CGrid* const grid); // Not implemented yet.
[219]91
92         /// Traitements ///
[509]93//         void solveReference(void);
[219]94
[676]95         void checkEligibilityForCompressedOutput();
[1930]96         
[676]97
[509]98
99         void checkMaskIndex(bool doCalculateIndex);
100
[650]101 //        virtual void toBinary  (StdOStream& os) const;
102//         virtual void fromBinary(StdIStream& is);
[219]103
[676]104         void addRelFileCompressed(const StdString& filename);
105
[219]106         /// Tests ///
[676]107         bool isCompressible(void) const;
108         bool isWrittenCompressed(const StdString& filename) const;
[219]109
[676]110      public:
[219]111
112         /// Accesseurs ///
[1158]113         StdSize getDimension(void);
[509]114
[1869]115         StdSize  getDataSize(void) ;
[219]116
[1875]117         /**
118          * Get the local data grid size, ie the size of the compressed grid (inside the workflow)
119          * \return The size od the compressed grid
120          */
121         StdSize  getLocalDataSize(void) ;
122
[1973]123 
[650]124         virtual void parse(xml::CXMLNode& node);
[540]125
[219]126         /// Destructeur ///
127         virtual ~CGrid(void);
128
[676]129      public:
[219]130
131         /// Accesseurs statiques ///
132         static StdString GetName(void);
133         static StdString GetDefName(void);
[509]134
[219]135         static ENodeType GetType(void);
136
137         /// Instanciateurs Statiques ///
[347]138         static CGrid* createGrid(CDomain* domain);
139         static CGrid* createGrid(CDomain* domain, CAxis* axis);
[745]140         static CGrid* createGrid(const std::vector<CDomain*>& domains, const std::vector<CAxis*>& axis,
[887]141                                  const CArray<int,1>& axisDomainOrder = CArray<int,1>());
[745]142         static CGrid* createGrid(StdString id, const std::vector<CDomain*>& domains, const std::vector<CAxis*>& axis,
[887]143                                  const std::vector<CScalar*>& scalars, const CArray<int,1>& axisDomainOrder = CArray<int,1>());
144         static CGrid* createGrid(const std::vector<CDomain*>& domains, const std::vector<CAxis*>& axis,
145                                  const std::vector<CScalar*>& scalars, const CArray<int,1>& axisDomainOrder);
[2311]146         static CGrid* get(const string& id, bool noError=false) ; //<! return grid pointer using id
147         static bool has(const string& id) ; //<! return if grid exist using id
[2315]148         static CField* getFieldFromId(const string& id) ; //<! return field id if used in grid reference
[745]149         static StdString generateId(const std::vector<CDomain*>& domains, const std::vector<CAxis*>& axis,
[887]150                                     const std::vector<CScalar*>& scalars, const CArray<int,1>& axisDomainOrder = CArray<int,1>());
[823]151         static StdString generateId(const CGrid* gridSrc, const CGrid* gridDest);
152         static CGrid* cloneGrid(const StdString& idNewGrid, CGrid* gridSrc);
[219]153
[2206]154         CDomain* getAssociatedDomain(const string& domainId, bool noError=false) ;
155         CAxis*   getAssociatedAxis(const string& axisId, bool noError=false) ;
156         CScalar* getAssociatedScalar(const string& scalarId, bool noError=false) ;
[1144]157      public:           
[1869]158         void solveDomainAxisRef(bool areAttributesChecked);
159         void checkElementsAttributes(void) ;
[219]160
[509]161         void solveDomainRef(bool checkAtt);
162         void solveAxisRef(bool checkAtt);
[887]163         void solveScalarRef(bool checkAtt);
[1869]164         void solveElementsRefInheritance(bool apply = true);
[2206]165         bool activateFieldWorkflow(CGarbageCollector& gc) ;
[1869]166        // void solveTransformations();
[775]167         void solveDomainAxisBaseRef();
[509]168
[835]169         CDomain* addDomain(const std::string& id=StdString());
170         CAxis* addAxis(const std::string& id=StdString());
[887]171         CScalar* addScalar(const std::string& id=StdString());
[1870]172
173      public:
[2397]174         void sendGridToFileServer(CContextClient* client, bool inOut) ;
[1870]175      private:
176         std::set<CContextClient*> sendGridToFileServer_done_ ;
[1875]177     
[1870]178      public:
[1875]179         void sendGridToCouplerOut(CContextClient* client, const string& fieldId) ;
180      private:
181         std::set<CContextClient*> sendGridToCouplerOut_done_ ;
182
183      public:
184         void makeAliasForCoupling(const string& fieldId) ;
[2022]185         string getCouplingAlias(const string& fieldId) ;
[1875]186
187      public:
[1784]188         void sendAddDomain(const std::string& id,CContextClient* contextClient);
189         void sendAddAxis(const std::string& id,CContextClient* contextClient);
190         void sendAddScalar(const std::string& id,CContextClient* contextClient);
[1974]191       
[650]192         static void recvAddDomain(CEventServer& event);
193         void recvAddDomain(CBufferIn& buffer);
194         static void recvAddAxis(CEventServer& event);
195         void recvAddAxis(CBufferIn& buffer);
[887]196         static void recvAddScalar(CEventServer& event);
197         void recvAddScalar(CBufferIn& buffer);
[540]198
[650]199         static bool dispatchEvent(CEventServer& event);
[1875]200       
201       public:
[1294]202         void setContextClient(CContextClient* contextClient);
203
[1330]204         std::map<int, StdSize> getAttributesBufferSize(CContextClient* client, bool bufferForWriting = false);
205         std::map<int, StdSize> getDataBufferSize(CContextClient* client, const std::string& id = "", bool bufferForWriting = false);
[540]206         std::vector<StdString> getDomainList();
207         std::vector<StdString> getAxisList();
[887]208         std::vector<StdString> getScalarList();
[540]209         std::vector<CDomain*> getDomains();
210         std::vector<CAxis*> getAxis();
[887]211         std::vector<CScalar*> getScalars();
[943]212         CDomain* getDomain(int domainIndex);
213         CAxis* getAxis(int axisIndex);
214         CScalar* getScalar(int scalarIndex);
[551]215         std::vector<int> getAxisOrder();
[567]216         std::vector<int> getGlobalDimension();
[1236]217         bool isScalarGrid() const;         
[540]218
[567]219         bool doGridHaveDataToWrite();
[1235]220         bool doGridHaveDataDistributed(CContextClient* client = 0);
[567]221
[1984]222         ///////////////////////////////////////////
223         ////////    TRANSFORMATIONS           /////
224         ///////////////////////////////////////////
225      public:
[1988]226         pair<shared_ptr<CFilter>, shared_ptr<CFilter> > buildTransformationGraph(CGarbageCollector& gc, bool isSource, CGrid* gridSrc, double detectMissingValues,
[2144]227                                                                                  double defaultValue, CGrid*& newGrid, bool graphEnabled=false, CField* field=0) ;
[1984]228      private:
[2270]229        shared_ptr<CGridAlgorithm> gridAlgorithm_ = nullptr ;
[1999]230      public:
[2270]231        void setGridAlgorithm(shared_ptr<CGridAlgorithm> gridAlgorithm) {gridAlgorithm_ = gridAlgorithm;}
232        shared_ptr<CGridAlgorithm> getGridAlgorithm(void) { return gridAlgorithm_ ;}
[1984]233       
234        ///////////////////////////////////////////
235      public:
236
237        size_t getGlobalWrittenSize(void) ;
[1875]238         
239         bool isCompleted(void) ;
240         void setCompleted(void) ;
241         void unsetCompleted(void) ;
[509]242
[1869]243
[1637]244         bool hasMask(void) const;
[1918]245        /** get mask pointer stored in mask_1d, or mask_2d, or..., or mask_7d */
246         CArray<bool,1> mask_ ;
247         CArray<bool,1>& getMask(void) ;
[509]248
[1973]249      private:
[1870]250        /** Client-like distribution calculated based on the knowledge of the entire grid */
251       CDistributionClient* clientDistribution_;
252     public: 
[1869]253       void computeClientDistribution(void) ;
[1870]254     private:
[1869]255       bool computeClientDistribution_done_ = false ;
[1870]256     public:
257       CDistributionClient* getClientDistribution(void); 
[1869]258
[1871]259     private:   
[540]260        void setVirtualDomainGroup(CDomainGroup* newVDomainGroup);
261        void setVirtualAxisGroup(CAxisGroup* newVAxisGroup);
[887]262        void setVirtualScalarGroup(CScalarGroup* newVScalarGroup);
[567]263
[887]264        void setDomainList(const std::vector<CDomain*> domains = std::vector<CDomain*>());
[540]265        void setAxisList(const std::vector<CAxis*> axis = std::vector<CAxis*>());
[887]266        void setScalarList(const std::vector<CScalar*> scalars = std::vector<CScalar*>());
[540]267
[887]268        CDomainGroup* getVirtualDomainGroup() const;
[540]269        CAxisGroup* getVirtualAxisGroup() const;
[887]270        CScalarGroup* getVirtualScalarGroup() const;
[619]271
[1158]272        int computeGridGlobalDimension(std::vector<int>& globalDim,
273                                       const std::vector<CDomain*> domains,
274                                       const std::vector<CAxis*> axis,
275                                       const std::vector<CScalar*> scalars,
276                                       const CArray<int,1>& axisDomainOrder);
277        int getDistributedDimension();
[1794]278      public:
279
[1870]280        bool isDataDistributed(void) ; 
[1236]281
[1870]282      private:
[1294]283        bool isChecked;
284        bool isDomainAxisChecked;
285        bool isIndexSent;
286
[540]287        CDomainGroup* vDomainGroup_;
288        CAxisGroup* vAxisGroup_;
[887]289        CScalarGroup* vScalarGroup_;
290        std::vector<std::string> axisList_, domList_, scalarList_;
291        bool isAxisListSet, isDomListSet, isScalarListSet;
[567]292
[1330]293/** Map storing local ranks of connected receivers. Key = size of receiver's intracomm.
294  * It is calculated in computeConnectedClients(). */
[1263]295        std::map<int, std::vector<int> > connectedServerRank_;
[1243]296
[1330]297/** Map storing the size of data to be send. Key = size of receiver's intracomm
298  * It is calculated in computeConnectedClients(). */
[1263]299        std::map<int, std::map<int,size_t> > connectedDataSize_;
[1243]300
[1330]301/** Ranks of connected receivers in case of reading. It is calculated in recvIndex(). */
302        std::vector<int> connectedServerRankRead_;
303
304/** Size of data to be send in case of reading. It is calculated in recvIndex(). */
305        std::map<int,size_t> connectedDataSizeRead_;
[1870]306     
[676]307         //! True if and only if the data defined on the grid can be outputted in a compressed way
308        bool isCompressible_;
309        std::set<std::string> relFilesCompressed;
[619]310
[1870]311       
[620]312        std::vector<int> axisPositionInGrid_;
[1870]313        void computeAxisPositionInGrid(void) ;
314        bool computeAxisPositionInGrid_done_ = false ;
315        std::vector<int>& getAxisPositionInGrid(void) { if (!computeAxisPositionInGrid_done_) computeAxisPositionInGrid() ; return axisPositionInGrid_ ;}
316
[1158]317        bool hasDomainAxisBaseRef_;       
[823]318        std::map<CGrid*, std::pair<bool,StdString> > gridSrc_;
[1243]319
[1930]320     //////////////////////////////////////////////////////////////////////////////////////
321     //  this part is related to distribution, element definition, views and connectors  //
322     //////////////////////////////////////////////////////////////////////////////////////
[1984]323      public:
[2482]324        CGrid* redistributeGridToWriter(void) ;
325      public:
[1984]326       CGrid* duplicateSentGrid(void) ;
[1943]327      private:
328       static void recvMask(CEventServer& event) ;
329       void receiveMask(CEventServer& event) ;
[1243]330
[1918]331      private: 
[2267]332       shared_ptr<CGridLocalElements> gridLocalElements_= nullptr ;
[1918]333        void computeGridLocalElements(void) ;
334      public:
[2267]335        shared_ptr<CGridLocalElements> getGridLocalElements(void) { if (gridLocalElements_==nullptr) computeGridLocalElements() ; return gridLocalElements_ ;}
[1918]336
337      private:
[2267]338        shared_ptr<CGridLocalConnector> modelToWorkflowConnector_ = nullptr ;
[1918]339      public:
340        void computeModelToWorkflowConnector(void) ;
[2267]341        shared_ptr<CGridLocalConnector> getModelToWorkflowConnector(void) { if (modelToWorkflowConnector_==nullptr) computeModelToWorkflowConnector() ; return modelToWorkflowConnector_;}
[1918]342
[1930]343      private:
[2267]344        shared_ptr<CGridLocalConnector> workflowToModelConnector_ = nullptr;
[1930]345      public:
346        void computeWorkflowToModelConnector(void) ;
[2267]347        shared_ptr<CGridLocalConnector> getWorkflowToModelConnector(void) { if (workflowToModelConnector_==nullptr) computeWorkflowToModelConnector() ; return workflowToModelConnector_;}
[1930]348
349      public: //?
[2397]350        void distributeGridToServer(CContextClient* client, bool inOut, const string& fieldId="");
[1930]351     
[1934]352           
[1930]353      private:
[2267]354        shared_ptr<CGridLocalConnector> workflowToFullConnector_ = nullptr;
[1930]355      public:
356        void computeWorkflowToFullConnector(void) ;
[2267]357        shared_ptr<CGridLocalConnector> getWorkflowToFullConnector(void) { if (workflowToFullConnector_==nullptr) computeWorkflowToFullConnector() ; return workflowToFullConnector_;}
[1930]358
359      private:
[2267]360        shared_ptr<CGridLocalConnector> fullToWorkflowConnector_ = nullptr;
[1930]361      public:
362        void computeFullToWorkflowConnector(void) ;
[2267]363        shared_ptr<CGridLocalConnector> getFullToWorkflowConnector(void) { if (fullToWorkflowConnector_==nullptr) computeFullToWorkflowConnector() ; return fullToWorkflowConnector_;}
[1930]364
[1934]365   
366
[1930]367      private:
[2267]368         shared_ptr<CGridGathererConnector> clientFromClientConnector_ = nullptr ;
[1930]369      public:
[2267]370         shared_ptr<CGridGathererConnector> getClientFromClientConnector(void) { if (clientFromClientConnector_==nullptr) computeClientFromClientConnector() ; return clientFromClientConnector_;}
[1930]371         void computeClientFromClientConnector(void) ;
372
373      private:
[2267]374         map<CContextClient*, shared_ptr<CGridScattererConnector>> clientToClientConnector_ ;
[1930]375      public:
[2267]376         shared_ptr<CGridScattererConnector> getClientToClientConnector(CContextClient* client) { return clientToClientConnector_[client] ;} // make some test to see if connector exits for the given client
[1930]377 
378
379      private:
[2267]380         map<CContextClient*,shared_ptr<CGridGathererConnector>> clientFromServerConnector_  ;
[1930]381      public:
[2267]382         shared_ptr<CGridGathererConnector> getClientFromServerConnector(CContextClient* client) { return clientFromServerConnector_[client];}
[1930]383         void computeClientFromServerConnector(void) ;
384
[1934]385      private:
[2267]386         shared_ptr<CGridScattererConnector> serverToClientConnector_=nullptr ;
[1934]387      public:
[2267]388         shared_ptr<CGridScattererConnector> getServerToClientConnector(void) { if (serverToClientConnector_==nullptr) computeServerToClientConnector() ; return serverToClientConnector_;}
[1934]389         void computeServerToClientConnector(void) ;
390      private:
[2267]391         map<CContextClient*, shared_ptr<CGridScattererConnector>> clientToServerConnector_ ;
[1934]392      public:
[2267]393         shared_ptr<CGridScattererConnector> getClientToServerConnector(CContextClient* client) { return clientToServerConnector_[client] ;} // make some test to see if connector exits for the given client
[1934]394         
395      private:
[2267]396         shared_ptr<CGridGathererConnector> serverFromClientConnector_ = nullptr ;
[1934]397      public:
[2267]398         shared_ptr<CGridGathererConnector> getServerFromClientConnector(void) { if (serverFromClientConnector_==nullptr) computeServerFromClientConnector() ; return serverFromClientConnector_;}
[1934]399         void computeServerFromClientConnector(void) ;
400
[2482]401      private:
402         shared_ptr<CGridTransformConnector> redistributeToWriterConnector_ = nullptr ;
403      public:
404         shared_ptr<CGridTransformConnector> getRedistributeToWriterConnector(CGrid* gridSrc) { if (redistributeToWriterConnector_==nullptr) computeRedistributeToWriterConnector(gridSrc) ; return redistributeToWriterConnector_;}
405         void computeRedistributeToWriterConnector(CGrid* gridSrc) ;
406
407
[219]408   }; // class CGrid
409
410   // Declare/Define CGridGroup and CGridDefinition
411   DECLARE_GROUP(CGrid);
412
413   ///--------------------------------------------------------------
414
[335]415} // namespace xios
[219]416
[591]417#endif // __XIOS_CGrid__
Note: See TracBrowser for help on using the repository browser.