diff --git a/src/sand-wedge-data/geometry.tex b/src/sand-wedge-data/geometry.tex
index 56254a9b1368f66b72601d27a32addbae626c781..32d63b6e55cc1ee056dafdcaea8c784399ac177e 100644
--- a/src/sand-wedge-data/geometry.tex
+++ b/src/sand-wedge-data/geometry.tex
@@ -4,58 +4,50 @@
 \usetikzlibrary{calc}
 \usetikzlibrary{decorations.pathreplacing}
 
-
 \usepackage{siunitx}
 
 \begin{document}
-\begin{tikzpicture}[scale=12]
-  \pgfmathsetmacro{\rightleg}{0.27};
-  \pgfmathsetmacro{\leftleg}{1.00};
-  \pgfmathsetmacro{\hypot}{sqrt(\leftleg^2+\rightleg^2)};
-  \pgfmathsetmacro{\myangle}{atan(\rightleg/\leftleg)};
-  \pgfmathsetmacro{\ssin}{sin(\myangle)};
-  \pgfmathsetmacro{\scos}{cos(\myangle)};
-  \pgfmathsetmacro{\lsin}{sin(90-\myangle)};
+\pgfmathsetmacro{\rightleg}{0.27}
+\pgfmathsetmacro{\leftleg}{1.00}
+\pgfmathsetmacro{\leftangle}{atan(\rightleg/\leftleg)}
+\begin{tikzpicture}[scale=12, rotate=\leftangle]
+  \pgfmathsetmacro{\mysin}{sin(\leftangle)}
+  \pgfmathsetmacro{\mycos}{cos(\leftangle)}
+  \pgfmathsetmacro{\viscoheight}{0.06}
+  \pgfmathsetmacro{\Zx}{0.35}
+  \pgfmathsetmacro{\weaklen}{0.20}
 
   \coordinate (A) at (0,0);
   \node at (A) [left] {A};
-  \coordinate (B) at (\hypot,0);
+  \coordinate (B) at (\leftleg,-\rightleg);
   \node at (B) [right] {B};
-  \coordinate (C) at (\lsin, \rightleg*\lsin);
-  \node at (C) [above] {C};
+  \coordinate (C) at (\leftleg,0);
+  \node at (C) [right] {C};
 
-  \draw (A)
-  -- (B)
-  -- (C)
-  -- node [above=.5cm, sloped] {$\overline{AC}=\SI{100}{cm}$} (A);
+  \draw (A) -- (B) -- (C) -- node [above=.5cm, sloped] {$\overline{AC}=\SI{100}{cm}$} (A);
 
-  \coordinate (Y) at ($(0.35/\lsin, 0)$);
-  \node at (Y) [below right] {Y};
-  \coordinate (Z) at ($(0.35*\lsin,0.35*\ssin)$);
+  \coordinate (Z) at (\Zx,0);
   \node at (Z) [above] {Z};
-  \coordinate (X) at ($(Y) - (0.20,0)$);
-  \node at (X) [below left] {X};
-  \path let \p1 = (X), \p2 = (Y), \p3 = (Z) in
-    coordinate (U) at ($(\x1 * \x3 / \x2, \x1 * \y3 / \x2)$);
+  \coordinate (Y) at ($(\Zx,-\Zx/\leftleg * \rightleg)$);
+  \node at (Y) [below] {Y};
+  \coordinate (X) at ($(Y) + (-\weaklen*\mycos,\weaklen*\mysin)$);
+  \node at (X) [below] {X};
+  \path let \p1 = (X) in coordinate (U) at ($(\x1, 0)$);
   \node at (U) [above] {U};
 
   \path (A) -- node [above=.25cm, sloped] {$\overline{AZ} = \SI{35}{cm}$} (Z);
 
-  \draw[color=red, thick] (X)
-  -- node [below=.25cm, sloped] {$\overline{XY}=\SI{20}{cm}$} (Y);
+  \draw[color=red, thick] (X) -- node [below=.25cm] {$\overline{XY}=\SI{20}{cm}$} (Y);
   \draw[dashed] (Y) -- (Z);
   \draw[dashed] (U) -- (X);
 
-  \coordinate (K) at ($(B) - (0.06 / \ssin,0)$);
+  \coordinate (K) at ($(B) + (-\leftleg * \viscoheight / \rightleg,\viscoheight)$);
   \node at (K) [below] {K};
-  \coordinate (M) at ($(B) + (-0.06 * \ssin, 0.06 * \lsin)$);
+  \coordinate (M) at ($(B) + (0, \viscoheight)$);
   \node at (M) [right] {M};
-
   \path (C) -- node [right=.5cm] {$\overline{CM} = \SI{21}{cm}$} (M);
 
-  \draw[thick] (K)
-  -- (B)
-  -- node [right=.75cm] {$\overline{BM}=\SI{6}{cm}$} (M) -- cycle;
+  \path[fill=blue] (K) -- (B) -- node [right=.75cm] {$\overline{BM}=\SI{6}{cm}$} (M) -- cycle;
 
   \coordinate (G) at ($(A) ! 0.5 ! (X)$);
   \node at (G) [below] {G};
@@ -67,11 +59,7 @@
   \coordinate (I) at ($(Y) + (G)$);
   \node at (I) [below] {I};
 
-  % Note: Lengths and position are arbitrarily chosen here
-  \draw[->] (0.4,0.45) -- node [above, sloped] {vertical} +(-0.15*\ssin,0.15*\scos);
-  \draw[->] (0.4,0.45) -- node [above, sloped] {horizontal} +(-0.15*\scos,-0.15*\ssin);
-
-  \node[align=left] at (0.5,-0.125) {
+  \node[align=left] at (0.5,-0.225) {
     $Z$: coast line\\
     $\overline{XY}$: velocity weakening zone\\
     $BKM$: visco-elastic domain};
diff --git a/src/sand-wedge-data/mygeometry.cc b/src/sand-wedge-data/mygeometry.cc
index 5629772f2299b5e2fab4bb7449541e98d31cf0ec..fcc7af22933b768c336d98aa27896067ea010a21 100644
--- a/src/sand-wedge-data/mygeometry.cc
+++ b/src/sand-wedge-data/mygeometry.cc
@@ -53,14 +53,13 @@ void MyGeometry::render() {
 
   cr->scale(widthScale, heightScale);
   cr->translate(0.1, 0.1);
-  cr->rotate(leftAngle);
   cr->set_line_width(0.0025);
 
   // triangle
   {
-    moveTo(A);
-    lineTo(B);
-    lineTo(C);
+    moveTo(reference::A);
+    lineTo(reference::B);
+    lineTo(reference::C);
     cr->close_path();
     cr->stroke();
   }
@@ -70,10 +69,10 @@ void MyGeometry::render() {
     cr->save();
     std::vector<double> dashPattern = { 0.005 };
     cr->set_dash(dashPattern, 0);
-    moveTo(Z);
-    lineTo(Y);
-    moveTo(U);
-    lineTo(X);
+    moveTo(reference::Z);
+    lineTo(reference::Y);
+    moveTo(reference::U);
+    lineTo(reference::X);
     cr->stroke();
     cr->restore();
   }
@@ -82,9 +81,9 @@ void MyGeometry::render() {
   {
     cr->save();
     setRGBColor(0x0097E0);
-    moveTo(B);
-    lineTo(K);
-    lineTo(M);
+    moveTo(reference::B);
+    lineTo(reference::K);
+    lineTo(reference::M);
     cr->fill();
     cr->restore();
   }
@@ -94,8 +93,8 @@ void MyGeometry::render() {
     cr->save();
     setRGBColor(0x7AD3FF);
     cr->set_line_width(0.005);
-    moveTo(X);
-    lineTo(Y);
+    moveTo(reference::X);
+    lineTo(reference::Y);
     cr->stroke();
     cr->restore();
   }
@@ -109,19 +108,19 @@ void MyGeometry::render() {
 
     cr->save();
     setRGBColor(0x002F47);
-    drawCircle(A);
-    drawCircle(B);
-    drawCircle(C);
-    drawCircle(Y);
-    drawCircle(X);
-    drawCircle(Z);
-    drawCircle(U);
-    drawCircle(K);
-    drawCircle(M);
-    drawCircle(G);
-    drawCircle(H);
-    drawCircle(J);
-    drawCircle(I);
+    drawCircle(reference::A);
+    drawCircle(reference::B);
+    drawCircle(reference::C);
+    drawCircle(reference::Y);
+    drawCircle(reference::X);
+    drawCircle(reference::Z);
+    drawCircle(reference::U);
+    drawCircle(reference::K);
+    drawCircle(reference::M);
+    drawCircle(reference::G);
+    drawCircle(reference::H);
+    drawCircle(reference::J);
+    drawCircle(reference::I);
     cr->restore();
   }
 
@@ -140,19 +139,19 @@ void MyGeometry::render() {
     cr->set_font_face(font);
     cr->set_font_size(0.03);
 
-    label(A, "A");
-    label(B, "B");
-    label(C, "C");
-    label(K, "K");
-    label(M, "M");
-    label(U, "U");
-    label(X, "X");
-    label(Y, "Y");
-    label(Z, "Z");
-    label(G, "G");
-    label(H, "H");
-    label(J, "J");
-    label(I, "I");
+    label(reference::A, "A");
+    label(reference::B, "B");
+    label(reference::C, "C");
+    label(reference::K, "K");
+    label(reference::M, "M");
+    label(reference::U, "U");
+    label(reference::X, "X");
+    label(reference::Y, "Y");
+    label(reference::Z, "Z");
+    label(reference::G, "G");
+    label(reference::H, "H");
+    label(reference::J, "J");
+    label(reference::I, "I");
     cr->restore();
   }
 
diff --git a/src/sand-wedge-data/mygeometry.hh b/src/sand-wedge-data/mygeometry.hh
index 0800e1141d3a97b176ca959ad341bb9401becb55..58c97b56c65cc00b64e2992a35fc3bad199d6503 100644
--- a/src/sand-wedge-data/mygeometry.hh
+++ b/src/sand-wedge-data/mygeometry.hh
@@ -1,7 +1,6 @@
-#ifndef SRC_SAND_WEDGE_DATA_MYGEOMETRY_HH
-#define SRC_SAND_WEDGE_DATA_MYGEOMETRY_HH
+#ifndef SRC_MYGEOMETRY_HH
+#define SRC_MYGEOMETRY_HH
 
-#include <dune/common/fassign.hh>
 #include <dune/common/fvector.hh>
 
 #include <dune/fufem/arithmetic.hh>
@@ -15,62 +14,93 @@
 namespace MyGeometry {
 namespace {
   using LocalVector = Dune::FieldVector<double, 2>;
+  using LocalMatrix = Dune::FieldMatrix<double, 2, 2>;
 
-  // kludge because fieldvectors have no initialiser_list constructor, see
-  // https://dune-project.org/flyspray/index.php?do=details&task_id=1166
-  LocalVector generateVector(double x, double y) {
-    LocalVector tmp;
-    tmp <<= x, y;
-    return tmp;
+  LocalVector createVector(double x, double y) {
+    LocalVector ret{ 0 };
+    ret[0] = x;
+    ret[1] = y;
+    return ret;
   }
 
-  double degreesToRadians(double degrees) {
-    return M_PI * degrees / 180;
-  };
+  LocalMatrix createMatrix(double a11, double a12, double a21, double a22) {
+    LocalMatrix ret{ 0 };
+    ret[0][0] = a11;
+    ret[0][1] = a12;
+    ret[1][0] = a21;
+    ret[1][1] = a22;
+    return ret;
+  }
 
   LocalVector convexCombination(LocalVector const &x, LocalVector const &y) {
-    LocalVector ret;
-    ret = 0.0;
+    LocalVector ret{ 0 };
     Arithmetic::addProduct(ret, 0.5, x);
     Arithmetic::addProduct(ret, 0.5, y);
     return ret;
   }
+}
 
-  double leftLeg = 1.00;
-  double rightLeg = 0.27;
-  double leftAngle = degreesToRadians(15);
-  double rightAngle = degreesToRadians(75);
+namespace reference {
+  double const rightLeg = 0.27;
+  double const leftLeg = 1.00;
+  double const leftAngle = atan(rightLeg / leftLeg);
+  double const viscoHeight = 0.06; // Height of the viscous bottom layer
+  double const weakLen = 0.20;     // Length of the weak zone
 
-  double const depth = 0.10;
-}
+  LocalVector const A = createVector(0, 0);
+  LocalVector const B = createVector(leftLeg, -rightLeg);
+  LocalVector const C = createVector(leftLeg, 0);
 
-LocalVector const A = generateVector(0, 0);
-LocalVector const B = generateVector(std::hypot(leftLeg, rightLeg), 0);
-LocalVector const C = generateVector(leftLeg * std::sin(rightAngle),
-                                     leftLeg * std::sin(leftAngle));
+  LocalVector const Z = createVector(0.35, 0);
+  LocalVector const Y = createVector(0.35, -0.35 / leftLeg * rightLeg);
+  LocalVector const X = createVector(Y[0] - weakLen * std::cos(leftAngle),
+                                     Y[1] + weakLen * std::sin(leftAngle));
 
-LocalVector const Y = generateVector(0.35 / std::sin(rightAngle), 0);
-LocalVector const X = generateVector(Y[0] - 0.20, 0);
-LocalVector const Z =
-    generateVector(0.35 * std::sin(rightAngle), 0.35 * std::sin(leftAngle));
+  LocalVector const U = createVector(X[0], 0);
 
-LocalVector const U = generateVector(Z[0] * X[0] / Y[0], Z[1] * X[0] / Y[0]);
+  LocalVector const K =
+      createVector(B[0] - leftLeg * viscoHeight / rightLeg, B[1] + viscoHeight);
+  LocalVector const M = createVector(B[0], B[1] + viscoHeight);
 
-LocalVector const K = generateVector(B[0] - 0.06 / std::sin(leftAngle), 0);
-LocalVector const M = generateVector(B[0] - 0.06 * std::sin(leftAngle),
-                                     0.06 * std::sin(rightAngle));
+  LocalVector const G = convexCombination(A, X);
+  LocalVector const H = convexCombination(X, Y);
+  LocalVector const J = convexCombination(Y, B);
 
-LocalVector const G = convexCombination(A, X);
-LocalVector const H = convexCombination(X, Y);
-LocalVector const J = convexCombination(Y, B);
+  LocalVector const I = createVector(Y[0] + G[0], Y[1] + G[1]);
 
-LocalVector const I = generateVector(Y[0] + G[0], 0);
+  LocalVector const zenith = createVector(0, 1);
+  LocalVector const rotatedZenith = createVector(-1, 0);
 
-LocalVector const zenith =
-    generateVector(-std::sin(leftAngle), std::cos(leftAngle));
+  LocalMatrix const rotation =
+      createMatrix(std::cos(leftAngle), -std::sin(leftAngle),
+                   std::sin(leftAngle), std::cos(leftAngle));
+}
+
+namespace {
+  LocalVector rotate(LocalVector const &x) {
+    LocalVector ret{ 0 };
+    reference::rotation.mv(x, ret);
+    return ret;
+  }
+}
 
+LocalVector const A = rotate(reference::A);
+LocalVector const B = rotate(reference::B);
+LocalVector const C = rotate(reference::C);
+LocalVector const G = rotate(reference::G);
+LocalVector const H = rotate(reference::H);
+LocalVector const I = rotate(reference::I);
+LocalVector const J = rotate(reference::J);
+LocalVector const K = rotate(reference::K);
+LocalVector const M = rotate(reference::M);
+LocalVector const U = rotate(reference::U);
+LocalVector const X = rotate(reference::X);
+LocalVector const Y = rotate(reference::Y);
+LocalVector const Z = rotate(reference::Z);
+
+LocalVector const zenith = rotate(reference::zenith);
 LocalVector const rotatedZenith =
-    generateVector(-std::cos(leftAngle), -std::sin(leftAngle));
+    rotate(reference::rotatedZenith); // FIXME: misnomer
 
 double verticalProjection(LocalVector const &);
 double horizontalProjection(LocalVector const &);