$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r72290 - in sandbox/odeint/branches/karsten: boost/numeric/odeint/algebra boost/numeric/odeint/stepper boost/numeric/odeint/stepper/detail libs/numeric/odeint/ideas/fusion_runge_kutta libs/numeric/odeint/ideas/fusion_runge_kutta/performance
From: mario.mulansky_at_[hidden]
Date: 2011-05-30 11:37:07
Author: mariomulansky
Date: 2011-05-30 11:37:06 EDT (Mon, 30 May 2011)
New Revision: 72290
URL: http://svn.boost.org/trac/boost/changeset/72290
Log:
added algebra_caller and operations_caller for the generic stepper
added performance tests for odeint_generic
Added:
   sandbox/odeint/branches/karsten/boost/numeric/odeint/stepper/detail/generic_rk_call_algebra.hpp   (contents, props changed)
   sandbox/odeint/branches/karsten/boost/numeric/odeint/stepper/detail/generic_rk_operations.hpp   (contents, props changed)
   sandbox/odeint/branches/karsten/libs/numeric/odeint/ideas/fusion_runge_kutta/performance/generic_odeint_rk4_lorenz.cpp   (contents, props changed)
Text files modified: 
   sandbox/odeint/branches/karsten/boost/numeric/odeint/algebra/default_operations.hpp              |    47 ----------------------------------      
   sandbox/odeint/branches/karsten/boost/numeric/odeint/algebra/range_algebra.hpp                   |    55 ----------------------------------------
   sandbox/odeint/branches/karsten/boost/numeric/odeint/stepper/explicit_generic_rk.hpp             |    14 +++++++--                               
   sandbox/odeint/branches/karsten/libs/numeric/odeint/ideas/fusion_runge_kutta/fusion_algebra.hpp  |     4 +-                                      
   sandbox/odeint/branches/karsten/libs/numeric/odeint/ideas/fusion_runge_kutta/performance/Jamfile |     5 +++                                     
   5 files changed, 17 insertions(+), 108 deletions(-)
Modified: sandbox/odeint/branches/karsten/boost/numeric/odeint/algebra/default_operations.hpp
==============================================================================
--- sandbox/odeint/branches/karsten/boost/numeric/odeint/algebra/default_operations.hpp	(original)
+++ sandbox/odeint/branches/karsten/boost/numeric/odeint/algebra/default_operations.hpp	2011-05-30 11:37:06 EDT (Mon, 30 May 2011)
@@ -227,53 +227,6 @@
                 typedef void result_type;
         };
 
-
-	/*
-	 * For generic case
-	 */
-
-	template< size_t n , class Fac = double >
-	struct scale_sumn
-	{
-//		BOOST_STATIC_ASSERT( false );
-	};
-
-	template< class Fac >
-	struct scale_sumn< 1 , Fac > : public scale_sum2< Fac >
-	{
-		scale_sumn( const boost::array<Fac,1> &a , const Fac &dt ) : scale_sum2< Fac >( 1.0 , a[0]*dt )
-		{ }
-
-		typedef void result_type;
-	};
-
-	template< class Fac >
-	struct scale_sumn< 2 , Fac > : public scale_sum3< Fac >
-	{
-		scale_sumn( const boost::array<Fac,2> &a , const Fac &dt ) : scale_sum3< Fac >( 1.0 , a[0]*dt , a[1]*dt )
-		{ }
-
-		typedef void result_type;
-	};
-
-	template< class Fac >
-	struct scale_sumn< 3 , Fac > : public scale_sum4< Fac >
-	{
-		scale_sumn( const boost::array<Fac,3> &a , const Fac &dt ) : scale_sum4< Fac >( 1.0 , a[0]*dt , a[1]*dt , a[2]*dt )
-		{ }
-
-		typedef void result_type;
-	};
-
-	template< class Fac >
-	struct scale_sumn< 4 , Fac > : public scale_sum5< Fac >
-	{
-		scale_sumn( const boost::array<Fac,4> &a , const Fac &dt ) : scale_sum5< Fac >( 1.0 , a[0]*dt , a[1]*dt , a[2]*dt , a[3]*dt )
-		{ }
-
-		typedef void result_type;
-	};
-
         /*
          * for usage in for_each2
          *
Modified: sandbox/odeint/branches/karsten/boost/numeric/odeint/algebra/range_algebra.hpp
==============================================================================
--- sandbox/odeint/branches/karsten/boost/numeric/odeint/algebra/range_algebra.hpp	(original)
+++ sandbox/odeint/branches/karsten/boost/numeric/odeint/algebra/range_algebra.hpp	2011-05-30 11:37:06 EDT (Mon, 30 May 2011)
@@ -82,61 +82,6 @@
                 return detail::reduce( boost::begin( s ) , boost::end( s ) , red , init );
         }
 
-
-	/* for the generic stepper 
-	*/
-	template< size_t n , class S1 , class S2 , class S3 , class S4 , class Op >
-    inline static void for_eachn( S1 &s1 , S2 &s2 ,	S3 &s3 , S4 s4_array[n] , Op op )
-    {
-		for_eachn_fw( s1 , s2 , s3 , s4_array , op , boost::mpl::size_t< n-1 >() );
-    }
-
-	template< class S1 , class S2 , class S3 , class S4 , class Op  >
-    inline static void for_eachn_fw( S1 &s1 , S2 &s2 , S3 &s3 , S4 s4_array[0] , Op op , 
-			boost::mpl::size_t< 0 > c )
-    {
-		detail::for_each3( boost::begin( s1 ) , boost::end( s1 ) , boost::begin( s2 ) , 
-							boost::begin( s3 ) , op );
-	}
-
-	template< class S1 , class S2 , class S3 , class S4 , class Op >
-    inline static void for_eachn_fw( S1 &s1 , S2 &s2 , S3 &s3 , S4 s4_array[1] , Op op ,
-			boost::mpl::size_t< 1 > c )
-    {
-		detail::for_each4( boost::begin( s1 ) , boost::end( s1 ) , boost::begin( s2 ) , 
-							boost::begin( s3 ) , boost::begin( s4_array[0] ) , op );
-	}
-
-	template< class S1 , class S2 , class S3 , class S4 , class Op >
-    inline static void for_eachn_fw( S1 &s1 , S2 &s2 ,	S3 &s3 , S4 s4_array[2] , Op op ,
-            boost::mpl::size_t< 2 > c )
-    {
-		detail::for_each5( boost::begin( s1 ) , boost::end( s1 ) , boost::begin( s2 ) , 
-							boost::begin( s3 ) , boost::begin( s4_array[0] ) , 
-                            boost::begin( s4_array[1] ) , op );
-	}
-
-	template< class S1 , class S2 , class S3 , class S4 , class Op >
-    inline static void for_eachn_fw( S1 &s1 , S2 &s2 , S3 &s3 , S4 s4_array[3] , Op op ,
-            boost::mpl::size_t< 3 > c )
-    {
-		detail::for_each6( boost::begin( s1 ) , boost::end( s1 ) , boost::begin( s2 ) , 
-							boost::begin( s3 ) , boost::begin( s4_array[0] ) , 
-                            boost::begin( s4_array[1] ) , boost::begin( s4_array[2] ) , op );
-	}
-
-    /*template< size_t n , class StateOut , class StateIn , class DerivIn , typename T >
-    inline static void foreach( StateOut &x_tmp ,
-                const boost::array< T , n > &a ,
-				const DerivIn &dxdt , const StateIn k_vector[n] , const T dt )
-    {
-        for( size_t i=0 ; i<x.size() ; ++i )
-        {
-            x_tmp[i] = a[0]*dt*dxdt[i];
-            for( size_t j = 1 ; j<n ; ++j )
-                x_tmp[i] += a[j]*dt*k_vector[j-1][i];
-         }
-    }*/
 };
 
 } // odeint
Added: sandbox/odeint/branches/karsten/boost/numeric/odeint/stepper/detail/generic_rk_call_algebra.hpp
==============================================================================
--- (empty file)
+++ sandbox/odeint/branches/karsten/boost/numeric/odeint/stepper/detail/generic_rk_call_algebra.hpp	2011-05-30 11:37:06 EDT (Mon, 30 May 2011)
@@ -0,0 +1,77 @@
+/*
+ * generic_rk_call_algebra.hpp
+ *
+ *  Created on: May 30, 2011
+ *      Author: mario
+ */
+
+#ifndef GENERIC_RK_CALL_ALGEBRA_HPP_
+#define GENERIC_RK_CALL_ALGEBRA_HPP_
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+namespace detail {
+
+template< size_t StageNumber , class Algebra >
+struct generic_rk_call_algebra;
+
+template< class Algebra >
+struct generic_rk_call_algebra< 1 , Algebra >
+{
+    template< class S1 , class S2 , class S3 , class S4 , class Op>
+    void operator()( S1 &s1 , S2 &s2 ,  S3 &s3 , S4 s4_array[0] , Op op ) const
+    {
+        Algebra::for_each3( s1 , s2 , s3 , op );
+    }
+};
+
+template< class Algebra >
+struct generic_rk_call_algebra< 2 , Algebra >
+{
+    template< class S1 , class S2 , class S3 , class S4 , class Op>
+    void operator()( S1 &s1 , S2 &s2 ,  S3 &s3 , S4 s4_array[1] , Op op ) const
+    {
+        Algebra::for_each4( s1 , s2 , s3 , s4_array[0] , op );
+    }
+};
+
+
+template< class Algebra >
+struct generic_rk_call_algebra< 3 , Algebra >
+{
+    template< class S1 , class S2 , class S3 , class S4 , class Op>
+    void operator()( S1 &s1 , S2 &s2 ,  S3 &s3 , S4 s4_array[2] , Op op ) const
+    {
+        Algebra::for_each5( s1 , s2 , s3 , s4_array[0] , s4_array[1] , op );
+    }
+};
+
+
+template< class Algebra >
+struct generic_rk_call_algebra< 4 , Algebra >
+{
+    template< class S1 , class S2 , class S3 , class S4 , class Op>
+    void operator()( S1 &s1 , S2 &s2 ,  S3 &s3 , S4 s4_array[3] , Op op ) const
+    {
+        Algebra::for_each6( s1 , s2 , s3 , s4_array[0] , s4_array[1] , s4_array[2] , op );
+    }
+};
+
+
+template< class Algebra >
+struct generic_rk_call_algebra< 5 , Algebra >
+{
+    template< class S1 , class S2 , class S3 , class S4 , class Op>
+    void operator()( S1 &s1 , S2 &s2 ,  S3 &s3 , S4 s4_array[4] , Op op ) const
+    {
+        Algebra::for_each7( s1 , s2 , s3 , s4_array[0] , s4_array[1] , s4_array[2] , s4_array[3] , op );
+    }
+};
+
+}
+}
+}
+}
+
+#endif /* GENERIC_RK_CALL_ALGEBRA_HPP_ */
Added: sandbox/odeint/branches/karsten/boost/numeric/odeint/stepper/detail/generic_rk_operations.hpp
==============================================================================
--- (empty file)
+++ sandbox/odeint/branches/karsten/boost/numeric/odeint/stepper/detail/generic_rk_operations.hpp	2011-05-30 11:37:06 EDT (Mon, 30 May 2011)
@@ -0,0 +1,76 @@
+/*
+ * generic_rk_operations.hpp
+ *
+ *  Created on: May 30, 2011
+ *      Author: mario
+ */
+
+#ifndef GENERIC_RK_OPERATIONS_HPP_
+#define GENERIC_RK_OPERATIONS_HPP_
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+namespace detail {
+
+template< size_t StageNumber , class Operations , class Fac >
+struct generic_rk_scale_sum;
+
+template< class Operations , class Fac >
+struct generic_rk_scale_sum< 1 , Operations , Fac > : public Operations::template scale_sum2< Fac >
+{
+    generic_rk_scale_sum( const boost::array<Fac,1> &a , const Fac &dt ) : Operations::template scale_sum2< Fac >( 1.0 , a[0]*dt )
+        { }
+
+    typedef void result_type;
+};
+
+
+template< class Operations , class Fac >
+struct generic_rk_scale_sum< 2 , Operations , Fac > : public Operations::template scale_sum3< Fac >
+{
+    generic_rk_scale_sum( const boost::array<Fac,2> &a , const Fac &dt )
+            : Operations::template scale_sum3< Fac >( 1.0 , a[0]*dt , a[1]*dt )
+        { }
+
+    typedef void result_type;
+};
+
+template< class Operations , class Fac >
+struct generic_rk_scale_sum< 3 , Operations , Fac > : public Operations::template scale_sum4< Fac >
+{
+    generic_rk_scale_sum( const boost::array<Fac,3> &a , const Fac &dt )
+            : Operations::template scale_sum4< Fac >( 1.0 , a[0]*dt , a[1]*dt , a[2]*dt )
+        { }
+
+    typedef void result_type;
+};
+
+template< class Operations , class Fac >
+struct generic_rk_scale_sum< 4 , Operations , Fac > : public Operations::template scale_sum5< Fac >
+{
+    generic_rk_scale_sum( const boost::array<Fac,4> &a , const Fac &dt )
+            : Operations::template scale_sum5< Fac >( 1.0 , a[0]*dt , a[1]*dt , a[2]*dt , a[3]*dt )
+        { }
+
+    typedef void result_type;
+};
+
+template< class Operations , class Fac >
+struct generic_rk_scale_sum< 5 , Operations , Fac > : public Operations::template scale_sum6< Fac >
+{
+    generic_rk_scale_sum( const boost::array<Fac,5> &a , const Fac &dt )
+            : Operations::template scale_sum6< Fac >( 1.0 , a[0]*dt , a[0]*dt , a[1]*dt , a[2]*dt , a[3]*dt , a[4]*dt )
+        { }
+
+    typedef void result_type;
+};
+
+
+}
+}
+}
+}
+
+
+#endif /* GENERIC_RK_OPERATIONS_HPP_ */
Modified: sandbox/odeint/branches/karsten/boost/numeric/odeint/stepper/explicit_generic_rk.hpp
==============================================================================
--- sandbox/odeint/branches/karsten/boost/numeric/odeint/stepper/explicit_generic_rk.hpp	(original)
+++ sandbox/odeint/branches/karsten/boost/numeric/odeint/stepper/explicit_generic_rk.hpp	2011-05-30 11:37:06 EDT (Mon, 30 May 2011)
@@ -29,6 +29,8 @@
 #include <boost/numeric/odeint/stepper/detail/macros.hpp>
 #include <boost/numeric/odeint/algebra/range_algebra.hpp>
 #include <boost/numeric/odeint/algebra/default_operations.hpp>
+#include <boost/numeric/odeint/stepper/detail/generic_rk_call_algebra.hpp>
+#include <boost/numeric/odeint/stepper/detail/generic_rk_operations.hpp>
 //#include "fusion_foreach_performance.hpp"
 
 #include <iostream>
@@ -196,11 +198,15 @@
                         //std::cout << stage_number-2 << ", t': " << t + stage.c * dt << std::endl;
 
                         if( stage_number < StageCount )
-				    algebra_type::template for_eachn<stage_number>( x_tmp , x , dxdt , F ,
-				            typename operations_type::template scale_sumn< stage_number , time_type >( stage.a , dt ) );
+			    detail::template generic_rk_call_algebra< stage_number , algebra_type >()( x_tmp , x , dxdt , F ,
+                            detail::generic_rk_scale_sum< stage_number , operations_type , time_type >( stage.a , dt) );
+//				    algebra_type::template for_eachn<stage_number>( x_tmp , x , dxdt , F ,
+//				            typename operations_type::template scale_sumn< stage_number , time_type >( stage.a , dt ) );
                         else
-				    algebra_type::template for_eachn<stage_number>( x_out , x , dxdt , F ,
-				            typename operations_type::template scale_sumn< stage_number , time_type >( stage.a , dt ) );
+			    detail::template generic_rk_call_algebra< stage_number , algebra_type >()( x_out , x , dxdt , F ,
+                            detail::generic_rk_scale_sum< stage_number , operations_type , time_type >( stage.a , dt) );
+//                algebra_type::template for_eachn<stage_number>( x_out , x , dxdt , F ,
+//                            typename operations_type::template scale_sumn< stage_number , time_type >( stage.a , dt ) );
         }
 
     };
Modified: sandbox/odeint/branches/karsten/libs/numeric/odeint/ideas/fusion_runge_kutta/fusion_algebra.hpp
==============================================================================
--- sandbox/odeint/branches/karsten/libs/numeric/odeint/ideas/fusion_runge_kutta/fusion_algebra.hpp	(original)
+++ sandbox/odeint/branches/karsten/libs/numeric/odeint/ideas/fusion_runge_kutta/fusion_algebra.hpp	2011-05-30 11:37:06 EDT (Mon, 30 May 2011)
@@ -53,7 +53,7 @@
  * Update: It increases performance on msvc 9.0 by about 30%, so it is activated for MSVC
  */
 
-#ifdef BOOST_MSVC
+//#ifdef BOOST_MSVC
 
 template<>
 struct fusion_algebra< 1 >
@@ -192,6 +192,6 @@
 
 };
 
-#endif /* BOOST_MSVC */
+//#endif /* BOOST_MSVC */
 
 #endif /* FUSION_ALGEBRA_HPP_ */
Modified: sandbox/odeint/branches/karsten/libs/numeric/odeint/ideas/fusion_runge_kutta/performance/Jamfile
==============================================================================
--- sandbox/odeint/branches/karsten/libs/numeric/odeint/ideas/fusion_runge_kutta/performance/Jamfile	(original)
+++ sandbox/odeint/branches/karsten/libs/numeric/odeint/ideas/fusion_runge_kutta/performance/Jamfile	2011-05-30 11:37:06 EDT (Mon, 30 May 2011)
@@ -26,6 +26,11 @@
     : generic_rk4_lorenz.cpp
     : <toolset>intel:<cxxflags>-inline-forceinline
     ;
+    
+exe generic_odeint_rk4_lorenz 
+    : generic_odeint_rk4_lorenz.cpp
+    : <toolset>intel:<cxxflags>-inline-forceinline
+    ;
    
 #exe odeint_rk4
 #    : odeint_rk4.cpp
Added: sandbox/odeint/branches/karsten/libs/numeric/odeint/ideas/fusion_runge_kutta/performance/generic_odeint_rk4_lorenz.cpp
==============================================================================
--- (empty file)
+++ sandbox/odeint/branches/karsten/libs/numeric/odeint/ideas/fusion_runge_kutta/performance/generic_odeint_rk4_lorenz.cpp	2011-05-30 11:37:06 EDT (Mon, 30 May 2011)
@@ -0,0 +1,66 @@
+#include <boost/array.hpp>
+
+#include <boost/numeric/odeint/stepper/explicit_generic_rk.hpp>
+#include <boost/numeric/odeint/algebra/array_algebra.hpp>
+
+#include "rk_performance_test_case.hpp"
+
+#include "lorenz.hpp"
+
+using namespace boost::numeric::odeint;
+
+typedef boost::array< double , 3 > state_type;
+typedef explicit_generic_rk< 4 , 4 , state_type , double , state_type , double , array_algebra > rk4_type;
+
+typedef rk4_type::coef_a_type coef_a_type;
+typedef rk4_type::coef_b_type coef_b_type;
+typedef rk4_type::coef_c_type coef_c_type;
+
+const boost::array< double , 1 > a1 = {{ 0.5 }};
+const boost::array< double , 2 > a2 = {{ 0.0 , 0.5 }};
+const boost::array< double , 3 > a3 = {{ 0.0 , 0.0 , 1.0 }};
+
+const coef_a_type a = fusion::make_vector( a1 , a2 , a3 );
+const coef_b_type b = {{ 1.0/6 , 1.0/3 , 1.0/3 , 1.0/6 }};
+const coef_c_type c = {{ 0.0 , 0.5 , 0.5 , 1.0 }};
+
+class rk4_wrapper
+{
+
+public:
+
+    rk4_wrapper() : m_stepper( a , b , c )
+    { }
+
+    void reset_init_cond()
+    {
+        m_x[0] = 10.0 * rand() / RAND_MAX;
+        m_x[1] = 10.0 * rand() / RAND_MAX;
+        m_x[2] = 10.0 * rand() / RAND_MAX;
+        m_t = 0.0;
+    }
+
+    inline void do_step( const double dt )
+    {
+        m_stepper.do_step( lorenz(), m_x , m_t , dt );
+    }
+
+    double state( const size_t i ) const
+    { return m_x[i]; }
+
+private:
+    state_type m_x;
+    double m_t;
+    rk4_type m_stepper;
+};
+
+
+
+int main()
+{
+    srand( 12312354 );
+
+    rk4_wrapper stepper;
+
+    run( stepper );
+}