From 17773edb70461a90077d6a526f83a2b5a059ba7c Mon Sep 17 00:00:00 2001
From: Jonathan Youett <youett@mi.fu-berlin.de>
Date: Mon, 16 Sep 2013 09:30:44 +0000
Subject: [PATCH] Add method that creates a rod configuration by solving a
 static Dirichlet problem

[[Imported from SVN: r9508]]
---
 dune/gfe/rodfactory.hh | 65 +++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 64 insertions(+), 1 deletion(-)

diff --git a/dune/gfe/rodfactory.hh b/dune/gfe/rodfactory.hh
index f89fac2a..a12c1847 100644
--- a/dune/gfe/rodfactory.hh
+++ b/dune/gfe/rodfactory.hh
@@ -5,9 +5,12 @@
 #include <dune/common/fvector.hh>
 #include <dune/fufem/crossproduct.hh>
 
-#include "rigidbodymotion.hh"
+#include <dune/gfe/rigidbodymotion.hh>
 #include <dune/gfe/localgeodesicfefunction.hh>
 
+#include <dune/gfe/rodassembler.hh>
+#include <dune/gfe/riemanniantrsolver.hh>
+
 /** \brief A factory class that implements various ways to create rod configurations
  */
 
@@ -157,6 +160,66 @@ template <int dim>
         }
     }
 
+
+/** \brief Make a rod solving a static Dirichlet problem
+
+  \param rod The configuration to be computed
+  \param radius The rod's radius
+  \param E The rod's elastic modulus
+  \param nu The rod's Poission modulus
+  \param beginning The prescribed Dirichlet values
+  \param end The prescribed Dirichlet values
+  \param[out] rod The new rod
+ */
+template <int spaceDim>
+void create(std::vector<RigidBodyMotion<double,spaceDim> >& rod,
+        double radius, double E, double nu,
+        const RigidBodyMotion<double,spaceDim>& beginning,
+        const RigidBodyMotion<double,spaceDim>& end)
+{
+
+    // Make Dirichlet bitfields for the rods as well
+    Dune::BitSetVector<6> rodDirichletNodes(init.size(),false);
+
+    for (int j=0; j<6; j++) {
+        rodDirichletNodes[0][j] = true;
+        rodDirichletNodes.back()[j] = true;
+    }
+
+    // Create local assembler for the static elastic problem
+    RodLocalStiffness<GridView,double> rodLocalStiffness(gridView_, radius*radius*M_PI,
+            std::pow(radius,4) * 0.25* M_PI, std::pow(radius,4) * 0.25* M_PI, E, nu);
+
+    RodAssembler<GridView,spaceDim> assembler(gridView_, &rodLocalStiffness);
+
+    // Create initial iterate using the straight rod interpolation method
+    create(rod, beginning.r, end.r);
+
+    // Set reference configuration
+    rodLocalStiffness.setReferenceConfiguration(rod);
+
+    // Set Dirichlet values
+    rod[0] = beginning;
+    rod.back() = end;
+
+    // Trust--Region solver
+    RiemannianTrustRegionSolver<typename GridView::Grid, RigidBodyMotion<double,spaceDim> > rodSolver;
+    rodSolver.setup(gridView_.grid(), &assembler, rod,
+            rodDirichletNodes,
+            1e-10, 100, // TR tolerance and iterations
+            20, // init TR radius
+            200, 1e-00, 1, 3, 3, // Multigrid parameters
+            100, 1e-8 , false); // base solver parameters
+
+    rodSolver.verbosity_ = NumProc::QUIET;
+
+    rodSolver.solve();
+
+    rod = rodSolver.getSol();
+
+
+}
+
 private:
     
     const GridView gridView_;
-- 
GitLab