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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3792 - (show annotations)
Wed Feb 1 06:16:25 2012 UTC (7 years, 7 months ago) by caltinay
File MIME type: text/plain
File size: 8703 byte(s)
Merged ripley rectangular domain into trunk.

1
2 /*******************************************************
3 *
4 * Copyright (c) 2003-2012 by University of Queensland
5 * Earth Systems Science Computational Center (ESSCC)
6 * http://www.uq.edu.au/esscc
7 *
8 * Primary Business: Queensland, Australia
9 * Licensed under the Open Software License version 3.0
10 * http://www.opensource.org/licenses/osl-3.0.php
11 *
12 *******************************************************/
13
14 #ifndef __RIPLEY_RECTANGLE_H__
15 #define __RIPLEY_RECTANGLE_H__
16
17 #include <ripley/RipleyDomain.h>
18
19 struct Paso_Connector;
20
21 namespace ripley {
22
23 /**
24 \brief
25 Rectangle is the 2-dimensional implementation of a RipleyDomain.
26 */
27 class Rectangle: public RipleyDomain
28 {
29 public:
30
31 /**
32 \brief creates a rectangular mesh with n0 x n1 elements over the
33 rectangle [x0,x1] x [y0,y1].
34 \param n0,n1 number of elements in each dimension
35 \param x0,y0,x1,y1 coordinates of bottom-left and top-right corners
36 \param d0,d1 number of subdivisions in each dimension
37 */
38 RIPLEY_DLL_API
39 Rectangle(int n0, int n1, double x0, double y0, double x1, double y1, int d0, int d1);
40
41 /**
42 \brief
43 Destructor.
44 */
45 RIPLEY_DLL_API
46 ~Rectangle();
47
48 /**
49 \brief
50 returns a description for this domain
51 */
52 RIPLEY_DLL_API
53 virtual std::string getDescription() const;
54
55 /**
56 \brief equality operator
57 */
58 RIPLEY_DLL_API
59 virtual bool operator==(const escript::AbstractDomain& other) const;
60
61 /**
62 \brief
63 dumps the mesh to a file with the given name
64 \param filename The name of the output file
65 */
66 RIPLEY_DLL_API
67 void dump(const std::string& filename) const;
68
69 /**
70 \brief
71 returns the array of reference numbers for a function space type
72 \param fsType The function space type
73 */
74 RIPLEY_DLL_API
75 const int* borrowSampleReferenceIDs(int fsType) const;
76
77 /**
78 \brief
79 returns true if this rank owns the sample id.
80 */
81 RIPLEY_DLL_API
82 virtual bool ownSample(int fs_code, index_t id) const;
83
84 /**
85 \brief
86 copies the surface normals at data points into out. The actual function
87 space to be considered is defined by out. out has to be defined on this
88 domain.
89 */
90 RIPLEY_DLL_API
91 virtual void setToNormal(escript::Data& out) const;
92
93 /**
94 \brief
95 copies the size of samples into out. The actual function space to be
96 considered is defined by out. out has to be defined on this domain.
97 */
98 RIPLEY_DLL_API
99 virtual void setToSize(escript::Data& out) const;
100
101 /**
102 \brief
103 returns the number of data points summed across all MPI processes
104 */
105 RIPLEY_DLL_API
106 virtual int getNumDataPointsGlobal() const { return (m_gNE0+1)*(m_gNE1+1); }
107
108 /**
109 \brief
110 writes information about the mesh to standard output
111 \param full whether to print additional data
112 */
113 RIPLEY_DLL_API
114 virtual void Print_Mesh_Info(const bool full=false) const;
115
116 /**
117 \brief
118 returns the number of nodes per MPI rank in each dimension
119 */
120 RIPLEY_DLL_API
121 virtual IndexVector getNumNodesPerDim() const;
122
123 /**
124 \brief
125 returns the number of elements per MPI rank in each dimension
126 */
127 RIPLEY_DLL_API
128 virtual IndexVector getNumElementsPerDim() const;
129
130 /**
131 \brief
132 returns the number of face elements in the order
133 (left,right,bottom,top,[front,back]) on current MPI rank
134 */
135 RIPLEY_DLL_API
136 virtual IndexVector getNumFacesPerBoundary() const;
137
138 /**
139 \brief
140 returns the node distribution vector
141 */
142 RIPLEY_DLL_API
143 virtual IndexVector getNodeDistribution() const { return m_nodeDistribution; }
144
145 /**
146 \brief
147 returns the number of spatial subdivisions in each dimension
148 */
149 RIPLEY_DLL_API
150 virtual IndexVector getNumSubdivisionsPerDim() const;
151
152 /**
153 \brief
154 returns the first coordinate value and the node spacing along given
155 dimension as a pair
156 */
157 RIPLEY_DLL_API
158 virtual std::pair<double,double> getFirstCoordAndSpacing(dim_t dim) const;
159
160 protected:
161 virtual dim_t getNumNodes() const { return m_N0*m_N1; }
162 virtual dim_t getNumElements() const { return m_NE0*m_NE1; }
163 virtual dim_t getNumFaceElements() const;
164 virtual dim_t getNumDOF() const;
165 virtual dim_t insertNeighbourNodes(IndexVector& index, index_t node) const;
166 virtual void assembleCoordinates(escript::Data& arg) const;
167 virtual void assembleGradient(escript::Data& out, escript::Data& in) const;
168 virtual void assembleIntegrate(std::vector<double>& integrals, escript::Data& arg) const;
169 virtual void assemblePDESingle(Paso_SystemMatrix* mat, escript::Data& rhs,
170 const escript::Data& A, const escript::Data& B,
171 const escript::Data& C, const escript::Data& D,
172 const escript::Data& X, const escript::Data& Y) const;
173 virtual void assemblePDEBoundarySingle(Paso_SystemMatrix* mat,
174 escript::Data& rhs, const escript::Data& d,
175 const escript::Data& y) const;
176 virtual void assemblePDESingleReduced(Paso_SystemMatrix* mat,
177 escript::Data& rhs, const escript::Data& A, const escript::Data& B,
178 const escript::Data& C, const escript::Data& D,
179 const escript::Data& X, const escript::Data& Y) const;
180 virtual void assemblePDEBoundarySingleReduced(Paso_SystemMatrix* mat,
181 escript::Data& rhs, const escript::Data& d,
182 const escript::Data& y) const;
183 virtual void assemblePDESystem(Paso_SystemMatrix* mat, escript::Data& rhs,
184 const escript::Data& A, const escript::Data& B,
185 const escript::Data& C, const escript::Data& D,
186 const escript::Data& X, const escript::Data& Y) const;
187 virtual void assemblePDEBoundarySystem(Paso_SystemMatrix* mat,
188 escript::Data& rhs, const escript::Data& d,
189 const escript::Data& y) const;
190 virtual void assemblePDESystemReduced(Paso_SystemMatrix* mat,
191 escript::Data& rhs, const escript::Data& A, const escript::Data& B,
192 const escript::Data& C, const escript::Data& D,
193 const escript::Data& X, const escript::Data& Y) const;
194 virtual void assemblePDEBoundarySystemReduced(Paso_SystemMatrix* mat,
195 escript::Data& rhs, const escript::Data& d,
196 const escript::Data& y) const;
197 virtual Paso_SystemMatrixPattern* getPattern(bool reducedRowOrder, bool reducedColOrder) const;
198 virtual void interpolateNodesOnElements(escript::Data& out,
199 escript::Data& in, bool reduced) const;
200 virtual void interpolateNodesOnFaces(escript::Data& out, escript::Data& in,
201 bool reduced) const;
202 virtual void nodesToDOF(escript::Data& out, escript::Data& in) const;
203 virtual void dofToNodes(escript::Data& out, escript::Data& in) const;
204
205 private:
206 void populateSampleIds();
207 void createPattern();
208 void addToMatrixAndRHS(Paso_SystemMatrix* S, escript::Data& F,
209 const std::vector<double>& EM_S, const std::vector<double>& EM_F,
210 bool addS, bool addF, index_t firstNode, dim_t nEq=1, dim_t nComp=1) const;
211
212 /// total number of elements in each dimension
213 dim_t m_gNE0, m_gNE1;
214
215 /// location of domain
216 double m_x0, m_y0;
217
218 /// side lengths of domain
219 double m_l0, m_l1;
220
221 /// number of spatial subdivisions
222 int m_NX, m_NY;
223
224 /// number of elements for this rank in each dimension including shared
225 dim_t m_NE0, m_NE1;
226
227 /// number of own elements for this rank in each dimension
228 dim_t m_ownNE0, m_ownNE1;
229
230 /// number of nodes for this rank in each dimension
231 dim_t m_N0, m_N1;
232
233 /// first node on this rank is at (offset0,offset1) in global mesh
234 dim_t m_offset0, m_offset1;
235
236 /// faceOffset[i]=-1 if face i is not an external face, otherwise it is
237 /// the index of that face (where i: 0=left, 1=right, 2=bottom, 3=top)
238 IndexVector m_faceOffset;
239
240 /// vector of sample reference identifiers
241 IndexVector m_dofId;
242 IndexVector m_nodeId;
243 IndexVector m_elementId;
244 IndexVector m_faceId;
245
246 // vector with first node id on each rank
247 IndexVector m_nodeDistribution;
248
249 // vector that maps each node to a DOF index (used for the coupler)
250 IndexVector m_dofMap;
251
252 // Paso connector used by the system matrix and to interpolate DOF to
253 // nodes
254 Paso_Connector* m_connector;
255
256 // the Paso System Matrix pattern
257 Paso_SystemMatrixPattern* m_pattern;
258 };
259
260 } // end of namespace ripley
261
262 #endif // __RIPLEY_RECTANGLE_H__
263

  ViewVC Help
Powered by ViewVC 1.1.26