source: sasview/src/sas/sascalc/calculator/c_extensions/sld2i_module.c @ 95d7c4f

magnetic_scattrelease-4.2.2ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since 95d7c4f was 7e82256, checked in by Paul Kienzle <pkienzle@…>, 6 years ago

declare all variables at the start of the block so C89 compilers don't complain

  • Property mode set to 100644
File size: 5.2 KB
Line 
1/**
2  SLD2I module to perform point and I calculations
3 */
4#include <Python.h>
5#include <stdio.h>
6#include "sld2i.h"
7
8#if PY_MAJOR_VERSION < 3
9typedef void (*PyCapsule_Destructor)(PyObject *);
10typedef void (*PyCObject_Destructor)(void *);
11#define PyCapsule_New(pointer, name, destructor) (PyCObject_FromVoidPtr(pointer, (PyCObject_Destructor)destructor))
12#define PyCapsule_GetPointer(capsule, name) (PyCObject_AsVoidPtr(capsule))
13#endif
14
15
16// Utilities
17#define INVECTOR(obj,buf,len)                                                                           \
18    do { \
19        int err = PyObject_AsReadBuffer(obj, (const void **)(&buf), &len); \
20        if (err < 0) return NULL; \
21        len /= sizeof(*buf); \
22    } while (0)
23
24#define OUTVECTOR(obj,buf,len) \
25    do { \
26        int err = PyObject_AsWriteBuffer(obj, (void **)(&buf), &len); \
27        if (err < 0) return NULL; \
28        len /= sizeof(*buf); \
29    } while (0)
30
31
32/**
33 * Delete a GenI object
34 */
35void
36del_sld2i(PyObject *obj){
37#if PY_MAJOR_VERSION < 3
38        GenI* sld2i = (GenI *)obj;
39#else
40        GenI* sld2i = (GenI *)(PyCapsule_GetPointer(obj, "GenI"));
41#endif
42        PyMem_Free((void *)sld2i);
43}
44
45/**
46 * Create a GenI as a python object by supplying arrays
47 */
48PyObject * new_GenI(PyObject *self, PyObject *args) {
49        PyObject *x_val_obj;
50        PyObject *y_val_obj;
51        PyObject *z_val_obj;
52        PyObject *sldn_val_obj;
53        PyObject *mx_val_obj;
54        PyObject *my_val_obj;
55        PyObject *mz_val_obj;
56        PyObject *vol_pix_obj;
57        Py_ssize_t n_x, n_y, n_z, n_sld, n_mx, n_my, n_mz, n_vol_pix;
58        int is_avg;
59        double* x_val;
60        double* y_val;
61        double* z_val;
62        double* sldn_val;
63        double* mx_val;
64        double* my_val;
65        double* mz_val;
66        double* vol_pix;
67        double inspin;
68        double outspin;
69        double stheta;
70        PyObject *obj;
71        GenI* sld2i;
72
73        if (!PyArg_ParseTuple(args, "iOOOOOOOOddd", &is_avg, &x_val_obj, &y_val_obj, &z_val_obj, &sldn_val_obj, &mx_val_obj, &my_val_obj, &mz_val_obj, &vol_pix_obj, &inspin, &outspin, &stheta)) return NULL;
74        INVECTOR(x_val_obj, x_val, n_x);
75        INVECTOR(y_val_obj, y_val, n_y);
76        INVECTOR(z_val_obj, z_val, n_z);
77        INVECTOR(sldn_val_obj, sldn_val, n_sld);
78        INVECTOR(mx_val_obj, mx_val, n_mx);
79        INVECTOR(my_val_obj, my_val, n_my);
80        INVECTOR(mz_val_obj, mz_val, n_mz);
81        INVECTOR(vol_pix_obj, vol_pix, n_vol_pix);
82        sld2i = PyMem_Malloc(sizeof(GenI));
83        //printf("sldi:%p\n", sld2i);
84        if (sld2i != NULL) {
85                initGenI(sld2i,is_avg,(int)n_x,x_val,y_val,z_val,sldn_val,mx_val,my_val,mz_val,vol_pix,inspin,outspin,stheta);
86        }
87        obj = PyCapsule_New(sld2i, "GenI", del_sld2i);
88        //printf("constructed %p\n", obj);
89        return obj;
90}
91
92/**
93 * GenI the given input (2D) according to a given object
94 */
95PyObject * genicom_inputXY(PyObject *self, PyObject *args) {
96        PyObject *gen_obj;
97        PyObject *qx_obj;
98        PyObject *qy_obj;
99        PyObject *I_out_obj;
100        Py_ssize_t n_qx, n_qy, n_out;
101        double *qx;
102        double *qy;
103        double *I_out;
104        GenI* sld2i;
105
106        if (!PyArg_ParseTuple(args, "OOOO",  &gen_obj, &qx_obj, &qy_obj, &I_out_obj)) return NULL;
107        sld2i = (GenI *)PyCapsule_GetPointer(gen_obj, "GenI");
108        INVECTOR(qx_obj, qx, n_qx);
109        INVECTOR(qy_obj, qy, n_qy);
110        OUTVECTOR(I_out_obj, I_out, n_out);
111
112        // Sanity check
113        //if(n_q!=n_out) return Py_BuildValue("i",-1);
114
115        genicomXY(sld2i, (int)n_qx, qx, qy, I_out);
116        //return PyCObject_FromVoidPtr(s, del_genicom);
117        return Py_BuildValue("i",1);
118}
119
120/**
121 * GenI the given 1D input according to a given object
122 */
123PyObject * genicom_input(PyObject *self, PyObject *args) {
124        PyObject *gen_obj;
125        PyObject *q_obj;
126        PyObject *I_out_obj;
127        Py_ssize_t n_q, n_out;
128        double *q;
129        double *I_out;
130        GenI *sld2i;
131
132        if (!PyArg_ParseTuple(args, "OOO",  &gen_obj, &q_obj, &I_out_obj)) return NULL;
133        sld2i = (GenI *)PyCapsule_GetPointer(gen_obj, "GenI");
134        INVECTOR(q_obj, q, n_q);
135        OUTVECTOR(I_out_obj, I_out, n_out);
136
137        // Sanity check
138        //if (n_q!=n_out) return Py_BuildValue("i",-1);
139
140        genicom(sld2i, (int)n_q, q, I_out);
141        return Py_BuildValue("i",1);
142}
143
144/**
145 * Define module methods
146 */
147static PyMethodDef module_methods[] = {
148        {"new_GenI", (PyCFunction)new_GenI, METH_VARARGS,
149                  "Create a new GenI object"},
150        {"genicom",(PyCFunction)genicom_input, METH_VARARGS,
151                  "genicom the given 1d input arrays"},
152        {"genicomXY",(PyCFunction)genicom_inputXY, METH_VARARGS,
153                  "genicomXY the given 2d input arrays"},
154    {NULL}
155};
156
157#define MODULE_DOC "Sld2i C Library"
158#define MODULE_NAME "sld2i"
159#define MODULE_INIT2 initsld2i
160#define MODULE_INIT3 PyInit_sld2i
161#define MODULE_METHODS module_methods
162
163/* ==== boilerplate python 2/3 interface bootstrap ==== */
164
165
166#if defined(WIN32) && !defined(__MINGW32__)
167    #define DLL_EXPORT __declspec(dllexport)
168#else
169    #define DLL_EXPORT
170#endif
171
172#if PY_MAJOR_VERSION >= 3
173
174  DLL_EXPORT PyMODINIT_FUNC MODULE_INIT3(void)
175  {
176    static struct PyModuleDef moduledef = {
177      PyModuleDef_HEAD_INIT,
178      MODULE_NAME,         /* m_name */
179      MODULE_DOC,          /* m_doc */
180      -1,                  /* m_size */
181      MODULE_METHODS,      /* m_methods */
182      NULL,                /* m_reload */
183      NULL,                /* m_traverse */
184      NULL,                /* m_clear */
185      NULL,                /* m_free */
186    };
187    return PyModule_Create(&moduledef);
188  }
189
190#else /* !PY_MAJOR_VERSION >= 3 */
191
192  DLL_EXPORT PyMODINIT_FUNC MODULE_INIT2(void)
193  {
194    Py_InitModule4(MODULE_NAME,
195                 MODULE_METHODS,
196                 MODULE_DOC,
197                 0,
198                 PYTHON_API_VERSION
199                 );
200  }
201
202#endif /* !PY_MAJOR_VERSION >= 3 */
Note: See TracBrowser for help on using the repository browser.