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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3704 - (show annotations)
Mon Dec 5 01:59:08 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: 5314 byte(s)
Interpolation on faces.

1
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 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 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 /**
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 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 virtual void interpolateNodesOnElements(escript::Data& out, escript::Data& in) const;
151 virtual void interpolateNodesOnFaces(escript::Data& out, escript::Data& in) const;
152
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 /// faceOffset[i]=-1 if face i is not an external face, otherwise it is
175 /// the index of that face (where i: 0=left, 1=right, 2=bottom, 3=top,
176 /// 4=front, 5=back)
177 IndexVector m_faceOffset;
178
179 /// vector of sample reference identifiers
180 IndexVector m_nodeId;
181 IndexVector m_elementId;
182 IndexVector m_faceId;
183
184 // vector with first node id on each rank
185 IndexVector m_nodeDistribution;
186 };
187
188 } // end of namespace ripley
189
190 #endif // __RIPLEY_BRICK_H__
191

  ViewVC Help
Powered by ViewVC 1.1.26