/[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 3762 - (hide annotations)
Tue Jan 10 00:01:45 2012 UTC (7 years, 9 months ago) by caltinay
File MIME type: text/plain
File size: 8067 byte(s)
PDE assemblage with reduced order done.

1 caltinay 3691
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 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     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 caltinay 3702 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 caltinay 3713 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 caltinay 3722 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 caltinay 3760 copies the size of samples into out. The actual function space to be
113     considered is defined by out. out has to be defined on this domain.
114     */
115     RIPLEY_DLL_API
116     virtual void setToSize(escript::Data& out) const;
117    
118     /**
119     \brief
120 caltinay 3691 returns the number of data points summed across all MPI processes
121     */
122     RIPLEY_DLL_API
123     virtual int getNumDataPointsGlobal() const { return (m_gNE0+1)*(m_gNE1+1); }
124    
125     /**
126     \brief
127     writes information about the mesh to standard output
128     \param full whether to print additional data
129     */
130     RIPLEY_DLL_API
131     virtual void Print_Mesh_Info(const bool full=false) const;
132    
133 caltinay 3697 /**
134     \brief
135     returns the number of nodes per MPI rank in each dimension
136     */
137     RIPLEY_DLL_API
138     virtual IndexVector getNumNodesPerDim() const;
139    
140     /**
141     \brief
142     returns the number of elements per MPI rank in each dimension
143     */
144     RIPLEY_DLL_API
145     virtual IndexVector getNumElementsPerDim() const;
146    
147     /**
148     \brief
149     returns the number of face elements in the order
150     (left,right,bottom,top,[front,back]) on current MPI rank
151     */
152     RIPLEY_DLL_API
153     virtual IndexVector getNumFacesPerBoundary() const;
154    
155     /**
156     \brief
157     returns the node distribution vector
158     */
159     RIPLEY_DLL_API
160     virtual IndexVector getNodeDistribution() const { return m_nodeDistribution; }
161    
162     /**
163     \brief
164     returns the first coordinate value and the node spacing along given
165     dimension as a pair
166     */
167     RIPLEY_DLL_API
168     virtual std::pair<double,double> getFirstCoordAndSpacing(dim_t dim) const;
169    
170 caltinay 3691 protected:
171     virtual dim_t getNumNodes() const { return m_N0*m_N1; }
172     virtual dim_t getNumElements() const { return m_NE0*m_NE1; }
173 caltinay 3756 virtual dim_t getNumFaceElements() const;
174 caltinay 3750 virtual dim_t getNumDOF() const;
175 caltinay 3756 virtual dim_t insertNeighbourNodes(IndexVector& index, index_t node) const;
176 caltinay 3691 virtual void assembleCoordinates(escript::Data& arg) const;
177 caltinay 3748 virtual void assemblePDESingle(Paso_SystemMatrix* mat, escript::Data& rhs,
178     const escript::Data& A, const escript::Data& B,
179     const escript::Data& C, const escript::Data& D,
180     const escript::Data& X, const escript::Data& Y,
181     const escript::Data& d, const escript::Data& y) const;
182 caltinay 3762 virtual void assemblePDESingleReduced(Paso_SystemMatrix* mat,
183     escript::Data& rhs, const escript::Data& A, const escript::Data& B,
184     const escript::Data& C, const escript::Data& D,
185     const escript::Data& X, const escript::Data& Y,
186     const escript::Data& d, const escript::Data& y) const;
187 caltinay 3760 virtual void assemblePDESystem(Paso_SystemMatrix* mat, escript::Data& rhs,
188     const escript::Data& A, const escript::Data& B,
189     const escript::Data& C, const escript::Data& D,
190     const escript::Data& X, const escript::Data& Y,
191     const escript::Data& d, const escript::Data& y) const;
192 caltinay 3762 virtual void assemblePDESystemReduced(Paso_SystemMatrix* mat,
193     escript::Data& rhs, const escript::Data& A, const escript::Data& B,
194     const escript::Data& C, const escript::Data& D,
195     const escript::Data& X, const escript::Data& Y,
196     const escript::Data& d, const escript::Data& y) const;
197 caltinay 3748
198 caltinay 3691 virtual Paso_SystemMatrixPattern* getPattern(bool reducedRowOrder, bool reducedColOrder) const;
199 caltinay 3711 virtual void interpolateNodesOnElements(escript::Data& out,
200     escript::Data& in, bool reduced) const;
201     virtual void interpolateNodesOnFaces(escript::Data& out, escript::Data& in,
202     bool reduced) const;
203 caltinay 3750 virtual void nodesToDOF(escript::Data& out, escript::Data& in) const;
204 caltinay 3755 virtual void dofToNodes(escript::Data& out, escript::Data& in) const;
205 caltinay 3691
206     private:
207     void populateSampleIds();
208 caltinay 3756 void createPattern();
209 caltinay 3691
210     /// total number of elements in each dimension
211     dim_t m_gNE0, m_gNE1;
212    
213     /// side lengths of domain
214     double m_l0, m_l1;
215    
216     /// number of spatial subdivisions
217     int m_NX, m_NY;
218    
219     /// number of elements for this rank in each dimension
220     dim_t m_NE0, m_NE1;
221    
222     /// number of nodes for this rank in each dimension
223     dim_t m_N0, m_N1;
224    
225     /// first node on this rank is at (offset0,offset1) in global mesh
226     dim_t m_offset0, m_offset1;
227    
228 caltinay 3704 /// faceOffset[i]=-1 if face i is not an external face, otherwise it is
229     /// the index of that face (where i: 0=left, 1=right, 2=bottom, 3=top)
230     IndexVector m_faceOffset;
231    
232 caltinay 3691 /// vector of sample reference identifiers
233 caltinay 3750 IndexVector m_dofId;
234 caltinay 3691 IndexVector m_nodeId;
235     IndexVector m_elementId;
236     IndexVector m_faceId;
237 caltinay 3697
238     // vector with first node id on each rank
239     IndexVector m_nodeDistribution;
240 caltinay 3752
241 caltinay 3756 // vector that maps each node to a DOF index (used for the coupler)
242     IndexVector m_dofMap;
243    
244     // Paso connector used by the system matrix and to interpolate DOF to
245     // nodes
246     Paso_Connector* m_connector;
247    
248     // the Paso System Matrix pattern
249     Paso_SystemMatrixPattern* m_pattern;
250 caltinay 3691 };
251    
252     } // end of namespace ripley
253    
254     #endif // __RIPLEY_RECTANGLE_H__
255    

  ViewVC Help
Powered by ViewVC 1.1.26