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

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 0cbfaeb was 59b9b675, checked in by Jae Cho <jhjcho@…>, 14 years ago

1) reverting diperser(used only in test) files for unittest. 2)changed the sigma of polydispersion to ratio for length parameters. 3) update an unittest

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