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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3748 - (show annotations)
Thu Dec 15 07:36:19 2011 UTC (7 years, 9 months ago) by caltinay
Original Path: branches/ripleygmg_from_3668/ripley/src/Rectangle.h
File MIME type: text/plain
File size: 6978 byte(s)
PDE assembly in serial and 2D seems to be doing what it's supposed to when
boundary elements are not involved.

1
2 /*******************************************************
3 *
4 * Copyright (c) 2003-2011 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_Pattern;
20
21 namespace ripley {
22
23 /**
24 \brief
25 Rectangle is the 2-dimensional implementation of a RipleyDomain.
26 */
27 class Rectangle: public RipleyDomain
28 {
29 public:
30
31 /**
32 \brief creates a rectangular mesh with n0 x n1 elements over the
33 rectangle [0,l0] x [0,l1].
34 \param n0,n1 number of elements in each dimension
35 \param l0,l1 length of each side of rectangle
36 \param d0,d1 number of subdivisions in each dimension
37 */
38 RIPLEY_DLL_API
39 Rectangle(int n0, int n1, double l0, double l1, int d0, int d1);
40
41 /**
42 \brief
43 Destructor.
44 */
45 RIPLEY_DLL_API
46 ~Rectangle();
47
48 /**
49 \brief
50 returns a description for this domain
51 */
52 RIPLEY_DLL_API
53 virtual std::string getDescription() const;
54
55 /**
56 \brief equality operator
57 */
58 RIPLEY_DLL_API
59 virtual bool operator==(const escript::AbstractDomain& other) const;
60
61 /**
62 \brief
63 dumps the mesh to a file with the given name
64 \param filename The name of the output file
65 */
66 RIPLEY_DLL_API
67 void dump(const std::string& filename) const;
68
69 /**
70 \brief
71 returns the array of reference numbers for a function space type
72 \param fsType The function space type
73 */
74 RIPLEY_DLL_API
75 const int* borrowSampleReferenceIDs(int fsType) const;
76
77 /**
78 \brief
79 returns true if this rank owns the sample id.
80 */
81 RIPLEY_DLL_API
82 virtual bool ownSample(int fs_code, index_t id) const;
83
84 /**
85 \brief
86 copies the gradient of 'in' into 'out'. The actual function space to be
87 considered for the gradient is defined by 'in'. Both arguments have to
88 be defined on this domain.
89 */
90 RIPLEY_DLL_API
91 virtual void setToGradient(escript::Data& out, const escript::Data& in) const;
92
93 /**
94 \brief
95 copies the integrals of the function defined by arg into integrals.
96 arg has to be defined on this domain.
97 */
98 RIPLEY_DLL_API
99 virtual void setToIntegrals(std::vector<double>& integrals, const escript::Data& arg) const;
100
101 /**
102 \brief
103 copies the surface normals at data points into out. The actual function
104 space to be considered is defined by out. out has to be defined on this
105 domain.
106 */
107 RIPLEY_DLL_API
108 virtual void setToNormal(escript::Data& out) const;
109
110 /**
111 \brief
112 returns the number of data points summed across all MPI processes
113 */
114 RIPLEY_DLL_API
115 virtual int getNumDataPointsGlobal() const { return (m_gNE0+1)*(m_gNE1+1); }
116
117 /**
118 \brief
119 writes information about the mesh to standard output
120 \param full whether to print additional data
121 */
122 RIPLEY_DLL_API
123 virtual void Print_Mesh_Info(const bool full=false) const;
124
125 /**
126 \brief
127 returns the number of nodes per MPI rank in each dimension
128 */
129 RIPLEY_DLL_API
130 virtual IndexVector getNumNodesPerDim() const;
131
132 /**
133 \brief
134 returns the number of elements per MPI rank in each dimension
135 */
136 RIPLEY_DLL_API
137 virtual IndexVector getNumElementsPerDim() const;
138
139 /**
140 \brief
141 returns the number of face elements in the order
142 (left,right,bottom,top,[front,back]) on current MPI rank
143 */
144 RIPLEY_DLL_API
145 virtual IndexVector getNumFacesPerBoundary() const;
146
147 /**
148 \brief
149 returns the node distribution vector
150 */
151 RIPLEY_DLL_API
152 virtual IndexVector getNodeDistribution() const { return m_nodeDistribution; }
153
154 /**
155 \brief
156 returns the first coordinate value and the node spacing along given
157 dimension as a pair
158 */
159 RIPLEY_DLL_API
160 virtual std::pair<double,double> getFirstCoordAndSpacing(dim_t dim) const;
161
162 protected:
163 virtual dim_t getNumNodes() const { return m_N0*m_N1; }
164 virtual dim_t getNumElements() const { return m_NE0*m_NE1; }
165 virtual dim_t getNumFaceElements() const;
166 virtual void assembleCoordinates(escript::Data& arg) const;
167 virtual void assemblePDESingle(Paso_SystemMatrix* mat, escript::Data& rhs,
168 const escript::Data& A, const escript::Data& B,
169 const escript::Data& C, const escript::Data& D,
170 const escript::Data& X, const escript::Data& Y,
171 const escript::Data& d, const escript::Data& y) const;
172 //virtual void assemblePDESystem(Paso_SystemMatrix* mat, escript::Data& rhs,
173 // const escript::Data& A, const escript::Data& B,
174 // const escript::Data& C, const escript::Data& D,
175 // const escript::Data& X, const escript::Data& Y,
176 // const escript::Data& d, const escript::Data& y) const;
177
178 virtual Paso_SystemMatrixPattern* getPattern(bool reducedRowOrder, bool reducedColOrder) const;
179 virtual void interpolateNodesOnElements(escript::Data& out,
180 escript::Data& in, bool reduced) const;
181 virtual void interpolateNodesOnFaces(escript::Data& out, escript::Data& in,
182 bool reduced) const;
183
184 private:
185 void populateSampleIds();
186 int insertNeighbours(IndexVector& index, index_t node) const;
187 void generateCouplePatterns(Paso_Pattern** colPattern,
188 Paso_Pattern** rowPattern) const;
189 void addToSystemMatrix(Paso_SystemMatrix* in, dim_t NN_Equa,
190 const IndexVector& Nodes_Equa, dim_t num_Equa, dim_t NN_Sol,
191 const IndexVector& Nodes_Sol, dim_t num_Sol,
192 const std::vector<double>& array) const;
193
194 /// total number of elements in each dimension
195 dim_t m_gNE0, m_gNE1;
196
197 /// side lengths of domain
198 double m_l0, m_l1;
199
200 /// number of spatial subdivisions
201 int m_NX, m_NY;
202
203 /// number of elements for this rank in each dimension
204 dim_t m_NE0, m_NE1;
205
206 /// number of nodes for this rank in each dimension
207 dim_t m_N0, m_N1;
208
209 /// first node on this rank is at (offset0,offset1) in global mesh
210 dim_t m_offset0, m_offset1;
211
212 /// faceOffset[i]=-1 if face i is not an external face, otherwise it is
213 /// the index of that face (where i: 0=left, 1=right, 2=bottom, 3=top)
214 IndexVector m_faceOffset;
215
216 /// vector of sample reference identifiers
217 IndexVector m_nodeId;
218 IndexVector m_elementId;
219 IndexVector m_faceId;
220
221 // vector with first node id on each rank
222 IndexVector m_nodeDistribution;
223 };
224
225 } // end of namespace ripley
226
227 #endif // __RIPLEY_RECTANGLE_H__
228

  ViewVC Help
Powered by ViewVC 1.1.26