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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3915 - (show annotations)
Mon Jun 25 02:17:58 2012 UTC (7 years, 2 months ago) by caltinay
File MIME type: text/plain
File size: 8395 byte(s)
Added declspecs for all ripley classes.

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

  ViewVC Help
Powered by ViewVC 1.1.26