From aa1e3b6a30310a83d59b0a6613268f08ab66c018 Mon Sep 17 00:00:00 2001
From: lh1887 <lh1887@mi.fu-berlin.de>
Date: Wed, 28 Sep 2016 09:44:45 +0200
Subject: [PATCH] Use ()-operator for local assembly

This gives the user the possibility to use local views that have a
non-trivial tree and may lead to more flexibility.
---
 .../assemblers/dunefunctionsoperatorassembler.hh  |  8 ++++----
 dune/fufem/test/dunefunctionsipdgassemblertest.cc | 15 ++++++++++++++-
 2 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/dune/fufem/assemblers/dunefunctionsoperatorassembler.hh b/dune/fufem/assemblers/dunefunctionsoperatorassembler.hh
index e647be69..bc79370d 100644
--- a/dune/fufem/assemblers/dunefunctionsoperatorassembler.hh
+++ b/dune/fufem/assemblers/dunefunctionsoperatorassembler.hh
@@ -178,8 +178,8 @@ public:
    * Note that this was written (and tested) having discontinuous Galerkin bases in mind.
    * There may be cases where things do not work as expected for standard (continuous) Galerkin spaces.
    */
-  template <class MatrixBackend, class LocalAssembler>
-  void assembleSkeleton(MatrixBackend&& matrixBackend, const LocalAssembler& localAssembler) const
+  template <class MatrixBackend, class LocalAssembler, class LocalBoundaryAssembler>
+  void assembleSkeleton(MatrixBackend&& matrixBackend, LocalAssembler&& localAssembler, LocalBoundaryAssembler&& localBoundaryAssembler) const
   {
     Dune::MultipleCodimMultipleGeomTypeMapper<GridView,Dune::MCMGElementLayout> faceMapper(trialBasis_.gridView());
 
@@ -221,7 +221,7 @@ public:
         if (is.boundary())
         {
           auto& localMatrix = matrixContrainer[0][0];
-          localAssembler.assemble(is, localMatrix, insideTrialLocalView.tree().finiteElement(), insideAnsatzLocalView.tree().finiteElement());
+          localBoundaryAssembler(is, localMatrix, insideTrialLocalView, insideAnsatzLocalView);
 
           for (size_t i=0; i< insideTrialLocalIndexSet.size(); i++) {
             for (size_t j=0; j< insideAnsatzLocalIndexSet.size(); j++)
@@ -245,7 +245,7 @@ public:
           outsideAnsatzLocalView.bind(outsideElement);
           outsideAnsatzLocalIndexSet.bind(outsideAnsatzLocalView);
 
-          localAssembler.assembleBlockwise(is, matrixContrainer, insideTrialLocalView.tree().finiteElement(), insideAnsatzLocalView.tree().finiteElement(), outsideTrialLocalView.tree().finiteElement(), outsideAnsatzLocalView.tree().finiteElement());
+          localAssembler(is, matrixContrainer, insideTrialLocalView, insideAnsatzLocalView, outsideTrialLocalView, outsideAnsatzLocalView);
 
           for (size_t i=0; i < insideTrialLocalIndexSet.size(); i++)
           {
diff --git a/dune/fufem/test/dunefunctionsipdgassemblertest.cc b/dune/fufem/test/dunefunctionsipdgassemblertest.cc
index f0863a05..ad26a015 100644
--- a/dune/fufem/test/dunefunctionsipdgassemblertest.cc
+++ b/dune/fufem/test/dunefunctionsipdgassemblertest.cc
@@ -83,7 +83,20 @@ int main (int argc, char *argv[])
   using FiniteElement = std::decay_t<decltype(basis.localView().tree().finiteElement())>;
 
   auto vintageIPDGAssembler = InteriorPenaltyDGAssembler<GridType, FiniteElement, FiniteElement>();
-  assembler.assembleSkeleton(matrixBackend, vintageIPDGAssembler); // IPDG terms
+  auto localBlockAssembler = [&](const auto& edge, auto& matrixContainer,
+      auto&& insideTrialLocalView, auto&& insideAnsatzLocalView, auto&& outsideTrialLocalView, auto&& outsideAnsatzLocalView)
+  {
+      vintageIPDGAssembler.assembleBlockwise(edge, matrixContainer, insideTrialLocalView.tree().finiteElement(),
+                                             insideAnsatzLocalView.tree().finiteElement(),
+                                             outsideTrialLocalView.tree().finiteElement(),
+                                             outsideAnsatzLocalView.tree().finiteElement());
+  };
+  auto localBoundaryAssembler = [&](const auto& edge, auto& localMatrix, auto&& insideTrialLocalView, auto&& insideAnsatzLocalView)
+  {
+      vintageIPDGAssembler.assemble(edge, localMatrix, insideTrialLocalView.tree().finiteElement(), insideAnsatzLocalView.tree().finiteElement());
+  };
+
+  assembler.assembleSkeleton(matrixBackend, localBlockAssembler, localBoundaryAssembler); // IPDG terms
 
   /* Now assemble in the classical fufem way and compare */
   auto fufemMatrix = Matrix{};
-- 
GitLab