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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4277 - (show annotations)
Wed Mar 6 01:30:41 2013 UTC (6 years, 6 months ago) by caltinay
File MIME type: text/plain
File size: 9209 byte(s)
Implemented claimed support for mixing data with different resolutions.

1
2 /*****************************************************************************
3 *
4 * Copyright (c) 2003-2013 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,
72 const std::vector<int>& multiplier) const;
73
74 /**
75 */
76 virtual void readNcGrid(escript::Data& out, std::string filename,
77 std::string varname, const std::vector<int>& first,
78 const std::vector<int>& numValues,
79 const std::vector<int>& multiplier) const;
80
81 /**
82 \brief
83 returns the reference number of the given sample number
84 \param fsType The function space type
85 */
86 const int* borrowSampleReferenceIDs(int fsType) const;
87
88 /**
89 \brief
90 returns true if this rank owns the sample id.
91 */
92 virtual bool ownSample(int fsType, index_t id) const;
93
94 /**
95 \brief
96 copies the surface normals at data points into out. The actual function
97 space to be considered is defined by out. out has to be defined on this
98 domain.
99 */
100 virtual void setToNormal(escript::Data& out) const;
101
102 /**
103 \brief
104 copies the size of samples into out. The actual function space to be
105 considered is defined by out. out has to be defined on this domain.
106 */
107 virtual void setToSize(escript::Data& out) const;
108
109 /**
110 \brief
111 returns the number of data points summed across all MPI processes
112 */
113 virtual int getNumDataPointsGlobal() const { return (m_gNE0+1)*(m_gNE1+1)*(m_gNE2+1); }
114
115 /**
116 \brief
117 writes information about the mesh to standard output
118 \param full whether to print additional data
119 */
120 virtual void Print_Mesh_Info(const bool full=false) const;
121
122 /**
123 \brief
124 returns the number of nodes per MPI rank in each dimension
125 */
126 virtual IndexVector getNumNodesPerDim() const;
127
128 /**
129 \brief
130 returns the number of elements per MPI rank in each dimension
131 */
132 virtual IndexVector getNumElementsPerDim() const;
133
134 /**
135 \brief
136 returns the number of face elements in the order
137 (left,right,bottom,top,[front,back]) on current MPI rank
138 */
139 virtual IndexVector getNumFacesPerBoundary() const;
140
141 /**
142 \brief
143 returns the node distribution vector
144 */
145 virtual IndexVector getNodeDistribution() const { return m_nodeDistribution; }
146
147 /**
148 \brief
149 returns the number of spatial subdivisions in each dimension
150 */
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 virtual std::pair<double,double> getFirstCoordAndSpacing(dim_t dim) const;
159
160 protected:
161 virtual dim_t getNumNodes() const { return m_N0*m_N1*m_N2; }
162 virtual dim_t getNumElements() const { return m_NE0*m_NE1*m_NE2; }
163 virtual dim_t getNumFaceElements() const;
164 virtual dim_t getNumDOF() const;
165 virtual dim_t insertNeighbourNodes(IndexVector& index, index_t node) const;
166 virtual void assembleCoordinates(escript::Data& arg) const;
167 virtual void assembleGradient(escript::Data& out, escript::Data& in) const;
168 virtual void assembleIntegrate(std::vector<double>& integrals, escript::Data& arg) const;
169 virtual void assemblePDESingle(Paso_SystemMatrix* mat, escript::Data& rhs,
170 const escript::Data& A, const escript::Data& B,
171 const escript::Data& C, const escript::Data& D,
172 const escript::Data& X, const escript::Data& Y) const;
173 virtual void assemblePDEBoundarySingle(Paso_SystemMatrix* mat,
174 escript::Data& rhs, const escript::Data& d,
175 const escript::Data& y) const;
176 virtual void assemblePDESingleReduced(Paso_SystemMatrix* mat,
177 escript::Data& rhs, const escript::Data& A, const escript::Data& B,
178 const escript::Data& C, const escript::Data& D,
179 const escript::Data& X, const escript::Data& Y) const;
180 virtual void assemblePDEBoundarySingleReduced(Paso_SystemMatrix* mat,
181 escript::Data& rhs, const escript::Data& d,
182 const escript::Data& y) const;
183 virtual void assemblePDESystem(Paso_SystemMatrix* mat, escript::Data& rhs,
184 const escript::Data& A, const escript::Data& B,
185 const escript::Data& C, const escript::Data& D,
186 const escript::Data& X, const escript::Data& Y) const;
187 virtual void assemblePDEBoundarySystem(Paso_SystemMatrix* mat,
188 escript::Data& rhs, const escript::Data& d,
189 const escript::Data& y) const;
190 virtual void assemblePDESystemReduced(Paso_SystemMatrix* mat,
191 escript::Data& rhs, const escript::Data& A, const escript::Data& B,
192 const escript::Data& C, const escript::Data& D,
193 const escript::Data& X, const escript::Data& Y) const;
194 virtual void assemblePDEBoundarySystemReduced(Paso_SystemMatrix* mat,
195 escript::Data& rhs, const escript::Data& d,
196 const escript::Data& y) const;
197 virtual Paso_SystemMatrixPattern* getPattern(bool reducedRowOrder, bool reducedColOrder) const;
198 virtual void interpolateNodesOnElements(escript::Data& out,
199 escript::Data& in, bool reduced) const;
200 virtual void interpolateNodesOnFaces(escript::Data& out, escript::Data& in,
201 bool reduced) const;
202 virtual void nodesToDOF(escript::Data& out, escript::Data& in) const;
203 virtual void dofToNodes(escript::Data& out, escript::Data& in) const;
204
205 private:
206 void populateSampleIds();
207 void createPattern();
208 void addToMatrixAndRHS(Paso_SystemMatrix* S, escript::Data& F,
209 const std::vector<double>& EM_S, const std::vector<double>& EM_F,
210 bool addS, bool addF, index_t firstNode, dim_t nEq=1, dim_t nComp=1) const;
211
212
213 /// total number of elements in each dimension
214 dim_t m_gNE0, m_gNE1, m_gNE2;
215
216 /// location of domain
217 double m_x0, m_y0, m_z0;
218
219 /// side lengths of domain
220 double m_l0, m_l1, m_l2;
221
222 /// number of spatial subdivisions
223 int m_NX, m_NY, m_NZ;
224
225 /// number of elements for this rank in each dimension including shared
226 dim_t m_NE0, m_NE1, m_NE2;
227
228 /// number of own elements for this rank in each dimension
229 dim_t m_ownNE0, m_ownNE1, m_ownNE2;
230
231 /// number of nodes for this rank in each dimension
232 dim_t m_N0, m_N1, m_N2;
233
234 /// first node on this rank is at (offset0,offset1,offset2) in global mesh
235 dim_t m_offset0, m_offset1, m_offset2;
236
237 /// faceOffset[i]=-1 if face i is not an external face, otherwise it is
238 /// the index of that face (where i: 0=left, 1=right, 2=bottom, 3=top,
239 /// 4=front, 5=back)
240 IndexVector m_faceOffset;
241
242 /// vector of sample reference identifiers
243 IndexVector m_dofId;
244 IndexVector m_nodeId;
245 IndexVector m_elementId;
246 IndexVector m_faceId;
247
248 // vector with first node id on each rank
249 IndexVector m_nodeDistribution;
250
251 // vector that maps each node to a DOF index (used for the coupler)
252 IndexVector m_dofMap;
253
254 // Paso connector used by the system matrix and to interpolate DOF to
255 // nodes
256 Paso_Connector* m_connector;
257
258 // the Paso System Matrix pattern
259 Paso_SystemMatrixPattern* m_pattern;
260 };
261
262 } // end of namespace ripley
263
264 #endif // __RIPLEY_BRICK_H__
265

  ViewVC Help
Powered by ViewVC 1.1.26