Changeset 812b901 in sasview for sansmodels/src/sans/models/c_models/CSphereModel.cpp
- Timestamp:
- Jul 27, 2009 3:56:14 PM (15 years ago)
- Branches:
- master, ESS_GUI, ESS_GUI_Docs, ESS_GUI_batch_fitting, ESS_GUI_bumps_abstraction, ESS_GUI_iss1116, ESS_GUI_iss879, ESS_GUI_iss959, ESS_GUI_opencl, ESS_GUI_ordering, ESS_GUI_sync_sascalc, costrafo411, magnetic_scatt, release-4.1.1, release-4.1.2, release-4.2.2, release_4.0.1, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
- Children:
- 4176435
- Parents:
- 6f2c919
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sansmodels/src/sans/models/c_models/CSphereModel.cpp
r836fe6e r812b901 23 23 */ 24 24 25 #define NO_IMPORT_ARRAY 26 #define PY_ARRAY_UNIQUE_SYMBOL PyArray_API_sans 27 25 28 extern "C" { 26 29 #include <Python.h> 30 #include <arrayobject.h> 27 31 #include "structmember.h" 28 32 #include <stdio.h> … … 130 134 } 131 135 } 132 133 136 /** 137 * Function to call to evaluate model 138 * @param args: input numpy array q[] 139 * @return: numpy array object 140 */ 141 142 static PyObject *evaluateOneDim(SphereModel* model, PyArrayObject *q){ 143 PyArrayObject *result; 144 145 // Check validity of array q , q must be of dimension 1, an array of double 146 if (q->nd != 1 || q->descr->type_num != PyArray_DOUBLE) 147 { 148 //const char * message= "Invalid array: q->nd=%d,type_num=%d\n",q->nd,q->descr->type_num; 149 //PyErr_SetString(PyExc_ValueError , message); 150 return NULL; 151 } 152 result = (PyArrayObject *)PyArray_FromDims(q->nd, (int *)(q->dimensions), 153 PyArray_DOUBLE); 154 if (result == NULL) { 155 const char * message= "Could not create result "; 156 PyErr_SetString(PyExc_RuntimeError , message); 157 return NULL; 158 } 159 for (int i = 0; i < q->dimensions[0]; i++){ 160 double q_value = *(double *)(q->data + i*q->strides[0]); 161 double *result_value = (double *)(result->data + i*result->strides[0]); 162 *result_value =(*model)(q_value); 163 } 164 return PyArray_Return(result); 165 } 166 /** 167 * Function to call to evaluate model 168 * @param args: input numpy array [q[],phi[]] 169 * @return: numpy array object 170 */ 171 static PyObject * evaluateTwoDim( SphereModel* model, 172 PyArrayObject *q, PyArrayObject *phi) 173 { 174 PyArrayObject *result; 175 //check validity of input vectors 176 if (q->nd != 1 || q->descr->type_num != PyArray_DOUBLE 177 || phi->nd != 1 || phi->descr->type_num != PyArray_DOUBLE 178 || phi->dimensions[0] != q->dimensions[0]){ 179 180 //const char * message= "Invalid array: q->nd=%d,type_num=%d\n",q->nd,q->descr->type_num; 181 //PyErr_SetString(PyExc_ValueError , message); 182 return NULL; 183 } 184 result= (PyArrayObject *)PyArray_FromDims(q->nd,(int*)(q->dimensions), PyArray_DOUBLE); 185 186 if (result == NULL){ 187 const char * message= "Could not create result "; 188 PyErr_SetString(PyExc_RuntimeError , message); 189 return NULL; 190 } 191 192 for (int i = 0; i < q->dimensions[0]; i++) { 193 double q_value = *(double *)(q->data + i*q->strides[0]); 194 double phi_value = *(double *)(phi->data + i*phi->strides[0]); 195 double *result_value = (double *)(result->data + i*result->strides[0]); 196 if (q_value == 0) 197 *result_value = 0.0; 198 else 199 *result_value = model->evaluate_rphi(q_value, phi_value); 200 } 201 return PyArray_Return(result); 202 } 203 204 /** 205 * Function to call to evaluate model 206 * @param args: input numpy array [x[],y[]] 207 * @return: numpy array object 208 */ 209 static PyObject * evaluateTwoDimXY( SphereModel* model, 210 PyArrayObject *x, PyArrayObject *y) 211 { 212 PyArrayObject *result; 213 //check validity of input vectors 214 if (x->nd != 1 || x->descr->type_num != PyArray_DOUBLE 215 || y->nd != 1 || y->descr->type_num != PyArray_DOUBLE 216 || y->dimensions[0] != x->dimensions[0]){ 217 218 //const char * message= "Invalid array: x->nd=%d,type_num=%d\n",x->nd,x->descr->type_num; 219 //PyErr_SetString(PyExc_ValueError , message); 220 return NULL; 221 } 222 result= (PyArrayObject *)PyArray_FromDims(x->nd,(int*)(x->dimensions), PyArray_DOUBLE); 223 224 if (result == NULL){ 225 const char * message= "Could not create result "; 226 PyErr_SetString(PyExc_RuntimeError , message); 227 return NULL; 228 } 229 230 for (int i = 0; i < x->dimensions[0]; i++) { 231 double x_value = *(double *)(x->data + i*x->strides[0]); 232 double y_value = *(double *)(y->data + i*y->strides[0]); 233 double *result_value = (double *)(result->data + i*result->strides[0]); 234 if (x_value == 0) 235 *result_value = 0.0; 236 else 237 *result_value = (*model)(x_value, y_value); 238 } 239 return PyArray_Return(result); 240 } 241 134 242 /** 135 243 * Function to call to evaluate model … … 173 281 return NULL; 174 282 } 283 175 284 // We have a vector q, get the q and phi values at which 176 285 // to evaluate I(q,phi) 177 q_value = CSphereModel_readDouble(PyList_GET_ITEM(pars,0)); 178 phi_value = CSphereModel_readDouble(PyList_GET_ITEM(pars,1)); 179 // Skip zero 180 if (q_value==0) { 181 return Py_BuildValue("d",0.0); 182 } 183 return Py_BuildValue("d",(*(self->model)).evaluate_rphi(q_value,phi_value)); 184 286 PyObject *q, *phi; 287 q = PyList_GET_ITEM(pars,0); 288 phi = PyList_GET_ITEM(pars,1); 289 290 if (PyArray_Check(q) && PyArray_Check(phi)) { 291 return evaluateTwoDim(self->model, (PyArrayObject*)q, (PyArrayObject*)phi); 292 } else if (PyArray_Check(q) || PyArray_Check(phi)) { 293 return NULL; 294 } else { 295 q_value = CSphereModel_readDouble(PyList_GET_ITEM(pars,0)); 296 phi_value = CSphereModel_readDouble(PyList_GET_ITEM(pars,1)); 297 // Skip zero 298 if (q_value==0) { 299 return Py_BuildValue("d",0.0); 300 } 301 return Py_BuildValue("d",(*(self->model)).evaluate_rphi(q_value,phi_value)); 302 } 185 303 } else { 186 187 // We have a scalar q, we will evaluate I(q) 304 if (PyArray_Check(pars)) { 305 return evaluateOneDim(self->model, (PyArrayObject*)pars); 306 } else { 307 // We have a scalar q, we will evaluate I(q) 188 308 q_value = CSphereModel_readDouble(pars); 189 190 return Py_BuildValue("d",(*(self->model))(q_value));191 } 309 return Py_BuildValue("d",(*(self->model))(q_value)); 310 } 311 } 192 312 } 193 313 … … 235 355 // We have a vector q, get the qx and qy values at which 236 356 // to evaluate I(qx,qy) 237 qx_value = CSphereModel_readDouble(PyList_GET_ITEM(pars,0)); 238 qy_value = CSphereModel_readDouble(PyList_GET_ITEM(pars,1)); 239 return Py_BuildValue("d",(*(self->model))(qx_value,qy_value)); 357 PyObject *x, *y; 358 x = PyList_GET_ITEM(pars,0); 359 y = PyList_GET_ITEM(pars,1); 360 361 if (PyArray_Check(x) && PyArray_Check(y)) { 362 return evaluateTwoDimXY(self->model, (PyArrayObject*)x, (PyArrayObject*)y); 363 } else if (PyArray_Check(x) || PyArray_Check(y)) { 364 return NULL; 365 } else { 366 qx_value = CSphereModel_readDouble(PyList_GET_ITEM(pars,0)); 367 qy_value = CSphereModel_readDouble(PyList_GET_ITEM(pars,1)); 368 return Py_BuildValue("d",(*(self->model))(qx_value,qy_value)); 369 } 240 370 241 371 } else { 242 243 // We have a scalar q, we will evaluate I(q) 244 qx_value = CSphereModel_readDouble(pars); 372 if (PyArray_Check(pars)) { 373 return evaluateOneDim(self->model, (PyArrayObject*)pars); 374 } else { 375 // We have a scalar q, we will evaluate I(q) 376 qx_value = CSphereModel_readDouble(pars); 245 377 246 return Py_BuildValue("d",(*(self->model))(qx_value)); 378 return Py_BuildValue("d",(*(self->model))(qx_value)); 379 } 247 380 } 248 381 } … … 340 473 341 474 342 static PyMethodDef module_methods[] = {343 {NULL}344 };345 346 475 /** 347 476 * Function used to add the model class to a module
Note: See TracChangeset
for help on using the changeset viewer.