From 9b1fba6e3a83c3dced8eb6fd72b7af6044e176e4 Mon Sep 17 00:00:00 2001
From: Lisa Julia Nebel <lisa_julia.nebel@tu-dresden.de>
Date: Fri, 31 Mar 2023 13:15:20 +0200
Subject: [PATCH] Add scaling to Riemannian PN-Solver and use it in
 cosserat-continuum and film-on-substrate

---
 dune/gfe/riemannianpnsolver.cc                       |  2 +-
 dune/gfe/riemannianpnsolver.hh                       | 12 +++++++++++-
 problems/cosserat-continuum-cantilever.parset        |  2 +-
 problems/cosserat-continuum-twisted-strip.parset     |  2 +-
 ...sserat-continuum-wong-pellegrino-wrinkling.parset |  2 ++
 problems/cosserat-continuum-wriggers-l-shape.parset  |  4 ++--
 problems/film-on-substrate.parset                    |  2 +-
 problems/gradient-flow-curve-shortening.parset       |  2 ++
 problems/harmonicmaps-skyrmions-hexagon.parset       |  2 ++
 problems/simofox-cantilever.parset                   |  2 +-
 problems/staticrod.parset                            |  2 ++
 src/cosserat-continuum.cc                            | 10 ++++++----
 src/film-on-substrate.cc                             |  5 +++--
 13 files changed, 35 insertions(+), 14 deletions(-)

diff --git a/dune/gfe/riemannianpnsolver.cc b/dune/gfe/riemannianpnsolver.cc
index a10252d6..480c1ae9 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 b3584fdf..7ea10fe6 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 9440301a..bfa21a84 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 04c738f4..a10d3197 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 790a91cd..4af4a38d 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 12c715bd..745f3336 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 e6cf6ce9..1ce5db4b 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 cf5f31f4..857ec53c 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 1394c0ec..4cd7c41b 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 1eab7e5b..4351b50e 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 2d001eca..7f8e5fe5 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 17333187..23941144 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 8978172a..2dd06845 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();
-- 
GitLab