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.interpolation;
8 
9 extern (C):
10 
11 //gsl_interp
12 extern __gshared const(gsl_interp_type)* gsl_interp_linear;
13 extern __gshared const(gsl_interp_type)* gsl_interp_polynomial;
14 extern __gshared const(gsl_interp_type)* gsl_interp_cspline;
15 extern __gshared const(gsl_interp_type)* gsl_interp_cspline_periodic;
16 extern __gshared const(gsl_interp_type)* gsl_interp_akima;
17 extern __gshared const(gsl_interp_type)* gsl_interp_akima_periodic;
18 extern __gshared const(gsl_interp_type)* gsl_interp_steffen;
19 
20 struct gsl_interp_accel
21 {
22     size_t cache;
23     size_t miss_count;
24     size_t hit_count;
25 }
26 
27 struct gsl_interp_type
28 {
29     const(char)* name;
30     uint min_size;
31     void* function (size_t) alloc;
32     int function (void*, const(double)*, const(double)*, size_t) init;
33     int function (const(void)*, const(double)*, const(double)*, size_t, double, gsl_interp_accel*, double*) eval;
34     int function (const(void)*, const(double)*, const(double)*, size_t, double, gsl_interp_accel*, double*) eval_deriv;
35     int function (const(void)*, const(double)*, const(double)*, size_t, double, gsl_interp_accel*, double*) eval_deriv2;
36     int function (const(void)*, const(double)*, const(double)*, size_t, gsl_interp_accel*, double, double, double*) eval_integ;
37     void function (void*) free;
38 }
39 
40 struct gsl_interp
41 {
42     const(gsl_interp_type)* type;
43     double xmin;
44     double xmax;
45     size_t size;
46     void* state;
47 }
48 
49 gsl_interp_accel* gsl_interp_accel_alloc ();
50 int gsl_interp_accel_reset (gsl_interp_accel* a);
51 void gsl_interp_accel_free (gsl_interp_accel* a);
52 gsl_interp* gsl_interp_alloc (const(gsl_interp_type)* T, size_t n);
53 int gsl_interp_init (gsl_interp* obj, const(double)* xa, const(double)* ya, size_t size);
54 const(char)* gsl_interp_name (const(gsl_interp)* interp);
55 uint gsl_interp_min_size (const(gsl_interp)* interp);
56 uint gsl_interp_type_min_size (const(gsl_interp_type)* T);
57 int gsl_interp_eval_e (const(gsl_interp)* obj, const(double)* xa, const(double)* ya, double x, gsl_interp_accel* a, double* y);
58 double gsl_interp_eval (const(gsl_interp)* obj, const(double)* xa, const(double)* ya, double x, gsl_interp_accel* a);
59 int gsl_interp_eval_deriv_e (const(gsl_interp)* obj, const(double)* xa, const(double)* ya, double x, gsl_interp_accel* a, double* d);
60 double gsl_interp_eval_deriv (const(gsl_interp)* obj, const(double)* xa, const(double)* ya, double x, gsl_interp_accel* a);
61 int gsl_interp_eval_deriv2_e (const(gsl_interp)* obj, const(double)* xa, const(double)* ya, double x, gsl_interp_accel* a, double* d2);
62 double gsl_interp_eval_deriv2 (const(gsl_interp)* obj, const(double)* xa, const(double)* ya, double x, gsl_interp_accel* a);
63 int gsl_interp_eval_integ_e (const(gsl_interp)* obj, const(double)* xa, const(double)* ya, double a, double b, gsl_interp_accel* acc, double* result);
64 double gsl_interp_eval_integ (const(gsl_interp)* obj, const(double)* xa, const(double)* ya, double a, double b, gsl_interp_accel* acc);
65 void gsl_interp_free (gsl_interp* interp);
66 size_t gsl_interp_bsearch (const(double)* x_array, double x, size_t index_lo, size_t index_hi);
67 size_t gsl_interp_accel_find (gsl_interp_accel* a, const(double)* x_array, size_t size, double x);
68 
69 
70 //gsl_interp2d
71 extern __gshared const(gsl_interp2d_type)* gsl_interp2d_bilinear;
72 extern __gshared const(gsl_interp2d_type)* gsl_interp2d_bicubic;
73 
74 struct gsl_interp2d_type
75 {
76     const(char)* name;
77     uint min_size;
78     void* function (size_t, size_t) alloc;
79     int function (void*, const(double)*, const(double)*, const(double)*, size_t, size_t) init;
80     int function (const(void)*, const(double)*, const(double)*, const(double)*, size_t, size_t, double, double, gsl_interp_accel*, gsl_interp_accel*, double*) eval;
81     int function (const(void)*, const(double)*, const(double)*, const(double)*, size_t, size_t, double, double, gsl_interp_accel*, gsl_interp_accel*, double*) eval_deriv_x;
82     int function (const(void)*, const(double)*, const(double)*, const(double)*, size_t, size_t, double, double, gsl_interp_accel*, gsl_interp_accel*, double*) eval_deriv_y;
83     int function (const(void)*, const(double)*, const(double)*, const(double)*, size_t, size_t, double, double, gsl_interp_accel*, gsl_interp_accel*, double*) eval_deriv_xx;
84     int function (const(void)*, const(double)*, const(double)*, const(double)*, size_t, size_t, double, double, gsl_interp_accel*, gsl_interp_accel*, double*) eval_deriv_xy;
85     int function (const(void)*, const(double)*, const(double)*, const(double)*, size_t, size_t, double, double, gsl_interp_accel*, gsl_interp_accel*, double*) eval_deriv_yy;
86     void function (void*) free;
87 }
88 
89 struct gsl_interp2d
90 {
91     const(gsl_interp2d_type)* type;
92     double xmin;
93     double xmax;
94     double ymin;
95     double ymax;
96     size_t xsize;
97     size_t ysize;
98     void* state;
99 }
100 
101 gsl_interp2d* gsl_interp2d_alloc (const(gsl_interp2d_type)* T, const size_t xsize, const size_t ysize);
102 const(char)* gsl_interp2d_name (const(gsl_interp2d)* interp);
103 size_t gsl_interp2d_min_size (const(gsl_interp2d)* interp);
104 size_t gsl_interp2d_type_min_size (const(gsl_interp2d_type)* T);
105 int gsl_interp2d_set (const(gsl_interp2d)* interp, double* zarr, const size_t i, const size_t j, const double z);
106 double gsl_interp2d_get (const(gsl_interp2d)* interp, const(double)* zarr, const size_t i, const size_t j);
107 size_t gsl_interp2d_idx (const(gsl_interp2d)* interp, const size_t i, const size_t j);
108 int gsl_interp2d_init (gsl_interp2d* interp, const(double)* xa, const(double)* ya, const(double)* za, const size_t xsize, const size_t ysize);
109 void gsl_interp2d_free (gsl_interp2d* interp);
110 double gsl_interp2d_eval (const(gsl_interp2d)* interp, const(double)* xarr, const(double)* yarr, const(double)* zarr, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya);
111 double gsl_interp2d_eval_extrap (const(gsl_interp2d)* interp, const(double)* xarr, const(double)* yarr, const(double)* zarr, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya);
112 int gsl_interp2d_eval_e (const(gsl_interp2d)* interp, const(double)* xarr, const(double)* yarr, const(double)* zarr, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya, double* z);
113 int gsl_interp2d_eval_e_extrap (const(gsl_interp2d)* interp, const(double)* xarr, const(double)* yarr, const(double)* zarr, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya, double* z);
114 double gsl_interp2d_eval_deriv_x (const(gsl_interp2d)* interp, const(double)* xarr, const(double)* yarr, const(double)* zarr, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya);
115 int gsl_interp2d_eval_deriv_x_e (const(gsl_interp2d)* interp, const(double)* xarr, const(double)* yarr, const(double)* zarr, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya, double* z);
116 double gsl_interp2d_eval_deriv_y (const(gsl_interp2d)* interp, const(double)* xarr, const(double)* yarr, const(double)* zarr, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya);
117 int gsl_interp2d_eval_deriv_y_e (const(gsl_interp2d)* interp, const(double)* xarr, const(double)* yarr, const(double)* zarr, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya, double* z);
118 double gsl_interp2d_eval_deriv_xx (const(gsl_interp2d)* interp, const(double)* xarr, const(double)* yarr, const(double)* zarr, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya);
119 int gsl_interp2d_eval_deriv_xx_e (const(gsl_interp2d)* interp, const(double)* xarr, const(double)* yarr, const(double)* zarr, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya, double* z);
120 double gsl_interp2d_eval_deriv_yy (const(gsl_interp2d)* interp, const(double)* xarr, const(double)* yarr, const(double)* zarr, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya);
121 int gsl_interp2d_eval_deriv_yy_e (const(gsl_interp2d)* interp, const(double)* xarr, const(double)* yarr, const(double)* zarr, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya, double* z);
122 double gsl_interp2d_eval_deriv_xy (const(gsl_interp2d)* interp, const(double)* xarr, const(double)* yarr, const(double)* zarr, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya);
123 int gsl_interp2d_eval_deriv_xy_e (const(gsl_interp2d)* interp, const(double)* xarr, const(double)* yarr, const(double)* zarr, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya, double* z);
124 
125 
126 //gsl_spline
127 struct gsl_spline
128 {
129     gsl_interp* interp;
130     double* x;
131     double* y;
132     size_t size;
133 }
134 
135 gsl_spline* gsl_spline_alloc (const(gsl_interp_type)* T, size_t size);
136 int gsl_spline_init (gsl_spline* spline, const(double)* xa, const(double)* ya, size_t size);
137 const(char)* gsl_spline_name (const(gsl_spline)* spline);
138 uint gsl_spline_min_size (const(gsl_spline)* spline);
139 int gsl_spline_eval_e (const(gsl_spline)* spline, double x, gsl_interp_accel* a, double* y);
140 double gsl_spline_eval (const(gsl_spline)* spline, double x, gsl_interp_accel* a);
141 int gsl_spline_eval_deriv_e (const(gsl_spline)* spline, double x, gsl_interp_accel* a, double* y);
142 double gsl_spline_eval_deriv (const(gsl_spline)* spline, double x, gsl_interp_accel* a);
143 int gsl_spline_eval_deriv2_e (const(gsl_spline)* spline, double x, gsl_interp_accel* a, double* y);
144 double gsl_spline_eval_deriv2 (const(gsl_spline)* spline, double x, gsl_interp_accel* a);
145 int gsl_spline_eval_integ_e (const(gsl_spline)* spline, double a, double b, gsl_interp_accel* acc, double* y);
146 double gsl_spline_eval_integ (const(gsl_spline)* spline, double a, double b, gsl_interp_accel* acc);
147 void gsl_spline_free (gsl_spline* spline);
148 
149 
150 //gsl_spline2d
151 struct gsl_spline2d
152 {
153     gsl_interp2d interp_object;
154     double* xarr;
155     double* yarr;
156     double* zarr;
157 }
158 
159 gsl_spline2d* gsl_spline2d_alloc (const(gsl_interp2d_type)* T, size_t xsize, size_t ysize);
160 int gsl_spline2d_init (gsl_spline2d* interp, const(double)* xa, const(double)* ya, const(double)* za, size_t xsize, size_t ysize);
161 void gsl_spline2d_free (gsl_spline2d* interp);
162 double gsl_spline2d_eval (const(gsl_spline2d)* interp, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya);
163 int gsl_spline2d_eval_e (const(gsl_spline2d)* interp, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya, double* z);
164 double gsl_spline2d_eval_deriv_x (const(gsl_spline2d)* interp, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya);
165 int gsl_spline2d_eval_deriv_x_e (const(gsl_spline2d)* interp, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya, double* z);
166 double gsl_spline2d_eval_deriv_y (const(gsl_spline2d)* interp, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya);
167 int gsl_spline2d_eval_deriv_y_e (const(gsl_spline2d)* interp, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya, double* z);
168 double gsl_spline2d_eval_deriv_xx (const(gsl_spline2d)* interp, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya);
169 int gsl_spline2d_eval_deriv_xx_e (const(gsl_spline2d)* interp, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya, double* z);
170 double gsl_spline2d_eval_deriv_yy (const(gsl_spline2d)* interp, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya);
171 int gsl_spline2d_eval_deriv_yy_e (const(gsl_spline2d)* interp, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya, double* z);
172 double gsl_spline2d_eval_deriv_xy (const(gsl_spline2d)* interp, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya);
173 int gsl_spline2d_eval_deriv_xy_e (const(gsl_spline2d)* interp, const double x, const double y, gsl_interp_accel* xa, gsl_interp_accel* ya, double* z);
174 size_t gsl_spline2d_min_size (const(gsl_spline2d)* interp);
175 const(char)* gsl_spline2d_name (const(gsl_spline2d)* interp);
176 int gsl_spline2d_set (const(gsl_spline2d)* interp, double* zarr, const size_t i, const size_t j, const double z);
177 double gsl_spline2d_get (const(gsl_spline2d)* interp, const(double)* zarr, const size_t i, const size_t j);