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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3744 - (hide annotations)
Tue Dec 13 06:41:54 2011 UTC (7 years, 9 months ago) by caltinay
Original Path: branches/ripleygmg_from_3668/ripley/src/Brick.h
File MIME type: text/plain
File size: 6003 byte(s)
Implemented (Face)Elements->Reduced(Face)Elements interpolation and started
separating DOF and nodes.
Also, implemented operator==() so that a==b for different domain objects a and
b which are in the same state.

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 3744 virtual dim_t getNumDOF() const;
166 caltinay 3691 virtual void assembleCoordinates(escript::Data& arg) const;
167     virtual Paso_SystemMatrixPattern* getPattern(bool reducedRowOrder, bool reducedColOrder) const;
168 caltinay 3711 virtual void interpolateNodesOnElements(escript::Data& out,
169     escript::Data& in, bool reduced) const;
170     virtual void interpolateNodesOnFaces(escript::Data& out, escript::Data& in,
171     bool reduced) const;
172 caltinay 3691
173     private:
174     void populateSampleIds();
175    
176     /// total number of elements in each dimension
177     dim_t m_gNE0, m_gNE1, m_gNE2;
178    
179     /// side lengths of domain
180     double m_l0, m_l1, m_l2;
181    
182     /// number of spatial subdivisions
183     int m_NX, m_NY, m_NZ;
184    
185     /// number of elements for this rank in each dimension
186     dim_t m_NE0, m_NE1, m_NE2;
187    
188     /// number of nodes for this rank in each dimension
189     dim_t m_N0, m_N1, m_N2;
190    
191     /// first node on this rank is at (offset0,offset1,offset2) in global mesh
192     dim_t m_offset0, m_offset1, m_offset2;
193    
194 caltinay 3704 /// faceOffset[i]=-1 if face i is not an external face, otherwise it is
195     /// the index of that face (where i: 0=left, 1=right, 2=bottom, 3=top,
196     /// 4=front, 5=back)
197     IndexVector m_faceOffset;
198    
199 caltinay 3691 /// vector of sample reference identifiers
200     IndexVector m_nodeId;
201     IndexVector m_elementId;
202     IndexVector m_faceId;
203 caltinay 3698
204     // vector with first node id on each rank
205     IndexVector m_nodeDistribution;
206 caltinay 3691 };
207    
208     } // end of namespace ripley
209    
210     #endif // __RIPLEY_BRICK_H__
211    

  ViewVC Help
Powered by ViewVC 1.1.26