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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4340 - (show 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
2 /*****************************************************************************
3 *
4 * Copyright (c) 2003-2013 by University of Queensland
5 * http://www.uq.edu.au
6 *
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 * Development until 2012 by Earth Systems Science Computational Center (ESSCC)
12 * Development since 2012 by School of Earth Sciences
13 *
14 *****************************************************************************/
15
16 #ifndef __RIPLEY_RECTANGLE_H__
17 #define __RIPLEY_RECTANGLE_H__
18
19 #include <ripley/RipleyDomain.h>
20
21 struct Paso_Connector;
22
23 namespace ripley {
24
25 /**
26 \brief
27 Rectangle is the 2-dimensional implementation of a RipleyDomain.
28 */
29 class RIPLEY_DLL_API Rectangle: public RipleyDomain
30 {
31 public:
32
33 /**
34 \brief creates a rectangular mesh with n0 x n1 elements over the
35 rectangle [x0,x1] x [y0,y1].
36 \param n0,n1 number of elements in each dimension
37 \param x0,y0,x1,y1 coordinates of bottom-left and top-right corners
38 \param d0,d1 number of subdivisions in each dimension
39 */
40 Rectangle(int n0, int n1, double x0, double y0, double x1, double y1,
41 int d0=-1, int d1=-1);
42
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 */
69 virtual void readBinaryGrid(escript::Data& out, std::string filename,
70 const std::vector<int>& first,
71 const std::vector<int>& numValues,
72 const std::vector<int>& multiplier) const;
73
74 /**
75 */
76 virtual void readNcGrid(escript::Data& out, std::string filename,
77 std::string varname, const std::vector<int>& first,
78 const std::vector<int>& numValues,
79 const std::vector<int>& multiplier) const;
80
81 /**
82 */
83 virtual void writeBinaryGrid(const escript::Data& in,
84 std::string filename, int byteOrder) const;
85
86 /**
87 \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 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 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 returns the number of data points summed across all MPI processes
117 */
118 virtual int getNumDataPointsGlobal() const;
119
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 /**
128 \brief
129 returns the number of nodes per MPI rank in each dimension
130 */
131 virtual const int* getNumNodesPerDim() const { return m_NN; }
132
133 /**
134 \brief
135 returns the number of elements per MPI rank in each dimension
136 */
137 virtual const int* getNumElementsPerDim() const { return m_NE; }
138
139 /**
140 \brief
141 returns the number of face elements in the order
142 (left,right,bottom,top) on current MPI rank
143 */
144 virtual const int* getNumFacesPerBoundary() const { return m_faceCount; }
145
146 /**
147 \brief
148 returns the node distribution vector
149 */
150 virtual IndexVector getNodeDistribution() const { return m_nodeDistribution; }
151
152 /**
153 \brief
154 returns the number of spatial subdivisions in each dimension
155 */
156 virtual const int* getNumSubdivisionsPerDim() const { return m_NX; }
157
158 /**
159 \brief
160 returns the index'th coordinate value in given dimension for this rank
161 */
162 virtual double getLocalCoordinate(int index, int dim) const;
163
164 /**
165 \brief
166 returns the tuple (origin, spacing, number_of_elements)
167 */
168 virtual boost::python::tuple getGridParameters() const;
169
170 protected:
171 virtual dim_t getNumNodes() const;
172 virtual dim_t getNumElements() const;
173 virtual dim_t getNumFaceElements() const;
174 virtual dim_t getNumDOF() const;
175 virtual dim_t insertNeighbourNodes(IndexVector& index, index_t node) const;
176 virtual void assembleCoordinates(escript::Data& arg) const;
177 virtual void assembleGradient(escript::Data& out, escript::Data& in) const;
178 virtual void assembleIntegrate(DoubleVector& integrals, escript::Data& arg) const;
179 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 const escript::Data& X, const escript::Data& Y) const;
183 virtual void assemblePDEBoundarySingle(Paso_SystemMatrix* mat,
184 escript::Data& rhs, const escript::Data& d,
185 const escript::Data& y) const;
186 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 const escript::Data& X, const escript::Data& Y) const;
190 virtual void assemblePDEBoundarySingleReduced(Paso_SystemMatrix* mat,
191 escript::Data& rhs, const escript::Data& d,
192 const escript::Data& y) const;
193 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 const escript::Data& X, const escript::Data& Y) const;
197 virtual void assemblePDEBoundarySystem(Paso_SystemMatrix* mat,
198 escript::Data& rhs, const escript::Data& d,
199 const escript::Data& y) const;
200 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 const escript::Data& X, const escript::Data& Y) const;
204 virtual void assemblePDEBoundarySystemReduced(Paso_SystemMatrix* mat,
205 escript::Data& rhs, const escript::Data& d,
206 const escript::Data& y) const;
207 virtual Paso_SystemMatrixPattern* getPattern(bool reducedRowOrder, bool reducedColOrder) const;
208 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 virtual void nodesToDOF(escript::Data& out, escript::Data& in) const;
213 virtual void dofToNodes(escript::Data& out, escript::Data& in) const;
214
215 private:
216 void populateSampleIds();
217 void createPattern();
218 void addToMatrixAndRHS(Paso_SystemMatrix* S, escript::Data& F,
219 const DoubleVector& EM_S, const DoubleVector& EM_F,
220 bool addS, bool addF, index_t firstNode, dim_t nEq=1, dim_t nComp=1) const;
221
222 /// total number of elements in each dimension
223 dim_t m_gNE[2];
224
225 /// origin of domain
226 double m_origin[2];
227
228 /// side lengths of domain
229 double m_length[2];
230
231 /// grid spacings / cell sizes of domain
232 double m_dx[2];
233
234 /// number of spatial subdivisions
235 int m_NX[2];
236
237 /// number of elements for this rank in each dimension including shared
238 dim_t m_NE[2];
239
240 /// number of own elements for this rank in each dimension
241 dim_t m_ownNE[2];
242
243 /// number of nodes for this rank in each dimension
244 dim_t m_NN[2];
245
246 /// first node on this rank is at (offset0,offset1) in global mesh
247 dim_t m_offset[2];
248
249 /// number of face elements per edge (left, right, bottom, top)
250 int m_faceCount[4];
251
252 /// 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 /// vector of sample reference identifiers
257 IndexVector m_dofId;
258 IndexVector m_nodeId;
259 IndexVector m_elementId;
260 IndexVector m_faceId;
261
262 // vector with first node id on each rank
263 IndexVector m_nodeDistribution;
264
265 // 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 };
275
276 ////////////////////////////// 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 EsysAssert((dim>=0 && dim<2), "'dim' out of bounds");
286 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 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 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 } // end of namespace ripley
332
333 #endif // __RIPLEY_RECTANGLE_H__
334

  ViewVC Help
Powered by ViewVC 1.1.26