static VALUE rb_gsl_integration_qags(int argc, VALUE *argv, VALUE obj) { double a, b, epsabs = EPSABS_DEFAULT, epsrel = EPSREL_DEFAULT; double result, abserr; size_t limit = LIMIT_DEFAULT; gsl_function *F = NULL; gsl_integration_workspace *w = NULL; int status, intervals, flag = 0, itmp; switch (TYPE(obj)) { case T_MODULE: case T_CLASS: case T_OBJECT: CHECK_FUNCTION(argv[0]); Data_Get_Struct(argv[0], gsl_function, F); itmp = get_a_b(argc, argv, 1, &a, &b); break; default: Data_Get_Struct(obj, gsl_function, F); itmp = get_a_b(argc, argv, 0, &a, &b); break; } flag = get_epsabs_epsrel_limit_workspace(argc, argv, itmp, &epsabs, &epsrel, &limit, &w); status = gsl_integration_qags(F, a, b, epsabs, epsrel, limit, w, &result, &abserr); intervals = w->size; if (flag == 1) gsl_integration_workspace_free(w); return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr), INT2FIX(intervals), INT2FIX(status)); }
static VALUE rb_gsl_integration_qawc(int argc, VALUE *argv, VALUE obj) { double a, b, c, epsabs, epsrel; double result, abserr; size_t limit; gsl_function *F = NULL; gsl_integration_workspace *w = NULL; int status, intervals, itmp, flag = 0; switch (TYPE(obj)) { case T_MODULE: case T_CLASS: case T_OBJECT: CHECK_FUNCTION(argv[0]); Data_Get_Struct(argv[0], gsl_function, F); itmp = 1; break; default: Data_Get_Struct(obj, gsl_function, F); itmp = 0; break; } itmp = get_a_b(argc, argv, itmp, &a, &b); if (argc-itmp <= 0) rb_raise(rb_eArgError, "The pole is not given"); Need_Float(argv[itmp]); c = NUM2DBL(argv[itmp]); flag = get_epsabs_epsrel_limit_workspace(argc, argv, itmp+1, &epsabs, &epsrel, &limit, &w); status = gsl_integration_qawc(F, a, b, c, epsabs, epsrel, limit, w, &result, &abserr); intervals = w->size; if (flag == 1) gsl_integration_workspace_free(w); return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr), INT2FIX(intervals), INT2FIX(status)); }
static int get_a_b_epsabs_epsrel(int argc, VALUE *argv, int argstart, double *a, double *b, double *epsabs, double *epsrel) { int itmp; *epsabs = EPSABS_DEFAULT; *epsrel = EPSREL_DEFAULT; itmp = get_a_b(argc, argv, argstart, a, b); itmp = get_epsabs_epsrel(argc, argv, itmp, epsabs, epsrel); return itmp; }
static VALUE rb_gsl_integration_qaws(int argc, VALUE *argv, VALUE obj) { double a, b, epsabs, epsrel; double result, abserr; size_t limit; gsl_function *F = NULL; gsl_integration_workspace *w = NULL; gsl_integration_qaws_table *t = NULL; int status, intervals, itmp, flag = 0, flagt = 0; switch (TYPE(obj)) { case T_MODULE: case T_CLASS: case T_OBJECT: if (argc < 2) rb_raise(rb_eArgError, "too few arguments"); CHECK_FUNCTION(argv[0]); Data_Get_Struct(argv[0], gsl_function, F); itmp = 1; break; default: if (argc < 1) rb_raise(rb_eArgError, "too few arguments"); Data_Get_Struct(obj, gsl_function, F); itmp = 0; break; } itmp = get_a_b(argc, argv, itmp, &a, &b); if (TYPE(argv[itmp]) == T_ARRAY) { flagt = 1; t = make_qaws_table(argv[itmp]); } else { flagt = 0; if (!rb_obj_is_kind_of(argv[itmp], cgsl_integration_qaws_table)) rb_raise(rb_eTypeError, "Integration::QAWS_Table expected"); Data_Get_Struct(argv[itmp], gsl_integration_qaws_table, t); } flag = get_epsabs_epsrel_limit_workspace(argc, argv, itmp+1, &epsabs, &epsrel, &limit, &w); status = gsl_integration_qaws(F, a, b, t, epsabs, epsrel, limit, w, &result, &abserr); intervals = w->size; if (flag == 1) gsl_integration_workspace_free(w); if (flagt == 1) gsl_integration_qaws_table_free(t); return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr), INT2FIX(intervals), INT2FIX(status)); }
static VALUE rb_gsl_integration_qag(int argc, VALUE *argv, VALUE obj) { double a, b, epsabs = EPSABS_DEFAULT, epsrel = EPSREL_DEFAULT; double result, abserr; size_t limit = LIMIT_DEFAULT; gsl_function *F = NULL; gsl_integration_workspace *w = NULL; int key = KEY_DEFAULT, status, intervals, itmp, flag = 0; if (argc < 1) rb_raise(rb_eArgError, "wrong number of arguments (%d for >= 1)", argc); switch (TYPE(obj)) { case T_MODULE: case T_CLASS: case T_OBJECT: CHECK_FUNCTION(argv[0]); Data_Get_Struct(argv[0], gsl_function, F); if (argc == 3) { CHECK_FIXNUM(argv[2]); get_a_b(argc, argv, 1, &a, &b); key = FIX2INT(argv[2]); w = gsl_integration_workspace_alloc(limit); flag = 1; } else if (argc == 4) { CHECK_FIXNUM(argv[3]); get_a_b(argc, argv, 1, &a, &b); key = FIX2INT(argv[3]); w = gsl_integration_workspace_alloc(limit); flag = 1; } else { itmp = get_a_b_epsabs_epsrel(argc, argv, 1, &a, &b, &epsabs, &epsrel); flag = get_limit_key_workspace(argc, argv, itmp, &limit, &key, &w); } break; default: if (argc == 2) { if (FIXNUM_P(argv[1])) { key = FIX2INT(argv[1]); w = gsl_integration_workspace_alloc(limit); flag = 1; } else if (rb_obj_is_kind_of(argv[1], cgsl_integration_workspace)) { Data_Get_Struct(argv[1], gsl_integration_workspace, w); flag = 0; } else { rb_raise(rb_eTypeError, "Key or Workspace expected"); } itmp = get_a_b(argc, argv, 0, &a, &b); } else if (argc == 3) { if (FIXNUM_P(argv[2])) { key = FIX2INT(argv[2]); w = gsl_integration_workspace_alloc(limit); flag = 1; } else if (rb_obj_is_kind_of(argv[2], cgsl_integration_workspace)) { Data_Get_Struct(argv[2], gsl_integration_workspace, w); flag = 0; } else { rb_raise(rb_eTypeError, "Key or Workspace expected"); } itmp = get_a_b(argc, argv, 0, &a, &b); } else { itmp = get_a_b_epsabs_epsrel(argc, argv, 0, &a, &b, &epsabs, &epsrel); flag = get_limit_key_workspace(argc, argv, itmp, &limit, &key, &w); } Data_Get_Struct(obj, gsl_function, F); break; } status = gsl_integration_qag(F, a, b, epsabs, epsrel, limit, key, w, &result, &abserr); intervals = w->size; if (flag == 1) gsl_integration_workspace_free(w); return rb_ary_new3(4, rb_float_new(result), rb_float_new(abserr), INT2FIX(intervals), INT2FIX(status)); }