/[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 3711 - (hide annotations)
Tue Dec 6 00:24:43 2011 UTC (7 years, 10 months ago) by caltinay
File MIME type: text/plain
File size: 6111 byte(s)
Interpolation & Gradient for reduced elements & faces.

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

  ViewVC Help
Powered by ViewVC 1.1.26