From b29c7f4e9d52a3c92eea1400c404d34508e54083 Mon Sep 17 00:00:00 2001
From: Oliver Sander <sander@igpm.rwth-aachen.de>
Date: Tue, 30 Sep 2014 13:02:06 +0000
Subject: [PATCH] Write first-order configurations using the new VTKFile class
 instead of GeometryGrid

[[Imported from SVN: r9894]]
---
 dune/gfe/cosseratvtkwriter.hh | 88 ++++++++++++++++++++++-------------
 1 file changed, 55 insertions(+), 33 deletions(-)

diff --git a/dune/gfe/cosseratvtkwriter.hh b/dune/gfe/cosseratvtkwriter.hh
index 11c4331c..eeff9a5f 100644
--- a/dune/gfe/cosseratvtkwriter.hh
+++ b/dune/gfe/cosseratvtkwriter.hh
@@ -304,55 +304,77 @@ public:
         vtkFile.write(filename);
 
 #else   // FIRST_ORDER
-        typedef typename GridType::LeafGridView GridView;
 
-        const GridType& grid = basis.getGridView().grid();
+        Dune::GFE::VTKFile vtkFile(gridView.comm().rank(), gridView.comm().size());
 
-        //////////////////////////////////////////////////////////////////////////////////
-        //  Deform the grid according to the position information in 'configuration'
-        //////////////////////////////////////////////////////////////////////////////////
+        // Stupid: I can't directly get the number of Interior_Partition elements
+        size_t numElements = 0;
+        for (auto it = gridView.template begin<0,Dune::Interior_Partition>(); it != gridView.template end<0,Dune::Interior_Partition>(); ++it)
+          numElements++;
 
-        typedef Dune::GeometryGrid<GridType,DeformationFunction<GridView> > DeformedGridType;
+        // Enter vertex coordinates
+        std::vector<Dune::FieldVector<double, 3> > points(configuration.size());
+        for (size_t i=0; i<configuration.size(); i++)
+          points[i] = configuration[i].r;
 
-        DeformationFunction<typename GridType::LeafGridView> deformationFunction(grid.leafGridView(), configuration);
+        vtkFile.points_ = points;
 
-        // stupid, can't instantiate deformedGrid with a const grid
-        DeformedGridType deformedGrid(const_cast<GridType&>(grid), deformationFunction);
+        // Enter elements
+        std::vector<int> connectivity(numElements*4);
 
-        typedef P1NodalBasis<typename DeformedGridType::LeafGridView,double> DeformedP1Basis;
-        DeformedP1Basis deformedP1Basis(deformedGrid.leafGridView());
+        size_t i=0;
+        for (auto it = gridView.template begin<0,Dune::Interior_Partition>(); it != gridView.template end<0,Dune::Interior_Partition>(); ++it)
+        {
+          if (it->type().isQuadrilateral())
+          {
+            connectivity[i++] = basis.index(*it,0);
+            connectivity[i++] = basis.index(*it,1);
+            connectivity[i++] = basis.index(*it,3);
+            connectivity[i++] = basis.index(*it,2);
+          }
+        }
 
-        Dune::VTKWriter<typename DeformedGridType::LeafGridView> vtkWriter(deformedGrid.leafGridView());
+        vtkFile.cellConnectivity_ = connectivity;
 
-        // Make three vector fields containing the directors
-        typedef std::vector<Dune::FieldVector<double,3> > CoefficientType;
+        std::vector<int> offsets(numElements);
+        i = 0;
+        int offsetCounter = 0;
+        for (auto it = gridView.template begin<0>(); it != gridView.template end<0>(); ++it)
+        {
+          if (it->type().isQuadrilateral())
+            offsetCounter += 4;
+          offsets[i++] += offsetCounter;
+        }
 
-        std::vector<CoefficientType> directors(3);
+        vtkFile.cellOffsets_ = offsets;
 
-        for (int i=0; i<3; i++) {
+        std::vector<int> cellTypes(numElements);
+        i = 0;
+        for (auto it = gridView.template begin<0>(); it != gridView.template end<0>(); ++it)
+        {
+          if (it->type().isQuadrilateral())
+            cellTypes[i++] = 9;
+        }
+        vtkFile.cellTypes_ = cellTypes;
 
-            directors[i].resize(configuration.size());
-            for (size_t j=0; j<configuration.size(); j++)
-                directors[i][j] = configuration[j].q.director(i);
+        // Z coordinate for better visualization of wrinkles
+        std::vector<double> zCoord(points.size());
+        for (size_t i=0; i<configuration.size(); i++)
+          zCoord[i] = configuration[i].r[2];
 
-            std::stringstream iAsAscii;
-            iAsAscii << i;
+        vtkFile.zCoord_ = zCoord;
 
-            Dune::shared_ptr<VTKBasisGridFunction<DeformedP1Basis,CoefficientType> > vtkDirector
-               = Dune::make_shared<VTKBasisGridFunction<DeformedP1Basis,CoefficientType> >
-                                  (deformedP1Basis, directors[i], "director"+iAsAscii.str());
-            vtkWriter.addVertexData(vtkDirector);
+        // The three director fields
+        for (size_t i=0; i<3; i++)
+        {
+          vtkFile.directors_[i].resize(configuration.size());
+          for (size_t j=0; j<configuration.size(); j++)
+            vtkFile.directors_[i][j] = configuration[j].q.director(i);
         }
 
-        // For easier visualization of wrinkles: add z-coordinate as scalar field
-        std::vector<double> zCoord(configuration.size());
-        for (size_t i=0; i<zCoord.size(); i++)
-          zCoord[i] = configuration[i].r[2];
-
-        vtkWriter.addVertexData(zCoord, "zCoord");
+        // Actually write the VTK file to disk
+        vtkFile.write(filename);
 
-        // Write the file to disk
-        vtkWriter.write(filename);
 #endif
     }
 
-- 
GitLab