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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3792 - (hide annotations)
Wed Feb 1 06:16:25 2012 UTC (7 years, 7 months ago) by caltinay
File MIME type: text/plain
File size: 8842 byte(s)
Merged ripley rectangular domain into trunk.

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 caltinay 3781 brick [x0,x1] x [y0,y1] x [z0,z1].
34 caltinay 3691 \param n0,n1,n2 number of elements in each dimension
35 caltinay 3781 \param x0,y0,z0,x1,y1,z1 coordinates of corner nodes of the brick
36 caltinay 3691 \param d0,d1,d2 number of subdivisions in each dimension
37     */
38     RIPLEY_DLL_API
39 caltinay 3781 Brick(int n0, int n1, int n2, double x0, double y0, double z0, double x1,
40     double y1, double z1, int d0, int d1, int d2);
41 caltinay 3691
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 caltinay 3769 const escript::Data& X, const escript::Data& Y) const;
174     virtual void assemblePDEBoundarySingle(Paso_SystemMatrix* mat,
175     escript::Data& rhs, const escript::Data& d,
176     const escript::Data& y) const;
177 caltinay 3762 virtual void assemblePDESingleReduced(Paso_SystemMatrix* mat,
178     escript::Data& rhs, const escript::Data& A, const escript::Data& B,
179     const escript::Data& C, const escript::Data& D,
180 caltinay 3769 const escript::Data& X, const escript::Data& Y) const;
181     virtual void assemblePDEBoundarySingleReduced(Paso_SystemMatrix* mat,
182     escript::Data& rhs, const escript::Data& d,
183     const escript::Data& y) const;
184 caltinay 3761 virtual void assemblePDESystem(Paso_SystemMatrix* mat, escript::Data& rhs,
185     const escript::Data& A, const escript::Data& B,
186     const escript::Data& C, const escript::Data& D,
187 caltinay 3769 const escript::Data& X, const escript::Data& Y) const;
188     virtual void assemblePDEBoundarySystem(Paso_SystemMatrix* mat,
189     escript::Data& rhs, const escript::Data& d,
190     const escript::Data& y) const;
191 caltinay 3762 virtual void assemblePDESystemReduced(Paso_SystemMatrix* mat,
192     escript::Data& rhs, const escript::Data& A, const escript::Data& B,
193     const escript::Data& C, const escript::Data& D,
194 caltinay 3769 const escript::Data& X, const escript::Data& Y) const;
195     virtual void assemblePDEBoundarySystemReduced(Paso_SystemMatrix* mat,
196     escript::Data& rhs, const escript::Data& d,
197     const escript::Data& y) const;
198 caltinay 3691 virtual Paso_SystemMatrixPattern* getPattern(bool reducedRowOrder, bool reducedColOrder) const;
199 caltinay 3711 virtual void interpolateNodesOnElements(escript::Data& out,
200     escript::Data& in, bool reduced) const;
201     virtual void interpolateNodesOnFaces(escript::Data& out, escript::Data& in,
202     bool reduced) const;
203 caltinay 3753 virtual void nodesToDOF(escript::Data& out, escript::Data& in) const;
204 caltinay 3755 virtual void dofToNodes(escript::Data& out, escript::Data& in) const;
205 caltinay 3691
206     private:
207     void populateSampleIds();
208 caltinay 3756 void createPattern();
209 caltinay 3777 void addToMatrixAndRHS(Paso_SystemMatrix* S, escript::Data& F,
210     const std::vector<double>& EM_S, const std::vector<double>& EM_F,
211     bool addS, bool addF, index_t firstNode, dim_t nEq=1, dim_t nComp=1) const;
212 caltinay 3691
213 caltinay 3777
214 caltinay 3691 /// total number of elements in each dimension
215     dim_t m_gNE0, m_gNE1, m_gNE2;
216    
217 caltinay 3781 /// location of domain
218     double m_x0, m_y0, m_z0;
219    
220 caltinay 3691 /// side lengths of domain
221     double m_l0, m_l1, m_l2;
222    
223     /// number of spatial subdivisions
224     int m_NX, m_NY, m_NZ;
225    
226 caltinay 3764 /// number of elements for this rank in each dimension including shared
227 caltinay 3691 dim_t m_NE0, m_NE1, m_NE2;
228    
229 caltinay 3764 /// number of own elements for this rank in each dimension
230     dim_t m_ownNE0, m_ownNE1, m_ownNE2;
231    
232 caltinay 3691 /// number of nodes for this rank in each dimension
233     dim_t m_N0, m_N1, m_N2;
234    
235     /// first node on this rank is at (offset0,offset1,offset2) in global mesh
236     dim_t m_offset0, m_offset1, m_offset2;
237    
238 caltinay 3704 /// faceOffset[i]=-1 if face i is not an external face, otherwise it is
239     /// the index of that face (where i: 0=left, 1=right, 2=bottom, 3=top,
240     /// 4=front, 5=back)
241     IndexVector m_faceOffset;
242    
243 caltinay 3691 /// vector of sample reference identifiers
244 caltinay 3753 IndexVector m_dofId;
245 caltinay 3691 IndexVector m_nodeId;
246     IndexVector m_elementId;
247     IndexVector m_faceId;
248 caltinay 3698
249     // vector with first node id on each rank
250     IndexVector m_nodeDistribution;
251 caltinay 3754
252 caltinay 3756 // vector that maps each node to a DOF index (used for the coupler)
253     IndexVector m_dofMap;
254    
255     // Paso connector used by the system matrix and to interpolate DOF to
256     // nodes
257     Paso_Connector* m_connector;
258    
259     // the Paso System Matrix pattern
260     Paso_SystemMatrixPattern* m_pattern;
261 caltinay 3691 };
262    
263     } // end of namespace ripley
264    
265     #endif // __RIPLEY_BRICK_H__
266    

  ViewVC Help
Powered by ViewVC 1.1.26