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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3701 - (hide annotations)
Fri Dec 2 02:04:58 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: 5498 byte(s)
Prepared interpolation methods.

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

  ViewVC Help
Powered by ViewVC 1.1.26