From dee660a8483bda34c69ba1633c6f7d660a3b41da Mon Sep 17 00:00:00 2001
From: Elias Pipping <elias.pipping@fu-berlin.de>
Date: Sat, 28 Mar 2015 13:35:51 +0100
Subject: [PATCH] [Problem] 3D: Use an asymmetric weak patch

---
 src/enumparser.cc                 | 12 ++++++++++++
 src/enumparser.hh                 |  4 ++++
 src/enums.hh                      |  1 +
 src/sand-wedge-data/parset-3D.cfg |  3 +++
 src/sand-wedge-data/weakpatch.hh  | 13 ++++++++++++-
 src/sand-wedge.cc                 |  7 ++++---
 6 files changed, 36 insertions(+), 4 deletions(-)

diff --git a/src/enumparser.cc b/src/enumparser.cc
index e7d58c50..f5649eff 100644
--- a/src/enumparser.cc
+++ b/src/enumparser.cc
@@ -56,6 +56,17 @@ Config::stateModel StringToEnum<Config::stateModel>::convert(
   DUNE_THROW(Dune::Exception, "failed to parse enum");
 }
 
+Config::PatchType StringToEnum<Config::PatchType>::convert(
+    std::string const &s) {
+  if (s == "Rectangular")
+    return Config::Rectangular;
+
+  if (s == "Trapezoidal")
+    return Config::Trapezoidal;
+
+  DUNE_THROW(Dune::Exception, "failed to parse enum");
+}
+
 Solver::VerbosityMode StringToEnum<Solver::VerbosityMode>::convert(
     std::string const &s) {
   if (s == "full")
@@ -73,4 +84,5 @@ Solver::VerbosityMode StringToEnum<Solver::VerbosityMode>::convert(
 template std::istream &operator>>(std::istream &lhs, Config::FrictionModel &);
 template std::istream &operator>>(std::istream &lhs, Config::stateModel &);
 template std::istream &operator>>(std::istream &lhs, Config::scheme &);
+template std::istream &operator>>(std::istream &lhs, Config::PatchType &);
 template std::istream &operator>>(std::istream &lhs, Solver::VerbosityMode &);
diff --git a/src/enumparser.hh b/src/enumparser.hh
index 7eaa0fa6..0f5cd5d8 100644
--- a/src/enumparser.hh
+++ b/src/enumparser.hh
@@ -23,6 +23,10 @@ template <> struct StringToEnum<Config::scheme> {
   static Config::scheme convert(std::string const &s);
 };
 
+template <> struct StringToEnum<Config::PatchType> {
+  static Config::PatchType convert(std::string const &s);
+};
+
 template <> struct StringToEnum<Solver::VerbosityMode> {
   static Solver::VerbosityMode convert(std::string const &s);
 };
diff --git a/src/enums.hh b/src/enums.hh
index a6bf4ad0..0ec8540d 100644
--- a/src/enums.hh
+++ b/src/enums.hh
@@ -5,6 +5,7 @@ struct Config {
   enum FrictionModel { Truncated, Regularised };
   enum stateModel { AgeingLaw, SlipLaw };
   enum scheme { Newmark, BackwardEuler };
+  enum PatchType { Rectangular, Trapezoidal };
 };
 
 #endif
diff --git a/src/sand-wedge-data/parset-3D.cfg b/src/sand-wedge-data/parset-3D.cfg
index 3495d53f..3ff0794d 100644
--- a/src/sand-wedge-data/parset-3D.cfg
+++ b/src/sand-wedge-data/parset-3D.cfg
@@ -2,6 +2,9 @@
 [boundary.friction]
 smallestDiameter= 2e-2  # [m]
 
+[boundary.friction.weakening]
+patchType       = Trapezoidal
+
 [timeSteps]
 refinementTolerance = 1e-5
 
diff --git a/src/sand-wedge-data/weakpatch.hh b/src/sand-wedge-data/weakpatch.hh
index a6162ebe..0ae7f614 100644
--- a/src/sand-wedge-data/weakpatch.hh
+++ b/src/sand-wedge-data/weakpatch.hh
@@ -1,7 +1,8 @@
 #ifndef SRC_SAND_WEDGE_DATA_WEAKPATCH_HH
 #define SRC_SAND_WEDGE_DATA_WEAKPATCH_HH
 
-template <class LocalVector> ConvexPolyhedron<LocalVector> getWeakPatch() {
+template <class LocalVector>
+ConvexPolyhedron<LocalVector> getWeakPatch(Dune::ParameterTree const &parset) {
   ConvexPolyhedron<LocalVector> weakPatch;
 #if MY_DIM == 3
   weakPatch.vertices.resize(4);
@@ -11,6 +12,16 @@ template <class LocalVector> ConvexPolyhedron<LocalVector> getWeakPatch() {
     weakPatch.vertices[k][2] = -MyGeometry::depth / 2.0;
     weakPatch.vertices[k + 2][2] = MyGeometry::depth / 2.0;
   }
+  switch (parset.get<Config::PatchType>("patchType")) {
+    case Config::Rectangular:
+      break;
+    case Config::Trapezoidal:
+      weakPatch.vertices[1][0] += 0.05 * MyGeometry::lengthScale;
+      weakPatch.vertices[3][0] -= 0.05 * MyGeometry::lengthScale;
+      break;
+    default:
+      assert(false);
+  }
 #else
   weakPatch.vertices.resize(2);
   weakPatch.vertices[0] = MyGeometry::X;
diff --git a/src/sand-wedge.cc b/src/sand-wedge.cc
index c717b887..f6ed0693 100644
--- a/src/sand-wedge.cc
+++ b/src/sand-wedge.cc
@@ -119,7 +119,8 @@ int main(int argc, char *argv[]) {
     using ScalarMatrix = MyAssembler::ScalarMatrix;
     using ScalarVector = MyAssembler::ScalarVector;
 
-    auto weakPatch = getWeakPatch<LocalVector>();
+    auto const weakPatch =
+        getWeakPatch<LocalVector>(parset.sub("boundary.friction.weakening"));
 
     // {{{ Set up grid
     GridConstructor<Grid> gridConstructor;
@@ -140,8 +141,8 @@ int main(int argc, char *argv[]) {
     std::cout << "min diameter: " << minDiameter << std::endl;
     std::cout << "max diameter: " << maxDiameter << std::endl;
 
-    GridView const leafView = grid->leafGridView();
-    size_t const leafVertexCount = leafView.size(dims);
+    auto const leafView = grid->leafGridView();
+    auto const leafVertexCount = leafView.size(dims);
 
     std::cout << "Number of DOFs: " << leafVertexCount << std::endl;
 
-- 
GitLab