From 6fa4facfde125970dfaf433e66d53fc584b91679 Mon Sep 17 00:00:00 2001
From: Simon Praetorius <simon.praetorius@tu-dresden.de>
Date: Tue, 23 Oct 2018 12:10:20 -0400
Subject: [PATCH] added some more documentation of Gridfunctions

---
 examples/ellipt.cc                            |  2 +-
 src/amdis/{gridfunctions => }/Integrate.hpp   | 47 ++++++-----
 .../gridfunctions/AnalyticGridFunction.hpp    | 79 ++++++++++++++-----
 .../gridfunctions/ConstantGridFunction.hpp    | 49 +++++++-----
 .../gridfunctions/DerivativeGridFunction.hpp  | 32 ++++++--
 src/amdis/gridfunctions/DiscreteFunction.hpp  |  8 +-
 .../gridfunctions/FunctorGridFunction.hpp     | 54 +++++++++----
 .../gridfunctions/GridFunctionConcepts.hpp    | 30 +++----
 test/DiscreteFunctionTest.cpp                 |  6 +-
 test/ExpressionsTest.cpp                      |  2 +-
 test/IntegrateTest.cpp                        |  5 +-
 11 files changed, 203 insertions(+), 111 deletions(-)
 rename src/amdis/{gridfunctions => }/Integrate.hpp (71%)

diff --git a/examples/ellipt.cc b/examples/ellipt.cc
index 310170f5..86b53b9e 100644
--- a/examples/ellipt.cc
+++ b/examples/ellipt.cc
@@ -4,10 +4,10 @@
 #include <iostream>
 
 #include <amdis/AMDiS.hpp>
+#include <amdis/Integrate.hpp>
 #include <amdis/ProblemStat.hpp>
 #include <amdis/Operators.hpp>
 #include <amdis/common/Literals.hpp>
-#include <amdis/gridfunctions/Integrate.hpp>
 
 using namespace AMDiS;
 using namespace Dune::Indices;
diff --git a/src/amdis/gridfunctions/Integrate.hpp b/src/amdis/Integrate.hpp
similarity index 71%
rename from src/amdis/gridfunctions/Integrate.hpp
rename to src/amdis/Integrate.hpp
index a433f4c3..bedd7650 100644
--- a/src/amdis/gridfunctions/Integrate.hpp
+++ b/src/amdis/Integrate.hpp
@@ -1,8 +1,9 @@
 #pragma once
-#include "config.h"
-#include <dune/geometry/quadraturerules.hh>
 
+#include <type_traits>
+#include <dune/geometry/quadraturerules.hh>
 #include <amdis/GridFunctions.hpp>
+#include <amdis/common/Mpl.hpp>
 
 namespace AMDiS
 {
@@ -31,6 +32,15 @@ namespace AMDiS
       return result;
     }
 
+    template <class GF, class GridView, class QuadProvider>
+    auto integrateImpl(GF&& gf, GridView const& gv, QuadProvider makeQuad, std::true_type)
+    {
+      return integrateImpl(std::forward<GF>(gf), gv, makeQuad);
+    }
+
+    template <class GF, class GV, class QP>
+    auto integrateImpl(GF&&, GV&&, QP&&, std::false_type) { return 0.0; }
+
   } // end namespace Impl
 
 
@@ -47,26 +57,22 @@ namespace AMDiS
   auto integrate(Expr&& expr, GridView const& gridView)
   {
     auto&& gridFct = makeGridFunction(std::forward<Expr>(expr), gridView);
-    static const bool expr_has_order = Concepts::HasLocalFunctionOrder<std::decay_t<decltype(gridFct)>>;
+
+    // test whether the gridFct model `Concepts::HasLocalFunctionOrder`
+    using GF = std::decay_t<decltype(gridFct)>;
+    static const bool expr_has_order = Concepts::HasLocalFunctionOrder<GF>;
     static_assert(expr_has_order,
       "Polynomial degree of expression can not be deduced. You need to provide an explicit value for the quadrature degree or a quadrature rule in `integrate()`.");
 
-    using QuadratureRules = Dune::QuadratureRules<typename GridView::ctype, GridView::dimension>;
-    auto makeQuad = [](auto&& type, auto&& localFct) { return QuadratureRules::rule(type, order(localFct)); };
-
-#if AMDIS_HAS_CXX_CONSTEXPR_IF
-    if constexpr(expr_has_order)
-      return Impl::integrateImpl(std::forward<decltype(gridFct)>(gridFct), gridView, makeQuad);
-    else
-      return 0.0;
-#else
-    return Dune::Hybrid::ifElse(bool_<expr_has_order>,
-      [&](auto) { return Impl::integrateImpl(gridFct, gridView, makeQuad); },
-      [ ](auto) { return 0.0; });
-#endif
+    using Rules = Dune::QuadratureRules<typename GridView::ctype, GridView::dimension>;
+    auto makeQuad = [](auto&& t, auto&& lf) { return Rules::rule(t, order(lf)); };
+
+    return Impl::integrateImpl(std::forward<decltype(gridFct)>(gridFct), gridView, makeQuad,
+      bool_<expr_has_order>);
   }
 
-  /// Integrate expression with quadrature rule provided
+
+  /// \brief Integrate expression with quadrature rule provided
   /**
    * **Example:**
    * ```
@@ -83,7 +89,8 @@ namespace AMDiS
       [&](auto&&, auto&&) { return quad; });
   }
 
-  /// Integrate expression with quadrature rule determined by provided polynomial `degree`
+
+  /// \brief Integrate expression with quadrature rule determined by provided polynomial `degree`
   /**
    * **Example:**
    * ```
@@ -94,11 +101,11 @@ namespace AMDiS
   auto integrate(Expr&& expr, GridView const& gridView, int degree,
                  Dune::QuadratureType::Enum qt = Dune::QuadratureType::GaussLegendre)
   {
-    using QuadratureRules = Dune::QuadratureRules<typename GridView::ctype, GridView::dimension>;
+    using Rules = Dune::QuadratureRules<typename GridView::ctype, GridView::dimension>;
 
     auto&& gridFct = makeGridFunction(std::forward<Expr>(expr), gridView);
     return Impl::integrateImpl(std::forward<decltype(gridFct)>(gridFct), gridView,
-      [&](auto const& type, auto&&) { return QuadratureRules::rule(type, degree, qt); });
+      [&](auto const& type, auto&&) { return Rules::rule(type, degree, qt); });
   }
 
 } // end namespace AMDiS
diff --git a/src/amdis/gridfunctions/AnalyticGridFunction.hpp b/src/amdis/gridfunctions/AnalyticGridFunction.hpp
index 00f63c5e..c359b407 100644
--- a/src/amdis/gridfunctions/AnalyticGridFunction.hpp
+++ b/src/amdis/gridfunctions/AnalyticGridFunction.hpp
@@ -20,28 +20,38 @@ namespace AMDiS
   class AnalyticLocalFunction<R(D), LocalContext, Function>
   {
   public:
-    using Range = R;
-    using Domain = D; // LocalDomain
+    /// The LocalDomain this LocalFunction can be evaluated in
+    using Domain = D;
 
-    using Geometry = typename LocalContext::Geometry;
+    /// The range type of the LocalFunction
+    using Range = R;
 
+    /// This LocalFunction has its own \ref derivative() function
     enum { hasDerivative = true };
 
+  private:
+    using Geometry = typename LocalContext::Geometry;
+
   public:
+    /// \brief Constructor. stores the function `fct`.
     AnalyticLocalFunction(Function const& fct)
       : fct_{fct}
     {}
 
+    /// \brief Create a geometry object from the element
     void bind(LocalContext const& element)
     {
       geometry_.emplace(element.geometry());
     }
 
+    /// \brief Releases the geometry object
     void unbind()
     {
       geometry_.reset();
     }
 
+    /// \brief Evaluate the function in global coordinate by a local-to-global
+    /// mapping of the local coordinates using the bound geometry object.
     Range operator()(Domain const& local) const
     {
       assert( bool(geometry_) );
@@ -58,8 +68,17 @@ namespace AMDiS
     Dune::Std::optional<Geometry> geometry_;
   };
 
-  /// \brief Return the polynomial order of the function f, if a free function
-  /// order(f) exists, otherwise return a default value. \relates AnalyticLocalFunction
+
+  /// \fn order
+  /// \brief Return the polynomial order of the LocalFunction.
+  /**
+   * \relates AnalyticLocalFunction
+   * The order is defined as the polynomial order of the functor `fct` and
+   * requires a free function `order(fct,1)` to exists.
+   *
+   * **Requirements:**
+   * - The functor `F` must fulfill the concept \ref Concepts::HasOrder
+   **/
   template <class Sig, class LocalContext, class F,
     REQUIRES(Concepts::HasOrder<F>)>
   int order(AnalyticLocalFunction<Sig,LocalContext,F> const& lf)
@@ -68,11 +87,21 @@ namespace AMDiS
   }
 
 
+  /// \fn derivative
+  /// \brief Create an \ref AnalyticLocalFunction representing the derivative
+  /// of the given AnalyticLocalFunction.
+  /**
+   * In order to differentiate the local function, the functor must be
+   * differentiable, i.e. a free function `partial(fct,_0)` must exist.
+   *
+   * **Requirements:**
+   * - The functor `F` must fulfill the concept \ref Concepts::HasPartial
+   **/
   template <class R, class D, class LocalContext, class F>
   auto derivative(AnalyticLocalFunction<R(D),LocalContext,F> const& lf)
   {
     static_assert(Concepts::HasPartial<F>,
-      "No partial(_0,...) defined for Functor F of AnalyticLocalFunction.");
+      "No partial(...,_0) defined for Functor F of AnalyticLocalFunction.");
 
     auto df = partial(lf.fct(), index_<0>);
 
@@ -137,19 +166,38 @@ namespace AMDiS
 
   private:
     Function fct_;
-
     EntitySet entitySet_;
   };
 
+  // Creator for the AnalyticGridFunction
+  template <class Function>
+  struct GridFunctionCreator<Function, std::enable_if_t<Concepts::CallableDomain<Function>>>
+  {
+    template <class GridView>
+    static auto create(Function const& fct, GridView const& gridView)
+    {
+      return AnalyticGridFunction<Function, GridView>{fct, gridView};
+    }
+  };
+
 
+  /// \fn localFunction
+  /// \brief Return the LocalFunction of the AnalyticGridFunction.
+  /// \relates AnalyticGridfunction
   template <class F, class GV>
   auto localFunction(AnalyticGridFunction<F,GV> const& gf)
   {
     return gf.localFunction();
   }
 
+  /// \fn derivative
   /// \brief Return a GridFunction representing the derivative of a functor.
-  // [expects: Functor f has free function derivative(f)]
+  /**
+   * \relates AnalyticGridfunction
+   *
+   * **Requirements:**
+   * - Functor `F` must fulfill the concept \ref Concepts::HasPartial
+   **/
   template <class F, class GV>
   auto derivative(AnalyticGridFunction<F,GV> const& gf)
   {
@@ -189,8 +237,10 @@ namespace AMDiS
 #endif
 
 
-  /// \fn evalAtQP \brief Generator function for AnalyticGridFunction. \relates AnalyticGridfunction
+  /// \fn evalAtQP
+  /// \brief Generator function for AnalyticGridFunction.
   /**
+   * \relates AnalyticGridfunction
    * \ingroup GridFunctions
    * Evaluate a functor at global coordinates. See \ref AnalyticGridFunction.
    *
@@ -205,15 +255,4 @@ namespace AMDiS
     return AnalyticPreGridFunction<Function>{f};
   }
 
-
-  template <class Function>
-  struct GridFunctionCreator<Function, std::enable_if_t<Concepts::CallableDomain<Function>>>
-  {
-    template <class GridView>
-    static auto create(Function const& fct, GridView const& gridView)
-    {
-      return AnalyticGridFunction<Function, GridView>{fct, gridView};
-    }
-  };
-
 } // end namespace AMDiS
diff --git a/src/amdis/gridfunctions/ConstantGridFunction.hpp b/src/amdis/gridfunctions/ConstantGridFunction.hpp
index 275da96f..0ac6ba32 100644
--- a/src/amdis/gridfunctions/ConstantGridFunction.hpp
+++ b/src/amdis/gridfunctions/ConstantGridFunction.hpp
@@ -14,35 +14,45 @@
 
 namespace AMDiS
 {
-  /// \brief LocalFunction of a Gridfunction returning a constant value.
+#ifndef DOXYGEN
   template <class Signature, class LocalContext, class Function>
   class ConstantLocalFunction;
+#endif
 
+  /// \brief LocalFunction of a Gridfunction returning a constant value.
   template <class R, class D, class LocalContext, class T>
   class ConstantLocalFunction<R(D), LocalContext, T>
   {
   public:
-    using Range = R;
-    using Domain = D; // LocalDomain
+    /// The LocalDomain this LocalFunction can be evaluated in
+    using Domain = D;
 
-    using Geometry = typename LocalContext::Geometry;
+    /// The range type of the LocalFunction
+    using Range = R;
 
+    /// This LocalFunction has its own \ref derivative() function
     enum { hasDerivative = true };
 
+  private:
+    using Geometry = typename LocalContext::Geometry;
+
   public:
+    /// \brief Constructor. Stores the constant value.
     ConstantLocalFunction(T const& value)
       : value_(value)
     {}
 
-    void bind(LocalContext const& /*element*/) {}
-
-    void unbind() {}
+    void bind(LocalContext const& /*element*/) { /* do nothing */ }
+    void unbind() { /* do nothing */ }
 
+    /// Return the constant `value_`.
     Range const& operator()(Domain const& /*local*/) const
     {
       return value_;
     }
 
+    /// \brief Create a \ref ConstantLocalFunction representing the derivative
+    /// of a constant function, that ist, the value 0.
     auto derivative() const
     {
       using RawSignature = typename Dune::Functions::SignatureTraits<R(D)>::RawSignature;
@@ -51,6 +61,7 @@ namespace AMDiS
       return ConstantLocalFunction<DerivativeRange(D),LocalContext,DerivativeRange>{diff};
     }
 
+    /// Return the constant polynomial order 0.
     int order() const
     {
       return 0;
@@ -75,16 +86,12 @@ namespace AMDiS
   }
 
 
-
-  /**
-    * \addtogroup GridFunctions
-    * @{
-    **/
-
   /// \brief Gridfunction returning a constant value.
   /**
+   * \ingroup GridFunctions
+   *
    * 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.
+   * Maybe 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.
    **/
@@ -93,15 +100,14 @@ namespace AMDiS
   {
   public:
     using EntitySet = Dune::Functions::GridViewEntitySet<GridView, 0>;
-    using Element = typename EntitySet::Element;
-
     using Domain = typename EntitySet::GlobalCoordinate;
-    using LocalDomain = typename EntitySet::LocalCoordinate;
     using Range = Underlying_t<T>;
 
     enum { hasDerivative = false };
 
-  public:
+  private:
+    using Element = typename EntitySet::Element;
+    using LocalDomain = typename EntitySet::LocalCoordinate;
     using LocalFunction = ConstantLocalFunction<Range(LocalDomain), Element, T>;
 
   public:
@@ -111,7 +117,7 @@ namespace AMDiS
       , entitySet_(gridView)
     {}
 
-    /// Return the evaluated functor at global coordinates
+    /// Return the constant `value_`
     Range const& operator()(Domain const& /*x*/) const
     {
       return value_;
@@ -122,6 +128,7 @@ namespace AMDiS
       return entitySet_;
     }
 
+    /// \brief Create an \ref ConstantLocalFunction with the stores `value_`.
     LocalFunction localFunction() const
     {
       return {value_};
@@ -132,14 +139,14 @@ namespace AMDiS
     EntitySet entitySet_;
   };
 
-  /// Return the LocalFunction of the \ref ConstantGridFunction. \relates ConstantGridFunction
+
+  /// \relates ConstantGridFunction
   template <class T, class GV>
   auto localFunction(ConstantGridFunction<T,GV> const& gf)
   {
     return gf.localFunction();
   }
 
-  /** @} **/
 
 
   namespace Concepts
diff --git a/src/amdis/gridfunctions/DerivativeGridFunction.hpp b/src/amdis/gridfunctions/DerivativeGridFunction.hpp
index c9b3811d..3b766f7c 100644
--- a/src/amdis/gridfunctions/DerivativeGridFunction.hpp
+++ b/src/amdis/gridfunctions/DerivativeGridFunction.hpp
@@ -14,6 +14,7 @@ namespace AMDiS
     * @{
     **/
 
+  /// \class DerivativeGridFunction
   /// \brief A Gridfunction that returns the derivative when calling localFunction.
   /**
    * Wrapps the GridFunction so that \ref localFunction returns a LocalFunction
@@ -22,7 +23,8 @@ namespace AMDiS
    * \tparam GridFunction The GridFunction that is wrapped.
    *
    * **Requirements:**
-   * - `GridFunction` models \ref Concepts::GridFunction and the LocalFunction has a derivative.
+   * - `GridFunction` models \ref Concepts::GridFunction and the LocalFunction
+   *   has a derivative.
    **/
   template <class GridFunction>
   class DerivativeGridFunction
@@ -50,7 +52,8 @@ namespace AMDiS
     explicit DerivativeGridFunction(GridFunction const& gridFct)
       : gridFct_{gridFct}
     {
-      static_assert(isValidRange<DerivativeTraits>(), "Derivative of GridFunction not defined");
+      static_assert(isValidRange<DerivativeTraits>(),
+        "Derivative of GridFunction not defined");
     }
 
     /// Evaluate derivative in global coordinates. NOTE: expensive
@@ -88,17 +91,31 @@ namespace AMDiS
   };
 
 
-#ifndef DOXYGEN
+  /// \fn derivative
+  /// \brief Create a GridFunction representing the derivative of the given
+  /// Gridfunction.
+  /**
+   * A GridFunction can be differentiated if the corresponding LocalFunction
+   * provides a free function `derivative()`
+   *
+   * **Requirements:**
+   * - The type `GridFct` models the concept of a GridFunction
+   * - The `GridFct` has no own `derivative()` function, i.e. it holds
+   *   `GridFct::hasDerivative == false`.
+   * - The localFunction of the `GridFct` models `Concepts::HasDerivative`.
+   **/
   template <class GridFct,
             class LocalFct = decltype(localFunction(std::declval<GridFct>())),
     REQUIRES(not GridFct::hasDerivative)>
   auto derivative(GridFct const& gridFct)
   {
-    static_assert(Concepts::HasDerivative<LocalFct>, "derivative(LocalFunction) not defined!");
+    static_assert(Concepts::HasDerivative<LocalFct>,
+      "derivative(LocalFunction) not defined!");
     return DerivativeGridFunction<GridFct>{gridFct};
   }
 
 
+#ifndef DOXYGEN
   template <class Expr>
   struct DerivativePreGridFunction
   {
@@ -125,9 +142,12 @@ namespace AMDiS
 #endif
 
 
-  /// \brief Generator function for DerivativeGridFunction expressions. \relates DerivativeGridFunction
+  /// \fn gradientAtQP
+  /// \brief Generator function for DerivativeGridFunction expressions.
+  /// \relates DerivativeGridFunction
   /**
-   * Generates a derivative of a GridFunction. See \ref DerivativeGridFunction.
+   * Generates a Gridfunction representing the derivative of a GridFunction.
+   * See \ref DerivativeGridFunction.
    *
    * **Examples:**
    * - `gradientAtQP(prob.getSolution(_0))`
diff --git a/src/amdis/gridfunctions/DiscreteFunction.hpp b/src/amdis/gridfunctions/DiscreteFunction.hpp
index 71b2045e..3b0f4ad3 100644
--- a/src/amdis/gridfunctions/DiscreteFunction.hpp
+++ b/src/amdis/gridfunctions/DiscreteFunction.hpp
@@ -14,13 +14,17 @@
 
 namespace AMDiS
 {
+  /// \class DiscreteFunction
   /// \brief A view on a subspace of a \ref DOFVector
   /**
    * \ingroup GridFunctions
    *
-   * \tparam GB  GlobalBasis type that models \ref Dune::Functions::Concept::GlobalBasis
+   * \tparam GB  Type of the global basis
    * \tparam VT  Coefficient type of the DOFVector
-   * \tparam TP  TreePath type a realization of \ref Dune::TypeTree::HybridTreePath
+   * \tparam TP  A realization of \ref Dune::TypeTree::HybridTreePath
+   *
+   * **Requirements:**
+   * - GB models \ref Dune::Functions::Concept::GlobalBasis
    **/
   template <class GB, class VT, class TP>
   class DiscreteFunction
diff --git a/src/amdis/gridfunctions/FunctorGridFunction.hpp b/src/amdis/gridfunctions/FunctorGridFunction.hpp
index 53253a45..6ee2c1eb 100644
--- a/src/amdis/gridfunctions/FunctorGridFunction.hpp
+++ b/src/amdis/gridfunctions/FunctorGridFunction.hpp
@@ -34,9 +34,10 @@ namespace AMDiS
   } // end namespace Impl
 
 
-  // forward declaration
+#ifndef DOXYGEN
   template <class Signatur, class Functor, class... LocalFunctions>
   class FunctorLocalFunction;
+#endif
 
   // implementation
   template <class R, class D, class Functor, class... LocalFunctions>
@@ -111,11 +112,16 @@ namespace AMDiS
     std::tuple<LocalFunctionWrapper<LocalFunctions>...> localFcts_;
   };
 
-  // Derivative of the LocalFunction of a FunctorGridFunction, utilizing
-  // the chain-rule. Only available of the functor provides partial derivatives.
-  /*
+
+  /// \fn derivative
+  /// \brief Derivative of the LocalFunction of a FunctorGridFunction, utilizing
+  /// the chain-rule. Only available if the functor provides partial derivatives.
+  /**
    * \f$ d_x(f(lf(x)...)) = \sum_i d_i(f)[lf(x)...] * derivative(lf[i]) \f$
-   */
+   *
+   * **Requirements:**
+   * - The Functor `F` must model `Concepts::HasPartial`
+   **/
   template <class Sig, class F, class... LFs,
     REQUIRES(Concepts::HasPartial<F>)>
   auto derivative(FunctorLocalFunction<Sig,F,LFs...> const& lf)
@@ -146,8 +152,14 @@ namespace AMDiS
   }
 
 
-  // Calculate the polynomial order for functors f providing a free functions
-  // order(f, degs...), where degs are the order of the LocalFunctions.
+  /// \fn order
+  /// \brief Calculate the polynomial order of a functor `F` that provides a free
+  /// function order(f, degs...), where degs are the orders of the LocalFunctions.
+  /**
+   * **Requirements:**
+   * - The functor `F` must model `Concepts::HasFunctorOrder`
+   * - All localFunctions `LFs...` must model `Concepts::HasOrder`
+   **/
   template <class Sig, class F, class... LFs,
     REQUIRES(Concepts::HasFunctorOrder<F,sizeof...(LFs)>
              && all_of_v<Concepts::HasOrder<LFs>...>)>
@@ -159,14 +171,12 @@ namespace AMDiS
   }
 
 
-  /**
-    * \addtogroup GridFunctions
-    * @{
-    **/
-
+  /// \class FunctorGridFunction
   /// \brief A Gridfunction that applies a functor to the evaluated Gridfunctions
   /**
-   * Composition of GridFunctions `g_i` by applying a functor `f` locally, i.e. locally it is evaluated
+   * \ingroup GridFunctions
+   * Composition of GridFunctions `g_i` by applying a functor `f` locally, i.e.
+   * locally it is evaluated
    * \f$ f(g_0(x), g_1(x), ...) \f$
    *
    * \tparam Functor           The type of the outer functor `f`
@@ -183,8 +193,10 @@ namespace AMDiS
   public:
     /// The result type of the functor when applied to the grid-functions
     using Range = decltype(std::declval<Functor>()(std::declval<typename GridFunctions::Range>()...));
+
     /// The argument type that can be applied to the grid-functions
     using Domain = typename Impl::DomainType<GridFunctions...>::type;
+
     /// The set of entities this grid-function binds to
     using EntitySet = typename Impl::EntitySetType<GridFunctions...>::type;
 
@@ -200,7 +212,7 @@ namespace AMDiS
   public:
     using LocalFunction = FunctorLocalFunction<RawRange(LocalDomain), Functor, LocalFct<GridFunctions>...>;
 
-    /// Constructor. Stores copies of the functor and gridfunctions.
+    /// \brief Constructor. Stores copies of the functor and gridfunctions.
     template <class... GridFcts>
     explicit FunctorGridFunction(Functor const& fct, GridFcts&&... gridFcts)
       : fct_{fct}
@@ -233,7 +245,9 @@ namespace AMDiS
   };
 
 
-  /// \brief Creates a LocalFunction from the LocalFunctions of the GridFunctions. \relates FunctorLocalFunction
+  /// \fn localFunction
+  /// \brief Creates a LocalFunction from the LocalFunctions of the GridFunctions.
+  /// \relates FunctorLocalFunction
   template <class F, class... GFs>
   auto localFunction(FunctorGridFunction<F,GFs...> const& gf)
   {
@@ -252,6 +266,8 @@ namespace AMDiS
     return FunctorGridFunction<Functor, GridFcts...>{f, gridFcts...};
   }
 
+
+#ifndef DOXYGEN
   // PreGridFunction related to FunctorGridFunction.
   template <class Functor, class... PreGridFunctions>
   struct FunctorPreGridFunction
@@ -287,11 +303,15 @@ namespace AMDiS
     struct IsPreGridFunction<FunctorPreGridFunction<Functor, PreGridFcts...>>
       : std::true_type {};
   }
+#endif
 
 
-  /// \brief Generator function for FunctorGridFunction. \relates FunctorGridFunction
+  /// \brief Generator function for FunctorGridFunction.
+  /// \relates FunctorGridFunction
   /**
-   * Applies the functor `f` to the grid-functions `gridFcts...`. See \ref FunctorGridFunction.
+   * \ingroup GridFunctions
+   * Applies the functor `f` to the grid-functions `gridFcts...`.
+   * See \ref FunctorGridFunction.
    *
    * **Examples:**
    * - `invokeAtQP([](Dune::FieldVector<double, 2> const& x) { return two_norm(x); }, X());`
diff --git a/src/amdis/gridfunctions/GridFunctionConcepts.hpp b/src/amdis/gridfunctions/GridFunctionConcepts.hpp
index 80e277df..bd67e4b3 100644
--- a/src/amdis/gridfunctions/GridFunctionConcepts.hpp
+++ b/src/amdis/gridfunctions/GridFunctionConcepts.hpp
@@ -75,29 +75,29 @@ namespace AMDiS
     } // end namespace Definition
 
 
-    /// \brief GridFunction F has free function `localFunction(F)`
-    template <class F>
-    constexpr bool HasLocalFunction = models<Definition::HasLocalFunction(F)>;
+    /// \brief GridFunction GF has free function `localFunction(GF)`
+    template <class GF>
+    constexpr bool HasLocalFunction = models<Definition::HasLocalFunction(GF)>;
 
-    /// \brief GridFunction F has free function `derivative(F)`
-    template <class F>
-    constexpr bool HasDerivative = models<Definition::HasDerivative(F)>;
+    /// \brief GridFunction GF has free function `derivative(F)`
+    template <class GF>
+    constexpr bool HasDerivative = models<Definition::HasDerivative(GF)>;
 
-    /// \brief GridFunction F has free function `derivative(localFunction(F))`
-    template <class F>
-    constexpr bool HasLocalFunctionDerivative = models<Definition::HasLocalFunctionDerivative(F)>;
+    /// \brief GridFunction GF has free function `derivative(localFunction(F))`
+    template <class GF>
+    constexpr bool HasLocalFunctionDerivative = models<Definition::HasLocalFunctionDerivative(GF)>;
 
-    /// \brief GridFunction F has free function `order(localFunction(F))`
-    template <class F>
-    constexpr bool HasLocalFunctionOrder = models<Definition::HasLocalFunctionOrder(F)>;
+    /// \brief GridFunction GF has free function `order(localFunction(F))`
+    template <class GF>
+    constexpr bool HasLocalFunctionOrder = models<Definition::HasLocalFunctionOrder(GF)>;
 
     /// \brief Functor F has free function `partial(F,_0)`
     template <class F>
     constexpr bool HasPartial = models<Definition::HasPartial(F)>;
 
-    /// \brief Functor F has free function `order(F)`
-    template <class F>
-    constexpr bool HasOrder = models<Definition::HasOrder(F)>;
+    /// \brief LocalFuncion LF has free function `order(F)`
+    template <class LF>
+    constexpr bool HasOrder = models<Definition::HasOrder(LF)>;
 
 
     /// \brief Functor F is collable with GlobalCoordinates `F(Dune::FieldVector<double,DOW>)`
diff --git a/test/DiscreteFunctionTest.cpp b/test/DiscreteFunctionTest.cpp
index f390af6e..93314e54 100644
--- a/test/DiscreteFunctionTest.cpp
+++ b/test/DiscreteFunctionTest.cpp
@@ -6,10 +6,8 @@
 
 #include <amdis/AMDiS.hpp>
 #include <amdis/ProblemStat.hpp>
-#include <amdis/Operators.hpp>
-#include <amdis/common/Literals.hpp>
-#include <amdis/common/FieldMatVec.hpp>
-#include <amdis/gridfunctions/Integrate.hpp>
+#include <amdis/gridfunctions/DiscreteFunction.hpp>
+#include <amdis/gridfunctions/DOFVectorView.hpp>
 
 #include "Tests.hpp"
 
diff --git a/test/ExpressionsTest.cpp b/test/ExpressionsTest.cpp
index bc544975..1422351b 100644
--- a/test/ExpressionsTest.cpp
+++ b/test/ExpressionsTest.cpp
@@ -4,11 +4,11 @@
 #include <iostream>
 
 #include <amdis/AMDiS.hpp>
+#include <amdis/Integrate.hpp>
 #include <amdis/ProblemStat.hpp>
 #include <amdis/Operators.hpp>
 #include <amdis/common/Literals.hpp>
 #include <amdis/common/FieldMatVec.hpp>
-#include <amdis/gridfunctions/Integrate.hpp>
 
 
 using namespace AMDiS;
diff --git a/test/IntegrateTest.cpp b/test/IntegrateTest.cpp
index a94c26f5..d348dda3 100644
--- a/test/IntegrateTest.cpp
+++ b/test/IntegrateTest.cpp
@@ -6,11 +6,8 @@
 #include <dune/geometry/type.hh>
 
 #include <amdis/AMDiS.hpp>
+#include <amdis/Integrate.hpp>
 #include <amdis/ProblemStat.hpp>
-#include <amdis/Operators.hpp>
-#include <amdis/common/Literals.hpp>
-#include <amdis/common/FieldMatVec.hpp>
-#include <amdis/gridfunctions/Integrate.hpp>
 
 #include "Tests.hpp"
 
-- 
GitLab