Changeset 14316


Ignore:
Timestamp:
02/04/13 09:14:30 (12 years ago)
Author:
jschierm
Message:

FIX: Consider strides on module input from Python matrices (slow right now, but works).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/wrappers/python/io/FetchPythonData.cpp

    r14236 r14316  
    103103        long* lmatrix=NULL;
    104104        bool* bmatrix=NULL;
    105         int i;
     105        int i,j,k,ipt=0;
     106        int mstride,nstride;
     107        npy_intp*  strides=NULL;
     108//      PyObject* py_matrix2;
    106109
    107110        if     (PyArray_Check((PyArrayObject*)py_matrix)) {
     
    111114                        dims=PyArray_DIMS((PyArrayObject*)py_matrix);
    112115                        M=dims[0]; N=dims[1];
     116                        strides=PyArray_STRIDES((PyArrayObject*)py_matrix);
     117                        mstride=strides[0]; nstride=strides[1];
    113118                }
    114119                else if (ndim==1) {
    115120                        dims=PyArray_DIMS((PyArrayObject*)py_matrix);
    116121                        M=dims[0]; N=1;
     122                        strides=PyArray_STRIDES((PyArrayObject*)py_matrix);
     123                        mstride=strides[0]; nstride=1;
    117124                }
    118125                else
    119126                        _error_("expecting an MxN matrix or M vector in input!");
     127
     128//              _printf_(1,"M=%d, N=%d\n",M,N);
     129//              _printf_(1,"mstride=%d, nstride=%d\n",mstride,nstride);
     130//              _printf_(1,"py_matrix: FLAGS=%d, NPY_ARRAY_C_CONTIGUOUS=%d, FLAGS & NPY_ARRAY_C_CONTIGUOUS=%d\n",PyArray_FLAGS((PyArrayObject*)py_matrix),NPY_ARRAY_C_CONTIGUOUS,PyArray_FLAGS((PyArrayObject*)py_matrix) & NPY_ARRAY_C_CONTIGUOUS);
     131//              _printf_(1,"NPY_SIZEOF_DOUBLE=%d\n",NPY_SIZEOF_DOUBLE);
     132//              _printf_(1,"NPY_SIZEOF_INT64=%d\n",NPY_SIZEOF_INT64);
     133//              _printf_(1,"NPY_SIZEOF_BOOL=%d\n",NPY_SIZEOF_BOOL);
     134//              _printf_(1,"NPY_LONG=%d\n",NPY_LONG);
     135//              _printf_(1,"NPY_INT64=%d\n",NPY_INT64);
     136//              _printf_(1,"NPY_BOOL=%d\n",NPY_BOOL);
     137//              _printf_(1,"NPY_CHAR=%d\n",NPY_CHAR);
    120138
    121139                if (M && N) {
     
    126144                                /*copy matrix: */
    127145                                matrix=xNew<double>(M*N);
    128                                 memcpy(matrix,dmatrix,(M*N)*sizeof(double));
    129                         }
    130 
    131                         else if (PyArray_TYPE((PyArrayObject*)py_matrix) == NPY_INT64) {
     146                                if (PyArray_FLAGS((PyArrayObject*)py_matrix) & NPY_ARRAY_C_CONTIGUOUS) {
     147                                        memcpy(matrix,dmatrix,(M*N)*sizeof(double));
     148                                }
     149                                else {
     150                                        mstride/=PyArray_ITEMSIZE((PyArrayObject*)py_matrix);
     151                                        nstride/=PyArray_ITEMSIZE((PyArrayObject*)py_matrix);
     152                                        for (i=0; i<M; i++) {
     153                                                k=i*mstride;
     154                                                for (j=0; j<N; j++) {
     155                                                        matrix[ipt++]=dmatrix[k];
     156                                                        k+=nstride;
     157                                                }
     158                                        }
     159//                               py_matrix2=PyArray_FromObject(py_matrix,NPY_DOUBLE,PyArray_NDIM((const PyArrayObject*)py_matrix),PyArray_NDIM((const PyArrayObject*)py_matrix));
     160//                              _printf_(1,"py_matrix2: FLAGS=%d, NPY_ARRAY_C_CONTIGUOUS=%d, FLAGS & NPY_ARRAY_C_CONTIGUOUS=%d\n",PyArray_FLAGS((PyArrayObject*)py_matrix2),NPY_ARRAY_C_CONTIGUOUS,PyArray_FLAGS((PyArrayObject*)py_matrix2) & NPY_ARRAY_C_CONTIGUOUS);
     161//                              dmatrix=(double*)PyArray_DATA((PyArrayObject*)py_matrix2);
     162//                              memcpy(matrix,dmatrix,(M*N)*sizeof(double));
     163                                }
     164                        }
     165
     166                        else if (PyArray_TYPE((PyArrayObject*)py_matrix) == NPY_LONG) {
    132167                                /*retrieve internal value: */
    133168                                lmatrix=(long*)PyArray_DATA((PyArrayObject*)py_matrix);
     
    206241                        }
    207242
    208                         else if (PyArray_TYPE((PyArrayObject*)py_matrix) == NPY_INT64) {
     243                        else if (PyArray_TYPE((PyArrayObject*)py_matrix) == NPY_LONG) {
    209244                                /*retrieve internal value: */
    210245                                lmatrix=(long*)PyArray_DATA((PyArrayObject*)py_matrix);
     
    283318                        }
    284319
    285                         else if (PyArray_TYPE((PyArrayObject*)py_matrix) == NPY_INT64) {
     320                        else if (PyArray_TYPE((PyArrayObject*)py_matrix) == NPY_LONG) {
    286321                                /*retrieve internal value: */
    287322                                lmatrix=(long*)PyArray_DATA((PyArrayObject*)py_matrix);
     
    363398                        }
    364399
    365                         else if (PyArray_TYPE((PyArrayObject*)py_vector) == NPY_INT64) {
     400                        else if (PyArray_TYPE((PyArrayObject*)py_vector) == NPY_LONG) {
    366401                                /*retrieve internal value: */
    367402                                lvector=(long*)PyArray_DATA((PyArrayObject*)py_vector);
     
    441476                        }
    442477
    443                         else if (PyArray_TYPE((PyArrayObject*)py_vector) == NPY_INT64) {
     478                        else if (PyArray_TYPE((PyArrayObject*)py_vector) == NPY_LONG) {
    444479                                /*retrieve internal value: */
    445480                                lvector=(long*)PyArray_DATA((PyArrayObject*)py_vector);
     
    519554                        }
    520555
    521                         else if (PyArray_TYPE((PyArrayObject*)py_vector) == NPY_INT64) {
     556                        else if (PyArray_TYPE((PyArrayObject*)py_vector) == NPY_LONG) {
    522557                                /*retrieve internal value: */
    523558                                lvector=(long*)PyArray_DATA((PyArrayObject*)py_vector);
Note: See TracChangeset for help on using the changeset viewer.