/[escript]/trunk/ripley/src/Rectangle.h
ViewVC logotype

Annotation of /trunk/ripley/src/Rectangle.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4357 - (hide annotations)
Thu Apr 11 06:07:14 2013 UTC (6 years, 5 months ago) by caltinay
File MIME type: text/plain
File size: 11017 byte(s)
templated writeBinaryGrid and a bit of cleanup.

1 caltinay 3691
2 jfenwick 3981 /*****************************************************************************
3 caltinay 3691 *
4 jfenwick 4154 * Copyright (c) 2003-2013 by University of Queensland
5 jfenwick 3981 * http://www.uq.edu.au
6 caltinay 3691 *
7     * Primary Business: Queensland, Australia
8     * Licensed under the Open Software License version 3.0
9     * http://www.opensource.org/licenses/osl-3.0.php
10     *
11 jfenwick 3981 * Development until 2012 by Earth Systems Science Computational Center (ESSCC)
12     * Development since 2012 by School of Earth Sciences
13     *
14     *****************************************************************************/
15 caltinay 3691
16     #ifndef __RIPLEY_RECTANGLE_H__
17     #define __RIPLEY_RECTANGLE_H__
18    
19     #include <ripley/RipleyDomain.h>
20    
21 caltinay 3756 struct Paso_Connector;
22    
23 caltinay 3691 namespace ripley {
24    
25     /**
26     \brief
27     Rectangle is the 2-dimensional implementation of a RipleyDomain.
28     */
29 caltinay 3915 class RIPLEY_DLL_API Rectangle: public RipleyDomain
30 caltinay 3691 {
31     public:
32    
33     /**
34     \brief creates a rectangular mesh with n0 x n1 elements over the
35 caltinay 3781 rectangle [x0,x1] x [y0,y1].
36 caltinay 3691 \param n0,n1 number of elements in each dimension
37 caltinay 3781 \param x0,y0,x1,y1 coordinates of bottom-left and top-right corners
38 caltinay 3691 \param d0,d1 number of subdivisions in each dimension
39     */
40 caltinay 3943 Rectangle(int n0, int n1, double x0, double y0, double x1, double y1,
41     int d0=-1, int d1=-1);
42 caltinay 3691
43     /**
44     \brief
45     Destructor.
46     */
47     ~Rectangle();
48    
49     /**
50     \brief
51     returns a description for this domain
52     */
53     virtual std::string getDescription() const;
54    
55     /**
56     \brief equality operator
57     */
58     virtual bool operator==(const escript::AbstractDomain& other) const;
59    
60     /**
61     \brief
62     dumps the mesh to a file with the given name
63     \param filename The name of the output file
64     */
65     void dump(const std::string& filename) const;
66    
67     /**
68 caltinay 3971 */
69     virtual void readBinaryGrid(escript::Data& out, std::string filename,
70     const std::vector<int>& first,
71 caltinay 4277 const std::vector<int>& numValues,
72     const std::vector<int>& multiplier) const;
73 caltinay 3971
74     /**
75 caltinay 4013 */
76     virtual void readNcGrid(escript::Data& out, std::string filename,
77     std::string varname, const std::vector<int>& first,
78 caltinay 4277 const std::vector<int>& numValues,
79     const std::vector<int>& multiplier) const;
80 caltinay 4013
81     /**
82 caltinay 4334 */
83     virtual void writeBinaryGrid(const escript::Data& in,
84 caltinay 4357 std::string filename,
85     int byteOrder, int dataType) const;
86 caltinay 4334
87     /**
88 caltinay 3691 \brief
89     returns the array of reference numbers for a function space type
90     \param fsType The function space type
91     */
92     const int* borrowSampleReferenceIDs(int fsType) const;
93    
94     /**
95     \brief
96     returns true if this rank owns the sample id.
97     */
98     virtual bool ownSample(int fs_code, index_t id) const;
99    
100     /**
101     \brief
102 caltinay 3722 copies the surface normals at data points into out. The actual function
103     space to be considered is defined by out. out has to be defined on this
104     domain.
105     */
106     virtual void setToNormal(escript::Data& out) const;
107    
108     /**
109     \brief
110 caltinay 3760 copies the size of samples into out. The actual function space to be
111     considered is defined by out. out has to be defined on this domain.
112     */
113     virtual void setToSize(escript::Data& out) const;
114    
115     /**
116     \brief
117 caltinay 3691 returns the number of data points summed across all MPI processes
118     */
119 caltinay 4334 virtual int getNumDataPointsGlobal() const;
120 caltinay 3691
121     /**
122     \brief
123     writes information about the mesh to standard output
124     \param full whether to print additional data
125     */
126     virtual void Print_Mesh_Info(const bool full=false) const;
127    
128 caltinay 3697 /**
129     \brief
130     returns the number of nodes per MPI rank in each dimension
131     */
132 caltinay 4334 virtual const int* getNumNodesPerDim() const { return m_NN; }
133 caltinay 3697
134     /**
135     \brief
136     returns the number of elements per MPI rank in each dimension
137     */
138 caltinay 4334 virtual const int* getNumElementsPerDim() const { return m_NE; }
139 caltinay 3697
140     /**
141     \brief
142     returns the number of face elements in the order
143 caltinay 4334 (left,right,bottom,top) on current MPI rank
144 caltinay 3697 */
145 caltinay 4334 virtual const int* getNumFacesPerBoundary() const { return m_faceCount; }
146 caltinay 3697
147     /**
148     \brief
149     returns the node distribution vector
150     */
151     virtual IndexVector getNodeDistribution() const { return m_nodeDistribution; }
152    
153     /**
154     \brief
155 caltinay 3766 returns the number of spatial subdivisions in each dimension
156     */
157 caltinay 4334 virtual const int* getNumSubdivisionsPerDim() const { return m_NX; }
158 caltinay 3766
159     /**
160     \brief
161 caltinay 4334 returns the index'th coordinate value in given dimension for this rank
162 caltinay 3697 */
163 caltinay 4334 virtual double getLocalCoordinate(int index, int dim) const;
164 caltinay 3697
165 caltinay 4340 /**
166     \brief
167     returns the tuple (origin, spacing, number_of_elements)
168     */
169     virtual boost::python::tuple getGridParameters() const;
170    
171 caltinay 3691 protected:
172 caltinay 4334 virtual dim_t getNumNodes() const;
173     virtual dim_t getNumElements() const;
174 caltinay 3756 virtual dim_t getNumFaceElements() const;
175 caltinay 3750 virtual dim_t getNumDOF() const;
176 caltinay 3756 virtual dim_t insertNeighbourNodes(IndexVector& index, index_t node) const;
177 caltinay 3691 virtual void assembleCoordinates(escript::Data& arg) const;
178 caltinay 3764 virtual void assembleGradient(escript::Data& out, escript::Data& in) const;
179 caltinay 4340 virtual void assembleIntegrate(DoubleVector& integrals, escript::Data& arg) const;
180 caltinay 3748 virtual void assemblePDESingle(Paso_SystemMatrix* mat, escript::Data& rhs,
181     const escript::Data& A, const escript::Data& B,
182     const escript::Data& C, const escript::Data& D,
183 caltinay 3769 const escript::Data& X, const escript::Data& Y) const;
184     virtual void assemblePDEBoundarySingle(Paso_SystemMatrix* mat,
185 caltinay 3776 escript::Data& rhs, const escript::Data& d,
186     const escript::Data& y) const;
187 caltinay 3762 virtual void assemblePDESingleReduced(Paso_SystemMatrix* mat,
188     escript::Data& rhs, const escript::Data& A, const escript::Data& B,
189     const escript::Data& C, const escript::Data& D,
190 caltinay 3769 const escript::Data& X, const escript::Data& Y) const;
191     virtual void assemblePDEBoundarySingleReduced(Paso_SystemMatrix* mat,
192 caltinay 3776 escript::Data& rhs, const escript::Data& d,
193     const escript::Data& y) const;
194 caltinay 3760 virtual void assemblePDESystem(Paso_SystemMatrix* mat, escript::Data& rhs,
195     const escript::Data& A, const escript::Data& B,
196     const escript::Data& C, const escript::Data& D,
197 caltinay 3769 const escript::Data& X, const escript::Data& Y) const;
198     virtual void assemblePDEBoundarySystem(Paso_SystemMatrix* mat,
199 caltinay 3776 escript::Data& rhs, const escript::Data& d,
200     const escript::Data& y) const;
201 caltinay 3762 virtual void assemblePDESystemReduced(Paso_SystemMatrix* mat,
202     escript::Data& rhs, const escript::Data& A, const escript::Data& B,
203     const escript::Data& C, const escript::Data& D,
204 caltinay 3769 const escript::Data& X, const escript::Data& Y) const;
205     virtual void assemblePDEBoundarySystemReduced(Paso_SystemMatrix* mat,
206 caltinay 3776 escript::Data& rhs, const escript::Data& d,
207     const escript::Data& y) const;
208 caltinay 3691 virtual Paso_SystemMatrixPattern* getPattern(bool reducedRowOrder, bool reducedColOrder) const;
209 caltinay 3711 virtual void interpolateNodesOnElements(escript::Data& out,
210     escript::Data& in, bool reduced) const;
211     virtual void interpolateNodesOnFaces(escript::Data& out, escript::Data& in,
212     bool reduced) const;
213 caltinay 3750 virtual void nodesToDOF(escript::Data& out, escript::Data& in) const;
214 caltinay 3755 virtual void dofToNodes(escript::Data& out, escript::Data& in) const;
215 caltinay 3691
216     private:
217     void populateSampleIds();
218 caltinay 3756 void createPattern();
219 caltinay 3776 void addToMatrixAndRHS(Paso_SystemMatrix* S, escript::Data& F,
220 caltinay 4340 const DoubleVector& EM_S, const DoubleVector& EM_F,
221 caltinay 3776 bool addS, bool addF, index_t firstNode, dim_t nEq=1, dim_t nComp=1) const;
222 caltinay 4357 template<typename ValueType>
223     void writeBinaryGridImpl(const escript::Data& in,
224     const std::string& filename, int byteOrder) const;
225 caltinay 3691
226     /// total number of elements in each dimension
227 caltinay 4334 dim_t m_gNE[2];
228 caltinay 3691
229 caltinay 4334 /// origin of domain
230     double m_origin[2];
231 caltinay 3781
232 caltinay 3691 /// side lengths of domain
233 caltinay 4334 double m_length[2];
234 caltinay 3691
235 caltinay 4334 /// grid spacings / cell sizes of domain
236     double m_dx[2];
237    
238 caltinay 3691 /// number of spatial subdivisions
239 caltinay 4334 int m_NX[2];
240 caltinay 3691
241 caltinay 3764 /// number of elements for this rank in each dimension including shared
242 caltinay 4334 dim_t m_NE[2];
243 caltinay 3691
244 caltinay 3764 /// number of own elements for this rank in each dimension
245 caltinay 4334 dim_t m_ownNE[2];
246 caltinay 3764
247 caltinay 3691 /// number of nodes for this rank in each dimension
248 caltinay 4334 dim_t m_NN[2];
249 caltinay 3691
250     /// first node on this rank is at (offset0,offset1) in global mesh
251 caltinay 4334 dim_t m_offset[2];
252 caltinay 3691
253 caltinay 4334 /// number of face elements per edge (left, right, bottom, top)
254     int m_faceCount[4];
255    
256 caltinay 3704 /// faceOffset[i]=-1 if face i is not an external face, otherwise it is
257     /// the index of that face (where i: 0=left, 1=right, 2=bottom, 3=top)
258     IndexVector m_faceOffset;
259    
260 caltinay 3691 /// vector of sample reference identifiers
261 caltinay 3750 IndexVector m_dofId;
262 caltinay 3691 IndexVector m_nodeId;
263     IndexVector m_elementId;
264     IndexVector m_faceId;
265 caltinay 3697
266     // vector with first node id on each rank
267     IndexVector m_nodeDistribution;
268 caltinay 3752
269 caltinay 3756 // vector that maps each node to a DOF index (used for the coupler)
270     IndexVector m_dofMap;
271    
272     // Paso connector used by the system matrix and to interpolate DOF to
273     // nodes
274     Paso_Connector* m_connector;
275    
276     // the Paso System Matrix pattern
277     Paso_SystemMatrixPattern* m_pattern;
278 caltinay 3691 };
279    
280 caltinay 4334 ////////////////////////////// inline methods ////////////////////////////////
281    
282     inline int Rectangle::getNumDataPointsGlobal() const
283     {
284     return (m_gNE[0]+1)*(m_gNE[1]+1);
285     }
286    
287     inline double Rectangle::getLocalCoordinate(int index, int dim) const
288     {
289 caltinay 4340 EsysAssert((dim>=0 && dim<2), "'dim' out of bounds");
290 caltinay 4334 EsysAssert((index>=0 && index<m_NN[dim]), "'index' out of bounds");
291     return m_origin[dim]+m_dx[dim]*(m_offset[dim]+index);
292     }
293    
294 caltinay 4340 inline boost::python::tuple Rectangle::getGridParameters() const
295     {
296     return boost::python::make_tuple(
297     boost::python::make_tuple(m_origin[0], m_origin[1]),
298     boost::python::make_tuple(m_dx[0], m_dx[1]),
299     boost::python::make_tuple(m_gNE[0], m_gNE[1]));
300     }
301    
302 caltinay 4334 inline Paso_SystemMatrixPattern* Rectangle::getPattern(bool reducedRowOrder,
303     bool reducedColOrder) const
304     {
305     // TODO: reduced
306     return m_pattern;
307     }
308    
309    
310     //protected
311     inline dim_t Rectangle::getNumDOF() const
312     {
313     return (m_gNE[0]+1)/m_NX[0]*(m_gNE[1]+1)/m_NX[1];
314     }
315    
316     //protected
317     inline dim_t Rectangle::getNumNodes() const
318     {
319     return m_NN[0]*m_NN[1];
320     }
321    
322     //protected
323     inline dim_t Rectangle::getNumElements() const
324     {
325     return m_NE[0]*m_NE[1];
326     }
327    
328     //protected
329     inline dim_t Rectangle::getNumFaceElements() const
330     {
331     return m_faceCount[0] + m_faceCount[1] + m_faceCount[2] + m_faceCount[3];
332     }
333    
334    
335 caltinay 3691 } // end of namespace ripley
336    
337     #endif // __RIPLEY_RECTANGLE_H__
338    

  ViewVC Help
Powered by ViewVC 1.1.26