ConstantGridFunction.hpp 4.74 KB
Newer Older
Praetorius, Simon's avatar
Praetorius, Simon committed
1
2
3
4
5
6
7
8
9
10
#pragma once

#include <functional>
#include <type_traits>

#include <dune/common/diagonalmatrix.hh>
#include <dune/common/fmatrix.hh>
#include <dune/common/fvector.hh>
#include <dune/functions/common/defaultderivativetraits.hh>

11
12
13
#include <amdis/common/Utility.hpp>
#include <amdis/gridfunctions/AnalyticGridFunction.hpp>
#include <amdis/gridfunctions/GridFunctionConcepts.hpp>
Praetorius, Simon's avatar
Praetorius, Simon committed
14
15
16

namespace AMDiS
{
17
  /// \brief LocalFunction of a Gridfunction returning a constant value.
18
19
20
21
22
  template <class Signature, class LocalContext, class Function>
  class ConstantLocalFunction;

  template <class R, class D, class LocalContext, class T>
  class ConstantLocalFunction<R(D), LocalContext, T>
Praetorius, Simon's avatar
Praetorius, Simon committed
23
  {
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
  public:
    using Range = R;
    using Domain = D; // LocalDomain

    using Geometry = typename LocalContext::Geometry;

  public:
    ConstantLocalFunction(T const& value)
      : value_(value)
    {}

    void bind(LocalContext const& /*element*/) {}

    void unbind() {}

    Range const& operator()(Domain const& /*local*/) const
    {
      return value_;
    }

44
    /// \relates ConstantLocalFunction
45
46
47
48
49
50
51
52
53
    friend int order(ConstantLocalFunction const& /*lf*/)
    {
      return 0;
    }

  private:
    T value_;
  };

54
55
56
57
58
59
60
61
62
63
  /// \relates ConstantLocalFunction
  template <class R, class D, class LocalContext, class T>
  auto derivative(ConstantLocalFunction<R(D), LocalContext, T> const& lf)
  {
    using RawSignature = typename Dune::Functions::SignatureTraits<R(D)>::RawSignature;
    using DerivativeRange = typename Dune::Functions::DefaultDerivativeTraits<RawSignature>::Range;
    DerivativeRange diff(0);
    return ConstantLocalFunction<DerivativeRange(D),LocalContext,DerivativeRange>{diff};
  }

64

65
66
67
68
69
70
71
72
73
74
75
76
  /**
    * \addtogroup GridFunctions
    * @{
    **/

  /// \brief Gridfunction returning a constant value.
  /**
   * A stored constant is return in global and local evaluation of this functor.
   * May be used with arithmetic types and vectors/matrices of arithmetic types.
   * It is also allowed to pass a \ref std::reference_wrapper to allow to
   * modify the value after construction.
   **/
77
78
79
80
81
82
83
84
85
  template <class T, class GridView>
  class ConstantGridFunction
  {
  public:
    using EntitySet = Dune::Functions::GridViewEntitySet<GridView, 0>;
    using Element = typename EntitySet::Element;

    using Domain = typename EntitySet::GlobalCoordinate;
    using LocalDomain = typename EntitySet::LocalCoordinate;
Praetorius, Simon's avatar
Praetorius, Simon committed
86
87
    using Range = Underlying_t<T>;

88
89
  public:
    using LocalFunction = ConstantLocalFunction<Range(LocalDomain), Element, T>;
Praetorius, Simon's avatar
Praetorius, Simon committed
90

91
92
93
  public:
    /// Constructor. Stores the function `fct` and creates an `EntitySet`.
    ConstantGridFunction(T const& value, GridView const& gridView)
Praetorius, Simon's avatar
Praetorius, Simon committed
94
      : value_(value)
95
      , entitySet_(gridView)
Praetorius, Simon's avatar
Praetorius, Simon committed
96
97
    {}

98
99
    /// Return the evaluated functor at global coordinates
    Range const& operator()(Domain const& /*x*/) const
Praetorius, Simon's avatar
Praetorius, Simon committed
100
101
102
103
    {
      return value_;
    }

104
    EntitySet const& entitySet() const
Praetorius, Simon's avatar
Praetorius, Simon committed
105
    {
106
      return entitySet_;
Praetorius, Simon's avatar
Praetorius, Simon committed
107
108
    }

109
110
    T const& value() const { return value_; }

Praetorius, Simon's avatar
Praetorius, Simon committed
111
112
  private:
    T value_;
113
    EntitySet entitySet_;
Praetorius, Simon's avatar
Praetorius, Simon committed
114
115
  };

116
117
118
119
120
121
122
  /// Return the LocalFunction of the \ref ConstantGridFunction. \relates ConstantGridFunction
  template <class T, class GV>
  typename ConstantGridFunction<T,GV>::LocalFunction localFunction(ConstantGridFunction<T,GV> const& gf)
  {
    return {gf.value()};
  }

Praetorius, Simon's avatar
Praetorius, Simon committed
123
124
  /** @} **/

125

Praetorius, Simon's avatar
Praetorius, Simon committed
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
  namespace Concepts
  {
    /** \addtogroup Concepts
     *  @{
     **/

    namespace Definition
    {
      template <class T>
      struct ConstantToGridFunction
        : std::is_arithmetic<T> {};

      template <class T>
      struct ConstantToGridFunction<std::reference_wrapper<T>>
        : ConstantToGridFunction<T> {};

      template <class T, int N>
      struct ConstantToGridFunction<Dune::FieldVector<T, N>>
        : ConstantToGridFunction<T> {};

      template <class T, int N, int M>
      struct ConstantToGridFunction<Dune::FieldMatrix<T, N, M>>
        : ConstantToGridFunction<T> {};

      template <class T, int N>
      struct ConstantToGridFunction<Dune::DiagonalMatrix<T, N>>
        : ConstantToGridFunction<T> {};

    } // end namespace Definition


Praetorius, Simon's avatar
Praetorius, Simon committed
157
158
159
    /// \brief Concepts that is true for all ''simple'' types that can be
    /// converted automatically to a GridFunction, e.g. arithmetic types,
    /// FieldVectors, and `std::reference_wrapper`.
Praetorius, Simon's avatar
Praetorius, Simon committed
160
161
162
163
164
165
166
167
    template <class T>
    constexpr bool ConstantToGridFunction =
      Definition::ConstantToGridFunction<T>::value;

    /** @} **/

  } // end namespace Concepts

168

169
170
  template <class Value>
  struct GridFunctionCreator<Value, std::enable_if_t<Concepts::ConstantToGridFunction<Value>>>
Praetorius, Simon's avatar
Praetorius, Simon committed
171
  {
172
173
    template <class GridView>
    static auto create(Value const& value, GridView const& gridView)
174
    {
175
      return ConstantGridFunction<Value,GridView>{value, gridView};
176
    }
177
  };
Praetorius, Simon's avatar
Praetorius, Simon committed
178
179

} // end namespace AMDiS