/[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 3750 - (show annotations)
Fri Dec 23 01:20:34 2011 UTC (7 years, 9 months ago) by caltinay
File MIME type: text/plain
File size: 6922 byte(s)
Checkpoint - reinstated DOF FS and tried to fix couple blocks...

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

  ViewVC Help
Powered by ViewVC 1.1.26