9#ifndef DUNE_MMESH_INTERFACE_CURVATUREOPERATOR_HH
10#define DUNE_MMESH_INTERFACE_CURVATUREOPERATOR_HH
13#include <dune/common/dynvector.hh>
14#include <dune/common/dynmatrix.hh>
40template<
class IGr
idView,
class IGr
idMapper, CurvatureLayout CL = Vertex>
44 static constexpr int dim = IGridView::dimensionworld;
45 using Scalar =
typename IGridView::ctype;
46 using Vector = Dune::FieldVector<Scalar, dim>;
56 : iGridView_(iGridView), iGridMapper_(iGridMapper) {};
70 template<
class Curvatures,
class Centers, CurvatureLayout Layout = CL>
71 std::enable_if_t<Layout == Vertex, void>
72 operator() (Curvatures& curvatures, Centers& centers)
const
75 std::vector<Vector> vertexPoints;
78 for (
const auto& vertex : vertices(iGridView_))
80 const int iVertexIdx = iGridMapper_.index(vertex);
82 vertexPoints.push_back(vertex.geometry().center());
84 for (
const auto& incidentVertex : incidentInterfaceVertices(vertex))
86 vertexPoints.push_back(incidentVertex.geometry().center());
91 curvatures[iVertexIdx] = 1.0 / getRadius(vertexPoints, center);
92 centers[iVertexIdx] = center;
96 template<
class Curvatures,
class Centers, CurvatureLayout Layout = CL>
97 std::enable_if_t<Layout == Element, void>
98 operator() (Curvatures& curvatures, Centers& centers)
const
101 std::vector<Vector> vertexPoints;
104 for (
const auto& iElem : elements(iGridView_))
106 int iElemIdx = iGridMapper_.index(iElem);
107 vertexPoints.clear();
109 for (
const auto& intersct : intersections(iGridView_, iElem))
111 const auto& neighborGeo = intersct.outside().geometry();
113 for (
int i = 0; i < neighborGeo.corners(); i++)
115 if (std::find(vertexPoints.begin(), vertexPoints.end(),
116 neighborGeo.corner(i)) == vertexPoints.end())
118 vertexPoints.push_back(neighborGeo.corner(i));
125 curvatures[iElemIdx] = 1.0 / getRadius(vertexPoints, center);
126 centers[iElemIdx] = center;
141 template<
class Po
ints >
142 double getRadius (
const Points& points, Vector& center)
const
144 using LargeVector = Dune::FieldVector<Scalar, dim+1>;
145 using Matrix = Dune::FieldMatrix<Scalar, dim+1, dim+1>;
146 using LargeDynVector = Dune::DynamicVector<Scalar>;
147 using DynMatrix = Dune::DynamicMatrix<Scalar>;
149 LargeDynVector b(points.size(), 0.0);
150 DynMatrix A(points.size(), dim+1, 0.0);
152 LargeVector ATb(0.0);
155 for (
unsigned int i = 0; i < points.size(); i++)
157 b[i] = -points[i].two_norm2();
160 for (
int j = 0; j < dim; j++)
162 A[i][j+1] = points[i][j];
168 for (
int i = 0; i <= dim; i++)
169 for (
int j = 0; j <= dim; j++)
170 for (std::size_t k = 0; k < points.size(); k ++)
171 ATA[i][j] += A[k][i] * A[k][j];
173 if (std::abs( ATA.determinant() ) > epsilon)
178 for (
int j = 1; j <= dim; j++)
181 center[j-1] = -0.5*x[j];
184 r = sqrt(std::abs(0.25*r - x[0]));
189 return std::numeric_limits<double>::infinity();
193 const IGridView& iGridView_;
195 const IGridMapper& iGridMapper_;
198 static constexpr double epsilon = std::numeric_limits<double>::epsilon();
Class defining an operator that assigns a curvature to each element or each vertex of the interface g...
Definition: curvatureoperator.hh:42
std::enable_if_t< Layout==Vertex, void > operator()(Curvatures &curvatures, Centers ¢ers) const
Operator that assigns a curvature to each element or each vertex of the interface grid....
Definition: curvatureoperator.hh:72
CurvatureOperator(const IGridView &iGridView, const IGridMapper &iGridMapper)
Constructor.
Definition: curvatureoperator.hh:55
CurvatureLayout
used as template parameter that determines whether the curvature is approximated at the elemets or th...
Definition: curvatureoperator.hh:24