From bac203d0c8b928c3b65a003fcb1497ef2ab4f9ea Mon Sep 17 00:00:00 2001 From: Oliver Sander <sander@igpm.rwth-aachen.de> Date: Wed, 19 Oct 2011 15:33:29 +0000 Subject: [PATCH] A new class that writes configurations of a Cosserat continuum in AmiraMesh format [[Imported from SVN: r7966]] --- dune/gfe/Makefile.am | 1 + dune/gfe/cosseratamirameshwriter.hh | 106 ++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 dune/gfe/cosseratamirameshwriter.hh diff --git a/dune/gfe/Makefile.am b/dune/gfe/Makefile.am index fbc2e36b..e1eb50a1 100644 --- a/dune/gfe/Makefile.am +++ b/dune/gfe/Makefile.am @@ -7,6 +7,7 @@ AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/.. srcincludedir = $(includedir)/dune/common srcinclude_HEADERS = averagedistanceassembler.hh \ averageinterface.hh \ + cosseratamirameshwriter.hh \ geodesicdifference.hh \ geodesicfeassembler.hh \ geodesicfefunctionadaptor.hh \ diff --git a/dune/gfe/cosseratamirameshwriter.hh b/dune/gfe/cosseratamirameshwriter.hh new file mode 100644 index 00000000..f03b6e9a --- /dev/null +++ b/dune/gfe/cosseratamirameshwriter.hh @@ -0,0 +1,106 @@ +#ifndef COSSERAT_AMIRAMESH_WRITER_HH +#define COSSERAT_AMIRAMESH_WRITER_HH + +#include <dune/grid/geometrygrid.hh> +#include <dune/grid/io/file/amirameshwriter.hh> + +#include <dune/gfe/rigidbodymotion.hh> + + +/** \brief Write the configuration of a Cosserat material in AmiraMesh format */ +template <class GridType> +class CosseratAmiraMeshWriter +{ + + 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<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<3> > deformedPosition_; + + }; + + +public: + static void write(GridType& grid, + const std::vector<RigidBodyMotion<3> >& configuration, + const std::string& filePrefix) + { + + typedef Dune::GeometryGrid<GridType,DeformationFunction<typename GridType::LeafGridView> > DeformedGridType; + + DeformationFunction<typename GridType::LeafGridView> deformationFunction(grid.leafView(), configuration); + + DeformedGridType deformedGrid(grid, deformationFunction); + + if (dim==2) + Dune::LeafAmiraMeshWriter<DeformedGridType>::writeSurfaceGrid(deformedGrid.leafView(), "cosseratGrid"); + else { + Dune::LeafAmiraMeshWriter<DeformedGridType> amiramesh(deformedGrid); + amiramesh.write(filePrefix + "Grid"); + } + + // Make three vector fields containing the directors + // I don't think there is a simpler way to get the data into vanilla Amira + + for (int i=0; i<3; i++) { + + std::vector<Dune::FieldVector<double,3> > director(configuration.size()); + for (size_t j=0; j<configuration.size(); j++) + director[j] = configuration[j].q.director(i); + + Dune::LeafAmiraMeshWriter<DeformedGridType> amiramesh; + amiramesh.addVertexData(director, deformedGrid.leafView()); + + std::stringstream iAsAscii; + iAsAscii << i; + amiramesh.write(filePrefix + "Orientation"+iAsAscii.str(), true); + + } + + } + +}; + +#endif -- GitLab