Mesh Oriented datABase  (version 5.5.1)
An array-based unstructured mesh library
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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  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, 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  */ 56  ~LloydSmoother(); 57  58  /* \brief perform smoothing operation 59  */ 60  ErrorCode perform_smooth(); 61  62  /* \brief get instance 63  */ 64  Interface* mb_impl() 65  { 66  return mbImpl; 67  } 68  69  /* \brief get/set ParallelComm 70  */ 71  ParallelComm* pcomm() 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  */ 85  Range& elems() 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  */ 99  Tag fixed_tag() 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  */ 113  Tag coords_tag() 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  */ 166  int report_its() 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 177  ErrorCode initialize(); 178  179  //- MOAB instance 180  Interface* mbImpl; 181  182  //- ParallelComm 183  ParallelComm* myPcomm; 184  185  //- elements to smooth 186  Range myElems; 187  188  //- tag for coordinates; if zero, true vertex coords are used 189  Tag coordsTag; 190  191  //- tag marking which vertices are fixed, 0 = not fixed, otherwise fixed 192  Tag fixedTag; 193  194  //- tolerances 195  double absTol, relTol; 196  197  //- number of iterations between reporting 198  int reportIts; 199  200  //- number of iterations taken during smooth 201  int numIts; 202  203  //- keep track of whether I created the fixed tag 204  bool iCreatedTag; 205 }; 206  207 } // namespace moab 208  209 #endif