From e25eed41c04cb32a2f24f57f640f723f2bba41a4 Mon Sep 17 00:00:00 2001
From: Oliver Sander <oliver.sander@tu-dresden.de>
Date: Sat, 1 Jun 2019 22:39:19 +0200
Subject: [PATCH] Make rod3d.cc compile again

---
 dune/gfe/rodassembler.cc | 68 +++++++++++++++++-----------------------
 dune/gfe/rodassembler.hh |  1 -
 src/CMakeLists.txt       |  1 +
 src/rod3d.cc             | 32 ++++++++-----------
 4 files changed, 42 insertions(+), 60 deletions(-)

diff --git a/dune/gfe/rodassembler.cc b/dune/gfe/rodassembler.cc
index 9fef383e..50999d71 100644
--- a/dune/gfe/rodassembler.cc
+++ b/dune/gfe/rodassembler.cc
@@ -81,7 +81,7 @@ getStrain(const std::vector<RigidBodyMotion<double,3> >& sol,
 {
     using namespace Dune;
 
-    const typename GridView::Traits::IndexSet& indexSet = this->basis_.getGridView().indexSet();
+    const typename GridView::Traits::IndexSet& indexSet = this->basis_.gridView().indexSet();
 
     if (sol.size()!=this->basis_.size())
         DUNE_THROW(Exception, "Solution vector doesn't match the grid!");
@@ -90,13 +90,10 @@ getStrain(const std::vector<RigidBodyMotion<double,3> >& sol,
     strain.resize(indexSet.size(0));
     strain = 0;
 
-    ElementIterator it    = this->basis_.getGridView().template begin<0>();
-    ElementIterator endIt = this->basis_.getGridView().template end<0>();
-
     // Loop over all elements
-    for (; it!=endIt; ++it) {
-
-        int elementIdx = indexSet.index(*it);
+    for (const auto& element : elements(this->basis_.gridView()))
+    {
+        int elementIdx = indexSet.index(element);
 
         // Extract local solution on this element
         Dune::P1LocalFiniteElement<double,double,gridDim> localFiniteElement;
@@ -105,20 +102,20 @@ getStrain(const std::vector<RigidBodyMotion<double,3> >& sol,
         std::vector<RigidBodyMotion<double,3> > localSolution(2);
 
         for (int i=0; i<numOfBaseFct; i++)
-            localSolution[i] = sol[indexSet.subIndex(*it,i,gridDim)];
+            localSolution[i] = sol[indexSet.subIndex(element,i,gridDim)];
 
         // Get quadrature rule
         const int polOrd = 2;
-        const QuadratureRule<double, gridDim>& quad = QuadratureRules<double, gridDim>::rule(it->type(), polOrd);
+        const auto& quad = QuadratureRules<double, gridDim>::rule(element.type(), polOrd);
 
         for (int pt=0; pt<quad.size(); pt++) {
 
             // Local position of the quadrature point
             const FieldVector<double,gridDim>& quadPos = quad[pt].position();
 
-            double weight = quad[pt].weight() * it->geometry().integrationElement(quadPos);
+            double weight = quad[pt].weight() * element.geometry().integrationElement(quadPos);
 
-            FieldVector<double,blocksize> localStrain = dynamic_cast<RodLocalStiffness<GridView, double>* >(this->localStiffness_)->getStrain(localSolution, *it, quad[pt].position());
+            FieldVector<double,blocksize> localStrain = dynamic_cast<RodLocalStiffness<GridView, double>* >(this->localStiffness_)->getStrain(localSolution, element, quad[pt].position());
 
             // Sum it all up
             strain[elementIdx].axpy(weight, localStrain);
@@ -131,7 +128,7 @@ getStrain(const std::vector<RigidBodyMotion<double,3> >& sol,
         // /////////////////////////////////////////////////////////////////////////
         // we know the element is a line, therefore the integration element is the volume
         FieldVector<double,1> dummyPos(0.5);
-        strain[elementIdx] /= it->geometry().integrationElement(dummyPos);
+        strain[elementIdx] /= element.geometry().integrationElement(dummyPos);
 
     }
 
@@ -248,32 +245,29 @@ assembleMatrix(const std::vector<RigidBodyMotion<double,2> >& sol,
 
     matrix = 0;
 
-    ElementIterator it    = this->basis_.getGridView().template begin<0>();
-    ElementIterator endit = this->basis_.getGridView().template end<0>  ();
-
     Dune::Matrix<MatrixBlock> mat;
 
-    for( ; it != endit; ++it ) {
-
+    for (const auto& element : Dune::elements(this->basis_.gridView()))
+    {
         const int numOfBaseFct = 2;
 
         // Extract local solution
         std::vector<RigidBodyMotion<double,2> > localSolution(numOfBaseFct);
 
         for (int i=0; i<numOfBaseFct; i++)
-            localSolution[i] = sol[this->basis_.index(*it,i)];
+            localSolution[i] = sol[this->basis_.index(element,i)];
 
         // setup matrix
-        getLocalMatrix( *it, localSolution, mat);
+        getLocalMatrix(element, localSolution, mat);
 
         // Add element matrix to global stiffness matrix
         for(int i=0; i<numOfBaseFct; i++) {
 
-            int row = this->basis_.index(*it,i);
+            int row = this->basis_.index(element,i);
 
             for (int j=0; j<numOfBaseFct; j++ ) {
 
-                int col = this->basis_.index(*it,j);
+                int col = this->basis_.index(element,j);
                 matrix[row][col] += mat[i][j];
 
             }
@@ -447,12 +441,9 @@ assembleGradient(const std::vector<RigidBodyMotion<double,2> >& sol,
     grad.resize(sol.size());
     grad = 0;
 
-    ElementIterator it    = this->basis_.getGridView().template begin<0>();
-    ElementIterator endIt = this->basis_.getGridView().template end<0>();
-
     // Loop over all elements
-    for (; it!=endIt; ++it) {
-
+    for (const auto& element : Dune::elements(this->basis_gridView()))
+    {
         // Extract local solution on this element
         Dune::P1LocalFiniteElement<double,double,gridDim> localFiniteElement;
         const int numOfBaseFct = localFiniteElement.localBasis().size();
@@ -460,18 +451,18 @@ assembleGradient(const std::vector<RigidBodyMotion<double,2> >& sol,
         RigidBodyMotion<double,2> localSolution[numOfBaseFct];
 
         for (int i=0; i<numOfBaseFct; i++)
-            localSolution[i] = sol[this->basis_.index(*it,i)];
+            localSolution[i] = sol[this->basis_.index(element,i)];
 
         // Get quadrature rule
-        const Dune::QuadratureRule<double, gridDim>& quad = Dune::QuadratureRules<double, gridDim>::rule(it->type(), 2);
+        const auto& quad = Dune::QuadratureRules<double, gridDim>::rule(element.type(), 2);
 
         for (int pt=0; pt<quad.size(); pt++) {
 
             // Local position of the quadrature point
             const Dune::FieldVector<double,gridDim>& quadPos = quad[pt].position();
 
-            const Dune::FieldMatrix<double,1,1>& inv = it->geometry().jacobianInverseTransposed(quadPos);
-            const double integrationElement = it->geometry().integrationElement(quadPos);
+            const Dune::FieldMatrix<double,1,1>& inv = element.geometry().jacobianInverseTransposed(quadPos);
+            const double integrationElement = element.geometry().integrationElement(quadPos);
 
             double weight = quad[pt].weight() * integrationElement;
 
@@ -510,7 +501,7 @@ assembleGradient(const std::vector<RigidBodyMotion<double,2> >& sol,
 
             for (int dof=0; dof<numOfBaseFct; dof++) {
 
-                int globalDof = this->basis_.index(*it,dof);
+                int globalDof = this->basis_.index(element,dof);
 
                 //printf("globalDof: %d   partA1: %g   partA3: %g\n", globalDof, partA1, partA3);
 
@@ -544,12 +535,9 @@ computeEnergy(const std::vector<RigidBodyMotion<double,2> >& sol) const
     if (sol.size()!=this->basis_.size())
         DUNE_THROW(Dune::Exception, "Solution vector doesn't match the grid!");
 
-    ElementIterator it    = this->basis_.getGridView().template begin<0>();
-    ElementIterator endIt = this->basis_.getGridView().template end<0>();
-
     // Loop over all elements
-    for (; it!=endIt; ++it) {
-
+    for (const auto& element : Dune::elements(this->basis_gridView()))
+    {
         // Extract local solution on this element
         Dune::P1LocalFiniteElement<double,double,gridDim> localFiniteElement;
 
@@ -558,18 +546,18 @@ computeEnergy(const std::vector<RigidBodyMotion<double,2> >& sol) const
         std::vector<RigidBodyMotion<double,2> > localSolution(numOfBaseFct);
 
         for (int i=0; i<numOfBaseFct; i++)
-            localSolution[i] = sol[this->basis_.index(*it,i)];
+            localSolution[i] = sol[this->basis_.index(element,i)];
 
         // Get quadrature rule
-        const Dune::QuadratureRule<double, gridDim>& quad = Dune::QuadratureRules<double, gridDim>::rule(it->type(), 2);
+        const auto& quad = Dune::QuadratureRules<double, gridDim>::rule(element.type(), 2);
 
         for (int pt=0; pt<quad.size(); pt++) {
 
             // Local position of the quadrature point
             const Dune::FieldVector<double,gridDim>& quadPos = quad[pt].position();
 
-            const Dune::FieldMatrix<double,1,1>& inv = it->geometry().jacobianInverseTransposed(quadPos);
-            const double integrationElement = it->geometry().integrationElement(quadPos);
+            const Dune::FieldMatrix<double,1,1>& inv = element.geometry().jacobianInverseTransposed(quadPos);
+            const double integrationElement = element.geometry().integrationElement(quadPos);
 
             double weight = quad[pt].weight() * integrationElement;
 
diff --git a/dune/gfe/rodassembler.hh b/dune/gfe/rodassembler.hh
index 6e1ba19c..746a6e25 100644
--- a/dune/gfe/rodassembler.hh
+++ b/dune/gfe/rodassembler.hh
@@ -96,7 +96,6 @@ class RodAssembler<Basis,2> : public GeodesicFEAssembler<Basis, RigidBodyMotion<
 
     typedef typename Basis::GridView GridView;
     typedef typename GridView::template Codim<0>::Entity EntityType;
-    typedef typename GridView::template Codim<0>::Iterator ElementIterator;
 
     //! Dimension of the grid.  This needs to be one!
     enum { gridDim = GridView::dimension };
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 6ecddf59..98aea9b5 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -3,6 +3,7 @@ set(programs compute-disc-error
              film-on-substrate
              gradient-flow
              harmonicmaps
+             rod3d
              rod-eoc)
 #            rodobstacle)
 
diff --git a/src/rod3d.cc b/src/rod3d.cc
index b2184a06..7ea90ec2 100644
--- a/src/rod3d.cc
+++ b/src/rod3d.cc
@@ -68,7 +68,13 @@ int main (int argc, char *argv[]) try
 
     grid.globalRefine(numLevels-1);
 
-    SolutionType x(grid.size(grid.maxLevel(),1));
+    using GridView = GridType::LeafGridView;
+    GridView gridView = grid.leafGridView();
+
+    using FEBasis = Functions::LagrangeBasis<GridView,1>;
+    FEBasis feBasis(gridView);
+
+    SolutionType x(feBasis.size());
 
     // //////////////////////////
     //   Initial solution
@@ -109,7 +115,7 @@ int main (int argc, char *argv[]) try
     std::cout << "director 1:  " << x[x.size()-1].q.director(1) << std::endl;
     std::cout << "director 2:  " << x[x.size()-1].q.director(2) << std::endl;
 
-    BitSetVector<blocksize> dirichletNodes(grid.size(1));
+    BitSetVector<blocksize> dirichletNodes(feBasis.size());
     dirichletNodes.unsetAll();
         
     dirichletNodes[0] = true;
@@ -119,13 +125,13 @@ int main (int argc, char *argv[]) try
     //   Create a solver for the rod problem
     // ///////////////////////////////////////////
 
-    RodLocalStiffness<GridType::LeafGridView,double> localStiffness(grid.leafGridView(),
-                                                                    A, J1, J2, E, nu);
+    RodLocalStiffness<GridView,double> localStiffness(gridView,
+                                                      A, J1, J2, E, nu);
+
+    RodAssembler<FEBasis,3> rodAssembler(gridView, &localStiffness);
 
-    RodAssembler<GridType::LeafGridView,3> rodAssembler(grid.leafGridView(), &localStiffness);
+    RiemannianTrustRegionSolver<FEBasis,RigidBodyMotion<double,3> > rodSolver;
 
-    RiemannianTrustRegionSolver<GridType,RigidBodyMotion<double,3> > rodSolver;
-#if 1
     rodSolver.setup(grid, 
                     &rodAssembler,
                     x,
@@ -139,18 +145,6 @@ int main (int argc, char *argv[]) try
                     baseIterations,
                     baseTolerance,
                     instrumented);
-#else
-    rodSolver.setupTCG(grid, 
-                       &rodAssembler,
-                       x,
-                       dirichletNodes,
-                       tolerance,
-                       maxTrustRegionSteps,
-                       initialTrustRegionRadius,
-                       multigridIterations,
-                       mgTolerance,
-                       instrumented);
-#endif
 
     // /////////////////////////////////////////////////////
     //   Solve!
-- 
GitLab