marRrR
marRrR

Reputation: 35

Stop integration in odeint with stiff ode

I want to solve a stiff ode with odeint. I was following this (rosenbrock4_dense_output stepper) but, my function can grow pretty quickly so I want to stop the integration if x(t)>xMAX.

In this question, they have a solution for it but since I'm new with c++ I don't know how to implement this when using a rosenbrock4_dense_output stepper.

I would like to see how to write this specifically for rosenbrock4_dense_output stepper.

Upvotes: 2

Views: 1205

Answers (1)

headmyshoulder
headmyshoulder

Reputation: 6320

Currently, this is not easily possible with odeint. If you can use the range library here you can combine a for_each and a find_if algorithm.

Otherwise you need to write the loop yourself, which is also not that difficult and should be similar to this:

auto stepper = make_dense_output< rosenbrock4< double > >( 1.0e-12 , 1.0e-12 );
auto ode = make_pair( stiff_system() , stiff_system_jacobi() );

double t = 0.0;
double const end_time = 50.0;
double const dt = 0.01;
vector_type x( 2 , 1.0 );
const double y_min = 1.0;

stepper.initialize( x , t , dt );
cout << t << " " << x[0] << " " << x[1] << endl; // or some other output
t += dt;
while( t < end_time )
{
    if( t > stepper.current_time() )
    {
        // perform a real step
        stepper.do_step( ode );
    }
    else  
    {
        // perform a dense output step
        stepper.calc_state( t , x );
        cout << t << " " << x[0] << " " << x[1] << endl; // or some other output
        t += dt;
    }
    if( x[1] < y_min ) // or some other condition
    {
        cout << "Bound reached." << endl;
        break;
    }
}

Upvotes: 2

Related Questions