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

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

added simple cubic paracrystal 1d and anisotropic model; still needs more test and doc.s

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