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