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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3755 - (hide annotations)
Thu Jan 5 06:51:31 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: 6868 byte(s)
Made element IDs globally unique so ownSample can work (to be implemented).
Fixed couple block in 3D so PDEs seem to work now with MPI :-)

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_BRICK_H__
15     #define __RIPLEY_BRICK_H__
16    
17     #include <ripley/RipleyDomain.h>
18    
19     namespace ripley {
20    
21     /**
22     \brief
23     Brick is the 3-dimensional implementation of a RipleyDomain.
24     */
25     class Brick: public RipleyDomain
26     {
27     public:
28    
29     /**
30     \brief creates a hexagonal mesh with n0 x n1 x n2 elements over the
31     brick [0,l0] x [0,l1] x [0,l2].
32     \param n0,n1,n2 number of elements in each dimension
33     \param l0,l1,l2 length of each side of brick
34     \param d0,d1,d2 number of subdivisions in each dimension
35     */
36     RIPLEY_DLL_API
37     Brick(int n0, int n1, int n2, double l0, double l1, double l2, int d0,
38     int d1, int d2);
39    
40     /**
41     \brief
42     Destructor.
43     */
44     RIPLEY_DLL_API
45     ~Brick();
46    
47     /**
48     \brief
49     returns a description for this domain
50     */
51     RIPLEY_DLL_API
52     virtual std::string getDescription() const;
53    
54     /**
55     \brief equality operator
56     */
57     RIPLEY_DLL_API
58     virtual bool operator==(const escript::AbstractDomain& other) const;
59    
60     /**
61     \brief
62     dumps the mesh to a file with the given name
63     \param filename The name of the output file
64     */
65     RIPLEY_DLL_API
66     void dump(const std::string& filename) const;
67    
68     /**
69     \brief
70     returns the reference number of the given sample number
71     \param fsType The function space type
72     */
73     RIPLEY_DLL_API
74     const int* borrowSampleReferenceIDs(int fsType) const;
75    
76     /**
77     \brief
78     returns true if this rank owns the sample id.
79     */
80     RIPLEY_DLL_API
81     virtual bool ownSample(int fs_code, index_t id) const;
82    
83     /**
84     \brief
85 caltinay 3703 copies the gradient of 'in' into 'out'. The actual function space to be
86     considered for the gradient is defined by 'in'. Both arguments have to
87     be defined on this domain.
88     */
89     RIPLEY_DLL_API
90     virtual void setToGradient(escript::Data& out, const escript::Data& in) const;
91    
92     /**
93     \brief
94 caltinay 3713 copies the integrals of the function defined by arg into integrals.
95     arg has to be defined on this domain.
96     */
97     RIPLEY_DLL_API
98     virtual void setToIntegrals(std::vector<double>& integrals, const escript::Data& arg) const;
99    
100     /**
101     \brief
102 caltinay 3722 copies the surface normals at data points into out. The actual function
103     space to be considered is defined by out. out has to be defined on this
104     domain.
105     */
106     RIPLEY_DLL_API
107     virtual void setToNormal(escript::Data& out) const;
108    
109     /**
110     \brief
111 caltinay 3691 returns the number of data points summed across all MPI processes
112     */
113     RIPLEY_DLL_API
114     virtual int getNumDataPointsGlobal() const { return (m_gNE0+1)*(m_gNE1+1)*(m_gNE2+1); }
115    
116     /**
117     \brief
118     writes information about the mesh to standard output
119     \param full whether to print additional data
120     */
121     RIPLEY_DLL_API
122     virtual void Print_Mesh_Info(const bool full=false) const;
123    
124 caltinay 3698 /**
125     \brief
126     returns the number of nodes per MPI rank in each dimension
127     */
128     RIPLEY_DLL_API
129     virtual IndexVector getNumNodesPerDim() const;
130    
131     /**
132     \brief
133     returns the number of elements per MPI rank in each dimension
134     */
135     RIPLEY_DLL_API
136     virtual IndexVector getNumElementsPerDim() const;
137    
138     /**
139     \brief
140     returns the number of face elements in the order
141     (left,right,bottom,top,[front,back]) on current MPI rank
142     */
143     RIPLEY_DLL_API
144     virtual IndexVector getNumFacesPerBoundary() const;
145    
146     /**
147     \brief
148     returns the node distribution vector
149     */
150     RIPLEY_DLL_API
151     virtual IndexVector getNodeDistribution() const { return m_nodeDistribution; }
152    
153     /**
154     \brief
155     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 3691 virtual void assembleCoordinates(escript::Data& arg) const;
167 caltinay 3754 virtual void assemblePDESingle(Paso_SystemMatrix* mat, escript::Data& rhs,
168     const escript::Data& A, const escript::Data& B,
169     const escript::Data& C, const escript::Data& D,
170     const escript::Data& X, const escript::Data& Y,
171     const escript::Data& d, const escript::Data& y) const;
172 caltinay 3691 virtual Paso_SystemMatrixPattern* getPattern(bool reducedRowOrder, bool reducedColOrder) const;
173 caltinay 3711 virtual void interpolateNodesOnElements(escript::Data& out,
174     escript::Data& in, bool reduced) const;
175     virtual void interpolateNodesOnFaces(escript::Data& out, escript::Data& in,
176     bool reduced) const;
177 caltinay 3753 virtual void nodesToDOF(escript::Data& out, escript::Data& in) const;
178 caltinay 3755 virtual void dofToNodes(escript::Data& out, escript::Data& in) const;
179 caltinay 3691
180     private:
181     void populateSampleIds();
182 caltinay 3754 int insertNeighbours(IndexVector& index, index_t node) const;
183     void addToSystemMatrix(Paso_SystemMatrix* in, const IndexVector& nodes_Eq,
184     dim_t num_Eq, const IndexVector& nodes_Sol, dim_t num_Sol,
185     const std::vector<double>& array) const;
186 caltinay 3691
187     /// total number of elements in each dimension
188     dim_t m_gNE0, m_gNE1, m_gNE2;
189    
190     /// side lengths of domain
191     double m_l0, m_l1, m_l2;
192    
193     /// number of spatial subdivisions
194     int m_NX, m_NY, m_NZ;
195    
196     /// number of elements for this rank in each dimension
197     dim_t m_NE0, m_NE1, m_NE2;
198    
199     /// number of nodes for this rank in each dimension
200     dim_t m_N0, m_N1, m_N2;
201    
202     /// first node on this rank is at (offset0,offset1,offset2) in global mesh
203     dim_t m_offset0, m_offset1, m_offset2;
204    
205 caltinay 3704 /// faceOffset[i]=-1 if face i is not an external face, otherwise it is
206     /// the index of that face (where i: 0=left, 1=right, 2=bottom, 3=top,
207     /// 4=front, 5=back)
208     IndexVector m_faceOffset;
209    
210 caltinay 3691 /// vector of sample reference identifiers
211 caltinay 3753 IndexVector m_dofId;
212 caltinay 3691 IndexVector m_nodeId;
213     IndexVector m_elementId;
214     IndexVector m_faceId;
215 caltinay 3698
216     // vector with first node id on each rank
217     IndexVector m_nodeDistribution;
218 caltinay 3754
219     // vector that maps each node to a DOF index for coupling
220     mutable IndexVector m_dofMap;
221 caltinay 3691 };
222    
223     } // end of namespace ripley
224    
225     #endif // __RIPLEY_BRICK_H__
226    

  ViewVC Help
Powered by ViewVC 1.1.26