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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3713 - (hide annotations)
Tue Dec 6 04:43:29 2011 UTC (7 years, 9 months ago) by caltinay
Original Path: branches/ripleygmg_from_3668/ripley/src/Rectangle.h
File MIME type: text/plain
File size: 6377 byte(s)
Integrals in 2D and 3D for rectangle & brick elements & face elements in
regular and reduced orders.

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

  ViewVC Help
Powered by ViewVC 1.1.26