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

Contents of /trunk/ripley/src/Rectangle.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: 8761 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_RECTANGLE_H__
17 #define __RIPLEY_RECTANGLE_H__
18
19 #include <ripley/RipleyDomain.h>
20
21 struct Paso_Connector;
22
23 namespace ripley {
24
25 /**
26 \brief
27 Rectangle is the 2-dimensional implementation of a RipleyDomain.
28 */
29 class RIPLEY_DLL_API Rectangle: public RipleyDomain
30 {
31 public:
32
33 /**
34 \brief creates a rectangular mesh with n0 x n1 elements over the
35 rectangle [x0,x1] x [y0,y1].
36 \param n0,n1 number of elements in each dimension
37 \param x0,y0,x1,y1 coordinates of bottom-left and top-right corners
38 \param d0,d1 number of subdivisions in each dimension
39 */
40 Rectangle(int n0, int n1, double x0, double y0, double x1, double y1,
41 int d0=-1, int d1=-1);
42
43 /**
44 \brief
45 Destructor.
46 */
47 ~Rectangle();
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 array of reference numbers for a function space type
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 fs_code, 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); }
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; }
154 virtual dim_t getNumElements() const { return m_NE0*m_NE1; }
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 /// total number of elements in each dimension
205 dim_t m_gNE0, m_gNE1;
206
207 /// location of domain
208 double m_x0, m_y0;
209
210 /// side lengths of domain
211 double m_l0, m_l1;
212
213 /// number of spatial subdivisions
214 int m_NX, m_NY;
215
216 /// number of elements for this rank in each dimension including shared
217 dim_t m_NE0, m_NE1;
218
219 /// number of own elements for this rank in each dimension
220 dim_t m_ownNE0, m_ownNE1;
221
222 /// number of nodes for this rank in each dimension
223 dim_t m_N0, m_N1;
224
225 /// first node on this rank is at (offset0,offset1) in global mesh
226 dim_t m_offset0, m_offset1;
227
228 /// faceOffset[i]=-1 if face i is not an external face, otherwise it is
229 /// the index of that face (where i: 0=left, 1=right, 2=bottom, 3=top)
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_RECTANGLE_H__
255

  ViewVC Help
Powered by ViewVC 1.1.26