1#ifndef __DUNE_ACFEM_OPERATORS_FUNCTIONALS_MODULES_DIRACFUNCTIONAL_HH__
2#define __DUNE_ACFEM_OPERATORS_FUNCTIONALS_MODULES_DIRACFUNCTIONAL_HH__
4#include <dune/fem/gridpart/common/entitysearch.hh>
6#include "../../../common/tostring.hh"
7#include "../../../common/literals.hh"
8#include "../../../expressions/terminal.hh"
9#include "../linearfunctional.hh"
15 namespace LinearFunctional {
17 using namespace Literals;
46 template<
class DiscreteFunctionSpace>
48 :
public LinearFunctionalBase<DiscreteFunctionSpace>
51 using BaseType = LinearFunctionalBase<DiscreteFunctionSpace>;
53 using typename BaseType::DiscreteFunctionSpaceType;
54 using typename BaseType::RangeFieldType;
55 using BaseType::space;
56 using RangeType =
typename DiscreteFunctionSpaceType::RangeType;
57 using DomainType =
typename DiscreteFunctionSpaceType::DomainType;
58 using GridPartType =
typename DiscreteFunctionSpaceType::GridPartType;
67 template<class X0Arg, std::enable_if_t<std::is_constructible<DomainType, X0Arg>::value,
int> = 0>
70 , x0_(
std::forward<X0Arg>(x0))
74 DiracDistribution(
const std::initializer_list<T> &values,
const DiscreteFunctionSpaceType& space)
79 template<
class FieldArg,
class DiscreteFunction,
80 std::enable_if_t<std::is_constructible<RangeFieldType, FieldArg>::value,
int> = 0>
81 void coefficients(FieldArg&& s, DiscreteFunction& values)
const
85 const auto entity = Fem::EntitySearch<GridPartType>(space().gridPart())(x0_);
86 values.localFunction(entity).axpy(entity.geometry().local(x0_), RangeType(s));
87 }
catch (
const Dune::Exception& e) {
93 template<
class DiscreteFunction>
94 void coefficients(DiscreteFunction& df)
const
96 coefficients(1_f, df);
99 template<
class DiscreteFunction>
100 auto operator()(
const DiscreteFunction& df)
const
102 return inner(*
this, df);
105 std::string name()
const
107 return "<delta_["+toString(x0_)+
"],...>";
110 const auto& x0() const& {
return x0_; }
111 auto& x0() & {
return x0_; }
112 DomainType x0() && {
return x0_; }
118 template<
class X0Arg,
class DiscreteFunctionSpace,
119 std::enable_if_t<std::is_constructible<typename DiscreteFunctionSpace::DomainType, X0Arg>::value,
int> = 0>
120 auto diracFunctional(X0Arg&& x0,
const DiscreteFunctionSpace& space)
122 return expressionClosure(DiracDistribution<DiscreteFunctionSpace>(std::forward<X0Arg>(x0), space));
125 template<
class T,
class DiscreteFunctionSpace>
126 auto diracFunctional(
const std::initializer_list<T>& x0,
const DiscreteFunctionSpace& space)
128 return DiracDistribution<DiscreteFunctionSpace>(x0, space);
137 using LinearFunctional::diracFunctional;
Dirac-distribution.
Definition: diracfunctional.hh:50
DiracDistribution(X0Arg &&x0, const DiscreteFunctionSpaceType &space)
Constructor.
Definition: diracfunctional.hh:68
Light-weight base class for all linear functionals.
Definition: linearfunctional.hh:13
constexpr decltype(auto) expressionClosure(T &&t)
Do-nothing default implementation for pathologic cases.
Definition: interface.hh:93
auto inner(T1 &&t1, T2 &&t2)
"scalar product"
Definition: expressions.hh:154
Default expression traits definition is a recursion in order to ease disambiguation.
Definition: expressiontraits.hh:54
Terminals may derive from this class to express that they are expressions.
Definition: terminal.hh:25