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