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