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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3760 - (show annotations)
Mon Jan 9 05:21:18 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: 7185 byte(s)
-implemented addPDEToRHS() and setToSize()
-added a few missing calls to requireWrite()
-added assemblePDESystem() to Rectangle but haven't tested yet

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 fsType, 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 copies the size of samples into out. The actual function space to be
114 considered is defined by out. out has to be defined on this domain.
115 */
116 RIPLEY_DLL_API
117 virtual void setToSize(escript::Data& out) const;
118
119 /**
120 \brief
121 returns the number of data points summed across all MPI processes
122 */
123 RIPLEY_DLL_API
124 virtual int getNumDataPointsGlobal() const { return (m_gNE0+1)*(m_gNE1+1)*(m_gNE2+1); }
125
126 /**
127 \brief
128 writes information about the mesh to standard output
129 \param full whether to print additional data
130 */
131 RIPLEY_DLL_API
132 virtual void Print_Mesh_Info(const bool full=false) const;
133
134 /**
135 \brief
136 returns the number of nodes per MPI rank in each dimension
137 */
138 RIPLEY_DLL_API
139 virtual IndexVector getNumNodesPerDim() const;
140
141 /**
142 \brief
143 returns the number of elements per MPI rank in each dimension
144 */
145 RIPLEY_DLL_API
146 virtual IndexVector getNumElementsPerDim() const;
147
148 /**
149 \brief
150 returns the number of face elements in the order
151 (left,right,bottom,top,[front,back]) on current MPI rank
152 */
153 RIPLEY_DLL_API
154 virtual IndexVector getNumFacesPerBoundary() const;
155
156 /**
157 \brief
158 returns the node distribution vector
159 */
160 RIPLEY_DLL_API
161 virtual IndexVector getNodeDistribution() const { return m_nodeDistribution; }
162
163 /**
164 \brief
165 returns the first coordinate value and the node spacing along given
166 dimension as a pair
167 */
168 RIPLEY_DLL_API
169 virtual std::pair<double,double> getFirstCoordAndSpacing(dim_t dim) const;
170
171 protected:
172 virtual dim_t getNumNodes() const { return m_N0*m_N1*m_N2; }
173 virtual dim_t getNumElements() const { return m_NE0*m_NE1*m_NE2; }
174 virtual dim_t getNumFaceElements() const;
175 virtual dim_t getNumDOF() const;
176 virtual dim_t insertNeighbourNodes(IndexVector& index, index_t node) const;
177 virtual void assembleCoordinates(escript::Data& arg) const;
178 virtual void assemblePDESingle(Paso_SystemMatrix* mat, escript::Data& rhs,
179 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
205 dim_t m_NE0, m_NE1, m_NE2;
206
207 /// number of nodes for this rank in each dimension
208 dim_t m_N0, m_N1, m_N2;
209
210 /// first node on this rank is at (offset0,offset1,offset2) in global mesh
211 dim_t m_offset0, m_offset1, m_offset2;
212
213 /// faceOffset[i]=-1 if face i is not an external face, otherwise it is
214 /// the index of that face (where i: 0=left, 1=right, 2=bottom, 3=top,
215 /// 4=front, 5=back)
216 IndexVector m_faceOffset;
217
218 /// vector of sample reference identifiers
219 IndexVector m_dofId;
220 IndexVector m_nodeId;
221 IndexVector m_elementId;
222 IndexVector m_faceId;
223
224 // vector with first node id on each rank
225 IndexVector m_nodeDistribution;
226
227 // vector that maps each node to a DOF index (used for the coupler)
228 IndexVector m_dofMap;
229
230 // Paso connector used by the system matrix and to interpolate DOF to
231 // nodes
232 Paso_Connector* m_connector;
233
234 // the Paso System Matrix pattern
235 Paso_SystemMatrixPattern* m_pattern;
236 };
237
238 } // end of namespace ripley
239
240 #endif // __RIPLEY_BRICK_H__
241

  ViewVC Help
Powered by ViewVC 1.1.26