From 18b54d5b69921e0add898b82ea85121b429ca24b Mon Sep 17 00:00:00 2001
From: Simon Praetorius <simon.praetorius@tu-dresden.de>
Date: Sun, 12 May 2019 10:20:23 +0200
Subject: [PATCH] rewritten gradient of discretefunction to overcome lambda
 problem

---
 .../gridfunctions/DiscreteFunction.inc.hpp    | 67 ++++++++++---------
 1 file changed, 34 insertions(+), 33 deletions(-)

diff --git a/src/amdis/gridfunctions/DiscreteFunction.inc.hpp b/src/amdis/gridfunctions/DiscreteFunction.inc.hpp
index 3a852c02..630a74df 100644
--- a/src/amdis/gridfunctions/DiscreteFunction.inc.hpp
+++ b/src/amdis/gridfunctions/DiscreteFunction.inc.hpp
@@ -200,6 +200,17 @@ public:
     return localView_.element();
   }
 
+  Geometry const& geometry() const
+  {
+    assert( bound_ );
+    return geometry_.value();
+  }
+
+  LocalView const& localView() const
+  {
+    return localView_;
+  }
+
 protected:
   DiscreteFunction globalFunction_;
   Type type_;
@@ -219,30 +230,27 @@ public:
   using Range = typename Super::Range;
   using Domain = typename Super::Domain;
 
-  using Super::DerivativeLocalFunctionBase;
-  using Super::globalFunction_;
-  using Super::geometry_;
-  using Super::subTree_;
-  using Super::localView_;
+  // adopt constructor from base class
+  using DerivativeLocalFunctionBase<tag::gradient>::DerivativeLocalFunctionBase;
 
   /// Evaluate Gradient at bound element in local coordinates
   Range operator()(Domain const& x) const
   {
-    assert( Super::bound_ );
+    assert( this->bound_ );
     Range dy(0);
 
-    auto&& coefficients = *globalFunction_.dofVector_;
-    auto&& nodeToRangeEntry = globalFunction_.nodeToRangeEntry_;
-    for_each_leaf_node(*subTree_, [&,this](auto const& node, auto const& tp)
+    auto&& coefficients = *this->globalFunction_.dofVector_;
+    auto&& nodeToRangeEntry = this->globalFunction_.nodeToRangeEntry_;
+    for_each_leaf_node(*this->subTree_, [&,this](auto const& node, auto const& tp)
     {
-      auto localBasis = makeLocalToGlobalBasisAdapter(node, geometry_.value());
+      auto localBasis = makeLocalToGlobalBasisAdapter(node, this->geometry());
       auto const& gradients = localBasis.gradientsAt(x);
 
       // Get range entry associated to this node
       auto re = Dune::Functions::flatVectorView(nodeToRangeEntry(node, tp, dy));
 
       for (std::size_t i = 0; i < localBasis.size(); ++i) {
-        auto&& multiIndex = localView_.index(node.localIndex(i));
+        auto&& multiIndex = this->localView().index(node.localIndex(i));
 
         // Get coefficient associated to i-th shape function
         auto c = Dune::Functions::flatVectorView(coefficients[multiIndex]);
@@ -276,11 +284,8 @@ public:
   using Range = typename Super::Range;
   using Domain = typename Super::Domain;
 
-  using Super::DerivativeLocalFunctionBase;
-  using Super::globalFunction_;
-  using Super::geometry_;
-  using Super::subTree_;
-  using Super::localView_;
+  // adopt constructor from base class
+  using DerivativeLocalFunctionBase<tag::divergence>::DerivativeLocalFunctionBase;
 
   /// Evaluate divergence at bound element in local coordinates
   Range operator()(Domain const& x) const
@@ -299,13 +304,13 @@ private:
   {
     static_assert(Size_v<Range> == 1, "Implemented for scalar coefficients only.");
 
-    assert( Super::bound_ );
+    assert( this->bound_ );
     Range dy(0);
 
-    auto&& coefficients = *globalFunction_.dofVector_;
-    auto&& node = *subTree_;
+    auto&& coefficients = *this->globalFunction_.dofVector_;
+    auto&& node = *this->subTree_;
 
-    auto localBasis = makeLocalToGlobalBasisAdapter(node.child(0), geometry_.value());
+    auto localBasis = makeLocalToGlobalBasisAdapter(node.child(0), this->geometry());
     auto const& gradients = localBasis.gradientsAt(x);
 
     auto re = Dune::Functions::flatVectorView(dy);
@@ -315,7 +320,7 @@ private:
 
       assert(int(grad.size()) == GridView::dimensionworld);
       for (std::size_t j = 0; j < GridView::dimensionworld; ++j) {
-        auto&& multiIndex = localView_.index(node.child(j).localIndex(i));
+        auto&& multiIndex = this->localView().index(node.child(j).localIndex(i));
         re[0] += coefficients[multiIndex] * grad[j];
       }
     }
@@ -335,32 +340,28 @@ public:
   using Range = typename Super::Range;
   using Domain = typename Super::Domain;
 
-  using Super::DerivativeLocalFunctionBase;
-  using Super::globalFunction_;
-  using Super::geometry_;
-  using Super::subTree_;
-  using Super::localView_;
+  using DerivativeLocalFunctionBase<tag::partial>::DerivativeLocalFunctionBase;
 
   /// Evaluate partial derivative at bound element in local coordinates
   Range operator()(Domain const& x) const
   {
-    assert( Super::bound_ );
+    assert( this->bound_ );
     Range dy(0);
 
-    std::size_t comp = Super::type_.comp;
+    std::size_t comp = this->type_.comp;
 
-    auto&& coefficients = *globalFunction_.dofVector_;
-    auto&& nodeToRangeEntry = globalFunction_.nodeToRangeEntry_;
-    for_each_leaf_node(*subTree_, [&,this](auto const& node, auto const& tp)
+    auto&& coefficients = *this->globalFunction_.dofVector_;
+    auto&& nodeToRangeEntry = this->globalFunction_.nodeToRangeEntry_;
+    for_each_leaf_node(*this->subTree_, [&,this](auto const& node, auto const& tp)
     {
-      auto localBasis = makeLocalToGlobalBasisAdapter(node, geometry_.value());
+      auto localBasis = makeLocalToGlobalBasisAdapter(node, this->geometry());
       auto const& partial = localBasis.partialsAt(x, comp);
 
       // Get range entry associated to this node
       auto re = Dune::Functions::flatVectorView(nodeToRangeEntry(node, tp, dy));
 
       for (std::size_t i = 0; i < localBasis.size(); ++i) {
-        auto&& multiIndex = localView_.index(node.localIndex(i));
+        auto&& multiIndex = this->localView().index(node.localIndex(i));
 
         // Get coefficient associated to i-th shape function
         auto c = Dune::Functions::flatVectorView(coefficients[multiIndex]);
-- 
GitLab