1#ifndef __DUNE_ACFEM_OPERATORS_FUNCTIONALS_MODULES_OPERATORFUNCTIONAL_HH__
2#define __DUNE_ACFEM_OPERATORS_FUNCTIONALS_MODULES_OPERATORFUNCTIONAL_HH__
4#include <dune/fem/operator/common/operator.hh>
6#include "../../../common/literals.hh"
7#include "../../../expressions/terminal.hh"
9#include "../linearfunctional.hh"
10#include "../functionaltraits.hh"
16 namespace LinearFunctional {
18 using namespace Literals;
21 template<
class DomainFunction,
class Operator>
23 :
public LinearFunctionalBase<typename std::decay_t<Operator>::RangeFunctionType::DiscreteFunctionSpaceType>
27 using OperatorType = std::decay_t<Operator>;
28 using DiscreteFunctionSpaceType =
typename OperatorType::RangeFunctionType::DiscreteFunctionSpaceType;
30 using BaseType = LinearFunctionalBase<DiscreteFunctionSpaceType>;
32 using typename BaseType::RangeFieldType;
33 using DomainFunctionType =
typename OperatorType::DomainFunctionType;
35 static_assert(std::is_constructible<DomainFunctionType, DomainFunction>::value,
36 "Incompatible DomainFunction");
38 template<
class DomFct,
class Op,
39 std::enable_if_t<(std::is_constructible<Operator, Op>::value
40 && std::is_constructible<DomainFunction, DomFct>::value
44 , domainFunction_(std::forward<DomFct>(domFct)), operator_(std::forward<Op>(op))
47 template<
class FieldArg,
class DiscreteFunction,
48 std::enable_if_t<std::is_constructible<RangeFieldType, FieldArg>::value,
int> = 0>
49 void coefficients(FieldArg&& s, DiscreteFunction& values)
const
54 operator_(domainFunction_, values);
61 template<
class DiscreteFunction>
62 void coefficients(DiscreteFunction& df)
const
64 coefficients(1_f, df);
67 template<
class DiscreteFunction>
68 auto operator()(
const DiscreteFunction& df)
const
70 return inner(*
this, df);
73 std::string name()
const
75 return "Op(" + domainFunction_.name() +
",.)";
79 DomainFunction domainFunction_;
83 template<
class PDEOperator,
class DomainFunction>
84 auto operatorFunctional(PDEOperator&& op,
85 DomainFunction&& domFct,
86 const typename std::decay_t<PDEOperator>::RangeFunctionType::DiscreteFunctionSpaceType& space)
88 static_assert(IsDiscreteFunction<typename std::decay_t<PDEOperator>::RangeFunctionType>::value
89 && std::is_constructible<typename std::decay_t<PDEOperator>::DomainFunctionType, DomainFunction>::value,
90 "DomainFunction type is incompatibel with given PDEOperator type.");
93 std::forward<PDEOperator>(op),
94 std::forward<DomainFunction>(domFct),
101 using LinearFunctional::operatorFunctional;
Light-weight base class for all linear functionals.
Definition: linearfunctional.hh:13
Convert any operator into a functional by fixing.
Definition: operatorfunctional.hh:25
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