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

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

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.26