source: sasview/sansmodels/src/c_models/c_models.cpp @ 9cd0baa

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 9cd0baa was 7289627, checked in by Jae Cho <jhjcho@…>, 13 years ago

change core2ndmoment model name and added the help doc

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