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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3766 - (hide annotations)
Thu Jan 12 08:17:49 2012 UTC (7 years, 8 months ago) by caltinay
Original Path: branches/ripleygmg_from_3668/ripley/src/Brick.h
File MIME type: text/plain
File size: 8058 byte(s)
Checkpoint. Getting weipa to like ripley again.

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

  ViewVC Help
Powered by ViewVC 1.1.26