$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r58362 - in sandbox/odeint: boost/numeric/odeint boost/numeric/odeint/detail libs/numeric/odeint/examples
From: mario.mulansky_at_[hidden]
Date: 2009-12-13 13:30:04
Author: mariomulansky
Date: 2009-12-13 13:30:02 EST (Sun, 13 Dec 2009)
New Revision: 58362
URL: http://svn.boost.org/trac/boost/changeset/58362
Log:
rk_generic now uses container_traits
Text files modified: 
   sandbox/odeint/boost/numeric/odeint/detail/iterator_algebra.hpp           |    34 ++++++++++++++++++++++-                 
   sandbox/odeint/boost/numeric/odeint/stepper_rk4.hpp                       |     7 ++--                                    
   sandbox/odeint/boost/numeric/odeint/stepper_rk_generic.hpp                |    56 +++++++++++++++++++-------------------- 
   sandbox/odeint/libs/numeric/odeint/examples/Jamfile                       |     2                                         
   sandbox/odeint/libs/numeric/odeint/examples/lorenz_cmp_rk4_rk_generic.cpp |     1                                         
   5 files changed, 64 insertions(+), 36 deletions(-)
Modified: sandbox/odeint/boost/numeric/odeint/detail/iterator_algebra.hpp
==============================================================================
--- sandbox/odeint/boost/numeric/odeint/detail/iterator_algebra.hpp	(original)
+++ sandbox/odeint/boost/numeric/odeint/detail/iterator_algebra.hpp	2009-12-13 13:30:02 EST (Sun, 13 Dec 2009)
@@ -118,9 +118,10 @@
                            InputIterator2 x2_begin )
     {
         while( y_begin != y_end )
-            (*y_begin++) = 
-                alpha1 * (*x1_begin++) + 
+        {
+            (*y_begin++) = alpha1 * (*x1_begin++) +
                 alpha2 * (*x2_begin++);
+        }
     }
 
 
@@ -484,6 +485,35 @@
     }
 
 
+    // computes y += alpha1*x1 + alpha2*x2 + alpha3*x3 + alpha4*x4
+    template <
+        class OutputIterator,
+        class InputIterator1,
+        class InputIterator2,
+        class InputIterator3,
+        class InputIterator4,
+        class T
+        >
+    inline void scale_sum_inplace(
+            OutputIterator y_begin,
+            OutputIterator y_end,
+            T alpha1,
+            InputIterator1 x1_begin,
+            T alpha2,
+            InputIterator2 x2_begin,
+            T alpha3,
+            InputIterator3 x3_begin,
+            T alpha4,
+            InputIterator4 x4_begin )
+    {   
+        while( y_begin != y_end )
+            (*y_begin++) += 
+                alpha1 * (*x1_begin++) + 
+                alpha2 * (*x2_begin++) + 
+                alpha3 * (*x3_begin++) +
+                alpha4 * (*x4_begin++);
+    }
+
     /* calculates tmp = y, y = x1 + alpha*x2, x1 = tmp */
     template <
         class OutputIterator,
Modified: sandbox/odeint/boost/numeric/odeint/stepper_rk4.hpp
==============================================================================
--- sandbox/odeint/boost/numeric/odeint/stepper_rk4.hpp	(original)
+++ sandbox/odeint/boost/numeric/odeint/stepper_rk4.hpp	2009-12-13 13:30:02 EST (Sun, 13 Dec 2009)
@@ -95,7 +95,7 @@
                        val1, traits_type::begin(x),
                        dh, traits_type::begin(dxdt) );
 
-	    // dt * m_dxt = k2
+            // dt * m_dxt = k2
             system( m_xt , m_dxt , th );
             //m_xt = x + dh*m_dxt
             scale_sum( traits_type::begin(m_xt) ,
@@ -110,13 +110,12 @@
                        val1, traits_type::begin(x) ,
                        dt, traits_type::begin(m_dxm) );
 
-	    // dt * m_dxh = k4
+            // dt * m_dxh = k4
             system( m_xt , m_dxh , t + dt );  
             //x += dt/6 * ( m_dxdt + m_dxt + val2*m_dxm )
             time_type dt6 = dt / static_cast<time_type>( 6.0 );
             time_type dt3 = dt / static_cast<time_type>( 3.0 );
-            scale_sum( traits_type::begin(x) , traits_type::end(x),
-                       val1, traits_type::begin(x),
+            scale_sum_inplace( traits_type::begin(x) , traits_type::end(x),
                        dt6 , traits_type::begin(dxdt),
                        dt3 , traits_type::begin(m_dxt),
                        dt3 , traits_type::begin(m_dxm),
Modified: sandbox/odeint/boost/numeric/odeint/stepper_rk_generic.hpp
==============================================================================
--- sandbox/odeint/boost/numeric/odeint/stepper_rk_generic.hpp	(original)
+++ sandbox/odeint/boost/numeric/odeint/stepper_rk_generic.hpp	2009-12-13 13:30:02 EST (Sun, 13 Dec 2009)
@@ -97,7 +97,7 @@
         {
             typename container_vector::iterator x_iter = m_xvec.begin();
             while( x_iter != m_xvec.end() ) {
-                (*xiter_iter++) = (*x_iter++).begin();
+                (*xiter_iter++) = traits_type::begin(*x_iter++);
             }
         }
 
@@ -202,12 +202,12 @@
             typename container_iterator_vector::iterator xiter_iter = m_xiter_vec.begin();
 
             (*x_iter) = dxdt;
-            (*xiter_iter++) = (*x_iter++).begin();
+            (*xiter_iter++) = traits_type::begin(*x_iter++);
 
             while( x_iter != m_xvec.end() )
             {
                 traits_type::adjust_size(x, (*x_iter));
-                (*xiter_iter++) = (*x_iter++).begin();
+                (*xiter_iter++) = traits_type::begin(*x_iter++);
             }
             traits_type::adjust_size(x, m_xtmp);
             
@@ -218,18 +218,18 @@
             while( x_iter != m_xvec.end() )
             {
                 reset_iter(m_xiter_vec.begin());
-                scale_sum_generic( m_xtmp.begin(), m_xtmp.end(),
+                scale_sum_generic( traits_type::begin(m_xtmp), traits_type::end(m_xtmp),
                                    (*b_iter).begin(), (*b_iter).end(), dt,
-                                   x.begin(), m_xiter_vec.begin() );
+                                   traits_type::begin(x), m_xiter_vec.begin() );
                 system( m_xtmp, *x_iter++ , t + dt*(*a_iter++) );
                 b_iter++;
             }
 
             reset_iter(m_xiter_vec.begin());
             typename parameter_vector::const_iterator c_iter = m_c.begin();
-            scale_sum_generic( x.begin(), x.end(),
+            scale_sum_generic( traits_type::begin(x), traits_type::end(x),
                                m_c.begin(), m_c.end(), dt,
-                               x.begin(), m_xiter_vec.begin() );
+                               traits_type::begin(x), m_xiter_vec.begin() );
         }
 
         template< class DynamicalSystem >
@@ -262,31 +262,30 @@
     template<
         class Container ,
         class Time = double ,
-        class Resizer = resizer< Container >
+        class Traits = container_traits< Container >
         >
-    class stepper_rk_generic_ptr {
+    class stepper_rk_generic_ptr
+    {
+
 
         // provide basic typedefs
     public:
 
+        typedef const unsigned short order_type;
         typedef Container container_type;
-        typedef Resizer resizer_type;
         typedef Time time_type;
-        typedef const unsigned short order_type;
-        typedef typename container_type::value_type value_type;
-        typedef typename container_type::iterator iterator;
-
-
-        // check the concept of the ContainerType
-    private:
-
-        BOOST_CLASS_REQUIRE( container_type ,
-                             boost::numeric::odeint, Container );
+        typedef Traits traits_type;
+        typedef typename traits_type::value_type value_type;
+        typedef typename traits_type::iterator iterator;
+        typedef typename traits_type::const_iterator const_iterator;
 
         // private variables
     private:
+
         typedef std::vector< container_type > container_vector;
         typedef std::vector< iterator > container_iterator_vector;
+        typedef std::vector< time_type > parameter_vector;
+        typedef std::vector< parameter_vector > parameter_matrix;
 
         container_vector m_xvec;
         container_iterator_vector m_xiter_vec;
@@ -297,14 +296,13 @@
 
         order_type m_q;
 
-        resizer_type m_resizer;
 
     private:
         void reset_iter(typename container_iterator_vector::iterator xiter_iter)
         {
             typename container_vector::iterator x_iter = m_xvec.begin();
             while( x_iter != m_xvec.end() ) {
-                (*xiter_iter++) = (*x_iter++).begin();
+                (*xiter_iter++) = traits_type::begin(*x_iter++);
             }
         }
 
@@ -386,10 +384,10 @@
             typename container_iterator_vector::iterator xiter_iter = m_xiter_vec.begin();
 
             (*x_iter) = dxdt;
-            (*xiter_iter++) = (*x_iter++).begin();
+            (*xiter_iter++) = traits_type::begin(*x_iter++);
 
             while( x_iter != m_xvec.end() )
-	    {
+            {
                 traits_type::adjust_size(x, (*x_iter));
                 (*xiter_iter++) = (*x_iter++).begin();
             }
@@ -401,21 +399,21 @@
             const time_type* b_iter = &m_b[0];
             unsigned short b_len= 1;
             while( x_iter != m_xvec.end() )
-	    {
+            {
                 reset_iter(m_xiter_vec.begin());
                 const time_type* b_end = b_iter + b_len;
-                scale_sum_generic( m_xtmp.begin(), m_xtmp.end(),
+                scale_sum_generic( traits_type::begin(m_xtmp), traits_type::end(m_xtmp),
                                    b_iter, b_end, dt,
-                                   x.begin(), m_xiter_vec.begin() );
+                                   traits_type::begin(x), m_xiter_vec.begin() );
                 system( m_xtmp, *x_iter++ , t + dt*(*a_iter++) );
                 b_iter = b_end;
                 b_len++;
             }
 
             reset_iter(m_xiter_vec.begin());
-            scale_sum_generic( x.begin(), x.end(),
+            scale_sum_generic( traits_type::begin(x), traits_type::end(x),
                                &m_c[0], &m_c[m_q], dt,
-                               x.begin(), m_xiter_vec.begin() );
+                               traits_type::begin(x), m_xiter_vec.begin() );
         }
 
 
Modified: sandbox/odeint/libs/numeric/odeint/examples/Jamfile
==============================================================================
--- sandbox/odeint/libs/numeric/odeint/examples/Jamfile	(original)
+++ sandbox/odeint/libs/numeric/odeint/examples/Jamfile	2009-12-13 13:30:02 EST (Sun, 13 Dec 2009)
@@ -18,7 +18,7 @@
 exe test_container_and_stepper : test_container_and_stepper.cpp ;
 exe hamiltonian_test : hamiltonian_test.cpp ;
 
-# exe lorenz_cmp_rk4_rk_generic : lorenz_cmp_rk4_rk_generic.cpp ;
+exe lorenz_cmp_rk4_rk_generic : lorenz_cmp_rk4_rk_generic.cpp ;
 exe lorenz_controlled : lorenz_controlled.cpp ;
 exe lorenz_integrate_constant_step : lorenz_integrate_constant_step.cpp ;
 exe lorenz_integrator : lorenz_integrator.cpp ;
Modified: sandbox/odeint/libs/numeric/odeint/examples/lorenz_cmp_rk4_rk_generic.cpp
==============================================================================
--- sandbox/odeint/libs/numeric/odeint/examples/lorenz_cmp_rk4_rk_generic.cpp	(original)
+++ sandbox/odeint/libs/numeric/odeint/examples/lorenz_cmp_rk4_rk_generic.cpp	2009-12-13 13:30:02 EST (Sun, 13 Dec 2009)
@@ -21,6 +21,7 @@
 #include <tr1/array>
 
 #include <boost/numeric/odeint.hpp>
+#include <boost/numeric/odeint/stepper_rk_generic.hpp>
 
 #define tab "\t"