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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3703 - (hide annotations)
Sun Dec 4 23:42:52 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: 5107 byte(s)
Gradient and interpolation on elements for Brick domain.

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

  ViewVC Help
Powered by ViewVC 1.1.26