From f3598408135f0094a2091417ff70860d98ed1cbc Mon Sep 17 00:00:00 2001
From: Oliver Sander <sander@igpm.rwth-aachen.de>
Date: Fri, 14 Jan 2011 10:31:52 +0000
Subject: [PATCH] start merging the separate global methods into a single
 factory class

[[Imported from SVN: r6745]]
---
 dune/gfe/rodfactory.hh | 38 +++++++++++++++++++++++++++-----------
 1 file changed, 27 insertions(+), 11 deletions(-)

diff --git a/dune/gfe/rodfactory.hh b/dune/gfe/rodfactory.hh
index 73ea6b2a..bfec8836 100644
--- a/dune/gfe/rodfactory.hh
+++ b/dune/gfe/rodfactory.hh
@@ -8,13 +8,27 @@
 #include "rigidbodymotion.hh"
 #include <dune/gfe/localgeodesicfefunction.hh>
 
+/** \brief A factory class that implements various ways to create rod configurations
+ */
+
+template <class GridView>
+class RodFactory
+{
+    dune_static_assert(GridView::dimensionworld==1, "RodFactory is only implemented for grids in a 1d world");
+    
+public:
+
+    RodFactory(const GridView& gridView)
+    : gridView_(gridView)
+    {}
+    
 /** \brief Make a straight, unsheared rod from two given endpoints
 
 \param[out] rod The new rod
 \param[in] n The number of vertices
 */
 template <int dim>
-void makeStraightRod(std::vector<RigidBodyMotion<dim> >& rod, int n,
+    static void makeStraightRod(std::vector<RigidBodyMotion<dim> >& rod, int n,
                      const Dune::FieldVector<double,3>& beginning, const Dune::FieldVector<double,3>& end)
 {
     // Compute the correct orientation
@@ -50,15 +64,12 @@ void makeStraightRod(std::vector<RigidBodyMotion<dim> >& rod, int n,
 /** \brief Make a rod by interpolating between two end configurations
 
 \param[out] rod The new rod
-\param[in] n The number of vertices
 */
-template <class GridView, int spaceDim>
-void makeStraightRod(const GridView& gridView,
-                     std::vector<RigidBodyMotion<spaceDim> >& rod,
+    template <int spaceDim>
+    void create(std::vector<RigidBodyMotion<spaceDim> >& rod,
                      const RigidBodyMotion<3,double>& beginning,
                      const RigidBodyMotion<3,double>& end)
 {
-    dune_static_assert(GridView::dimensionworld==1, "makeStraightRod is only implemented for grids in a 1d world");
     
     static const int dim = GridView::dimension;  // de facto: 1
     
@@ -66,8 +77,8 @@ void makeStraightRod(const GridView& gridView,
     //  Get smallest and largest coordinate, in order to create an arc-length parametrization
     //////////////////////////////////////////////////////////////////////////////////////////////
     
-    typename GridView::template Codim<dim>::Iterator vIt    = gridView.template begin<dim>();
-    typename GridView::template Codim<dim>::Iterator vEndIt = gridView.template end<dim>();
+    typename GridView::template Codim<dim>::Iterator vIt    = gridView_.template begin<dim>();
+    typename GridView::template Codim<dim>::Iterator vEndIt = gridView_.template end<dim>();
     
     double min =  std::numeric_limits<double>::max();
     double max = -std::numeric_limits<double>::max();
@@ -91,13 +102,18 @@ void makeStraightRod(const GridView& gridView,
     //  Interpolate according to arc-length
     ////////////////////////////////////////////////////////////////////////////////////
 
-    rod.resize(gridView.size(dim));
+    rod.resize(gridView_.size(dim));
     
-    for (vIt = gridView.template begin<dim>(); vIt != vEndIt; ++vIt) {
-        int idx = gridView.indexSet().index(*vIt);
+    for (vIt = gridView_.template begin<dim>(); vIt != vEndIt; ++vIt) {
+        int idx = gridView_.indexSet().index(*vIt);
         Dune::FieldVector<double,1> local = (vIt->geometry().corner(0)[0] - min) / (max - min);
         rod[idx] = localGFEFunction.evaluate(local);
     }
 }
 
+private:
+    
+    const GridView& gridView_;
+};
+
 #endif
-- 
GitLab