Boost  v1.57.0
doxygen for www.boost.org
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
boost::numeric::odeint::explicit_stepper_base< Stepper, Order, State, Value, Deriv, Time, Algebra, Operations, Resizer > Class Template Reference

Base class for explicit steppers without step size control and without dense output. More...

#include <explicit_stepper_base.hpp>

Inheritance diagram for boost::numeric::odeint::explicit_stepper_base< Stepper, Order, State, Value, Deriv, Time, Algebra, Operations, Resizer >:
Collaboration diagram for boost::numeric::odeint::explicit_stepper_base< Stepper, Order, State, Value, Deriv, Time, Algebra, Operations, Resizer >:

Public Types

typedef explicit_stepper_base
< Stepper, Order, State, Value,
Deriv, Time, Algebra,
Operations, Resizer > 
internal_stepper_base_type
 
typedef State state_type
 
typedef Value value_type
 
typedef Deriv deriv_type
 
typedef Time time_type
 
typedef Resizer resizer_type
 
typedef Stepper stepper_type
 
typedef stepper_tag stepper_category
 
typedef algebra_stepper_base
< Algebra, Operations > 
algebra_stepper_base_type
 
typedef
algebra_stepper_base_type::algebra_type 
algebra_type
 
typedef
algebra_stepper_base_type::operations_type 
operations_type
 
typedef unsigned short order_type
 
typedef state_wrapper< state_typewrapped_state_type
 
typedef state_wrapper< deriv_typewrapped_deriv_type
 

Public Member Functions

 explicit_stepper_base (const algebra_type &algebra=algebra_type())
 Constructs a explicit_stepper_base class. More...
 
order_type order (void) const
 
template<class System , class StateInOut >
void do_step (System system, StateInOut &x, time_type t, time_type dt)
 This method performs one step. More...
 
template<class System , class StateInOut >
void do_step (System system, const StateInOut &x, time_type t, time_type dt)
 Second version to solve the forwarding problem, can be called with Boost.Range as StateInOut. More...
 
template<class System , class StateInOut , class DerivIn >
boost::disable_if
< boost::is_same< DerivIn,
time_type >, void >::type 
do_step (System system, StateInOut &x, const DerivIn &dxdt, time_type t, time_type dt)
 The method performs one step. More...
 
template<class System , class StateIn , class StateOut >
void do_step (System system, const StateIn &in, time_type t, StateOut &out, time_type dt)
 The method performs one step. More...
 
template<class System , class StateIn , class DerivIn , class StateOut >
void do_step (System system, const StateIn &in, const DerivIn &dxdt, time_type t, StateOut &out, time_type dt)
 The method performs one step. More...
 
template<class StateIn >
void adjust_size (const StateIn &x)
 Adjust the size of all temporaries in the stepper manually. More...
 
algebra_typealgebra ()
 
const algebra_typealgebra () const
 

Static Public Attributes

static const order_type order_value = Order
 

Protected Attributes

wrapped_deriv_type m_dxdt
 
algebra_type m_algebra
 

Detailed Description

template<class Stepper, unsigned short Order, class State, class Value, class Deriv, class Time, class Algebra, class Operations, class Resizer>
class boost::numeric::odeint::explicit_stepper_base< Stepper, Order, State, Value, Deriv, Time, Algebra, Operations, Resizer >

Base class for explicit steppers without step size control and without dense output.

This class serves as the base class for all explicit steppers with algebra and operations. Step size control and error estimation as well as dense output are not provided. explicit_stepper_base is used as the interface in a CRTP (currently recurring template pattern). In order to work correctly the parent class needs to have a method do_step_impl( system , in , dxdt_in , t , out , dt ). This is method is used by explicit_stepper_base. explicit_stepper_base derives from algebra_stepper_base. An example how this class can be used is

template< class State , class Value , class Deriv , class Time , class Algebra , class Operations , class Resizer >
class custom_euler : public explicit_stepper_base< 1 , State , Value , Deriv , Time , Algebra , Operations , Resizer >
{
public:
typedef explicit_stepper_base< 1 , State , Value , Deriv , Time , Algebra , Operations , Resizer > base_type;
custom_euler( const Algebra &algebra = Algebra() ) { }
template< class Sys , class StateIn , class DerivIn , class StateOut >
void do_step_impl( Sys sys , const StateIn &in , const DerivIn &dxdt , Time t , StateOut &out , Time dt )
{
m_algebra.for_each3( out , in , dxdt , Operations::scale_sum2< Value , Time >( 1.0 , dt );
}
template< class State >
void adjust_size( const State &x )
{
base_type::adjust_size( x );
}
};

For the Stepper concept only the do_step( sys , x , t , dt ) needs to be implemented. But this class provides additional do_step variants since the stepper is explicit. These methods can be used to increase the performance in some situation, for example if one needs to analyze dxdt during each step. In this case one can use

sys( x , dxdt , t );
stepper.do_step( sys , x , dxdt , t , dt ); // the value of dxdt is used here
t += dt;

In detail explicit_stepper_base provides the following do_step variants

  • do_step( sys , x , t , dt ) - The classical do_step method needed to fulfill the Stepper concept. The state is updated in-place. A type modelling a Boost.Range can be used for x.
  • do_step( sys , in , t , out , dt ) - This method updates the state out-of-place, hence the result of the step is stored in out.
  • do_step( sys , x , dxdt , t , dt ) - This method updates the state in-place, but the derivative at the point t must be explicitly passed in dxdt. For an example see the code snippet above.
  • do_step( sys , in , dxdt , t , out , dt ) - This method update the state out-of-place and expects that the derivative at the point t is explicitly passed in dxdt. It is a combination of the two do_step methods above.
Note
The system is always passed as value, which might result in poor performance if it contains data. In this case it can be used with boost::ref or std::ref, for example stepper.do_step( boost::ref( sys ) , x , t , dt );
The time t is not advanced by the stepper. This has to done manually, or by the appropriate integrate routines or iterators.
Template Parameters
StepperThe stepper on which this class should work. It is used via CRTP, hence explicit_stepper_base provides the interface for the Stepper.
OrderThe order of the stepper.
StateThe state type for the stepper.
ValueThe value type for the stepper. This should be a floating point type, like float, double, or a multiprecision type. It must not necessary be the value_type of the State. For example the State can be a vector< complex< double > > in this case the Value must be double. The default value is double.
DerivThe type representing time derivatives of the state type. It is usually the same type as the state type, only if used with Boost.Units both types differ.
TimeThe type representing the time. Usually the same type as the value type. When Boost.Units is used, this type has usually a unit.
AlgebraThe algebra type which must fulfill the Algebra Concept.
OperationsThe type for the operations which must fulfill the Operations Concept.
ResizerThe resizer policy class.

Member Typedef Documentation

template<class Stepper, unsigned short Order, class State, class Value, class Deriv, class Time, class Algebra, class Operations, class Resizer>
typedef algebra_stepper_base< Algebra , Operations > boost::numeric::odeint::explicit_stepper_base< Stepper, Order, State, Value, Deriv, Time, Algebra, Operations, Resizer >::algebra_stepper_base_type
template<class Stepper, unsigned short Order, class State, class Value, class Deriv, class Time, class Algebra, class Operations, class Resizer>
typedef algebra_stepper_base_type::algebra_type boost::numeric::odeint::explicit_stepper_base< Stepper, Order, State, Value, Deriv, Time, Algebra, Operations, Resizer >::algebra_type
template<class Stepper, unsigned short Order, class State, class Value, class Deriv, class Time, class Algebra, class Operations, class Resizer>
typedef Deriv boost::numeric::odeint::explicit_stepper_base< Stepper, Order, State, Value, Deriv, Time, Algebra, Operations, Resizer >::deriv_type
template<class Stepper, unsigned short Order, class State, class Value, class Deriv, class Time, class Algebra, class Operations, class Resizer>
typedef explicit_stepper_base< Stepper , Order , State , Value , Deriv , Time , Algebra , Operations , Resizer > boost::numeric::odeint::explicit_stepper_base< Stepper, Order, State, Value, Deriv, Time, Algebra, Operations, Resizer >::internal_stepper_base_type
template<class Stepper, unsigned short Order, class State, class Value, class Deriv, class Time, class Algebra, class Operations, class Resizer>
typedef algebra_stepper_base_type::operations_type boost::numeric::odeint::explicit_stepper_base< Stepper, Order, State, Value, Deriv, Time, Algebra, Operations, Resizer >::operations_type
template<class Stepper, unsigned short Order, class State, class Value, class Deriv, class Time, class Algebra, class Operations, class Resizer>
typedef unsigned short boost::numeric::odeint::explicit_stepper_base< Stepper, Order, State, Value, Deriv, Time, Algebra, Operations, Resizer >::order_type
template<class Stepper, unsigned short Order, class State, class Value, class Deriv, class Time, class Algebra, class Operations, class Resizer>
typedef Resizer boost::numeric::odeint::explicit_stepper_base< Stepper, Order, State, Value, Deriv, Time, Algebra, Operations, Resizer >::resizer_type
template<class Stepper, unsigned short Order, class State, class Value, class Deriv, class Time, class Algebra, class Operations, class Resizer>
typedef State boost::numeric::odeint::explicit_stepper_base< Stepper, Order, State, Value, Deriv, Time, Algebra, Operations, Resizer >::state_type
template<class Stepper, unsigned short Order, class State, class Value, class Deriv, class Time, class Algebra, class Operations, class Resizer>
typedef stepper_tag boost::numeric::odeint::explicit_stepper_base< Stepper, Order, State, Value, Deriv, Time, Algebra, Operations, Resizer >::stepper_category
template<class Stepper, unsigned short Order, class State, class Value, class Deriv, class Time, class Algebra, class Operations, class Resizer>
typedef Stepper boost::numeric::odeint::explicit_stepper_base< Stepper, Order, State, Value, Deriv, Time, Algebra, Operations, Resizer >::stepper_type
template<class Stepper, unsigned short Order, class State, class Value, class Deriv, class Time, class Algebra, class Operations, class Resizer>
typedef Time boost::numeric::odeint::explicit_stepper_base< Stepper, Order, State, Value, Deriv, Time, Algebra, Operations, Resizer >::time_type
template<class Stepper, unsigned short Order, class State, class Value, class Deriv, class Time, class Algebra, class Operations, class Resizer>
typedef Value boost::numeric::odeint::explicit_stepper_base< Stepper, Order, State, Value, Deriv, Time, Algebra, Operations, Resizer >::value_type
template<class Stepper, unsigned short Order, class State, class Value, class Deriv, class Time, class Algebra, class Operations, class Resizer>
typedef state_wrapper< deriv_type > boost::numeric::odeint::explicit_stepper_base< Stepper, Order, State, Value, Deriv, Time, Algebra, Operations, Resizer >::wrapped_deriv_type
template<class Stepper, unsigned short Order, class State, class Value, class Deriv, class Time, class Algebra, class Operations, class Resizer>
typedef state_wrapper< state_type > boost::numeric::odeint::explicit_stepper_base< Stepper, Order, State, Value, Deriv, Time, Algebra, Operations, Resizer >::wrapped_state_type

Constructor & Destructor Documentation

template<class Stepper, unsigned short Order, class State, class Value, class Deriv, class Time, class Algebra, class Operations, class Resizer>
boost::numeric::odeint::explicit_stepper_base< Stepper, Order, State, Value, Deriv, Time, Algebra, Operations, Resizer >::explicit_stepper_base ( const algebra_type algebra = algebra_type())
inline

Constructs a explicit_stepper_base class.

This constructor can be used as a default constructor if the algebra has a default constructor.

Parameters
algebraA copy of algebra is made and stored inside explicit_stepper_base.

Member Function Documentation

template<class Stepper, unsigned short Order, class State, class Value, class Deriv, class Time, class Algebra, class Operations, class Resizer>
template<class StateIn >
void boost::numeric::odeint::explicit_stepper_base< Stepper, Order, State, Value, Deriv, Time, Algebra, Operations, Resizer >::adjust_size ( const StateIn &  x)
inline

Adjust the size of all temporaries in the stepper manually.

Parameters
xA state from which the size of the temporaries to be resized is deduced.
template<class Algebra, class Operations>
algebra_type & boost::numeric::odeint::algebra_stepper_base< Algebra, Operations >::algebra ( )
inlineinherited
Returns
A reference to the algebra which is held by this class.
template<class Algebra, class Operations>
const algebra_type & boost::numeric::odeint::algebra_stepper_base< Algebra, Operations >::algebra ( ) const
inlineinherited
Returns
A const reference to the algebra which is held by this class.
template<class Stepper, unsigned short Order, class State, class Value, class Deriv, class Time, class Algebra, class Operations, class Resizer>
template<class System , class StateInOut >
boost::numeric::odeint::explicit_stepper_base< Stepper, Order, State, Value, Deriv, Time, Algebra, Operations, Resizer >::do_step ( System  system,
StateInOut &  x,
time_type  t,
time_type  dt 
)
inline

This method performs one step.

It transforms the result in-place.

Parameters
systemThe system function to solve, hence the r.h.s. of the ordinary differential equation. It must fulfill the Simple System concept.
xThe state of the ODE which should be solved. After calling do_step the result is updated in x.
tThe value of the time, at which the step should be performed.
dtThe step size.

Referenced by boost::numeric::odeint::bulirsch_stoer< State, Value, Deriv, Time, Algebra, Operations, Resizer >::try_step().

template<class Stepper, unsigned short Order, class State, class Value, class Deriv, class Time, class Algebra, class Operations, class Resizer>
template<class System , class StateInOut >
void boost::numeric::odeint::explicit_stepper_base< Stepper, Order, State, Value, Deriv, Time, Algebra, Operations, Resizer >::do_step ( System  system,
const StateInOut &  x,
time_type  t,
time_type  dt 
)
inline

Second version to solve the forwarding problem, can be called with Boost.Range as StateInOut.

template<class Stepper, unsigned short Order, class State, class Value, class Deriv, class Time, class Algebra, class Operations, class Resizer>
template<class System , class StateInOut , class DerivIn >
boost::numeric::odeint::explicit_stepper_base< Stepper, Order, State, Value, Deriv, Time, Algebra, Operations, Resizer >::do_step ( System  system,
StateInOut &  x,
const DerivIn &  dxdt,
time_type  t,
time_type  dt 
)
inline

The method performs one step.

Additionally to the other method the derivative of x is also passed to this method. It is supposed to be used in the following way:

sys( x , dxdt , t );
stepper.do_step( sys , x , dxdt , t , dt );

The result is updated in place in x. This method is disabled if Time and Deriv are of the same type. In this case the method could not be distinguished from other do_step versions.

Note
This method does not solve the forwarding problem.
Parameters
systemThe system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept.
xThe state of the ODE which should be solved. After calling do_step the result is updated in x.
dxdtThe derivative of x at t.
tThe value of the time, at which the step should be performed.
dtThe step size.
template<class Stepper, unsigned short Order, class State, class Value, class Deriv, class Time, class Algebra, class Operations, class Resizer>
template<class System , class StateIn , class StateOut >
void boost::numeric::odeint::explicit_stepper_base< Stepper, Order, State, Value, Deriv, Time, Algebra, Operations, Resizer >::do_step ( System  system,
const StateIn &  in,
time_type  t,
StateOut &  out,
time_type  dt 
)
inline

The method performs one step.

The state of the ODE is updated out-of-place.

Note
This method does not solve the forwarding problem.
Parameters
systemThe system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept.
inThe state of the ODE which should be solved. in is not modified in this method
tThe value of the time, at which the step should be performed.
outThe result of the step is written in out.
dtThe step size.
template<class Stepper, unsigned short Order, class State, class Value, class Deriv, class Time, class Algebra, class Operations, class Resizer>
template<class System , class StateIn , class DerivIn , class StateOut >
void boost::numeric::odeint::explicit_stepper_base< Stepper, Order, State, Value, Deriv, Time, Algebra, Operations, Resizer >::do_step ( System  system,
const StateIn &  in,
const DerivIn &  dxdt,
time_type  t,
StateOut &  out,
time_type  dt 
)
inline

The method performs one step.

The state of the ODE is updated out-of-place. Furthermore, the derivative of x at t is passed to the stepper. It is supposed to be used in the following way:

sys( in , dxdt , t );
stepper.do_step( sys , in , dxdt , t , out , dt );
Note
This method does not solve the forwarding problem.
Parameters
systemThe system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept.
inThe state of the ODE which should be solved. in is not modified in this method
dxdtThe derivative of x at t.
tThe value of the time, at which the step should be performed.
outThe result of the step is written in out.
dtThe step size.
template<class Stepper, unsigned short Order, class State, class Value, class Deriv, class Time, class Algebra, class Operations, class Resizer>
order_type boost::numeric::odeint::explicit_stepper_base< Stepper, Order, State, Value, Deriv, Time, Algebra, Operations, Resizer >::order ( void  ) const
inline
Returns
Returns the order of the stepper.

Member Data Documentation

template<class Algebra, class Operations>
algebra_type boost::numeric::odeint::algebra_stepper_base< Algebra, Operations >::m_algebra
protectedinherited
template<class Stepper, unsigned short Order, class State, class Value, class Deriv, class Time, class Algebra, class Operations, class Resizer>
wrapped_deriv_type boost::numeric::odeint::explicit_stepper_base< Stepper, Order, State, Value, Deriv, Time, Algebra, Operations, Resizer >::m_dxdt
protected
template<class Stepper, unsigned short Order, class State, class Value, class Deriv, class Time, class Algebra, class Operations, class Resizer>
const order_type boost::numeric::odeint::explicit_stepper_base< Stepper, Order, State, Value, Deriv, Time, Algebra, Operations, Resizer >::order_value = Order
static

The documentation for this class was generated from the following file: