diff --git a/dune/gfe/cosseratvtkwriter.hh b/dune/gfe/cosseratvtkwriter.hh index 3f0f4391703429b4445a8627a9a6cc0c852a25b7..a11f7c4c235890b04d4f5003cb18a751d1505387 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