LCOV - code coverage report
Current view: top level - src/moab - LloydSmoother.hpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 5 5 100.0 %
Date: 2020-12-16 07:07:30 Functions: 2 2 100.0 %
Branches: 0 0 -

           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

Generated by: LCOV version 1.11