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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4340 - (hide annotations)
Fri Mar 22 04:38:36 2013 UTC (6 years, 5 months ago) by caltinay
File MIME type: text/plain
File size: 10803 byte(s)
added ripley method that returns grid parameters as python tuple.

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     std::string filename, int byteOrder) const;
85    
86     /**
87 caltinay 3691 \brief
88     returns the array of reference numbers for a function space type
89     \param fsType The function space type
90     */
91     const int* borrowSampleReferenceIDs(int fsType) const;
92    
93     /**
94     \brief
95     returns true if this rank owns the sample id.
96     */
97     virtual bool ownSample(int fs_code, index_t id) const;
98    
99     /**
100     \brief
101 caltinay 3722 copies the surface normals at data points into out. The actual function
102     space to be considered is defined by out. out has to be defined on this
103     domain.
104     */
105     virtual void setToNormal(escript::Data& out) const;
106    
107     /**
108     \brief
109 caltinay 3760 copies the size of samples into out. The actual function space to be
110     considered is defined by out. out has to be defined on this domain.
111     */
112     virtual void setToSize(escript::Data& out) const;
113    
114     /**
115     \brief
116 caltinay 3691 returns the number of data points summed across all MPI processes
117     */
118 caltinay 4334 virtual int getNumDataPointsGlobal() const;
119 caltinay 3691
120     /**
121     \brief
122     writes information about the mesh to standard output
123     \param full whether to print additional data
124     */
125     virtual void Print_Mesh_Info(const bool full=false) const;
126    
127 caltinay 3697 /**
128     \brief
129     returns the number of nodes per MPI rank in each dimension
130     */
131 caltinay 4334 virtual const int* getNumNodesPerDim() const { return m_NN; }
132 caltinay 3697
133     /**
134     \brief
135     returns the number of elements per MPI rank in each dimension
136     */
137 caltinay 4334 virtual const int* getNumElementsPerDim() const { return m_NE; }
138 caltinay 3697
139     /**
140     \brief
141     returns the number of face elements in the order
142 caltinay 4334 (left,right,bottom,top) on current MPI rank
143 caltinay 3697 */
144 caltinay 4334 virtual const int* getNumFacesPerBoundary() const { return m_faceCount; }
145 caltinay 3697
146     /**
147     \brief
148     returns the node distribution vector
149     */
150     virtual IndexVector getNodeDistribution() const { return m_nodeDistribution; }
151    
152     /**
153     \brief
154 caltinay 3766 returns the number of spatial subdivisions in each dimension
155     */
156 caltinay 4334 virtual const int* getNumSubdivisionsPerDim() const { return m_NX; }
157 caltinay 3766
158     /**
159     \brief
160 caltinay 4334 returns the index'th coordinate value in given dimension for this rank
161 caltinay 3697 */
162 caltinay 4334 virtual double getLocalCoordinate(int index, int dim) const;
163 caltinay 3697
164 caltinay 4340 /**
165     \brief
166     returns the tuple (origin, spacing, number_of_elements)
167     */
168     virtual boost::python::tuple getGridParameters() const;
169    
170 caltinay 3691 protected:
171 caltinay 4334 virtual dim_t getNumNodes() const;
172     virtual dim_t getNumElements() const;
173 caltinay 3756 virtual dim_t getNumFaceElements() const;
174 caltinay 3750 virtual dim_t getNumDOF() const;
175 caltinay 3756 virtual dim_t insertNeighbourNodes(IndexVector& index, index_t node) const;
176 caltinay 3691 virtual void assembleCoordinates(escript::Data& arg) const;
177 caltinay 3764 virtual void assembleGradient(escript::Data& out, escript::Data& in) const;
178 caltinay 4340 virtual void assembleIntegrate(DoubleVector& integrals, escript::Data& arg) const;
179 caltinay 3748 virtual void assemblePDESingle(Paso_SystemMatrix* mat, escript::Data& rhs,
180     const escript::Data& A, const escript::Data& B,
181     const escript::Data& C, const escript::Data& D,
182 caltinay 3769 const escript::Data& X, const escript::Data& Y) const;
183     virtual void assemblePDEBoundarySingle(Paso_SystemMatrix* mat,
184 caltinay 3776 escript::Data& rhs, const escript::Data& d,
185     const escript::Data& y) const;
186 caltinay 3762 virtual void assemblePDESingleReduced(Paso_SystemMatrix* mat,
187     escript::Data& rhs, const escript::Data& A, const escript::Data& B,
188     const escript::Data& C, const escript::Data& D,
189 caltinay 3769 const escript::Data& X, const escript::Data& Y) const;
190     virtual void assemblePDEBoundarySingleReduced(Paso_SystemMatrix* mat,
191 caltinay 3776 escript::Data& rhs, const escript::Data& d,
192     const escript::Data& y) const;
193 caltinay 3760 virtual void assemblePDESystem(Paso_SystemMatrix* mat, escript::Data& rhs,
194     const escript::Data& A, const escript::Data& B,
195     const escript::Data& C, const escript::Data& D,
196 caltinay 3769 const escript::Data& X, const escript::Data& Y) const;
197     virtual void assemblePDEBoundarySystem(Paso_SystemMatrix* mat,
198 caltinay 3776 escript::Data& rhs, const escript::Data& d,
199     const escript::Data& y) const;
200 caltinay 3762 virtual void assemblePDESystemReduced(Paso_SystemMatrix* mat,
201     escript::Data& rhs, const escript::Data& A, const escript::Data& B,
202     const escript::Data& C, const escript::Data& D,
203 caltinay 3769 const escript::Data& X, const escript::Data& Y) const;
204     virtual void assemblePDEBoundarySystemReduced(Paso_SystemMatrix* mat,
205 caltinay 3776 escript::Data& rhs, const escript::Data& d,
206     const escript::Data& y) const;
207 caltinay 3691 virtual Paso_SystemMatrixPattern* getPattern(bool reducedRowOrder, bool reducedColOrder) const;
208 caltinay 3711 virtual void interpolateNodesOnElements(escript::Data& out,
209     escript::Data& in, bool reduced) const;
210     virtual void interpolateNodesOnFaces(escript::Data& out, escript::Data& in,
211     bool reduced) const;
212 caltinay 3750 virtual void nodesToDOF(escript::Data& out, escript::Data& in) const;
213 caltinay 3755 virtual void dofToNodes(escript::Data& out, escript::Data& in) const;
214 caltinay 3691
215     private:
216     void populateSampleIds();
217 caltinay 3756 void createPattern();
218 caltinay 3776 void addToMatrixAndRHS(Paso_SystemMatrix* S, escript::Data& F,
219 caltinay 4340 const DoubleVector& EM_S, const DoubleVector& EM_F,
220 caltinay 3776 bool addS, bool addF, index_t firstNode, dim_t nEq=1, dim_t nComp=1) const;
221 caltinay 3691
222     /// total number of elements in each dimension
223 caltinay 4334 dim_t m_gNE[2];
224 caltinay 3691
225 caltinay 4334 /// origin of domain
226     double m_origin[2];
227 caltinay 3781
228 caltinay 3691 /// side lengths of domain
229 caltinay 4334 double m_length[2];
230 caltinay 3691
231 caltinay 4334 /// grid spacings / cell sizes of domain
232     double m_dx[2];
233    
234 caltinay 3691 /// number of spatial subdivisions
235 caltinay 4334 int m_NX[2];
236 caltinay 3691
237 caltinay 3764 /// number of elements for this rank in each dimension including shared
238 caltinay 4334 dim_t m_NE[2];
239 caltinay 3691
240 caltinay 3764 /// number of own elements for this rank in each dimension
241 caltinay 4334 dim_t m_ownNE[2];
242 caltinay 3764
243 caltinay 3691 /// number of nodes for this rank in each dimension
244 caltinay 4334 dim_t m_NN[2];
245 caltinay 3691
246     /// first node on this rank is at (offset0,offset1) in global mesh
247 caltinay 4334 dim_t m_offset[2];
248 caltinay 3691
249 caltinay 4334 /// number of face elements per edge (left, right, bottom, top)
250     int m_faceCount[4];
251    
252 caltinay 3704 /// faceOffset[i]=-1 if face i is not an external face, otherwise it is
253     /// the index of that face (where i: 0=left, 1=right, 2=bottom, 3=top)
254     IndexVector m_faceOffset;
255    
256 caltinay 3691 /// vector of sample reference identifiers
257 caltinay 3750 IndexVector m_dofId;
258 caltinay 3691 IndexVector m_nodeId;
259     IndexVector m_elementId;
260     IndexVector m_faceId;
261 caltinay 3697
262     // vector with first node id on each rank
263     IndexVector m_nodeDistribution;
264 caltinay 3752
265 caltinay 3756 // vector that maps each node to a DOF index (used for the coupler)
266     IndexVector m_dofMap;
267    
268     // Paso connector used by the system matrix and to interpolate DOF to
269     // nodes
270     Paso_Connector* m_connector;
271    
272     // the Paso System Matrix pattern
273     Paso_SystemMatrixPattern* m_pattern;
274 caltinay 3691 };
275    
276 caltinay 4334 ////////////////////////////// inline methods ////////////////////////////////
277    
278     inline int Rectangle::getNumDataPointsGlobal() const
279     {
280     return (m_gNE[0]+1)*(m_gNE[1]+1);
281     }
282    
283     inline double Rectangle::getLocalCoordinate(int index, int dim) const
284     {
285 caltinay 4340 EsysAssert((dim>=0 && dim<2), "'dim' out of bounds");
286 caltinay 4334 EsysAssert((index>=0 && index<m_NN[dim]), "'index' out of bounds");
287     return m_origin[dim]+m_dx[dim]*(m_offset[dim]+index);
288     }
289    
290 caltinay 4340 inline boost::python::tuple Rectangle::getGridParameters() const
291     {
292     return boost::python::make_tuple(
293     boost::python::make_tuple(m_origin[0], m_origin[1]),
294     boost::python::make_tuple(m_dx[0], m_dx[1]),
295     boost::python::make_tuple(m_gNE[0], m_gNE[1]));
296     }
297    
298 caltinay 4334 inline Paso_SystemMatrixPattern* Rectangle::getPattern(bool reducedRowOrder,
299     bool reducedColOrder) const
300     {
301     // TODO: reduced
302     return m_pattern;
303     }
304    
305    
306     //protected
307     inline dim_t Rectangle::getNumDOF() const
308     {
309     return (m_gNE[0]+1)/m_NX[0]*(m_gNE[1]+1)/m_NX[1];
310     }
311    
312     //protected
313     inline dim_t Rectangle::getNumNodes() const
314     {
315     return m_NN[0]*m_NN[1];
316     }
317    
318     //protected
319     inline dim_t Rectangle::getNumElements() const
320     {
321     return m_NE[0]*m_NE[1];
322     }
323    
324     //protected
325     inline dim_t Rectangle::getNumFaceElements() const
326     {
327     return m_faceCount[0] + m_faceCount[1] + m_faceCount[2] + m_faceCount[3];
328     }
329    
330    
331 caltinay 3691 } // end of namespace ripley
332    
333     #endif // __RIPLEY_RECTANGLE_H__
334    

  ViewVC Help
Powered by ViewVC 1.1.26