/[escript]/branches/ripleygmg_from_3668/ripley/src/Rectangle.h
ViewVC logotype

Contents of /branches/ripleygmg_from_3668/ripley/src/Rectangle.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3711 - (show annotations)
Tue Dec 6 00:24:43 2011 UTC (7 years, 11 months ago) by caltinay
File MIME type: text/plain
File size: 6111 byte(s)
Interpolation & Gradient for reduced elements & faces.

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 returns the number of data points summed across all MPI processes
96 */
97 RIPLEY_DLL_API
98 virtual int getNumDataPointsGlobal() const { return (m_gNE0+1)*(m_gNE1+1); }
99
100 /**
101 \brief
102 writes information about the mesh to standard output
103 \param full whether to print additional data
104 */
105 RIPLEY_DLL_API
106 virtual void Print_Mesh_Info(const bool full=false) const;
107
108 /**
109 \brief
110 returns the number of nodes per MPI rank in each dimension
111 */
112 RIPLEY_DLL_API
113 virtual IndexVector getNumNodesPerDim() const;
114
115 /**
116 \brief
117 returns the number of elements per MPI rank in each dimension
118 */
119 RIPLEY_DLL_API
120 virtual IndexVector getNumElementsPerDim() const;
121
122 /**
123 \brief
124 returns the number of face elements in the order
125 (left,right,bottom,top,[front,back]) on current MPI rank
126 */
127 RIPLEY_DLL_API
128 virtual IndexVector getNumFacesPerBoundary() const;
129
130 /**
131 \brief
132 returns the node distribution vector
133 */
134 RIPLEY_DLL_API
135 virtual IndexVector getNodeDistribution() const { return m_nodeDistribution; }
136
137 /**
138 \brief
139 returns the first coordinate value and the node spacing along given
140 dimension as a pair
141 */
142 RIPLEY_DLL_API
143 virtual std::pair<double,double> getFirstCoordAndSpacing(dim_t dim) const;
144
145 /**
146 \brief
147 adds a PDE onto the stiffness matrix mat and rhs
148 */
149 RIPLEY_DLL_API
150 virtual void addPDEToSystem(escript::AbstractSystemMatrix& mat,
151 escript::Data& rhs, const escript::Data& A, const escript::Data& B,
152 const escript::Data& C, const escript::Data& D,
153 const escript::Data& X, const escript::Data& Y,
154 const escript::Data& d, const escript::Data& y,
155 const escript::Data& d_contact, const escript::Data& y_contact,
156 const escript::Data& d_dirac, const escript::Data& y_dirac) const;
157
158 protected:
159 virtual dim_t getNumNodes() const { return m_N0*m_N1; }
160 virtual dim_t getNumElements() const { return m_NE0*m_NE1; }
161 virtual dim_t getNumFaceElements() const;
162 virtual void assembleCoordinates(escript::Data& arg) const;
163 virtual Paso_SystemMatrixPattern* getPattern(bool reducedRowOrder, bool reducedColOrder) const;
164 virtual void interpolateNodesOnElements(escript::Data& out,
165 escript::Data& in, bool reduced) const;
166 virtual void interpolateNodesOnFaces(escript::Data& out, escript::Data& in,
167 bool reduced) const;
168
169 private:
170 void populateSampleIds();
171 int insertNeighbours(IndexVector& index, index_t node) const;
172 void generateCouplePatterns(Paso_Pattern** colPattern,
173 Paso_Pattern** rowPattern) const;
174
175 /// total number of elements in each dimension
176 dim_t m_gNE0, m_gNE1;
177
178 /// side lengths of domain
179 double m_l0, m_l1;
180
181 /// number of spatial subdivisions
182 int m_NX, m_NY;
183
184 /// number of elements for this rank in each dimension
185 dim_t m_NE0, m_NE1;
186
187 /// number of nodes for this rank in each dimension
188 dim_t m_N0, m_N1;
189
190 /// first node on this rank is at (offset0,offset1) in global mesh
191 dim_t m_offset0, m_offset1;
192
193 /// faceOffset[i]=-1 if face i is not an external face, otherwise it is
194 /// the index of that face (where i: 0=left, 1=right, 2=bottom, 3=top)
195 IndexVector m_faceOffset;
196
197 /// vector of sample reference identifiers
198 IndexVector m_nodeId;
199 IndexVector m_elementId;
200 IndexVector m_faceId;
201
202 // vector with first node id on each rank
203 IndexVector m_nodeDistribution;
204 };
205
206 } // end of namespace ripley
207
208 #endif // __RIPLEY_RECTANGLE_H__
209

  ViewVC Help
Powered by ViewVC 1.1.26