From b6e42bcaa1ecf9955dbede2701dc6277b6a86fa5 Mon Sep 17 00:00:00 2001
From: Oliver Sander <sander@igpm.rwth-aachen.de>
Date: Sat, 22 Mar 2014 14:02:56 +0000
Subject: [PATCH] Add a new 'write' method that takes an FE basis instead of a
 grid as input

This will be generalized to take any Lagrange basis, to allow some form
of visualization for higher-order functions.

[[Imported from SVN: r9662]]
---
 dune/gfe/cosseratvtkwriter.hh | 50 +++++++++++++++++++++++++++++++++++
 1 file changed, 50 insertions(+)

diff --git a/dune/gfe/cosseratvtkwriter.hh b/dune/gfe/cosseratvtkwriter.hh
index 3f0f4391..a11f7c4c 100644
--- a/dune/gfe/cosseratvtkwriter.hh
+++ b/dune/gfe/cosseratvtkwriter.hh
@@ -65,6 +65,9 @@ class CosseratVTKWriter
 
     
 public:
+
+    /** \brief Write a Cosserat configuration given as vertex data
+     */
     static void write(const GridType& grid,
                       const std::vector<RigidBodyMotion<double,3> >& configuration,
                       const std::string& filename)
@@ -106,6 +109,53 @@ public:
     
     }    
 
+    /** \brief Write a configuration given with respect to a scalar function space basis
+     */
+    template <typename Basis>
+    static void write(const Basis& basis,
+                      const std::vector<RigidBodyMotion<double,3> >& configuration,
+                      const std::string& filename)
+    {
+        typedef typename GridType::LeafGridView GridView;
+
+        const GridType& grid = basis.getGridView().grid();
+
+        typedef Dune::GeometryGrid<GridType,DeformationFunction<GridView> > DeformedGridType;
+
+        DeformationFunction<typename GridType::LeafGridView> deformationFunction(grid.leafGridView(), configuration);
+
+        // stupid, can't instantiate deformedGrid with a const grid
+        DeformedGridType deformedGrid(const_cast<GridType&>(grid), deformationFunction);
+
+        typedef P1NodalBasis<typename DeformedGridType::LeafGridView,double> P1Basis;
+        P1Basis p1Basis(deformedGrid.leafGridView());
+
+        Dune::VTKWriter<typename DeformedGridType::LeafGridView> vtkWriter(deformedGrid.leafGridView());
+
+        // Make three vector fields containing the directors
+        typedef std::vector<Dune::FieldVector<double,3> > CoefficientType;
+
+        std::vector<CoefficientType> directors(3);
+
+        for (int i=0; i<3; i++) {
+
+            directors[i].resize(configuration.size());
+            for (size_t j=0; j<configuration.size(); j++)
+                directors[i][j] = configuration[j].q.director(i);
+
+            std::stringstream iAsAscii;
+            iAsAscii << i;
+
+            Dune::shared_ptr<VTKBasisGridFunction<P1Basis,CoefficientType> > vtkDirector
+               = Dune::shared_ptr<VTKBasisGridFunction<P1Basis,CoefficientType> >
+                   (new VTKBasisGridFunction<P1Basis,CoefficientType>(p1Basis, directors[i], "director"+iAsAscii.str()));
+            vtkWriter.addVertexData(vtkDirector);
+        }
+
+        vtkWriter.write(filename);
+
+    }
+
 };
 
 #endif
-- 
GitLab