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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3971 - (show annotations)
Wed Sep 19 02:55:35 2012 UTC (7 years ago) by caltinay
File MIME type: text/plain
File size: 8770 byte(s)
Implemented binary grid reader in ripley which is now used in ER Mapper source.
Interface/details likely to change but need to get this running now.

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

  ViewVC Help
Powered by ViewVC 1.1.26