From 9f57bf7c1a8609d57d4f0bd5bb34db22b7d9fa4f Mon Sep 17 00:00:00 2001
From: podlesny <podlesny@zedat.fu-berlin.de>
Date: Wed, 21 Mar 2018 18:08:55 +0100
Subject: [PATCH] .

---
 src/assemblers_tmpl.cc                        |  2 +-
 src/multi-body-problem-data/mygrids_tmpl.cc   | 12 ++--
 src/multi-body-problem.cc                     | 69 +++++++++++--------
 src/spatial-solving/fixedpointiterator.cc     |  6 +-
 src/spatial-solving/fixedpointiterator.hh     |  4 +-
 src/time-stepping/adaptivetimestepper.cc      |  6 +-
 src/time-stepping/adaptivetimestepper.hh      |  4 +-
 src/time-stepping/coupledtimestepper.cc       | 12 ++--
 src/time-stepping/coupledtimestepper.hh       |  4 +-
 src/time-stepping/rate.cc                     |  2 +-
 src/time-stepping/rate.hh                     |  2 +-
 src/time-stepping/rate/backward_euler.cc      |  6 +-
 src/time-stepping/rate/backward_euler.hh      |  2 +-
 src/time-stepping/rate/newmark.cc             |  6 +-
 src/time-stepping/rate/newmark.hh             |  2 +-
 src/time-stepping/rate/rateupdater.cc         |  2 +-
 src/time-stepping/rate/rateupdater.hh         |  8 +--
 src/time-stepping/rate_tmpl.cc                |  2 +-
 src/time-stepping/state.cc                    |  2 +-
 .../state/sliplawstateupdater.cc              |  4 +-
 src/time-stepping/state_tmpl.cc               |  2 +-
 src/vtk_tmpl.cc                               |  4 +-
 22 files changed, 90 insertions(+), 73 deletions(-)

diff --git a/src/assemblers_tmpl.cc b/src/assemblers_tmpl.cc
index e068ad5e..0d5ea0c6 100644
--- a/src/assemblers_tmpl.cc
+++ b/src/assemblers_tmpl.cc
@@ -4,4 +4,4 @@
 
 #include "explicitgrid.hh"
 
-template class MyAssembler<LeafGridView, MY_DIM>;
+template class MyAssembler<DeformedGrid::LeafGridView, MY_DIM>;
diff --git a/src/multi-body-problem-data/mygrids_tmpl.cc b/src/multi-body-problem-data/mygrids_tmpl.cc
index 2fee2d0e..fc8ccba7 100644
--- a/src/multi-body-problem-data/mygrids_tmpl.cc
+++ b/src/multi-body-problem-data/mygrids_tmpl.cc
@@ -8,14 +8,14 @@
 
 template class GridsConstructor<Grid>;
 
-template struct MyFaces<LeafGridView>;
-template struct MyFaces<LevelGridView>;
+template struct MyFaces<DeformedGrid::LeafGridView>;
+template struct MyFaces<DeformedGrid::LevelGridView>;
 
-template MyFaces<LeafGridView> GridsConstructor<Grid>::constructFaces(
-    LeafGridView const &gridView, CuboidGeometry const &CuboidGeometry_);
+template MyFaces<DeformedGrid::LeafGridView> GridsConstructor<Grid>::constructFaces(
+    DeformedGrid::LeafGridView const &gridView, CuboidGeometry const &CuboidGeometry_);
 
-template MyFaces<LevelGridView> GridsConstructor<Grid>::constructFaces(
-    LevelGridView const &gridView, CuboidGeometry const &CuboidGeometry_);
+template MyFaces<DeformedGrid::LevelGridView> GridsConstructor<Grid>::constructFaces(
+    DeformedGrid::LevelGridView const &gridView, CuboidGeometry const &CuboidGeometry_);
 
 template void refine<Grid, LocalVector>(
     Grid &grid, ConvexPolyhedron<LocalVector> const &weakPatch,
diff --git a/src/multi-body-problem.cc b/src/multi-body-problem.cc
index d66d8cc1..54e76531 100644
--- a/src/multi-body-problem.cc
+++ b/src/multi-body-problem.cc
@@ -127,11 +127,11 @@ int main(int argc, char *argv[]) {
     using DefLeafGridView = DeformedGrid::LeafGridView;
     using DefLevelGridView = DeformedGrid::LevelGridView;
 
-    using MyAssembler = MyAssembler<DefLeafGridView, dims>;
-    using Matrix = MyAssembler::Matrix;
+    using Assembler = MyAssembler<DefLeafGridView, dims>;
+    using Matrix = Assembler::Matrix;
     using LocalVector = Vector::block_type;
-    using ScalarMatrix = MyAssembler::ScalarMatrix;
-    using ScalarVector = MyAssembler::ScalarVector;
+    using ScalarMatrix = Assembler::ScalarMatrix;
+    using ScalarVector = Assembler::ScalarVector;
     using field_type = Matrix::field_type;
 
     // set up material properties of all bodies
@@ -263,16 +263,20 @@ int main(int argc, char *argv[]) {
 
     // set up boundary conditions
     std::vector<BoundaryPatch<DefLeafGridView>> neumannBoundaries(bodyCount);
-    std::vector<BoundaryPatch<DefLeafGridView>> frictionalBoundaries(bodyCount);
     std::vector<BoundaryPatch<DefLeafGridView>> surfaces(bodyCount);
 
+    // friction boundary
+    std::vector<BoundaryPatch<DefLeafGridView>> frictionalBoundaries(bodyCount);
+    std::vector<Dune::BitSetVector<1>> frictionalNodes(bodyCount);
+
     // Dirichlet boundary
     std::vector<Dune::BitSetVector<dims>> noNodes(bodyCount);
     std::vector<Dune::BitSetVector<dims>> dirichletNodes(bodyCount);
 
     // set up functions for time-dependent boundary conditions
     using Function = Dune::VirtualFunction<double, double>;
-    const Function& velocityDirichletFunction = VelocityDirichletCondition();
+
+    std::vector<const Function*> velocityDirichletFunctions(grids.size());
     const Function& neumannFunction = NeumannCondition();
 
     for (size_t i=0; i<grids.size(); i++) {
@@ -294,9 +298,12 @@ int main(int argc, char *argv[]) {
           frictionalBoundary = BoundaryPatch<DefLeafGridView>(leafFaces[i]->lower);
           frictionalBoundary.addPatch(BoundaryPatch<DefLeafGridView>(leafFaces[i]->upper));
       }
+      frictionalNodes[i] = *frictionalBoundary.getVertices();
       //surfaces[i] = BoundaryPatch<GridView>(myFaces.upper);
 
       // TODO: Dirichlet Boundary
+      velocityDirichletFunctions[i] = new VelocityDirichletCondition();
+
       noNodes[i] = Dune::BitSetVector<dims>(leafVertexCount);
       dirichletNodes[i] = Dune::BitSetVector<dims>(leafVertexCount);
       auto& gridDirichletNodes = dirichletNodes[i];
@@ -315,16 +322,16 @@ int main(int argc, char *argv[]) {
     }
 
     // set up individual assemblers for each body, assemble problem (matrices, forces, rhs)
-    std::vector<std::shared_ptr<MyAssembler>> assemblers(bodyCount);
+    std::vector<std::shared_ptr<Assembler>> assemblers(bodyCount);
     Matrices<Matrix> matrices(bodyCount);
 
     std::vector<Vector> gravityFunctionals(bodyCount);
     std::vector<std::function<void(double, Vector&)>> externalForces(bodyCount);
-    std::vector<EnergyNorm<ScalarMatrix, ScalarVector>* > stateEnergyNorms(bodyCount);
+    std::vector<const EnergyNorm<ScalarMatrix, ScalarVector>* > stateEnergyNorms(bodyCount);
 
     for (size_t i=0; i<assemblers.size(); i++) {
       auto& assembler = assemblers[i];
-      assembler = std::make_shared<MyAssembler>(*leafViews[i]);
+      assembler = std::make_shared<Assembler>(*leafViews[i]);
 
       assembler->assembleElasticity(body.getYoungModulus(), body.getPoissonRatio(), *matrices.elasticity[i]);
       assembler->assembleViscosity(body.getShearViscosityField(), body.getBulkViscosityField(), *matrices.damping[i]);
@@ -401,11 +408,11 @@ int main(int argc, char *argv[]) {
                            : nullptr;
 
 
-  /*  auto restartIO = handleRestarts
+    auto restartIO = handleRestarts
                          ? std::make_unique<RestartIO<MyProgramState>>(
                                *restartFile, leafVertexCounts)
-                         : nullptr;*/
-/*
+                         : nullptr;
+
     if (firstRestart > 0) // automatically adjusts the time and timestep
       restartIO->read(firstRestart, programState);
     else
@@ -413,7 +420,7 @@ int main(int argc, char *argv[]) {
                                           matrices, assemblers, dirichletNodes,
                                           noNodes, frictionalBoundaries, body);
 
-    */
+
 
     // assemble friction
     std::vector<std::shared_ptr<MyGlobalFrictionData<LocalVector>>> frictionInfo(weakPatches.size());
@@ -434,18 +441,19 @@ int main(int argc, char *argv[]) {
         vertexCoordinates[vertexMapper.index(v)] = geoToPoint(v.geometry());
     }
 
-    using MyVertexBasis = typename MyAssembler::VertexBasis;
+    using MyVertexBasis = typename Assembler::VertexBasis;
     auto dataWriter =
         writeData ? std::make_unique<
                         HDF5Writer<MyProgramState, MyVertexBasis, GridView>>(
                         *dataFile, vertexCoordinates, myAssembler.vertexBasis,
                         surface, frictionalBoundary, weakPatch)
                   : nullptr;
-    MyVTKWriter<MyVertexBasis, typename MyAssembler::CellBasis> const vtkWriter(
+    MyVTKWriter<MyVertexBasis, typename Assembler::CellBasis> const vtkWriter(
         myAssembler.cellBasis, myAssembler.vertexBasis, "obs");
 
-
+    */
     IterationRegister iterationCount;
+    /*
     auto const report = [&](bool initial = false) {
       if (writeData) {
         dataWriter->reportSolution(programState, *myGlobalFriction);
@@ -485,17 +493,18 @@ int main(int argc, char *argv[]) {
 
     using MyUpdater = Updaters<RateUpdater<Vector, Matrix, Function, dims>,
                                StateUpdater<ScalarVector, Vector>>;
-    /*
+
+    std::vector<double> L(bodyCount, parset.get<double>("boundary.friction.L"));
+    std::vector<double> V0(bodyCount, parset.get<double>("boundary.friction.V0"));
     MyUpdater current(
         initRateUpdater(parset.get<Config::scheme>("timeSteps.scheme"),
-                        velocityDirichletFunction, dirichletNodes, matrices,
+                        velocityDirichletFunctions, dirichletNodes, matrices,
                         programState.u, programState.v, programState.a),
         initStateUpdater<ScalarVector, Vector>(
             parset.get<Config::stateModel>("boundary.friction.stateModel"),
-            programState.alpha, *frictionalBoundary.getVertices(),
-            parset.get<double>("boundary.friction.L"),
-            parset.get<double>("boundary.friction.V0")));
-   */
+            programState.alpha, frictionalNodes,
+            L, V0));
+
 
     auto const refinementTolerance =
         parset.get<double>("timeSteps.refinementTolerance");
@@ -514,16 +523,16 @@ int main(int argc, char *argv[]) {
       return energyNorm > refinementTolerance;
     };
 
-    /*
+
     std::signal(SIGXCPU, handleSignal);
     std::signal(SIGINT, handleSignal);
     std::signal(SIGTERM, handleSignal);
 
     AdaptiveTimeStepper<NonlinearFactory, MyUpdater,
                         EnergyNorm<ScalarMatrix, ScalarVector>>
-        adaptiveTimeStepper(factory, parset, myGlobalFriction, current,
+        adaptiveTimeStepper(factory, parset, globalFriction, current,
                             programState.relativeTime, programState.relativeTau,
-                            computeExternalForces, stateEnergyNorm, mustRefine);
+                            externalForces, stateEnergyNorms, mustRefine);
     while (!adaptiveTimeStepper.reachedEnd()) {
       programState.timeStep++;
 
@@ -536,14 +545,20 @@ int main(int argc, char *argv[]) {
       current.rate_->extractAcceleration(programState.a);
       current.state_->extractAlpha(programState.alpha);
 
-      report();
+      for (size_t i=0; i<deformedGridComplex.size() ; i++) {
+        deformedGridComplex.setDeformation(programState.u[i], i);
+      }
+      nBodyAssembler.assembleTransferOperator();
+      nBodyAssembler.assembleObstacle();
+
+    //  report();
 
       if (terminationRequested) {
         std::cerr << "Terminating prematurely" << std::endl;
         break;
       }
     }
-*/
+
   } catch (Dune::Exception &e) {
     Dune::derr << "Dune reported error: " << e << std::endl;
   } catch (std::exception &e) {
diff --git a/src/spatial-solving/fixedpointiterator.cc b/src/spatial-solving/fixedpointiterator.cc
index 521c513b..18931b36 100644
--- a/src/spatial-solving/fixedpointiterator.cc
+++ b/src/spatial-solving/fixedpointiterator.cc
@@ -36,7 +36,7 @@ void FixedPointIterationCounter::operator+=(
 template <class Factory, class Updaters, class ErrorNorm>
 FixedPointIterator<Factory, Updaters, ErrorNorm>::FixedPointIterator(
     Factory &factory, Dune::ParameterTree const &parset,
-    std::vector<std::shared_ptr<Nonlinearity>>& globalFriction, const ErrorNorm& errorNorm)
+    std::vector<std::shared_ptr<Nonlinearity>>& globalFriction, const std::vector<const ErrorNorm* >& errorNorms)
     : factory_(factory),
       step_(factory_.getStep()),
       parset_(parset),
@@ -47,7 +47,7 @@ FixedPointIterator<Factory, Updaters, ErrorNorm>::FixedPointIterator(
       velocityMaxIterations_(parset.get<size_t>("v.solver.maximumIterations")),
       velocityTolerance_(parset.get<double>("v.solver.tolerance")),
       verbosity_(parset.get<Solver::VerbosityMode>("v.solver.verbosity")),
-      errorNorm_(errorNorm) {}
+      errorNorms_(errorNorms) {}
 
 template <class Factory, class Updaters, class ErrorNorm>
 FixedPointIterationCounter
@@ -134,7 +134,7 @@ FixedPointIterator<Factory, Updaters, ErrorNorm>::run(
 
     bool breakCriterion = true;
     for (size_t i=0; i<alpha.size(); i++) {
-        if (errorNorm_.diff(alpha[i], newAlpha[i]) >= fixedPointTolerance_) {
+        if (errorNorms_[i]->diff(alpha[i], newAlpha[i]) >= fixedPointTolerance_) {
             breakCriterion = false;
             break;
         }
diff --git a/src/spatial-solving/fixedpointiterator.hh b/src/spatial-solving/fixedpointiterator.hh
index e579645b..bae4624f 100644
--- a/src/spatial-solving/fixedpointiterator.hh
+++ b/src/spatial-solving/fixedpointiterator.hh
@@ -37,7 +37,7 @@ class FixedPointIterator {
 public:
   FixedPointIterator(Factory& factory, const Dune::ParameterTree& parset,
                      std::vector<std::shared_ptr<Nonlinearity>>& globalFriction,
-                     const ErrorNorm& errorNorm);
+                     const std::vector<const ErrorNorm* >& errorNorms);
 
   FixedPointIterationCounter run(Updaters updaters,
                                  const std::vector<Matrix>& velocityMatrices,
@@ -56,6 +56,6 @@ class FixedPointIterator {
   size_t velocityMaxIterations_;
   double velocityTolerance_;
   Solver::VerbosityMode verbosity_;
-  ErrorNorm const &errorNorm_;
+  const std::vector<const ErrorNorm* >& errorNorms_;
 };
 #endif
diff --git a/src/time-stepping/adaptivetimestepper.cc b/src/time-stepping/adaptivetimestepper.cc
index 0808750f..1c36768e 100644
--- a/src/time-stepping/adaptivetimestepper.cc
+++ b/src/time-stepping/adaptivetimestepper.cc
@@ -23,7 +23,7 @@ AdaptiveTimeStepper<Factory, Updaters, ErrorNorm>::AdaptiveTimeStepper(
     std::vector<std::shared_ptr<Nonlinearity>>& globalFriction, Updaters &current,
     double relativeTime, double relativeTau,
     std::vector<std::function<void(double, Vector &)>>& externalForces,
-    ErrorNorm const &errorNorm,
+    const std::vector<const ErrorNorm* >& errorNorms,
     std::function<bool(Updaters &, Updaters &)> mustRefine)
     : relativeTime_(relativeTime),
       relativeTau_(relativeTau),
@@ -35,7 +35,7 @@ AdaptiveTimeStepper<Factory, Updaters, ErrorNorm>::AdaptiveTimeStepper(
       R1_(),
       externalForces_(externalForces),
       mustRefine_(mustRefine),
-      errorNorm_(errorNorm) {}
+      errorNorms_(errorNorms) {}
 
 template <class Factory, class Updaters, class ErrorNorm>
 bool AdaptiveTimeStepper<Factory, Updaters, ErrorNorm>::reachedEnd() {
@@ -100,7 +100,7 @@ AdaptiveTimeStepper<Factory, Updaters, ErrorNorm>::step(
   UpdatersWithCount newUpdatersAndCount = {oldUpdaters.clone(), {}};
   newUpdatersAndCount.count =
       MyCoupledTimeStepper(finalTime_, factory_, parset_, globalFriction_,
-                           newUpdatersAndCount.updaters, errorNorm_,
+                           newUpdatersAndCount.updaters, errorNorms_,
                            externalForces_)
           .step(rTime, rTau);
   iterationRegister_.registerCount(newUpdatersAndCount.count);
diff --git a/src/time-stepping/adaptivetimestepper.hh b/src/time-stepping/adaptivetimestepper.hh
index a0bf6113..f7897a29 100644
--- a/src/time-stepping/adaptivetimestepper.hh
+++ b/src/time-stepping/adaptivetimestepper.hh
@@ -34,7 +34,7 @@ class AdaptiveTimeStepper {
                       Updaters &current, double relativeTime,
                       double relativeTau,
                       std::vector<std::function<void(double, Vector &)>>& externalForces,
-                      ErrorNorm const &errorNorm,
+                      const std::vector<const ErrorNorm* >& errorNorms,
                       std::function<bool(Updaters &, Updaters &)> mustRefine);
 
   bool reachedEnd();
@@ -55,7 +55,7 @@ class AdaptiveTimeStepper {
   UpdatersWithCount R1_;
   std::vector<std::function<void(double, Vector &)>>& externalForces_;
   std::function<bool(Updaters &, Updaters &)> mustRefine_;
-  ErrorNorm const &errorNorm_;
+  const std::vector<const ErrorNorm* >& errorNorms_;
 
   IterationRegister iterationRegister_;
 };
diff --git a/src/time-stepping/coupledtimestepper.cc b/src/time-stepping/coupledtimestepper.cc
index 7501f68a..74e66fc8 100644
--- a/src/time-stepping/coupledtimestepper.cc
+++ b/src/time-stepping/coupledtimestepper.cc
@@ -8,7 +8,7 @@ template <class Factory, class Updaters, class ErrorNorm>
 CoupledTimeStepper<Factory, Updaters, ErrorNorm>::CoupledTimeStepper(
     double finalTime, Factory &factory, Dune::ParameterTree const &parset,
     std::vector<std::shared_ptr<Nonlinearity>>& globalFriction, Updaters updaters,
-    ErrorNorm const &errorNorm,
+    const std::vector<const ErrorNorm* >& errorNorms,
     std::vector<std::function<void(double, Vector &)>>& externalForces)
     : finalTime_(finalTime),
       factory_(factory),
@@ -16,7 +16,7 @@ CoupledTimeStepper<Factory, Updaters, ErrorNorm>::CoupledTimeStepper(
       globalFriction_(globalFriction),
       updaters_(updaters),
       externalForces_(externalForces),
-      errorNorm_(errorNorm) {}
+      errorNorms_(errorNorms) {}
 
 template <class Factory, class Updaters, class ErrorNorm>
 FixedPointIterationCounter
@@ -26,8 +26,10 @@ CoupledTimeStepper<Factory, Updaters, ErrorNorm>::step(double relativeTime,
   updaters_.rate_->nextTimeStep();
 
   auto const newRelativeTime = relativeTime + relativeTau;
-  std::vector<Vector> ell;
-  externalForces_(newRelativeTime, ell);
+  std::vector<Vector> ell(externalForces_.size());
+  for (size_t i=0; i<externalForces_.size(); i++) {
+    externalForces_[i](newRelativeTime, ell[i]);
+  }
 
   std::vector<Matrix> velocityMatrix;
   std::vector<Vector> velocityRHS;
@@ -38,7 +40,7 @@ CoupledTimeStepper<Factory, Updaters, ErrorNorm>::step(double relativeTime,
   updaters_.rate_->setup(ell, tau, newRelativeTime, velocityRHS, velocityIterate, velocityMatrix);
 
   FixedPointIterator<Factory, Updaters, ErrorNorm> fixedPointIterator(
-      factory_, parset_, globalFriction_, errorNorm_);
+      factory_, parset_, globalFriction_, errorNorms_);
   auto const iterations = fixedPointIterator.run(updaters_, velocityMatrix,
                                                  velocityRHS, velocityIterate);
   return iterations;
diff --git a/src/time-stepping/coupledtimestepper.hh b/src/time-stepping/coupledtimestepper.hh
index 92e3cd4a..97c01282 100644
--- a/src/time-stepping/coupledtimestepper.hh
+++ b/src/time-stepping/coupledtimestepper.hh
@@ -18,7 +18,7 @@ class CoupledTimeStepper {
   CoupledTimeStepper(double finalTime, Factory &factory,
                      Dune::ParameterTree const &parset,
                      std::vector<std::shared_ptr<Nonlinearity>>& globalFriction,
-                     Updaters updaters, ErrorNorm const &errorNorm,
+                     Updaters updaters, const std::vector<const ErrorNorm* >& errorNorms,
                      std::vector<std::function<void(double, Vector &)>>& externalForces);
 
   FixedPointIterationCounter step(double relativeTime, double relativeTau);
@@ -30,6 +30,6 @@ class CoupledTimeStepper {
   std::vector<std::shared_ptr<Nonlinearity>>& globalFriction_;
   Updaters updaters_;
   std::vector<std::function<void(double, Vector &)>>& externalForces_;
-  ErrorNorm const &errorNorm_;
+  const std::vector<const ErrorNorm* >& errorNorms_;
 };
 #endif
diff --git a/src/time-stepping/rate.cc b/src/time-stepping/rate.cc
index fe366fe7..ce4050c7 100644
--- a/src/time-stepping/rate.cc
+++ b/src/time-stepping/rate.cc
@@ -9,7 +9,7 @@
 template <class Vector, class Matrix, class Function, int dimension>
 std::shared_ptr<RateUpdater<Vector, Matrix, Function, dimension>>
 initRateUpdater(Config::scheme scheme,
-                const std::vector<Function>& velocityDirichletFunctions,
+                const std::vector<const Function*>& velocityDirichletFunctions,
                 const std::vector<Dune::BitSetVector<dimension>>& velocityDirichletNodes,
                 const Matrices<Matrix>& matrices,
                 const std::vector<Vector>& u_initial,
diff --git a/src/time-stepping/rate.hh b/src/time-stepping/rate.hh
index 60268240..5d2ae428 100644
--- a/src/time-stepping/rate.hh
+++ b/src/time-stepping/rate.hh
@@ -9,7 +9,7 @@
 template <class Vector, class Matrix, class Function, int dimension>
 std::shared_ptr<RateUpdater<Vector, Matrix, Function, dimension>>
 initRateUpdater(Config::scheme scheme,
-                const std::vector<Function>& velocityDirichletFunctions,
+                const std::vector<const Function* >& velocityDirichletFunctions,
                 const std::vector<Dune::BitSetVector<dimension>>& velocityDirichletNodes,
                 const Matrices<Matrix>& matrices,
                 const std::vector<Vector>& u_initial,
diff --git a/src/time-stepping/rate/backward_euler.cc b/src/time-stepping/rate/backward_euler.cc
index 2694a970..11b7907f 100644
--- a/src/time-stepping/rate/backward_euler.cc
+++ b/src/time-stepping/rate/backward_euler.cc
@@ -8,7 +8,7 @@ BackwardEuler<Vector, Matrix, Function, dim>::BackwardEuler(
     const Matrices<Matrix>& _matrices, const std::vector<Vector>& _u_initial,
     const std::vector<Vector>& _v_initial, const std::vector<Vector>& _a_initial,
     const std::vector<Dune::BitSetVector<dim>>& _dirichletNodes,
-    const std::vector<Function>& _dirichletFunctions)
+    const std::vector<const Function*>& _dirichletFunctions)
     : RateUpdater<Vector, Matrix, Function, dim>(
           _matrices, _u_initial, _v_initial, _a_initial, _dirichletNodes,
           _dirichletFunctions) {}
@@ -20,7 +20,7 @@ void BackwardEuler<Vector, Matrix, Function, dim>::setup(const std::vector<Vecto
                                                          std::vector<Vector>& rhs, std::vector<Vector>& iterate,
                                                          std::vector<Matrix>& AM) {
   for (size_t i=0; i<this->u.size(); i++) {
-    this->dirichletFunctions[i].evaluate(relativeTime, this->dirichletValues[i]);
+    this->dirichletFunctions[i]->evaluate(relativeTime, this->dirichletValue);
     this->tau = _tau;
 
     /* We start out with the formulation
@@ -73,7 +73,7 @@ void BackwardEuler<Vector, Matrix, Function, dim>::setup(const std::vector<Vecto
     const Dune::BitSetVector<dim>& dirichletNodess = this->dirichletNodes[i];
     for (size_t k = 0; k < dirichletNodess.size(); ++k)
       for (size_t j = 0; j < dim; ++j)
-        if (this->dirichletNodes[k][j])
+        if (dirichletNodess[k][j])
           iterate[k][j] = (j == 0) ? this->dirichletValue : 0;
   }
 }
diff --git a/src/time-stepping/rate/backward_euler.hh b/src/time-stepping/rate/backward_euler.hh
index 245bb74b..169323d6 100644
--- a/src/time-stepping/rate/backward_euler.hh
+++ b/src/time-stepping/rate/backward_euler.hh
@@ -7,7 +7,7 @@ class BackwardEuler : public RateUpdater<Vector, Matrix, Function, dim> {
   BackwardEuler(const Matrices<Matrix> &_matrices, const std::vector<Vector> &_u_initial,
                 const std::vector<Vector> &_v_initial, const std::vector<Vector> &_a_initial,
                 const std::vector<Dune::BitSetVector<dim> > &_dirichletNodes,
-                const std::vector<Function> &_dirichletFunctions);
+                const std::vector<const Function*> &_dirichletFunctions);
 
   void setup(const std::vector<Vector>&, double, double, std::vector<Vector>&, std::vector<Vector>&,
              std::vector<Matrix>&) override;
diff --git a/src/time-stepping/rate/newmark.cc b/src/time-stepping/rate/newmark.cc
index 53bf32c4..c88136d7 100644
--- a/src/time-stepping/rate/newmark.cc
+++ b/src/time-stepping/rate/newmark.cc
@@ -8,7 +8,7 @@ Newmark<Vector, Matrix, Function, dim>::Newmark(
     const Matrices<Matrix>& _matrices, const std::vector<Vector>& _u_initial,
     const std::vector<Vector>& _v_initial, const std::vector<Vector>& _a_initial,
     const std::vector<Dune::BitSetVector<dim>>& _dirichletNodes,
-    const std::vector<Function>& _dirichletFunctions)
+    const std::vector<const Function*>& _dirichletFunctions)
     : RateUpdater<Vector, Matrix, Function, dim>(
           _matrices, _u_initial, _v_initial, _a_initial, _dirichletNodes,
           _dirichletFunctions) {}
@@ -20,7 +20,7 @@ void Newmark<Vector, Matrix, Function, dim>::setup(const std::vector<Vector>& el
                                                    std::vector<Vector>& rhs, std::vector<Vector>& iterate,
                                                    std::vector<Matrix>& AM) {
   for (size_t i=0; i<this->u.size(); i++) {
-    this->dirichletFunctions[i].evaluate(relativeTime, this->dirichletValues[i]);
+    this->dirichletFunctions[i]->evaluate(relativeTime, this->dirichletValue);
     this->tau = _tau;
 
     /* We start out with the formulation
@@ -77,7 +77,7 @@ void Newmark<Vector, Matrix, Function, dim>::setup(const std::vector<Vector>& el
     const Dune::BitSetVector<dim>& dirichletNodess = this->dirichletNodes[i];
     for (size_t k = 0; k < dirichletNodess.size(); ++k)
       for (size_t j = 0; j < dim; ++j)
-        if (this->dirichletNodess[k][j])
+        if (dirichletNodess[k][j])
           iterate[k][j] = (j == 0) ? this->dirichletValue : 0;
   }
 }
diff --git a/src/time-stepping/rate/newmark.hh b/src/time-stepping/rate/newmark.hh
index be5cb844..25e014ea 100644
--- a/src/time-stepping/rate/newmark.hh
+++ b/src/time-stepping/rate/newmark.hh
@@ -7,7 +7,7 @@ class Newmark : public RateUpdater<Vector, Matrix, Function, dim> {
   Newmark(const Matrices<Matrix>& _matrices, const std::vector<Vector>& _u_initial,
           const std::vector<Vector>& _v_initial, const std::vector<Vector>& _a_initial,
           const std::vector<Dune::BitSetVector<dim>>& _dirichletNodes,
-          const std::vector<Function>& _dirichletFunctions);
+          const std::vector<const Function*>& _dirichletFunctions);
 
   void setup(const std::vector<Vector>&, double, double, std::vector<Vector>&, std::vector<Vector>&,
              std::vector<Matrix>&) override;
diff --git a/src/time-stepping/rate/rateupdater.cc b/src/time-stepping/rate/rateupdater.cc
index 23d09536..6c095235 100644
--- a/src/time-stepping/rate/rateupdater.cc
+++ b/src/time-stepping/rate/rateupdater.cc
@@ -9,7 +9,7 @@ RateUpdater<Vector, Matrix, Function, dim>::RateUpdater(
     const Matrices<Matrix>& _matrices, const std::vector<Vector>& _u_initial,
     const std::vector<Vector>& _v_initial, const std::vector<Vector>& _a_initial,
     const std::vector<Dune::BitSetVector<dim>>& _dirichletNodes,
-    const std::vector<Function>& _dirichletFunctions)
+    const std::vector<const Function*>& _dirichletFunctions)
     : matrices(_matrices),
       u(_u_initial),
       v(_v_initial),
diff --git a/src/time-stepping/rate/rateupdater.hh b/src/time-stepping/rate/rateupdater.hh
index 5266259d..8b78e1d3 100644
--- a/src/time-stepping/rate/rateupdater.hh
+++ b/src/time-stepping/rate/rateupdater.hh
@@ -13,12 +13,12 @@ class RateUpdater {
   RateUpdater(const Matrices<Matrix>& _matrices, const std::vector<Vector>& _u_initial,
               const std::vector<Vector>& _v_initial, const std::vector<Vector>& _a_initial,
               const std::vector<Dune::BitSetVector<dim>>& _dirichletNodes,
-              const std::vector<Function>& _dirichletFunctions);
+              const std::vector<const Function*>& _dirichletFunctions);
 
 public:
   void nextTimeStep();
-  void virtual setup(Vector const &ell, double _tau, double relativeTime,
-                     Vector &rhs, Vector &iterate, Matrix &AB) = 0;
+  void virtual setup(const std::vector<Vector>& ell, double _tau, double relativeTime,
+                     std::vector<Vector>& rhs, std::vector<Vector>& iterate, std::vector<Matrix>& AB) = 0;
 
   void virtual postProcess(const std::vector<Vector>& iterate) = 0;
   void extractDisplacement(std::vector<Vector>& displacements) const;
@@ -33,7 +33,7 @@ class RateUpdater {
   const Matrices<Matrix>& matrices;
   std::vector<Vector> u, v, a;
   const std::vector<Dune::BitSetVector<dim>>& dirichletNodes;
-  const std::vector<Function>& dirichletFunctions;
+  const std::vector<const Function*>& dirichletFunctions;
   double dirichletValue;
 
   std::vector<Vector> u_o, v_o, a_o;
diff --git a/src/time-stepping/rate_tmpl.cc b/src/time-stepping/rate_tmpl.cc
index 92c15bdd..18593e15 100644
--- a/src/time-stepping/rate_tmpl.cc
+++ b/src/time-stepping/rate_tmpl.cc
@@ -8,7 +8,7 @@ template std::shared_ptr<RateUpdater<Vector, Matrix, Function, MY_DIM>>
 initRateUpdater<Vector, Matrix, Function, MY_DIM>(
     Config::scheme scheme,
     const std::vector<Function>& velocityDirichletFunctions,
-    const std::vector<Dune::BitSetVector<dimension>>& velocityDirichletNodes,
+    const std::vector<Dune::BitSetVector<MY_DIM>>& velocityDirichletNodes,
     const Matrices<Matrix>& matrices,
     const std::vector<Vector>& u_initial,
     const std::vector<Vector>& v_initial,
diff --git a/src/time-stepping/state.cc b/src/time-stepping/state.cc
index f07a8033..b8e4349e 100644
--- a/src/time-stepping/state.cc
+++ b/src/time-stepping/state.cc
@@ -8,7 +8,7 @@
 
 template <class ScalarVector, class Vector>
 std::shared_ptr<StateUpdater<ScalarVector, Vector>> initStateUpdater(Config::stateModel model, const std::vector<ScalarVector>& alpha_initial,
-    const std::vector<Dune::BitSetVector<_Tp1>>& frictionalNodes, const std::vector<double>& L, const std::vector<double>& V0) {
+    const std::vector<Dune::BitSetVector<1>>& frictionalNodes, const std::vector<double>& L, const std::vector<double>& V0) {
   switch (model) {
     case Config::AgeingLaw:
       return std::make_shared<AgeingLawStateUpdater<ScalarVector, Vector>>(
diff --git a/src/time-stepping/state/sliplawstateupdater.cc b/src/time-stepping/state/sliplawstateupdater.cc
index 6b322d89..9a36d0a3 100644
--- a/src/time-stepping/state/sliplawstateupdater.cc
+++ b/src/time-stepping/state/sliplawstateupdater.cc
@@ -36,8 +36,8 @@ void SlipLawStateUpdater<ScalarVector, Vector>::solve(
 
         double const V = velocity_fieldi[j].two_norm();
         double const mtoL = -tau * V / L[i];
-        alphai[j] = (V <= 0) ? alpha_oi[j] : std::expm1(mtVoL) * std::log(V / V0[i]) +
-                                               alpha_oi[j] * std::exp(mtVoL);
+        alphai[j] = (V <= 0) ? alpha_oi[j] : std::expm1(mtoL) * std::log(V / V0[i]) +
+                                               alpha_oi[j] * std::exp(mtoL);
       }
    }
 }
diff --git a/src/time-stepping/state_tmpl.cc b/src/time-stepping/state_tmpl.cc
index 5703f81a..718150c7 100644
--- a/src/time-stepping/state_tmpl.cc
+++ b/src/time-stepping/state_tmpl.cc
@@ -3,4 +3,4 @@
 template std::shared_ptr<StateUpdater<ScalarVector, Vector>>
 initStateUpdater<ScalarVector, Vector>(
     Config::stateModel model, const std::vector<ScalarVector>& alpha_initial,
-        const std::vector<Dune::BitSetVector<_Tp1>>& frictionalNodes, const std::vector<double>& L, const std::vector<double>& V0);
+        const std::vector<Dune::BitSetVector<1>>& frictionalNodes, const std::vector<double>& L, const std::vector<double>& V0);
diff --git a/src/vtk_tmpl.cc b/src/vtk_tmpl.cc
index f6790e5c..ecfecf9a 100644
--- a/src/vtk_tmpl.cc
+++ b/src/vtk_tmpl.cc
@@ -8,8 +8,8 @@
 #include <dune/fufem/functionspacebases/p0basis.hh>
 #include <dune/fufem/functionspacebases/p1nodalbasis.hh>
 
-using MyP0Basis = P0Basis<GridView, double>;
-using P1Basis = P1NodalBasis<GridView, double>;
+using MyP0Basis = P0Basis<LeafGridView, double>;
+using P1Basis = P1NodalBasis<LeafGridView, double>;
 
 template class MyVTKWriter<P1Basis, MyP0Basis>;
 
-- 
GitLab