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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3762 - (show annotations)
Tue Jan 10 00:01:45 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: 8067 byte(s)
PDE assemblage with reduced order done.

1
2 /*******************************************************
3 *
4 * Copyright (c) 2003-2011 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 gradient of 'in' into 'out'. The actual function space to be
87 considered for the gradient is defined by 'in'. Both arguments have to
88 be defined on this domain.
89 */
90 RIPLEY_DLL_API
91 virtual void setToGradient(escript::Data& out, const escript::Data& in) const;
92
93 /**
94 \brief
95 copies the integrals of the function defined by arg into integrals.
96 arg has to be defined on this domain.
97 */
98 RIPLEY_DLL_API
99 virtual void setToIntegrals(std::vector<double>& integrals, const escript::Data& arg) const;
100
101 /**
102 \brief
103 copies the surface normals at data points into out. The actual function
104 space to be considered is defined by out. out has to be defined on this
105 domain.
106 */
107 RIPLEY_DLL_API
108 virtual void setToNormal(escript::Data& out) const;
109
110 /**
111 \brief
112 copies the size of samples into out. The actual function space to be
113 considered is defined by out. out has to be defined on this domain.
114 */
115 RIPLEY_DLL_API
116 virtual void setToSize(escript::Data& out) const;
117
118 /**
119 \brief
120 returns the number of data points summed across all MPI processes
121 */
122 RIPLEY_DLL_API
123 virtual int getNumDataPointsGlobal() const { return (m_gNE0+1)*(m_gNE1+1); }
124
125 /**
126 \brief
127 writes information about the mesh to standard output
128 \param full whether to print additional data
129 */
130 RIPLEY_DLL_API
131 virtual void Print_Mesh_Info(const bool full=false) const;
132
133 /**
134 \brief
135 returns the number of nodes per MPI rank in each dimension
136 */
137 RIPLEY_DLL_API
138 virtual IndexVector getNumNodesPerDim() const;
139
140 /**
141 \brief
142 returns the number of elements per MPI rank in each dimension
143 */
144 RIPLEY_DLL_API
145 virtual IndexVector getNumElementsPerDim() const;
146
147 /**
148 \brief
149 returns the number of face elements in the order
150 (left,right,bottom,top,[front,back]) on current MPI rank
151 */
152 RIPLEY_DLL_API
153 virtual IndexVector getNumFacesPerBoundary() const;
154
155 /**
156 \brief
157 returns the node distribution vector
158 */
159 RIPLEY_DLL_API
160 virtual IndexVector getNodeDistribution() const { return m_nodeDistribution; }
161
162 /**
163 \brief
164 returns the first coordinate value and the node spacing along given
165 dimension as a pair
166 */
167 RIPLEY_DLL_API
168 virtual std::pair<double,double> getFirstCoordAndSpacing(dim_t dim) const;
169
170 protected:
171 virtual dim_t getNumNodes() const { return m_N0*m_N1; }
172 virtual dim_t getNumElements() const { return m_NE0*m_NE1; }
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 assemblePDESingle(Paso_SystemMatrix* mat, escript::Data& rhs,
178 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,
181 const escript::Data& d, const escript::Data& y) const;
182 virtual void assemblePDESingleReduced(Paso_SystemMatrix* mat,
183 escript::Data& rhs, const escript::Data& A, const escript::Data& B,
184 const escript::Data& C, const escript::Data& D,
185 const escript::Data& X, const escript::Data& Y,
186 const escript::Data& d, const escript::Data& y) const;
187 virtual void assemblePDESystem(Paso_SystemMatrix* mat, escript::Data& rhs,
188 const escript::Data& A, const escript::Data& B,
189 const escript::Data& C, const escript::Data& D,
190 const escript::Data& X, const escript::Data& Y,
191 const escript::Data& d, const escript::Data& y) const;
192 virtual void assemblePDESystemReduced(Paso_SystemMatrix* mat,
193 escript::Data& rhs, const escript::Data& A, const escript::Data& B,
194 const escript::Data& C, const escript::Data& D,
195 const escript::Data& X, const escript::Data& Y,
196 const escript::Data& d, const escript::Data& y) const;
197
198 virtual Paso_SystemMatrixPattern* getPattern(bool reducedRowOrder, bool reducedColOrder) const;
199 virtual void interpolateNodesOnElements(escript::Data& out,
200 escript::Data& in, bool reduced) const;
201 virtual void interpolateNodesOnFaces(escript::Data& out, escript::Data& in,
202 bool reduced) const;
203 virtual void nodesToDOF(escript::Data& out, escript::Data& in) const;
204 virtual void dofToNodes(escript::Data& out, escript::Data& in) const;
205
206 private:
207 void populateSampleIds();
208 void createPattern();
209
210 /// total number of elements in each dimension
211 dim_t m_gNE0, m_gNE1;
212
213 /// side lengths of domain
214 double m_l0, m_l1;
215
216 /// number of spatial subdivisions
217 int m_NX, m_NY;
218
219 /// number of elements for this rank in each dimension
220 dim_t m_NE0, m_NE1;
221
222 /// number of nodes for this rank in each dimension
223 dim_t m_N0, m_N1;
224
225 /// first node on this rank is at (offset0,offset1) in global mesh
226 dim_t m_offset0, m_offset1;
227
228 /// faceOffset[i]=-1 if face i is not an external face, otherwise it is
229 /// the index of that face (where i: 0=left, 1=right, 2=bottom, 3=top)
230 IndexVector m_faceOffset;
231
232 /// vector of sample reference identifiers
233 IndexVector m_dofId;
234 IndexVector m_nodeId;
235 IndexVector m_elementId;
236 IndexVector m_faceId;
237
238 // vector with first node id on each rank
239 IndexVector m_nodeDistribution;
240
241 // vector that maps each node to a DOF index (used for the coupler)
242 IndexVector m_dofMap;
243
244 // Paso connector used by the system matrix and to interpolate DOF to
245 // nodes
246 Paso_Connector* m_connector;
247
248 // the Paso System Matrix pattern
249 Paso_SystemMatrixPattern* m_pattern;
250 };
251
252 } // end of namespace ripley
253
254 #endif // __RIPLEY_RECTANGLE_H__
255

  ViewVC Help
Powered by ViewVC 1.1.26