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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3756 - (show annotations)
Fri Jan 6 02:35:19 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: 6932 byte(s)
Fixed interpolation from DOF to nodes and moved common code to the base class.

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

  ViewVC Help
Powered by ViewVC 1.1.26