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

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 fbae881 was 35aface, checked in by Jae Cho <jhjcho@…>, 14 years ago

addede new models and attr. non_fittable

  • Property mode set to 100644
File size: 7.5 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 addCOnionModel(PyObject *module);
18void addCReflModel(PyObject *module);
19void addCFuzzySphereModel(PyObject *module);
20void addCHardsphereStructure(PyObject *module);
21void addCStickyHSStructure(PyObject *module);
22void addCSquareWellStructure(PyObject *module);
23void addCHayterMSAStructure(PyObject *module);
24void addCCoreShellModel(PyObject *module);
25void addCCoreFourShellModel(PyObject *module);
26void addCCoreShellCylinderModel(PyObject *module);
27void addCEllipsoidModel(PyObject *module);
28void addCEllipticalCylinderModel(PyObject *module);
29void addCTriaxialEllipsoidModel(PyObject *module);
30void addCFlexibleCylinderModel(PyObject *module);
31void addCFlexCylEllipXModel(PyObject *module);
32void addCStackedDisksModel(PyObject *module);
33void addCLamellarPSModel(PyObject *module);
34void addCLamellarPSHGModel(PyObject *module);
35void addCCoreShellEllipsoidModel(PyObject *module);
36void addCDiamEllipFunc(PyObject *module);
37void addCDiamCylFunc(PyObject *module);
38
39//void addCOblateModel(PyObject *module);
40//void addCProlateModel(PyObject *module);
41void addCLamellarModel(PyObject *module);
42void addCLamellarFFHGModel(PyObject *module);
43void addCHollowCylinderModel(PyObject *module);
44void addCMultiShellModel(PyObject *module);
45void addCVesicleModel(PyObject *module);
46void addCBinaryHSModel(PyObject *module);
47void addCRPAModel(PyObject *module);
48void addCFractalModel(PyObject *module);
49void addCPoly_GaussCoil(PyObject *module);
50
51
52extern "C" {
53        //void addCCoreShellCylinderModel(PyObject *module);
54        //void addCCoreShellModel(PyObject *module);
55        //void addCEllipsoidModel(PyObject *module);
56        //void addCEllipticalCylinderModel(PyObject *module);
57        void addDisperser(PyObject *module);
58        void addCGaussian(PyObject *module);
59        void addCLorentzian(PyObject *module);
60        void addCLogNormal(PyObject *module);
61        void addCSchulz(PyObject *module);
62}
63
64/**
65 * Delete a dispersion model object
66 */
67void del_dispersion_model(void *ptr){
68        DispersionModel * disp = static_cast<DispersionModel *>(ptr);
69        delete disp;
70        return;
71}
72
73/**
74 * Create a dispersion model as a python object
75 */
76PyObject * new_dispersion_model(PyObject *, PyObject *args) {
77        DispersionModel *disp = new DispersionModel();
78        return PyCObject_FromVoidPtr(disp, del_dispersion_model);
79}
80
81
82/**
83 * Delete a lognormal dispersion model object
84 */
85void del_lognormal_dispersion(void *ptr){
86        LogNormalDispersion * disp = static_cast<LogNormalDispersion *>(ptr);
87        delete disp;
88        return;
89}
90
91/**
92 * Create a lognormal dispersion model as a python object
93 */
94PyObject * new_lognormal_dispersion(PyObject *, PyObject *args) {
95        LogNormalDispersion *disp = new LogNormalDispersion();
96        return PyCObject_FromVoidPtr(disp, del_lognormal_dispersion);
97}
98
99/**
100 * Delete a gaussian dispersion model object
101 */
102void del_gaussian_dispersion(void *ptr){
103        GaussianDispersion * disp = static_cast<GaussianDispersion *>(ptr);
104        delete disp;
105        return;
106}
107
108/**
109 * Create a gaussian dispersion model as a python object
110 */
111PyObject * new_gaussian_dispersion(PyObject *, PyObject *args) {
112        GaussianDispersion *disp = new GaussianDispersion();
113        return PyCObject_FromVoidPtr(disp, del_gaussian_dispersion);
114}
115
116/**
117 * Delete a schulz dispersion model object
118 */
119void del_schulz_dispersion(void *ptr){
120        SchulzDispersion * disp = static_cast<SchulzDispersion *>(ptr);
121        delete disp;
122        return;
123}
124/**
125 * Create a schulz dispersion model as a python object
126 */
127PyObject * new_schulz_dispersion(PyObject *, PyObject *args) {
128        SchulzDispersion *disp = new SchulzDispersion();
129        return PyCObject_FromVoidPtr(disp, del_schulz_dispersion);
130}
131
132
133/**
134 * Delete an array dispersion model object
135 */
136void del_array_dispersion(void *ptr){
137        ArrayDispersion * disp = static_cast<ArrayDispersion *>(ptr);
138        delete disp;
139        return;
140}
141
142/**
143 * Create an array dispersion model as a python object
144 */
145PyObject * new_array_dispersion(PyObject *, PyObject *args) {
146        ArrayDispersion *disp = new ArrayDispersion();
147        return PyCObject_FromVoidPtr(disp, del_array_dispersion);
148}
149
150#define INVECTOR(obj,buf,len)                                                                           \
151    do { \
152        int err = PyObject_AsReadBuffer(obj, (const void **)(&buf), &len); \
153        if (err < 0) return NULL; \
154        len /= sizeof(*buf); \
155    } while (0)
156
157/**
158 * Sets weights from a numpy array
159 */
160PyObject * set_weights(PyObject *, PyObject *args) {
161        PyObject *val_obj;
162        PyObject *wei_obj;
163        PyObject *disp;
164        Py_ssize_t nval;
165        Py_ssize_t nwei;
166        double *values;
167        double *weights;
168    //int i;
169
170        if (!PyArg_ParseTuple(args, "OOO", &disp, &val_obj, &wei_obj)) return NULL;
171        INVECTOR(val_obj, values, nval);
172        INVECTOR(wei_obj, weights, nwei);
173
174        // Sanity check
175        if(nval!=nwei) return NULL;
176
177        // Set the array pointers
178        void *temp = PyCObject_AsVoidPtr(disp);
179        DispersionModel * dispersion = static_cast<DispersionModel *>(temp);
180        dispersion->set_weights(nval, values, weights);
181
182        return Py_BuildValue("i",1);
183}
184
185
186
187/**
188 * Define empty module
189 */
190static PyMethodDef module_methods[] = {
191        {"new_dispersion_model", (PyCFunction)new_dispersion_model     , METH_VARARGS,
192                  "Create a new DispersionModel object"},
193        {"new_gaussian_model",   (PyCFunction)new_gaussian_dispersion, METH_VARARGS,
194                  "Create a new GaussianDispersion object"},
195    {"new_lognormal_model",   (PyCFunction)new_lognormal_dispersion, METH_VARARGS,
196                  "Create a new LogNormalDispersion object"},
197    {"new_schulz_model",   (PyCFunction)new_schulz_dispersion, METH_VARARGS,
198                  "Create a new SchulzDispersion object"},
199        {"new_array_model",      (PyCFunction)new_array_dispersion  , METH_VARARGS,
200                  "Create a new ArrayDispersion object"},
201        {"set_dispersion_weights",(PyCFunction)set_weights  , METH_VARARGS,
202                        "Create the dispersion weight arrays for an Array Dispersion object"},
203    {NULL}
204};
205
206
207#ifndef PyMODINIT_FUNC  /* declarations for DLL import/export */
208#define PyMODINIT_FUNC void
209#endif
210PyMODINIT_FUNC
211initc_models(void)
212{
213    PyObject* m;
214
215    m = Py_InitModule3("c_models", module_methods,
216                       "C extension module for SANS scattering models.");
217        import_array();
218
219        addCCylinderModel(m);
220        addCParallelepipedModel(m);
221        addCCoreShellCylinderModel(m);
222        addCCoreShellModel(m);
223        addCCoreFourShellModel(m);
224        addCEllipsoidModel(m);
225        addCSphereModel(m);
226        addCOnionModel(m);
227        addCReflModel(m);
228        addCFuzzySphereModel(m);
229        addCHardsphereStructure(m);
230        addCStickyHSStructure(m);
231        addCSquareWellStructure(m);
232        addCHayterMSAStructure(m);
233        addCEllipticalCylinderModel(m);
234        addCTriaxialEllipsoidModel(m);
235        addCFlexibleCylinderModel(m);
236        addCFlexCylEllipXModel(m);
237        addCStackedDisksModel(m);
238        addCLamellarPSModel(m);
239        addCLamellarPSHGModel(m);
240        addCCoreShellEllipsoidModel(m);
241        addCDiamEllipFunc(m);
242        addCDiamCylFunc(m);
243
244//      addCOblateModel(m);
245//      addCProlateModel(m);
246        addCLamellarModel(m);
247        addCLamellarFFHGModel(m);
248        addCHollowCylinderModel(m);
249        addCMultiShellModel(m);
250        addCBinaryHSModel(m);
251        addDisperser(m);
252        addCGaussian(m);
253        addCSchulz(m);
254        addCLogNormal(m);
255        addCLorentzian(m);
256        addCVesicleModel(m);
257        addCPoly_GaussCoil(m);
258        addCRPAModel(m);
259        addCFractalModel(m);
260}
Note: See TracBrowser for help on using the repository browser.