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

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

added models and unit tests

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