From f48b1b19e6d95db9a82f1fc3d1a82334c6cbdbed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klaus=20B=C3=B6hnlein?= <klaus.boehnlein@tu-dresden.de> Date: Fri, 16 Jun 2023 11:49:48 +0000 Subject: [PATCH] Add setup method to Riemannian TR and PN methods that gets a ParameterSet object --- dune/gfe/riemannianpnsolver.cc | 20 +++++++++++++++++++- dune/gfe/riemannianpnsolver.hh | 8 ++++++++ dune/gfe/riemanniantrsolver.cc | 25 ++++++++++++++++++++++++- dune/gfe/riemanniantrsolver.hh | 8 ++++++++ 4 files changed, 59 insertions(+), 2 deletions(-) diff --git a/dune/gfe/riemannianpnsolver.cc b/dune/gfe/riemannianpnsolver.cc index 1085ad501..76ad38a2c 100644 --- a/dune/gfe/riemannianpnsolver.cc +++ b/dune/gfe/riemannianpnsolver.cc @@ -27,6 +27,24 @@ #include <dune/gfe/parallel/vectorcommunicator.hh> #endif +template <class Basis, class TargetSpace, class Assembler> +void RiemannianProximalNewtonSolver<Basis, TargetSpace, Assembler>:: + setup(const GridType& grid, + const Assembler* assembler, + const SolutionType& x, + const Dune::BitSetVector<blocksize>& dirichletNodes, + const Dune::ParameterTree& parameterSet) +{ + setup(grid, + assembler, + x, + dirichletNodes, + parameterSet.get<double>("tolerance"), + parameterSet.get<int>("maxProximalNewtonSteps "), + parameterSet.get<double>("initialRegularization"), + parameterSet.get<bool>("instrumented", 0)); +} + template <class Basis, class TargetSpace, class Assembler> void RiemannianProximalNewtonSolver<Basis,TargetSpace,Assembler>:: setup(const GridType& grid, @@ -52,7 +70,7 @@ setup(const GridType& grid, ////////////////////////////////////////////////////////////////// // Create global numbering for matrix and vector transfer ////////////////////////////////////////////////////////////////// - + globalMapper_ = std::make_unique<GlobalMapper>(grid_->leafGridView()); // Transfer all Dirichlet data to the master processor VectorCommunicator<GlobalMapper, typename GridType::LeafGridView::CollectiveCommunication, Dune::BitSetVector<blocksize> > vectorComm(*globalMapper_, diff --git a/dune/gfe/riemannianpnsolver.hh b/dune/gfe/riemannianpnsolver.hh index e09ed7764..915de346b 100644 --- a/dune/gfe/riemannianpnsolver.hh +++ b/dune/gfe/riemannianpnsolver.hh @@ -4,6 +4,7 @@ #include <vector> #include <dune/common/bitsetvector.hh> +#include <dune/common/parametertree.hh> #include <dune/istl/bcrsmatrix.hh> #include <dune/istl/bvector.hh> @@ -81,6 +82,13 @@ public: double initialRegularization, bool instrumented); + /** \brief Set up the solver using a monotone multigrid method as the inner solver */ + void setup(const GridType& grid, + const Assembler* assembler, + const SolutionType& x, + const Dune::BitSetVector<blocksize>& dirichletNodes, + const Dune::ParameterTree& parameterSet); + void setScaling(const Dune::FieldVector<double,blocksize>& scaling) { scaling_ = scaling; diff --git a/dune/gfe/riemanniantrsolver.cc b/dune/gfe/riemanniantrsolver.cc index d5bdce74a..7678a442d 100644 --- a/dune/gfe/riemanniantrsolver.cc +++ b/dune/gfe/riemanniantrsolver.cc @@ -28,6 +28,29 @@ #include <dune/gfe/parallel/vectorcommunicator.hh> #endif +template <class Basis, class TargetSpace, class Assembler> +void RiemannianTrustRegionSolver<Basis, TargetSpace, Assembler>:: + setup(const GridType& grid, + const Assembler* assembler, + const SolutionType& x, + const Dune::BitSetVector<blocksize>& dirichletNodes, + const Dune::ParameterTree& parameterSet) +{ + setup(grid, + assembler, + x, + dirichletNodes, + parameterSet.get<double>("tolerance"), + parameterSet.get<int>("maxTrustRegionSteps"), + parameterSet.get<double>("initialTrustRegionRadius"), + parameterSet.get<int>("numIt"), + parameterSet.get<double>("mgTolerance"), + parameterSet.get<int>("mu"), parameterSet.get<int>("nu1"), parameterSet.get<int>("nu2"), + parameterSet.get<int>("baseIt"), + parameterSet.get<double>("baseTolerance"), + parameterSet.get<bool>("instrumented", 0)); +} + template <class Basis, class TargetSpace, class Assembler> void RiemannianTrustRegionSolver<Basis,TargetSpace,Assembler>:: setup(const GridType& grid, @@ -692,7 +715,7 @@ void RiemannianTrustRegionSolver<Basis,TargetSpace,Assembler>::solve() fwrite(&x_[j], sizeof(TargetSpace), 1, fpIterate); fclose(fpIterate); - + } if (rank==0) diff --git a/dune/gfe/riemanniantrsolver.hh b/dune/gfe/riemanniantrsolver.hh index 6e88432f1..61df18e60 100644 --- a/dune/gfe/riemanniantrsolver.hh +++ b/dune/gfe/riemanniantrsolver.hh @@ -4,6 +4,7 @@ #include <vector> #include <dune/common/bitsetvector.hh> +#include <dune/common/parametertree.hh> #include <dune/istl/bcrsmatrix.hh> #include <dune/istl/bvector.hh> @@ -119,6 +120,13 @@ public: double baseTolerance, bool instrumented); + /** \brief Set up the solver using a monotone multigrid method as the inner solver */ + void setup(const GridType& grid, + const Assembler* assembler, + const SolutionType& x, + const Dune::BitSetVector<blocksize>& dirichletNodes, + const Dune::ParameterTree& parameterSet); + void setScaling(const Dune::FieldVector<double,blocksize>& scaling) { scaling_ = scaling; -- GitLab