DerivativeGridFunction.hpp 1.49 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#pragma once

#include <type_traits>

#include <dune/functions/common/defaultderivativetraits.hh>

namespace AMDiS
{
  /**
    * \addtogroup OperatorTerms
    * @{
    **/

  /// \brief A Gridfunction that returns the derivative when calling localFunction
  template <class GridFct>
  class DerivativeGridFunction
  {
    using GridFctRange = typename GridFct::Range;
    using GridFctDomain = typename GridFct::Domain;

  public:
    using Range = typename Dune::Functions::DefaultDerivativeTraits<GridFctRange(GridFctDomain)>::Range;
    using Domain = GridFctDomain;
    using LocalFunction = std::decay_t<decltype(derivative(std::declval<GridFct>()))>;

    using EntitySet = typename GridFct::EntitySet;

  public:
    explicit DerivativeGridFunction(GridFct const& gridFct)
      : gridFct_(gridFct)
    {}

    Range operator()(Domain const& x) const
    {
      error_exit("Not implemented");
      return Range(0);
    }

    friend LocalFunction localFunction(DerivativeGridFunction const& gf)
    {
      msg("DerivativeGridFunction::localFunction()\n");
      return derivative(gf.gridFct_);
    }

    EntitySet const& entitySet() const
    {
      return gridFct_.entitySet();
    }

  private:
    GridFct gridFct_;
  };


  /// Generator function for \ref DerivativeGridFunction expressions
  template <class GridFct>
  auto makeDerivativeGridFunction(GridFct&& gridFct)
  {
    return DerivativeGridFunction<std::decay_t<GridFct>>{std::forward<GridFct>(gridFct)};
  }

  /** @} **/

} // end namespace AMDiS