Skip to content
Snippets Groups Projects
Commit 60e97580 authored by Elias Pipping's avatar Elias Pipping Committed by Elias Pipping
Browse files

[Problem] Allow mu to be cut off (from below)

parent 47981e0e
No related branches found
No related tags found
No related merge requests found
...@@ -9,6 +9,7 @@ struct FrictionData { ...@@ -9,6 +9,7 @@ struct FrictionData {
a(parset.get<double>("a")), a(parset.get<double>("a")),
b(parset.get<double>("b")), b(parset.get<double>("b")),
mu0(parset.get<double>("mu0")), mu0(parset.get<double>("mu0")),
mumin(parset.get<double>("mumin")),
normalStress(normalStress) {} normalStress(normalStress) {}
double const L; double const L;
...@@ -16,6 +17,7 @@ struct FrictionData { ...@@ -16,6 +17,7 @@ struct FrictionData {
double const a; double const a;
double const b; double const b;
double const mu0; double const mu0;
double const mumin;
double const normalStress; double const normalStress;
}; };
#endif #endif
...@@ -34,23 +34,15 @@ class FrictionPotential : public FrictionPotentialWrapper { ...@@ -34,23 +34,15 @@ class FrictionPotential : public FrictionPotentialWrapper {
FrictionPotential(double coefficient, FrictionData const &fd) FrictionPotential(double coefficient, FrictionData const &fd)
: fd(fd), weightTimesNormalStress(coefficient * fd.normalStress) {} : fd(fd), weightTimesNormalStress(coefficient * fd.normalStress) {}
double evaluate(double V) const {
assert(V >= 0);
if (V <= V_m)
return 0;
// V log(V/V_m) - V + V_m
return weightTimesNormalStress * fd.a * (V * std::log(V / V_m) - V + V_m);
}
// log(V/V_m) if V >= V_0 // log(V/V_m) if V >= V_0
// 0 otherwise // 0 otherwise
double differential(double V) const { double differential(double V) const {
assert(V >= 0); assert(V >= 0.0);
if (V <= V_m) if (V <= V_cutoff) {
return 0; return fd.mumin;
}
return weightTimesNormalStress * fd.a * std::log(V / V_m); return weightTimesNormalStress * fd.a * (std::log(V) - logV_m);
} }
// 1/V if V > V_0 // 1/V if V > V_0
...@@ -58,7 +50,7 @@ class FrictionPotential : public FrictionPotentialWrapper { ...@@ -58,7 +50,7 @@ class FrictionPotential : public FrictionPotentialWrapper {
// 0 if V < V_0 // 0 if V < V_0
double second_deriv(double V) const { double second_deriv(double V) const {
assert(V >= 0); assert(V >= 0);
if (V <= V_m) if (V <= V_cutoff)
return 0; return 0;
return weightTimesNormalStress * fd.a / V; return weightTimesNormalStress * fd.a / V;
...@@ -67,7 +59,7 @@ class FrictionPotential : public FrictionPotentialWrapper { ...@@ -67,7 +59,7 @@ class FrictionPotential : public FrictionPotentialWrapper {
double regularity(double V) const { double regularity(double V) const {
assert(V >= 0); assert(V >= 0);
// TODO: Make this controllable // TODO: Make this controllable
if (std::abs(V - V_m) < 1e-14) if (std::abs(V - V_cutoff) < 1e-14)
return std::numeric_limits<double>::infinity(); return std::numeric_limits<double>::infinity();
return std::abs(second_deriv(V)); return std::abs(second_deriv(V));
...@@ -77,14 +69,16 @@ class FrictionPotential : public FrictionPotentialWrapper { ...@@ -77,14 +69,16 @@ class FrictionPotential : public FrictionPotentialWrapper {
// with K = -a log(V_m / V_0) = mu_0 + b [ alpha + log(V_0 / L) ] // with K = -a log(V_m / V_0) = mu_0 + b [ alpha + log(V_0 / L) ]
void updateState(double state) { void updateState(double state) {
// state is assumed to be logarithmic // state is assumed to be logarithmic
V_m = fd.V0 * logV_m = std::log(fd.V0) +
std::exp(-(fd.mu0 + fd.b * (state + std::log(fd.V0 / fd.L))) / fd.a); (-(fd.mu0 + fd.b * (state + std::log(fd.V0 / fd.L))) / fd.a);
V_cutoff = std::exp(logV_m + fd.mumin / fd.a);
} }
private: private:
FrictionData const &fd; FrictionData const &fd;
double const weightTimesNormalStress; double const weightTimesNormalStress;
double V_m; double logV_m;
double V_cutoff; // velocity at which mu falls short of mumin
}; };
class TrivialFunction : public FrictionPotentialWrapper { class TrivialFunction : public FrictionPotentialWrapper {
......
...@@ -51,6 +51,7 @@ requiredResidual = 1e-12 ...@@ -51,6 +51,7 @@ requiredResidual = 1e-12
[boundary.friction] [boundary.friction]
mu0 = 0.6 mu0 = 0.6
mumin = 0.0
a = 0.010 a = 0.010
b = 0.015 b = 0.015
V0 = 1e-6 V0 = 1e-6
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment