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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3773 - (show annotations)
Wed Jan 18 04:27:53 2012 UTC (7 years, 8 months ago) by caltinay
Original Path: branches/ripleygmg_from_3668/ripley/src/Rectangle.h
File MIME type: text/plain
File size: 8807 byte(s)
Adjusted interface for boundary conditions.

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 [0,l0] x [0,l1].
34 \param n0,n1 number of elements in each dimension
35 \param l0,l1 length of each side of rectangle
36 \param d0,d1 number of subdivisions in each dimension
37 */
38 RIPLEY_DLL_API
39 Rectangle(int n0, int n1, double l0, double l1, 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& a, const escript::Data& b,
175 const escript::Data& c, const escript::Data& d,
176 const escript::Data& x, const escript::Data& y) const;
177 virtual void assemblePDESingleReduced(Paso_SystemMatrix* mat,
178 escript::Data& rhs, const escript::Data& A, const escript::Data& B,
179 const escript::Data& C, const escript::Data& D,
180 const escript::Data& X, const escript::Data& Y) const;
181 virtual void assemblePDEBoundarySingleReduced(Paso_SystemMatrix* mat,
182 escript::Data& rhs, const escript::Data& a, const escript::Data& b,
183 const escript::Data& c, const escript::Data& d,
184 const escript::Data& x, const escript::Data& y) const;
185 virtual void assemblePDESystem(Paso_SystemMatrix* mat, escript::Data& rhs,
186 const escript::Data& A, const escript::Data& B,
187 const escript::Data& C, const escript::Data& D,
188 const escript::Data& X, const escript::Data& Y) const;
189 virtual void assemblePDEBoundarySystem(Paso_SystemMatrix* mat,
190 escript::Data& rhs, const escript::Data& a, const escript::Data& b,
191 const escript::Data& c, const escript::Data& d,
192 const escript::Data& x, const escript::Data& y) const;
193 virtual void assemblePDESystemReduced(Paso_SystemMatrix* mat,
194 escript::Data& rhs, 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 assemblePDEBoundarySystemReduced(Paso_SystemMatrix* mat,
198 escript::Data& rhs, const escript::Data& a, const escript::Data& b,
199 const escript::Data& c, const escript::Data& d,
200 const escript::Data& x, const escript::Data& y) const;
201 virtual Paso_SystemMatrixPattern* getPattern(bool reducedRowOrder, bool reducedColOrder) const;
202 virtual void interpolateNodesOnElements(escript::Data& out,
203 escript::Data& in, bool reduced) const;
204 virtual void interpolateNodesOnFaces(escript::Data& out, escript::Data& in,
205 bool reduced) const;
206 virtual void nodesToDOF(escript::Data& out, escript::Data& in) const;
207 virtual void dofToNodes(escript::Data& out, escript::Data& in) const;
208
209 private:
210 void populateSampleIds();
211 void createPattern();
212
213 /// total number of elements in each dimension
214 dim_t m_gNE0, m_gNE1;
215
216 /// side lengths of domain
217 double m_l0, m_l1;
218
219 /// number of spatial subdivisions
220 int m_NX, m_NY;
221
222 /// number of elements for this rank in each dimension including shared
223 dim_t m_NE0, m_NE1;
224
225 /// number of own elements for this rank in each dimension
226 dim_t m_ownNE0, m_ownNE1;
227
228 /// number of nodes for this rank in each dimension
229 dim_t m_N0, m_N1;
230
231 /// first node on this rank is at (offset0,offset1) in global mesh
232 dim_t m_offset0, m_offset1;
233
234 /// faceOffset[i]=-1 if face i is not an external face, otherwise it is
235 /// the index of that face (where i: 0=left, 1=right, 2=bottom, 3=top)
236 IndexVector m_faceOffset;
237
238 /// vector of sample reference identifiers
239 IndexVector m_dofId;
240 IndexVector m_nodeId;
241 IndexVector m_elementId;
242 IndexVector m_faceId;
243
244 // vector with first node id on each rank
245 IndexVector m_nodeDistribution;
246
247 // vector that maps each node to a DOF index (used for the coupler)
248 IndexVector m_dofMap;
249
250 // Paso connector used by the system matrix and to interpolate DOF to
251 // nodes
252 Paso_Connector* m_connector;
253
254 // the Paso System Matrix pattern
255 Paso_SystemMatrixPattern* m_pattern;
256 };
257
258 } // end of namespace ripley
259
260 #endif // __RIPLEY_RECTANGLE_H__
261

  ViewVC Help
Powered by ViewVC 1.1.26