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);