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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3713 - (hide annotations)
Tue Dec 6 04:43:29 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: 5688 byte(s)
Integrals in 2D and 3D for rectangle & brick elements & face elements in
regular and reduced orders.

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 3691 returns the number of data points summed across all MPI processes
103     */
104     RIPLEY_DLL_API
105     virtual int getNumDataPointsGlobal() const { return (m_gNE0+1)*(m_gNE1+1)*(m_gNE2+1); }
106    
107     /**
108     \brief
109     writes information about the mesh to standard output
110     \param full whether to print additional data
111     */
112     RIPLEY_DLL_API
113     virtual void Print_Mesh_Info(const bool full=false) const;
114    
115 caltinay 3698 /**
116     \brief
117     returns the number of nodes per MPI rank in each dimension
118     */
119     RIPLEY_DLL_API
120     virtual IndexVector getNumNodesPerDim() const;
121    
122     /**
123     \brief
124     returns the number of elements per MPI rank in each dimension
125     */
126     RIPLEY_DLL_API
127     virtual IndexVector getNumElementsPerDim() const;
128    
129     /**
130     \brief
131     returns the number of face elements in the order
132     (left,right,bottom,top,[front,back]) on current MPI rank
133     */
134     RIPLEY_DLL_API
135     virtual IndexVector getNumFacesPerBoundary() const;
136    
137     /**
138     \brief
139     returns the node distribution vector
140     */
141     RIPLEY_DLL_API
142     virtual IndexVector getNodeDistribution() const { return m_nodeDistribution; }
143    
144     /**
145     \brief
146     returns the first coordinate value and the node spacing along given
147     dimension as a pair
148     */
149     RIPLEY_DLL_API
150     virtual std::pair<double,double> getFirstCoordAndSpacing(dim_t dim) const;
151    
152 caltinay 3691 protected:
153     virtual dim_t getNumNodes() const { return m_N0*m_N1*m_N2; }
154     virtual dim_t getNumElements() const { return m_NE0*m_NE1*m_NE2; }
155     virtual dim_t getNumFaceElements() const;
156     virtual void assembleCoordinates(escript::Data& arg) const;
157     virtual Paso_SystemMatrixPattern* getPattern(bool reducedRowOrder, bool reducedColOrder) const;
158 caltinay 3711 virtual void interpolateNodesOnElements(escript::Data& out,
159     escript::Data& in, bool reduced) const;
160     virtual void interpolateNodesOnFaces(escript::Data& out, escript::Data& in,
161     bool reduced) const;
162 caltinay 3691
163     private:
164     void populateSampleIds();
165    
166     /// total number of elements in each dimension
167     dim_t m_gNE0, m_gNE1, m_gNE2;
168    
169     /// side lengths of domain
170     double m_l0, m_l1, m_l2;
171    
172     /// number of spatial subdivisions
173     int m_NX, m_NY, m_NZ;
174    
175     /// number of elements for this rank in each dimension
176     dim_t m_NE0, m_NE1, m_NE2;
177    
178     /// number of nodes for this rank in each dimension
179     dim_t m_N0, m_N1, m_N2;
180    
181     /// first node on this rank is at (offset0,offset1,offset2) in global mesh
182     dim_t m_offset0, m_offset1, m_offset2;
183    
184 caltinay 3704 /// faceOffset[i]=-1 if face i is not an external face, otherwise it is
185     /// the index of that face (where i: 0=left, 1=right, 2=bottom, 3=top,
186     /// 4=front, 5=back)
187     IndexVector m_faceOffset;
188    
189 caltinay 3691 /// vector of sample reference identifiers
190     IndexVector m_nodeId;
191     IndexVector m_elementId;
192     IndexVector m_faceId;
193 caltinay 3698
194     // vector with first node id on each rank
195     IndexVector m_nodeDistribution;
196 caltinay 3691 };
197    
198     } // end of namespace ripley
199    
200     #endif // __RIPLEY_BRICK_H__
201    

  ViewVC Help
Powered by ViewVC 1.1.26