source: sasview/sansmodels/src/sans/models/c_extensions/c_models.cpp @ af03ddd

ESS_GUIESS_GUI_DocsESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_iss959ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalccostrafo411magnetic_scattrelease-4.1.1release-4.1.2release-4.2.2release_4.0.1ticket-1009ticket-1094-headlessticket-1242-2d-resolutionticket-1243ticket-1249ticket885unittest-saveload
Last change on this file since af03ddd was af03ddd, checked in by Mathieu Doucet <doucetm@…>, 16 years ago

Model C extension update

  • Property mode set to 100644
File size: 3.8 KB
Line 
1/** c_models
2 *
3 * Module containing all SANS model extensions
4 *
5 * @author   M.Doucet / UTK
6 */
7#include <Python.h>
8#include <parameters.hh>
9
10void addCCylinderModel(PyObject *module);
11extern "C" {
12        void addCCoreShellCylinderModel(PyObject *module);
13        void addCCoreShellModel(PyObject *module);
14        void addCEllipsoidModel(PyObject *module);
15        void addCSphereModel(PyObject *module);
16        void addCEllipticalCylinderModel(PyObject *module);
17        void addDisperser(PyObject *module);
18        void addCGaussian(PyObject *module);
19        void addCLorentzian(PyObject *module);
20}
21
22/**
23 * Delete a dispersion model object
24 */
25void del_dispersion_model(void *ptr){
26        DispersionModel * disp = static_cast<DispersionModel *>(ptr);
27        delete disp;
28        return;
29}
30
31/**
32 * Create a dispersion model as a python object
33 */
34PyObject * new_dispersion_model(PyObject *, PyObject *args) {
35        DispersionModel *disp = new DispersionModel();
36        return PyCObject_FromVoidPtr(disp, del_dispersion_model);
37}
38
39
40/**
41 * Delete a gaussian dispersion model object
42 */
43void del_gaussian_dispersion(void *ptr){
44        GaussianDispersion * disp = static_cast<GaussianDispersion *>(ptr);
45        delete disp;
46        return;
47}
48
49/**
50 * Create a gaussian dispersion model as a python object
51 */
52PyObject * new_gaussian_dispersion(PyObject *, PyObject *args) {
53        GaussianDispersion *disp = new GaussianDispersion();
54        return PyCObject_FromVoidPtr(disp, del_gaussian_dispersion);
55}
56
57/**
58 * Delete an array dispersion model object
59 */
60void del_array_dispersion(void *ptr){
61        ArrayDispersion * disp = static_cast<ArrayDispersion *>(ptr);
62        delete disp;
63        return;
64}
65
66/**
67 * Create an array dispersion model as a python object
68 */
69PyObject * new_array_dispersion(PyObject *, PyObject *args) {
70        ArrayDispersion *disp = new ArrayDispersion();
71        return PyCObject_FromVoidPtr(disp, del_array_dispersion);
72}
73
74#define INVECTOR(obj,buf,len)                                                                           \
75    do { \
76        int err = PyObject_AsReadBuffer(obj, (const void **)(&buf), &len); \
77        if (err < 0) return NULL; \
78        len /= sizeof(*buf); \
79    } while (0)
80
81/**
82 * Sets weights from a numpy array
83 */
84PyObject * set_weights(PyObject *, PyObject *args) {
85        PyObject *val_obj;
86        PyObject *wei_obj;
87        PyObject *disp;
88        Py_ssize_t nval;
89        Py_ssize_t nwei;
90        double *values;
91        double *weights;
92    int i;
93
94        if (!PyArg_ParseTuple(args, "OOO", &disp, &val_obj, &wei_obj)) return NULL;
95        INVECTOR(val_obj, values, nval);
96        INVECTOR(wei_obj, weights, nwei);
97
98        // Sanity check
99        if(nval!=nwei) return NULL;
100
101        // Set the array pointers
102        void *temp = PyCObject_AsVoidPtr(disp);
103        DispersionModel * dispersion = static_cast<DispersionModel *>(temp);
104        dispersion->set_weights(nval, values, weights);
105
106        return Py_BuildValue("i",1);
107}
108
109
110
111/**
112 * Define empty module
113 */
114static PyMethodDef module_methods[] = {
115        {"new_dispersion_model", (PyCFunction)new_dispersion_model     , METH_VARARGS,
116                  "Create a new DispersionModel object"},
117        {"new_gaussian_model",   (PyCFunction)new_gaussian_dispersion, METH_VARARGS,
118                  "Create a new GaussianDispersion object"},
119        {"new_array_model",      (PyCFunction)new_array_dispersion  , METH_VARARGS,
120                  "Create a new ArrayDispersion object"},
121        {"set_dispersion_weights",(PyCFunction)set_weights  , METH_VARARGS,
122                        "Create the dispersion weight arrays for an Array Dispersion object"},
123    {NULL}
124};
125
126
127#ifndef PyMODINIT_FUNC  /* declarations for DLL import/export */
128#define PyMODINIT_FUNC void
129#endif
130PyMODINIT_FUNC
131initc_models(void)
132{
133    PyObject* m;
134
135    m = Py_InitModule3("c_models", module_methods,
136                       "C extension module for SANS scattering models.");
137
138        addCCylinderModel(m);
139        addCCoreShellCylinderModel(m);
140        addCCoreShellModel(m);
141        addCEllipsoidModel(m);
142        addCSphereModel(m);
143        addCEllipticalCylinderModel(m);
144        addDisperser(m);
145        addCGaussian(m);
146        addCLorentzian(m);
147
148}
Note: See TracBrowser for help on using the repository browser.