diff --git a/dune/fufem/assemblers/dunefunctionsoperatorassembler.hh b/dune/fufem/assemblers/dunefunctionsoperatorassembler.hh index e647be692b62f6778c3715837c624c8ba514f6dd..bc79370de85c00974c38f9d40b7835d6e613c3bb 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 f0863a05adf07a86fb5a18ab6f35dbb870b67b0b..ad26a015cc26a2fb93930fd9c3d8dc7b49884238 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{};