9#ifndef DUNE_MMESH_REMESHING_DISTANCE_HH
10#define DUNE_MMESH_REMESHING_DISTANCE_HH
13#include <dune/common/exceptions.hh>
14#include <dune/grid/common/partitionset.hh>
27 static constexpr int dim = Grid::dimensionworld;
28 using ctype =
typename Grid::ctype;
29 using GlobalCoordinate = FieldVector<ctype, dim>;
30 using Vertex =
typename Grid::Vertex;
31 using Element =
typename Grid::template Codim<0>::Entity;
32 using Facet =
typename Grid::template Codim<1>::Entity;
33 using InterfaceElement =
typename Grid::InterfaceGrid::template Codim<0>::Entity;
41 : grid_( &grid ), initialized_(false)
48 distances_.resize( indexSet().
size(dim) );
49 std::fill(distances_.begin(), distances_.end(), 1e100);
53 for (
const InterfaceElement& ielement : elements( grid_->interfaceGrid().leafGridView(), Partitions::interior ) )
56 const Facet facet = grid_->entity( ielement.impl().hostEntity() );
79 assert( indexSet().index( vertex ) <
size() );
80 return distances_[ indexSet().index( vertex ) ];
89 void set(
const Vertex& vertex, ctype value)
91 assert( indexSet().index( vertex ) <
size() );
92 distances_[ indexSet().index( vertex ) ] = value;
102 assert(initialized_);
104 for ( std::size_t i = 0; i < dim+1; ++i )
106 const auto& vertex = element.template subEntity<dim>(i);
107 dist += distances_[ indexSet().index( vertex ) ];
124 template<
class Index >
127 assert(initialized_);
128 return distances_[ index ];
134 assert(initialized_);
136 for (
const auto& d : distances_ )
144 assert(initialized_);
145 return distances_.size();
150 void handleFacet(
const Facet& facet)
152 for (
const auto& v : vertices(grid_->leafGridView(), Partitions::interior))
154 ctype dist = computeDistance(v, facet);
155 ctype ¤tDist = distances_[ indexSet().index( v ) ];
156 if (dist < currentDist)
162 ctype computeDistance(
const Vertex& v,
const Facet &facet)
const
164 GlobalCoordinate vp = v.geometry().center();
165 const auto& geo = facet.geometry();
167 if constexpr (dim == 2)
169 for (std::size_t i = 0; i < dim; ++i)
171 const GlobalCoordinate& vi = geo.corner(i);
172 const GlobalCoordinate& vj = geo.corner(1-i);
173 ctype sgn = (vi - vj) * (vp - vi);
175 return (vp - vi).two_norm();
178 Dune::Plane<GlobalCoordinate> plane (geo.corner(0), geo.corner(1));
179 return std::abs(plane.signedDistance(vp));
185 for (std::size_t i = 0; i < dim; ++i)
187 const GlobalCoordinate& vi = geo.corner(i);
188 dist = std::min(dist, (vp - vi).two_norm2());
190 const GlobalCoordinate& vj = geo.corner((i+1)%dim);
191 dist = std::min(dist, (vp - 0.5*(vi+vj)).two_norm2());
194 const GlobalCoordinate& vc = geo.center();
195 dist = std::min(dist, (vp - vc).two_norm2());
197 return std::sqrt(dist);
200 DUNE_THROW(InvalidStateException,
"Compute distance failed");
204 const typename Grid::LeafIndexSet& indexSet()
const
206 return grid_->leafIndexSet();
209 std::vector<ctype> distances_;
Class for computing the distance to the interface.
Definition: distance.hh:25
bool initialized() const
Return if distance has been initialized.
Definition: distance.hh:66
ctype operator[](const Index &index) const
function call operator to return distance
Definition: distance.hh:125
void update()
Update the distances of all vertices.
Definition: distance.hh:45
ctype maximum() const
return maximum distance
Definition: distance.hh:132
std::size_t size() const
return size of distances vector
Definition: distance.hh:142
Distance(const Grid &grid)
Constructor with grid reference.
Definition: distance.hh:40
Distance()
Default constructor.
Definition: distance.hh:37
void set(const Vertex &vertex, ctype value)
Set distance of vertex.
Definition: distance.hh:89
ctype operator()(const Vertex &vertex) const
function call operator to return distance of vertex
Definition: distance.hh:76