9#ifndef DUNE_MMESH_INTERFACE_CURVATUREOPERATOR_HH
10#define DUNE_MMESH_INTERFACE_CURVATUREOPERATOR_HH
13#include <dune/common/dynmatrix.hh>
14#include <dune/common/dynvector.hh>
35template <
class IGr
idView,
class IGr
idMapper, CurvatureLayout CL = Vertex>
38 static constexpr int dim = IGridView::dimensionworld;
39 using Scalar =
typename IGridView::ctype;
40 using Vector = Dune::FieldVector<Scalar, dim>;
50 : iGridView_(iGridView), iGridMapper_(iGridMapper){};
64 template <
class Curvatures,
class Centers, CurvatureLayout Layout = CL>
65 std::enable_if_t<Layout == Vertex, void>
operator()(Curvatures& curvatures,
66 Centers& centers)
const {
68 std::vector<Vector> vertexPoints;
71 for (
const auto& vertex : vertices(iGridView_)) {
72 const int iVertexIdx = iGridMapper_.index(vertex);
74 vertexPoints.push_back(vertex.geometry().center());
76 for (
const auto& incidentVertex : incidentInterfaceVertices(vertex)) {
77 vertexPoints.push_back(incidentVertex.geometry().center());
82 curvatures[iVertexIdx] = 1.0 / getRadius(vertexPoints, center);
83 centers[iVertexIdx] = center;
87 template <
class Curvatures,
class Centers, CurvatureLayout Layout = CL>
88 std::enable_if_t<Layout == Element, void>
operator()(Curvatures& curvatures,
89 Centers& centers)
const {
91 std::vector<Vector> vertexPoints;
94 for (
const auto& iElem : elements(iGridView_)) {
95 int iElemIdx = iGridMapper_.index(iElem);
98 for (
const auto& intersct : intersections(iGridView_, iElem)) {
99 const auto& neighborGeo = intersct.outside().geometry();
101 for (
int i = 0; i < neighborGeo.corners(); i++) {
102 if (std::find(vertexPoints.begin(), vertexPoints.end(),
103 neighborGeo.corner(i)) == vertexPoints.end()) {
104 vertexPoints.push_back(neighborGeo.corner(i));
111 curvatures[iElemIdx] = 1.0 / getRadius(vertexPoints, center);
112 centers[iElemIdx] = center;
127 template <
class Po
ints>
128 double getRadius(
const Points& points, Vector& center)
const {
129 using LargeVector = Dune::FieldVector<Scalar, dim + 1>;
130 using Matrix = Dune::FieldMatrix<Scalar, dim + 1, dim + 1>;
131 using LargeDynVector = Dune::DynamicVector<Scalar>;
132 using DynMatrix = Dune::DynamicMatrix<Scalar>;
134 LargeDynVector b(points.size(), 0.0);
135 DynMatrix A(points.size(), dim + 1, 0.0);
137 LargeVector ATb(0.0);
140 for (
unsigned int i = 0; i < points.size(); i++) {
141 b[i] = -points[i].two_norm2();
144 for (
int j = 0; j < dim; j++) {
145 A[i][j + 1] = points[i][j];
151 for (
int i = 0; i <= dim; i++)
152 for (
int j = 0; j <= dim; j++)
153 for (std::size_t k = 0; k < points.size(); k++)
154 ATA[i][j] += A[k][i] * A[k][j];
156 if (std::abs(ATA.determinant()) > epsilon) {
160 for (
int j = 1; j <= dim; j++) {
162 center[j - 1] = -0.5 * x[j];
165 r = sqrt(std::abs(0.25 * r - x[0]));
170 return std::numeric_limits<double>::infinity();
174 const IGridView& iGridView_;
176 const IGridMapper& iGridMapper_;
179 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:36
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:65
CurvatureOperator(const IGridView &iGridView, const IGridMapper &iGridMapper)
Constructor.
Definition: curvatureoperator.hh:49
CurvatureLayout
used as template parameter that determines whether the curvature is approximated at the elemets or th...
Definition: curvatureoperator.hh:22