From 78d6c5a5246aedc934d7a18bca0b87c6b737ed36 Mon Sep 17 00:00:00 2001 From: Oliver Sander <sander@igpm.rwth-aachen.de> Date: Wed, 11 Jan 2012 15:36:00 +0000 Subject: [PATCH] Write a Cosserat continuum into a vtk file. Much nicer: I can have the surface and the director vector fields all in one file. [[Imported from SVN: r8361]] --- dune/gfe/cosseratvtkwriter.hh | 111 ++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 dune/gfe/cosseratvtkwriter.hh diff --git a/dune/gfe/cosseratvtkwriter.hh b/dune/gfe/cosseratvtkwriter.hh new file mode 100644 index 00000000..42894b11 --- /dev/null +++ b/dune/gfe/cosseratvtkwriter.hh @@ -0,0 +1,111 @@ +#ifndef COSSERAT_VTK_WRITER_HH +#define COSSERAT_VTK_WRITER_HH + +#include <dune/grid/geometrygrid.hh> +#include <dune/grid/io/file/vtk/vtkwriter.hh> + +#include <dune/fufem/functionspacebases/p1nodalbasis.hh> +#include <dune/fufem/functions/vtkbasisgridfunction.hh> +#include <dune/gfe/rigidbodymotion.hh> + + +/** \brief Write the configuration of a Cosserat material in AmiraMesh format */ +template <class GridType> +class CosseratVTKWriter +{ + + static const int dim = GridType::dimension; + + /** \brief Encapsulates the grid deformation for the GeometryGrid class */ + template <class HostGridView> + class DeformationFunction + : public Dune :: DiscreteCoordFunction< double, 3, DeformationFunction<HostGridView> > + { + typedef DeformationFunction<HostGridView> This; + typedef Dune :: DiscreteCoordFunction< double, 3, This > Base; + + static const int dim = HostGridView::dimension; + + public: + + DeformationFunction(const HostGridView& gridView, + const std::vector<RigidBodyMotion<double,3> >& deformedPosition) + : gridView_(gridView), + deformedPosition_(deformedPosition) + {} + + void evaluate (const typename HostGridView::template Codim<dim>::Entity& hostEntity, unsigned int corner, + Dune::FieldVector<double,3> &y ) const + { + + const typename HostGridView::IndexSet& indexSet = gridView_.indexSet(); + + int idx = indexSet.index(hostEntity); + y = deformedPosition_[idx].r; + } + + void evaluate (const typename HostGridView::template Codim<0>::Entity& hostEntity, unsigned int corner, + Dune::FieldVector<double,3> &y ) const + { + + const typename HostGridView::IndexSet& indexSet = gridView_.indexSet(); + + int idx = indexSet.subIndex(hostEntity, corner,dim); + + y = deformedPosition_[idx].r; + } + + private: + + HostGridView gridView_; + + const std::vector<RigidBodyMotion<double,3> > deformedPosition_; + + }; + + +public: + static void write(const GridType& grid, + const std::vector<RigidBodyMotion<double,3> >& configuration, + const std::string& filePrefix) + { + + typedef Dune::GeometryGrid<GridType,DeformationFunction<typename GridType::LeafGridView> > DeformedGridType; + + DeformationFunction<typename GridType::LeafGridView> deformationFunction(grid.leafView(), 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.leafView()); + + Dune::VTKWriter<typename DeformedGridType::LeafGridView> vtkWriter(deformedGrid.leafView()); + + // 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(filePrefix + "VTKGrid"); + + } + +}; + +#endif -- GitLab