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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3764 - (show annotations)
Tue Jan 10 06:31:15 2012 UTC (7 years, 8 months ago) by caltinay
Original Path: branches/ripleygmg_from_3668/ripley/src/Brick.h
File MIME type: text/plain
File size: 7883 byte(s)
Fixed integration now that elements overlap + code cleanup.

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 [0,l0] x [0,l1] x [0,l2].
34 \param n0,n1,n2 number of elements in each dimension
35 \param l0,l1,l2 length of each side of 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 l0, double l1, double l2, int d0,
40 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 first coordinate value and the node spacing along given
149 dimension as a pair
150 */
151 RIPLEY_DLL_API
152 virtual std::pair<double,double> getFirstCoordAndSpacing(dim_t dim) const;
153
154 protected:
155 virtual dim_t getNumNodes() const { return m_N0*m_N1*m_N2; }
156 virtual dim_t getNumElements() const { return m_NE0*m_NE1*m_NE2; }
157 virtual dim_t getNumFaceElements() const;
158 virtual dim_t getNumDOF() const;
159 virtual dim_t insertNeighbourNodes(IndexVector& index, index_t node) const;
160 virtual void assembleCoordinates(escript::Data& arg) const;
161 virtual void assembleGradient(escript::Data& out, escript::Data& in) const;
162 virtual void assembleIntegrate(std::vector<double>& integrals, escript::Data& arg) const;
163 virtual void assemblePDESingle(Paso_SystemMatrix* mat, escript::Data& rhs,
164 const escript::Data& A, const escript::Data& B,
165 const escript::Data& C, const escript::Data& D,
166 const escript::Data& X, const escript::Data& Y,
167 const escript::Data& d, const escript::Data& y) const;
168 virtual void assemblePDESingleReduced(Paso_SystemMatrix* mat,
169 escript::Data& rhs, const escript::Data& A, const escript::Data& B,
170 const escript::Data& C, const escript::Data& D,
171 const escript::Data& X, const escript::Data& Y,
172 const escript::Data& d, const escript::Data& y) const;
173 virtual void assemblePDESystem(Paso_SystemMatrix* mat, escript::Data& rhs,
174 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,
177 const escript::Data& d, const escript::Data& y) const;
178 virtual void assemblePDESystemReduced(Paso_SystemMatrix* mat,
179 escript::Data& rhs, const escript::Data& A, const escript::Data& B,
180 const escript::Data& C, const escript::Data& D,
181 const escript::Data& X, const escript::Data& Y,
182 const escript::Data& d, const escript::Data& y) const;
183 virtual Paso_SystemMatrixPattern* getPattern(bool reducedRowOrder, bool reducedColOrder) const;
184 virtual void interpolateNodesOnElements(escript::Data& out,
185 escript::Data& in, bool reduced) const;
186 virtual void interpolateNodesOnFaces(escript::Data& out, escript::Data& in,
187 bool reduced) const;
188 virtual void nodesToDOF(escript::Data& out, escript::Data& in) const;
189 virtual void dofToNodes(escript::Data& out, escript::Data& in) const;
190
191 private:
192 void populateSampleIds();
193 void createPattern();
194
195 /// total number of elements in each dimension
196 dim_t m_gNE0, m_gNE1, m_gNE2;
197
198 /// side lengths of domain
199 double m_l0, m_l1, m_l2;
200
201 /// number of spatial subdivisions
202 int m_NX, m_NY, m_NZ;
203
204 /// number of elements for this rank in each dimension including shared
205 dim_t m_NE0, m_NE1, m_NE2;
206
207 /// number of own elements for this rank in each dimension
208 dim_t m_ownNE0, m_ownNE1, m_ownNE2;
209
210 /// number of nodes for this rank in each dimension
211 dim_t m_N0, m_N1, m_N2;
212
213 /// first node on this rank is at (offset0,offset1,offset2) in global mesh
214 dim_t m_offset0, m_offset1, m_offset2;
215
216 /// faceOffset[i]=-1 if face i is not an external face, otherwise it is
217 /// the index of that face (where i: 0=left, 1=right, 2=bottom, 3=top,
218 /// 4=front, 5=back)
219 IndexVector m_faceOffset;
220
221 /// vector of sample reference identifiers
222 IndexVector m_dofId;
223 IndexVector m_nodeId;
224 IndexVector m_elementId;
225 IndexVector m_faceId;
226
227 // vector with first node id on each rank
228 IndexVector m_nodeDistribution;
229
230 // vector that maps each node to a DOF index (used for the coupler)
231 IndexVector m_dofMap;
232
233 // Paso connector used by the system matrix and to interpolate DOF to
234 // nodes
235 Paso_Connector* m_connector;
236
237 // the Paso System Matrix pattern
238 Paso_SystemMatrixPattern* m_pattern;
239 };
240
241 } // end of namespace ripley
242
243 #endif // __RIPLEY_BRICK_H__
244

  ViewVC Help
Powered by ViewVC 1.1.26