dune-mmesh 1.4.1-git
Loading...
Searching...
No Matches
python/mmesh/distance.hh
Go to the documentation of this file.
1#ifndef DUNE_PYTHON_MMESH_DISTANCE
2#define DUNE_PYTHON_MMESH_DISTANCE
3
4#if HAVE_DUNE_FEM
5
10#include <dune/fempy/py/grid/function.hh>
11#include <dune/fempy/py/grid/gridpart.hh>
13#include <dune/python/common/typeregistry.hh>
14
15namespace Dune {
16
17namespace Fem {
18
20// Distance //
22
23template <class GV>
24struct Distance
25 : public BindableGridFunctionWithSpace<FemPy::GridPart<GV>,
26 Dune::FieldVector<double, 1>> {
27 using GridView = GV;
28 static constexpr int dim = GridView::dimensionworld;
29 using GridPartType = FemPy::GridPart<GridView>;
30 using Base =
31 BindableGridFunctionWithSpace<GridPartType, Dune::FieldVector<double, 1>>;
32 using RangeType = typename Base::RangeType;
33 static constexpr bool scalar = true;
34
35 Distance(const GridView &gridView)
36 : Base(FemPy::gridPart<GridView>(gridView), "distance", 0),
37 interpolation_(GeometryTypes::simplex(dim),
38 std::vector<Dune::FieldVector<double, 1>>()) {}
39
40 void bind(const typename Base::EntityType &entity) {
41 Base::bind(entity);
42
43 const auto &distance = this->gridPart().grid().indicator().distance();
44
46 distances.resize(dim + 1);
47 for (std::size_t i = 0; i < entity.subEntities(dim); ++i) {
48 const auto &vertex = entity.template subEntity<dim>(i);
49 distances[i] = distance(vertex);
50 }
51
52 interpolation_ =
54 }
55
56 public:
57 template <class Point>
58 void evaluate(const Point &x, RangeType &ret) const {
59 auto xLocal = Dune::Fem::coordinate(x);
60 ret = interpolation_.global(xLocal);
61 }
62
63 template <class Point>
64 void jacobian(const Point &x, typename Base::JacobianRangeType &ret) const {
65 const auto geo = this->entity().geometry();
66
68 RangeType dt0;
69 auto t0 = geo.local(p);
70 evaluate(t0, dt0);
71
72 RangeType dt;
73 for (std::size_t i = 0; i < dim; ++i) {
74 p[i] = 1.;
75 auto t = geo.local(p);
76 p[i] = 0.;
77 evaluate(t, dt);
78 ret[0][i] = dt - dt0;
79 }
80 }
81
82 template <class Point>
83 void hessian(const Point &x, typename Base::HessianRangeType &ret) const {
84 ret = typename Base::HessianRangeType(0);
85 }
86
87 private:
89};
90
91template <class GridView>
92inline static void registerDistance(pybind11::module module,
93 pybind11::class_<Distance<GridView>> cls) {
94 using pybind11::operator""_a;
95
96 cls.def(pybind11::init([](const GridView &gridView) {
97 return Distance<GridView>(gridView);
98 }),
99 "gridView"_a, pybind11::keep_alive<1, 2>());
100
101 cls.def_property_readonly("scalar",
102 [](Distance<GridView> &self) { return true; });
103
104 Dune::FemPy::registerGridFunction(module, cls);
105}
106
107} // namespace Fem
108
109} // namespace Dune
110
111#endif // HAVE_DUNE_FEM
112
113#endif // DUNE_PYTHON_MMESH_DISTANCE
STL namespace.
size_type dim() const
GridView(const Implementation &imp)
const GridPartType & gridPart() const
void evaluate(const DomainType &global, RangeType &result) const
AnalyticalJacobianType & jacobian()
const EntityType & entity() const
AnalyticalHessianType & hessian()
static const Point & coordinate(const Point &x)
T bind(T... args)
T distance(T... args)
T resize(T... args)