static gsl_integration_qaws_table* make_qaws_table(VALUE ary) { double alpha, beta; int mu, nu; alpha = NUM2DBL(rb_ary_entry(ary, 0)); beta = NUM2DBL(rb_ary_entry(ary, 1)); mu = FIX2INT(rb_ary_entry(ary, 2)); nu = FIX2INT(rb_ary_entry(ary, 3)); return gsl_integration_qaws_table_alloc(alpha, beta, mu, nu); }
VALUE rb_gsl_integration_qaws_table_alloc(int argc, VALUE *argv, VALUE klass) { gsl_integration_qaws_table *t = NULL; VALUE alpha, beta, mu, nu; if (TYPE(argv[0]) == T_ARRAY) { alpha = rb_ary_entry(argv[0], 0); beta = rb_ary_entry(argv[0], 1); mu = rb_ary_entry(argv[0], 2); nu = rb_ary_entry(argv[0], 3); } else { Need_Float(argv[0]); Need_Float(argv[1]); CHECK_FIXNUM(argv[2]); CHECK_FIXNUM(argv[3]); alpha = argv[0]; beta = argv[1]; mu = argv[2]; nu = argv[3]; } t = gsl_integration_qaws_table_alloc(NUM2DBL(alpha), NUM2DBL(beta), FIX2INT(mu), FIX2INT(nu)); return Data_Wrap_Struct(klass, 0, gsl_integration_qaws_table_free, t); }
int lua_integration_integrate(lua_State * L) { double a=0.0; double b=1.0; double c=0.5; double epsabs=0.0; double epsrel=0.0000001; double alpha=0.0; double beta=0.0; int mu=0; int nu=0; size_t limit=100; size_t n=0; int key=1; double result=0; double abserr=0; size_t neval=0; gsl_integration_workspace * w=0; multi_param mp; mp.L=L; lua_pushstring(L,"f"); lua_gettable(L,-2); if(lua_isfunction(L,-1)) { mp.f_index=luaL_ref(L, LUA_REGISTRYINDEX); } else { luaL_error(L,"%s\n","missing function"); } gsl_function F; F.function = &int_f_cb; F.params = ∓ lua_pushstring(L,"epsabs"); lua_gettable(L,-2); if(lua_isnumber(L,-1)) { epsabs=lua_tonumber(L,-1); } lua_pop(L,1); lua_pushstring(L,"epsrel"); lua_gettable(L,-2); if(lua_isnumber(L,-1)) { epsrel=lua_tonumber(L,-1); } lua_pop(L,1); lua_pushstring(L,"a"); lua_gettable(L,-2); if(lua_isnumber(L,-1)) { a=lua_tonumber(L,-1); } lua_pop(L,1); lua_pushstring(L,"b"); lua_gettable(L,-2); if(lua_isnumber(L,-1)) { b=lua_tonumber(L,-1); } lua_pop(L,1); lua_pushstring(L,"c"); lua_gettable(L,-2); if(lua_isnumber(L,-1)) { c=lua_tonumber(L,-1); } lua_pop(L,1); lua_pushstring(L,"limit"); lua_gettable(L,-2); if(lua_isnumber(L,-1)) { limit=(size_t)lua_tonumber(L,-1); } lua_pop(L,1); lua_pushstring(L,"n"); lua_gettable(L,-2); if(lua_isnumber(L,-1)) { n=(size_t)lua_tonumber(L,-1); } lua_pop(L,1); if(limit>n) n=limit; lua_pushstring(L,"key"); lua_gettable(L,-2); if(lua_isnumber(L,-1)) { key=(int)lua_tonumber(L,-1); } lua_pop(L,1); lua_pushstring(L,"alpha"); lua_gettable(L,-2); if(lua_isnumber(L,-1)) { alpha=(double)lua_tonumber(L,-1); } lua_pop(L,1); lua_pushstring(L,"beta"); lua_gettable(L,-2); if(lua_isnumber(L,-1)) { beta=(double)lua_tonumber(L,-1); } lua_pop(L,1); lua_pushstring(L,"mu"); lua_gettable(L,-2); if(lua_isnumber(L,-1)) { mu=(int)lua_tonumber(L,-1); } lua_pop(L,1); lua_pushstring(L,"nu"); lua_gettable(L,-2); if(lua_isnumber(L,-1)) { nu=(int)lua_tonumber(L,-1); } lua_pop(L,1); lua_pushstring(L,"algorithm"); lua_gettable(L,-2); if(lua_isstring(L,-1)) { if(!strcmp(lua_tostring(L,-1),"qng")) { gsl_integration_qng(&F,a,b,epsabs,epsrel,&result,&abserr,&neval); } else if(!strcmp(lua_tostring(L,-1),"qag")) { w=gsl_integration_workspace_alloc(n); gsl_integration_qag(&F,a,b,epsabs,epsrel,limit,key,w,&result,&abserr); } else if(!strcmp(lua_tostring(L,-1),"qags")) { w=gsl_integration_workspace_alloc(n); gsl_integration_qags(&F,a,b,epsabs,epsrel,limit,w,&result,&abserr); } else if(!strcmp(lua_tostring(L,-1),"qagi")) { w=gsl_integration_workspace_alloc(n); gsl_integration_qagi(&F,epsabs,epsrel,limit,w,&result,&abserr); } else if(!strcmp(lua_tostring(L,-1),"qagiu")) { w=gsl_integration_workspace_alloc(n); gsl_integration_qagiu(&F,a,epsabs,epsrel,limit,w,&result,&abserr); } else if(!strcmp(lua_tostring(L,-1),"qagil")) { w=gsl_integration_workspace_alloc(n); gsl_integration_qagil(&F,b,epsabs,epsrel,limit,w,&result,&abserr); } else if(!strcmp(lua_tostring(L,-1),"qawc")) { w=gsl_integration_workspace_alloc(n); gsl_integration_qawc(&F,a,b,c,epsabs,epsrel,limit,w,&result,&abserr); } else if(!strcmp(lua_tostring(L,-1),"qaws")) { w=gsl_integration_workspace_alloc(n); gsl_integration_qaws_table * table=gsl_integration_qaws_table_alloc(alpha,beta,mu,nu); gsl_integration_qaws(&F,a,b,table,epsabs,epsrel,limit,w,&result,&abserr); gsl_integration_qaws_table_free(table); } else if(!strcmp(lua_tostring(L,-1),"cquad")) { gsl_integration_cquad_workspace * w=gsl_integration_cquad_workspace_alloc(n); gsl_integration_cquad(&F,a,b,epsabs,epsrel,w,&result,&abserr,&neval); gsl_integration_cquad_workspace_free(w); } else { luaL_error(L,"%s\n","invalid algorithm"); } } else { gsl_integration_cquad_workspace * w=gsl_integration_cquad_workspace_alloc(n); gsl_integration_cquad(&F,a,b,epsabs,epsrel,w,&result,&abserr,&neval); gsl_integration_cquad_workspace_free(w); } lua_pop(L,1); lua_pop(L,1); lua_pushnumber(L,result); lua_pushnumber(L,abserr); lua_pushnumber(L,neval); if(mp.fdf_index>=0) luaL_unref(L, LUA_REGISTRYINDEX, mp.fdf_index); if(w) gsl_integration_workspace_free(w); return 3; }