1#ifndef DUNE_MMESH_PYSKELETONTRACE
2#define DUNE_MMESH_PYSKELETONTRACE
10#include <dune/fempy/py/grid/function.hh>
11#include <dune/fempy/py/grid/gridpart.hh>
12#include <dune/python/common/typeregistry.hh>
22template <
class BulkGV,
class InterfaceGr
idFunction>
24 :
public BindableGridFunctionWithSpace<
25 FemPy::GridPart<BulkGV>, typename InterfaceGridFunction::RangeType> {
27 using GridPart = FemPy::GridPart<BulkGV>;
29 BindableGridFunctionWithSpace<GridPart,
30 typename InterfaceGridFunction::RangeType>;
31 using ILocalFunction = ConstLocalFunction<InterfaceGridFunction>;
33 typename GridPart::GridType::Intersection::LocalGeometry::Implementation;
34 static constexpr bool scalar =
35 (InterfaceGridFunction::RangeType::dimension == 1);
37 SkeletonGF(
const BulkGV &bulkGV,
const InterfaceGridFunction &igf)
38 : Base(FemPy::
gridPart<BulkGV>(bulkGV),
"skeleton_" + igf.
name(),
41 onInterface_(false) {}
45 void bind(
const typename BulkGV::Intersection &intersection,
46 IntersectionSide side) {
47 if (Base::gridPart().
grid().isInterface(intersection)) {
49 ilf_.bind(Base::gridPart().
grid().asInterfaceEntity(intersection));
50 sideGeometry_ = (side == IntersectionSide::in)
51 ? intersection.geometryInInside().impl()
52 : intersection.geometryInOutside().impl();
58 template <
class Po
int>
59 void evaluate(
const Point &x,
typename Base::RangeType &ret)
const {
62 auto ix = sideGeometry_.local(xLocal);
63 ilf_.evaluate(ix, ret);
65 ret =
typename Base::RangeType(0);
68 template <
class Po
int>
69 void jacobian(
const Point &x,
typename Base::JacobianRangeType &ret)
const {
72 auto ix = sideGeometry_.local(xLocal);
73 ilf_.jacobian(ix, ret);
75 ret =
typename Base::JacobianRangeType(0);
78 template <
class Po
int>
79 void hessian(
const Point &x,
typename Base::HessianRangeType &ret)
const {
82 auto ix = sideGeometry_.local(xLocal);
83 ilf_.hessian(ix, ret);
85 ret =
typename Base::HessianRangeType(0);
91 SideGeometry sideGeometry_;
94template <
class BulkGV,
class InterfaceGr
idFunction>
95inline static void registerSkeletonGF(
96 pybind11::module module,
97 pybind11::class_<SkeletonGF<BulkGV, InterfaceGridFunction> > cls) {
98 using pybind11::operator
""_a;
100 cls.def(pybind11::init(
101 [](
const BulkGV &bulkGV,
const InterfaceGridFunction &bgf) {
102 return SkeletonGF<BulkGV, InterfaceGridFunction>(bulkGV, bgf);
104 "bulkGV"_a,
"igf"_a, pybind11::keep_alive<1, 2>(),
105 pybind11::keep_alive<1, 3>());
107 cls.def_property_readonly(
108 "scalar", [](SkeletonGF<BulkGV, InterfaceGridFunction> &self) {
112 Dune::FemPy::registerGridFunction(module, cls);
119template <
class IGV,
class BulkGr
idFunction, Dune::Fem::IntersectionS
ide s
ide>
122 Dune::FemPy::GridPart<IGV>, typename BulkGridFunction::RangeType> {
124 using GridPart = Dune::FemPy::GridPart<IGV>;
126 GridPart,
typename BulkGridFunction::RangeType>;
128 using BulkGridPart =
typename BulkGridFunction::GridPartType;
129 using SideGeometry =
typename GridPart::GridType::MMeshType::Intersection::
130 LocalGeometry::Implementation;
131 static constexpr bool scalar = (BulkGridFunction::RangeType::dimension == 1);
133 TraceGF(
const IGV &iGV,
const BulkGridFunction &bgf)
139 void bind(
const typename Base::EntityType &
entity) {
141 const auto intersection =
142 Base::gridPart().grid().getMMesh().asIntersection(
entity);
144 if constexpr (side == Dune::Fem::IntersectionSide::in)
145 blf_.bind(bulkGridPart_.convert(intersection.inside()));
146 else if (intersection.neighbor())
147 blf_.bind(bulkGridPart_.convert(intersection.outside()));
151 "TraceFunction on boundary can no be used with outside entity");
152 sideGeometry_ = (side == IntersectionSide::in)
153 ? intersection.geometryInInside().impl()
154 : intersection.geometryInOutside().impl();
157 template <
class Po
int>
158 void evaluate(
const Point &x,
typename Base::RangeType &ret)
const {
162 auto bx = sideGeometry_.global(xLocal);
163 blf_.evaluate(bx, ret);
167 template <
class Po
int>
168 void jacobian(
const Point &x,
typename Base::JacobianRangeType &ret)
const {
172 auto bx = sideGeometry_.global(xLocal);
173 typename BulkGridFunction::JacobianRangeType bulkJac;
174 blf_.jacobian(bx, bulkJac);
179 template <
class Po
int>
180 void hessian(
const Point &x,
typename Base::HessianRangeType &ret)
const {
184 auto bx = sideGeometry_.global(xLocal);
185 typename BulkGridFunction::HessianRangeType bulkHessian;
186 blf_.hessian(bx, bulkHessian);
192 const BulkGridPart &bulkGridPart_;
193 SideGeometry sideGeometry_;
196template <
class IGV,
class BulkGr
idFunction, Dune::Fem::IntersectionS
ide s
ide>
197inline static void registerTraceGF(
198 pybind11::module module,
199 pybind11::class_<TraceGF<IGV, BulkGridFunction, side> > cls) {
200 using pybind11::operator
""_a;
202 cls.def(pybind11::init([](
const IGV &iGV,
const BulkGridFunction &bgf) {
203 return TraceGF<IGV, BulkGridFunction, side>(iGV, bgf);
205 "iGV"_a,
"bgf"_a, pybind11::keep_alive<1, 2>(),
206 pybind11::keep_alive<1, 3>());
208 cls.def_property_readonly(
210 [](TraceGF<IGV, BulkGridFunction, side> &self) {
return self.scalar; });
212 Dune::FemPy::registerGridFunction(module, cls);
#define DUNE_THROW(E,...)
const Grid & grid() 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()
typename Impl::ConstLocalFunction< GridFunction >::Type ConstLocalFunction
static const Point & coordinate(const Point &x)