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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3781 - (hide annotations)
Mon Jan 23 22:18:49 2012 UTC (7 years, 8 months ago) by caltinay
File MIME type: text/plain
File size: 8703 byte(s)
Since setX() is not supported the constructors now take location and extent.
Python wrapper allows construction the old way with l0,l1 or with
tuples (x0,x1),(y0,y1).

1 caltinay 3691
2     /*******************************************************
3     *
4 caltinay 3764 * Copyright (c) 2003-2012 by University of Queensland
5 caltinay 3691 * 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 caltinay 3756 struct Paso_Connector;
20    
21 caltinay 3691 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 caltinay 3781 rectangle [x0,x1] x [y0,y1].
34 caltinay 3691 \param n0,n1 number of elements in each dimension
35 caltinay 3781 \param x0,y0,x1,y1 coordinates of bottom-left and top-right corners
36 caltinay 3691 \param d0,d1 number of subdivisions in each dimension
37     */
38     RIPLEY_DLL_API
39 caltinay 3781 Rectangle(int n0, int n1, double x0, double y0, double x1, double y1, int d0, int d1);
40 caltinay 3691
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 caltinay 3722 copies the surface normals at data points into out. The actual function
87     space to be considered is defined by out. out has to be defined on this
88     domain.
89     */
90     RIPLEY_DLL_API
91     virtual void setToNormal(escript::Data& out) const;
92    
93     /**
94     \brief
95 caltinay 3760 copies the size of samples into out. The actual function space to be
96     considered is defined by out. out has to be defined on this domain.
97     */
98     RIPLEY_DLL_API
99     virtual void setToSize(escript::Data& out) const;
100    
101     /**
102     \brief
103 caltinay 3691 returns the number of data points summed across all MPI processes
104     */
105     RIPLEY_DLL_API
106     virtual int getNumDataPointsGlobal() const { return (m_gNE0+1)*(m_gNE1+1); }
107    
108     /**
109     \brief
110     writes information about the mesh to standard output
111     \param full whether to print additional data
112     */
113     RIPLEY_DLL_API
114     virtual void Print_Mesh_Info(const bool full=false) const;
115    
116 caltinay 3697 /**
117     \brief
118     returns the number of nodes per MPI rank in each dimension
119     */
120     RIPLEY_DLL_API
121     virtual IndexVector getNumNodesPerDim() const;
122    
123     /**
124     \brief
125     returns the number of elements per MPI rank in each dimension
126     */
127     RIPLEY_DLL_API
128     virtual IndexVector getNumElementsPerDim() const;
129    
130     /**
131     \brief
132     returns the number of face elements in the order
133     (left,right,bottom,top,[front,back]) on current MPI rank
134     */
135     RIPLEY_DLL_API
136     virtual IndexVector getNumFacesPerBoundary() const;
137    
138     /**
139     \brief
140     returns the node distribution vector
141     */
142     RIPLEY_DLL_API
143     virtual IndexVector getNodeDistribution() const { return m_nodeDistribution; }
144    
145     /**
146     \brief
147 caltinay 3766 returns the number of spatial subdivisions in each dimension
148     */
149     RIPLEY_DLL_API
150     virtual IndexVector getNumSubdivisionsPerDim() const;
151    
152     /**
153     \brief
154 caltinay 3697 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 caltinay 3691 protected:
161     virtual dim_t getNumNodes() const { return m_N0*m_N1; }
162     virtual dim_t getNumElements() const { return m_NE0*m_NE1; }
163 caltinay 3756 virtual dim_t getNumFaceElements() const;
164 caltinay 3750 virtual dim_t getNumDOF() const;
165 caltinay 3756 virtual dim_t insertNeighbourNodes(IndexVector& index, index_t node) const;
166 caltinay 3691 virtual void assembleCoordinates(escript::Data& arg) const;
167 caltinay 3764 virtual void assembleGradient(escript::Data& out, escript::Data& in) const;
168     virtual void assembleIntegrate(std::vector<double>& integrals, escript::Data& arg) const;
169 caltinay 3748 virtual void assemblePDESingle(Paso_SystemMatrix* mat, escript::Data& rhs,
170     const escript::Data& A, const escript::Data& B,
171     const escript::Data& C, const escript::Data& D,
172 caltinay 3769 const escript::Data& X, const escript::Data& Y) const;
173     virtual void assemblePDEBoundarySingle(Paso_SystemMatrix* mat,
174 caltinay 3776 escript::Data& rhs, const escript::Data& d,
175     const escript::Data& y) const;
176 caltinay 3762 virtual void assemblePDESingleReduced(Paso_SystemMatrix* mat,
177     escript::Data& rhs, const escript::Data& A, const escript::Data& B,
178     const escript::Data& C, const escript::Data& D,
179 caltinay 3769 const escript::Data& X, const escript::Data& Y) const;
180     virtual void assemblePDEBoundarySingleReduced(Paso_SystemMatrix* mat,
181 caltinay 3776 escript::Data& rhs, const escript::Data& d,
182     const escript::Data& y) const;
183 caltinay 3760 virtual void assemblePDESystem(Paso_SystemMatrix* mat, escript::Data& rhs,
184     const escript::Data& A, const escript::Data& B,
185     const escript::Data& C, const escript::Data& D,
186 caltinay 3769 const escript::Data& X, const escript::Data& Y) const;
187     virtual void assemblePDEBoundarySystem(Paso_SystemMatrix* mat,
188 caltinay 3776 escript::Data& rhs, const escript::Data& d,
189     const escript::Data& y) const;
190 caltinay 3762 virtual void assemblePDESystemReduced(Paso_SystemMatrix* mat,
191     escript::Data& rhs, const escript::Data& A, const escript::Data& B,
192     const escript::Data& C, const escript::Data& D,
193 caltinay 3769 const escript::Data& X, const escript::Data& Y) const;
194     virtual void assemblePDEBoundarySystemReduced(Paso_SystemMatrix* mat,
195 caltinay 3776 escript::Data& rhs, const escript::Data& d,
196     const escript::Data& y) const;
197 caltinay 3691 virtual Paso_SystemMatrixPattern* getPattern(bool reducedRowOrder, bool reducedColOrder) const;
198 caltinay 3711 virtual void interpolateNodesOnElements(escript::Data& out,
199     escript::Data& in, bool reduced) const;
200     virtual void interpolateNodesOnFaces(escript::Data& out, escript::Data& in,
201     bool reduced) const;
202 caltinay 3750 virtual void nodesToDOF(escript::Data& out, escript::Data& in) const;
203 caltinay 3755 virtual void dofToNodes(escript::Data& out, escript::Data& in) const;
204 caltinay 3691
205     private:
206     void populateSampleIds();
207 caltinay 3756 void createPattern();
208 caltinay 3776 void addToMatrixAndRHS(Paso_SystemMatrix* S, escript::Data& F,
209     const std::vector<double>& EM_S, const std::vector<double>& EM_F,
210     bool addS, bool addF, index_t firstNode, dim_t nEq=1, dim_t nComp=1) const;
211 caltinay 3691
212     /// total number of elements in each dimension
213     dim_t m_gNE0, m_gNE1;
214    
215 caltinay 3781 /// location of domain
216     double m_x0, m_y0;
217    
218 caltinay 3691 /// side lengths of domain
219     double m_l0, m_l1;
220    
221     /// number of spatial subdivisions
222     int m_NX, m_NY;
223    
224 caltinay 3764 /// number of elements for this rank in each dimension including shared
225 caltinay 3691 dim_t m_NE0, m_NE1;
226    
227 caltinay 3764 /// number of own elements for this rank in each dimension
228     dim_t m_ownNE0, m_ownNE1;
229    
230 caltinay 3691 /// number of nodes for this rank in each dimension
231     dim_t m_N0, m_N1;
232    
233     /// first node on this rank is at (offset0,offset1) in global mesh
234     dim_t m_offset0, m_offset1;
235    
236 caltinay 3704 /// faceOffset[i]=-1 if face i is not an external face, otherwise it is
237     /// the index of that face (where i: 0=left, 1=right, 2=bottom, 3=top)
238     IndexVector m_faceOffset;
239    
240 caltinay 3691 /// vector of sample reference identifiers
241 caltinay 3750 IndexVector m_dofId;
242 caltinay 3691 IndexVector m_nodeId;
243     IndexVector m_elementId;
244     IndexVector m_faceId;
245 caltinay 3697
246     // vector with first node id on each rank
247     IndexVector m_nodeDistribution;
248 caltinay 3752
249 caltinay 3756 // vector that maps each node to a DOF index (used for the coupler)
250     IndexVector m_dofMap;
251    
252     // Paso connector used by the system matrix and to interpolate DOF to
253     // nodes
254     Paso_Connector* m_connector;
255    
256     // the Paso System Matrix pattern
257     Paso_SystemMatrixPattern* m_pattern;
258 caltinay 3691 };
259    
260     } // end of namespace ripley
261    
262     #endif // __RIPLEY_RECTANGLE_H__
263    

  ViewVC Help
Powered by ViewVC 1.1.26