source: XIOS/trunk/src/node/grid.hpp @ 552

Last change on this file since 552 was 552, checked in by mhnguyen, 9 years ago

Doing some cleans and improving a little bit performance of creating local index on server

+) Add some comments, add some initialization
+) Change the way to calculate local index on server

Test
+) On Curie

  • 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.4 KB
Line 
1#ifndef __XMLIO_CGrid__
2#define __XMLIO_CGrid__
3
4/// xios headers ///
5#include "xmlioserver_spl.hpp"
6#include "group_factory.hpp"
7
8#include "declare_group.hpp"
9#include "domain.hpp"
10#include "axis.hpp"
11#include "array_new.hpp"
12#include "attribute_array.hpp"
13#include "distribution_client.hpp"
14#include "distribution_server.hpp"
15
16namespace xios {
17
18   /// ////////////////////// Déclarations ////////////////////// ///
19
20   class CGridGroup;
21   class CGridAttributes;
22   class CDomainGroup;
23   class CAxisGroup;
24   class CGrid;
25   class CDistributionClient;
26   class CDistributionServer;
27
28   ///--------------------------------------------------------------
29
30   // Declare/Define CGridAttribute
31   BEGIN_DECLARE_ATTRIBUTE_MAP(CGrid)
32#  include "grid_attribute.conf"
33   END_DECLARE_ATTRIBUTE_MAP(CGrid)
34
35   ///--------------------------------------------------------------
36
37   class CGrid
38      : public CObjectTemplate<CGrid>
39      , public CGridAttributes
40   {
41         /// typedef ///
42         typedef CObjectTemplate<CGrid>   SuperClass;
43         typedef CGridAttributes SuperClassAttribute;
44
45      public :
46
47         typedef CGridAttributes RelAttributes;
48         typedef CGridGroup      RelGroup;
49
50         enum EEventId
51         {
52           EVENT_ID_INDEX, EVENT_ID_ADD_DOMAIN, EVENT_ID_ADD_AXIS
53         } ;
54
55         /// Constructeurs ///
56         CGrid(void);
57         explicit CGrid(const StdString & id);
58         CGrid(const CGrid & grid);       // Not implemented yet.
59         CGrid(const CGrid * const grid); // Not implemented yet.
60
61         /// Traitements ///
62//         void solveReference(void);
63
64         void solveDomainAxisRef(bool areAttributesChecked);
65
66         void checkMaskIndex(bool doCalculateIndex);
67
68 //        virtual void toBinary  (StdOStream & os) const;
69//         virtual void fromBinary(StdIStream & is);
70
71         /// Tests ///
72         bool hasAxis(void) const;
73
74      public :
75
76         /// Accesseurs ///
77         const std::deque< CArray<int, 1>* > & getStoreIndex(void) const;
78         const std::deque< CArray<int, 1>* > & getOutIIndex(void)  const;
79         const std::deque< CArray<int, 1>* > & getOutJIndex(void)  const;
80         const std::deque< CArray<int, 1>* > & getOutLIndex(void)  const;
81
82         const CAxis*   getRelAxis  (void) const;
83         const CDomain* getRelDomain(void) const;
84
85         StdSize getDimension(void) const;
86
87//         StdSize getLocalSize(void) const;
88//         StdSize getGlobalSize(void) const;
89         StdSize  getDataSize(void) const;
90//         std::vector<StdSize> getLocalShape(void) const;
91//         std::vector<StdSize> getGlobalShape(void) const;
92
93         /// Entrées-sorties de champs ///
94         template <int n>
95            void inputField(const CArray<double,n>& field, CArray<double,1>& stored) const;
96
97         void inputFieldServer(const std::deque< CArray<double, 1>* > storedClient,
98                               CArray<double, 1>&  storedServer) const;
99
100         void outputField(int rank, const CArray<double,1>& stored,  CArray<double,3>& field)  ;
101         void outputField(int rank, const CArray<double,1>& stored,  CArray<double,2>& field)  ;
102         void outputField(int rank, const CArray<double,1>& stored,  CArray<double,1>& field)  ;
103         void outputField(int rank, const CArray<double,1>& stored,  double* field);
104
105         virtual void parse(xml::CXMLNode & node);
106
107         /// Destructeur ///
108         virtual ~CGrid(void);
109
110      public :
111
112         /// Accesseurs statiques ///
113         static StdString GetName(void);
114         static StdString GetDefName(void);
115
116         static ENodeType GetType(void);
117
118         /// Instanciateurs Statiques ///
119         static CGrid* createGrid(CDomain* domain);
120         static CGrid* createGrid(CDomain* domain, CAxis* axis);
121         static CGrid* createGrid(std::vector<CDomain*> domains, std::vector<CAxis*> axis);
122
123      public :
124
125         /// Entrées-sorties de champs (interne) ///
126         void storeField_arr(const double * const data, CArray<double,1>& stored) const;
127
128         /// Traitements protégés ///
129         void computeIndexServer(void);
130         void computeIndex(void);
131//         void solveDomainRef(void);  //TODO temporarily comment
132//         void solveAxisRef(void);   // TODO: temporarily comment
133
134         void solveDomainRef(bool checkAtt);
135         void solveAxisRef(bool checkAtt);
136         void solveDomainAxisRefInheritance(bool apply = true);
137
138         void sendAddDomain(const std::string& id="");
139         void sendAddAxis(const std::string& id="");
140         void sendAllDomains();
141         void sendAllAxis();
142
143         static void recvAddDomain(CEventServer& event) ;
144         void recvAddDomain(CBufferIn& buffer) ;
145         static void recvAddAxis(CEventServer& event) ;
146         void recvAddAxis(CBufferIn& buffer) ;
147
148         static bool dispatchEvent(CEventServer& event) ;
149         void outputFieldToServer(CArray<double,1>& fieldIn, int rank, CArray<double,1>& fieldOut) ;
150         static void recvIndex(CEventServer& event) ;
151         void recvIndex(int rank, CBufferIn& buffer) ;
152         void sendIndex(void) ;
153
154         void computeDomConServer();
155         std::map<int, int> getDomConServerSide();
156         std::map<int, StdSize> getConnectedServerDataSize();
157         std::vector<StdString> getDomainList();
158         std::vector<StdString> getAxisList();
159         std::vector<CDomain*> getDomains();
160         std::vector<CAxis*> getAxis();
161         std::vector<int> getAxisOrder();
162
163      public:
164
165         /// Propriétés privées ///
166         bool withAxis ;
167         bool isChecked;
168         bool isDomainAxisChecked;
169         bool isIndexSent;
170
171         CAxis*   axis ;
172         CDomain* domain ;
173
174         std::deque< CArray<int, 1>* > storeIndex ;
175         std::deque< CArray<int, 1>* > out_i_index ;
176         std::deque< CArray<int, 1>* > out_j_index ;
177         std::deque< CArray<int, 1>* > out_l_index ;
178
179        CArray<int, 1>  storeIndex_client ;
180        CArray<int, 1>  out_i_client ;
181        CArray<int, 1>  out_j_client ;
182        CArray<int, 1>  out_l_client ;
183
184         map<int, CArray<int, 1>* >  storeIndex_toSrv ;
185         map<int,int> nbSenders ;
186//         std::deque<ARRAY(int, 1)> out_i_toSrv ;
187//         std::deque<ARRAY(int, 1)> out_j_toSrv ;
188//         std::deque<ARRAY(int, 1)> out_l_toSrv ;
189
190         map<int, CArray<int, 1>* > out_i_fromClient ;
191         map<int, CArray<int, 1>* > out_j_fromClient ;
192         map<int, CArray<int, 1>* > out_l_fromClient ;
193
194         map<int, CArray<size_t, 1>* > outIndexFromClient;
195         void checkMask(void) ;
196
197         std::map<int, int> domConnectedServerSide_;
198         bool isDomConServerComputed_;
199
200      private:
201        void setVirtualDomainGroup(CDomainGroup* newVDomainGroup);
202        void setVirtualDomainGroup();
203        void setVirtualAxisGroup(CAxisGroup* newVAxisGroup);
204        void setVirtualAxisGroup();
205//        void setAxisList();
206        void setAxisList(const std::vector<CAxis*> axis = std::vector<CAxis*>());
207//        void setDomainList();
208        void setDomainList(const std::vector<CDomain*> domains = std::vector<CDomain*>());
209
210        CDomain* addDomain(const std::string& id);
211        CAxis* addAxis(const std::string& id);
212
213        CAxisGroup* getVirtualAxisGroup() const;
214        CDomainGroup* getVirtualDomainGroup() const;
215      private:
216        CDomainGroup* vDomainGroup_;
217        CAxisGroup* vAxisGroup_;
218        std::vector<std::string> axisList_, domList_;
219        bool isAxisListSet, isDomListSet;
220        CDistributionClient* clientDistribution_;
221        CDistributionServer* serverDistribution_;
222   }; // class CGrid
223
224   ///--------------------------------------------------------------
225
226   template <int n>
227      void CGrid::inputField(const CArray<double,n>& field, CArray<double,1>& stored) const
228   {
229      if (this->getDataSize() != field.numElements())
230         ERROR("void CGrid::inputField(const  CArray<double,n>& field, CArray<double,1>& stored) const",
231                << "[ Awaiting size of the data = " << this->getDataSize()       << ", "
232                << "Received data size = "      << field.numElements() << " ] "
233                << "The array of data has not the good size !")
234      this->storeField_arr(field.dataFirst(), stored) ;
235   }
236
237   ///--------------------------------------------------------------
238
239   // Declare/Define CGridGroup and CGridDefinition
240   DECLARE_GROUP(CGrid);
241
242   ///--------------------------------------------------------------
243
244} // namespace xios
245
246#endif // __XMLIO_CGrid__
Note: See TracBrowser for help on using the repository browser.