CAMLprim value ml_gsl_sf_gegenpoly_array(value lambda, value x, value r_arr) { gsl_sf_gegenpoly_array(Double_array_length(r_arr)-1, Double_val(lambda), Double_val(x), Double_array_val(r_arr)); return Val_unit; }
//Calculates the Gegenbauer polynomials void compute_C(double xi, int N, int L, double * C_array) { int l; for (l = 0; l < L; l++) { gsl_sf_gegenpoly_array(N - 1, 3./2 + 2*l, xi, C_array + l*N); } }
static VALUE rb_gsl_sf_gegenpoly_array(VALUE obj, VALUE nmax, VALUE lambda, VALUE x) { gsl_vector *v = NULL; CHECK_FIXNUM(nmax); Need_Float(lambda); Need_Float(x); v = gsl_vector_alloc(nmax); gsl_sf_gegenpoly_array(FIX2INT(nmax), NUM2DBL(lambda), NUM2DBL(x), v->data); return Data_Wrap_Struct(cgsl_vector, 0, gsl_vector_free, v); }
//Calculates the derivative of the Gegenbauer polynomials void compute_dC(double xi, int N, int L, double * dC_array) { int n,l; for (l = 0; l < L; l++) { *(dC_array +l*N) = 0; if (N != 1) gsl_sf_gegenpoly_array(N - 2, 5./2 + 2*l, xi, dC_array + l*N + 1); for (n = 0; n<N; n++) { *(dC_array +l*N + n) *= 2*(2*l + 3./2); } } }
//Calculates the second derivative of the Gegenbauer polynomials void compute_d2C(double xi, int N, int L, double * d2C_array) { int n,l; for (l = 0; l < L; l++) { *(d2C_array +l*N) = 0; if (N >1) *(d2C_array +l*N + 1) = 0; if (N > 2) gsl_sf_gegenpoly_array(N - 3, 7./2 + 2*l, xi, d2C_array + l*N + 2); for (n = 0; n<N; n++) { *(d2C_array +l*N + n) *= 4*(2*l + 3./2)*(2*l + 5./2); } } }