From 2d9eaad2bfd8afebce6d65f499671250664c8625 Mon Sep 17 00:00:00 2001
From: Elias Pipping <elias.pipping@fu-berlin.de>
Date: Mon, 14 Nov 2011 11:48:34 +0100
Subject: [PATCH] Handle choice Ruina/Laursen in the parset file

---
 src/one-body-sample.cc     | 37 ++++++++++++++++++++++++-------------
 src/one-body-sample.parset |  5 ++++-
 2 files changed, 28 insertions(+), 14 deletions(-)

diff --git a/src/one-body-sample.cc b/src/one-body-sample.cc
index 595341b1..9765f0d4 100644
--- a/src/one-body-sample.cc
+++ b/src/one-body-sample.cc
@@ -216,34 +216,44 @@ int main(int argc, char *argv[]) {
       stiffnessMatrix.umv(u3, b3);
 
       // {{{ Assemble terms for the nonlinearity
-      std::vector<double> a;
-      a.resize(grid.size(grid.maxLevel(), dim));
-      std::fill(a.begin(), a.end(), parset.get<double>("boundary.a"));
 
       std::vector<double> coefficientOfFriction;
       coefficientOfFriction.resize(grid.size(grid.maxLevel(), dim));
       std::fill(coefficientOfFriction.begin(), coefficientOfFriction.end(),
                 parset.get<double>("boundary.mu"));
 
-      std::vector<double> eta;
-      eta.resize(grid.size(grid.maxLevel(), dim));
-      std::fill(eta.begin(), eta.end(), parset.get<double>("boundary.eta"));
-
       std::vector<double> normalStress;
       normalStress.resize(grid.size(grid.maxLevel(), dim));
       std::fill(normalStress.begin(), normalStress.end(),
                 parset.get<double>("boundary.normalstress"));
 
-      Dune::GlobalLaursenNonlinearity<dim, Dune::LinearFunction>
-      myGlobalNonlinearity(coefficientOfFriction, normalStress, nodalIntegrals);
-      // Dune::GlobalRuinaNonlinearity<dim>
-      //   myGlobalNonlinearity(nodalIntegrals, a, coefficientOfFriction, eta,
-      // normalStress);
+      Dune::GlobalNonlinearity<dim> *myGlobalNonlinearity;
+
+      std::string const friction_model =
+          parset.get<std::string>("boundary.friction.model");
+      if (friction_model == std::string("Ruina")) {
+        std::vector<double> a;
+        a.resize(grid.size(grid.maxLevel(), dim));
+        std::fill(a.begin(), a.end(), parset.get<double>("boundary.a"));
+
+        std::vector<double> eta;
+        eta.resize(grid.size(grid.maxLevel(), dim));
+        std::fill(eta.begin(), eta.end(), parset.get<double>("boundary.eta"));
+
+        myGlobalNonlinearity = new Dune::GlobalRuinaNonlinearity<dim>(
+            nodalIntegrals, a, coefficientOfFriction, eta, normalStress);
+      } else if (friction_model == std::string("Laursen")) {
+        myGlobalNonlinearity =
+            new Dune::GlobalLaursenNonlinearity<dim, Dune::LinearFunction>(
+                coefficientOfFriction, normalStress, nodalIntegrals);
+      } else {
+        assert(false);
+      }
       // }}}
 
       {
         MyConvexProblemType myConvexProblem(stiffnessMatrix,
-                                            myGlobalNonlinearity, b1, u1);
+                                            *myGlobalNonlinearity, b1, u1);
         MyBlockProblemType myBlockProblem(myConvexProblem);
         nonlinearGSStep.setProblem(u1, myBlockProblem);
 
@@ -251,6 +261,7 @@ int main(int argc, char *argv[]) {
                                       solver_tolerance, &energyNorm,
                                       Solver::QUIET);
         solver.solve();
+        free(myGlobalNonlinearity);
       }
 
       auto *displacement =
diff --git a/src/one-body-sample.parset b/src/one-body-sample.parset
index cb061d7c..6545db65 100644
--- a/src/one-body-sample.parset
+++ b/src/one-body-sample.parset
@@ -15,4 +15,7 @@ tolerance = 1e-6
 a = 0.0015
 normalstress = 0.1
 mu = 0.75
-eta = 1
\ No newline at end of file
+eta = 1
+
+[boundary.friction]
+model = Laursen
-- 
GitLab