Skip to content
Snippets Groups Projects
Commit 2bbd7ca0 authored by podlesny's avatar podlesny
Browse files

rescale DirectionalRestriction to direction.two_norm = 1.0

parent 315471dc
No related branches found
No related tags found
No related merge requests found
...@@ -162,11 +162,12 @@ class DirectionalRestriction : ...@@ -162,11 +162,12 @@ class DirectionalRestriction :
using Matrix = typename Base::Matrix; using Matrix = typename Base::Matrix;
using Vector = typename Base::Vector; using Vector = typename Base::Vector;
DirectionalRestriction(const GlobalMatrix& matrix, const GlobalVector& linearTerm, const Nonlinearity& phi, const GlobalLowerObstacle& lower, const GlobalLowerObstacle& upper, const GlobalVector& origin, const GlobalVector& direction) : DirectionalRestriction(const GlobalMatrix& matrix, const GlobalVector& linearTerm, const Nonlinearity& phi, const GlobalLowerObstacle& lower, const GlobalLowerObstacle& upper, const GlobalVector& origin, const GlobalVector& direction, const double scaling) :
Base(matrix, linearTerm, lower, upper, origin, direction), Base(matrix, linearTerm, lower, upper, origin, direction),
origin_(origin), origin_(origin),
direction_(direction), direction_(direction),
phi_(phi) phi_(phi),
scaling_(scaling)
{ {
phi_.directionalDomain(origin_, direction_, domain_); phi_.directionalDomain(origin_, direction_, domain_);
...@@ -207,12 +208,17 @@ class DirectionalRestriction : ...@@ -207,12 +208,17 @@ class DirectionalRestriction :
return direction_; return direction_;
} }
double scaling() const {
return scaling_;
}
protected: protected:
const GlobalVector& origin_; const GlobalVector& origin_;
const GlobalVector& direction_; GlobalVector direction_;
const Nonlinearity& phi_; const Nonlinearity& phi_;
Interval domain_; Interval domain_;
const double scaling_;
}; };
...@@ -474,7 +480,18 @@ class Functional : public Dune::TNNMG::BoxConstrainedQuadraticFunctional<M, V, L ...@@ -474,7 +480,18 @@ class Functional : public Dune::TNNMG::BoxConstrainedQuadraticFunctional<M, V, L
friend auto directionalRestriction(const Functional& f, const Vector& origin, const Vector& direction) friend auto directionalRestriction(const Functional& f, const Vector& origin, const Vector& direction)
-> DirectionalRestriction<Matrix, Vector, Nonlinearity, LowerObstacle, UpperObstacle, Range> -> DirectionalRestriction<Matrix, Vector, Nonlinearity, LowerObstacle, UpperObstacle, Range>
{ {
return DirectionalRestriction<Matrix, Vector, Nonlinearity, LowerObstacle, UpperObstacle, Range>(f.quadraticPart(), f.linearPart(), f.phi(), f.lowerObstacle(), f.upperObstacle(), origin, direction); // rescale direction for numerical stability
auto dir = direction;
auto dirNorm = dir.two_norm();
if (dirNorm > 0.0)
dir /= dirNorm;
else {
dirNorm = 0.0;
dir = 0.0;
}
return DirectionalRestriction<Matrix, Vector, Nonlinearity, LowerObstacle, UpperObstacle, Range>(f.quadraticPart(), f.linearPart(), f.phi(), f.lowerObstacle(), f.upperObstacle(), origin, dir, dirNorm);
} }
friend auto shift(const Functional& f, const Vector& origin) friend auto shift(const Functional& f, const Vector& origin)
......
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