10#ifndef DUNE_MMESH_REMESHING_RATIOINDICATOR_HH
11#define DUNE_MMESH_REMESHING_RATIOINDICATOR_HH
13#include <dune/common/exceptions.hh>
14#include <dune/grid/common/partitionset.hh>
29 static constexpr int dim = Grid::dimensionworld;
30 using ctype =
typename Grid::ctype;
31 using GlobalCoordinate = FieldVector<ctype, dim>;
49 k_(K_ / (2. * edgeRatio_)),
62 void init(
const Grid& grid) {
66 for (
const auto& edge : edges(grid.interfaceGrid().leafGridView())) {
67 const ctype h = edge.geometry().volume();
68 maxH_ = std::max(maxH_, h);
69 minH_ = std::min(minH_, h);
77 for (
const auto& edge : edges(grid.leafGridView())) {
78 const ctype h = edge.geometry().volume();
79 maxh = std::max(maxh, h);
80 minh = std::min(minh, h);
84 if (grid.interfaceGrid().size(1) == 0) {
89 factor_ = maxh / minh;
96 maxDist_ = distProportion_ * distance_.
maximum();
106 template <
class Element>
108 static constexpr int edgeCodim = Element::dimension - 1;
118 ctype dist = std::min(maxDist_, distance_(element));
119 const ctype l = dist / maxDist_;
120 const ctype
minH = (1. - l) * minH_ + l * factor_ * minH_;
121 const ctype
maxH = (1. - l) * maxH_ + l * factor_ * maxH_;
123 for (std::size_t i = 0; i < element.subEntities(edgeCodim); ++i) {
124 const auto& edge = element.template subEntity<edgeCodim>(i);
125 const ctype len = edge.geometry().volume();
127 if (len <
minH) coarse++;
129 if (len >
maxH) refine++;
131 minE = std::min(minE, len);
132 maxE = std::max(maxE, len);
138 const ctype edgeRatio = maxE / minE;
139 if (edgeRatio > edgeRatio_) coarse++;
142 const auto& geo = element.geometry();
143 const ctype innerRadius = dim * geo.volume() / sumE;
144 const ctype outerRadius =
145 (geo.impl().circumcenter() - geo.corner(0)).two_norm();
146 const ctype radiusRatio = outerRadius / (innerRadius * dim);
148 if (radiusRatio > radiusRatio_) coarse++;
156 if (refine > 0)
return 1;
162 ctype edgeRatio()
const {
return edgeRatio_; }
165 ctype
maxH()
const {
return maxH_; }
168 ctype&
maxH() {
return maxH_; }
171 ctype
minH()
const {
return minH_; }
174 ctype&
minH() {
return minH_; }
176 ctype radiusRatio()
const {
return radiusRatio_; }
191 const ctype edgeRatio_;
196 const ctype radiusRatio_;
197 ctype distProportion_;
200 mutable DistanceType distance_;
Class for computing the distance to the interface.
Definition: distance.hh:23
bool initialized() const
Return if distance has been initialized.
Definition: distance.hh:62
void update()
Update the distances of all vertices.
Definition: distance.hh:42
ctype maximum() const
return maximum distance
Definition: distance.hh:118
Class defining an indicator for grid remeshing regarding the edge length ratio. By default,...
Definition: ratioindicator.hh:28
RatioIndicator(ctype h=0.0, ctype distProportion=1.0, ctype factor=1.0)
Calculates the indicator for each grid cell.
Definition: ratioindicator.hh:44
void init(const Grid &grid)
Definition: ratioindicator.hh:62
void update()
Update the distances of all vertices.
Definition: ratioindicator.hh:94
ctype & maxH()
Returns reference to maxH.
Definition: ratioindicator.hh:168
ctype maxH() const
Returns maxH.
Definition: ratioindicator.hh:165
int operator()(const Element &element) const
Function call operator to return mark.
Definition: ratioindicator.hh:107
ctype minH() const
Returns minH.
Definition: ratioindicator.hh:171
ctype & factor()
Returns reference to factor.
Definition: ratioindicator.hh:182
ctype & minH()
Returns reference to minH.
Definition: ratioindicator.hh:174
const DistanceType & distance() const
Returns distance object.
Definition: ratioindicator.hh:185
ctype & distProportion()
Returns reference to distProportion.
Definition: ratioindicator.hh:179
Class for computing the distance to the interface.