gsl 1.12.108

Sign up to get free protection for your applications and to get access to all the features.
Files changed (158) hide show
  1. data/README.rdoc +29 -0
  2. data/Rakefile +54 -0
  3. data/VERSION +2 -0
  4. data/ext/MANIFEST +119 -0
  5. data/ext/alf.c +206 -0
  6. data/ext/array.c +666 -0
  7. data/ext/array_complex.c +247 -0
  8. data/ext/blas.c +29 -0
  9. data/ext/blas1.c +731 -0
  10. data/ext/blas2.c +1093 -0
  11. data/ext/blas3.c +881 -0
  12. data/ext/block.c +44 -0
  13. data/ext/block_source.c +886 -0
  14. data/ext/bspline.c +130 -0
  15. data/ext/bundle.c +3 -0
  16. data/ext/cdf.c +754 -0
  17. data/ext/cheb.c +542 -0
  18. data/ext/combination.c +283 -0
  19. data/ext/common.c +325 -0
  20. data/ext/complex.c +1004 -0
  21. data/ext/const.c +673 -0
  22. data/ext/const_additional.c +120 -0
  23. data/ext/cqp.c +283 -0
  24. data/ext/deriv.c +195 -0
  25. data/ext/dht.c +361 -0
  26. data/ext/diff.c +166 -0
  27. data/ext/dirac.c +395 -0
  28. data/ext/eigen.c +2373 -0
  29. data/ext/error.c +194 -0
  30. data/ext/extconf.rb +281 -0
  31. data/ext/fcmp.c +66 -0
  32. data/ext/fft.c +1092 -0
  33. data/ext/fit.c +205 -0
  34. data/ext/fresnel.c +312 -0
  35. data/ext/function.c +524 -0
  36. data/ext/geometry.c +139 -0
  37. data/ext/graph.c +1638 -0
  38. data/ext/gsl.c +271 -0
  39. data/ext/gsl_narray.c +653 -0
  40. data/ext/histogram.c +1995 -0
  41. data/ext/histogram2d.c +1068 -0
  42. data/ext/histogram3d.c +884 -0
  43. data/ext/histogram3d_source.c +750 -0
  44. data/ext/histogram_find.c +101 -0
  45. data/ext/histogram_oper.c +159 -0
  46. data/ext/ieee.c +98 -0
  47. data/ext/integration.c +1138 -0
  48. data/ext/interp.c +512 -0
  49. data/ext/jacobi.c +739 -0
  50. data/ext/linalg.c +4047 -0
  51. data/ext/linalg_complex.c +741 -0
  52. data/ext/math.c +725 -0
  53. data/ext/matrix.c +39 -0
  54. data/ext/matrix_complex.c +1732 -0
  55. data/ext/matrix_double.c +560 -0
  56. data/ext/matrix_int.c +256 -0
  57. data/ext/matrix_source.c +2733 -0
  58. data/ext/min.c +250 -0
  59. data/ext/monte.c +992 -0
  60. data/ext/multifit.c +1879 -0
  61. data/ext/multimin.c +808 -0
  62. data/ext/multimin_fsdf.c +156 -0
  63. data/ext/multiroots.c +955 -0
  64. data/ext/ndlinear.c +321 -0
  65. data/ext/nmf.c +167 -0
  66. data/ext/nmf_wrap.c +72 -0
  67. data/ext/ntuple.c +469 -0
  68. data/ext/odeiv.c +959 -0
  69. data/ext/ool.c +879 -0
  70. data/ext/oper_complex_source.c +253 -0
  71. data/ext/permutation.c +596 -0
  72. data/ext/poly.c +42 -0
  73. data/ext/poly2.c +265 -0
  74. data/ext/poly_source.c +1885 -0
  75. data/ext/qrng.c +171 -0
  76. data/ext/randist.c +1873 -0
  77. data/ext/rational.c +480 -0
  78. data/ext/rng.c +612 -0
  79. data/ext/root.c +408 -0
  80. data/ext/sf.c +1494 -0
  81. data/ext/sf_airy.c +200 -0
  82. data/ext/sf_bessel.c +867 -0
  83. data/ext/sf_clausen.c +28 -0
  84. data/ext/sf_coulomb.c +206 -0
  85. data/ext/sf_coupling.c +118 -0
  86. data/ext/sf_dawson.c +29 -0
  87. data/ext/sf_debye.c +157 -0
  88. data/ext/sf_dilog.c +42 -0
  89. data/ext/sf_elementary.c +44 -0
  90. data/ext/sf_ellint.c +206 -0
  91. data/ext/sf_elljac.c +29 -0
  92. data/ext/sf_erfc.c +93 -0
  93. data/ext/sf_exp.c +164 -0
  94. data/ext/sf_expint.c +211 -0
  95. data/ext/sf_fermi_dirac.c +148 -0
  96. data/ext/sf_gamma.c +344 -0
  97. data/ext/sf_gegenbauer.c +96 -0
  98. data/ext/sf_hyperg.c +197 -0
  99. data/ext/sf_laguerre.c +112 -0
  100. data/ext/sf_lambert.c +47 -0
  101. data/ext/sf_legendre.c +367 -0
  102. data/ext/sf_log.c +104 -0
  103. data/ext/sf_mathieu.c +238 -0
  104. data/ext/sf_power.c +46 -0
  105. data/ext/sf_psi.c +98 -0
  106. data/ext/sf_synchrotron.c +48 -0
  107. data/ext/sf_transport.c +76 -0
  108. data/ext/sf_trigonometric.c +207 -0
  109. data/ext/sf_zeta.c +119 -0
  110. data/ext/signal.c +310 -0
  111. data/ext/siman.c +718 -0
  112. data/ext/sort.c +208 -0
  113. data/ext/spline.c +395 -0
  114. data/ext/stats.c +799 -0
  115. data/ext/sum.c +168 -0
  116. data/ext/tamu_anova.c +56 -0
  117. data/ext/tensor.c +38 -0
  118. data/ext/tensor_source.c +1123 -0
  119. data/ext/vector.c +38 -0
  120. data/ext/vector_complex.c +2236 -0
  121. data/ext/vector_double.c +1433 -0
  122. data/ext/vector_int.c +204 -0
  123. data/ext/vector_source.c +3329 -0
  124. data/ext/wavelet.c +937 -0
  125. data/include/rb_gsl.h +151 -0
  126. data/include/rb_gsl_array.h +238 -0
  127. data/include/rb_gsl_cheb.h +21 -0
  128. data/include/rb_gsl_common.h +343 -0
  129. data/include/rb_gsl_complex.h +25 -0
  130. data/include/rb_gsl_const.h +29 -0
  131. data/include/rb_gsl_dirac.h +13 -0
  132. data/include/rb_gsl_eigen.h +17 -0
  133. data/include/rb_gsl_fft.h +62 -0
  134. data/include/rb_gsl_fit.h +25 -0
  135. data/include/rb_gsl_function.h +27 -0
  136. data/include/rb_gsl_graph.h +70 -0
  137. data/include/rb_gsl_histogram.h +63 -0
  138. data/include/rb_gsl_histogram3d.h +97 -0
  139. data/include/rb_gsl_integration.h +17 -0
  140. data/include/rb_gsl_interp.h +46 -0
  141. data/include/rb_gsl_linalg.h +25 -0
  142. data/include/rb_gsl_math.h +26 -0
  143. data/include/rb_gsl_odeiv.h +21 -0
  144. data/include/rb_gsl_poly.h +71 -0
  145. data/include/rb_gsl_rational.h +37 -0
  146. data/include/rb_gsl_rng.h +21 -0
  147. data/include/rb_gsl_root.h +22 -0
  148. data/include/rb_gsl_sf.h +119 -0
  149. data/include/rb_gsl_statistics.h +17 -0
  150. data/include/rb_gsl_tensor.h +45 -0
  151. data/include/rb_gsl_with_narray.h +22 -0
  152. data/include/templates_off.h +87 -0
  153. data/include/templates_on.h +241 -0
  154. data/lib/gsl/gnuplot.rb +41 -0
  155. data/lib/gsl/oper.rb +68 -0
  156. data/lib/ool.rb +22 -0
  157. data/lib/ool/conmin.rb +30 -0
  158. metadata +224 -0
@@ -0,0 +1,101 @@
1
+ /* histogram/find.c
2
+ *
3
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000 Brian Gough
4
+ *
5
+ * This program is free software; you can redistribute it and/or modify
6
+ * it under the terms of the GNU General Public License as published by
7
+ * the Free Software Foundation; either version 2 of the License, or (at
8
+ * your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful, but
11
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ * General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program; if not, write to the Free Software
17
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18
+ */
19
+
20
+ #include "rb_gsl_histogram.h"
21
+ /* determines whether to optimize for linear ranges */
22
+ #define LINEAR_OPT 1
23
+
24
+ int mygsl_find (const size_t n, const double range[], const double x, size_t * i)
25
+ {
26
+ size_t i_linear, lower, upper, mid;
27
+ if (x < range[0]) return -1;
28
+ if (x >= range[n]) return +1;
29
+
30
+ /* optimize for linear case */
31
+
32
+ #ifdef LINEAR_OPT
33
+ {
34
+ double u = (x - range[0]) / (range[n] - range[0]);
35
+ i_linear = (size_t) (n*u);
36
+ }
37
+
38
+ if (x >= range[i_linear] && x < range[i_linear + 1])
39
+ {
40
+ *i = i_linear;
41
+ return 0;
42
+ }
43
+ #endif
44
+
45
+ /* perform binary search */
46
+
47
+ upper = n ;
48
+ lower = 0 ;
49
+
50
+ while (upper - lower > 1)
51
+ {
52
+ mid = (upper + lower) / 2 ;
53
+
54
+ if (x >= range[mid])
55
+ {
56
+ lower = mid ;
57
+ }
58
+ else
59
+ {
60
+ upper = mid ;
61
+ }
62
+ }
63
+
64
+ *i = lower ;
65
+
66
+ /* sanity check the result */
67
+
68
+ if (x < range[lower] || x >= range[lower + 1])
69
+ {
70
+ GSL_ERROR ("x not found in range", GSL_ESANITY);
71
+ }
72
+
73
+ return 0;
74
+ }
75
+
76
+ int mygsl_find2d (const size_t nx, const double xrange[],
77
+ const size_t ny, const double yrange[],
78
+ const double x, const double y,
79
+ size_t * i, size_t * j)
80
+ {
81
+ int status = mygsl_find (nx, xrange, x, i);
82
+ if (status) return status;
83
+ status = mygsl_find (ny, yrange, y, j);
84
+ if (status) return status;
85
+ return 0;
86
+ }
87
+
88
+ int mygsl_find3d (const size_t nx, const double xrange[],
89
+ const size_t ny, const double yrange[],
90
+ const size_t nz, const double zrange[],
91
+ const double x, const double y, const double z,
92
+ size_t * i, size_t * j, size_t *k)
93
+ {
94
+ int status = mygsl_find (nx, xrange, x, i);
95
+ if (status) return status;
96
+ status = mygsl_find (ny, yrange, y, j);
97
+ if (status) return status;
98
+ status = mygsl_find (nz, zrange, z, k);
99
+ if (status) return status;
100
+ return 0;
101
+ }
@@ -0,0 +1,159 @@
1
+ /* gsl_histogram_oper.c
2
+ * Copyright (C) 2000 Simone Piccardi
3
+ *
4
+ * This library is free software; you can redistribute it and/or
5
+ * modify it under the terms of the GNU General Public License as
6
+ * published by the Free Software Foundation; either version 2 of the
7
+ * License, or (at your option) any later version.
8
+ *
9
+ * This program is distributed in the hope that it will be useful,
10
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
+ * General Public License for more details.
13
+ *
14
+ * You should have received a copy of the GNU General Public
15
+ * License along with this library; if not, write to the
16
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17
+ * Boston, MA 02111-1307, USA.
18
+ */
19
+ /***************************************************************
20
+ *
21
+ * File gsl_histogram_oper.c:
22
+ * Routine to make operation on histograms.
23
+ * Need GSL library and header.
24
+ * Contains the routines:
25
+ * gsl_histogram_same_binning check if two histograms have the same binning
26
+ * gsl_histogram_add add two histograms
27
+ * gsl_histogram_sub subctract two histograms
28
+ * gsl_histogram_mult multiply two histograms
29
+ * gsl_histogram_div divide two histograms
30
+ * gsl_histogram_scale scale histogram contents
31
+ *
32
+ * Author: S. Piccardi
33
+ * Jan. 2000
34
+ *
35
+ ***************************************************************/
36
+ #include <stdlib.h>
37
+ #include <gsl/gsl_errno.h>
38
+ #include <gsl/gsl_math.h>
39
+ #include <gsl/gsl_histogram.h>
40
+
41
+ /*
42
+ * gsl_histogram_same_binning:
43
+ * control if two histograms have the
44
+ * same binning
45
+ */
46
+
47
+ int
48
+ mygsl_histogram_equal_bins_p (const gsl_histogram * h1, const gsl_histogram * h2)
49
+ {
50
+ if (h1->n != h2->n)
51
+ {
52
+ return 0;
53
+ }
54
+
55
+ {
56
+ size_t i;
57
+ /* init ranges */
58
+
59
+ for (i = 0; i <= h1->n; i++)
60
+ {
61
+ if (gsl_fcmp(h1->range[i],h2->range[i], 1e-12))
62
+ {
63
+ return 0;
64
+ }
65
+ }
66
+ }
67
+
68
+ return 1;
69
+ }
70
+
71
+ /*
72
+ * gsl_histogram_add:
73
+ * add two histograms
74
+ */
75
+ int
76
+ mygsl_histogram_add (gsl_histogram * h1, const gsl_histogram * h2)
77
+ {
78
+ size_t i;
79
+
80
+ if (!mygsl_histogram_equal_bins_p (h1, h2))
81
+ {
82
+ GSL_ERROR ("histograms have different binning", GSL_EINVAL);
83
+ }
84
+
85
+ for (i = 0; i < h1->n; i++)
86
+ {
87
+ h1->bin[i] += h2->bin[i];
88
+ }
89
+
90
+ return GSL_SUCCESS;
91
+ }
92
+
93
+ /*
94
+ * gsl_histogram_sub:
95
+ * subtract two histograms
96
+ */
97
+
98
+ int
99
+ mygsl_histogram_sub (gsl_histogram * h1, const gsl_histogram * h2)
100
+ {
101
+ size_t i;
102
+
103
+ if (!mygsl_histogram_equal_bins_p (h1, h2))
104
+ {
105
+ GSL_ERROR ("histograms have different binning", GSL_EINVAL);
106
+ }
107
+
108
+ for (i = 0; i < h1->n; i++)
109
+ {
110
+ h1->bin[i] -= h2->bin[i];
111
+ }
112
+
113
+ return GSL_SUCCESS;
114
+
115
+ }
116
+
117
+ /*
118
+ * gsl_histogram_mult:
119
+ * multiply two histograms
120
+ */
121
+
122
+ int
123
+ mygsl_histogram_mul (gsl_histogram * h1, const gsl_histogram * h2)
124
+ {
125
+ size_t i;
126
+
127
+ if (!mygsl_histogram_equal_bins_p (h1, h2))
128
+ {
129
+ GSL_ERROR ("histograms have different binning", GSL_EINVAL);
130
+ }
131
+
132
+ for (i = 0; i < h1->n; i++)
133
+ {
134
+ h1->bin[i] *= h2->bin[i];
135
+ }
136
+
137
+ return GSL_SUCCESS;
138
+ }
139
+ /*
140
+ * gsl_histogram_div:
141
+ * divide two histograms
142
+ */
143
+ int
144
+ mygsl_histogram_div (gsl_histogram * h1, const gsl_histogram * h2)
145
+ {
146
+ size_t i;
147
+
148
+ if (!mygsl_histogram_equal_bins_p (h1, h2))
149
+ {
150
+ GSL_ERROR ("histograms have different binning", GSL_EINVAL);
151
+ }
152
+
153
+ for (i = 0; i < h1->n; i++)
154
+ {
155
+ h1->bin[i] /= h2->bin[i];
156
+ }
157
+
158
+ return GSL_SUCCESS;
159
+ }
@@ -0,0 +1,98 @@
1
+ /*
2
+ ieee.c
3
+ Ruby/GSL: Ruby extension library for GSL (GNU Scientific Library)
4
+ (C) Copyright 2001-2006 by Yoshiki Tsunesada
5
+
6
+ Ruby/GSL is free software: you can redistribute it and/or modify it
7
+ under the terms of the GNU General Public License.
8
+ This library is distributed in the hope that it will be useful, but
9
+ WITHOUT ANY WARRANTY.
10
+ */
11
+
12
+ #include "rb_gsl.h"
13
+
14
+ static VALUE rb_gsl_ieee_env_setup(VALUE obj)
15
+ {
16
+ gsl_ieee_env_setup();
17
+ return obj;
18
+ }
19
+
20
+ static VALUE rb_gsl_ieee_fprintf_double(int argc, VALUE *argv, VALUE obj)
21
+ {
22
+ #ifdef RUBY_1_9_LATER
23
+ rb_io_t *fptr = NULL;
24
+ #else
25
+ OpenFile *fptr = NULL;
26
+ #endif
27
+ FILE *fp = NULL;
28
+ int flag = 0;
29
+ VALUE vtmp;
30
+
31
+ switch (argc) {
32
+ case 2:
33
+ switch (TYPE(argv[0])) {
34
+ case T_STRING:
35
+ fp = fopen(RSTRING_PTR(argv[0]), "w");
36
+ flag = 1;
37
+ break;
38
+ case T_FILE:
39
+ GetOpenFile(argv[0], fptr);
40
+ rb_io_check_writable(fptr);
41
+ #ifdef RUBY_1_9_LATER
42
+ fp = rb_io_stdio_file(fptr);
43
+ #else
44
+ fp = GetWriteFile(fptr);
45
+ #endif
46
+ break;
47
+ default:
48
+ rb_raise(rb_eTypeError, "wrong type argument %s (IO or String expected)",
49
+ rb_class2name(CLASS_OF(argv[0])));
50
+ }
51
+ vtmp = argv[1];
52
+ break;
53
+ case 1:
54
+ vtmp = argv[0];
55
+ fp = stdout;
56
+ break;
57
+ default:
58
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 2)", argc);
59
+ }
60
+ if (TYPE(vtmp) != T_FLOAT)
61
+ rb_raise(rb_eTypeError, "wrong argument type %s (Float expected)",
62
+ rb_class2name(CLASS_OF(vtmp)));
63
+ #ifdef RUBY_1_9_LATER
64
+ gsl_ieee_fprintf_double(fp, &(RFLOAT_VALUE(vtmp)));
65
+ #else
66
+ gsl_ieee_fprintf_double(fp, &(RFLOAT(vtmp)->value));
67
+ #endif
68
+ if (fp == stdout) fprintf(stdout, "\n");
69
+ if (flag == 1) fclose(fp);
70
+ return obj;
71
+ }
72
+
73
+ static VALUE rb_gsl_ieee_printf_double(VALUE obj, VALUE xx)
74
+ {
75
+ double x;
76
+ x = NUM2DBL(xx);
77
+ gsl_ieee_printf_double(&x);
78
+ return xx;
79
+ }
80
+
81
+ void Init_gsl_ieee(VALUE module)
82
+ {
83
+ VALUE mgsl_ieee;
84
+ mgsl_ieee = rb_define_module_under(module, "IEEE");
85
+
86
+ rb_define_singleton_method(mgsl_ieee, "env_setup",
87
+ rb_gsl_ieee_env_setup, 0);
88
+ rb_define_module_function(module, "ieee_env_setup", rb_gsl_ieee_env_setup, 0);
89
+ rb_define_singleton_method(mgsl_ieee, "fprintf_double",
90
+ rb_gsl_ieee_fprintf_double, -1);
91
+ rb_define_singleton_method(mgsl_ieee, "fprintf",
92
+ rb_gsl_ieee_fprintf_double, -1);
93
+ rb_define_singleton_method(mgsl_ieee, "printf",
94
+ rb_gsl_ieee_printf_double, -1);
95
+ rb_define_singleton_method(mgsl_ieee, "printf_double",
96
+ rb_gsl_ieee_printf_double, -1);
97
+
98
+ }
@@ -0,0 +1,1138 @@
1
+ /*
2
+ integration.c
3
+ Ruby/GSL: Ruby extension library for GSL (GNU Scientific Library)
4
+ (C) Copyright 2001-2006 by Yoshiki Tsunesada
5
+
6
+ Ruby/GSL is free software: you can redistribute it and/or modify it
7
+ under the terms of the GNU General Public License.
8
+ This library is distributed in the hope that it will be useful, but
9
+ WITHOUT ANY WARRANTY.
10
+ */
11
+
12
+ #include "rb_gsl_config.h"
13
+
14
+ #include "rb_gsl_array.h"
15
+ #include "rb_gsl_function.h"
16
+ #include "rb_gsl_integration.h"
17
+ #include "rb_gsl_common.h"
18
+
19
+ #ifndef CHECK_WORKSPACE
20
+ #define CHECK_WORKSPACE(x) if(CLASS_OF(x)!=cgsl_integration_workspace)\
21
+ rb_raise(rb_eTypeError,\
22
+ "wrong argument type %s (Integration::Workspace expected)",\
23
+ rb_class2name(CLASS_OF(x)));
24
+ #endif
25
+
26
+ #define EPSABS_DEFAULT 0.0
27
+ #define EPSREL_DEFAULT 1e-10
28
+ #define LIMIT_DEFAULT 1000
29
+ #define KEY_DEFAULT GSL_INTEG_GAUSS61
30
+
31
+ static VALUE cgsl_integration_qaws_table, cgsl_integration_qawo_table;
32
+
33
+ static VALUE cgsl_integration_workspace;
34
+
35
+ static int get_a_b(int argc, VALUE *argv, int argstart, double *a, double *b);
36
+ static int get_epsabs_epsrel(int argc, VALUE *argv, int argstart,
37
+ double *epsabs, double *epsrel);
38
+ static int get_a_b_epsabs_epsrel(int argc, VALUE *argv, int argstart,
39
+ double *a, double *b, double *epsabs,
40
+ double *epsrel);
41
+ static int get_limit_key_workspace(int argc, VALUE *argv, int argstart,
42
+ size_t *limit, int *key,
43
+ gsl_integration_workspace **w);
44
+ static int get_limit_workspace(int argc, VALUE *argv, int argstart,
45
+ size_t *limit,
46
+ gsl_integration_workspace **w);
47
+ static int get_epsabs_epsrel_limit_workspace(int argc, VALUE *argv, int argstart,
48
+ double *epsabs, double *epsrel,
49
+ size_t *limit,
50
+ gsl_integration_workspace **w);
51
+
52
+ static int get_a_b(int argc, VALUE *argv, int argstart, double *a, double *b)
53
+ {
54
+ int itmp;
55
+ VALUE aa, bb;
56
+ if (argstart >= argc) return argstart;
57
+ if (TYPE(argv[argstart]) == T_ARRAY) {
58
+ aa = rb_ary_entry(argv[argstart], 0);
59
+ bb = rb_ary_entry(argv[argstart], 1);
60
+ Need_Float(aa); Need_Float(bb);
61
+ // *a = RFLOAT(aa)->value;
62
+ // *b = RFLOAT(bb)->value;
63
+ *a = NUM2DBL(aa);
64
+ *b = NUM2DBL(bb);
65
+ itmp = argstart + 1;
66
+ } else {
67
+ Need_Float(argv[argstart]); Need_Float(argv[argstart+1]);
68
+ *a = NUM2DBL(argv[argstart]);
69
+ *b = NUM2DBL(argv[argstart+1]);
70
+ itmp = argstart + 2;
71
+ }
72
+ return itmp;
73
+ }
74
+
75
+ static int get_epsabs_epsrel(int argc, VALUE *argv, int argstart,
76
+ double *epsabs, double *epsrel)
77
+ {
78
+ int itmp;
79
+ VALUE aa, bb;
80
+ *epsabs = EPSABS_DEFAULT;
81
+ *epsrel = EPSREL_DEFAULT;
82
+ if (argstart >= argc) return argstart;
83
+ if (TYPE(argv[argstart]) == T_ARRAY) {
84
+ aa = rb_ary_entry(argv[argstart], 0);
85
+ bb = rb_ary_entry(argv[argstart], 1);
86
+ Need_Float(aa); Need_Float(bb);
87
+ *epsabs = NUM2DBL(aa);
88
+ *epsrel = NUM2DBL(bb);
89
+ itmp = 1;
90
+ } else {
91
+ Need_Float(argv[argstart]); Need_Float(argv[argstart+1]);
92
+ *epsabs = NUM2DBL(argv[argstart]);
93
+ *epsrel = NUM2DBL(argv[argstart+1]);
94
+ itmp = 2;
95
+ }
96
+ return argstart + itmp;
97
+ }
98
+
99
+ static int get_a_b_epsabs_epsrel(int argc, VALUE *argv, int argstart,
100
+ double *a, double *b, double *epsabs,
101
+ double *epsrel)
102
+ {
103
+ int itmp;
104
+ *epsabs = EPSABS_DEFAULT;
105
+ *epsrel = EPSREL_DEFAULT;
106
+ itmp = get_a_b(argc, argv, argstart, a, b);
107
+ itmp = get_epsabs_epsrel(argc, argv, itmp, epsabs, epsrel);
108
+ return itmp;
109
+ }
110
+
111
+ static int get_limit_key_workspace(int argc, VALUE *argv, int argstart,
112
+ size_t *limit, int *key,
113
+ gsl_integration_workspace **w)
114
+ {
115
+ int flag = 0;
116
+ switch (argc-argstart) {
117
+ case 3:
118
+ CHECK_FIXNUM(argv[argstart]);
119
+ CHECK_FIXNUM(argv[argstart+1]);
120
+ CHECK_WORKSPACE(argv[argstart+2]);
121
+ *limit = FIX2INT(argv[argstart]);
122
+ *key = FIX2INT(argv[argstart+1]);
123
+ Data_Get_Struct(argv[argstart+2], gsl_integration_workspace, *w);
124
+ flag = 0;
125
+ break;
126
+ case 1:
127
+ CHECK_FIXNUM(argv[argstart]);
128
+ *key = FIX2INT(argv[argstart]);
129
+ *limit = LIMIT_DEFAULT;
130
+ *w = gsl_integration_workspace_alloc(*limit);
131
+ flag = 1;
132
+ break;
133
+ case 2:
134
+ if (TYPE(argv[argc-1]) == T_FIXNUM) {
135
+ CHECK_FIXNUM(argv[argc-2]);
136
+ *limit = FIX2INT(argv[argc-2]);
137
+ *key = FIX2INT(argv[argc-1]);
138
+ *w = gsl_integration_workspace_alloc(*limit);
139
+ flag = 1;
140
+ } else {
141
+ CHECK_FIXNUM(argv[argc-2]);
142
+ CHECK_WORKSPACE(argv[argc-1]);
143
+ *key = FIX2INT(argv[argc-2]);
144
+ Data_Get_Struct(argv[argc-1], gsl_integration_workspace, *w);
145
+ *limit = (*w)->limit;
146
+ flag = 0;
147
+ }
148
+ break;
149
+ case 0:
150
+ *key = KEY_DEFAULT;
151
+ *limit = LIMIT_DEFAULT;
152
+ *w = gsl_integration_workspace_alloc(*limit);
153
+ flag = 1;
154
+ break;
155
+ default:
156
+ rb_raise(rb_eArgError, "wrong number of arguments");
157
+ break;
158
+ }
159
+ if (*w == NULL) rb_raise(rb_eRuntimeError, "something wrong with workspace");
160
+ return flag;
161
+ }
162
+
163
+ static int get_limit_workspace(int argc, VALUE *argv, int argstart,
164
+ size_t *limit,
165
+ gsl_integration_workspace **w)
166
+ {
167
+ int flag = 0;
168
+
169
+ switch (argc-argstart) {
170
+ case 2:
171
+ CHECK_FIXNUM(argv[argstart]);
172
+ *limit = FIX2INT(argv[argstart]);
173
+ CHECK_WORKSPACE(argv[argstart+1]);
174
+ Data_Get_Struct(argv[argstart+1], gsl_integration_workspace, *w);
175
+ flag = 0;
176
+ break;
177
+ case 0:
178
+ *limit = LIMIT_DEFAULT;
179
+ *w = gsl_integration_workspace_alloc(*limit);
180
+ flag = 1;
181
+ break;
182
+ case 1:
183
+ switch (TYPE(argv[argstart])) {
184
+ case T_FIXNUM:
185
+ case T_BIGNUM:
186
+ CHECK_FIXNUM(argv[argstart]);
187
+ *limit = FIX2INT(argv[argstart]);
188
+ *w = gsl_integration_workspace_alloc(*limit);
189
+ flag = 1;
190
+ break;
191
+ default:
192
+ CHECK_WORKSPACE(argv[argc-1]);
193
+ Data_Get_Struct(argv[argc-1], gsl_integration_workspace, *w);
194
+ *limit = (*w)->limit;
195
+ flag = 0;
196
+ break;
197
+ }
198
+ break;
199
+ default:
200
+ rb_raise(rb_eArgError, "wrong number of arguments");
201
+ break;
202
+ }
203
+ if (*w == NULL) rb_raise(rb_eRuntimeError, "something wrong with workspace");
204
+ return flag;
205
+ }
206
+
207
+ static int get_epsabs_epsrel_limit_workspace(int argc, VALUE *argv, int argstart,
208
+ double *epsabs, double *epsrel,
209
+ size_t *limit,
210
+ gsl_integration_workspace **w)
211
+ {
212
+ int flag = 0, itmp;
213
+ itmp = argstart;
214
+ *epsabs = EPSABS_DEFAULT;
215
+ *epsrel = EPSREL_DEFAULT;
216
+ *limit = LIMIT_DEFAULT;
217
+ switch (argc-itmp) {
218
+ case 0:
219
+ *w = gsl_integration_workspace_alloc(*limit);
220
+ flag = 1;
221
+ break;
222
+ case 1:
223
+ if (TYPE(argv[itmp]) == T_ARRAY) {
224
+ get_epsabs_epsrel(argc, argv, itmp, epsabs, epsrel);
225
+ *w = gsl_integration_workspace_alloc(*limit);
226
+ flag = 1;
227
+ } else {
228
+ flag = get_limit_workspace(argc, argv, itmp, limit, w);
229
+ }
230
+ break;
231
+ case 2:
232
+ case 3:
233
+ switch (TYPE(argv[itmp])) {
234
+ case T_ARRAY:
235
+ itmp = get_epsabs_epsrel(argc, argv, itmp, epsabs, epsrel);
236
+ flag = get_limit_workspace(argc, argv, itmp, limit, w);
237
+ break;
238
+ case T_FLOAT:
239
+ get_epsabs_epsrel(argc, argv, itmp, epsabs, epsrel);
240
+ *w = gsl_integration_workspace_alloc(*limit);
241
+ flag = 1;
242
+ break;
243
+ default:
244
+ flag = get_limit_workspace(argc, argv, itmp, limit, w);
245
+ break;
246
+ }
247
+ break;
248
+ case 4:
249
+ itmp = get_epsabs_epsrel(argc, argv, itmp, epsabs, epsrel);
250
+ flag = get_limit_workspace(argc, argv, itmp, limit, w);
251
+ break;
252
+ default:
253
+ rb_raise(rb_eArgError, "wrong number of arguments");
254
+ break;
255
+ }
256
+ if (*w == NULL) rb_raise(rb_eRuntimeError, "something wrong with workspace");
257
+ return flag;
258
+ }
259
+
260
+ static VALUE rb_gsl_integration_qng(int argc, VALUE *argv, VALUE obj)
261
+ {
262
+ double a, b, epsabs = EPSABS_DEFAULT, epsrel = EPSREL_DEFAULT;
263
+ double result, abserr;
264
+ size_t neval;
265
+ gsl_function *F = NULL;
266
+ int status, itmp;
267
+
268
+ if (argc < 1) rb_raise(rb_eArgError,
269
+ "wrong number of arguments (%d for >= 1)", argc);
270
+
271
+ switch (TYPE(obj)) {
272
+ case T_MODULE: case T_CLASS: case T_OBJECT:
273
+ CHECK_FUNCTION(argv[0]);
274
+ Data_Get_Struct(argv[0], gsl_function, F);
275
+ itmp = get_a_b_epsabs_epsrel(argc, argv, 1, &a, &b, &epsabs, &epsrel);
276
+ break;
277
+ default:
278
+ itmp = get_a_b_epsabs_epsrel(argc, argv, 0, &a, &b, &epsabs, &epsrel);
279
+ Data_Get_Struct(obj, gsl_function, F);
280
+ break;
281
+ }
282
+ status = gsl_integration_qng(F, a, b, epsabs, epsrel,
283
+ &result, &abserr, &neval);
284
+
285
+ return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr),
286
+ INT2FIX(neval), INT2FIX(status));
287
+ }
288
+
289
+ static VALUE rb_gsl_integration_qag(int argc, VALUE *argv, VALUE obj)
290
+ {
291
+ double a, b, epsabs = EPSABS_DEFAULT, epsrel = EPSREL_DEFAULT;
292
+ double result, abserr;
293
+ size_t limit = LIMIT_DEFAULT;
294
+ gsl_function *F = NULL;
295
+ gsl_integration_workspace *w = NULL;
296
+ int key = KEY_DEFAULT, status, intervals, itmp, flag = 0;
297
+ if (argc < 1) rb_raise(rb_eArgError,
298
+ "wrong number of arguments (%d for >= 1)", argc);
299
+
300
+ switch (TYPE(obj)) {
301
+ case T_MODULE: case T_CLASS: case T_OBJECT:
302
+ CHECK_FUNCTION(argv[0]);
303
+ Data_Get_Struct(argv[0], gsl_function, F);
304
+ if (argc == 3) {
305
+ CHECK_FIXNUM(argv[2]);
306
+ get_a_b(argc, argv, 1, &a, &b);
307
+ key = FIX2INT(argv[2]);
308
+ w = gsl_integration_workspace_alloc(limit);
309
+ flag = 1;
310
+ } else if (argc == 4) {
311
+ CHECK_FIXNUM(argv[3]);
312
+ get_a_b(argc, argv, 1, &a, &b);
313
+ key = FIX2INT(argv[3]);
314
+ w = gsl_integration_workspace_alloc(limit);
315
+ flag = 1;
316
+ } else {
317
+ itmp = get_a_b_epsabs_epsrel(argc, argv, 1, &a, &b, &epsabs, &epsrel);
318
+ flag = get_limit_key_workspace(argc, argv, itmp, &limit, &key, &w);
319
+ }
320
+ break;
321
+ default:
322
+ if (argc == 2) {
323
+ if (FIXNUM_P(argv[1])) {
324
+ key = FIX2INT(argv[1]);
325
+ w = gsl_integration_workspace_alloc(limit);
326
+ flag = 1;
327
+ } else if (rb_obj_is_kind_of(argv[1], cgsl_integration_workspace)) {
328
+ Data_Get_Struct(argv[1], gsl_integration_workspace, w);
329
+ flag = 0;
330
+ } else {
331
+ rb_raise(rb_eTypeError, "Key or Workspace expected");
332
+ }
333
+ itmp = get_a_b(argc, argv, 0, &a, &b);
334
+ } else if (argc == 3) {
335
+ if (FIXNUM_P(argv[2])) {
336
+ key = FIX2INT(argv[2]);
337
+ w = gsl_integration_workspace_alloc(limit);
338
+ flag = 1;
339
+ } else if (rb_obj_is_kind_of(argv[2], cgsl_integration_workspace)) {
340
+ Data_Get_Struct(argv[2], gsl_integration_workspace, w);
341
+ flag = 0;
342
+ } else {
343
+ rb_raise(rb_eTypeError, "Key or Workspace expected");
344
+ }
345
+ itmp = get_a_b(argc, argv, 0, &a, &b);
346
+ } else {
347
+ itmp = get_a_b_epsabs_epsrel(argc, argv, 0, &a, &b, &epsabs, &epsrel);
348
+ flag = get_limit_key_workspace(argc, argv, itmp, &limit, &key, &w);
349
+ }
350
+ Data_Get_Struct(obj, gsl_function, F);
351
+ break;
352
+ }
353
+ status = gsl_integration_qag(F, a, b, epsabs, epsrel, limit, key, w,
354
+ &result, &abserr);
355
+ intervals = w->size;
356
+ if (flag == 1) gsl_integration_workspace_free(w);
357
+
358
+ return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr),
359
+ INT2FIX(intervals), INT2FIX(status));
360
+ }
361
+
362
+ static VALUE rb_gsl_integration_qags(int argc, VALUE *argv, VALUE obj)
363
+ {
364
+ double a, b, epsabs = EPSABS_DEFAULT, epsrel = EPSREL_DEFAULT;
365
+ double result, abserr;
366
+ size_t limit = LIMIT_DEFAULT;
367
+ gsl_function *F = NULL;
368
+ gsl_integration_workspace *w = NULL;
369
+ int status, intervals, flag = 0, itmp;
370
+ switch (TYPE(obj)) {
371
+ case T_MODULE: case T_CLASS: case T_OBJECT:
372
+ CHECK_FUNCTION(argv[0]);
373
+ Data_Get_Struct(argv[0], gsl_function, F);
374
+ itmp = get_a_b(argc, argv, 1, &a, &b);
375
+ break;
376
+ default:
377
+ Data_Get_Struct(obj, gsl_function, F);
378
+ itmp = get_a_b(argc, argv, 0, &a, &b);
379
+ break;
380
+ }
381
+ flag = get_epsabs_epsrel_limit_workspace(argc, argv, itmp, &epsabs, &epsrel,
382
+ &limit, &w);
383
+
384
+ status = gsl_integration_qags(F, a, b, epsabs, epsrel, limit, w,
385
+ &result, &abserr);
386
+ intervals = w->size;
387
+ if (flag == 1) gsl_integration_workspace_free(w);
388
+
389
+ return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr),
390
+ INT2FIX(intervals), INT2FIX(status));
391
+ }
392
+
393
+ static VALUE rb_gsl_integration_qagp(int argc, VALUE *argv, VALUE obj)
394
+ {
395
+ double epsabs, epsrel;
396
+ double result, abserr;
397
+ size_t limit;
398
+ gsl_function *F = NULL;
399
+ gsl_vector *v = NULL;
400
+ gsl_integration_workspace *w = NULL;
401
+ int status, intervals, flag = 0, flag2 = 0, itmp;
402
+ switch (TYPE(obj)) {
403
+ case T_MODULE: case T_CLASS: case T_OBJECT:
404
+ CHECK_FUNCTION(argv[0]);
405
+ Data_Get_Struct(argv[0], gsl_function, F);
406
+ itmp = 1;
407
+ break;
408
+ default:
409
+ Data_Get_Struct(obj, gsl_function, F);
410
+ itmp = 0;
411
+ break;
412
+ }
413
+ if (TYPE(argv[itmp]) == T_ARRAY) {
414
+ v = make_cvector_from_rarray(argv[itmp]);
415
+ flag2 = 1;
416
+ } else {
417
+ Data_Get_Vector(argv[itmp], v);
418
+ flag2 = 0;
419
+ }
420
+ itmp += 1;
421
+ flag = get_epsabs_epsrel_limit_workspace(argc, argv, itmp, &epsabs, &epsrel,
422
+ &limit, &w);
423
+
424
+ status = gsl_integration_qagp(F, v->data, v->size, epsabs, epsrel, limit, w,
425
+ &result, &abserr);
426
+ intervals = w->size;
427
+ if (flag == 1) gsl_integration_workspace_free(w);
428
+ if (flag2 == 1) gsl_vector_free(v);
429
+
430
+ return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr),
431
+ INT2FIX(intervals), INT2FIX(status));
432
+ }
433
+
434
+ /* (-infty --- +infty) */
435
+ static VALUE rb_gsl_integration_qagi(int argc, VALUE *argv, VALUE obj)
436
+ {
437
+ double epsabs, epsrel;
438
+ double result, abserr;
439
+ size_t limit;
440
+ gsl_function *F = NULL;
441
+ gsl_integration_workspace *w = NULL;
442
+ int status, intervals, flag = 0, itmp;
443
+ switch (TYPE(obj)) {
444
+ case T_MODULE: case T_CLASS: case T_OBJECT:
445
+ CHECK_FUNCTION(argv[0]);
446
+ Data_Get_Struct(argv[0], gsl_function, F);
447
+ itmp = 1;
448
+ break;
449
+ default:
450
+ Data_Get_Struct(obj, gsl_function, F);
451
+ itmp = 0;
452
+ break;
453
+ }
454
+ flag = get_epsabs_epsrel_limit_workspace(argc, argv, itmp, &epsabs, &epsrel,
455
+ &limit, &w);
456
+ status = gsl_integration_qagi(F, epsabs, epsrel, limit, w,
457
+ &result, &abserr);
458
+ intervals = w->size;
459
+ if (flag == 1) gsl_integration_workspace_free(w);
460
+
461
+ return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr),
462
+ INT2FIX(intervals), INT2FIX(status));
463
+ }
464
+
465
+ /* (a --- +infty) */
466
+ static VALUE rb_gsl_integration_qagiu(int argc, VALUE *argv, VALUE obj)
467
+ {
468
+ double a, epsabs, epsrel;
469
+ double result, abserr;
470
+ size_t limit;
471
+ gsl_function *F = NULL;
472
+ gsl_integration_workspace *w = NULL;
473
+ int status, intervals, flag = 0, itmp;
474
+ switch (TYPE(obj)) {
475
+ case T_MODULE: case T_CLASS: case T_OBJECT:
476
+ CHECK_FUNCTION(argv[0]);
477
+ Data_Get_Struct(argv[0], gsl_function, F);
478
+ itmp = 1;
479
+ break;
480
+ default:
481
+ Data_Get_Struct(obj, gsl_function, F);
482
+ itmp = 0;
483
+ break;
484
+ }
485
+ Need_Float(argv[itmp]);
486
+ a = NUM2DBL(argv[itmp]);
487
+ itmp += 1;
488
+ flag = get_epsabs_epsrel_limit_workspace(argc, argv, itmp, &epsabs, &epsrel,
489
+ &limit, &w);
490
+ status = gsl_integration_qagiu(F, a, epsabs, epsrel, limit, w,
491
+ &result, &abserr);
492
+ intervals = w->size;
493
+ if (flag == 1) gsl_integration_workspace_free(w);
494
+
495
+ return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr),
496
+ INT2FIX(intervals), INT2FIX(status));
497
+ }
498
+
499
+ /* (-infty --- b) */
500
+ static VALUE rb_gsl_integration_qagil(int argc, VALUE *argv, VALUE obj)
501
+ {
502
+ double b, epsabs, epsrel;
503
+ double result, abserr;
504
+ size_t limit;
505
+ gsl_function *F = NULL;
506
+ gsl_integration_workspace *w = NULL;
507
+ int status, intervals, flag = 0, itmp;
508
+ switch (TYPE(obj)) {
509
+ case T_MODULE: case T_CLASS: case T_OBJECT:
510
+ CHECK_FUNCTION(argv[0]);
511
+ Data_Get_Struct(argv[0], gsl_function, F);
512
+ itmp = 1;
513
+ break;
514
+ default:
515
+ Data_Get_Struct(obj, gsl_function, F);
516
+ itmp = 0;
517
+ break;
518
+ }
519
+ Need_Float(argv[itmp]);
520
+ b = NUM2DBL(argv[itmp]);
521
+ flag = get_epsabs_epsrel_limit_workspace(argc, argv, itmp+1, &epsabs, &epsrel,
522
+ &limit, &w);
523
+ Data_Get_Struct(obj, gsl_function, F);
524
+
525
+ status = gsl_integration_qagil(F, b, epsabs, epsrel, limit, w,
526
+ &result, &abserr);
527
+ intervals = w->size;
528
+ if (flag == 1) gsl_integration_workspace_free(w);
529
+
530
+ return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr),
531
+ INT2FIX(intervals), INT2FIX(status));
532
+ }
533
+
534
+ static VALUE rb_gsl_integration_qawc(int argc, VALUE *argv, VALUE obj)
535
+ {
536
+ double a, b, c, epsabs, epsrel;
537
+ double result, abserr;
538
+ size_t limit;
539
+ gsl_function *F = NULL;
540
+ gsl_integration_workspace *w = NULL;
541
+ int status, intervals, itmp, flag = 0;
542
+ switch (TYPE(obj)) {
543
+ case T_MODULE: case T_CLASS: case T_OBJECT:
544
+ CHECK_FUNCTION(argv[0]);
545
+ Data_Get_Struct(argv[0], gsl_function, F);
546
+ itmp = 1;
547
+ break;
548
+ default:
549
+ Data_Get_Struct(obj, gsl_function, F);
550
+ itmp = 0;
551
+ break;
552
+ }
553
+ itmp = get_a_b(argc, argv, itmp, &a, &b);
554
+ if (argc-itmp <= 0) rb_raise(rb_eArgError, "The pole is not given");
555
+ Need_Float(argv[itmp]);
556
+ c = NUM2DBL(argv[itmp]);
557
+ flag = get_epsabs_epsrel_limit_workspace(argc, argv, itmp+1, &epsabs, &epsrel,
558
+ &limit, &w);
559
+ status = gsl_integration_qawc(F, a, b, c, epsabs, epsrel, limit, w, &result, &abserr);
560
+ intervals = w->size;
561
+ if (flag == 1) gsl_integration_workspace_free(w);
562
+
563
+ return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr), INT2FIX(intervals),
564
+ INT2FIX(status));
565
+ }
566
+
567
+ VALUE rb_gsl_integration_qaws_table_alloc(int argc, VALUE *argv, VALUE klass)
568
+ {
569
+ gsl_integration_qaws_table *t = NULL;
570
+ VALUE alpha, beta, mu, nu;
571
+
572
+ if (TYPE(argv[0]) == T_ARRAY) {
573
+ alpha = rb_ary_entry(argv[0], 0);
574
+ beta = rb_ary_entry(argv[0], 1);
575
+ mu = rb_ary_entry(argv[0], 2);
576
+ nu = rb_ary_entry(argv[0], 3);
577
+ } else {
578
+ Need_Float(argv[0]); Need_Float(argv[1]);
579
+ CHECK_FIXNUM(argv[2]); CHECK_FIXNUM(argv[3]);
580
+ alpha = argv[0];
581
+ beta = argv[1];
582
+ mu = argv[2];
583
+ nu = argv[3];
584
+ }
585
+ t = gsl_integration_qaws_table_alloc(NUM2DBL(alpha), NUM2DBL(beta),
586
+ FIX2INT(mu), FIX2INT(nu));
587
+ return Data_Wrap_Struct(klass, 0, gsl_integration_qaws_table_free, t);
588
+ }
589
+
590
+ static VALUE rb_gsl_integration_qaws_table_set(int argc, VALUE *argv, VALUE obj)
591
+ {
592
+ gsl_integration_qaws_table *t = NULL;
593
+ double alpha, beta;
594
+ int mu, nu, type;
595
+ if (argc != 1 && argc != 4)
596
+ rb_raise(rb_eArgError, "wrong number of argument (%d for 1 or 3)", argc);
597
+ type = TYPE(argv[0]);
598
+ Data_Get_Struct(obj, gsl_integration_qaws_table, t);
599
+
600
+ if (type == T_FIXNUM || type == T_BIGNUM || type == T_FLOAT) {
601
+ alpha = NUM2DBL(argv[0]);
602
+ beta = NUM2DBL(argv[1]);
603
+ mu = FIX2INT(argv[2]);
604
+ nu = FIX2INT(argv[3]);
605
+ } else if (type == T_ARRAY) {
606
+ alpha = NUM2DBL(rb_ary_entry(argv[0], 0));
607
+ beta = NUM2DBL(rb_ary_entry(argv[0], 1));
608
+ mu = FIX2INT(rb_ary_entry(argv[0], 2));
609
+ nu = FIX2INT(rb_ary_entry(argv[0], 3));
610
+ } else {
611
+ rb_raise(rb_eTypeError, "wrong argument type %s", rb_class2name(CLASS_OF(argv[0])));
612
+ }
613
+
614
+ gsl_integration_qaws_table_set(t, alpha, beta, mu, nu);
615
+ return obj;
616
+ }
617
+
618
+ static VALUE rb_gsl_integration_qaws_table_to_a(VALUE obj)
619
+ {
620
+ gsl_integration_qaws_table *t = NULL;
621
+ VALUE ary;
622
+ Data_Get_Struct(obj, gsl_integration_qaws_table, t);
623
+ ary = rb_ary_new2(4);
624
+ rb_ary_store(ary, 0, rb_float_new(t->alpha));
625
+ rb_ary_store(ary, 1, rb_float_new(t->beta));
626
+ rb_ary_store(ary, 2, INT2FIX(t->mu));
627
+ rb_ary_store(ary, 3, INT2FIX(t->nu));
628
+ return ary;
629
+ }
630
+
631
+ static gsl_integration_qaws_table* make_qaws_table(VALUE ary);
632
+ static VALUE rb_gsl_ary_to_integration_qaws_table(VALUE ary)
633
+ {
634
+ gsl_integration_qaws_table *t = NULL;
635
+ t = make_qaws_table(ary);
636
+ return Data_Wrap_Struct(cgsl_integration_qaws_table,
637
+ 0, gsl_integration_qaws_table_free, t);
638
+ }
639
+
640
+ static gsl_integration_qaws_table* make_qaws_table(VALUE ary)
641
+ {
642
+ double alpha, beta;
643
+ int mu, nu;
644
+ alpha = NUM2DBL(rb_ary_entry(ary, 0));
645
+ beta = NUM2DBL(rb_ary_entry(ary, 1));
646
+ mu = FIX2INT(rb_ary_entry(ary, 2));
647
+ nu = FIX2INT(rb_ary_entry(ary, 3));
648
+ return gsl_integration_qaws_table_alloc(alpha, beta, mu, nu);
649
+ }
650
+
651
+ static VALUE rb_gsl_integration_qaws(int argc, VALUE *argv, VALUE obj)
652
+ {
653
+ double a, b, epsabs, epsrel;
654
+ double result, abserr;
655
+ size_t limit;
656
+ gsl_function *F = NULL;
657
+ gsl_integration_workspace *w = NULL;
658
+ gsl_integration_qaws_table *t = NULL;
659
+ int status, intervals, itmp, flag = 0, flagt = 0;
660
+ switch (TYPE(obj)) {
661
+ case T_MODULE: case T_CLASS: case T_OBJECT:
662
+ if (argc < 2) rb_raise(rb_eArgError, "too few arguments");
663
+ CHECK_FUNCTION(argv[0]);
664
+ Data_Get_Struct(argv[0], gsl_function, F);
665
+ itmp = 1;
666
+ break;
667
+ default:
668
+ if (argc < 1) rb_raise(rb_eArgError, "too few arguments");
669
+ Data_Get_Struct(obj, gsl_function, F);
670
+ itmp = 0;
671
+ break;
672
+ }
673
+ itmp = get_a_b(argc, argv, itmp, &a, &b);
674
+
675
+ if (TYPE(argv[itmp]) == T_ARRAY) {
676
+ flagt = 1;
677
+ t = make_qaws_table(argv[itmp]);
678
+ } else {
679
+ flagt = 0;
680
+ if (!rb_obj_is_kind_of(argv[itmp], cgsl_integration_qaws_table))
681
+ rb_raise(rb_eTypeError, "Integration::QAWS_Table expected");
682
+
683
+ Data_Get_Struct(argv[itmp], gsl_integration_qaws_table, t);
684
+ }
685
+ flag = get_epsabs_epsrel_limit_workspace(argc, argv, itmp+1, &epsabs, &epsrel,
686
+ &limit, &w);
687
+ status = gsl_integration_qaws(F, a, b, t, epsabs, epsrel, limit, w, &result, &abserr);
688
+ intervals = w->size;
689
+ if (flag == 1) gsl_integration_workspace_free(w);
690
+ if (flagt == 1) gsl_integration_qaws_table_free(t);
691
+
692
+ return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr), INT2FIX(intervals),
693
+ INT2FIX(status));
694
+ }
695
+
696
+ static gsl_integration_qawo_table* make_qawo_table(VALUE ary);
697
+
698
+ static VALUE rb_gsl_integration_qawo_table_alloc(int argc, VALUE *argv,
699
+ VALUE klass)
700
+ {
701
+ gsl_integration_qawo_table *t = NULL;
702
+ double omega, L;
703
+ enum gsl_integration_qawo_enum sine;
704
+ size_t n;
705
+ if (argc != 1 && argc != 4)
706
+ rb_raise(rb_eArgError, "wrong nubmer of arguments (%d for 1 or 4)", argc);
707
+
708
+ if (TYPE(argv[0]) == T_ARRAY) {
709
+ omega = NUM2DBL(rb_ary_entry(argv[0], 0));
710
+ L = NUM2DBL(rb_ary_entry(argv[0], 1));
711
+ sine = FIX2INT(rb_ary_entry(argv[0], 2));
712
+ n = FIX2INT(rb_ary_entry(argv[0], 3));
713
+ } else {
714
+ omega = NUM2DBL(argv[0]);
715
+ L = NUM2DBL(argv[1]);
716
+ sine = FIX2INT(argv[2]);
717
+ n = FIX2INT(argv[3]);
718
+ }
719
+
720
+ t = gsl_integration_qawo_table_alloc(omega, L, sine, n);
721
+
722
+ return Data_Wrap_Struct(klass, 0, gsl_integration_qawo_table_free, t);
723
+ }
724
+
725
+ static VALUE rb_gsl_integration_qawo_table_to_a(VALUE obj)
726
+ {
727
+ gsl_integration_qawo_table *t = NULL;
728
+ VALUE ary;
729
+ Data_Get_Struct(obj, gsl_integration_qawo_table, t);
730
+ ary = rb_ary_new2(4);
731
+ rb_ary_store(ary, 0, rb_float_new(t->omega));
732
+ rb_ary_store(ary, 1, rb_float_new(t->L));
733
+ rb_ary_store(ary, 2, INT2FIX(t->sine));
734
+ rb_ary_store(ary, 3, INT2FIX(t->n));
735
+ return ary;
736
+ }
737
+
738
+ static VALUE rb_gsl_ary_to_integration_qawo_table(VALUE ary)
739
+ {
740
+ gsl_integration_qawo_table *t = NULL;
741
+ t = make_qawo_table(ary);
742
+ return Data_Wrap_Struct(cgsl_integration_qawo_table,
743
+ 0, gsl_integration_qawo_table_free, t);
744
+ }
745
+
746
+ static gsl_integration_qawo_table* make_qawo_table(VALUE ary)
747
+ {
748
+ double omega, L;
749
+ enum gsl_integration_qawo_enum sine;
750
+ size_t n;
751
+ omega = NUM2DBL(rb_ary_entry(ary, 0));
752
+ L = NUM2DBL(rb_ary_entry(ary, 1));
753
+ sine = FIX2INT(rb_ary_entry(ary, 2));
754
+ n = FIX2INT(rb_ary_entry(ary, 3));
755
+ return gsl_integration_qawo_table_alloc(omega, L, sine, n);
756
+ }
757
+
758
+ static VALUE rb_gsl_integration_qawo_table_set(int argc, VALUE *argv, VALUE obj)
759
+ {
760
+ gsl_integration_qawo_table *t = NULL;
761
+ double omega, L;
762
+ enum gsl_integration_qawo_enum sine;
763
+ int type;
764
+ if (argc != 1 && argc != 3)
765
+ rb_raise(rb_eArgError, "wrong number of argument (%d for 1 or 3)", argc);
766
+ type = TYPE(argv[0]);
767
+ Data_Get_Struct(obj, gsl_integration_qawo_table, t);
768
+ if (type == T_FIXNUM || type == T_BIGNUM || type == T_FLOAT) {
769
+ omega = NUM2DBL(argv[0]);
770
+ L = NUM2DBL(argv[1]);
771
+ sine = FIX2INT(argv[2]);
772
+ } else if (type == T_ARRAY) {
773
+ omega = NUM2DBL(rb_ary_entry(argv[0], 0));
774
+ L = NUM2DBL(rb_ary_entry(argv[0], 1));
775
+ sine = FIX2INT(rb_ary_entry(argv[0], 2));
776
+ } else {
777
+ rb_raise(rb_eTypeError, "wrong argument type %s", rb_class2name(CLASS_OF(argv[0])));
778
+ }
779
+ gsl_integration_qawo_table_set(t, omega, L, sine);
780
+ return obj;
781
+ }
782
+
783
+ static VALUE rb_gsl_integration_qawo_table_set_length(VALUE obj, VALUE L)
784
+ {
785
+ gsl_integration_qawo_table *t = NULL;
786
+ Need_Float(L);
787
+ Data_Get_Struct(obj, gsl_integration_qawo_table, t);
788
+ gsl_integration_qawo_table_set_length(t, NUM2DBL(L));
789
+ return obj;
790
+ }
791
+
792
+ static int get_qawo_table(VALUE tt, gsl_integration_qawo_table **t);
793
+
794
+ static VALUE rb_gsl_integration_qawo(int argc, VALUE *argv, VALUE obj)
795
+ {
796
+ double a, epsabs, epsrel;
797
+ double result, abserr;
798
+ size_t limit;
799
+ gsl_function *F = NULL;
800
+ gsl_integration_workspace *w = NULL;
801
+ gsl_integration_qawo_table *t = NULL;
802
+ int status, intervals, itmp, flag = 0, flagt = 0;
803
+ switch (TYPE(obj)) {
804
+ case T_MODULE: case T_CLASS: case T_OBJECT:
805
+ if (argc < 2) rb_raise(rb_eArgError, "too few arguments");
806
+ CHECK_FUNCTION(argv[0]);
807
+ Data_Get_Struct(argv[0], gsl_function, F);
808
+ itmp = 1;
809
+ break;
810
+ default:
811
+ if (argc < 1) rb_raise(rb_eArgError, "too few arguments");
812
+ Data_Get_Struct(obj, gsl_function, F);
813
+ itmp = 0;
814
+ break;
815
+ }
816
+ Need_Float(argv[itmp]);
817
+ a = NUM2DBL(argv[itmp]);
818
+ flagt = get_qawo_table(argv[argc-1], &t);
819
+ flag = get_epsabs_epsrel_limit_workspace(argc-1, argv, itmp+1, &epsabs, &epsrel,
820
+ &limit, &w);
821
+ status = gsl_integration_qawo(F, a, epsabs, epsrel, limit, w, t, &result, &abserr);
822
+ intervals = w->size;
823
+ if (flag == 1) gsl_integration_workspace_free(w);
824
+ if (flagt == 1) gsl_integration_qawo_table_free(t);
825
+
826
+ return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr), INT2FIX(intervals),
827
+ INT2FIX(status));
828
+ }
829
+
830
+ static int get_qawo_table(VALUE tt,
831
+ gsl_integration_qawo_table **t)
832
+ {
833
+ int flagt;
834
+
835
+ if (TYPE(tt) == T_ARRAY) {
836
+ flagt = 1;
837
+ *t = make_qawo_table(tt);
838
+ } else {
839
+ flagt = 0;
840
+ if (!rb_obj_is_kind_of(tt, cgsl_integration_qawo_table))
841
+ rb_raise(rb_eTypeError, "Integration::QAWO_Table expected");
842
+ Data_Get_Struct(tt, gsl_integration_qawo_table, *t);
843
+ }
844
+ return flagt;
845
+ }
846
+
847
+ static VALUE rb_gsl_integration_qawf(int argc, VALUE *argv, VALUE obj)
848
+ {
849
+ double a, epsabs = EPSREL_DEFAULT;
850
+ double result, abserr;
851
+ size_t limit = LIMIT_DEFAULT;
852
+ gsl_function *F = NULL;
853
+ gsl_integration_workspace *w = NULL, *cw = NULL;
854
+ gsl_integration_qawo_table *t = NULL;
855
+ int status, intervals, flag = 0, flagt = 0, itmp;
856
+ VALUE *vtmp;
857
+ switch (TYPE(obj)) {
858
+ case T_MODULE: case T_CLASS: case T_OBJECT:
859
+ if (argc < 2) rb_raise(rb_eArgError, "too few arguments");
860
+ CHECK_FUNCTION(argv[0]);
861
+ Data_Get_Struct(argv[0], gsl_function, F);
862
+ itmp = 1;
863
+ break;
864
+ default:
865
+ if (argc < 1) rb_raise(rb_eArgError, "too few arguments");
866
+ Data_Get_Struct(obj, gsl_function, F);
867
+ itmp = 0;
868
+ break;
869
+ }
870
+ Need_Float(argv[itmp]);
871
+ a = NUM2DBL(argv[itmp]);
872
+ itmp += 1;
873
+ if (TYPE(argv[itmp]) == T_FLOAT) {
874
+ epsabs = NUM2DBL(argv[itmp]);
875
+ itmp += 1;
876
+ }
877
+ vtmp = argv + itmp;
878
+ flagt = get_qawo_table(argv[argc-1], &t);
879
+
880
+ switch (argc - 1 - itmp) {
881
+ case 0:
882
+ w = gsl_integration_workspace_alloc(limit);
883
+ cw = gsl_integration_workspace_alloc(limit);
884
+ flag = 1;
885
+ break;
886
+ case 1:
887
+ CHECK_FIXNUM(vtmp[0]);
888
+ limit = FIX2INT(vtmp[0]);
889
+ w = gsl_integration_workspace_alloc(limit);
890
+ cw = gsl_integration_workspace_alloc(limit);
891
+ flag = 1;
892
+ break;
893
+ case 2:
894
+ CHECK_WORKSPACE(vtmp[0]); CHECK_WORKSPACE(vtmp[1]);
895
+ Data_Get_Struct(vtmp[0], gsl_integration_workspace, w);
896
+ Data_Get_Struct(vtmp[1], gsl_integration_workspace, cw);
897
+ flag = 0;
898
+ break;
899
+ case 3:
900
+ CHECK_FIXNUM(vtmp[0]);
901
+ CHECK_WORKSPACE(vtmp[1]); CHECK_WORKSPACE(vtmp[2]);
902
+ limit = FIX2INT(vtmp[0]);
903
+ Data_Get_Struct(vtmp[1], gsl_integration_workspace, w);
904
+ Data_Get_Struct(vtmp[2], gsl_integration_workspace, cw);
905
+ flag = 0;
906
+ break;
907
+ default:
908
+ rb_raise(rb_eArgError, "wrong number of arguments");
909
+ break;
910
+ }
911
+
912
+ status = gsl_integration_qawf(F, a, epsabs, limit, w, cw, t, &result, &abserr);
913
+ intervals = w->size;
914
+ if (flag == 1) {
915
+ gsl_integration_workspace_free(w);
916
+ gsl_integration_workspace_free(cw);
917
+ }
918
+ if (flagt == 1) gsl_integration_qawo_table_free(t);
919
+
920
+ return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr),
921
+ INT2FIX(intervals), INT2FIX(status));
922
+ }
923
+
924
+
925
+ static void rb_gsl_integration_define_symbols(VALUE module)
926
+ {
927
+ rb_define_const(module, "GAUSS15", INT2FIX(GSL_INTEG_GAUSS15));
928
+ rb_define_const(module, "GAUSS21", INT2FIX(GSL_INTEG_GAUSS21));
929
+ rb_define_const(module, "GAUSS31", INT2FIX(GSL_INTEG_GAUSS31));
930
+ rb_define_const(module, "GAUSS41", INT2FIX(GSL_INTEG_GAUSS41));
931
+ rb_define_const(module, "GAUSS51", INT2FIX(GSL_INTEG_GAUSS51));
932
+ rb_define_const(module, "GAUSS61", INT2FIX(GSL_INTEG_GAUSS61));
933
+ rb_define_const(module, "COSINE", INT2FIX(GSL_INTEG_COSINE));
934
+ rb_define_const(module, "SINE", INT2FIX(GSL_INTEG_SINE));
935
+ }
936
+
937
+ static VALUE rb_gsl_integration_workspace_alloc(int argc, VALUE *argv,
938
+ VALUE klass)
939
+ {
940
+ size_t limit;
941
+ if (argc == 1) limit = FIX2INT(argv[0]);
942
+ else limit = LIMIT_DEFAULT;
943
+ return Data_Wrap_Struct(klass, 0,
944
+ gsl_integration_workspace_free,
945
+ gsl_integration_workspace_alloc(limit));
946
+ }
947
+
948
+ static VALUE rb_gsl_integration_workspace_limit(VALUE obj)
949
+ {
950
+ gsl_integration_workspace *w = NULL;
951
+ Data_Get_Struct(obj, gsl_integration_workspace, w);
952
+ return INT2FIX(w->limit);
953
+ }
954
+
955
+ static VALUE rb_gsl_integration_workspace_size(VALUE obj)
956
+ {
957
+ gsl_integration_workspace *w = NULL;
958
+ Data_Get_Struct(obj, gsl_integration_workspace, w);
959
+ return INT2FIX(w->size);
960
+ }
961
+
962
+ static VALUE rb_gsl_integration_workspace_nrmax(VALUE obj)
963
+ {
964
+ gsl_integration_workspace *w = NULL;
965
+ Data_Get_Struct(obj, gsl_integration_workspace, w);
966
+ return INT2FIX(w->nrmax);
967
+ }
968
+
969
+ static VALUE rb_gsl_integration_workspace_i(VALUE obj)
970
+ {
971
+ gsl_integration_workspace *w = NULL;
972
+ Data_Get_Struct(obj, gsl_integration_workspace, w);
973
+ return INT2FIX(w->i);
974
+ }
975
+
976
+ static VALUE rb_gsl_integration_workspace_maximum_level(VALUE obj)
977
+ {
978
+ gsl_integration_workspace *w = NULL;
979
+ Data_Get_Struct(obj, gsl_integration_workspace, w);
980
+ return INT2FIX(w->maximum_level);
981
+ }
982
+
983
+ static VALUE rb_gsl_integration_workspace_to_a(VALUE obj)
984
+ {
985
+ gsl_integration_workspace *w = NULL;
986
+ Data_Get_Struct(obj, gsl_integration_workspace, w);
987
+ return rb_ary_new3(5, INT2FIX(w->limit), INT2FIX(w->size), INT2FIX(w->nrmax),
988
+ INT2FIX(w->i), INT2FIX(w->maximum_level));
989
+ }
990
+
991
+ static VALUE rb_gsl_integration_workspace_alist(VALUE obj)
992
+ {
993
+ gsl_integration_workspace *w = NULL;
994
+ gsl_vector_view *v = NULL;
995
+ Data_Get_Struct(obj, gsl_integration_workspace, w);
996
+ v = rb_gsl_make_vector_view(w->alist, w->limit, 1);
997
+ return Data_Wrap_Struct(cgsl_vector_view_ro, 0, free, v);
998
+ }
999
+
1000
+ static VALUE rb_gsl_integration_workspace_blist(VALUE obj)
1001
+ {
1002
+ gsl_integration_workspace *w = NULL;
1003
+ gsl_vector_view *v = NULL;
1004
+
1005
+ Data_Get_Struct(obj, gsl_integration_workspace, w);
1006
+ v = rb_gsl_make_vector_view(w->blist, w->limit, 1);
1007
+ return Data_Wrap_Struct(cgsl_vector_view_ro, 0, free, v);
1008
+ }
1009
+
1010
+ static VALUE rb_gsl_integration_workspace_rlist(VALUE obj)
1011
+ {
1012
+ gsl_integration_workspace *w = NULL;
1013
+ gsl_vector_view *v = NULL;
1014
+ Data_Get_Struct(obj, gsl_integration_workspace, w);
1015
+ v = rb_gsl_make_vector_view(w->rlist, w->limit, 1);
1016
+ return Data_Wrap_Struct(cgsl_vector_view_ro, 0, free, v);
1017
+ }
1018
+
1019
+ static VALUE rb_gsl_integration_workspace_elist(VALUE obj)
1020
+ {
1021
+ gsl_integration_workspace *w = NULL;
1022
+ gsl_vector_view *v = NULL;
1023
+ Data_Get_Struct(obj, gsl_integration_workspace, w);
1024
+ v = rb_gsl_make_vector_view(w->elist, w->limit, 1);
1025
+ return Data_Wrap_Struct(cgsl_vector_view_ro, 0, free, v);
1026
+ }
1027
+
1028
+ void Init_gsl_integration(VALUE module)
1029
+ {
1030
+ VALUE mgsl_integ;
1031
+
1032
+ mgsl_integ = rb_define_module_under(module, "Integration");
1033
+ rb_gsl_integration_define_symbols(mgsl_integ);
1034
+
1035
+ rb_define_method(cgsl_function, "integration_qng", rb_gsl_integration_qng, -1);
1036
+ rb_define_method(cgsl_function, "integration_qag", rb_gsl_integration_qag, -1);
1037
+ rb_define_method(cgsl_function, "integration_qags", rb_gsl_integration_qags, -1);
1038
+ rb_define_method(cgsl_function, "integration_qagp", rb_gsl_integration_qagp, -1);
1039
+ rb_define_method(cgsl_function, "integration_qagi", rb_gsl_integration_qagi, -1);
1040
+ rb_define_method(cgsl_function, "integration_qagiu", rb_gsl_integration_qagiu, -1);
1041
+ rb_define_method(cgsl_function, "integration_qagil", rb_gsl_integration_qagil, -1);
1042
+ rb_define_method(cgsl_function, "integration_qawc", rb_gsl_integration_qawc, -1);
1043
+ rb_define_alias(cgsl_function, "qng", "integration_qng");
1044
+ rb_define_alias(cgsl_function, "qag", "integration_qag");
1045
+ rb_define_alias(cgsl_function, "qags", "integration_qags");
1046
+ rb_define_alias(cgsl_function, "qagp", "integration_qagp");
1047
+ rb_define_alias(cgsl_function, "qagi", "integration_qagi");
1048
+ rb_define_alias(cgsl_function, "qagiu", "integration_qagiu");
1049
+ rb_define_alias(cgsl_function, "qagil", "integration_qagil");
1050
+ rb_define_alias(cgsl_function, "qawc", "integration_qawc");
1051
+
1052
+ cgsl_integration_qaws_table = rb_define_class_under(mgsl_integ, "QAWS_Table",
1053
+ cGSL_Object);
1054
+ rb_define_singleton_method(cgsl_integration_qaws_table, "alloc",
1055
+ rb_gsl_integration_qaws_table_alloc, -1);
1056
+ /* rb_define_singleton_method(cgsl_integration_qaws_table, "new",
1057
+ rb_gsl_integration_qaws_table_alloc, -1);*/
1058
+ rb_define_method(cgsl_integration_qaws_table, "to_a",
1059
+ rb_gsl_integration_qaws_table_to_a, 0);
1060
+ rb_define_method(cgsl_integration_qaws_table, "set",
1061
+ rb_gsl_integration_qaws_table_set, -1);
1062
+ rb_define_method(rb_cArray, "to_gsl_integration_qaws_table",
1063
+ rb_gsl_ary_to_integration_qaws_table, 0);
1064
+ rb_define_alias(rb_cArray, "to_qaws_table", "to_gsl_integration_qaws_table");
1065
+ rb_define_method(cgsl_function, "integration_qaws", rb_gsl_integration_qaws, -1);
1066
+ rb_define_alias(cgsl_function, "qaws", "integration_qaws");
1067
+
1068
+ cgsl_integration_qawo_table = rb_define_class_under(mgsl_integ, "QAWO_Table",
1069
+ cGSL_Object);
1070
+ rb_define_singleton_method(cgsl_integration_qawo_table, "alloc",
1071
+ rb_gsl_integration_qawo_table_alloc, -1);
1072
+ /* rb_define_singleton_method(cgsl_integration_qawo_table, "new",
1073
+ rb_gsl_integration_qawo_table_alloc, -1);*/
1074
+ rb_define_method(cgsl_integration_qawo_table, "to_a",
1075
+ rb_gsl_integration_qawo_table_to_a, 0);
1076
+ rb_define_method(rb_cArray, "to_gsl_integration_qawo_table",
1077
+ rb_gsl_ary_to_integration_qawo_table, 0);
1078
+ rb_define_method(cgsl_integration_qawo_table, "set",
1079
+ rb_gsl_integration_qawo_table_set, -1);
1080
+ rb_define_method(cgsl_integration_qawo_table, "set_length",
1081
+ rb_gsl_integration_qawo_table_set_length, 1);
1082
+ rb_define_method(cgsl_function, "integration_qawo", rb_gsl_integration_qawo, -1);
1083
+ rb_define_method(cgsl_function, "integration_qawf", rb_gsl_integration_qawf, -1);
1084
+ rb_define_alias(cgsl_function, "qawo", "integration_qawo");
1085
+ rb_define_alias(cgsl_function, "qawf", "integration_qawf");
1086
+
1087
+ cgsl_integration_workspace = rb_define_class_under(mgsl_integ,
1088
+ "Workspace", cGSL_Object);
1089
+
1090
+ /* rb_define_singleton_method(cgsl_integration_workspace, "new",
1091
+ rb_gsl_integration_workspace_alloc, -1);*/
1092
+ rb_define_singleton_method(cgsl_integration_workspace, "alloc",
1093
+ rb_gsl_integration_workspace_alloc, -1);
1094
+
1095
+ rb_define_method(cgsl_integration_workspace, "limit",
1096
+ rb_gsl_integration_workspace_limit, 0);
1097
+ rb_define_method(cgsl_integration_workspace, "size",
1098
+ rb_gsl_integration_workspace_size, 0);
1099
+ rb_define_method(cgsl_integration_workspace, "nrmax",
1100
+ rb_gsl_integration_workspace_nrmax, 0);
1101
+ rb_define_method(cgsl_integration_workspace, "i",
1102
+ rb_gsl_integration_workspace_i, 0);
1103
+ rb_define_method(cgsl_integration_workspace, "maximum_level",
1104
+ rb_gsl_integration_workspace_maximum_level, 0);
1105
+ rb_define_method(cgsl_integration_workspace, "to_a",
1106
+ rb_gsl_integration_workspace_to_a, 0);
1107
+ rb_define_method(cgsl_integration_workspace, "alist",
1108
+ rb_gsl_integration_workspace_alist, 0);
1109
+ rb_define_method(cgsl_integration_workspace, "blist",
1110
+ rb_gsl_integration_workspace_blist, 0);
1111
+ rb_define_method(cgsl_integration_workspace, "rlist",
1112
+ rb_gsl_integration_workspace_rlist, 0);
1113
+ rb_define_method(cgsl_integration_workspace, "elist",
1114
+ rb_gsl_integration_workspace_elist, 0);
1115
+
1116
+ /*****/
1117
+ rb_define_module_function(mgsl_integ, "qng", rb_gsl_integration_qng, -1);
1118
+ rb_define_module_function(mgsl_integ, "qag", rb_gsl_integration_qag, -1);
1119
+ rb_define_module_function(mgsl_integ, "qags", rb_gsl_integration_qags, -1);
1120
+ rb_define_module_function(mgsl_integ, "qagp", rb_gsl_integration_qagp, -1);
1121
+ rb_define_module_function(mgsl_integ, "qagi", rb_gsl_integration_qagi, -1);
1122
+ rb_define_module_function(mgsl_integ, "qagiu", rb_gsl_integration_qagiu, -1);
1123
+ rb_define_module_function(mgsl_integ, "qagil", rb_gsl_integration_qagil, -1);
1124
+ rb_define_module_function(mgsl_integ, "qawc", rb_gsl_integration_qawc, -1);
1125
+ rb_define_module_function(mgsl_integ, "qaws", rb_gsl_integration_qaws, -1);
1126
+ rb_define_module_function(mgsl_integ, "qawo", rb_gsl_integration_qawo, -1);
1127
+ rb_define_module_function(mgsl_integ, "qawf", rb_gsl_integration_qawf, -1);
1128
+ }
1129
+
1130
+ #undef EPSABS_DEFAULT
1131
+ #undef EPSREL_DEFAULT
1132
+ #undef LIMIT_DEFAULT
1133
+ #undef KEY_DEFAULT
1134
+
1135
+ #ifdef CHECK_WORKSPACE
1136
+ #undef CHECK_WORKSPACE
1137
+ #endif
1138
+