From 828e6bbb7914b951ff88fa4daddf4512a3ba30bb Mon Sep 17 00:00:00 2001
From: Oliver Sander <sander@igpm.rwth-aachen.de>
Date: Sat, 22 Mar 2014 18:17:37 +0000
Subject: [PATCH] Downsample higher-order Lagrangian functions to first-order
 ones.

That way, they can at least be looked at.  You won't see the intra-element
details, but frequently they are not even all this important.  Proper
subsampling of higher-order functions is more difficult and has to wait
for another day.

[[Imported from SVN: r9665]]
---
 dune/gfe/cosseratvtkwriter.hh | 52 +++++++++++++++++++++++++++++------
 1 file changed, 43 insertions(+), 9 deletions(-)

diff --git a/dune/gfe/cosseratvtkwriter.hh b/dune/gfe/cosseratvtkwriter.hh
index a11f7c4c..d35c40e4 100644
--- a/dune/gfe/cosseratvtkwriter.hh
+++ b/dune/gfe/cosseratvtkwriter.hh
@@ -63,6 +63,25 @@ class CosseratVTKWriter
 
     };
 
+    template <typename Basis1, typename Basis2>
+    static void downsample(const Basis1& basis1, const std::vector<RigidBodyMotion<double,3> >& v1,
+                           const Basis2& basis2,       std::vector<RigidBodyMotion<double,3> >& v2)
+    {
+      // Embed v1 into R^7
+      std::vector<Dune::FieldVector<double,7> > v1Embedded(v1.size());
+      for (size_t i=0; i<v1.size(); i++)
+        v1Embedded[i] = v1[i].globalCoordinates();
+
+      // Interpolate
+      BasisGridFunction<Basis1, std::vector<Dune::FieldVector<double,7> > > function(basis1, v1Embedded);
+      std::vector<Dune::FieldVector<double,7> > v2Embedded;
+      Functions::interpolate(basis2, v2Embedded, function);
+
+      // Copy back from R^7 into RigidBodyMotions
+      v2.resize(v2Embedded.size());
+      for (size_t i=0; i<v2.size(); i++)
+        v2[i] = RigidBodyMotion<double,3>(v2Embedded[i]);
+    }
     
 public:
 
@@ -120,15 +139,30 @@ public:
 
         const GridType& grid = basis.getGridView().grid();
 
+        //////////////////////////////////////////////////////////////////////////////////
+        //  Downsample the function onto a P1-space.  That's all we can visualize today.
+        //////////////////////////////////////////////////////////////////////////////////
+
+        typedef P1NodalBasis<GridView,double> P1Basis;
+        P1Basis p1Basis(basis.getGridView());
+
+        std::vector<RigidBodyMotion<double,3> > downsampledConfig;
+
+        downsample(basis, configuration, p1Basis, downsampledConfig);
+
+        //////////////////////////////////////////////////////////////////////////////////
+        //  Deform the grid according to the position information in 'configuration'
+        //////////////////////////////////////////////////////////////////////////////////
+
         typedef Dune::GeometryGrid<GridType,DeformationFunction<GridView> > DeformedGridType;
 
-        DeformationFunction<typename GridType::LeafGridView> deformationFunction(grid.leafGridView(), configuration);
+        DeformationFunction<typename GridType::LeafGridView> deformationFunction(grid.leafGridView(), downsampledConfig);
 
         // 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());
+        typedef P1NodalBasis<typename DeformedGridType::LeafGridView,double> DeformedP1Basis;
+        DeformedP1Basis deformedP1Basis(deformedGrid.leafGridView());
 
         Dune::VTKWriter<typename DeformedGridType::LeafGridView> vtkWriter(deformedGrid.leafGridView());
 
@@ -139,16 +173,16 @@ public:
 
         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);
+            directors[i].resize(downsampledConfig.size());
+            for (size_t j=0; j<downsampledConfig.size(); j++)
+                directors[i][j] = downsampledConfig[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()));
+            Dune::shared_ptr<VTKBasisGridFunction<DeformedP1Basis,CoefficientType> > vtkDirector
+               = Dune::shared_ptr<VTKBasisGridFunction<DeformedP1Basis,CoefficientType> >
+                   (new VTKBasisGridFunction<DeformedP1Basis,CoefficientType>(deformedP1Basis, directors[i], "director"+iAsAscii.str()));
             vtkWriter.addVertexData(vtkDirector);
         }
 
-- 
GitLab