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

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

Redesigning grid structure

+) Add an intermediate class to calculate distribution on client and servers
+) Change all index of attributes to zero (0), instead of one(1)

Test
+) On Curie
+) Test new features passes but some data are still shifted

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