/[escript]/trunk/ripley/src/Rectangle.h
ViewVC logotype

Annotation of /trunk/ripley/src/Rectangle.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3760 - (hide annotations)
Mon Jan 9 05:21:18 2012 UTC (7 years, 8 months ago) by caltinay
Original Path: branches/ripleygmg_from_3668/ripley/src/Rectangle.h
File MIME type: text/plain
File size: 7401 byte(s)
-implemented addPDEToRHS() and setToSize()
-added a few missing calls to requireWrite()
-added assemblePDESystem() to Rectangle but haven't tested yet

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 3760 virtual void assemblePDESystem(Paso_SystemMatrix* mat, escript::Data& rhs,
183     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 3748
188 caltinay 3691 virtual Paso_SystemMatrixPattern* getPattern(bool reducedRowOrder, bool reducedColOrder) const;
189 caltinay 3711 virtual void interpolateNodesOnElements(escript::Data& out,
190     escript::Data& in, bool reduced) const;
191     virtual void interpolateNodesOnFaces(escript::Data& out, escript::Data& in,
192     bool reduced) const;
193 caltinay 3750 virtual void nodesToDOF(escript::Data& out, escript::Data& in) const;
194 caltinay 3755 virtual void dofToNodes(escript::Data& out, escript::Data& in) const;
195 caltinay 3691
196     private:
197     void populateSampleIds();
198 caltinay 3756 void createPattern();
199 caltinay 3691
200     /// total number of elements in each dimension
201     dim_t m_gNE0, m_gNE1;
202    
203     /// side lengths of domain
204     double m_l0, m_l1;
205    
206     /// number of spatial subdivisions
207     int m_NX, m_NY;
208    
209     /// number of elements for this rank in each dimension
210     dim_t m_NE0, m_NE1;
211    
212     /// number of nodes for this rank in each dimension
213     dim_t m_N0, m_N1;
214    
215     /// first node on this rank is at (offset0,offset1) in global mesh
216     dim_t m_offset0, m_offset1;
217    
218 caltinay 3704 /// faceOffset[i]=-1 if face i is not an external face, otherwise it is
219     /// the index of that face (where i: 0=left, 1=right, 2=bottom, 3=top)
220     IndexVector m_faceOffset;
221    
222 caltinay 3691 /// vector of sample reference identifiers
223 caltinay 3750 IndexVector m_dofId;
224 caltinay 3691 IndexVector m_nodeId;
225     IndexVector m_elementId;
226     IndexVector m_faceId;
227 caltinay 3697
228     // vector with first node id on each rank
229     IndexVector m_nodeDistribution;
230 caltinay 3752
231 caltinay 3756 // vector that maps each node to a DOF index (used for the coupler)
232     IndexVector m_dofMap;
233    
234     // Paso connector used by the system matrix and to interpolate DOF to
235     // nodes
236     Paso_Connector* m_connector;
237    
238     // the Paso System Matrix pattern
239     Paso_SystemMatrixPattern* m_pattern;
240 caltinay 3691 };
241    
242     } // end of namespace ripley
243    
244     #endif // __RIPLEY_RECTANGLE_H__
245    

  ViewVC Help
Powered by ViewVC 1.1.26