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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3915 - (hide annotations)
Mon Jun 25 02:17:58 2012 UTC (7 years, 2 months ago) by caltinay
File MIME type: text/plain
File size: 8395 byte(s)
Added declspecs for all ripley classes.

1 caltinay 3691
2     /*******************************************************
3     *
4 caltinay 3764 * Copyright (c) 2003-2012 by University of Queensland
5 caltinay 3691 * 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 caltinay 3915 class RIPLEY_DLL_API Rectangle: public RipleyDomain
28 caltinay 3691 {
29     public:
30    
31     /**
32     \brief creates a rectangular mesh with n0 x n1 elements over the
33 caltinay 3781 rectangle [x0,x1] x [y0,y1].
34 caltinay 3691 \param n0,n1 number of elements in each dimension
35 caltinay 3781 \param x0,y0,x1,y1 coordinates of bottom-left and top-right corners
36 caltinay 3691 \param d0,d1 number of subdivisions in each dimension
37     */
38 caltinay 3781 Rectangle(int n0, int n1, double x0, double y0, double x1, double y1, int d0, int d1);
39 caltinay 3691
40     /**
41     \brief
42     Destructor.
43     */
44     ~Rectangle();
45    
46     /**
47     \brief
48     returns a description for this domain
49     */
50     virtual std::string getDescription() const;
51    
52     /**
53     \brief equality operator
54     */
55     virtual bool operator==(const escript::AbstractDomain& other) const;
56    
57     /**
58     \brief
59     dumps the mesh to a file with the given name
60     \param filename The name of the output file
61     */
62     void dump(const std::string& filename) const;
63    
64     /**
65     \brief
66     returns the array of reference numbers for a function space type
67     \param fsType The function space type
68     */
69     const int* borrowSampleReferenceIDs(int fsType) const;
70    
71     /**
72     \brief
73     returns true if this rank owns the sample id.
74     */
75     virtual bool ownSample(int fs_code, index_t id) const;
76    
77     /**
78     \brief
79 caltinay 3722 copies the surface normals at data points into out. The actual function
80     space to be considered is defined by out. out has to be defined on this
81     domain.
82     */
83     virtual void setToNormal(escript::Data& out) const;
84    
85     /**
86     \brief
87 caltinay 3760 copies the size of samples into out. The actual function space to be
88     considered is defined by out. out has to be defined on this domain.
89     */
90     virtual void setToSize(escript::Data& out) const;
91    
92     /**
93     \brief
94 caltinay 3691 returns the number of data points summed across all MPI processes
95     */
96     virtual int getNumDataPointsGlobal() const { return (m_gNE0+1)*(m_gNE1+1); }
97    
98     /**
99     \brief
100     writes information about the mesh to standard output
101     \param full whether to print additional data
102     */
103     virtual void Print_Mesh_Info(const bool full=false) const;
104    
105 caltinay 3697 /**
106     \brief
107     returns the number of nodes per MPI rank in each dimension
108     */
109     virtual IndexVector getNumNodesPerDim() const;
110    
111     /**
112     \brief
113     returns the number of elements per MPI rank in each dimension
114     */
115     virtual IndexVector getNumElementsPerDim() const;
116    
117     /**
118     \brief
119     returns the number of face elements in the order
120     (left,right,bottom,top,[front,back]) on current MPI rank
121     */
122     virtual IndexVector getNumFacesPerBoundary() const;
123    
124     /**
125     \brief
126     returns the node distribution vector
127     */
128     virtual IndexVector getNodeDistribution() const { return m_nodeDistribution; }
129    
130     /**
131     \brief
132 caltinay 3766 returns the number of spatial subdivisions in each dimension
133     */
134     virtual IndexVector getNumSubdivisionsPerDim() const;
135    
136     /**
137     \brief
138 caltinay 3697 returns the first coordinate value and the node spacing along given
139     dimension as a pair
140     */
141     virtual std::pair<double,double> getFirstCoordAndSpacing(dim_t dim) const;
142    
143 caltinay 3691 protected:
144     virtual dim_t getNumNodes() const { return m_N0*m_N1; }
145     virtual dim_t getNumElements() const { return m_NE0*m_NE1; }
146 caltinay 3756 virtual dim_t getNumFaceElements() const;
147 caltinay 3750 virtual dim_t getNumDOF() const;
148 caltinay 3756 virtual dim_t insertNeighbourNodes(IndexVector& index, index_t node) const;
149 caltinay 3691 virtual void assembleCoordinates(escript::Data& arg) const;
150 caltinay 3764 virtual void assembleGradient(escript::Data& out, escript::Data& in) const;
151     virtual void assembleIntegrate(std::vector<double>& integrals, escript::Data& arg) const;
152 caltinay 3748 virtual void assemblePDESingle(Paso_SystemMatrix* mat, escript::Data& rhs,
153     const escript::Data& A, const escript::Data& B,
154     const escript::Data& C, const escript::Data& D,
155 caltinay 3769 const escript::Data& X, const escript::Data& Y) const;
156     virtual void assemblePDEBoundarySingle(Paso_SystemMatrix* mat,
157 caltinay 3776 escript::Data& rhs, const escript::Data& d,
158     const escript::Data& y) const;
159 caltinay 3762 virtual void assemblePDESingleReduced(Paso_SystemMatrix* mat,
160     escript::Data& rhs, const escript::Data& A, const escript::Data& B,
161     const escript::Data& C, const escript::Data& D,
162 caltinay 3769 const escript::Data& X, const escript::Data& Y) const;
163     virtual void assemblePDEBoundarySingleReduced(Paso_SystemMatrix* mat,
164 caltinay 3776 escript::Data& rhs, const escript::Data& d,
165     const escript::Data& y) const;
166 caltinay 3760 virtual void assemblePDESystem(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 caltinay 3769 const escript::Data& X, const escript::Data& Y) const;
170     virtual void assemblePDEBoundarySystem(Paso_SystemMatrix* mat,
171 caltinay 3776 escript::Data& rhs, const escript::Data& d,
172     const escript::Data& y) const;
173 caltinay 3762 virtual void assemblePDESystemReduced(Paso_SystemMatrix* mat,
174     escript::Data& rhs, const escript::Data& A, const escript::Data& B,
175     const escript::Data& C, const escript::Data& D,
176 caltinay 3769 const escript::Data& X, const escript::Data& Y) const;
177     virtual void assemblePDEBoundarySystemReduced(Paso_SystemMatrix* mat,
178 caltinay 3776 escript::Data& rhs, const escript::Data& d,
179     const escript::Data& y) const;
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 3776 void addToMatrixAndRHS(Paso_SystemMatrix* S, escript::Data& F,
192     const std::vector<double>& EM_S, const std::vector<double>& EM_F,
193     bool addS, bool addF, index_t firstNode, dim_t nEq=1, dim_t nComp=1) const;
194 caltinay 3691
195     /// total number of elements in each dimension
196     dim_t m_gNE0, m_gNE1;
197    
198 caltinay 3781 /// location of domain
199     double m_x0, m_y0;
200    
201 caltinay 3691 /// side lengths of domain
202     double m_l0, m_l1;
203    
204     /// number of spatial subdivisions
205     int m_NX, m_NY;
206    
207 caltinay 3764 /// number of elements for this rank in each dimension including shared
208 caltinay 3691 dim_t m_NE0, m_NE1;
209    
210 caltinay 3764 /// number of own elements for this rank in each dimension
211     dim_t m_ownNE0, m_ownNE1;
212    
213 caltinay 3691 /// number of nodes for this rank in each dimension
214     dim_t m_N0, m_N1;
215    
216     /// first node on this rank is at (offset0,offset1) in global mesh
217     dim_t m_offset0, m_offset1;
218    
219 caltinay 3704 /// faceOffset[i]=-1 if face i is not an external face, otherwise it is
220     /// the index of that face (where i: 0=left, 1=right, 2=bottom, 3=top)
221     IndexVector m_faceOffset;
222    
223 caltinay 3691 /// vector of sample reference identifiers
224 caltinay 3750 IndexVector m_dofId;
225 caltinay 3691 IndexVector m_nodeId;
226     IndexVector m_elementId;
227     IndexVector m_faceId;
228 caltinay 3697
229     // vector with first node id on each rank
230     IndexVector m_nodeDistribution;
231 caltinay 3752
232 caltinay 3756 // vector that maps each node to a DOF index (used for the coupler)
233     IndexVector m_dofMap;
234    
235     // Paso connector used by the system matrix and to interpolate DOF to
236     // nodes
237     Paso_Connector* m_connector;
238    
239     // the Paso System Matrix pattern
240     Paso_SystemMatrixPattern* m_pattern;
241 caltinay 3691 };
242    
243     } // end of namespace ripley
244    
245     #endif // __RIPLEY_RECTANGLE_H__
246    

  ViewVC Help
Powered by ViewVC 1.1.26