diff --git a/dune/gfe/Makefile.am b/dune/gfe/Makefile.am index fbc2e36b143f859ea0436e8d1a32dd1f0d5adc6b..e1eb50a1f55dcd4c9f1c20c8514d33c80f5355c6 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 0000000000000000000000000000000000000000..f03b6e9af1b51fdb4d4b9d2f8158b199bd04415b --- /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