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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.26