DUNE-ACFEM (unstable)

operatorfunctional.hh
1#ifndef __DUNE_ACFEM_OPERATORS_FUNCTIONALS_MODULES_OPERATORFUNCTIONAL_HH__
2#define __DUNE_ACFEM_OPERATORS_FUNCTIONALS_MODULES_OPERATORFUNCTIONAL_HH__
3
4#include <dune/fem/operator/common/operator.hh>
5
6#include "../../../common/literals.hh"
7#include "../../../expressions/terminal.hh"
8
9#include "../linearfunctional.hh"
10#include "../functionaltraits.hh"
11
12namespace Dune {
13
14 namespace ACFem {
15
16 namespace LinearFunctional {
17
18 using namespace Literals;
19
21 template<class DomainFunction, class Operator>
23 : public LinearFunctionalBase<typename std::decay_t<Operator>::RangeFunctionType::DiscreteFunctionSpaceType>
24 , public Expressions::SelfExpression<OperatorFunctional<DomainFunction, Operator> >
25 {
26 public:
27 using OperatorType = std::decay_t<Operator>;
28 using DiscreteFunctionSpaceType = typename OperatorType::RangeFunctionType::DiscreteFunctionSpaceType;
29 private:
30 using BaseType = LinearFunctionalBase<DiscreteFunctionSpaceType>;
31 public:
32 using typename BaseType::RangeFieldType;
33 using DomainFunctionType = typename OperatorType::DomainFunctionType;
34
35 static_assert(std::is_constructible<DomainFunctionType, DomainFunction>::value,
36 "Incompatible DomainFunction");
37
38 template<class DomFct, class Op,
39 std::enable_if_t<(std::is_constructible<Operator, Op>::value
40 && std::is_constructible<DomainFunction, DomFct>::value
41 ), int> = 0>
42 OperatorFunctional(Op&& op, DomFct&& domFct, const DiscreteFunctionSpaceType& space)
43 : BaseType(space)
44 , domainFunction_(std::forward<DomFct>(domFct)), operator_(std::forward<Op>(op))
45 {}
46
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
50 {
52 values.clear();
53 } else {
54 operator_(domainFunction_, values);
55 if constexpr (!ExpressionTraits<FieldArg>::isOne) {
56 values *= s;
57 }
58 }
59 }
60
61 template<class DiscreteFunction>
62 void coefficients(DiscreteFunction& df) const
63 {
64 coefficients(1_f, df);
65 }
66
67 template<class DiscreteFunction>
68 auto operator()(const DiscreteFunction& df) const
69 {
70 return inner(*this, df);
71 }
72
73 std::string name() const
74 {
75 return "Op(" + domainFunction_.name() + ",.)";
76 }
77
78 protected:
79 DomainFunction domainFunction_;
80 Operator operator_;
81 };
82
83 template<class PDEOperator, class DomainFunction>
84 auto operatorFunctional(PDEOperator&& op,
85 DomainFunction&& domFct,
86 const typename std::decay_t<PDEOperator>::RangeFunctionType::DiscreteFunctionSpaceType& space)
87 {
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.");
91
93 std::forward<PDEOperator>(op),
94 std::forward<DomainFunction>(domFct),
95 space
96 );
97 }
98
99 } // LinearFunctional::
100
101 using LinearFunctional::operatorFunctional;
102
103 } // ACFem::
104
105} // Dune::
106
107#endif // __DUNE_ACFEM_OPERATORS_FUNCTIONALS_MODULES_OPERATORFUNCTIONAL_HH__
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
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden & Uni Heidelberg  |  generated with Hugo v0.111.3 (Sep 4, 22:38, 2025)