Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r57310 - in sandbox/odeint: boost/numeric/odeint libs/numeric/odeint/examples
From: karsten.ahnert_at_[hidden]
Date: 2009-11-03 10:11:16


Author: karsten
Date: 2009-11-03 10:11:15 EST (Tue, 03 Nov 2009)
New Revision: 57310
URL: http://svn.boost.org/trac/boost/changeset/57310

Log:
small changes
Text files modified:
   sandbox/odeint/boost/numeric/odeint/euler.hpp | 100 +++++++++++++++++++++++++--------------
   sandbox/odeint/boost/numeric/odeint/integrator_constant_step.hpp | 19 +++++--
   sandbox/odeint/boost/numeric/odeint/resizer.hpp | 33 +++++++++----
   sandbox/odeint/libs/numeric/odeint/examples/lorenz_integrate_constant_step.cpp | 24 ++++++++
   4 files changed, 122 insertions(+), 54 deletions(-)

Modified: sandbox/odeint/boost/numeric/odeint/euler.hpp
==============================================================================
--- sandbox/odeint/boost/numeric/odeint/euler.hpp (original)
+++ sandbox/odeint/boost/numeric/odeint/euler.hpp 2009-11-03 10:11:15 EST (Tue, 03 Nov 2009)
@@ -30,80 +30,106 @@
 namespace odeint {
 
     template<
- class ContainerType ,
- class ResizeType = resizer< ContainerType >
+ class Container ,
+ class Time = double ,
+ class Resizer = resizer< Container >
>
     class ode_step_euler
     {
- // check the concept of the ContainerType
- BOOST_CLASS_REQUIRE( ContainerType , boost::numeric::odeint, StateType );
 
- ContainerType m_dxdt;
- ContainerType m_xtemp;
- ResizeType m_resizer;
 
+ // provide basic typedefs
     public:
 
-
- // provide ContainerType, ResizeType, iterator and value_type to users of this class
- typedef ContainerType container_type;
- typedef ResizeType resize_type;
- typedef typename container_type::iterator iterator;
+ typedef Container container_type;
+ typedef Resizer resizer_type;
+ typedef Time time_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, StateType );
+
+
+
+
+ // private members
+ private:
+
+ container_type m_dxdt;
+ container_type m_xtemp;
+ resizer_type m_resizer;
+
+
+
+
+ // public interface
+ public:
 
         const unsigned int order() { return 1; }
 
- template< class DynamicalSystem , class TimeType >
+
+
+ template< class DynamicalSystem >
         void next_step( DynamicalSystem system ,
- ContainerType &x ,
- const ContainerType &dxdt ,
- TimeType t ,
- TimeType dt )
+ container_type &x ,
+ const container_type &dxdt ,
+ time_type t ,
+ time_type dt )
         {
             detail::it_algebra::scale_and_add( x.begin() , x.end() , dxdt.begin() , dt );
         }
 
- template< class DynamicalSystem , class TimeType >
+
+
+ template< class DynamicalSystem >
         void next_step( DynamicalSystem system ,
- ContainerType &x ,
- TimeType t ,
- TimeType dt )
+ container_type &x ,
+ time_type t ,
+ time_type dt )
         {
             m_resizer.adjust_size( x , m_dxdt );
             system( x , m_dxdt , t );
             next_step( system , x , m_dxdt , t , dt );
         }
 
- template< class DynamicalSystem , class TimeType >
+
+
+ template< class DynamicalSystem >
         void next_step( DynamicalSystem system ,
- ContainerType &x ,
- const ContainerType &dxdt ,
- TimeType t ,
- TimeType dt ,
- ContainerType &xerr )
+ container_type &x ,
+ const container_type &dxdt ,
+ time_type t ,
+ time_type dt ,
+ container_type &xerr )
         {
             m_resizer.adjust_size( x , xerr );
 
             m_xtemp = x;
- TimeType dt2 = 0.5 * dt;
+ time_type dt2 = 0.5 * dt;
 
             next_step( system , x , dxdt , t , dt );
             next_step( system , m_xtemp , dxdt , t , dt2 );
             next_step( system , m_xtemp , t+dt2 , dt2 );
 
- detail::it_algebra::substract_and_assign( x.begin() , x.end() , m_xtemp.begin() , xerr.begin() );
+ detail::it_algebra::substract_and_assign(
+ x.begin() , x.end() , m_xtemp.begin() , xerr.begin()
+ );
         }
 
 
 
-
-
- template< class DynamicalSystem , class TimeType >
+ template< class DynamicalSystem >
         void next_step( DynamicalSystem system ,
- ContainerType &x ,
- TimeType t ,
- TimeType dt ,
- ContainerType &xerr )
+ container_type &x ,
+ time_type t ,
+ time_type dt ,
+ container_type &xerr )
         {
             m_resizer.check_size_and_resize( x , m_dxdt );
             system( x , m_dxdt , t );
@@ -111,6 +137,8 @@
         }
     };
 
+
+
 } // namespace odeint
 } // namespace numeric
 } // namespace boost

Modified: sandbox/odeint/boost/numeric/odeint/integrator_constant_step.hpp
==============================================================================
--- sandbox/odeint/boost/numeric/odeint/integrator_constant_step.hpp (original)
+++ sandbox/odeint/boost/numeric/odeint/integrator_constant_step.hpp 2009-11-03 10:11:15 EST (Tue, 03 Nov 2009)
@@ -19,32 +19,39 @@
 namespace numeric {
 namespace odeint {
 
+
+
     template<
         class Stepper ,
         class DynamicalSystem ,
- class TimeType ,
- class ContainerType
+ class Observer
>
     void integrate(
         Stepper stepper ,
         DynamicalSystem system ,
- TimeType start_time ,
- TimeType dt ,
- ContainerType &state ,
- TimeType end_time
+ typename Stepper::time_type start_time ,
+ typename Stepper::time_type dt ,
+ typename Stepper::container_type &state ,
+ typename Stepper::time_type end_time ,
+ Observer observer
         )
     {
         if( start_time > end_time )
             throw std::invalid_argument( "integrate() : start_time > end_time" );
 
+ observer( start_time , state , system );
         while( start_time < end_time )
         {
             stepper.next_step( system , state , start_time , dt );
             start_time += dt;
+ observer( start_time , state , system );
         }
     }
     
 
+
+
+
 } // odeint
 } // numeric
 } // boost

Modified: sandbox/odeint/boost/numeric/odeint/resizer.hpp
==============================================================================
--- sandbox/odeint/boost/numeric/odeint/resizer.hpp (original)
+++ sandbox/odeint/boost/numeric/odeint/resizer.hpp 2009-11-03 10:11:15 EST (Tue, 03 Nov 2009)
@@ -19,47 +19,60 @@
 namespace numeric {
 namespace odeint {
 
- template< class ContainerType >
+ template< class Container >
     class resizer
     {
+ public:
+
+ typedef Container container_type;
+
+
+ private:
         // we need a resizable container here (obviously...)
- BOOST_CLASS_REQUIRE( ContainerType , boost::numeric::odeint, Resizable );
+ BOOST_CLASS_REQUIRE( container_type , boost::numeric::odeint, Resizable );
 
+
     public:
- void resize( const ContainerType &x , ContainerType &dxdt ) const
+ void resize( const container_type &x , container_type &dxdt ) const
         {
             dxdt.resize( x.size() );
         }
         
- bool same_size( const ContainerType &x1 , const ContainerType &x2 ) const
+ bool same_size( const container_type &x1 , const container_type &x2 ) const
         {
             return (x1.size() == x2.size());
         }
 
- void adjust_size( const ContainerType &x1 , ContainerType &x2 ) const
+ void adjust_size( const container_type &x1 , container_type &x2 ) const
         {
             if( !same_size( x1 , x2 ) ) resize( x1 , x2 );
         }
     };
 
+
+
     /* Template Specialization for fixed size array - no resizing can happen */
     template< class T , size_t N >
     class resizer< std::tr1::array< T , N > >
     {
     public:
- void resize( const std::tr1::array<T,N> &x ,
- std::tr1::array<T,N> &dxdt ) const
+
+ typedef std::tr1::array< T , N > container_type;
+
+
+ public:
+
+ void resize( const container_type &x , container_type &dxdt ) const
         {
             throw; // should never be called
         }
 
- const bool same_size( const std::tr1::array<T,N> &x1 ,
- std::tr1::array<T,N> &x2 ) const
+ const bool same_size( const container_type &x1 , const container_type &x2 ) const
         {
             return true; // if this was false, the code wouldn't compile
         }
 
- void adjust_size( const std::tr1::array<T,N> &x1 , std::tr1::array<T,N> &x2 ) const
+ void adjust_size( const container_type &x1 , container_type &x2 ) const
         {
             if( !same_size( x1 , x2 ) ) throw;
         }

Modified: sandbox/odeint/libs/numeric/odeint/examples/lorenz_integrate_constant_step.cpp
==============================================================================
--- sandbox/odeint/libs/numeric/odeint/examples/lorenz_integrate_constant_step.cpp (original)
+++ sandbox/odeint/libs/numeric/odeint/examples/lorenz_integrate_constant_step.cpp 2009-11-03 10:11:15 EST (Tue, 03 Nov 2009)
@@ -21,11 +21,23 @@
 #include <list>
 #include <tr1/array>
 
+#include <boost/lambda/lambda.hpp>
+#include <boost/lambda/bind.hpp>
+#include <boost/lambda/if.hpp>
+#include <boost/lambda/loops.hpp>
+#include <boost/lambda/switch.hpp>
+#include <boost/lambda/construct.hpp>
+#include <boost/lambda/casts.hpp>
+#include <boost/lambda/exceptions.hpp>
+#include <boost/lambda/numeric.hpp>
+#include <boost/lambda/algorithm.hpp>
+
 #include <boost/numeric/odeint.hpp>
 
 #define tab "\t"
 
 using namespace std;
+using namespace boost::lambda;
 using namespace boost::numeric::odeint;
 
 const double sigma = 10.0;
@@ -52,8 +64,16 @@
     x[1] = 0.0;
     x[2] = 0.0;
 
- ode_step_euler< state_type > euler;
- integrate( euler , lorenz , 0.0 , 0.01 , x , 10.0 );
+ ode_step_euler< state_type , double > euler;
+// integrate( euler , lorenz , 0.0 , 0.01 , x , 10.0 , my_observer );
+ integrate( euler , lorenz , 0.0 , 0.01 , x , 1.0 , cout << _1 << tab << _2[0] << "\n" );
+
+ vector<double> traj;
+ back_insert_iterator< vector<double> > iter(traj);
+ integrate( euler , lorenz , 0.0 , 0.01 , x , 1.0 , var(*iter++) = _2[1] );
+ copy( traj.begin() , traj.end() , ostream_iterator<double>( cout , "\n" ) );
+
+
 
 
     return 0;


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk