/[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 3755 - (hide annotations)
Thu Jan 5 06:51:31 2012 UTC (7 years, 9 months ago) by caltinay
File MIME type: text/plain
File size: 7093 byte(s)
Made element IDs globally unique so ownSample can work (to be implemented).
Fixed couple block in 3D so PDEs seem to work now with MPI :-)

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     namespace ripley {
20    
21     /**
22     \brief
23     Rectangle is the 2-dimensional implementation of a RipleyDomain.
24     */
25     class Rectangle: public RipleyDomain
26     {
27     public:
28    
29     /**
30     \brief creates a rectangular mesh with n0 x n1 elements over the
31     rectangle [0,l0] x [0,l1].
32     \param n0,n1 number of elements in each dimension
33     \param l0,l1 length of each side of rectangle
34     \param d0,d1 number of subdivisions in each dimension
35     */
36     RIPLEY_DLL_API
37     Rectangle(int n0, int n1, double l0, double l1, int d0, int d1);
38    
39     /**
40     \brief
41     Destructor.
42     */
43     RIPLEY_DLL_API
44     ~Rectangle();
45    
46     /**
47     \brief
48     returns a description for this domain
49     */
50     RIPLEY_DLL_API
51     virtual std::string getDescription() const;
52    
53     /**
54     \brief equality operator
55     */
56     RIPLEY_DLL_API
57     virtual bool operator==(const escript::AbstractDomain& other) const;
58    
59     /**
60     \brief
61     dumps the mesh to a file with the given name
62     \param filename The name of the output file
63     */
64     RIPLEY_DLL_API
65     void dump(const std::string& filename) const;
66    
67     /**
68     \brief
69     returns the array of reference numbers for a function space type
70     \param fsType The function space type
71     */
72     RIPLEY_DLL_API
73     const int* borrowSampleReferenceIDs(int fsType) const;
74    
75     /**
76     \brief
77     returns true if this rank owns the sample id.
78     */
79     RIPLEY_DLL_API
80     virtual bool ownSample(int fs_code, index_t id) const;
81    
82     /**
83     \brief
84 caltinay 3702 copies the gradient of 'in' into 'out'. The actual function space to be
85     considered for the gradient is defined by 'in'. Both arguments have to
86     be defined on this domain.
87     */
88     RIPLEY_DLL_API
89     virtual void setToGradient(escript::Data& out, const escript::Data& in) const;
90    
91     /**
92     \brief
93 caltinay 3713 copies the integrals of the function defined by arg into integrals.
94     arg has to be defined on this domain.
95     */
96     RIPLEY_DLL_API
97     virtual void setToIntegrals(std::vector<double>& integrals, const escript::Data& arg) const;
98    
99     /**
100     \brief
101 caltinay 3722 copies the surface normals at data points into out. The actual function
102     space to be considered is defined by out. out has to be defined on this
103     domain.
104     */
105     RIPLEY_DLL_API
106     virtual void setToNormal(escript::Data& out) const;
107    
108     /**
109     \brief
110 caltinay 3691 returns the number of data points summed across all MPI processes
111     */
112     RIPLEY_DLL_API
113     virtual int getNumDataPointsGlobal() const { return (m_gNE0+1)*(m_gNE1+1); }
114    
115     /**
116     \brief
117     writes information about the mesh to standard output
118     \param full whether to print additional data
119     */
120     RIPLEY_DLL_API
121     virtual void Print_Mesh_Info(const bool full=false) const;
122    
123 caltinay 3697 /**
124     \brief
125     returns the number of nodes per MPI rank in each dimension
126     */
127     RIPLEY_DLL_API
128     virtual IndexVector getNumNodesPerDim() const;
129    
130     /**
131     \brief
132     returns the number of elements per MPI rank in each dimension
133     */
134     RIPLEY_DLL_API
135     virtual IndexVector getNumElementsPerDim() const;
136    
137     /**
138     \brief
139     returns the number of face elements in the order
140     (left,right,bottom,top,[front,back]) on current MPI rank
141     */
142     RIPLEY_DLL_API
143     virtual IndexVector getNumFacesPerBoundary() const;
144    
145     /**
146     \brief
147     returns the node distribution vector
148     */
149     RIPLEY_DLL_API
150     virtual IndexVector getNodeDistribution() const { return m_nodeDistribution; }
151    
152     /**
153     \brief
154     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 3750 virtual dim_t getNumDOF() const;
164 caltinay 3691 virtual dim_t getNumFaceElements() const;
165     virtual void assembleCoordinates(escript::Data& arg) const;
166 caltinay 3748 virtual void assemblePDESingle(Paso_SystemMatrix* mat, escript::Data& rhs,
167     const escript::Data& A, const escript::Data& B,
168     const escript::Data& C, const escript::Data& D,
169     const escript::Data& X, const escript::Data& Y,
170     const escript::Data& d, const escript::Data& y) const;
171     //virtual void assemblePDESystem(Paso_SystemMatrix* mat, escript::Data& rhs,
172     // const escript::Data& A, const escript::Data& B,
173     // const escript::Data& C, const escript::Data& D,
174     // const escript::Data& X, const escript::Data& Y,
175     // const escript::Data& d, const escript::Data& y) const;
176    
177 caltinay 3691 virtual Paso_SystemMatrixPattern* getPattern(bool reducedRowOrder, bool reducedColOrder) const;
178 caltinay 3711 virtual void interpolateNodesOnElements(escript::Data& out,
179     escript::Data& in, bool reduced) const;
180     virtual void interpolateNodesOnFaces(escript::Data& out, escript::Data& in,
181     bool reduced) const;
182 caltinay 3750 virtual void nodesToDOF(escript::Data& out, escript::Data& in) const;
183 caltinay 3755 virtual void dofToNodes(escript::Data& out, escript::Data& in) const;
184 caltinay 3691
185     private:
186     void populateSampleIds();
187 caltinay 3699 int insertNeighbours(IndexVector& index, index_t node) const;
188 caltinay 3750 void addToSystemMatrix(Paso_SystemMatrix* in, const IndexVector& nodes_Eq,
189     dim_t num_Eq, const IndexVector& nodes_Sol, dim_t num_Sol,
190 caltinay 3748 const std::vector<double>& array) const;
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     // vector that maps each node to a DOF index for coupling
224     mutable IndexVector m_dofMap;
225 caltinay 3691 };
226    
227     } // end of namespace ripley
228    
229     #endif // __RIPLEY_RECTANGLE_H__
230    

  ViewVC Help
Powered by ViewVC 1.1.26