ConstantGridFunction.hpp 4.66 KB
Newer Older
Praetorius, Simon's avatar
Praetorius, Simon committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#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>

#include <dune/amdis/common/Utility.hpp>
#include <dune/amdis/gridfunctions/AnalyticGridFunction.hpp>
#include <dune/amdis/gridfunctions/GridFunctionConcepts.hpp>

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
    friend int order(ConstantLocalFunction const& /*lf*/)
    {
      return 0;
    }

50
    /// \relates ConstantLocalFunction
51 52 53 54 55 56 57 58
    friend auto derivative(ConstantLocalFunction 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};
    }

59 60 61 62 63
  private:
    T value_;
  };


64 65 66 67 68 69 70 71 72 73 74 75
  /**
    * \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.
   **/
76 77 78 79 80 81 82 83 84
  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
85 86
    using Range = Underlying_t<T>;

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

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

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

103
    /// Return the LocalFunction of the \ref ConstantGridFunction. \relates ConstantGridFunction
104
    friend auto localFunction(ConstantGridFunction const& gf)
Praetorius, Simon's avatar
Praetorius, Simon committed
105
    {
106
      return LocalFunction{gf.value_};
Praetorius, Simon's avatar
Praetorius, Simon committed
107 108
    }

109
    EntitySet const& entitySet() const
Praetorius, Simon's avatar
Praetorius, Simon committed
110
    {
111
      return entitySet_;
Praetorius, Simon's avatar
Praetorius, Simon committed
112 113 114 115
    }

  private:
    T value_;
116
    EntitySet entitySet_;
Praetorius, Simon's avatar
Praetorius, Simon committed
117 118 119 120
  };

  /** @} **/

121

Praetorius, Simon's avatar
Praetorius, Simon committed
122 123 124 125 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
  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
153 154 155
    /// \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
156 157 158 159 160 161 162 163
    template <class T>
    constexpr bool ConstantToGridFunction =
      Definition::ConstantToGridFunction<T>::value;

    /** @} **/

  } // end namespace Concepts

164

165
  namespace Impl
Praetorius, Simon's avatar
Praetorius, Simon committed
166
  {
167 168 169 170 171 172 173
    /// Generator for a GridFunction representing a constant value
    template <class T, class GridView,
      REQUIRES(Concepts::ConstantToGridFunction<T>)>
    auto makeGridFunctionImpl(T const& value, GridView const& gridView, Dune::PriorityTag<2>)
    {
      return ConstantGridFunction<T,GridView>{value, gridView};
    }
Praetorius, Simon's avatar
Praetorius, Simon committed
174

175
  } // end namespace Impl
Praetorius, Simon's avatar
Praetorius, Simon committed
176
} // end namespace AMDiS