static PyObject* gridder_3D(PyObject *self, PyObject *args, PyObject *kwargs){ PyObject *gridout = NULL, *Nout = NULL, *standarderror = NULL; PyObject *gridI = NULL; PyObject *_I; static char *kwlist[] = { "data", "xrange", "yrange", "zrange", "norm", NULL }; npy_intp data_size; npy_intp dims[3]; double grid_start[3]; double grid_stop[3]; int grid_nsteps[3]; int norm_data = 0; unsigned long n_outside; if(!PyArg_ParseTupleAndKeywords(args, kwargs, "O(ddd)(ddd)(iii)|i", kwlist, &_I, &grid_start[0], &grid_start[1], &grid_start[2], &grid_stop[0], &grid_stop[1], &grid_stop[2], &grid_nsteps[0], &grid_nsteps[1], &grid_nsteps[2], &norm_data)){ return NULL; } gridI = PyArray_FROMANY(_I, NPY_DOUBLE, 0, 0, NPY_IN_ARRAY); if(!gridI){ goto cleanup; } data_size = PyArray_DIM(gridI, 0); dims[0] = grid_nsteps[0]; dims[1] = grid_nsteps[1]; dims[2] = grid_nsteps[2]; gridout = PyArray_ZEROS(3, dims, NPY_DOUBLE, 0); if(!gridout){ goto cleanup; } Nout = PyArray_ZEROS(3, dims, NPY_ULONG, 0); if(!Nout){ goto cleanup; } standarderror = PyArray_ZEROS(3, dims, NPY_DOUBLE, 0); if(!standarderror){ goto cleanup; } n_outside = c_grid3d(PyArray_DATA(gridout), PyArray_DATA(Nout), PyArray_DATA(standarderror), PyArray_DATA(gridI), grid_start, grid_stop, data_size, grid_nsteps, norm_data); Py_XDECREF(gridI); return Py_BuildValue("NNNl", gridout, Nout, standarderror, n_outside); cleanup: Py_XDECREF(gridI); Py_XDECREF(gridout); Py_XDECREF(Nout); Py_XDECREF(standarderror); return NULL; }
static PyObject* gridder_3D(PyObject *self, PyObject *args, PyObject *kwargs){ PyArrayObject *gridout = NULL, *grid2out = NULL, *Nout = NULL, *stderror = NULL; PyArrayObject *gridI = NULL; PyObject *_dout = NULL, *_d2out = NULL, *_nout = NULL; PyObject *_I; npy_intp data_size; npy_intp dims[3]; double grid_start[3]; double grid_stop[3]; unsigned long grid_nsteps[3]; int ignore_nan = 0; int retval; static char *kwlist[] = { "data", "xrange", "yrange", "zrange", "ignore_nan", "gridout", "grid2out", "nout", NULL }; if(!PyArg_ParseTupleAndKeywords(args, kwargs, "O(ddd)(ddd)(lll)|dOOO", kwlist, &_I, &grid_start[0], &grid_start[1], &grid_start[2], &grid_stop[0], &grid_stop[1], &grid_stop[2], &grid_nsteps[0], &grid_nsteps[1], &grid_nsteps[2], &ignore_nan, &_dout, &_d2out, &_nout)){ return NULL; } gridI = (PyArrayObject*)PyArray_FROMANY(_I, NPY_DOUBLE, 0, 0, NPY_ARRAY_IN_ARRAY); if(!gridI){ goto error; } data_size = PyArray_DIM(gridI, 0); if(PyArray_DIM(gridI, 1) != 4){ PyErr_SetString(PyExc_ValueError, "Dimension 1 of array must be 4"); goto error; } dims[0] = grid_nsteps[0]; dims[1] = grid_nsteps[1]; dims[2] = grid_nsteps[2]; if(_dout == NULL){ gridout = (PyArrayObject*)PyArray_ZEROS(3, dims, NPY_DOUBLE, 0); } else { gridout = (PyArrayObject*)PyArray_FROMANY(_dout, NPY_DOUBLE, 0, 0, NPY_ARRAY_IN_ARRAY); } if(!gridout){ goto error; } if(_d2out == NULL){ grid2out = (PyArrayObject*)PyArray_ZEROS(3, dims, NPY_DOUBLE, 0); } else { grid2out = (PyArrayObject*)PyArray_FROMANY(_d2out, NPY_DOUBLE, 0, 0, NPY_ARRAY_IN_ARRAY); } if(!grid2out){ goto error; } if(_nout == NULL){ Nout = (PyArrayObject*)PyArray_ZEROS(3, dims, NPY_ULONG, 0); } else { Nout = (PyArrayObject*)PyArray_FROMANY(_nout, NPY_ULONG, 0, 0, NPY_ARRAY_IN_ARRAY); } if(!Nout){ goto error; } stderror = (PyArrayObject*)PyArray_SimpleNew(3, dims, NPY_DOUBLE); if(!stderror){ goto error; } // Ok now we don't touch Python Object ... Release the GIL Py_BEGIN_ALLOW_THREADS retval = c_grid3d((double*)PyArray_DATA(gridout), (double *)PyArray_DATA(grid2out), (unsigned long*)PyArray_DATA(Nout), (double*)PyArray_DATA(stderror), (double*)PyArray_DATA(gridI), grid_start, grid_stop, (unsigned long)data_size, grid_nsteps, ignore_nan); // Ok now get the GIL back Py_END_ALLOW_THREADS if(retval){ // We had a runtime error PyErr_SetString(PyExc_MemoryError, "Could not allocate memory in c_grid3d"); goto error; } Py_XDECREF(gridI); return Py_BuildValue("NNNN", gridout, grid2out, Nout, stderror); error: Py_XDECREF(gridI); Py_XDECREF(gridout); Py_XDECREF(grid2out); Py_XDECREF(Nout); Py_XDECREF(stderror); return NULL; }