Mesh Oriented datABase  (version 5.5.1)
An array-based unstructured mesh library
LloydSmoother.hpp
Go to the documentation of this file.
1 /** @class LloydSmoother.cpp \n
2  * \brief Perform Lloyd relaxation on a mesh and its dual \n
3  *
4  * Briefly, Lloyd relaxation is a technique to smooth out a mesh. The centroid of each cell is
5  * computed from its vertex positions, then vertices are placed at the average of their connected
6  * cells' centroids, and the process iterates until convergence.
7  *
8  * In the parallel algorithm, an extra ghost layer of cells is exchanged. This allows us to compute
9  * the centroids for boundary cells on each processor where they appear; this eliminates the need
10  * for one round of data exchange (for those centroids) between processors. New vertex positions
11  * must be sent from owning processors to processors sharing those vertices. Convergence is
12  * measured as the maximum distance moved by any vertex.
13  *
14  */
15 
16 #ifndef LLOYDSMOOTHER_HPP
17 #define LLOYDSMOOTHER_HPP
18 
19 #include "moab/Interface.hpp"
20 
21 namespace moab
22 {
23 
24 class ParallelComm;
25 
27 {
28  public:
29  /* \brief Constructor
30  * Bare constructor, data input to this class through methods.
31  * \param impl The MOAB instance for this smoother
32  */
34 
35  /* \brief Constructor
36  * Convenience constructor, data input directly
37  * \param impl The MOAB instance for this smoother
38  * \param pc The ParallelComm instance by which this mesh is parallel
39  * \param elems The mesh to be smoothed
40  * \param cds_tag If specified, this tag is used to get/set coordinates, rather than
41  * true vertex coordinates
42  * \param fixed_tag The tag marking which vertices are fixed
43  * \param abs_tol Absolute tolerance measuring convergence
44  * \param rel_tol Relative tolerance measuring convergence
45  */
46  LloydSmoother( Interface* impl,
47  ParallelComm* pc,
48  Range& elems,
49  Tag cds_tag = 0,
50  Tag fixed_tag = 0,
51  double abs_tol = -1.0,
52  double rel_tol = 1.0e-6 );
53 
54  /* \brief Destructor
55  */
57 
58  /* \brief perform smoothing operation
59  */
61 
62  /* \brief get instance
63  */
65  {
66  return mbImpl;
67  }
68 
69  /* \brief get/set ParallelComm
70  */
72  {
73  return myPcomm;
74  }
75 
76  /* \brief get/set ParallelComm
77  */
78  void pcomm( ParallelComm* pc )
79  {
80  myPcomm = pc;
81  }
82 
83  /* \brief get/set elements
84  */
86  {
87  return myElems;
88  }
89 
90  /* \brief get/set elements
91  */
92  const Range& elems() const
93  {
94  return myElems;
95  }
96 
97  /* \brief get/set fixed tag
98  */
100  {
101  return fixedTag;
102  }
103 
104  /* \brief get/set fixed tag
105  */
106  void fixed_tag( Tag fixed )
107  {
108  fixedTag = fixed;
109  }
110 
111  /* \brief get/set coords tag
112  */
114  {
115  return coordsTag;
116  }
117 
118  /* \brief get/set coords tag
119  */
120  void coords_tag( Tag coords )
121  {
122  coordsTag = coords;
123  }
124 
125  /* \brief get/set tolerance
126  */
127  double abs_tol()
128  {
129  return absTol;
130  }
131 
132  /* \brief get/set tolerance
133  */
134  void abs_tol( double tol )
135  {
136  absTol = tol;
137  }
138 
139  /* \brief get/set tolerance
140  */
141  double rel_tol()
142  {
143  return relTol;
144  }
145 
146  /* \brief get/set tolerance
147  */
148  void rel_tol( double tol )
149  {
150  relTol = tol;
151  }
152 
153  /* \brief get/set numIts
154  */
155  int num_its()
156  {
157  return numIts;
158  }
159  void num_its( int num )
160  {
161  numIts = num;
162  }
163 
164  /* \brief get/set reportIts
165  */
167  {
168  return reportIts;
169  }
170  void report_its( int num )
171  {
172  reportIts = num;
173  }
174 
175  private:
176  //- initialize some things in certain cases
178 
179  //- MOAB instance
181 
182  //- ParallelComm
184 
185  //- elements to smooth
187 
188  //- tag for coordinates; if zero, true vertex coords are used
190 
191  //- tag marking which vertices are fixed, 0 = not fixed, otherwise fixed
193 
194  //- tolerances
195  double absTol, relTol;
196 
197  //- number of iterations between reporting
199 
200  //- number of iterations taken during smooth
201  int numIts;
202 
203  //- keep track of whether I created the fixed tag
205 };
206 
207 } // namespace moab
208 
209 #endif