Branch data Line data Source code
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 : :
26 : : class LloydSmoother
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 : : */
33 : : LloydSmoother( Interface* impl );
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, ParallelComm* pc, Range& elems, Tag cds_tag = 0, Tag fixed_tag = 0,
47 : : double abs_tol = -1.0, double rel_tol = 1.0e-6 );
48 : :
49 : : /* \brief Destructor
50 : : */
51 : : ~LloydSmoother();
52 : :
53 : : /* \brief perform smoothing operation
54 : : */
55 : : ErrorCode perform_smooth();
56 : :
57 : : /* \brief get instance
58 : : */
59 : : Interface* mb_impl()
60 : : {
61 : : return mbImpl;
62 : : }
63 : :
64 : : /* \brief get/set ParallelComm
65 : : */
66 : : ParallelComm* pcomm()
67 : : {
68 : : return myPcomm;
69 : : }
70 : :
71 : : /* \brief get/set ParallelComm
72 : : */
73 : : void pcomm( ParallelComm* pc )
74 : : {
75 : : myPcomm = pc;
76 : : }
77 : :
78 : : /* \brief get/set elements
79 : : */
80 : : Range& elems()
81 : : {
82 : : return myElems;
83 : : }
84 : :
85 : : /* \brief get/set elements
86 : : */
87 : : const Range& elems() const
88 : : {
89 : : return myElems;
90 : : }
91 : :
92 : : /* \brief get/set fixed tag
93 : : */
94 : : Tag fixed_tag()
95 : : {
96 : : return fixedTag;
97 : : }
98 : :
99 : : /* \brief get/set fixed tag
100 : : */
101 : : void fixed_tag( Tag fixed )
102 : : {
103 : : fixedTag = fixed;
104 : : }
105 : :
106 : : /* \brief get/set coords tag
107 : : */
108 : : Tag coords_tag()
109 : : {
110 : : return coordsTag;
111 : : }
112 : :
113 : : /* \brief get/set coords tag
114 : : */
115 : : void coords_tag( Tag coords )
116 : : {
117 : : coordsTag = coords;
118 : : }
119 : :
120 : : /* \brief get/set tolerance
121 : : */
122 : : double abs_tol()
123 : : {
124 : : return absTol;
125 : : }
126 : :
127 : : /* \brief get/set tolerance
128 : : */
129 : : void abs_tol( double tol )
130 : : {
131 : : absTol = tol;
132 : : }
133 : :
134 : : /* \brief get/set tolerance
135 : : */
136 : : double rel_tol()
137 : : {
138 : : return relTol;
139 : : }
140 : :
141 : : /* \brief get/set tolerance
142 : : */
143 : : void rel_tol( double tol )
144 : : {
145 : : relTol = tol;
146 : : }
147 : :
148 : : /* \brief get/set numIts
149 : : */
150 : 2 : int num_its()
151 : : {
152 : 2 : return numIts;
153 : : }
154 : : void num_its( int num )
155 : : {
156 : : numIts = num;
157 : : }
158 : :
159 : : /* \brief get/set reportIts
160 : : */
161 : : int report_its()
162 : : {
163 : : return reportIts;
164 : : }
165 : 2 : void report_its( int num )
166 : : {
167 : 2 : reportIts = num;
168 : 2 : }
169 : :
170 : : private:
171 : : //- initialize some things in certain cases
172 : : ErrorCode initialize();
173 : :
174 : : //- MOAB instance
175 : : Interface* mbImpl;
176 : :
177 : : //- ParallelComm
178 : : ParallelComm* myPcomm;
179 : :
180 : : //- elements to smooth
181 : : Range myElems;
182 : :
183 : : //- tag for coordinates; if zero, true vertex coords are used
184 : : Tag coordsTag;
185 : :
186 : : //- tag marking which vertices are fixed, 0 = not fixed, otherwise fixed
187 : : Tag fixedTag;
188 : :
189 : : //- tolerances
190 : : double absTol, relTol;
191 : :
192 : : //- number of iterations between reporting
193 : : int reportIts;
194 : :
195 : : //- number of iterations taken during smooth
196 : : int numIts;
197 : :
198 : : //- keep track of whether I created the fixed tag
199 : : bool iCreatedTag;
200 : : };
201 : :
202 : : } // namespace moab
203 : :
204 : : #endif
|