Skip to content
Snippets Groups Projects
globalfriction.hh 2.59 KiB
Newer Older
#ifndef DUNE_TECTONIC_GLOBALFRICTION_HH
#define DUNE_TECTONIC_GLOBALFRICTION_HH
Elias Pipping's avatar
Elias Pipping committed
#include <dune/common/fmatrix.hh>
#include <dune/common/fvector.hh>
Elias Pipping's avatar
Elias Pipping committed
#include <dune/istl/bcrsmatrix.hh>
Elias Pipping's avatar
Elias Pipping committed
#include <dune/istl/bvector.hh>
Elias Pipping's avatar
Elias Pipping committed
#include <dune/istl/matrixindexset.hh>
Elias Pipping's avatar
Elias Pipping committed

#include <dune/solvers/common/interval.hh>

podlesny's avatar
podlesny committed
#include "localfriction.hh"
podlesny's avatar
podlesny committed
template <class Matrix, class Vector>
podlesny's avatar
podlesny committed
class GlobalFriction {
Elias Pipping's avatar
Elias Pipping committed
protected:
  using ScalarVector = Dune::BlockVector<Dune::FieldVector<double, 1>>;
Elias Pipping's avatar
Elias Pipping committed

public:
  using IndexSet = Dune::MatrixIndexSet;
  using MatrixType = Matrix;
  using VectorType = Vector;
  using LocalMatrix = typename Matrix::block_type;
  using LocalVectorType = typename Vector::block_type;
  size_t static const block_size = LocalVectorType::dimension;
  using LocalNonlinearity = LocalFriction<block_size>;
  double operator()(Vector const &x) const {
    double tmp = 0;
    for (size_t i = 0; i < x.size(); ++i) {
      tmp += restriction(i)(x[i]);
Elias Pipping's avatar
Elias Pipping committed
  /*
    Return a restriction of the outer function to the i'th node.
Elias Pipping's avatar
Elias Pipping committed
  */
  LocalNonlinearity const virtual &restriction(size_t i) const = 0;
  void addHessian(Vector const &v, Matrix &hessian) const {
podlesny's avatar
podlesny committed
    for (size_t i = 0; i < v.size(); ++i) {
      restriction(i).addHessian(v[i], hessian[i][i]);
podlesny's avatar
podlesny committed
    }
Elias Pipping's avatar
Elias Pipping committed
  }
  void directionalDomain(Vector const &, Vector const &,
                         Dune::Solvers::Interval<double> &dom) const {
    dom[0] = -std::numeric_limits<double>::max();
    dom[1] = std::numeric_limits<double>::max();
  }

Elias Pipping's avatar
Elias Pipping committed
  void directionalSubDiff(
      Vector const &u, Vector const &v,
      Dune::Solvers::Interval<double> &subdifferential) const {
    subdifferential[0] = subdifferential[1] = 0;
    for (size_t i = 0; i < u.size(); ++i) {
      Dune::Solvers::Interval<double> D;
      restriction(i).directionalSubDiff(u[i], v[i], D);
      subdifferential[0] += D[0];
      subdifferential[1] += D[1];
    }
  }

Elias Pipping's avatar
Elias Pipping committed
  void addHessianIndices(Dune::MatrixIndexSet &indices) const {
Elias Pipping's avatar
Elias Pipping committed
    for (size_t i = 0; i < indices.rows(); ++i)
Elias Pipping's avatar
Elias Pipping committed
      indices.add(i, i);
  }

  void addGradient(Vector const &v, Vector &gradient) const {
    for (size_t i = 0; i < v.size(); ++i)
      restriction(i).addGradient(v[i], gradient[i]);
Elias Pipping's avatar
Elias Pipping committed

  double regularity(size_t i, typename Vector::block_type const &x) const {
    return restriction(i).regularity(x);
Elias Pipping's avatar
Elias Pipping committed
  }
Elias Pipping's avatar
Elias Pipping committed

  ScalarVector coefficientOfFriction(Vector const &x) const {
    ScalarVector ret(x.size());
podlesny's avatar
podlesny committed
    for (size_t i = 0; i < x.size(); ++i) {
      ret[i] = restriction(i).coefficientOfFriction(x[i]);
podlesny's avatar
podlesny committed
    }
podlesny's avatar
.  
podlesny committed
  void virtual updateAlpha(const std::vector<ScalarVector>& alpha) = 0;
podlesny's avatar
podlesny committed

};
#endif