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

[Extern] Use Dune::Solvers::Interval

parent 2cf60c6d
No related branches found
No related tags found
No related merge requests found
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
#include <dune/common/fvector.hh> #include <dune/common/fvector.hh>
#include <dune/common/stdstreams.hh> #include <dune/common/stdstreams.hh>
#include <dune/fufem/interval.hh>
#include <dune/fufem/arithmetic.hh> #include <dune/fufem/arithmetic.hh>
#include "localfriction.hh" #include "localfriction.hh"
......
...@@ -7,6 +7,8 @@ ...@@ -7,6 +7,8 @@
#include <dune/istl/bvector.hh> #include <dune/istl/bvector.hh>
#include <dune/istl/matrixindexset.hh> #include <dune/istl/matrixindexset.hh>
#include <dune/solvers/common/interval.hh>
#include "localfriction.hh" #include "localfriction.hh"
template <class Matrix, class Vector> class GlobalNonlinearity { template <class Matrix, class Vector> class GlobalNonlinearity {
...@@ -45,16 +47,17 @@ template <class Matrix, class Vector> class GlobalNonlinearity { ...@@ -45,16 +47,17 @@ template <class Matrix, class Vector> class GlobalNonlinearity {
} }
void directionalDomain(Vector const &, Vector const &, void directionalDomain(Vector const &, Vector const &,
Interval<double> &dom) const { Dune::Solvers::Interval<double> &dom) const {
dom[0] = -std::numeric_limits<double>::max(); dom[0] = -std::numeric_limits<double>::max();
dom[1] = std::numeric_limits<double>::max(); dom[1] = std::numeric_limits<double>::max();
} }
void directionalSubDiff(Vector const &u, Vector const &v, void directionalSubDiff(Vector const &u, Vector const &v,
Interval<double> &subdifferential) const { Dune::Solvers::Interval<double> &subdifferential)
const {
subdifferential[0] = subdifferential[1] = 0; subdifferential[0] = subdifferential[1] = 0;
for (size_t i = 0; i < u.size(); ++i) { for (size_t i = 0; i < u.size(); ++i) {
Interval<double> D; Dune::Solvers::Interval<double> D;
auto const res = restriction(i); auto const res = restriction(i);
res->directionalSubDiff(u[i], v[i], D); res->directionalSubDiff(u[i], v[i], D);
subdifferential[0] += D[0]; subdifferential[0] += D[0];
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
#include <dune/common/fmatrix.hh> #include <dune/common/fmatrix.hh>
#include <dune/fufem/arithmetic.hh> #include <dune/fufem/arithmetic.hh>
#include <dune/fufem/interval.hh> #include <dune/solvers/common/interval.hh>
#include "frictionpotential.hh" #include "frictionpotential.hh"
...@@ -54,7 +54,7 @@ template <size_t dimension> class LocalFriction { ...@@ -54,7 +54,7 @@ template <size_t dimension> class LocalFriction {
// directional subdifferential: at u on the line u + t*v // directional subdifferential: at u on the line u + t*v
// u and v are assumed to be non-zero // u and v are assumed to be non-zero
void directionalSubDiff(VectorType const &x, VectorType const &v, void directionalSubDiff(VectorType const &x, VectorType const &v,
Interval<double> &D) const { Dune::Solvers::Interval<double> &D) const {
double const xnorm = x.two_norm(); double const xnorm = x.two_norm();
if (xnorm <= 0.0) if (xnorm <= 0.0)
D[0] = D[1] = func->differential(0.0) * v.two_norm(); D[0] = D[1] = func->differential(0.0) * v.two_norm();
...@@ -113,7 +113,7 @@ template <size_t dimension> class LocalFriction { ...@@ -113,7 +113,7 @@ template <size_t dimension> class LocalFriction {
} }
void directionalDomain(VectorType const &, VectorType const &, void directionalDomain(VectorType const &, VectorType const &,
Interval<double> &dom) const { Dune::Solvers::Interval<double> &dom) const {
dom[0] = -std::numeric_limits<double>::max(); dom[0] = -std::numeric_limits<double>::max();
dom[1] = std::numeric_limits<double>::max(); dom[1] = std::numeric_limits<double>::max();
} }
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "dune/solvers/computeenergy.hh" #include "dune/solvers/computeenergy.hh"
#include <dune/fufem/arithmetic.hh> #include <dune/fufem/arithmetic.hh>
#include <dune/solvers/common/interval.hh>
#include <dune/tnnmg/problem-classes/bisection.hh> #include <dune/tnnmg/problem-classes/bisection.hh>
#include "globalnonlinearity.hh" #include "globalnonlinearity.hh"
...@@ -98,7 +99,7 @@ template <class ConvexProblem> class MyBlockProblem { ...@@ -98,7 +99,7 @@ template <class ConvexProblem> class MyBlockProblem {
psi(computeDirectionalA(problem.A, v), psi(computeDirectionalA(problem.A, v),
computeDirectionalb(problem.A, problem.f, u, v), problem.phi, u, v); computeDirectionalb(problem.A, problem.f, u, v), problem.phi, u, v);
Interval<double> D; Dune::Solvers::Interval<double> D;
psi.subDiff(0, D); psi.subDiff(0, D);
// NOTE: Numerical instability can actually get us here // NOTE: Numerical instability can actually get us here
if (D[1] > 0) if (D[1] > 0)
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
#define MY_DIRECTIONAL_CONVEX_FUNCTION_HH #define MY_DIRECTIONAL_CONVEX_FUNCTION_HH
#include <dune/fufem/arithmetic.hh> #include <dune/fufem/arithmetic.hh>
#include <dune/fufem/interval.hh> #include <dune/solvers/common/interval.hh>
/* /*
1/2 <A(u + hv),u + hv> - <b, u + hv> 1/2 <A(u + hv),u + hv> - <b, u + hv>
...@@ -41,7 +41,7 @@ template <class Nonlinearity> class MyDirectionalConvexFunction { ...@@ -41,7 +41,7 @@ template <class Nonlinearity> class MyDirectionalConvexFunction {
double linearPart() const { return b; } double linearPart() const { return b; }
void subDiff(double x, Interval<double> &D) const { void subDiff(double x, Dune::Solvers::Interval<double> &D) const {
Vector uxv = u; Vector uxv = u;
Arithmetic::addProduct(uxv, x, v); Arithmetic::addProduct(uxv, x, v);
phi.directionalSubDiff(uxv, v, D); phi.directionalSubDiff(uxv, v, D);
...@@ -49,7 +49,7 @@ template <class Nonlinearity> class MyDirectionalConvexFunction { ...@@ -49,7 +49,7 @@ template <class Nonlinearity> class MyDirectionalConvexFunction {
D[1] += A * x - b; D[1] += A * x - b;
} }
void domain(Interval<double> &domain) const { void domain(Dune::Solvers::Interval<double> &domain) const {
domain[0] = this->dom[0]; domain[0] = this->dom[0];
domain[1] = this->dom[1]; domain[1] = this->dom[1];
} }
...@@ -62,7 +62,7 @@ template <class Nonlinearity> class MyDirectionalConvexFunction { ...@@ -62,7 +62,7 @@ template <class Nonlinearity> class MyDirectionalConvexFunction {
Vector const &u; Vector const &u;
Vector const &v; Vector const &v;
Interval<double> dom; Dune::Solvers::Interval<double> dom;
}; };
#endif #endif
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
#include <dune/common/fvector.hh> #include <dune/common/fvector.hh>
#include <dune/common/fmatrix.hh> #include <dune/common/fmatrix.hh>
#include <dune/fufem/interval.hh> #include <dune/solvers/common/interval.hh>
/* Dieterich's law: /* Dieterich's law:
...@@ -49,12 +49,12 @@ class DieterichNonlinearity { ...@@ -49,12 +49,12 @@ class DieterichNonlinearity {
DieterichNonlinearity() {} DieterichNonlinearity() {}
void directionalSubDiff(VectorType const &u, VectorType const &v, void directionalSubDiff(VectorType const &u, VectorType const &v,
Interval<double> &D) const { Dune::Solvers::Interval<double> &D) const {
D[0] = D[1] = v[0] * (-std::exp(-u[0])); D[0] = D[1] = v[0] * (-std::exp(-u[0]));
} }
void directionalDomain(VectorType const &, VectorType const &, void directionalDomain(VectorType const &, VectorType const &,
Interval<double> &dom) const { Dune::Solvers::Interval<double> &dom) const {
dom[0] = -std::numeric_limits<double>::max(); dom[0] = -std::numeric_limits<double>::max();
dom[1] = std::numeric_limits<double>::max(); dom[1] = std::numeric_limits<double>::max();
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment