diff --git a/dune/gfe/riemannianpnsolver.cc b/dune/gfe/riemannianpnsolver.cc index a10252d6bbc6e930d7361581eeeabaea106e84af..480c1ae9ee67c000183b4f15934ad96c97d1e408 100644 --- a/dune/gfe/riemannianpnsolver.cc +++ b/dune/gfe/riemannianpnsolver.cc @@ -253,7 +253,7 @@ void RiemannianProximalNewtonSolver<Basis,TargetSpace,Assembler>::solve() // Add the regularization - Identity Matrix for now for (std::size_t i=0; i<stiffnessMatrix.N(); i++) for(int j=0; j<blocksize; j++) - stiffnessMatrix[i][i][j][j] += regularization; + stiffnessMatrix[i][i][j][j] += regularization*scaling_[j]; innerSolver_->setProblem(stiffnessMatrix,corr_global,rhs_global); innerSolver_->preprocess(); diff --git a/dune/gfe/riemannianpnsolver.hh b/dune/gfe/riemannianpnsolver.hh index b3584fdf9b8553e0311a671d8e3b14732fd3e5f8..7ea10fe6f4737bf6005560134cf52e3f281338d4 100644 --- a/dune/gfe/riemannianpnsolver.hh +++ b/dune/gfe/riemannianpnsolver.hh @@ -69,7 +69,9 @@ public: RiemannianProximalNewtonSolver() : IterativeSolver<std::vector<TargetSpace>, Dune::BitSetVector<blocksize> >(0,100,NumProc::FULL), hessianMatrix_(nullptr), h1SemiNorm_(NULL) - {} + { + std::fill(scaling_.begin(), scaling_.end(), 1.0); + } /** \brief Set up the solver using a choldmod or umfpack solver as the inner solver */ void setup(const GridType& grid, @@ -81,6 +83,11 @@ public: double initialRegularization, bool instrumented); + void setScaling(const Dune::FieldVector<double,blocksize>& scaling) + { + scaling_ = scaling; + } + void setIgnoreNodes(const Dune::BitSetVector<blocksize>& ignoreNodes) { ignoreNodes_ = &ignoreNodes; @@ -118,6 +125,9 @@ protected: double initialRegularization_; double tolerance_; + /** \brief Regularization scaling */ + Dune::FieldVector<double,blocksize> scaling_; + /** \brief Maximum number of proximal-newton steps */ std::size_t maxProximalNewtonSteps_; diff --git a/problems/cosserat-continuum-cantilever.parset b/problems/cosserat-continuum-cantilever.parset index 9440301af2c2e3a244b9799310e33768d16e1212..bfa21a8436ebefa2092dc2b059faac5f2d8323fd 100644 --- a/problems/cosserat-continuum-cantilever.parset +++ b/problems/cosserat-continuum-cantilever.parset @@ -26,7 +26,7 @@ tolerance = 1e-3 # Max number of steps of the trust region solver maxSolverSteps = 200 -trustRegionScaling = 1 1 1 0.01 0.01 0.01 +solverScaling = 1 1 1 0.01 0.01 0.01 # Initial trust-region radius initialTrustRegionRadius = 3.125 diff --git a/problems/cosserat-continuum-twisted-strip.parset b/problems/cosserat-continuum-twisted-strip.parset index 04c738f4608aa5e30d30c5af4c6a7add32cd6fbe..a10d3197bfb8c791a656639c061b892cb5c48282 100644 --- a/problems/cosserat-continuum-twisted-strip.parset +++ b/problems/cosserat-continuum-twisted-strip.parset @@ -23,7 +23,7 @@ tolerance = 1e-8 # Max number of steps of the trust region solver maxTrustRegionSteps = 200 -trustRegionScaling = 1 1 1 1 1 1 +solverScaling = 1 1 1 1 1 1 # Initial trust-region radius initialTrustRegionRadius = 0.1 diff --git a/problems/cosserat-continuum-wong-pellegrino-wrinkling.parset b/problems/cosserat-continuum-wong-pellegrino-wrinkling.parset index 790a91cd3f649131399a63fbccc924a41ee268c5..4af4a38d59003379a994bb2db4d246ac43351ceb 100644 --- a/problems/cosserat-continuum-wong-pellegrino-wrinkling.parset +++ b/problems/cosserat-continuum-wong-pellegrino-wrinkling.parset @@ -23,6 +23,8 @@ tolerance = 1e-8 # Max number of steps of the trust region solver maxTrustRegionSteps = 500 +solverScaling = 1 1 1 0.01 0.01 0.01 + # Initial trust-region radius initialTrustRegionRadius = 0.001 diff --git a/problems/cosserat-continuum-wriggers-l-shape.parset b/problems/cosserat-continuum-wriggers-l-shape.parset index 12c715bd9e9618fa4ce069b8409584294f0f5660..745f333600956d4c13e55af38ef37db5d6e7d74e 100644 --- a/problems/cosserat-continuum-wriggers-l-shape.parset +++ b/problems/cosserat-continuum-wriggers-l-shape.parset @@ -22,7 +22,7 @@ tolerance = 1e-8 # Max number of steps of the trust region solver maxSolverSteps = 1000 -trustRegionScaling = 1 1 1 0.01 0.01 0.01 +solverScaling = 1 1 1 0.01 0.01 0.01 # Initial trust-region radius initialTrustRegionRadius = 1 @@ -105,4 +105,4 @@ neumannValues = 0.09 0 0 startFromFile = yes initialIterateGridFilename = wriggers-L-shape_99_mm.msh -initialIterateFilename = initial-wriggers-l-shape.vtu \ No newline at end of file +initialIterateFilename = initial-wriggers-l-shape.vtu diff --git a/problems/film-on-substrate.parset b/problems/film-on-substrate.parset index e6cf6ce9164fe7216fc7b8392d764965e02aa2c0..1ce5db4b6676909c3c747f427fddc174dccbc3c7 100644 --- a/problems/film-on-substrate.parset +++ b/problems/film-on-substrate.parset @@ -87,7 +87,7 @@ initialRegularization = 1000000 # Solver parameters specific for trust-region solver using multigrid solver ############################################# -trustRegionScaling = 1 1 1 0.01 0.01 0.01 +solverScaling = 1 1 1 0.01 0.01 0.01 # Initial trust-region radius initialTrustRegionRadius = 3.125 diff --git a/problems/gradient-flow-curve-shortening.parset b/problems/gradient-flow-curve-shortening.parset index cf5f31f492d398fe59d167365f950dcb87647e8e..857ec53c5a07417d907c7f09df73b059a5582233 100644 --- a/problems/gradient-flow-curve-shortening.parset +++ b/problems/gradient-flow-curve-shortening.parset @@ -20,6 +20,8 @@ tolerance = 1e-8 # Max number of steps of the trust region solver maxTrustRegionSteps = 100 +solverScaling = 1 1 1 0.01 0.01 0.01 + # Initial trust-region radius initialTrustRegionRadius = 0.25 diff --git a/problems/harmonicmaps-skyrmions-hexagon.parset b/problems/harmonicmaps-skyrmions-hexagon.parset index 1394c0ecd0a14308f4abc54a8fac66e40499044e..4cd7c41b71d19b0e8e76f1183cccf11ec26312e6 100644 --- a/problems/harmonicmaps-skyrmions-hexagon.parset +++ b/problems/harmonicmaps-skyrmions-hexagon.parset @@ -21,6 +21,8 @@ tolerance = 1e-12 # Max number of steps of the trust region solver maxTrustRegionSteps = 100 +solverScaling = 1 1 1 0.01 0.01 0.01 + # Initial trust-region radius initialTrustRegionRadius = 1 diff --git a/problems/simofox-cantilever.parset b/problems/simofox-cantilever.parset index 1eab7e5b40a79956681dc71b7bf0be101e824f3d..4351b50e165c7a9356728eaf4f2049dd80573f8c 100644 --- a/problems/simofox-cantilever.parset +++ b/problems/simofox-cantilever.parset @@ -26,7 +26,7 @@ tolerance = 1e-6 # Max number of steps of the trust region solver maxTrustRegionSteps = 200 -trustRegionScaling = 1 1 1 0.01 0.01 +solverScaling = 1 1 1 0.01 0.01 # Initial trust-region radius initialTrustRegionRadius = 10 diff --git a/problems/staticrod.parset b/problems/staticrod.parset index 2d001ecad0fbe15fff3188010c99d570ae8c0909..7f8e5fe57d9b1415fca73ae3aca3effedaf644d2 100644 --- a/problems/staticrod.parset +++ b/problems/staticrod.parset @@ -21,6 +21,8 @@ tolerance = 1e-6 # Max number of steps of the trust region solver maxTrustRegionSteps = 100 +solverScaling = 1 1 1 0.01 0.01 0.01 + # Initial trust-region radius initialTrustRegionRadius = 1 diff --git a/src/cosserat-continuum.cc b/src/cosserat-continuum.cc index 17333187ba8891fcda1b2ea8faff965ec0f374bd..23941144b47d06b0d9fe1ac153554879922b5ad4 100644 --- a/src/cosserat-continuum.cc +++ b/src/cosserat-continuum.cc @@ -477,7 +477,7 @@ int main (int argc, char *argv[]) try baseTolerance, instrumented); - solver.setScaling(parameterSet.get<FieldVector<double,6> >("trustRegionScaling")); + solver.setScaling(parameterSet.get<FieldVector<double,6> >("solverScaling")); solver.setInitialIterate(x); solver.solve(); @@ -516,7 +516,7 @@ int main (int argc, char *argv[]) try baseTolerance, instrumented); - solver.setScaling(parameterSet.get<FieldVector<double,6> >("trustRegionScaling")); + solver.setScaling(parameterSet.get<FieldVector<double,6> >("solverScaling")); solver.setInitialIterate(xTargetSpace); solver.solve(); xTargetSpace = solver.getSol(); @@ -530,6 +530,7 @@ int main (int argc, char *argv[]) try maxSolverSteps, initialRegularization, instrumented); + solver.setScaling(parameterSet.get<FieldVector<double,6> >("solverScaling")); solver.setInitialIterate(xTargetSpace); solver.solve(); xTargetSpace = solver.getSol(); @@ -577,7 +578,7 @@ int main (int argc, char *argv[]) try baseTolerance, instrumented); - solver.setScaling(parameterSet.get<FieldVector<double,6> >("trustRegionScaling")); + solver.setScaling(parameterSet.get<FieldVector<double,6> >("solverScaling")); solver.setInitialIterate(x); solver.solve(); @@ -616,7 +617,7 @@ int main (int argc, char *argv[]) try baseTolerance, instrumented); - solver.setScaling(parameterSet.get<FieldVector<double,6> >("trustRegionScaling")); + solver.setScaling(parameterSet.get<FieldVector<double,6> >("solverScaling")); solver.setInitialIterate(xTargetSpace); solver.solve(); xTargetSpace = solver.getSol(); @@ -630,6 +631,7 @@ int main (int argc, char *argv[]) try maxSolverSteps, initialRegularization, instrumented); + solver.setScaling(parameterSet.get<FieldVector<double,6> >("solverScaling")); solver.setInitialIterate(xTargetSpace); solver.solve(); xTargetSpace = solver.getSol(); diff --git a/src/film-on-substrate.cc b/src/film-on-substrate.cc index 8978172ac9fe81b8ce9c8a0b68e5cddc08a9961f..2dd06845b58b715b3af5b9f926c94860986dbd7e 100644 --- a/src/film-on-substrate.cc +++ b/src/film-on-substrate.cc @@ -584,7 +584,7 @@ int main (int argc, char *argv[]) try baseTolerance, instrumented); - solver.setScaling(parameterSet.get<FieldVector<double,6> >("trustRegionScaling")); + solver.setScaling(parameterSet.get<FieldVector<double,6> >("solverScaling")); solver.setInitialIterate(x); solver.solve(); x = solver.getSol(); @@ -604,7 +604,7 @@ int main (int argc, char *argv[]) try baseTolerance, instrumented); - solver.setScaling(parameterSet.get<FieldVector<double,6> >("trustRegionScaling")); + solver.setScaling(parameterSet.get<FieldVector<double,6> >("solverScaling")); solver.setInitialIterate(xRBM); solver.solve(); xRBM = solver.getSol(); @@ -627,6 +627,7 @@ int main (int argc, char *argv[]) try maxSolverSteps, initialRegularization, instrumented); + solver.setScaling(parameterSet.get<FieldVector<double,6> >("solverScaling")); solver.setInitialIterate(xRBM); solver.solve(); xRBM = solver.getSol();