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