/pygsl-0.9.5/testing/src/sf/sf__arrays.c
# · C · 389 lines · 333 code · 56 blank · 0 comment · 59 complexity · ca973c3b8390e050ed73afeb981e4724 MD5 · raw file
- #include <pygsl/utils.h>
- #include <pygsl/error_helpers.h>
- #include <pygsl/block_helpers.h>
- #include <gsl/gsl_sf.h>
- #include <gsl/gsl_nan.h>
- #ifndef IMPORTALL
- static PyObject *module=NULL;
- #endif
- typedef int (array_p_evaluator_iid_ad)(int nmin, int nmax, double x, double * result_array);
- static PyObject*
- PyGSL_sf_array_evaluator_legendre_iid_ad(PyObject *self, PyObject *args,
- array_p_evaluator_iid_ad * eval)
- {
- PyArrayObject *result = NULL;
- int lmax=0, m=0, dimension = 0, ret;
- double x=0, *data=NULL;
- FUNC_MESS_BEGIN();
- if (!PyArg_ParseTuple(args, "iid", &lmax, &m, &x)){
- return NULL;
- }
- if(m < 0){
- PyErr_SetString(PyExc_ValueError,
- "Nmin must be bigger than 0!");
- return NULL;
- }
- if(lmax < m){
- PyErr_SetString(PyExc_ValueError,
- "Nmax must be bigger or equal to nmin!");
- }
- dimension = gsl_sf_legendre_array_size(lmax, m);
- result = (PyArrayObject *) PyArray_FromDims(1, &dimension, PyArray_DOUBLE);
- if(result == NULL)
- return NULL;
- data = (double *) result->data;
- ret = eval(lmax, m, x, data);
- if(PyGSL_ERROR_FLAG(ret) != GSL_SUCCESS)
- goto fail;
- FUNC_MESS_END();
- return (PyObject *) result;
- fail:
- Py_XDECREF(result);
- return NULL;
- }
- static PyObject*
- PyGSL_sf_array_evaluator_iid_ad(PyObject *self, PyObject *args,
- array_p_evaluator_iid_ad * eval)
- {
- PyArrayObject *result = NULL;
- int nmin=0, nmax=0, dimension = 0, ret;
- double x=0, *data=NULL;
- FUNC_MESS_BEGIN();
- if (!PyArg_ParseTuple(args, "iid", &nmin, &nmax, &x)){
- return NULL;
- }
- if(nmin < 0){
- PyErr_SetString(PyExc_ImportError,
- "Nmin must be bigger than 0!");
- return NULL;
- }
- if(nmax < nmin){
- PyErr_SetString(PyExc_ImportError,
- "Nmax must be bigger or equal to nmin!");
- }
- dimension = nmax - nmin + 1; /* Goes form nmin to nmax, both included */
- result = (PyArrayObject *) PyArray_FromDims(1, &dimension, PyArray_DOUBLE);
- if(result == NULL)
- return NULL;
- data = (double *) result->data;
- ret = eval(nmin, nmax, x, data);
- if(PyGSL_ERROR_FLAG(ret) != GSL_SUCCESS)
- goto fail;
- FUNC_MESS_END();
- return (PyObject *) result;
- fail:
- Py_XDECREF(result);
- return NULL;
- }
- typedef int (array_p_evaluator_id_ad)(int nmax, double x, double * result_array);
- static PyObject*
- PyGSL_sf_array_evaluator_id_ad(PyObject *self, PyObject *args, array_p_evaluator_id_ad * eval)
- {
- PyArrayObject *result = NULL;
- int nmin=0, nmax=0, dimension = 0, ret;
- double x=0, *data=NULL;
- FUNC_MESS_BEGIN();
- if (!PyArg_ParseTuple(args, "id", &nmax, &x)){
- return NULL;
- }
- if(nmin < 0){
- PyErr_SetString(PyExc_ImportError,
- "Nmin must be bigger than 0!");
- return NULL;
- }
- dimension = nmax - nmin + 1; /* Goes form nmin to nmax, both included */
- result = (PyArrayObject *) PyArray_FromDims(1, &dimension, PyArray_DOUBLE);
- if(result == NULL)
- return NULL;
- data = (double *) result->data;
- ret = eval(nmax, x, data);
- if(PyGSL_ERROR_FLAG(ret) != GSL_SUCCESS)
- goto fail;
- FUNC_MESS_END();
- return (PyObject *) result;
- fail:
- Py_XDECREF(result);
- return NULL;
- }
- typedef int (array_p_evaluator_idd_ad)(int nmax, double x1, double x2, double * result_array);
- static PyObject*
- PyGSL_sf_array_evaluator_idd_ad(PyObject *self, PyObject *args, array_p_evaluator_idd_ad * eval)
- {
- PyArrayObject *result = NULL;
- int nmin=0, nmax=0, dimension = 0, ret;
- double x=0, x1=0, *data=NULL;
- FUNC_MESS_BEGIN();
- if (!PyArg_ParseTuple(args, "idd", &nmax, &x, &x1)){
- return NULL;
- }
- if(nmin < 0){
- PyErr_SetString(PyExc_ImportError,
- "Nmin must be bigger than 0!");
- return NULL;
- }
- dimension = nmax - nmin + 1; /* Goes form nmin to nmax, both included */
- result = (PyArrayObject *) PyArray_FromDims(1, &dimension, PyArray_DOUBLE);
- if(result == NULL)
- return NULL;
- data = (double *) result->data;
- ret = eval(nmax, x, x1, data);
- if(PyGSL_ERROR_FLAG(ret) != GSL_SUCCESS)
- goto fail;
- FUNC_MESS_END();
- return (PyObject *) result;
- fail:
- Py_XDECREF(result);
- return NULL;
- }
- typedef int (array_p_evaluator_did_ad)( double x1, int nmax, double x2, double * result_array);
- static PyObject*
- PyGSL_sf_array_evaluator_did_ad(PyObject *self, PyObject *args, array_p_evaluator_did_ad * eval)
- {
- PyArrayObject *result = NULL;
- int nmin=0, nmax=0, dimension = 0, ret;
- double x=0, x1=0, *data=NULL;
- FUNC_MESS_BEGIN();
- if (!PyArg_ParseTuple(args, "did",&x, &nmax, &x1)){
- return NULL;
- }
- dimension = nmax - nmin + 1; /* Goes form nmin to nmax, both included */
- result = (PyArrayObject *) PyArray_FromDims(1, &dimension, PyArray_DOUBLE);
- if(result == NULL)
- return NULL;
- data = (double *) result->data;
- ret = eval(nmax, x, x1, data);
- if(PyGSL_ERROR_FLAG(ret) != GSL_SUCCESS)
- goto fail;
- FUNC_MESS_END();
- return (PyObject *) result;
- fail:
- Py_XDECREF(result);
- return NULL;
- }
- typedef int (array_p_evaluator_didd_add)(double , int , double , double , double * array, double*);
- static PyObject*
- PyGSL_sf_array_evaluator_didd_add(PyObject *self, PyObject *args, array_p_evaluator_didd_add * eval)
- {
- PyArrayObject *result = NULL;
- int nmin=0, nmax=0, dimension = 0, ret;
- double x=0, x1=0, *data=NULL, l_min, exponent;
- FUNC_MESS_BEGIN();
- if (!PyArg_ParseTuple(args, "didd", &l_min, &nmax, &x, &x1)){
- return NULL;
- }
- if(nmin < 0){
- PyErr_SetString(PyExc_ImportError,
- "Nmin must be bigger than 0!");
- return NULL;
- }
- dimension = nmax - nmin + 1; /* Goes form nmin to nmax, both included */
- result = (PyArrayObject *) PyArray_FromDims(1, &dimension, PyArray_DOUBLE);
- if(result == NULL)
- return NULL;
- data = (double *) result->data;
- ret = eval(l_min, nmax, x, x1, data, &exponent);
- FUNC_MESS_END();
- if(PyGSL_ERROR_FLAG(ret) != GSL_SUCCESS)
- goto fail;
-
- return Py_BuildValue("Od",result,exponent);
- fail:
- Py_XDECREF(result);
- return NULL;
- }
- typedef int (array_p_evaluator_didd_addadd)(double , int , double , double , double * array1, double*, double *array2, double*);
- static PyObject*
- PyGSL_sf_array_evaluator_didd_addadd(PyObject *self, PyObject *args, array_p_evaluator_didd_addadd * eval)
- {
- PyArrayObject *result1 = NULL,*result2 = NULL;
- int nmin=0, nmax=0, dimension = 0, ret;
- double x=0, x1=0, *data1=NULL, *data2=NULL, l_min, exponent1,exponent2;
- FUNC_MESS_BEGIN();
- if (!PyArg_ParseTuple(args, "didd", &l_min, &nmax, &x, &x1)){
- return NULL;
- }
- if(nmin < 0){
- PyErr_SetString(PyExc_ImportError,
- "Nmin must be bigger than 0!");
- return NULL;
- }
- dimension = nmax - nmin + 1; /* Goes form nmin to nmax, both included */
- result1 = (PyArrayObject *) PyArray_FromDims(1, &dimension, PyArray_DOUBLE);
- if(result1 == NULL)
- goto fail;
- result2 = (PyArrayObject *) PyArray_FromDims(1, &dimension, PyArray_DOUBLE);
- if(result2 == NULL)
- goto fail;
- data1 = (double *) result1->data;
- data2 = (double *) result2->data;
- ret = eval(l_min, nmax, x, x1, data1, &exponent1, data2, &exponent2);
- FUNC_MESS_END();
- if(PyGSL_ERROR_FLAG(ret) != GSL_SUCCESS)
- goto fail;
-
- return Py_BuildValue("OdOd",result1,exponent1,result2,exponent2);
- fail:
- Py_XDECREF(result1);
- Py_XDECREF(result2);
- return NULL;
- }
- typedef int (array_p_evaluator_didd_adadadaddd)(double , int , double , double , double * a1, double * a2, double * a3, double * a4,
- double*, double*);
- static PyObject*
- PyGSL_sf_array_evaluator_didd_adadadaddd(PyObject *self, PyObject *args, array_p_evaluator_didd_adadadaddd * eval)
- {
- PyArrayObject *result1 = NULL,*result2 = NULL, *result3=NULL,*result4=NULL;
- int nmin=0, nmax=0, dimension = 0, ret;
- double x=0, x1=0, l_min, exponent1, exponent2;
- FUNC_MESS_BEGIN();
- if (!PyArg_ParseTuple(args, "didd", &l_min, &nmax, &x, &x1)){
- return NULL;
- }
- if(nmin < 0){
- PyErr_SetString(PyExc_ImportError,
- "Nmin must be bigger than 0!");
- return NULL;
- }
- dimension = nmax - nmin + 1; /* Goes form nmin to nmax, both included */
- result1 = (PyArrayObject *) PyArray_FromDims(1, &dimension, PyArray_DOUBLE);
- if(result1 == NULL)
- goto fail;
- result2 = (PyArrayObject *) PyArray_FromDims(1, &dimension, PyArray_DOUBLE);
- if(result2 == NULL)
- goto fail;
- result3 = (PyArrayObject *) PyArray_FromDims(1, &dimension, PyArray_DOUBLE);
- if(result3 == NULL)
- goto fail;
- result4 = (PyArrayObject *) PyArray_FromDims(1, &dimension, PyArray_DOUBLE);
- if(result4 == NULL)
- goto fail;
- ret = eval(l_min, nmax, x, x1, (double *) result1->data, (double *)result2->data,
- (double *) result3->data, (double *)result4->data, &exponent1, &exponent2);
- FUNC_MESS_END();
- if(PyGSL_ERROR_FLAG(ret) != GSL_SUCCESS)
- goto fail;
-
- return Py_BuildValue("OOOOdd",result1,result2,result3,result4,exponent1, exponent2);
- fail:
- Py_XDECREF(result1);
- Py_XDECREF(result2);
- Py_XDECREF(result3);
- Py_XDECREF(result4);
- return NULL;
- }
- #define SF_ARRAY(name, function) \
- static PyObject* sf_ ## name (PyObject *self, PyObject *args) \
- { \
- PyObject * tmp; \
- FUNC_MESS_BEGIN(); \
- tmp = PyGSL_sf_array_evaluator_ ## function (self, args, gsl_sf_ ## name); \
- if (tmp == NULL){ \
- PyGSL_add_traceback(module, __FILE__, __FUNCTION__, __LINE__); \
- } \
- FUNC_MESS_END(); \
- return tmp; \
- }
- SF_ARRAY(bessel_Jn_array, iid_ad);
- SF_ARRAY(bessel_Yn_array, iid_ad);
- SF_ARRAY(bessel_In_array, iid_ad);
- SF_ARRAY(bessel_Kn_array, iid_ad);
- SF_ARRAY(bessel_Kn_scaled_array, iid_ad);
- SF_ARRAY(bessel_jl_array, id_ad);
- SF_ARRAY(bessel_jl_steed_array, id_ad);
- SF_ARRAY(bessel_yl_array, id_ad);
- SF_ARRAY(bessel_il_scaled_array, id_ad);
- SF_ARRAY(bessel_kl_scaled_array, id_ad);
- SF_ARRAY(gegenpoly_array, idd_ad);
- SF_ARRAY(legendre_H3d_array, idd_ad);
- SF_ARRAY(coulomb_wave_F_array, didd_add);
- SF_ARRAY(coulomb_wave_sphF_array, didd_add);
- SF_ARRAY(coulomb_wave_FG_array, didd_addadd);
- SF_ARRAY(coulomb_wave_FGp_array, didd_adadadaddd);
- SF_ARRAY(coulomb_CL_array, did_ad);
- SF_ARRAY(legendre_Pl_array, id_ad);
- SF_ARRAY(legendre_Plm_array, legendre_iid_ad);
- SF_ARRAY(legendre_sphPlm_array, legendre_iid_ad);
- static PyMethodDef sf_array_functions[] = {
- {"bessel_Jn_array", (PyCFunction) sf_bessel_Jn_array, METH_VARARGS, NULL},
- {"bessel_Yn_array", (PyCFunction) sf_bessel_Yn_array, METH_VARARGS, NULL},
- {"bessel_In_array", (PyCFunction) sf_bessel_In_array, METH_VARARGS, NULL},
- {"bessel_Kn_array", (PyCFunction) sf_bessel_Kn_array, METH_VARARGS, NULL},
- {"bessel_Kn_scaled_array", (PyCFunction) sf_bessel_Kn_scaled_array, METH_VARARGS, NULL},
- {"bessel_jl_array", (PyCFunction) sf_bessel_jl_array, METH_VARARGS, NULL},
- {"bessel_jl_steed_array", (PyCFunction) sf_bessel_jl_steed_array, METH_VARARGS, NULL},
- {"bessel_yl_array", (PyCFunction) sf_bessel_yl_array, METH_VARARGS, NULL},
- {"bessel_il_scaled_array", (PyCFunction) sf_bessel_il_scaled_array, METH_VARARGS, NULL},
- {"bessel_kl_scaled_array", (PyCFunction) sf_bessel_kl_scaled_array, METH_VARARGS, NULL},
- {"gegenpoly_array", (PyCFunction) sf_gegenpoly_array, METH_VARARGS, NULL},
- {"legendre_H3d_array", (PyCFunction) sf_legendre_H3d_array, METH_VARARGS, NULL},
- {"coulomb_wave_F_array", (PyCFunction) sf_coulomb_wave_F_array, METH_VARARGS, NULL},
- {"coulomb_wave_sphF_array", (PyCFunction) sf_coulomb_wave_sphF_array, METH_VARARGS, NULL},
- {"coulomb_wave_FG_array", (PyCFunction) sf_coulomb_wave_FG_array, METH_VARARGS, NULL},
- {"coulomb_wave_FGp_array", (PyCFunction) sf_coulomb_wave_FGp_array, METH_VARARGS, NULL},
- {"coulomb_CL_array", (PyCFunction) sf_coulomb_CL_array, METH_VARARGS, NULL},
- {"legendre_Pl_array", (PyCFunction) sf_legendre_Pl_array, METH_VARARGS, NULL},
- {"legendre_Plm_array", (PyCFunction) sf_legendre_Plm_array, METH_VARARGS, NULL},
- {"legendre_sphPlm_array", (PyCFunction) sf_legendre_sphPlm_array, METH_VARARGS, NULL},
- {NULL, NULL, 0}
- };
- #ifndef IMPORTALL
- DL_EXPORT(void) initsfarray(void)
- {
- module = Py_InitModule("sfarray", sf_array_functions);
- import_array();
- init_pygsl();
-
- }
- #endif