1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238
|
#include "rb_gsl.h"
#ifdef GSL_1_9_LATER
static VALUE cWorkspace;
static VALUE rb_gsl_sf_mathieu_alloc(VALUE klass, VALUE n, VALUE q)
{
gsl_sf_mathieu_workspace *w;
w = gsl_sf_mathieu_alloc((size_t) FIX2INT(n), NUM2DBL(q));
return Data_Wrap_Struct(klass, 0, gsl_sf_mathieu_free, w);
}
static VALUE sf_mathieu_eval(VALUE order, VALUE qq,
int (*f)(int, double, gsl_sf_result*))
{
gsl_sf_result r;
(*f)(FIX2INT(order), NUM2DBL(qq), &r);
return rb_float_new(r.val);
}
static VALUE sf_mathieu_eval2(VALUE n1, VALUE n2, VALUE q, VALUE x,
int (*f)(int, int, double, double, gsl_sf_result*))
{
gsl_sf_result r;
(*f)(FIX2INT(n1),FIX2INT(n2), NUM2DBL(q), NUM2DBL(x), &r);
return rb_float_new(r.val);
}
static VALUE sf_mathieu_array_eval(int argc, VALUE *argv,
int (*f)(int, int, double, gsl_sf_mathieu_workspace*, double[]))
{
gsl_sf_mathieu_workspace *w;
gsl_vector *v;
int n1, n2;
double q;
switch (argc) {
case 4:
if (!rb_obj_is_kind_of(argv[3], cWorkspace)) {
rb_raise(rb_eTypeError, "Wrong argument type 3 (%s detected, %s expected)",
rb_class2name(CLASS_OF(argv[3])), rb_class2name(cWorkspace));
}
n1 = FIX2INT(argv[0]);
n2 = FIX2INT(argv[1]);
q = NUM2DBL(argv[2]);
Data_Get_Struct(argv[3], gsl_sf_mathieu_workspace, w);
break;
default:
rb_raise(rb_eArgError, "Wrong number of arguments. (%d for 4)", argc);
}
v = gsl_vector_alloc(n2 - n1 + 1);
(*f)(n1, n2, q, w, v->data);
return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
}
static VALUE sf_mathieu_array_eval2(int argc, VALUE *argv,
int (*f)(int, int, double, double, gsl_sf_mathieu_workspace*, double[]))
{
gsl_sf_mathieu_workspace *w;
gsl_vector *v;
int n1, n2;
double q, x;
switch (argc) {
case 5:
if (!rb_obj_is_kind_of(argv[4], cWorkspace)) {
rb_raise(rb_eTypeError, "Wrong argument type 4 (%s detected, %s expected)",
rb_class2name(CLASS_OF(argv[4])), rb_class2name(cWorkspace));
}
n1 = FIX2INT(argv[0]);
n2 = FIX2INT(argv[1]);
q = NUM2DBL(argv[2]);
x = NUM2DBL(argv[3]);
Data_Get_Struct(argv[4], gsl_sf_mathieu_workspace, w);
break;
default:
rb_raise(rb_eArgError, "Wrong number of arguments. (%d for 5)", argc);
}
v = gsl_vector_alloc(n2 - n1 + 1);
(*f)(n1, n2, q, x, w, v->data);
return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
}
static VALUE sf_mathieu_array_eval3(int argc, VALUE *argv,
int (*f)(int, int, int, double, double, gsl_sf_mathieu_workspace*, double[]))
{
gsl_sf_mathieu_workspace *w;
gsl_vector *v;
int n1, n2, n3;
double q, x;
switch (argc) {
case 6:
if (!rb_obj_is_kind_of(argv[5], cWorkspace)) {
rb_raise(rb_eTypeError, "Wrong argument type 5 (%s detected, %s expected)",
rb_class2name(CLASS_OF(argv[5])), rb_class2name(cWorkspace));
}
n1 = FIX2INT(argv[0]);
n2 = FIX2INT(argv[1]);
n3 = FIX2INT(argv[2]);
q = NUM2DBL(argv[3]);
x = NUM2DBL(argv[4]);
Data_Get_Struct(argv[5], gsl_sf_mathieu_workspace, w);
break;
default:
rb_raise(rb_eArgError, "Wrong number of arguments. (%d for 6)", argc);
}
v = gsl_vector_alloc(n3 - n2 + 1);
(*f)(n1, n2, n3, q, x, w, v->data);
return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v);
}
static VALUE sf_mathieu_eval_int_double2(VALUE order, VALUE qq, VALUE zz,
int (*f)(int, double, double, gsl_sf_result*))
{
gsl_sf_result r;
(*f)(FIX2INT(order), NUM2DBL(qq), NUM2DBL(zz), &r);
return rb_float_new(r.val);
}
static VALUE sf_mathieu_eval_e_int_double2(VALUE order, VALUE qq, VALUE zz,
int (*f)(int, double, double, gsl_sf_result*))
{
gsl_sf_result *r;
VALUE val;
val = Data_Make_Struct(cgsl_sf_result, gsl_sf_result, 0, free, r);
(*f)(FIX2INT(order), NUM2DBL(qq), NUM2DBL(zz), r);
return val;
}
static VALUE sf_mathieu_eval_e_int2_double2(VALUE n1, VALUE n2, VALUE qq, VALUE zz,
int (*f)(int, int, double, double, gsl_sf_result*))
{
gsl_sf_result *r;
VALUE val;
val = Data_Make_Struct(cgsl_sf_result, gsl_sf_result, 0, free, r);
(*f)(FIX2INT(n1), FIX2INT(n2), NUM2DBL(qq), NUM2DBL(zz), r);
return val;
}
/**********/
static VALUE rb_gsl_sf_mathieu_a_e(VALUE module, VALUE order, VALUE qq)
{
return rb_gsl_sf_eval_e_int_double(gsl_sf_mathieu_a, order, qq);
}
static VALUE rb_gsl_sf_mathieu_a(VALUE module, VALUE order, VALUE qq)
{
return sf_mathieu_eval(order, qq, gsl_sf_mathieu_a);
}
static VALUE rb_gsl_sf_mathieu_a_array(VALUE module, int argc, VALUE *argv)
{
return sf_mathieu_array_eval(argc, argv, gsl_sf_mathieu_a_array);
}
static VALUE rb_gsl_sf_mathieu_b_e(VALUE module, VALUE order, VALUE qq)
{
return rb_gsl_sf_eval_e_int_double(gsl_sf_mathieu_b, order, qq);
}
static VALUE rb_gsl_sf_mathieu_b(VALUE module, VALUE order, VALUE qq)
{
return sf_mathieu_eval(order, qq, gsl_sf_mathieu_b);
}
static VALUE rb_gsl_sf_mathieu_b_array(VALUE module, int argc, VALUE *argv)
{
return sf_mathieu_array_eval(argc, argv, gsl_sf_mathieu_b_array);
}
static VALUE rb_gsl_sf_mathieu_ce_e(VALUE module, VALUE order, VALUE qq, VALUE zz)
{
return sf_mathieu_eval_e_int_double2(order, qq, zz, gsl_sf_mathieu_ce);
}
static VALUE rb_gsl_sf_mathieu_ce(VALUE module, VALUE order, VALUE qq, VALUE zz)
{
return sf_mathieu_eval_int_double2(order, qq, zz, gsl_sf_mathieu_ce);
}
static VALUE rb_gsl_sf_mathieu_ce_array(VALUE module, int argc, VALUE *argv)
{
return sf_mathieu_array_eval2(argc, argv, gsl_sf_mathieu_ce_array);
}
static VALUE rb_gsl_sf_mathieu_se_e(VALUE module, VALUE order, VALUE qq, VALUE zz)
{
return sf_mathieu_eval_e_int_double2(order, qq, zz, gsl_sf_mathieu_se);
}
static VALUE rb_gsl_sf_mathieu_se(VALUE module, VALUE order, VALUE qq, VALUE zz)
{
return sf_mathieu_eval_int_double2(order, qq, zz, gsl_sf_mathieu_se);
}
static VALUE rb_gsl_sf_mathieu_se_array(VALUE module, int argc, VALUE *argv)
{
return sf_mathieu_array_eval2(argc, argv, gsl_sf_mathieu_se_array);
}
/*****/
static VALUE rb_gsl_sf_mathieu_Mc_e(VALUE module, VALUE n1, VALUE n2, VALUE q, VALUE x)
{
return sf_mathieu_eval_e_int2_double2(n1, n2, q, x, gsl_sf_mathieu_Mc);
}
static VALUE rb_gsl_sf_mathieu_Mc(VALUE module, VALUE n1, VALUE n2, VALUE q, VALUE x)
{
return sf_mathieu_eval2(n1, n2, q, x, gsl_sf_mathieu_Mc);
}
static VALUE rb_gsl_sf_mathieu_Mc_array(VALUE module, int argc, VALUE *argv)
{
return sf_mathieu_array_eval3(argc, argv, gsl_sf_mathieu_Mc_array);
}
static VALUE rb_gsl_sf_mathieu_Ms_e(VALUE module, VALUE n1, VALUE n2, VALUE q, VALUE x)
{
return sf_mathieu_eval_e_int2_double2(n1, n2, q, x, gsl_sf_mathieu_Ms);
}
static VALUE rb_gsl_sf_mathieu_Ms(VALUE module, VALUE n1, VALUE n2, VALUE q, VALUE x)
{
return sf_mathieu_eval2(n1, n2, q, x, gsl_sf_mathieu_Ms);
}
static VALUE rb_gsl_sf_mathieu_Ms_array(VALUE module, int argc, VALUE *argv)
{
return sf_mathieu_array_eval3(argc, argv, gsl_sf_mathieu_Ms_array);
}
/*****/
void Init_sf_mathieu(VALUE module)
{
VALUE mMathieu;
mMathieu = rb_define_module_under(module, "Mathieu");
cWorkspace = rb_define_class_under(mMathieu, "Workspace", cGSL_Object);
rb_define_singleton_method(cWorkspace, "alloc", rb_gsl_sf_mathieu_alloc, 2);
rb_define_module_function(module, "mathieu_a", rb_gsl_sf_mathieu_a, 2);
rb_define_module_function(module, "mathieu_a_e", rb_gsl_sf_mathieu_a_e, 2);
rb_define_module_function(module, "mathieu_a_array", rb_gsl_sf_mathieu_a_array, -1);
rb_define_module_function(module, "mathieu_b", rb_gsl_sf_mathieu_b, 2);
rb_define_module_function(module, "mathieu_b_e", rb_gsl_sf_mathieu_b_e, 2);
rb_define_module_function(module, "mathieu_b_array", rb_gsl_sf_mathieu_b_array, -1);
rb_define_module_function(module, "mathieu_ce", rb_gsl_sf_mathieu_ce, 3);
rb_define_module_function(module, "mathieu_ce_e", rb_gsl_sf_mathieu_ce_e, 3);
rb_define_module_function(module, "mathieu_ce_array", rb_gsl_sf_mathieu_ce_array, -1);
rb_define_module_function(module, "mathieu_se", rb_gsl_sf_mathieu_se, 3);
rb_define_module_function(module, "mathieu_se_e", rb_gsl_sf_mathieu_se_e, 3);
rb_define_module_function(module, "mathieu_se_array", rb_gsl_sf_mathieu_se_array, -1);
rb_define_module_function(module, "mathieu_Mc", rb_gsl_sf_mathieu_Mc, 4);
rb_define_module_function(module, "mathieu_Mc_e", rb_gsl_sf_mathieu_Mc_e, 4);
rb_define_module_function(module, "mathieu_Mc_array", rb_gsl_sf_mathieu_Mc_array, -1);
rb_define_module_function(module, "mathieu_Ms", rb_gsl_sf_mathieu_Ms, 4);
rb_define_module_function(module, "mathieu_Ms_e", rb_gsl_sf_mathieu_Ms_e, 4);
rb_define_module_function(module, "mathieu_Ms_array", rb_gsl_sf_mathieu_Ms_array, -1);
}
#endif
|