Skip to content
Snippets Groups Projects
frictionpotential.hh 2.05 KiB
Newer Older
#ifndef NICE_FUNCTION_HH
#define NICE_FUNCTION_HH
Elias Pipping's avatar
Elias Pipping committed

Elias Pipping's avatar
Elias Pipping committed
#include <algorithm>
Elias Pipping's avatar
Elias Pipping committed
#include <cassert>
Elias Pipping's avatar
Elias Pipping committed
#include <cmath>
Elias Pipping's avatar
Elias Pipping committed
#include <limits>
Elias Pipping's avatar
Elias Pipping committed

Elias Pipping's avatar
Elias Pipping committed
#include <dune/common/exceptions.hh>
Elias Pipping's avatar
Elias Pipping committed
#include <dune/common/function.hh>

Elias Pipping's avatar
Elias Pipping committed
#include "frictiondata.hh"

class FrictionPotentialWrapper {
  virtual ~FrictionPotentialWrapper() {}
  double virtual differential(double s) const = 0;
  double virtual second_deriv(double x) const = 0;
  double virtual regularity(double s) const = 0;
  double virtual evaluate(double x) const {
    DUNE_THROW(Dune::NotImplemented, "evaluation not implemented");
  void virtual updateLogState(double) = 0;
class FrictionPotential : public FrictionPotentialWrapper {
Elias Pipping's avatar
Elias Pipping committed
public:
  FrictionPotential(double coefficient, double _normalStress,
                    FrictionData const &_fd)
      : fd(_fd), weight(coefficient), normalStress(_normalStress) {}
Elias Pipping's avatar
Elias Pipping committed

  double differential(double V) const {
    assert(V >= 0.0);
Elias Pipping's avatar
Elias Pipping committed
    if (V <= V_cutoff)
Elias Pipping's avatar
Elias Pipping committed
      return 0.0;
Elias Pipping's avatar
Elias Pipping committed

    return weight * (-normalStress) * fd.a * (std::log(V) - logV_m);
  double second_deriv(double V) const {
Elias Pipping's avatar
Elias Pipping committed
    assert(V >= 0);
    if (V <= V_cutoff)
    return weight * (-normalStress) * (fd.a / V);
  double regularity(double V) const {
Elias Pipping's avatar
Elias Pipping committed
    assert(V >= 0);
Elias Pipping's avatar
Elias Pipping committed
    if (std::abs(V - V_cutoff) < 1e-14) // TODO
Elias Pipping's avatar
Elias Pipping committed
      return std::numeric_limits<double>::infinity();

Elias Pipping's avatar
Elias Pipping committed
    return std::abs(second_deriv(V));
  void updateLogState(double logState) {
Elias Pipping's avatar
Elias Pipping committed
    double const tmp =
        (fd.mu0 + fd.b * (logState + std::log(fd.V0 / fd.L))) / fd.a;
    logV_m = std::log(fd.V0) - tmp;
    V_cutoff = fd.V0 / std::exp(tmp);
Elias Pipping's avatar
Elias Pipping committed
  }

Elias Pipping's avatar
Elias Pipping committed
private:
Elias Pipping's avatar
Elias Pipping committed
  FrictionData const &fd;
  double const weight;
  double const normalStress;
  double logV_m;
  double V_cutoff; // velocity at which mu falls short of mumin
class TrivialFunction : public FrictionPotentialWrapper {
  double evaluate(double) const { return 0; }
  double differential(double) const { return 0; }
  double second_deriv(double) const { return 0; }
Elias Pipping's avatar
Elias Pipping committed

  double regularity(double) const { return 0; }
  void updateLogState(double) {}
Elias Pipping's avatar
Elias Pipping committed
#endif