diff --git a/dune/gfe/riemanniantrsolver.cc b/dune/gfe/riemanniantrsolver.cc index b1780ea9dd2d963ffbeb49be53d241800259d38d..40c3286ce3849dd5553eb81733990478e7bad8ed 100644 --- a/dune/gfe/riemanniantrsolver.cc +++ b/dune/gfe/riemanniantrsolver.cc @@ -280,6 +280,7 @@ void RiemannianTrustRegionSolver<GridType,TargetSpace>::solve() } MaxNormTrustRegion<blocksize> trustRegion(globalMapper_->size(), initialTrustRegionRadius_); + trustRegion.set(initialTrustRegionRadius_, scaling_); std::vector<BoxConstraint<field_type,blocksize> > trustRegionObstacles; diff --git a/dune/gfe/riemanniantrsolver.hh b/dune/gfe/riemanniantrsolver.hh index ccc3976254d555f7b70d05b20d15f8a8a60605ae..501254bc93e35ad3c62cd43411b884b22eb9a6ba 100644 --- a/dune/gfe/riemanniantrsolver.hh +++ b/dune/gfe/riemanniantrsolver.hh @@ -59,7 +59,9 @@ public: RiemannianTrustRegionSolver() : IterativeSolver<std::vector<TargetSpace>, Dune::BitSetVector<blocksize> >(0,100,NumProc::FULL), hessianMatrix_(std::auto_ptr<MatrixType>(NULL)), h1SemiNorm_(NULL) - {} + { + std::fill(scaling_.begin(), scaling_.end(), 1.0); + } /** \brief Set up the solver using a monotone multigrid method as the inner solver */ void setup(const GridType& grid, @@ -78,6 +80,11 @@ public: double baseTolerance, bool instrumented); + void setScaling(const Dune::FieldVector<double,blocksize>& scaling) + { + scaling_(scaling); + } + void setIgnoreNodes(const Dune::BitSetVector<blocksize>& ignoreNodes) { ignoreNodes_ = &ignoreNodes; @@ -111,6 +118,9 @@ protected: /** \brief The initial trust-region radius in the maximum-norm */ double initialTrustRegionRadius_; + /** \brief Trust-region norm scaling */ + Dune::FieldVector<double,blocksize> scaling_; + /** \brief Maximum number of trust-region steps */ int maxTrustRegionSteps_;