From 5c85c7b19686d613efc06054ff1ac0d9e85bf3ae Mon Sep 17 00:00:00 2001
From: Oliver Sander <sander@igpm.rwth-aachen.de>
Date: Fri, 20 Mar 2015 15:48:21 +0000
Subject: [PATCH] Start using the new dune-functions bases

[[Imported from SVN: r10098]]
---
 src/cosserat-continuum.cc | 42 ++++++++++++++++++++-------------------
 1 file changed, 22 insertions(+), 20 deletions(-)

diff --git a/src/cosserat-continuum.cc b/src/cosserat-continuum.cc
index 6a3f0171..e914dc1d 100644
--- a/src/cosserat-continuum.cc
+++ b/src/cosserat-continuum.cc
@@ -24,11 +24,12 @@
 
 #include <dune/grid/io/file/gmshreader.hh>
 
+#include <dune/functions/functionspacebases/pqknodalbasis.hh>
+
 #include <dune/fufem/boundarypatch.hh>
 #include <dune/fufem/functiontools/boundarydofs.hh>
 #include <dune/fufem/functiontools/basisinterpolator.hh>
-#include <dune/fufem/functionspacebases/p1nodalbasis.hh>
-#include <dune/fufem/functionspacebases/p2nodalbasis.hh>
+#include <dune/fufem/functionspacebases/dunefunctionsbasis.hh>
 #include <dune/fufem/dunepython.hh>
 
 #include <dune/solvers/solvers/iterativesolver.hh>
@@ -150,12 +151,15 @@ int main (int argc, char *argv[]) try
     GridView gridView = grid->leafGridView();
 
 #ifdef SECOND_ORDER
-    typedef P2NodalBasis<GridView,double> FEBasis;
+    typedef Dune::Functions::PQKNodalBasis<typename GridType::LeafGridView, 2> FEBasis;
 #else
-    typedef P1NodalBasis<GridView,double> FEBasis;
+    typedef Dune::Functions::PQKNodalBasis<typename GridType::LeafGridView, 1> FEBasis;
 #endif
     FEBasis feBasis(gridView);
 
+    typedef DuneFunctionsBasis<FEBasis> FufemFEBasis;
+    FufemFEBasis fufemFeBasis(feBasis);
+
     // /////////////////////////////////////////
     //   Read Dirichlet values
     // /////////////////////////////////////////
@@ -196,14 +200,14 @@ int main (int argc, char *argv[]) try
       std::cout << "Neumann boundary has " << neumannBoundary.numFaces() << " faces\n";
 
 
-    BitSetVector<1> dirichletNodes(feBasis.size(), false);
-    constructBoundaryDofs(dirichletBoundary,feBasis,dirichletNodes);
+    BitSetVector<1> dirichletNodes(feBasis.indexSet().size(), false);
+    constructBoundaryDofs(dirichletBoundary,fufemFeBasis,dirichletNodes);
 
-    BitSetVector<1> neumannNodes(feBasis.size(), false);
-    constructBoundaryDofs(neumannBoundary,feBasis,neumannNodes);
+    BitSetVector<1> neumannNodes(feBasis.indexSet().size(), false);
+    constructBoundaryDofs(neumannBoundary,fufemFeBasis,neumannNodes);
 
-    BitSetVector<blocksize> dirichletDofs(feBasis.size(), false);
-    for (size_t i=0; i<feBasis.size(); i++)
+    BitSetVector<blocksize> dirichletDofs(feBasis.indexSet().size(), false);
+    for (size_t i=0; i<feBasis.indexSet().size(); i++)
       if (dirichletNodes[i][0])
         for (int j=0; j<5; j++)
           dirichletDofs[i][j] = true;
@@ -212,7 +216,7 @@ int main (int argc, char *argv[]) try
     //   Initial iterate
     // //////////////////////////
 
-    SolutionType x(feBasis.size());
+    SolutionType x(feBasis.indexSet().size());
 
     if (parameterSet.hasKey("startFromFile"))
     {
@@ -222,7 +226,7 @@ int main (int argc, char *argv[]) try
     PythonFunction<FieldVector<double,dim>, FieldVector<double,3> > pythonInitialDeformation(Python::evaluate(lambda));
 
     std::vector<FieldVector<double,3> > v;
-    Functions::interpolate(feBasis, v, pythonInitialDeformation);
+      ::Functions::interpolate(fufemFeBasis, v, pythonInitialDeformation);
 
     for (size_t i=0; i<x.size(); i++)
       x[i].r = v[i];
@@ -233,7 +237,7 @@ int main (int argc, char *argv[]) try
     ////////////////////////////////////////////////////////
 
     // Output initial iterate (of homotopy loop)
-    CosseratVTKWriter<GridType>::write<FEBasis>(feBasis,x, resultPath + "cosserat_homotopy_0");
+    CosseratVTKWriter<GridType>::write<FufemFEBasis>(fufemFeBasis,x, resultPath + "cosserat_homotopy_0");
 
     for (int i=0; i<numHomotopySteps; i++) {
 
@@ -259,13 +263,11 @@ int main (int argc, char *argv[]) try
         }
 
     // Assembler using ADOL-C
-    CosseratEnergyLocalStiffness<GridView,
-                                 FEBasis::LocalFiniteElement,
+    CosseratEnergyLocalStiffness<FEBasis,
                                  3,adouble> cosseratEnergyADOLCLocalStiffness(materialParameters,
                                                                               &neumannBoundary,
                                                                               neumannFunction.get());
-    LocalGeodesicFEADOLCStiffness<GridView,
-                                  FEBasis::LocalFiniteElement,
+    LocalGeodesicFEADOLCStiffness<FEBasis,
                                   TargetSpace> localGFEADOLCStiffness(&cosseratEnergyADOLCLocalStiffness);
 
     GeodesicFEAssembler<FEBasis,TargetSpace> assembler(gridView, &localGFEADOLCStiffness);
@@ -305,10 +307,10 @@ int main (int argc, char *argv[]) try
         PythonFunction<FieldVector<double,dim>, FieldMatrix<double,3,3> > orientationDirichletValues(dirichletValuesPythonObject.get("orientation"));
 
         std::vector<FieldVector<double,3> > ddV;
-        Functions::interpolate(feBasis, ddV, deformationDirichletValues, dirichletDofs);
+        ::Functions::interpolate(fufemFeBasis, ddV, deformationDirichletValues, dirichletDofs);
 
         std::vector<FieldMatrix<double,3,3> > dOV;
-        Functions::interpolate(feBasis, dOV, orientationDirichletValues, dirichletDofs);
+        ::Functions::interpolate(fufemFeBasis, dOV, orientationDirichletValues, dirichletDofs);
 
         for (size_t j=0; j<x.size(); j++)
           if (dirichletNodes[j][0])
@@ -329,7 +331,7 @@ int main (int argc, char *argv[]) try
         // Output result of each homotopy step
         std::stringstream iAsAscii;
         iAsAscii << i+1;
-        CosseratVTKWriter<GridType>::write<FEBasis>(feBasis,x, resultPath + "cosserat_homotopy_" + iAsAscii.str());
+        CosseratVTKWriter<GridType>::write<FufemFEBasis>(fufemFeBasis,x, resultPath + "cosserat_homotopy_" + iAsAscii.str());
 
     }
 
-- 
GitLab