Integrator::Integrator() { // Constructor // Set the number of elements to be integrated numelements = 4; // Integration method as supplied by GSL const gsl_odeiv2_step_type *Type = gsl_odeiv2_step_rk8pd; //const gsl_odeiv2_step_type *Type = gsl_odeiv2_step_rkf45; // Initialize GSL step = gsl_odeiv2_step_alloc(Type, numelements); control = gsl_odeiv2_control_yp_new(0, 1.0e-8); // absolute error, relative error evolve = gsl_odeiv2_evolve_alloc(numelements); // Set the initial stepsize to be quite small, in order to get good data on derivatives at the beginning stepsize = minstepsize(); }
gsl_odeiv2_driver * gsl_odeiv2_driver_alloc_yp_new (const gsl_odeiv2_system * sys, const gsl_odeiv2_step_type * T, const double hstart, const double epsabs, const double epsrel) { /* Initializes an ODE driver system with control object of type yp_new. */ gsl_odeiv2_driver *state = driver_alloc (sys, hstart, T); if (state == NULL) { GSL_ERROR_NULL ("failed to allocate driver object", GSL_ENOMEM); } if (epsabs >= 0.0 && epsrel >= 0.0) { state->c = gsl_odeiv2_control_yp_new (epsabs, epsrel); if (state->c == NULL) { gsl_odeiv2_driver_free (state); GSL_ERROR_NULL ("failed to allocate control object", GSL_ENOMEM); } } else { gsl_odeiv2_driver_free (state); GSL_ERROR_NULL ("epsabs and epsrel must be positive", GSL_EINVAL); } /* Distribute pointer to driver object */ gsl_odeiv2_step_set_driver (state->s, state); gsl_odeiv2_evolve_set_driver (state->e, state); gsl_odeiv2_control_set_driver (state->c, state); return state; }