/[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 3701 - (show annotations)
Fri Dec 2 02:04:58 2011 UTC (7 years, 10 months ago) by caltinay
File MIME type: text/plain
File size: 5498 byte(s)
Prepared interpolation methods.

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

  ViewVC Help
Powered by ViewVC 1.1.26