source: sasview/src/sas/sascalc/calculator/c_extensions/sld2i_module.c @ 952ea1f

magnetic_scattrelease-4.2.2ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249
Last change on this file since 952ea1f was 952ea1f, checked in by Paul Kienzle <pkienzle@…>, 5 years ago

move c extensions from core/module.so to _module.so

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