1 /** D bindings for GSL. 2 Authors: Chibisi Chima-Okereke 3 Copyright: Copyright (c) 2016, Chibisi Chima-Okereke. All rights reserved. 4 License: Boost License 1.0 5 */ 6 7 module gsl.odeiv2; 8 import core.stdc.config : c_ulong; 9 10 extern (C): 11 12 alias gsl_odeiv2_step_struct gsl_odeiv2_step; 13 alias gsl_odeiv2_control_struct gsl_odeiv2_control; 14 alias gsl_odeiv2_evolve_struct gsl_odeiv2_evolve; 15 alias gsl_odeiv2_driver_struct gsl_odeiv2_driver; 16 17 extern __gshared const(gsl_odeiv2_step_type)* gsl_odeiv2_step_rk2; 18 extern __gshared const(gsl_odeiv2_step_type)* gsl_odeiv2_step_rk4; 19 extern __gshared const(gsl_odeiv2_step_type)* gsl_odeiv2_step_rkf45; 20 extern __gshared const(gsl_odeiv2_step_type)* gsl_odeiv2_step_rkck; 21 extern __gshared const(gsl_odeiv2_step_type)* gsl_odeiv2_step_rk8pd; 22 extern __gshared const(gsl_odeiv2_step_type)* gsl_odeiv2_step_rk2imp; 23 extern __gshared const(gsl_odeiv2_step_type)* gsl_odeiv2_step_rk4imp; 24 extern __gshared const(gsl_odeiv2_step_type)* gsl_odeiv2_step_bsimp; 25 extern __gshared const(gsl_odeiv2_step_type)* gsl_odeiv2_step_rk1imp; 26 extern __gshared const(gsl_odeiv2_step_type)* gsl_odeiv2_step_msadams; 27 extern __gshared const(gsl_odeiv2_step_type)* gsl_odeiv2_step_msbdf; 28 29 struct gsl_odeiv2_system 30 { 31 int function (double, const(double)*, double*, void*) function_; 32 int function (double, const(double)*, double*, double*, void*) jacobian; 33 size_t dimension; 34 void* params; 35 } 36 37 struct gsl_odeiv2_step_type 38 { 39 const(char)* name; 40 int can_use_dydt_in; 41 int gives_exact_dydt_out; 42 void* function (size_t) alloc; 43 int function (void*, size_t, double, double, double*, double*, const(double)*, double*, const(gsl_odeiv2_system)*) apply; 44 int function (void*, const(gsl_odeiv2_driver)*) set_driver; 45 int function (void*, size_t) reset; 46 uint function (void*) order; 47 void function (void*) free; 48 } 49 50 struct gsl_odeiv2_step_struct 51 { 52 const(gsl_odeiv2_step_type)* type; 53 size_t dimension; 54 void* state; 55 } 56 57 struct gsl_odeiv2_control_type 58 { 59 const(char)* name; 60 void* function () alloc; 61 int function (void*, double, double, double, double) init; 62 int function (void*, size_t, uint, const(double)*, const(double)*, const(double)*, double*) hadjust; 63 int function (void*, const double, const double, const double, const size_t, double*) errlevel; 64 int function (void*, const(gsl_odeiv2_driver)*) set_driver; 65 void function (void*) free; 66 } 67 68 struct gsl_odeiv2_control_struct 69 { 70 const(gsl_odeiv2_control_type)* type; 71 void* state; 72 } 73 74 struct gsl_odeiv2_evolve_struct 75 { 76 size_t dimension; 77 double* y0; 78 double* yerr; 79 double* dydt_in; 80 double* dydt_out; 81 double last_step; 82 c_ulong count; 83 c_ulong failed_steps; 84 const(gsl_odeiv2_driver)* driver; 85 } 86 87 struct gsl_odeiv2_driver_struct 88 { 89 const(gsl_odeiv2_system)* sys; 90 gsl_odeiv2_step* s; 91 gsl_odeiv2_control* c; 92 gsl_odeiv2_evolve* e; 93 double h; 94 double hmin; 95 double hmax; 96 c_ulong n; 97 c_ulong nmax; 98 } 99 100 gsl_odeiv2_step* gsl_odeiv2_step_alloc (const(gsl_odeiv2_step_type)* T, size_t dim); 101 int gsl_odeiv2_step_reset (gsl_odeiv2_step* s); 102 void gsl_odeiv2_step_free (gsl_odeiv2_step* s); 103 const(char)* gsl_odeiv2_step_name (const(gsl_odeiv2_step)* s); 104 uint gsl_odeiv2_step_order (const(gsl_odeiv2_step)* s); 105 int gsl_odeiv2_step_apply (gsl_odeiv2_step* s, double t, double h, double* y, double* yerr, const(double)* dydt_in, double* dydt_out, const(gsl_odeiv2_system)* dydt); 106 int gsl_odeiv2_step_set_driver (gsl_odeiv2_step* s, const(gsl_odeiv2_driver)* d); 107 gsl_odeiv2_control* gsl_odeiv2_control_alloc (const(gsl_odeiv2_control_type)* T); 108 int gsl_odeiv2_control_init (gsl_odeiv2_control* c, double eps_abs, double eps_rel, double a_y, double a_dydt); 109 void gsl_odeiv2_control_free (gsl_odeiv2_control* c); 110 int gsl_odeiv2_control_hadjust (gsl_odeiv2_control* c, gsl_odeiv2_step* s, const(double)* y, const(double)* yerr, const(double)* dydt, double* h); 111 const(char)* gsl_odeiv2_control_name (const(gsl_odeiv2_control)* c); 112 int gsl_odeiv2_control_errlevel (gsl_odeiv2_control* c, const double y, const double dydt, const double h, const size_t ind, double* errlev); 113 int gsl_odeiv2_control_set_driver (gsl_odeiv2_control* c, const(gsl_odeiv2_driver)* d); 114 gsl_odeiv2_control* gsl_odeiv2_control_standard_new (double eps_abs, double eps_rel, double a_y, double a_dydt); 115 gsl_odeiv2_control* gsl_odeiv2_control_y_new (double eps_abs, double eps_rel); 116 gsl_odeiv2_control* gsl_odeiv2_control_yp_new (double eps_abs, double eps_rel); 117 gsl_odeiv2_control* gsl_odeiv2_control_scaled_new (double eps_abs, double eps_rel, double a_y, double a_dydt, const(double)* scale_abs, size_t dim); 118 gsl_odeiv2_evolve* gsl_odeiv2_evolve_alloc (size_t dim); 119 int gsl_odeiv2_evolve_apply (gsl_odeiv2_evolve* e, gsl_odeiv2_control* con, gsl_odeiv2_step* step, const(gsl_odeiv2_system)* dydt, double* t, double t1, double* h, double* y); 120 int gsl_odeiv2_evolve_apply_fixed_step (gsl_odeiv2_evolve* e, gsl_odeiv2_control* con, gsl_odeiv2_step* step, const(gsl_odeiv2_system)* dydt, double* t, const double h0, double* y); 121 int gsl_odeiv2_evolve_reset (gsl_odeiv2_evolve* e); 122 void gsl_odeiv2_evolve_free (gsl_odeiv2_evolve* e); 123 int gsl_odeiv2_evolve_set_driver (gsl_odeiv2_evolve* e, const(gsl_odeiv2_driver)* d); 124 gsl_odeiv2_driver* gsl_odeiv2_driver_alloc_y_new (const(gsl_odeiv2_system)* sys, const(gsl_odeiv2_step_type)* T, const double hstart, const double epsabs, const double epsrel); 125 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); 126 gsl_odeiv2_driver* gsl_odeiv2_driver_alloc_scaled_new (const(gsl_odeiv2_system)* sys, const(gsl_odeiv2_step_type)* T, const double hstart, const double epsabs, const double epsrel, const double a_y, const double a_dydt, const(double)* scale_abs); 127 gsl_odeiv2_driver* gsl_odeiv2_driver_alloc_standard_new (const(gsl_odeiv2_system)* sys, const(gsl_odeiv2_step_type)* T, const double hstart, const double epsabs, const double epsrel, const double a_y, const double a_dydt); 128 int gsl_odeiv2_driver_set_hmin (gsl_odeiv2_driver* d, const double hmin); 129 int gsl_odeiv2_driver_set_hmax (gsl_odeiv2_driver* d, const double hmax); 130 int gsl_odeiv2_driver_set_nmax (gsl_odeiv2_driver* d, const c_ulong nmax); 131 int gsl_odeiv2_driver_apply (gsl_odeiv2_driver* d, double* t, const double t1, double* y); 132 int gsl_odeiv2_driver_apply_fixed_step (gsl_odeiv2_driver* d, double* t, const double h, const c_ulong n, double* y); 133 int gsl_odeiv2_driver_reset (gsl_odeiv2_driver* d); 134 int gsl_odeiv2_driver_reset_hstart (gsl_odeiv2_driver* d, const double hstart); 135 void gsl_odeiv2_driver_free (gsl_odeiv2_driver* state);