From 310490fbdfd26fb8ee192187b07ed0a7d97fe11f Mon Sep 17 00:00:00 2001
From: Elias Pipping <elias.pipping@fu-berlin.de>
Date: Thu, 19 Jun 2014 16:37:19 +0200
Subject: [PATCH] [Noise]   Replace log(\theta) with alpha

Also changes the [Output]
---
 dune/tectonic/frictionpotential.hh       |  8 ++--
 dune/tectonic/globalnonlinearity.hh      |  2 +-
 dune/tectonic/globalruinanonlinearity.hh |  4 +-
 dune/tectonic/localfriction.hh           |  2 +-
 src/friction_writer.cc                   |  2 +-
 src/sand-wedge-data/parset.cfg           |  2 +-
 src/sand-wedge.cc                        | 11 ++---
 src/state.hh                             |  6 +--
 src/state/dieterichstateupdater.hh       | 52 ++++++++++++------------
 src/state/explicit.tex                   | 16 ++++++++
 src/state/ruinastateupdater.hh           | 34 ++++++++--------
 src/state/stateupdater.hh                |  2 +-
 src/vtk.cc                               |  6 +--
 13 files changed, 81 insertions(+), 66 deletions(-)
 create mode 100644 src/state/explicit.tex

diff --git a/dune/tectonic/frictionpotential.hh b/dune/tectonic/frictionpotential.hh
index 6d2c0154..59e7ec53 100644
--- a/dune/tectonic/frictionpotential.hh
+++ b/dune/tectonic/frictionpotential.hh
@@ -24,7 +24,7 @@ class FrictionPotentialWrapper {
     DUNE_THROW(Dune::NotImplemented, "evaluation not implemented");
   }
 
-  void virtual updateLogState(double) = 0;
+  void virtual updateAlpha(double) = 0;
 };
 
 class FrictionPotential : public FrictionPotentialWrapper {
@@ -60,8 +60,8 @@ class FrictionPotential : public FrictionPotentialWrapper {
     return std::abs(second_deriv(V));
   }
 
-  void updateLogState(double logState) {
-    logrest = (fd.mu0 + fd.b * (logState + std::log(fd.V0 / fd.L))) / fd.a;
+  void updateAlpha(double alpha) {
+    logrest = (fd.mu0 + fd.b * alpha) / fd.a;
     Vmin = fd.V0 / std::exp(logrest);
   }
 
@@ -85,6 +85,6 @@ class TrivialFunction : public FrictionPotentialWrapper {
 
   double regularity(double) const { return 0; }
 
-  void updateLogState(double) {}
+  void updateAlpha(double) {}
 };
 #endif
diff --git a/dune/tectonic/globalnonlinearity.hh b/dune/tectonic/globalnonlinearity.hh
index 2f00da1b..60dde9b4 100644
--- a/dune/tectonic/globalnonlinearity.hh
+++ b/dune/tectonic/globalnonlinearity.hh
@@ -82,6 +82,6 @@ template <class Matrix, class Vector> class GlobalNonlinearity {
     return res->regularity(x);
   }
 
-  void virtual updateLogState(ScalarVector const &logState) = 0;
+  void virtual updateAlpha(ScalarVector const &alpha) = 0;
 };
 #endif
diff --git a/dune/tectonic/globalruinanonlinearity.hh b/dune/tectonic/globalruinanonlinearity.hh
index 4c82a517..69c751b4 100644
--- a/dune/tectonic/globalruinanonlinearity.hh
+++ b/dune/tectonic/globalruinanonlinearity.hh
@@ -51,9 +51,9 @@ class GlobalRuinaNonlinearity : public GlobalNonlinearity<Matrix, Vector> {
     }
   }
 
-  void updateLogState(ScalarVector const &logState) override {
+  void updateAlpha(ScalarVector const &alpha) override {
     for (size_t i = 0; i < restrictions.size(); ++i)
-      restrictions[i]->updateLogState(logState[i]);
+      restrictions[i]->updateAlpha(alpha[i]);
   }
 
   void coefficientOfFriction(Vector const &x, ScalarVector &coefficient) {
diff --git a/dune/tectonic/localfriction.hh b/dune/tectonic/localfriction.hh
index eaea43c4..ed96fdd5 100644
--- a/dune/tectonic/localfriction.hh
+++ b/dune/tectonic/localfriction.hh
@@ -24,7 +24,7 @@ template <size_t dimension> class LocalFriction {
     return func->evaluate(x.two_norm());
   }
 
-  void updateLogState(double logState) { func->updateLogState(logState); }
+  void updateAlpha(double alpha) { func->updateAlpha(alpha); }
 
   double regularity(VectorType const &x) const {
     double const xnorm = x.two_norm();
diff --git a/src/friction_writer.cc b/src/friction_writer.cc
index 175f8e6a..cc24c2e4 100644
--- a/src/friction_writer.cc
+++ b/src/friction_writer.cc
@@ -12,7 +12,7 @@ FrictionWriter<ScalarVector, Vector>::FrictionWriter(
     typename BW::Projector projector)
     : BW(vertexCoordinates, _boundaryNodes, prefix, projector),
       coefficientWriter(prefix + "Coefficients", std::fstream::out),
-      stateWriter(prefix + "LogStates", std::fstream::out) {}
+      stateWriter(prefix + "Alpha", std::fstream::out) {}
 
 template <class ScalarVector, class Vector>
 FrictionWriter<ScalarVector, Vector>::~FrictionWriter() {
diff --git a/src/sand-wedge-data/parset.cfg b/src/sand-wedge-data/parset.cfg
index 0becf2b5..e1adc85a 100644
--- a/src/sand-wedge-data/parset.cfg
+++ b/src/sand-wedge-data/parset.cfg
@@ -25,7 +25,7 @@ C               = 10    # [Pa]
 mu0             = 0.7   # [1]
 V0              = 5e-5  # [m/s]
 L               = 2e-5  # [m]      ?
-initialLogState = 0     # [ ]      ?
+initialAlpha    = 0.916290731874155 # [ ]      ?
 stateModel      = Dieterich
 [boundary.friction.weakening]
 a               = 0.015 # [1]      ?
diff --git a/src/sand-wedge.cc b/src/sand-wedge.cc
index 65f2ec00..ec95af91 100644
--- a/src/sand-wedge.cc
+++ b/src/sand-wedge.cc
@@ -243,7 +243,7 @@ int main(int argc, char *argv[]) {
     ur_initial = 0.0;
 
     ScalarVector alpha_initial(fineVertexCount);
-    alpha_initial = parset.get<double>("boundary.friction.initialLogState");
+    alpha_initial = parset.get<double>("boundary.friction.initialAlpha");
     ScalarVector normalStress(fineVertexCount);
     myAssembler.assembleNormalStress(frictionalBoundary, normalStress,
                                      body.getYoungModulus(),
@@ -251,7 +251,7 @@ int main(int argc, char *argv[]) {
     MyGlobalFrictionData<dims> frictionInfo(parset.sub("boundary.friction"));
     auto myGlobalNonlinearity = myAssembler.assembleFrictionNonlinearity(
         frictionalBoundary, frictionInfo, normalStress);
-    myGlobalNonlinearity->updateLogState(alpha_initial);
+    myGlobalNonlinearity->updateAlpha(alpha_initial);
 
     Vector v_initial(fineVertexCount);
     v_initial = 0.0;
@@ -350,7 +350,8 @@ int main(int argc, char *argv[]) {
     auto stateUpdater = initStateUpdater<ScalarVector, Vector>(
         parset.get<Config::stateModel>("boundary.friction.stateModel"),
         alpha_initial, frictionalNodes,
-        parset.get<double>("boundary.friction.L"));
+        parset.get<double>("boundary.friction.L"),
+        parset.get<double>("boundary.friction.V0"));
 
     Vector v = v_initial;
     Vector v_m(fineVertexCount);
@@ -395,7 +396,7 @@ int main(int argc, char *argv[]) {
       size_t iterationCounter;
       auto solveVelocityProblem = [&](Vector &_velocityIterate,
                                       ScalarVector const &_alpha) {
-        myGlobalNonlinearity->updateLogState(_alpha);
+        myGlobalNonlinearity->updateAlpha(_alpha);
 
         // NIT: Do we really need to pass u here?
         typename NonlinearFactory::ConvexProblem convexProblem(
@@ -420,7 +421,7 @@ int main(int argc, char *argv[]) {
         Arithmetic::addProduct(v_m, lambda, v);
 
         stateUpdater->solve(v_m);
-        stateUpdater->extractLogState(alpha);
+        stateUpdater->extractAlpha(alpha);
 
         if (stateFPI == 1)
           relaxationWriter << "N ";
diff --git a/src/state.hh b/src/state.hh
index 9d752b65..57c24f62 100644
--- a/src/state.hh
+++ b/src/state.hh
@@ -11,14 +11,14 @@
 template <class ScalarVector, class Vector>
 std::shared_ptr<StateUpdater<ScalarVector, Vector>> initStateUpdater(
     Config::stateModel model, ScalarVector const &alpha_initial,
-    Dune::BitSetVector<1> const &frictionalNodes, double L) {
+    Dune::BitSetVector<1> const &frictionalNodes, double L, double V0) {
   switch (model) {
     case Config::Dieterich:
       return std::make_shared<DieterichStateUpdater<ScalarVector, Vector>>(
-          alpha_initial, frictionalNodes, L);
+          alpha_initial, frictionalNodes, L, V0);
     case Config::Ruina:
       return std::make_shared<RuinaStateUpdater<ScalarVector, Vector>>(
-          alpha_initial, frictionalNodes, L);
+          alpha_initial, frictionalNodes, L, V0);
     default:
       assert(false);
   }
diff --git a/src/state/dieterichstateupdater.hh b/src/state/dieterichstateupdater.hh
index 30a9c6dc..f8414bd4 100644
--- a/src/state/dieterichstateupdater.hh
+++ b/src/state/dieterichstateupdater.hh
@@ -7,31 +7,33 @@
 template <class ScalarVector, class Vector>
 class DieterichStateUpdater : public StateUpdater<ScalarVector, Vector> {
 public:
-  DieterichStateUpdater(ScalarVector _logState_initial,
-                        Dune::BitSetVector<1> const &_nodes, double _L);
+  DieterichStateUpdater(ScalarVector _alpha_initial,
+                        Dune::BitSetVector<1> const &_nodes, double _L,
+                        double _V0);
 
   void virtual nextTimeStep();
   void virtual setup(double _tau);
   void virtual solve(Vector const &velocity_field);
-  void virtual extractLogState(ScalarVector &);
+  void virtual extractAlpha(ScalarVector &);
 
 private:
-  ScalarVector logState_o;
-  ScalarVector logState;
+  ScalarVector alpha_o;
+  ScalarVector alpha;
   Dune::BitSetVector<1> const &nodes;
   double const L;
+  double const V0;
   double tau;
 };
 
 template <class ScalarVector, class Vector>
 DieterichStateUpdater<ScalarVector, Vector>::DieterichStateUpdater(
-    ScalarVector _logState_initial, Dune::BitSetVector<1> const &_nodes,
-    double _L)
-    : logState(_logState_initial), nodes(_nodes), L(_L) {}
+    ScalarVector _alpha_initial, Dune::BitSetVector<1> const &_nodes, double _L,
+    double _V0)
+    : alpha(_alpha_initial), nodes(_nodes), L(_L), V0(_V0) {}
 
 template <class ScalarVector, class Vector>
 void DieterichStateUpdater<ScalarVector, Vector>::nextTimeStep() {
-  logState_o = logState;
+  alpha_o = alpha;
 }
 
 template <class ScalarVector, class Vector>
@@ -40,17 +42,14 @@ void DieterichStateUpdater<ScalarVector, Vector>::setup(double _tau) {
 }
 
 /*
-  Approximate (1-exp(-tV))/V, i.e. t*(exp(x) - 1)/x
-  for x = -t*v close to 0
-
-  with t, V >= 0, so that x should be non-positive
+  Compute [ 1-\exp(c*x) ] / x under the assumption that x is
+  non-negative
 */
-double approximateMyPowerSeries(double V, double t) {
-  double mVt = -V * t;
-  if (mVt >= 0)
-    return t;
-
-  return -std::expm1(mVt) / V;
+double liftSingularity(double c, double x) {
+  if (x <= 0)
+    return -c;
+  else
+    return -std::expm1(c * x) / x;
 }
 
 template <class ScalarVector, class Vector>
@@ -60,18 +59,17 @@ void DieterichStateUpdater<ScalarVector, Vector>::solve(
     if (not toBool(nodes[i]))
       continue;
 
-    double const VoL = velocity_field[i].two_norm() / L;
-    // log( (1-exp(-tV))/V + exp(alpha_old - tV) ) with a
-    // liftable singularity at V=0
-    logState[i] = std::log(approximateMyPowerSeries(VoL, tau) +
-                           std::exp(logState_o[i] - tau * VoL));
+    double const V = velocity_field[i].two_norm();
+    double const mtoL = -tau / L;
+    alpha[i] = std::log(std::exp(alpha_o[i] + V * mtoL) +
+                        V0 * liftSingularity(mtoL, V));
   }
 }
 
 template <class ScalarVector, class Vector>
-void DieterichStateUpdater<ScalarVector, Vector>::extractLogState(
-    ScalarVector &_logState) {
-  _logState = logState;
+void DieterichStateUpdater<ScalarVector, Vector>::extractAlpha(
+    ScalarVector &_alpha) {
+  _alpha = alpha;
 }
 
 #endif
diff --git a/src/state/explicit.tex b/src/state/explicit.tex
new file mode 100644
index 00000000..4e60ce34
--- /dev/null
+++ b/src/state/explicit.tex
@@ -0,0 +1,16 @@
+\documentclass[preview]{standalone}
+\providecommand\Vref{V_\ast}
+\usepackage{amsmath}
+\usepackage{mathtools}
+\DeclarePairedDelimiter\paren{\lparen}{\rparen}
+\begin{document}
+\begin{equation*}
+  \alpha(t) =
+  \begin{cases*}
+    \log\paren*{e^{\alpha_0-tV/L} + \Vref \frac{1 - e^{-tV/L}}V}
+    &for the ageing law,\\
+    (e^{-\frac {tV}L} - 1) \log \frac V\Vref + \alpha_0 e^{-\frac {tV}L}
+    &for the slip law.
+  \end{cases*}
+\end{equation*}
+\end{document}
diff --git a/src/state/ruinastateupdater.hh b/src/state/ruinastateupdater.hh
index 578f1e9f..616a837b 100644
--- a/src/state/ruinastateupdater.hh
+++ b/src/state/ruinastateupdater.hh
@@ -7,31 +7,32 @@
 template <class ScalarVector, class Vector>
 class RuinaStateUpdater : public StateUpdater<ScalarVector, Vector> {
 public:
-  RuinaStateUpdater(ScalarVector _logState_initial,
-                    Dune::BitSetVector<1> const &_nodes, double _L);
+  RuinaStateUpdater(ScalarVector _alpha_initial,
+                    Dune::BitSetVector<1> const &_nodes, double _L, double _V0);
 
   void virtual nextTimeStep();
   void virtual setup(double _tau);
   void virtual solve(Vector const &velocity_field);
-  void virtual extractLogState(ScalarVector &);
+  void virtual extractAlpha(ScalarVector &);
 
 private:
-  ScalarVector logState_o;
-  ScalarVector logState;
+  ScalarVector alpha_o;
+  ScalarVector alpha;
   Dune::BitSetVector<1> const &nodes;
   double const L;
+  double const V0;
   double tau;
 };
 
 template <class ScalarVector, class Vector>
 RuinaStateUpdater<ScalarVector, Vector>::RuinaStateUpdater(
-    ScalarVector _logState_initial, Dune::BitSetVector<1> const &_nodes,
-    double _L)
-    : logState(_logState_initial), nodes(_nodes), L(_L) {}
+    ScalarVector _alpha_initial, Dune::BitSetVector<1> const &_nodes, double _L,
+    double _V0)
+    : alpha(_alpha_initial), nodes(_nodes), L(_L), V0(_V0) {}
 
 template <class ScalarVector, class Vector>
 void RuinaStateUpdater<ScalarVector, Vector>::nextTimeStep() {
-  logState_o = logState;
+  alpha_o = alpha;
 }
 
 template <class ScalarVector, class Vector>
@@ -46,18 +47,17 @@ void RuinaStateUpdater<ScalarVector, Vector>::solve(
     if (not toBool(nodes[i]))
       continue;
 
-    double const VoL = velocity_field[i].two_norm() / L;
-    // (exp(-tV) - 1)*log(V) + alpha_old*exp(-tV)
-    logState[i] =
-        (VoL <= 0) ? logState_o[i] : std::expm1(-tau * VoL) * std::log(VoL) +
-                                         logState_o[i] * std::exp(-tau * VoL);
+    double const V = velocity_field[i].two_norm();
+    double const mtVoL = -tau * V / L;
+    alpha[i] = (V <= 0) ? alpha_o[i] : std::expm1(mtVoL) * std::log(V / V0) +
+                                           alpha_o[i] * std::exp(mtVoL);
   }
 }
 
 template <class ScalarVector, class Vector>
-void RuinaStateUpdater<ScalarVector, Vector>::extractLogState(
-    ScalarVector &_logState) {
-  _logState = logState;
+void RuinaStateUpdater<ScalarVector, Vector>::extractAlpha(
+    ScalarVector &_alpha) {
+  _alpha = alpha;
 }
 
 #endif
diff --git a/src/state/stateupdater.hh b/src/state/stateupdater.hh
index 9ff93756..0ebf4774 100644
--- a/src/state/stateupdater.hh
+++ b/src/state/stateupdater.hh
@@ -6,7 +6,7 @@ template <class ScalarVector, class Vector> class StateUpdater {
   void virtual nextTimeStep() = 0;
   void virtual setup(double _tau) = 0;
   void virtual solve(Vector const &velocity_field) = 0;
-  void virtual extractLogState(ScalarVector &logState) = 0;
+  void virtual extractAlpha(ScalarVector &alpha) = 0;
 };
 
 #endif
diff --git a/src/vtk.cc b/src/vtk.cc
index 0155384e..6755b8b7 100644
--- a/src/vtk.cc
+++ b/src/vtk.cc
@@ -32,10 +32,10 @@ void MyVTKWriter<VertexBasis, CellBasis>::write(
           vertexBasis, v, "velocity");
   writer.addVertexData(velocityPointer);
 
-  auto const logStatePointer =
+  auto const AlphaPointer =
       std::make_shared<VTKBasisGridFunction<VertexBasis, ScalarVector> const>(
-          vertexBasis, alpha, "logState");
-  writer.addVertexData(logStatePointer);
+          vertexBasis, alpha, "Alpha");
+  writer.addVertexData(AlphaPointer);
 
   auto const stressPointer =
       std::make_shared<VTKBasisGridFunction<CellBasis, ScalarVector> const>(
-- 
GitLab