/[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 3756 - (hide annotations)
Fri Jan 6 02:35:19 2012 UTC (7 years, 9 months ago) by caltinay
File MIME type: text/plain
File size: 7157 byte(s)
Fixed interpolation from DOF to nodes and moved common code to the base class.

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

  ViewVC Help
Powered by ViewVC 1.1.26