source: sasview/sansmodels/src/sans/models/c_models/c_models.cpp @ 8344c50

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 8344c50 was 812b901, checked in by Gervaise Alina <gervyh@…>, 15 years ago

write run function for vector also

  • Property mode set to 100644
File size: 5.6 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#define PY_ARRAY_UNIQUE_SYMBOL PyArray_API_sans
10#include "arrayobject.h"
11
12
13void addCCylinderModel(PyObject *module);
14void addCTriaxialEllipsoidModel(PyObject *module);
15void addCParallelepipedModel(PyObject *module);
16void addCSphereModel(PyObject *module);
17void addCHardsphereStructure(PyObject *module);
18void addCStickyHSStructure(PyObject *module);
19void addCSquareWellStructure(PyObject *module);
20void addCHayterMSAStructure(PyObject *module);
21void addCDiamEllipFunc(PyObject *module);
22void addCDiamCylFunc(PyObject *module);
23void addCCoreShellModel(PyObject *module);
24void addCCoreShellCylinderModel(PyObject *module);
25void addCEllipsoidModel(PyObject *module);
26void addCEllipticalCylinderModel(PyObject *module);
27void addCTriaxialEllipsoidModel(PyObject *module);
28void addCFlexibleCylinderModel(PyObject *module);
29void addCStackedDisksModel(PyObject *module);
30void addCLamellarPSModel(PyObject *module);
31void addCLamellarPSHGModel(PyObject *module);
32void addCOblateModel(PyObject *module);
33void addCProlateModel(PyObject *module);
34void addCLamellarModel(PyObject *module);
35void addCLamellarFFHGModel(PyObject *module);
36void addCHollowCylinderModel(PyObject *module);
37void addCMultiShellModel(PyObject *module);
38void addCVesicleModel(PyObject *module);
39void addCBinaryHSModel(PyObject *module);
40
41
42extern "C" {
43        //void addCCoreShellCylinderModel(PyObject *module);
44        //void addCCoreShellModel(PyObject *module);
45        //void addCEllipsoidModel(PyObject *module);
46        //void addCEllipticalCylinderModel(PyObject *module);
47        void addDisperser(PyObject *module);
48        void addCGaussian(PyObject *module);
49        void addCLorentzian(PyObject *module);
50}
51
52/**
53 * Delete a dispersion model object
54 */
55void del_dispersion_model(void *ptr){
56        DispersionModel * disp = static_cast<DispersionModel *>(ptr);
57        delete disp;
58        return;
59}
60
61/**
62 * Create a dispersion model as a python object
63 */
64PyObject * new_dispersion_model(PyObject *, PyObject *args) {
65        DispersionModel *disp = new DispersionModel();
66        return PyCObject_FromVoidPtr(disp, del_dispersion_model);
67}
68
69
70/**
71 * Delete a gaussian dispersion model object
72 */
73void del_gaussian_dispersion(void *ptr){
74        GaussianDispersion * disp = static_cast<GaussianDispersion *>(ptr);
75        delete disp;
76        return;
77}
78
79/**
80 * Create a gaussian dispersion model as a python object
81 */
82PyObject * new_gaussian_dispersion(PyObject *, PyObject *args) {
83        GaussianDispersion *disp = new GaussianDispersion();
84        return PyCObject_FromVoidPtr(disp, del_gaussian_dispersion);
85}
86
87/**
88 * Delete an array dispersion model object
89 */
90void del_array_dispersion(void *ptr){
91        ArrayDispersion * disp = static_cast<ArrayDispersion *>(ptr);
92        delete disp;
93        return;
94}
95
96/**
97 * Create an array dispersion model as a python object
98 */
99PyObject * new_array_dispersion(PyObject *, PyObject *args) {
100        ArrayDispersion *disp = new ArrayDispersion();
101        return PyCObject_FromVoidPtr(disp, del_array_dispersion);
102}
103
104#define INVECTOR(obj,buf,len)                                                                           \
105    do { \
106        int err = PyObject_AsReadBuffer(obj, (const void **)(&buf), &len); \
107        if (err < 0) return NULL; \
108        len /= sizeof(*buf); \
109    } while (0)
110
111/**
112 * Sets weights from a numpy array
113 */
114PyObject * set_weights(PyObject *, PyObject *args) {
115        PyObject *val_obj;
116        PyObject *wei_obj;
117        PyObject *disp;
118        Py_ssize_t nval;
119        Py_ssize_t nwei;
120        double *values;
121        double *weights;
122    //int i;
123
124        if (!PyArg_ParseTuple(args, "OOO", &disp, &val_obj, &wei_obj)) return NULL;
125        INVECTOR(val_obj, values, nval);
126        INVECTOR(wei_obj, weights, nwei);
127
128        // Sanity check
129        if(nval!=nwei) return NULL;
130
131        // Set the array pointers
132        void *temp = PyCObject_AsVoidPtr(disp);
133        DispersionModel * dispersion = static_cast<DispersionModel *>(temp);
134        dispersion->set_weights(nval, values, weights);
135
136        return Py_BuildValue("i",1);
137}
138
139
140
141/**
142 * Define empty module
143 */
144static PyMethodDef module_methods[] = {
145        {"new_dispersion_model", (PyCFunction)new_dispersion_model     , METH_VARARGS,
146                  "Create a new DispersionModel object"},
147        {"new_gaussian_model",   (PyCFunction)new_gaussian_dispersion, METH_VARARGS,
148                  "Create a new GaussianDispersion object"},
149        {"new_array_model",      (PyCFunction)new_array_dispersion  , METH_VARARGS,
150                  "Create a new ArrayDispersion object"},
151        {"set_dispersion_weights",(PyCFunction)set_weights  , METH_VARARGS,
152                        "Create the dispersion weight arrays for an Array Dispersion object"},
153    {NULL}
154};
155
156
157#ifndef PyMODINIT_FUNC  /* declarations for DLL import/export */
158#define PyMODINIT_FUNC void
159#endif
160PyMODINIT_FUNC
161initc_models(void)
162{
163    PyObject* m;
164
165    m = Py_InitModule3("c_models", module_methods,
166                       "C extension module for SANS scattering models.");
167        import_array();
168
169        addCCylinderModel(m);
170        addCParallelepipedModel(m);
171        addCCoreShellCylinderModel(m);
172        addCCoreShellModel(m);
173        addCEllipsoidModel(m);
174        addCSphereModel(m);
175        addCHardsphereStructure(m);
176        addCStickyHSStructure(m);
177        addCSquareWellStructure(m);
178        addCHayterMSAStructure(m);
179        addCDiamEllipFunc(m);
180        addCDiamCylFunc(m);
181        addCEllipticalCylinderModel(m);
182        addCTriaxialEllipsoidModel(m);
183        addCFlexibleCylinderModel(m);
184        addCStackedDisksModel(m);
185        addCLamellarPSModel(m);
186        addCLamellarPSHGModel(m);
187        addCOblateModel(m);
188        addCProlateModel(m);
189        addCLamellarModel(m);
190        addCLamellarFFHGModel(m);
191        addCHollowCylinderModel(m);
192        addCMultiShellModel(m);
193        addCBinaryHSModel(m);
194        addDisperser(m);
195        addCGaussian(m);
196        addCLorentzian(m);
197        addCVesicleModel(m);
198
199
200}
Note: See TracBrowser for help on using the repository browser.