size_t integrate_adaptive( Stepper stepper , System system , State &start_state , Time &start_time , Time end_time , Time &dt , Observer observer , controlled_stepper_tag ) { typename omplext_odeint::unwrap_reference< Observer >::type &obs = observer; const size_t max_attempts = 1000; const char *error_string = "Integrate adaptive : Maximal number of iterations reached. A step size could not be found."; size_t count = 0; while( less_with_sign( start_time , end_time , dt ) ) { obs( start_state , start_time ); if( less_with_sign( end_time , start_time + dt , dt ) ) { dt = end_time - start_time; } size_t trials = 0; controlled_step_result res = success; do { res = stepper.try_step( system , start_state , start_time , dt ); ++trials; } while( ( res == fail ) && ( trials < max_attempts ) ); if( trials == max_attempts ) throw std::overflow_error( error_string ); ++count; } obs( start_state , start_time ); return count; }
void check_controlled_stepper_concept( Stepper &stepper , System system , typename Stepper::state_type &x ) { typedef Stepper stepper_type; typedef typename stepper_type::deriv_type container_type; //typedef typename stepper_type::order_type order_type; controlled_error_stepper don't necessarily have a order (burlish-stoer) typedef typename stepper_type::time_type time_type; time_type t = 0.0 , dt = 0.1; controlled_step_result step_result = stepper.try_step( system , x , t , dt ); BOOST_CHECK_MESSAGE( step_result == success , "step result: " << step_result ); // error = 0 for constant system -> step size is always too small }
void check_controlled_stepper( Stepper &stepper ) { typedef Stepper stepper_type; typedef typename stepper_type::state_type state_type; typedef typename stepper_type::value_type value_type; typedef typename stepper_type::deriv_type deriv_type; typedef typename stepper_type::time_type time_type; time_type t( 0.0 * si::second ); time_type dt( 0.1 * si::second ); state_type x( 1.0 * si::meter , 0.0 * si::meter_per_second ); // test call method one stepper.try_step( oscillator , x , t , dt ); }
void operator()( void ) { mpf_set_default_prec( precision ); mpf_t eps_ , unity; mpf_init( eps_ ); mpf_init( unity ); mpf_set_d( unity , 1.0 ); mpf_div_2exp( eps_ , unity , precision-1 ); // 2^(-precision+1) : smallest number that can be represented with used precision value_type eps( eps_ ); Stepper stepper; state_type x; x = 0.0; value_type t(0.0); value_type dt(0.1); stepper.try_step( constant_system , x , t , dt ); BOOST_MESSAGE( eps ); BOOST_CHECK_MESSAGE( abs( x - value_type( 0.1 , precision ) ) < eps , x - 0.1 ); }