Ignore:
Timestamp:
Nov 7, 2017 1:05:12 PM (7 years ago)
Author:
Paul Kienzle <pkienzle@…>
Branches:
master, magnetic_scatt, release-4.2.2, ticket-1009, ticket-1094-headless, ticket-1242-2d-resolution, ticket-1243, ticket-1249, ticket885, unittest-saveload
Children:
f926abb
Parents:
0957bb3a
Message:

fix C interface to sldi after py3 conversion

Location:
src/sas/sascalc/calculator/c_extensions
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/sas/sascalc/calculator/c_extensions/sld2i.c

    r0957bb3a r54b0650  
    2525 * @param s_theta: angle (from x-axis) of the up spin in degree 
    2626 */ 
    27 void initGenI(GenI* this, int npix, double* x, double* y, double* z, double* sldn, 
     27void initGenI(GenI* this, int is_avg, int npix, double* x, double* y, double* z, double* sldn, 
    2828                        double* mx, double* my, double* mz, double* voli, 
    2929                        double in_spin, double out_spin, 
    3030                        double s_theta) { 
     31        this->is_avg = is_avg; 
    3132        this->n_pix = npix; 
    3233        this->x_val = x; 
     
    7374        // Loop over q-values and multiply apply matrix 
    7475 
     76        //printf("npoints: %d, npix: %d\n", npoints, this->n_pix); 
    7577        for(int i=0; i<npoints; i++){ 
    7678                //I_out[i] = 0.0; 
     
    150152        // Assumes that q doesn't have qz component and sld_n is all real 
    151153        //double Pi = 4.0*atan(1.0); 
    152         int is_sym = this->n_pix < 0; 
    153154        double qr = 0.0; 
    154155        double sumj; 
    155156        double sld_j = 0.0; 
    156157        double count = 0.0; 
    157         int n_pix = is_sym ? -this->n_pix : this->n_pix; 
    158158        //Assume that pixel volumes are given in vol_pix in A^3 unit 
    159159        // Loop over q-values and multiply apply matrix 
    160160        for(int i=0; i<npoints; i++){ 
    161161                sumj =0.0; 
    162                 for(int j=0; j<n_pix; j++){ 
     162                for(int j=0; j<this->n_pix; j++){ 
    163163                        //Isotropic: Assumes all slds are real (no magnetic) 
    164164                        //Also assumes there is no polarization: No dependency on spin 
    165                         if (is_sym == 1){ 
     165                        if (this->is_avg == 1){ 
    166166                                // approximation for a spherical symmetric particle 
    167167                                qr = sqrt(this->x_val[j]*this->x_val[j]+this->y_val[j]*this->y_val[j]+this->z_val[j]*this->z_val[j])*q[i]; 
     
    177177                                //full calculation 
    178178                                //pragma omp parallel for 
    179                                 for(int k=0; k<n_pix; k++){ 
     179                                for(int k=0; k<this->n_pix; k++){ 
    180180                                        sld_j =  this->sldn_val[j] * this->sldn_val[k] * this->vol_pix[j] * this->vol_pix[k]; 
    181181                                        qr = (this->x_val[j]-this->x_val[k])*(this->x_val[j]-this->x_val[k])+ 
     
    196196                } 
    197197                I_out[i] = sumj; 
    198                 if (is_sym == 1){ 
     198                if (this->is_avg == 1) { 
    199199                        I_out[i] *= sumj; 
    200200                } 
  • src/sas/sascalc/calculator/c_extensions/sld2i.h

    r0957bb3a r54b0650  
    1010typedef struct { 
    1111        // vectors 
     12        int is_avg; 
    1213        int n_pix; 
    1314        double* x_val; 
     
    2627 
    2728// Constructor 
    28 void initGenI(GenI*, int npix, double* x, double* y, double* z, double* sldn, 
    29                 double* mx, double* my, double* mz, double* voli, 
     29void initGenI(GenI*, int is_avg, int npix, double* x, double* y, double* z, 
     30                double* sldn, double* mx, double* my, double* mz, double* voli, 
    3031                double in_spin, double out_spin, 
    3132                double s_theta); 
  • src/sas/sascalc/calculator/c_extensions/sld2i_module.c

    r0957bb3a r54b0650  
    3535void 
    3636del_sld2i(PyObject *obj){ 
     37#if PY_MAJOR_VERSION < 3 
     38        GenI* sld2i = (GenI *)obj; 
     39#else 
    3740        GenI* sld2i = (GenI *)(PyCapsule_GetPointer(obj, "GenI")); 
     41#endif 
    3842        PyMem_Free((void *)sld2i); 
    3943} 
     
    5155        PyObject *mz_val_obj; 
    5256        PyObject *vol_pix_obj; 
    53         Py_ssize_t n_x; 
    54         //PyObject rlimit_obj; 
    55         //PyObject npoints_obj; 
    56         //PyObject nrbins_obj; 
    57         //PyObject nphibins_obj; 
    58         int n_pix; 
     57        Py_ssize_t n_x, n_y, n_z, n_sld, n_mx, n_my, n_mz, n_vol_pix; 
     58        int is_avg; 
    5959        double* x_val; 
    6060        double* y_val; 
     
    6969        double stheta; 
    7070 
    71         if (!PyArg_ParseTuple(args, "iOOOOOOOOddd", &n_pix, &x_val_obj, &y_val_obj, &z_val_obj, &sldn_val_obj, &mx_val_obj, &my_val_obj, &mz_val_obj, &vol_pix_obj, &inspin, &outspin, &stheta)) return NULL; 
    72         OUTVECTOR(x_val_obj, x_val, n_x); 
    73         OUTVECTOR(y_val_obj, y_val, n_x); 
    74         OUTVECTOR(z_val_obj, z_val, n_x); 
    75         OUTVECTOR(sldn_val_obj, sldn_val, n_x); 
    76         OUTVECTOR(mx_val_obj, mx_val, n_x); 
    77         OUTVECTOR(my_val_obj, my_val, n_x); 
    78         OUTVECTOR(mz_val_obj, mz_val, n_x); 
    79         OUTVECTOR(vol_pix_obj, vol_pix, n_x); 
    80         GenI* sld2i =  PyMem_Malloc(sizeof(GenI)); 
     71        if (!PyArg_ParseTuple(args, "iOOOOOOOOddd", &is_avg, &x_val_obj, &y_val_obj, &z_val_obj, &sldn_val_obj, &mx_val_obj, &my_val_obj, &mz_val_obj, &vol_pix_obj, &inspin, &outspin, &stheta)) return NULL; 
     72        INVECTOR(x_val_obj, x_val, n_x); 
     73        INVECTOR(y_val_obj, y_val, n_y); 
     74        INVECTOR(z_val_obj, z_val, n_z); 
     75        INVECTOR(sldn_val_obj, sldn_val, n_sld); 
     76        INVECTOR(mx_val_obj, mx_val, n_mx); 
     77        INVECTOR(my_val_obj, my_val, n_my); 
     78        INVECTOR(mz_val_obj, mz_val, n_mz); 
     79        INVECTOR(vol_pix_obj, vol_pix, n_vol_pix); 
     80        GenI* sld2i = PyMem_Malloc(sizeof(GenI)); 
     81        //printf("sldi:%p\n", sld2i); 
    8182        if (sld2i != NULL) { 
    82                 initGenI(sld2i, n_pix,x_val,y_val,z_val,sldn_val,mx_val,my_val,mz_val,vol_pix,inspin,outspin,stheta); 
     83                initGenI(sld2i,is_avg,n_x,x_val,y_val,z_val,sldn_val,mx_val,my_val,mz_val,vol_pix,inspin,outspin,stheta); 
    8384        } 
    84         return PyCapsule_New(sld2i, "GenI", del_sld2i); 
     85        PyObject *obj = PyCapsule_New(sld2i, "GenI", del_sld2i); 
     86        //printf("constructed %p\n", obj); 
     87        return obj; 
    8588} 
    8689 
     
    8992 */ 
    9093PyObject * genicom_inputXY(PyObject *self, PyObject *args) { 
    91         int npoints; 
     94        PyObject *gen_obj; 
    9295        PyObject *qx_obj; 
     96        PyObject *qy_obj; 
     97        PyObject *I_out_obj; 
     98        Py_ssize_t n_qx, n_qy, n_out; 
    9399        double *qx; 
    94         PyObject *qy_obj; 
    95100        double *qy; 
    96         PyObject *I_out_obj; 
    97         Py_ssize_t n_out; 
    98101        double *I_out; 
    99         PyObject *gen_obj; 
    100102 
    101         if (!PyArg_ParseTuple(args, "OiOOO",  &gen_obj, &npoints, &qx_obj, &qy_obj, &I_out_obj)) return NULL; 
    102         OUTVECTOR(qx_obj, qx, n_out); 
    103         OUTVECTOR(qy_obj, qy, n_out); 
     103        if (!PyArg_ParseTuple(args, "OOOO",  &gen_obj, &qx_obj, &qy_obj, &I_out_obj)) return NULL; 
     104        GenI* sld2i = (GenI *)PyCapsule_GetPointer(gen_obj, "GenI"); 
     105        INVECTOR(qx_obj, qx, n_qx); 
     106        INVECTOR(qy_obj, qy, n_qy); 
    104107        OUTVECTOR(I_out_obj, I_out, n_out); 
    105108 
    106109        // Sanity check 
    107         //if(n_in!=n_out) return Py_BuildValue("i",-1); 
     110        //if(n_q!=n_out) return Py_BuildValue("i",-1); 
    108111 
    109         // Set the array pointers 
    110         GenI* sld2i = (GenI *)PyCapsule_GetPointer(gen_obj, "GenI"); 
    111  
    112         genicomXY(sld2i, npoints, qx, qy, I_out); 
     112        genicomXY(sld2i, n_qx, qx, qy, I_out); 
    113113        //return PyCObject_FromVoidPtr(s, del_genicom); 
    114114        return Py_BuildValue("i",1); 
     
    119119 */ 
    120120PyObject * genicom_input(PyObject *self, PyObject *args) { 
    121         int npoints; 
     121        PyObject *gen_obj; 
    122122        PyObject *q_obj; 
     123        PyObject *I_out_obj; 
     124        Py_ssize_t n_q, n_out; 
    123125        double *q; 
    124         PyObject *I_out_obj; 
    125         Py_ssize_t n_out; 
    126126        double *I_out; 
    127         PyObject *gen_obj; 
    128127 
    129         if (!PyArg_ParseTuple(args, "OiOO",  &gen_obj, &npoints, &q_obj, &I_out_obj)) return NULL; 
    130         OUTVECTOR(q_obj, q, n_out); 
     128        if (!PyArg_ParseTuple(args, "OOO",  &gen_obj, &q_obj, &I_out_obj)) return NULL; 
     129        GenI *sld2i = (GenI *)PyCapsule_GetPointer(gen_obj, "GenI"); 
     130        INVECTOR(q_obj, q, n_q); 
    131131        OUTVECTOR(I_out_obj, I_out, n_out); 
    132132 
    133133        // Sanity check 
    134         //if(n_in!=n_out) return Py_BuildValue("i",-1); 
     134        //if (n_q!=n_out) return Py_BuildValue("i",-1); 
    135135 
    136         // Set the array pointers 
    137         GenI *sld2i = (GenI *)PyCapsule_GetPointer(gen_obj, "GenI"); 
    138  
    139         genicom(sld2i, npoints, q, I_out); 
    140         //return PyCObject_FromVoidPtr(s, del_genicom); 
     136        genicom(sld2i, n_q, q, I_out); 
    141137        return Py_BuildValue("i",1); 
    142138} 
Note: See TracChangeset for help on using the changeset viewer.