Generated by Cython 0.29.30

Yellow lines hint at Python interaction.
Click on a line that starts with a "+" to see the C code that Cython generated for it.

Raw output: fitsmooth_ext.c

+001: #cython: wraparound=False, boundscheck=False, cdivision=True, profile=False, nonecheck=False, overflowcheck=False, cdivision_warnings=False, unraisable_tracebacks=False
  __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 002: import cython
 003: from libc.stdlib cimport malloc, free
 004: from cpython.pycapsule cimport *
 005: # import both numpy and the Cython declarations for numpy
+006: import numpy as np
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_numpy, 0, -1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 6, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_1) < 0) __PYX_ERR(0, 6, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 007: cimport numpy as np
 008: # declare the interface to the C code
 009: cdef extern from "fitsmooth.c":
 010: 	ctypedef struct quad_tree:
 011: 		double xmin, xmax, ymin, ymax
 012: 		int count
 013: 		quad_tree* parent
 014: 		quad_tree* q[4]
 015: 		triangle* leaves
 016: 		triangle* end_leaves
 017: 	ctypedef struct UT_hash_handle:
 018: 		pass
 019: 	ctypedef struct edge_key_t:
 020: 		int i
 021: 		int j
 022: 	ctypedef struct edge_t:
 023: 		edge_key_t key
 024: 		double entry
 025: 		UT_hash_handle hh
 026: 	ctypedef struct sparse_dok:
 027: 		edge_t* edgetable
 028: 		int num_entries
 029: 		int num_rows
 030: 	ctypedef struct triangle:
 031: 		double x1, y1
 032: 		double x2, y2
 033: 		double x3, y3
 034: 		int index
 035: 		double nx1, ny1
 036: 		double nx2, ny2
 037: 		double nx3, ny3
 038: 		triangle* next
 039: 	ctypedef struct sparse_csr:
 040: 		double* data
 041: 		int* colind
 042: 		int* row_ptr
 043: 		int num_rows
 044: 		int num_entries
 045: 	void delete_quad_tree(quad_tree* tree)
 046: 	quad_tree* _build_quad_tree(int n, long* triangles, double* vertex_coordinates, double* extents)
 047: 	void delete_dok_matrix(sparse_dok* mat)
 048: 	sparse_dok* make_dok()
 049: 	int _build_smoothing_matrix(int n, long* triangles, double* areas, double* vertex_coordinates, int* strides, sparse_dok* smoothing_mat)
 050: 	int _build_matrix_AtA_Atz_points(int N, long* triangles, double* point_coordinates, double* point_values, int zdims, int npts, sparse_dok* AtA, double** Atz, quad_tree* quadtree)
 051: 	void _combine_partial_AtA_Atz(sparse_dok* dok_AtA1, sparse_dok* dok_AtA2, double* Atz1, double* Atz2, int n, int zdim)
 052: 	triangle* search(quad_tree* node ,double xp, double yp)
 053: 	double* calculate_sigma(triangle* T, double x, double y)
 054: 	int quad_tree_node_count(quad_tree* tree)
 055: 	int get_dok_rows(sparse_dok* dok);
 056: 	edge_t* find_dok_entry(sparse_dok* edgetable, edge_key_t key)
 057: 	void add_sparse_dok(sparse_dok* dok1, double mult1, sparse_dok* dok2, double mult2)
 058: 	sparse_csr* make_csr()
 059: 	void delete_csr_matrix(sparse_csr* mat)
 060: 	void convert_to_csr_ptr(sparse_csr* new_csr, sparse_dok* hashtable)
 061: 
+062: cdef delete_quad_tree_cap(object cap):
static PyObject *__pyx_f_5anuga_15fit_interpolate_9fitsmooth_delete_quad_tree_cap(PyObject *__pyx_v_cap) {
  quad_tree *__pyx_v_kill;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("delete_quad_tree_cap", 0);
/* … */
  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_AddTraceback("anuga.fit_interpolate.fitsmooth.delete_quad_tree_cap", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+063: 	kill = <quad_tree* > PyCapsule_GetPointer(cap, "quad tree")
  __pyx_t_1 = PyCapsule_GetPointer(__pyx_v_cap, ((char const *)"quad tree")); if (unlikely(__pyx_t_1 == ((void *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 63, __pyx_L1_error)
  __pyx_v_kill = ((quad_tree *)__pyx_t_1);
+064: 	if kill != NULL:
  __pyx_t_2 = ((__pyx_v_kill != NULL) != 0);
  if (__pyx_t_2) {
/* … */
  }
+065: 		delete_quad_tree(kill)
    delete_quad_tree(__pyx_v_kill);
 066: 
+067: cdef delete_dok_cap(object cap):
static PyObject *__pyx_f_5anuga_15fit_interpolate_9fitsmooth_delete_dok_cap(PyObject *__pyx_v_cap) {
  sparse_dok *__pyx_v_kill;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("delete_dok_cap", 0);
/* … */
  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_AddTraceback("anuga.fit_interpolate.fitsmooth.delete_dok_cap", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+068: 	kill = <sparse_dok* > PyCapsule_GetPointer(cap, "sparse dok")
  __pyx_t_1 = PyCapsule_GetPointer(__pyx_v_cap, ((char const *)"sparse dok")); if (unlikely(__pyx_t_1 == ((void *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 68, __pyx_L1_error)
  __pyx_v_kill = ((sparse_dok *)__pyx_t_1);
+069: 	if kill != NULL:
  __pyx_t_2 = ((__pyx_v_kill != NULL) != 0);
  if (__pyx_t_2) {
/* … */
  }
+070: 		delete_dok_matrix(kill)
    delete_dok_matrix(__pyx_v_kill);
 071: 
+072: cdef c_double_array_to_list(double* mat, int cols):
static PyObject *__pyx_f_5anuga_15fit_interpolate_9fitsmooth_c_double_array_to_list(double *__pyx_v_mat, int __pyx_v_cols) {
  int __pyx_v_j;
  PyObject *__pyx_v_lst = 0;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("c_double_array_to_list", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_AddTraceback("anuga.fit_interpolate.fitsmooth.c_double_array_to_list", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_lst);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 073: 	cdef int j
 074: 	cdef list lst
+075: 	lst = []
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 75, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_lst = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
+076: 	if not(isinstance(lst, list)):
  __pyx_t_2 = PyList_Check(__pyx_v_lst); 
  __pyx_t_3 = ((!(__pyx_t_2 != 0)) != 0);
  if (__pyx_t_3) {
/* … */
  }
+077: 		return None
    __Pyx_XDECREF(__pyx_r);
    __pyx_r = Py_None; __Pyx_INCREF(Py_None);
    goto __pyx_L0;
+078: 	for j in xrange(cols):
  __pyx_t_4 = __pyx_v_cols;
  __pyx_t_5 = __pyx_t_4;
  for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
    __pyx_v_j = __pyx_t_6;
+079: 		try:
    {
      /*try:*/ {
/* … */
      }
      __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
      __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
      goto __pyx_L13_try_end;
      __pyx_L6_error:;
      __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
/* … */
      __Pyx_XGIVEREF(__pyx_t_7);
      __Pyx_XGIVEREF(__pyx_t_8);
      __Pyx_XGIVEREF(__pyx_t_9);
      __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9);
      goto __pyx_L1_error;
      __pyx_L9_except_return:;
      __Pyx_XGIVEREF(__pyx_t_7);
      __Pyx_XGIVEREF(__pyx_t_8);
      __Pyx_XGIVEREF(__pyx_t_9);
      __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9);
      goto __pyx_L0;
      __pyx_L13_try_end:;
    }
  }
+080: 			lst.append(mat[j])
        __pyx_t_1 = PyFloat_FromDouble((__pyx_v_mat[__pyx_v_j])); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 80, __pyx_L6_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_10 = __Pyx_PyList_Append(__pyx_v_lst, __pyx_t_1); if (unlikely(__pyx_t_10 == ((int)-1))) __PYX_ERR(0, 80, __pyx_L6_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+081: 		except:
      /*except:*/ {
        __Pyx_AddTraceback("anuga.fit_interpolate.fitsmooth.c_double_array_to_list", __pyx_clineno, __pyx_lineno, __pyx_filename);
        if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_11, &__pyx_t_12) < 0) __PYX_ERR(0, 81, __pyx_L8_except_error)
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_GOTREF(__pyx_t_11);
        __Pyx_GOTREF(__pyx_t_12);
+082: 			return None
        __Pyx_XDECREF(__pyx_r);
        __pyx_r = Py_None; __Pyx_INCREF(Py_None);
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
        goto __pyx_L9_except_return;
      }
      __pyx_L8_except_error:;
+083: 	return lst
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_lst);
  __pyx_r = __pyx_v_lst;
  goto __pyx_L0;
 084: 
+085: cdef c_int_array_to_list(int* mat, int cols):
static PyObject *__pyx_f_5anuga_15fit_interpolate_9fitsmooth_c_int_array_to_list(int *__pyx_v_mat, int __pyx_v_cols) {
  int __pyx_v_j;
  PyObject *__pyx_v_lst = 0;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("c_int_array_to_list", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_AddTraceback("anuga.fit_interpolate.fitsmooth.c_int_array_to_list", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_lst);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 086: 	cdef int j
 087: 	cdef list lst
+088: 	lst = []
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 88, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_lst = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
+089: 	if not(isinstance(lst, list)):
  __pyx_t_2 = PyList_Check(__pyx_v_lst); 
  __pyx_t_3 = ((!(__pyx_t_2 != 0)) != 0);
  if (__pyx_t_3) {
/* … */
  }
+090: 		return None
    __Pyx_XDECREF(__pyx_r);
    __pyx_r = Py_None; __Pyx_INCREF(Py_None);
    goto __pyx_L0;
+091: 	for j in xrange(cols):
  __pyx_t_4 = __pyx_v_cols;
  __pyx_t_5 = __pyx_t_4;
  for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {
    __pyx_v_j = __pyx_t_6;
+092: 		try:
    {
      /*try:*/ {
/* … */
      }
      __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
      __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
      goto __pyx_L13_try_end;
      __pyx_L6_error:;
      __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
/* … */
      __Pyx_XGIVEREF(__pyx_t_7);
      __Pyx_XGIVEREF(__pyx_t_8);
      __Pyx_XGIVEREF(__pyx_t_9);
      __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9);
      goto __pyx_L1_error;
      __pyx_L9_except_return:;
      __Pyx_XGIVEREF(__pyx_t_7);
      __Pyx_XGIVEREF(__pyx_t_8);
      __Pyx_XGIVEREF(__pyx_t_9);
      __Pyx_ExceptionReset(__pyx_t_7, __pyx_t_8, __pyx_t_9);
      goto __pyx_L0;
      __pyx_L13_try_end:;
    }
  }
+093: 			lst.append(mat[j])
        __pyx_t_1 = __Pyx_PyInt_From_int((__pyx_v_mat[__pyx_v_j])); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 93, __pyx_L6_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_10 = __Pyx_PyList_Append(__pyx_v_lst, __pyx_t_1); if (unlikely(__pyx_t_10 == ((int)-1))) __PYX_ERR(0, 93, __pyx_L6_error)
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+094: 		except:
      /*except:*/ {
        __Pyx_AddTraceback("anuga.fit_interpolate.fitsmooth.c_int_array_to_list", __pyx_clineno, __pyx_lineno, __pyx_filename);
        if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_11, &__pyx_t_12) < 0) __PYX_ERR(0, 94, __pyx_L8_except_error)
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_GOTREF(__pyx_t_11);
        __Pyx_GOTREF(__pyx_t_12);
+095: 			return None
        __Pyx_XDECREF(__pyx_r);
        __pyx_r = Py_None; __Pyx_INCREF(Py_None);
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
        goto __pyx_L9_except_return;
      }
      __pyx_L8_except_error:;
+096: 	return lst
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_lst);
  __pyx_r = __pyx_v_lst;
  goto __pyx_L0;
 097: 
+098: def build_quad_tree(np.ndarray[long, ndim=2, mode="c"] triangles not None,\
/* Python wrapper */
static PyObject *__pyx_pw_5anuga_15fit_interpolate_9fitsmooth_1build_quad_tree(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_mdef_5anuga_15fit_interpolate_9fitsmooth_1build_quad_tree = {"build_quad_tree", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5anuga_15fit_interpolate_9fitsmooth_1build_quad_tree, METH_VARARGS|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_5anuga_15fit_interpolate_9fitsmooth_1build_quad_tree(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyArrayObject *__pyx_v_triangles = 0;
  PyArrayObject *__pyx_v_vertex_coordinates = 0;
  PyArrayObject *__pyx_v_extents = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("build_quad_tree (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_triangles,&__pyx_n_s_vertex_coordinates,&__pyx_n_s_extents,0};
    PyObject* values[3] = {0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_triangles)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_vertex_coordinates)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("build_quad_tree", 1, 3, 3, 1); __PYX_ERR(0, 98, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_extents)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("build_quad_tree", 1, 3, 3, 2); __PYX_ERR(0, 98, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "build_quad_tree") < 0)) __PYX_ERR(0, 98, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
    }
    __pyx_v_triangles = ((PyArrayObject *)values[0]);
    __pyx_v_vertex_coordinates = ((PyArrayObject *)values[1]);
    __pyx_v_extents = ((PyArrayObject *)values[2]);
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("build_quad_tree", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 98, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("anuga.fit_interpolate.fitsmooth.build_quad_tree", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_triangles), __pyx_ptype_5numpy_ndarray, 0, "triangles", 0))) __PYX_ERR(0, 98, __pyx_L1_error)
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_vertex_coordinates), __pyx_ptype_5numpy_ndarray, 0, "vertex_coordinates", 0))) __PYX_ERR(0, 99, __pyx_L1_error)
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_extents), __pyx_ptype_5numpy_ndarray, 0, "extents", 0))) __PYX_ERR(0, 100, __pyx_L1_error)
  __pyx_r = __pyx_pf_5anuga_15fit_interpolate_9fitsmooth_build_quad_tree(__pyx_self, __pyx_v_triangles, __pyx_v_vertex_coordinates, __pyx_v_extents);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5anuga_15fit_interpolate_9fitsmooth_build_quad_tree(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_triangles, PyArrayObject *__pyx_v_vertex_coordinates, PyArrayObject *__pyx_v_extents) {
  int __pyx_v_n;
  __Pyx_LocalBuf_ND __pyx_pybuffernd_extents;
  __Pyx_Buffer __pyx_pybuffer_extents;
  __Pyx_LocalBuf_ND __pyx_pybuffernd_triangles;
  __Pyx_Buffer __pyx_pybuffer_triangles;
  __Pyx_LocalBuf_ND __pyx_pybuffernd_vertex_coordinates;
  __Pyx_Buffer __pyx_pybuffer_vertex_coordinates;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("build_quad_tree", 0);
  __pyx_pybuffer_triangles.pybuffer.buf = NULL;
  __pyx_pybuffer_triangles.refcount = 0;
  __pyx_pybuffernd_triangles.data = NULL;
  __pyx_pybuffernd_triangles.rcbuffer = &__pyx_pybuffer_triangles;
  __pyx_pybuffer_vertex_coordinates.pybuffer.buf = NULL;
  __pyx_pybuffer_vertex_coordinates.refcount = 0;
  __pyx_pybuffernd_vertex_coordinates.data = NULL;
  __pyx_pybuffernd_vertex_coordinates.rcbuffer = &__pyx_pybuffer_vertex_coordinates;
  __pyx_pybuffer_extents.pybuffer.buf = NULL;
  __pyx_pybuffer_extents.refcount = 0;
  __pyx_pybuffernd_extents.data = NULL;
  __pyx_pybuffernd_extents.rcbuffer = &__pyx_pybuffer_extents;
  {
    __Pyx_BufFmt_StackElem __pyx_stack[1];
    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_triangles.rcbuffer->pybuffer, (PyObject*)__pyx_v_triangles, &__Pyx_TypeInfo_long, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 98, __pyx_L1_error)
  }
  __pyx_pybuffernd_triangles.diminfo[0].strides = __pyx_pybuffernd_triangles.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_triangles.diminfo[0].shape = __pyx_pybuffernd_triangles.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_triangles.diminfo[1].strides = __pyx_pybuffernd_triangles.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_triangles.diminfo[1].shape = __pyx_pybuffernd_triangles.rcbuffer->pybuffer.shape[1];
  {
    __Pyx_BufFmt_StackElem __pyx_stack[1];
    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_vertex_coordinates.rcbuffer->pybuffer, (PyObject*)__pyx_v_vertex_coordinates, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 98, __pyx_L1_error)
  }
  __pyx_pybuffernd_vertex_coordinates.diminfo[0].strides = __pyx_pybuffernd_vertex_coordinates.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_vertex_coordinates.diminfo[0].shape = __pyx_pybuffernd_vertex_coordinates.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_vertex_coordinates.diminfo[1].strides = __pyx_pybuffernd_vertex_coordinates.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_vertex_coordinates.diminfo[1].shape = __pyx_pybuffernd_vertex_coordinates.rcbuffer->pybuffer.shape[1];
  {
    __Pyx_BufFmt_StackElem __pyx_stack[1];
    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_extents.rcbuffer->pybuffer, (PyObject*)__pyx_v_extents, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 98, __pyx_L1_error)
  }
  __pyx_pybuffernd_extents.diminfo[0].strides = __pyx_pybuffernd_extents.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_extents.diminfo[0].shape = __pyx_pybuffernd_extents.rcbuffer->pybuffer.shape[0];
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_6);
  { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
    __Pyx_PyThreadState_declare
    __Pyx_PyThreadState_assign
    __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_extents.rcbuffer->pybuffer);
    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_triangles.rcbuffer->pybuffer);
    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_vertex_coordinates.rcbuffer->pybuffer);
  __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
  __Pyx_AddTraceback("anuga.fit_interpolate.fitsmooth.build_quad_tree", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  goto __pyx_L2;
  __pyx_L0:;
  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_extents.rcbuffer->pybuffer);
  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_triangles.rcbuffer->pybuffer);
  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_vertex_coordinates.rcbuffer->pybuffer);
  __pyx_L2:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__3 = PyTuple_Pack(4, __pyx_n_s_triangles, __pyx_n_s_vertex_coordinates, __pyx_n_s_extents, __pyx_n_s_n); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 98, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__3);
  __Pyx_GIVEREF(__pyx_tuple__3);
/* … */
  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_5anuga_15fit_interpolate_9fitsmooth_1build_quad_tree, NULL, __pyx_n_s_anuga_fit_interpolate_fitsmooth_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 98, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_build_quad_tree, __pyx_t_1) < 0) __PYX_ERR(0, 98, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_codeobj__4 = (PyObject*)__Pyx_PyCode_New(3, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__3, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_anuga_fit_interpolate_fitsmooth, __pyx_n_s_build_quad_tree, 98, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__4)) __PYX_ERR(0, 98, __pyx_L1_error)
 099: 					np.ndarray[double, ndim=2, mode="c"] vertex_coordinates not None,\
 100: 					np.ndarray[double, ndim=1, mode="c"] extents not None):
 101: 
 102: 	cdef int n
 103: 
+104: 	n = triangles.shape[0]
  __pyx_v_n = (__pyx_v_triangles->dimensions[0]);
 105: 
+106: 	return PyCapsule_New(<void* > _build_quad_tree(n, &triangles[0,0], &vertex_coordinates[0,0], &extents[0]), "quad tree", <PyCapsule_Destructor> delete_quad_tree_cap)
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = 0;
  __pyx_t_2 = 0;
  __pyx_t_3 = 0;
  __pyx_t_4 = 0;
  __pyx_t_5 = 0;
  __pyx_t_6 = PyCapsule_New(((void *)_build_quad_tree(__pyx_v_n, (&(*__Pyx_BufPtrCContig2d(long *, __pyx_pybuffernd_triangles.rcbuffer->pybuffer.buf, __pyx_t_1, __pyx_pybuffernd_triangles.diminfo[0].strides, __pyx_t_2, __pyx_pybuffernd_triangles.diminfo[1].strides))), (&(*__Pyx_BufPtrCContig2d(double *, __pyx_pybuffernd_vertex_coordinates.rcbuffer->pybuffer.buf, __pyx_t_3, __pyx_pybuffernd_vertex_coordinates.diminfo[0].strides, __pyx_t_4, __pyx_pybuffernd_vertex_coordinates.diminfo[1].strides))), (&(*__Pyx_BufPtrCContig1d(double *, __pyx_pybuffernd_extents.rcbuffer->pybuffer.buf, __pyx_t_5, __pyx_pybuffernd_extents.diminfo[0].strides))))), ((char const *)"quad tree"), ((PyCapsule_Destructor)__pyx_f_5anuga_15fit_interpolate_9fitsmooth_delete_quad_tree_cap)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 106, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_r = __pyx_t_6;
  __pyx_t_6 = 0;
  goto __pyx_L0;
 107: 
+108: def build_smoothing_matrix(np.ndarray[long, ndim=2, mode="c"] triangles not None,\
/* Python wrapper */
static PyObject *__pyx_pw_5anuga_15fit_interpolate_9fitsmooth_3build_smoothing_matrix(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_mdef_5anuga_15fit_interpolate_9fitsmooth_3build_smoothing_matrix = {"build_smoothing_matrix", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5anuga_15fit_interpolate_9fitsmooth_3build_smoothing_matrix, METH_VARARGS|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_5anuga_15fit_interpolate_9fitsmooth_3build_smoothing_matrix(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyArrayObject *__pyx_v_triangles = 0;
  PyArrayObject *__pyx_v_areas = 0;
  PyArrayObject *__pyx_v_vertex_coordinates = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("build_smoothing_matrix (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_triangles,&__pyx_n_s_areas,&__pyx_n_s_vertex_coordinates,0};
    PyObject* values[3] = {0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_triangles)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_areas)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("build_smoothing_matrix", 1, 3, 3, 1); __PYX_ERR(0, 108, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_vertex_coordinates)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("build_smoothing_matrix", 1, 3, 3, 2); __PYX_ERR(0, 108, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "build_smoothing_matrix") < 0)) __PYX_ERR(0, 108, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
    }
    __pyx_v_triangles = ((PyArrayObject *)values[0]);
    __pyx_v_areas = ((PyArrayObject *)values[1]);
    __pyx_v_vertex_coordinates = ((PyArrayObject *)values[2]);
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("build_smoothing_matrix", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 108, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("anuga.fit_interpolate.fitsmooth.build_smoothing_matrix", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_triangles), __pyx_ptype_5numpy_ndarray, 0, "triangles", 0))) __PYX_ERR(0, 108, __pyx_L1_error)
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_areas), __pyx_ptype_5numpy_ndarray, 0, "areas", 0))) __PYX_ERR(0, 109, __pyx_L1_error)
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_vertex_coordinates), __pyx_ptype_5numpy_ndarray, 0, "vertex_coordinates", 0))) __PYX_ERR(0, 110, __pyx_L1_error)
  __pyx_r = __pyx_pf_5anuga_15fit_interpolate_9fitsmooth_2build_smoothing_matrix(__pyx_self, __pyx_v_triangles, __pyx_v_areas, __pyx_v_vertex_coordinates);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5anuga_15fit_interpolate_9fitsmooth_2build_smoothing_matrix(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_triangles, PyArrayObject *__pyx_v_areas, PyArrayObject *__pyx_v_vertex_coordinates) {
  int __pyx_v_err;
  int __pyx_v_n;
  sparse_dok *__pyx_v_smoothing_mat;
  __Pyx_LocalBuf_ND __pyx_pybuffernd_areas;
  __Pyx_Buffer __pyx_pybuffer_areas;
  __Pyx_LocalBuf_ND __pyx_pybuffernd_triangles;
  __Pyx_Buffer __pyx_pybuffer_triangles;
  __Pyx_LocalBuf_ND __pyx_pybuffernd_vertex_coordinates;
  __Pyx_Buffer __pyx_pybuffer_vertex_coordinates;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("build_smoothing_matrix", 0);
  __pyx_pybuffer_triangles.pybuffer.buf = NULL;
  __pyx_pybuffer_triangles.refcount = 0;
  __pyx_pybuffernd_triangles.data = NULL;
  __pyx_pybuffernd_triangles.rcbuffer = &__pyx_pybuffer_triangles;
  __pyx_pybuffer_areas.pybuffer.buf = NULL;
  __pyx_pybuffer_areas.refcount = 0;
  __pyx_pybuffernd_areas.data = NULL;
  __pyx_pybuffernd_areas.rcbuffer = &__pyx_pybuffer_areas;
  __pyx_pybuffer_vertex_coordinates.pybuffer.buf = NULL;
  __pyx_pybuffer_vertex_coordinates.refcount = 0;
  __pyx_pybuffernd_vertex_coordinates.data = NULL;
  __pyx_pybuffernd_vertex_coordinates.rcbuffer = &__pyx_pybuffer_vertex_coordinates;
  {
    __Pyx_BufFmt_StackElem __pyx_stack[1];
    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_triangles.rcbuffer->pybuffer, (PyObject*)__pyx_v_triangles, &__Pyx_TypeInfo_long, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 108, __pyx_L1_error)
  }
  __pyx_pybuffernd_triangles.diminfo[0].strides = __pyx_pybuffernd_triangles.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_triangles.diminfo[0].shape = __pyx_pybuffernd_triangles.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_triangles.diminfo[1].strides = __pyx_pybuffernd_triangles.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_triangles.diminfo[1].shape = __pyx_pybuffernd_triangles.rcbuffer->pybuffer.shape[1];
  {
    __Pyx_BufFmt_StackElem __pyx_stack[1];
    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_areas.rcbuffer->pybuffer, (PyObject*)__pyx_v_areas, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 108, __pyx_L1_error)
  }
  __pyx_pybuffernd_areas.diminfo[0].strides = __pyx_pybuffernd_areas.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_areas.diminfo[0].shape = __pyx_pybuffernd_areas.rcbuffer->pybuffer.shape[0];
  {
    __Pyx_BufFmt_StackElem __pyx_stack[1];
    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_vertex_coordinates.rcbuffer->pybuffer, (PyObject*)__pyx_v_vertex_coordinates, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 108, __pyx_L1_error)
  }
  __pyx_pybuffernd_vertex_coordinates.diminfo[0].strides = __pyx_pybuffernd_vertex_coordinates.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_vertex_coordinates.diminfo[0].shape = __pyx_pybuffernd_vertex_coordinates.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_vertex_coordinates.diminfo[1].strides = __pyx_pybuffernd_vertex_coordinates.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_vertex_coordinates.diminfo[1].shape = __pyx_pybuffernd_vertex_coordinates.rcbuffer->pybuffer.shape[1];
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_6);
  { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
    __Pyx_PyThreadState_declare
    __Pyx_PyThreadState_assign
    __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_areas.rcbuffer->pybuffer);
    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_triangles.rcbuffer->pybuffer);
    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_vertex_coordinates.rcbuffer->pybuffer);
  __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
  __Pyx_AddTraceback("anuga.fit_interpolate.fitsmooth.build_smoothing_matrix", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  goto __pyx_L2;
  __pyx_L0:;
  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_areas.rcbuffer->pybuffer);
  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_triangles.rcbuffer->pybuffer);
  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_vertex_coordinates.rcbuffer->pybuffer);
  __pyx_L2:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__5 = PyTuple_Pack(6, __pyx_n_s_triangles, __pyx_n_s_areas, __pyx_n_s_vertex_coordinates, __pyx_n_s_err, __pyx_n_s_n, __pyx_n_s_smoothing_mat); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(0, 108, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__5);
  __Pyx_GIVEREF(__pyx_tuple__5);
/* … */
  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_5anuga_15fit_interpolate_9fitsmooth_3build_smoothing_matrix, NULL, __pyx_n_s_anuga_fit_interpolate_fitsmooth_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 108, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_build_smoothing_matrix, __pyx_t_1) < 0) __PYX_ERR(0, 108, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_codeobj__6 = (PyObject*)__Pyx_PyCode_New(3, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__5, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_anuga_fit_interpolate_fitsmooth, __pyx_n_s_build_smoothing_matrix, 108, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__6)) __PYX_ERR(0, 108, __pyx_L1_error)
 109: 							np.ndarray[double, ndim=1, mode="c"] areas not None,\
 110: 							np.ndarray[double, ndim=2, mode="c"] vertex_coordinates not None):
 111: 
 112: 	cdef int err, n
 113: 	cdef sparse_dok* smoothing_mat
 114: 
+115: 	n = triangles.shape[0]
  __pyx_v_n = (__pyx_v_triangles->dimensions[0]);
+116: 	smoothing_mat = make_dok()
  __pyx_v_smoothing_mat = make_dok();
 117: 
+118: 	err = _build_smoothing_matrix(n, &triangles[0,0], &areas[0], &vertex_coordinates[0,0], <int* > &vertex_coordinates.strides[0], smoothing_mat)
  __pyx_t_1 = 0;
  __pyx_t_2 = 0;
  __pyx_t_3 = 0;
  __pyx_t_4 = 0;
  __pyx_t_5 = 0;
  __pyx_v_err = _build_smoothing_matrix(__pyx_v_n, (&(*__Pyx_BufPtrCContig2d(long *, __pyx_pybuffernd_triangles.rcbuffer->pybuffer.buf, __pyx_t_1, __pyx_pybuffernd_triangles.diminfo[0].strides, __pyx_t_2, __pyx_pybuffernd_triangles.diminfo[1].strides))), (&(*__Pyx_BufPtrCContig1d(double *, __pyx_pybuffernd_areas.rcbuffer->pybuffer.buf, __pyx_t_3, __pyx_pybuffernd_areas.diminfo[0].strides))), (&(*__Pyx_BufPtrCContig2d(double *, __pyx_pybuffernd_vertex_coordinates.rcbuffer->pybuffer.buf, __pyx_t_4, __pyx_pybuffernd_vertex_coordinates.diminfo[0].strides, __pyx_t_5, __pyx_pybuffernd_vertex_coordinates.diminfo[1].strides))), ((int *)(&(__pyx_v_vertex_coordinates->strides[0]))), __pyx_v_smoothing_mat);
 119: 
+120: 	assert err == 0, "Unknown Error"
  #ifndef CYTHON_WITHOUT_ASSERTIONS
  if (unlikely(!Py_OptimizeFlag)) {
    if (unlikely(!((__pyx_v_err == 0) != 0))) {
      PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Unknown_Error);
      __PYX_ERR(0, 120, __pyx_L1_error)
    }
  }
  #endif
 121: 
+122: 	return PyCapsule_New(<void* > smoothing_mat, "sparse dok", <PyCapsule_Destructor> delete_dok_cap)
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_6 = PyCapsule_New(((void *)__pyx_v_smoothing_mat), ((char const *)"sparse dok"), ((PyCapsule_Destructor)__pyx_f_5anuga_15fit_interpolate_9fitsmooth_delete_dok_cap)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 122, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_r = __pyx_t_6;
  __pyx_t_6 = 0;
  goto __pyx_L0;
 123: 
 124: 
+125: def build_matrix_AtA_Atz_points(object tree, int N,\
/* Python wrapper */
static PyObject *__pyx_pw_5anuga_15fit_interpolate_9fitsmooth_5build_matrix_AtA_Atz_points(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_mdef_5anuga_15fit_interpolate_9fitsmooth_5build_matrix_AtA_Atz_points = {"build_matrix_AtA_Atz_points", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5anuga_15fit_interpolate_9fitsmooth_5build_matrix_AtA_Atz_points, METH_VARARGS|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_5anuga_15fit_interpolate_9fitsmooth_5build_matrix_AtA_Atz_points(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_tree = 0;
  int __pyx_v_N;
  PyArrayObject *__pyx_v_triangles = 0;
  PyArrayObject *__pyx_v_point_coordinates = 0;
  PyArrayObject *__pyx_v_z = 0;
  int __pyx_v_zdims;
  int __pyx_v_npts;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("build_matrix_AtA_Atz_points (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_tree,&__pyx_n_s_N,&__pyx_n_s_triangles,&__pyx_n_s_point_coordinates,&__pyx_n_s_z,&__pyx_n_s_zdims,&__pyx_n_s_npts,0};
    PyObject* values[7] = {0,0,0,0,0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_tree)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_N)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("build_matrix_AtA_Atz_points", 1, 7, 7, 1); __PYX_ERR(0, 125, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_triangles)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("build_matrix_AtA_Atz_points", 1, 7, 7, 2); __PYX_ERR(0, 125, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_point_coordinates)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("build_matrix_AtA_Atz_points", 1, 7, 7, 3); __PYX_ERR(0, 125, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_z)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("build_matrix_AtA_Atz_points", 1, 7, 7, 4); __PYX_ERR(0, 125, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_zdims)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("build_matrix_AtA_Atz_points", 1, 7, 7, 5); __PYX_ERR(0, 125, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_npts)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("build_matrix_AtA_Atz_points", 1, 7, 7, 6); __PYX_ERR(0, 125, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "build_matrix_AtA_Atz_points") < 0)) __PYX_ERR(0, 125, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 7) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
      values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
      values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
      values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
    }
    __pyx_v_tree = values[0];
    __pyx_v_N = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_N == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 125, __pyx_L3_error)
    __pyx_v_triangles = ((PyArrayObject *)values[2]);
    __pyx_v_point_coordinates = ((PyArrayObject *)values[3]);
    __pyx_v_z = ((PyArrayObject *)values[4]);
    __pyx_v_zdims = __Pyx_PyInt_As_int(values[5]); if (unlikely((__pyx_v_zdims == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 129, __pyx_L3_error)
    __pyx_v_npts = __Pyx_PyInt_As_int(values[6]); if (unlikely((__pyx_v_npts == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 130, __pyx_L3_error)
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("build_matrix_AtA_Atz_points", 1, 7, 7, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 125, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("anuga.fit_interpolate.fitsmooth.build_matrix_AtA_Atz_points", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_triangles), __pyx_ptype_5numpy_ndarray, 0, "triangles", 0))) __PYX_ERR(0, 126, __pyx_L1_error)
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_point_coordinates), __pyx_ptype_5numpy_ndarray, 0, "point_coordinates", 0))) __PYX_ERR(0, 127, __pyx_L1_error)
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_z), __pyx_ptype_5numpy_ndarray, 0, "z", 0))) __PYX_ERR(0, 128, __pyx_L1_error)
  __pyx_r = __pyx_pf_5anuga_15fit_interpolate_9fitsmooth_4build_matrix_AtA_Atz_points(__pyx_self, __pyx_v_tree, __pyx_v_N, __pyx_v_triangles, __pyx_v_point_coordinates, __pyx_v_z, __pyx_v_zdims, __pyx_v_npts);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5anuga_15fit_interpolate_9fitsmooth_4build_matrix_AtA_Atz_points(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_tree, int __pyx_v_N, PyArrayObject *__pyx_v_triangles, PyArrayObject *__pyx_v_point_coordinates, PyArrayObject *__pyx_v_z, int __pyx_v_zdims, int __pyx_v_npts) {
  quad_tree *__pyx_v_quadtree;
  sparse_dok *__pyx_v_dok_AtA;
  PyObject *__pyx_v_AtA_cap = 0;
  double **__pyx_v_Atz;
  PyObject *__pyx_v_Atz_ret = 0;
  int __pyx_v_err;
  int __pyx_v_i;
  __Pyx_LocalBuf_ND __pyx_pybuffernd_point_coordinates;
  __Pyx_Buffer __pyx_pybuffer_point_coordinates;
  __Pyx_LocalBuf_ND __pyx_pybuffernd_triangles;
  __Pyx_Buffer __pyx_pybuffer_triangles;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("build_matrix_AtA_Atz_points", 0);
  __Pyx_INCREF((PyObject *)__pyx_v_z);
  __pyx_pybuffer_triangles.pybuffer.buf = NULL;
  __pyx_pybuffer_triangles.refcount = 0;
  __pyx_pybuffernd_triangles.data = NULL;
  __pyx_pybuffernd_triangles.rcbuffer = &__pyx_pybuffer_triangles;
  __pyx_pybuffer_point_coordinates.pybuffer.buf = NULL;
  __pyx_pybuffer_point_coordinates.refcount = 0;
  __pyx_pybuffernd_point_coordinates.data = NULL;
  __pyx_pybuffernd_point_coordinates.rcbuffer = &__pyx_pybuffer_point_coordinates;
  {
    __Pyx_BufFmt_StackElem __pyx_stack[1];
    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_triangles.rcbuffer->pybuffer, (PyObject*)__pyx_v_triangles, &__Pyx_TypeInfo_long, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 125, __pyx_L1_error)
  }
  __pyx_pybuffernd_triangles.diminfo[0].strides = __pyx_pybuffernd_triangles.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_triangles.diminfo[0].shape = __pyx_pybuffernd_triangles.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_triangles.diminfo[1].strides = __pyx_pybuffernd_triangles.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_triangles.diminfo[1].shape = __pyx_pybuffernd_triangles.rcbuffer->pybuffer.shape[1];
  {
    __Pyx_BufFmt_StackElem __pyx_stack[1];
    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_point_coordinates.rcbuffer->pybuffer, (PyObject*)__pyx_v_point_coordinates, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 125, __pyx_L1_error)
  }
  __pyx_pybuffernd_point_coordinates.diminfo[0].strides = __pyx_pybuffernd_point_coordinates.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_point_coordinates.diminfo[0].shape = __pyx_pybuffernd_point_coordinates.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_point_coordinates.diminfo[1].strides = __pyx_pybuffernd_point_coordinates.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_point_coordinates.diminfo[1].shape = __pyx_pybuffernd_point_coordinates.rcbuffer->pybuffer.shape[1];
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
    __Pyx_PyThreadState_declare
    __Pyx_PyThreadState_assign
    __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_point_coordinates.rcbuffer->pybuffer);
    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_triangles.rcbuffer->pybuffer);
  __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
  __Pyx_AddTraceback("anuga.fit_interpolate.fitsmooth.build_matrix_AtA_Atz_points", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  goto __pyx_L2;
  __pyx_L0:;
  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_point_coordinates.rcbuffer->pybuffer);
  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_triangles.rcbuffer->pybuffer);
  __pyx_L2:;
  __Pyx_XDECREF(__pyx_v_AtA_cap);
  __Pyx_XDECREF(__pyx_v_Atz_ret);
  __Pyx_XDECREF((PyObject *)__pyx_v_z);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__7 = PyTuple_Pack(14, __pyx_n_s_tree, __pyx_n_s_N, __pyx_n_s_triangles, __pyx_n_s_point_coordinates, __pyx_n_s_z, __pyx_n_s_zdims, __pyx_n_s_npts, __pyx_n_s_quadtree, __pyx_n_s_dok_AtA, __pyx_n_s_AtA_cap, __pyx_n_s_Atz, __pyx_n_s_Atz_ret, __pyx_n_s_err, __pyx_n_s_i); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(0, 125, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__7);
  __Pyx_GIVEREF(__pyx_tuple__7);
/* … */
  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_5anuga_15fit_interpolate_9fitsmooth_5build_matrix_AtA_Atz_points, NULL, __pyx_n_s_anuga_fit_interpolate_fitsmooth_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 125, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_build_matrix_AtA_Atz_points, __pyx_t_1) < 0) __PYX_ERR(0, 125, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_codeobj__8 = (PyObject*)__Pyx_PyCode_New(7, 0, 14, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__7, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_anuga_fit_interpolate_fitsmooth, __pyx_n_s_build_matrix_AtA_Atz_points, 125, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__8)) __PYX_ERR(0, 125, __pyx_L1_error)
 126: 							np.ndarray[long, ndim=2, mode="c"] triangles not None,\
 127: 							np.ndarray[double, ndim=2, mode="c"] point_coordinates not None,\
 128: 							np.ndarray z not None,\
 129: 							int zdims,\
 130: 							int npts):
 131: 
 132: 	cdef quad_tree* quadtree
 133: 	cdef sparse_dok* dok_AtA
 134: 	cdef object AtA_cap
 135: 	cdef double** Atz
 136: 	cdef list Atz_ret
 137: 	cdef int err
 138: 	cdef int i
 139: 
+140: 	z = np.ascontiguousarray(z)
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 140, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_ascontiguousarray); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 140, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_2)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_2);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
    }
  }
  __pyx_t_1 = (__pyx_t_2) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_2, ((PyObject *)__pyx_v_z)) : __Pyx_PyObject_CallOneArg(__pyx_t_3, ((PyObject *)__pyx_v_z));
  __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 140, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 140, __pyx_L1_error)
  __Pyx_DECREF_SET(__pyx_v_z, ((PyArrayObject *)__pyx_t_1));
  __pyx_t_1 = 0;
 141: 
+142: 	quadtree = <quad_tree* > PyCapsule_GetPointer(tree, "quad tree")
  __pyx_t_4 = PyCapsule_GetPointer(__pyx_v_tree, ((char const *)"quad tree")); if (unlikely(__pyx_t_4 == ((void *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 142, __pyx_L1_error)
  __pyx_v_quadtree = ((quad_tree *)__pyx_t_4);
 143: 
+144: 	dok_AtA = make_dok()
  __pyx_v_dok_AtA = make_dok();
 145: 
+146: 	Atz = <double** > malloc(zdims * sizeof(double*))
  __pyx_v_Atz = ((double **)malloc((__pyx_v_zdims * (sizeof(double *)))));
+147: 	for i in xrange(zdims):
  __pyx_t_5 = __pyx_v_zdims;
  __pyx_t_6 = __pyx_t_5;
  for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) {
    __pyx_v_i = __pyx_t_7;
+148: 		Atz[i] = <double* > malloc(N * sizeof(double))
    (__pyx_v_Atz[__pyx_v_i]) = ((double *)malloc((__pyx_v_N * (sizeof(double)))));
  }
 149: 
+150: 	err = _build_matrix_AtA_Atz_points(N, &triangles[0,0],\
  __pyx_t_8 = 0;
  __pyx_t_9 = 0;
/* … */
  __pyx_v_err = _build_matrix_AtA_Atz_points(__pyx_v_N, (&(*__Pyx_BufPtrCContig2d(long *, __pyx_pybuffernd_triangles.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_triangles.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_triangles.diminfo[1].strides))), (&(*__Pyx_BufPtrCContig2d(double *, __pyx_pybuffernd_point_coordinates.rcbuffer->pybuffer.buf, __pyx_t_10, __pyx_pybuffernd_point_coordinates.diminfo[0].strides, __pyx_t_11, __pyx_pybuffernd_point_coordinates.diminfo[1].strides))), ((double *)__pyx_v_z->data), __pyx_v_zdims, __pyx_v_npts, __pyx_v_dok_AtA, __pyx_v_Atz, __pyx_v_quadtree);
+151: 										&point_coordinates[0,0],\
  __pyx_t_10 = 0;
  __pyx_t_11 = 0;
 152: 										<double* > z.data,\
 153: 										zdims,\
 154: 										npts,\
 155: 										dok_AtA,\
 156: 										Atz,\
 157: 										quadtree)
 158: 
+159: 	assert err == 0, "Unknown Error"
  #ifndef CYTHON_WITHOUT_ASSERTIONS
  if (unlikely(!Py_OptimizeFlag)) {
    if (unlikely(!((__pyx_v_err == 0) != 0))) {
      PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_Unknown_Error);
      __PYX_ERR(0, 159, __pyx_L1_error)
    }
  }
  #endif
 160: 
+161: 	AtA_cap = PyCapsule_New(<void* > dok_AtA, "sparse dok", <PyCapsule_Destructor> delete_dok_cap)
  __pyx_t_1 = PyCapsule_New(((void *)__pyx_v_dok_AtA), ((char const *)"sparse dok"), ((PyCapsule_Destructor)__pyx_f_5anuga_15fit_interpolate_9fitsmooth_delete_dok_cap)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 161, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_AtA_cap = __pyx_t_1;
  __pyx_t_1 = 0;
 162: 
+163: 	Atz_ret = []
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 163, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_Atz_ret = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
+164: 	for i in xrange(zdims):
  __pyx_t_5 = __pyx_v_zdims;
  __pyx_t_6 = __pyx_t_5;
  for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) {
    __pyx_v_i = __pyx_t_7;
+165: 		Atz_ret.append(c_double_array_to_list(Atz[i],N))
    __pyx_t_1 = __pyx_f_5anuga_15fit_interpolate_9fitsmooth_c_double_array_to_list((__pyx_v_Atz[__pyx_v_i]), __pyx_v_N); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 165, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_12 = __Pyx_PyList_Append(__pyx_v_Atz_ret, __pyx_t_1); if (unlikely(__pyx_t_12 == ((int)-1))) __PYX_ERR(0, 165, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+166: 		free(Atz[i])
    free((__pyx_v_Atz[__pyx_v_i]));
  }
+167: 	free(Atz)
  free(__pyx_v_Atz);
 168: 
+169: 	return [AtA_cap, Atz_ret]
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 169, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_v_AtA_cap);
  __Pyx_GIVEREF(__pyx_v_AtA_cap);
  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_v_AtA_cap);
  __Pyx_INCREF(__pyx_v_Atz_ret);
  __Pyx_GIVEREF(__pyx_v_Atz_ret);
  PyList_SET_ITEM(__pyx_t_1, 1, __pyx_v_Atz_ret);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;
 170: 
+171: def combine_partial_AtA_Atz(object AtA_cap1, object AtA_cap2,\
/* Python wrapper */
static PyObject *__pyx_pw_5anuga_15fit_interpolate_9fitsmooth_7combine_partial_AtA_Atz(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_mdef_5anuga_15fit_interpolate_9fitsmooth_7combine_partial_AtA_Atz = {"combine_partial_AtA_Atz", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5anuga_15fit_interpolate_9fitsmooth_7combine_partial_AtA_Atz, METH_VARARGS|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_5anuga_15fit_interpolate_9fitsmooth_7combine_partial_AtA_Atz(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_AtA_cap1 = 0;
  PyObject *__pyx_v_AtA_cap2 = 0;
  PyArrayObject *__pyx_v_Atz1 = 0;
  PyArrayObject *__pyx_v_Atz2 = 0;
  int __pyx_v_zdim;
  int __pyx_v_n;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("combine_partial_AtA_Atz (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_AtA_cap1,&__pyx_n_s_AtA_cap2,&__pyx_n_s_Atz1,&__pyx_n_s_Atz2,&__pyx_n_s_zdim,&__pyx_n_s_n,0};
    PyObject* values[6] = {0,0,0,0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_AtA_cap1)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_AtA_cap2)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("combine_partial_AtA_Atz", 1, 6, 6, 1); __PYX_ERR(0, 171, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_Atz1)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("combine_partial_AtA_Atz", 1, 6, 6, 2); __PYX_ERR(0, 171, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_Atz2)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("combine_partial_AtA_Atz", 1, 6, 6, 3); __PYX_ERR(0, 171, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_zdim)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("combine_partial_AtA_Atz", 1, 6, 6, 4); __PYX_ERR(0, 171, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_n)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("combine_partial_AtA_Atz", 1, 6, 6, 5); __PYX_ERR(0, 171, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "combine_partial_AtA_Atz") < 0)) __PYX_ERR(0, 171, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 6) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
      values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
      values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
    }
    __pyx_v_AtA_cap1 = values[0];
    __pyx_v_AtA_cap2 = values[1];
    __pyx_v_Atz1 = ((PyArrayObject *)values[2]);
    __pyx_v_Atz2 = ((PyArrayObject *)values[3]);
    __pyx_v_zdim = __Pyx_PyInt_As_int(values[4]); if (unlikely((__pyx_v_zdim == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 174, __pyx_L3_error)
    __pyx_v_n = __Pyx_PyInt_As_int(values[5]); if (unlikely((__pyx_v_n == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 175, __pyx_L3_error)
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("combine_partial_AtA_Atz", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 171, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("anuga.fit_interpolate.fitsmooth.combine_partial_AtA_Atz", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_Atz1), __pyx_ptype_5numpy_ndarray, 1, "Atz1", 0))) __PYX_ERR(0, 172, __pyx_L1_error)
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_Atz2), __pyx_ptype_5numpy_ndarray, 1, "Atz2", 0))) __PYX_ERR(0, 173, __pyx_L1_error)
  __pyx_r = __pyx_pf_5anuga_15fit_interpolate_9fitsmooth_6combine_partial_AtA_Atz(__pyx_self, __pyx_v_AtA_cap1, __pyx_v_AtA_cap2, __pyx_v_Atz1, __pyx_v_Atz2, __pyx_v_zdim, __pyx_v_n);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5anuga_15fit_interpolate_9fitsmooth_6combine_partial_AtA_Atz(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_AtA_cap1, PyObject *__pyx_v_AtA_cap2, PyArrayObject *__pyx_v_Atz1, PyArrayObject *__pyx_v_Atz2, int __pyx_v_zdim, int __pyx_v_n) {
  sparse_dok *__pyx_v_dok_AtA1;
  sparse_dok *__pyx_v_dok_AtA2;
  __Pyx_LocalBuf_ND __pyx_pybuffernd_Atz1;
  __Pyx_Buffer __pyx_pybuffer_Atz1;
  __Pyx_LocalBuf_ND __pyx_pybuffernd_Atz2;
  __Pyx_Buffer __pyx_pybuffer_Atz2;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("combine_partial_AtA_Atz", 0);
  __pyx_pybuffer_Atz1.pybuffer.buf = NULL;
  __pyx_pybuffer_Atz1.refcount = 0;
  __pyx_pybuffernd_Atz1.data = NULL;
  __pyx_pybuffernd_Atz1.rcbuffer = &__pyx_pybuffer_Atz1;
  __pyx_pybuffer_Atz2.pybuffer.buf = NULL;
  __pyx_pybuffer_Atz2.refcount = 0;
  __pyx_pybuffernd_Atz2.data = NULL;
  __pyx_pybuffernd_Atz2.rcbuffer = &__pyx_pybuffer_Atz2;
  {
    __Pyx_BufFmt_StackElem __pyx_stack[1];
    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_Atz1.rcbuffer->pybuffer, (PyObject*)__pyx_v_Atz1, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 171, __pyx_L1_error)
  }
  __pyx_pybuffernd_Atz1.diminfo[0].strides = __pyx_pybuffernd_Atz1.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_Atz1.diminfo[0].shape = __pyx_pybuffernd_Atz1.rcbuffer->pybuffer.shape[0];
  {
    __Pyx_BufFmt_StackElem __pyx_stack[1];
    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_Atz2.rcbuffer->pybuffer, (PyObject*)__pyx_v_Atz2, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 171, __pyx_L1_error)
  }
  __pyx_pybuffernd_Atz2.diminfo[0].strides = __pyx_pybuffernd_Atz2.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_Atz2.diminfo[0].shape = __pyx_pybuffernd_Atz2.rcbuffer->pybuffer.shape[0];
/* … */
  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
    __Pyx_PyThreadState_declare
    __Pyx_PyThreadState_assign
    __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_Atz1.rcbuffer->pybuffer);
    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_Atz2.rcbuffer->pybuffer);
  __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
  __Pyx_AddTraceback("anuga.fit_interpolate.fitsmooth.combine_partial_AtA_Atz", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  goto __pyx_L2;
  __pyx_L0:;
  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_Atz1.rcbuffer->pybuffer);
  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_Atz2.rcbuffer->pybuffer);
  __pyx_L2:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__9 = PyTuple_Pack(8, __pyx_n_s_AtA_cap1, __pyx_n_s_AtA_cap2, __pyx_n_s_Atz1, __pyx_n_s_Atz2, __pyx_n_s_zdim, __pyx_n_s_n, __pyx_n_s_dok_AtA1, __pyx_n_s_dok_AtA2); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(0, 171, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__9);
  __Pyx_GIVEREF(__pyx_tuple__9);
/* … */
  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_5anuga_15fit_interpolate_9fitsmooth_7combine_partial_AtA_Atz, NULL, __pyx_n_s_anuga_fit_interpolate_fitsmooth_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 171, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_combine_partial_AtA_Atz, __pyx_t_1) < 0) __PYX_ERR(0, 171, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_codeobj__10 = (PyObject*)__Pyx_PyCode_New(6, 0, 8, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__9, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_anuga_fit_interpolate_fitsmooth, __pyx_n_s_combine_partial_AtA_Atz, 171, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__10)) __PYX_ERR(0, 171, __pyx_L1_error)
 172: 							np.ndarray[double, ndim=1, mode="c"] Atz1,\
 173: 							np.ndarray[double, ndim=1, mode="c"] Atz2,\
 174: 							int zdim,\
 175: 							int n):
 176: 
 177: 	cdef sparse_dok* dok_AtA1
 178: 	cdef sparse_dok* dok_AtA2
 179: 
+180: 	dok_AtA1 = <sparse_dok* > PyCapsule_GetPointer(AtA_cap1, "sparse dok")
  __pyx_t_1 = PyCapsule_GetPointer(__pyx_v_AtA_cap1, ((char const *)"sparse dok")); if (unlikely(__pyx_t_1 == ((void *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 180, __pyx_L1_error)
  __pyx_v_dok_AtA1 = ((sparse_dok *)__pyx_t_1);
+181: 	dok_AtA2 = <sparse_dok* > PyCapsule_GetPointer(AtA_cap2, "sparse dok")
  __pyx_t_1 = PyCapsule_GetPointer(__pyx_v_AtA_cap2, ((char const *)"sparse dok")); if (unlikely(__pyx_t_1 == ((void *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 181, __pyx_L1_error)
  __pyx_v_dok_AtA2 = ((sparse_dok *)__pyx_t_1);
 182: 
+183: 	_combine_partial_AtA_Atz(dok_AtA1, dok_AtA2, &Atz1[0], &Atz2[0], n, zdim)
  __pyx_t_2 = 0;
  __pyx_t_3 = 0;
  _combine_partial_AtA_Atz(__pyx_v_dok_AtA1, __pyx_v_dok_AtA2, (&(*__Pyx_BufPtrCContig1d(double *, __pyx_pybuffernd_Atz1.rcbuffer->pybuffer.buf, __pyx_t_2, __pyx_pybuffernd_Atz1.diminfo[0].strides))), (&(*__Pyx_BufPtrCContig1d(double *, __pyx_pybuffernd_Atz2.rcbuffer->pybuffer.buf, __pyx_t_3, __pyx_pybuffernd_Atz2.diminfo[0].strides))), __pyx_v_n, __pyx_v_zdim);
 184: 
+185: def individual_tree_search(object tree, np.ndarray[double, ndim=1, mode="c"] point):
/* Python wrapper */
static PyObject *__pyx_pw_5anuga_15fit_interpolate_9fitsmooth_9individual_tree_search(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_mdef_5anuga_15fit_interpolate_9fitsmooth_9individual_tree_search = {"individual_tree_search", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5anuga_15fit_interpolate_9fitsmooth_9individual_tree_search, METH_VARARGS|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_5anuga_15fit_interpolate_9fitsmooth_9individual_tree_search(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_tree = 0;
  PyArrayObject *__pyx_v_point = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("individual_tree_search (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_tree,&__pyx_n_s_point,0};
    PyObject* values[2] = {0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_tree)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_point)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("individual_tree_search", 1, 2, 2, 1); __PYX_ERR(0, 185, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "individual_tree_search") < 0)) __PYX_ERR(0, 185, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
    }
    __pyx_v_tree = values[0];
    __pyx_v_point = ((PyArrayObject *)values[1]);
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("individual_tree_search", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 185, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("anuga.fit_interpolate.fitsmooth.individual_tree_search", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_point), __pyx_ptype_5numpy_ndarray, 1, "point", 0))) __PYX_ERR(0, 185, __pyx_L1_error)
  __pyx_r = __pyx_pf_5anuga_15fit_interpolate_9fitsmooth_8individual_tree_search(__pyx_self, __pyx_v_tree, __pyx_v_point);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5anuga_15fit_interpolate_9fitsmooth_8individual_tree_search(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_tree, PyArrayObject *__pyx_v_point) {
  quad_tree *__pyx_v_quadtree;
  double __pyx_v_xp;
  double __pyx_v_yp;
  double *__pyx_v_sigma;
  triangle *__pyx_v_T;
  long __pyx_v_found;
  long __pyx_v_index;
  PyObject *__pyx_v_sigmalist = 0;
  __Pyx_LocalBuf_ND __pyx_pybuffernd_point;
  __Pyx_Buffer __pyx_pybuffer_point;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("individual_tree_search", 0);
  __pyx_pybuffer_point.pybuffer.buf = NULL;
  __pyx_pybuffer_point.refcount = 0;
  __pyx_pybuffernd_point.data = NULL;
  __pyx_pybuffernd_point.rcbuffer = &__pyx_pybuffer_point;
  {
    __Pyx_BufFmt_StackElem __pyx_stack[1];
    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_point.rcbuffer->pybuffer, (PyObject*)__pyx_v_point, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) __PYX_ERR(0, 185, __pyx_L1_error)
  }
  __pyx_pybuffernd_point.diminfo[0].strides = __pyx_pybuffernd_point.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_point.diminfo[0].shape = __pyx_pybuffernd_point.rcbuffer->pybuffer.shape[0];
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;
    __Pyx_PyThreadState_declare
    __Pyx_PyThreadState_assign
    __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);
    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_point.rcbuffer->pybuffer);
  __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}
  __Pyx_AddTraceback("anuga.fit_interpolate.fitsmooth.individual_tree_search", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  goto __pyx_L2;
  __pyx_L0:;
  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_point.rcbuffer->pybuffer);
  __pyx_L2:;
  __Pyx_XDECREF(__pyx_v_sigmalist);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__11 = PyTuple_Pack(10, __pyx_n_s_tree, __pyx_n_s_point, __pyx_n_s_quadtree, __pyx_n_s_xp, __pyx_n_s_yp, __pyx_n_s_sigma, __pyx_n_s_T, __pyx_n_s_found, __pyx_n_s_index, __pyx_n_s_sigmalist); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(0, 185, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__11);
  __Pyx_GIVEREF(__pyx_tuple__11);
/* … */
  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_5anuga_15fit_interpolate_9fitsmooth_9individual_tree_search, NULL, __pyx_n_s_anuga_fit_interpolate_fitsmooth_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 185, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_individual_tree_search, __pyx_t_1) < 0) __PYX_ERR(0, 185, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_codeobj__12 = (PyObject*)__Pyx_PyCode_New(2, 0, 10, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__11, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_anuga_fit_interpolate_fitsmooth, __pyx_n_s_individual_tree_search, 185, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__12)) __PYX_ERR(0, 185, __pyx_L1_error)
 186: 
 187: 	cdef quad_tree* quadtree
 188: 	cdef double xp,yp
 189: 	cdef double* sigma
 190: 	cdef triangle* T
 191: 	cdef long found
 192: 	cdef long index
 193: 	cdef list sigmalist
 194: 
+195: 	quadtree = <quad_tree* > PyCapsule_GetPointer(tree, "quad tree")
  __pyx_t_1 = PyCapsule_GetPointer(__pyx_v_tree, ((char const *)"quad tree")); if (unlikely(__pyx_t_1 == ((void *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 195, __pyx_L1_error)
  __pyx_v_quadtree = ((quad_tree *)__pyx_t_1);
+196: 	xp = point[0]
  __pyx_t_2 = 0;
  __pyx_v_xp = (*__Pyx_BufPtrCContig1d(double *, __pyx_pybuffernd_point.rcbuffer->pybuffer.buf, __pyx_t_2, __pyx_pybuffernd_point.diminfo[0].strides));
+197: 	yp = point[1]
  __pyx_t_2 = 1;
  __pyx_v_yp = (*__Pyx_BufPtrCContig1d(double *, __pyx_pybuffernd_point.rcbuffer->pybuffer.buf, __pyx_t_2, __pyx_pybuffernd_point.diminfo[0].strides));
 198: 
+199: 	T = search(quadtree, xp, yp)
  __pyx_v_T = search(__pyx_v_quadtree, __pyx_v_xp, __pyx_v_yp);
+200: 	sigmalist = []
  __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 200, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_v_sigmalist = ((PyObject*)__pyx_t_3);
  __pyx_t_3 = 0;
 201: 
+202: 	if T != NULL:
  __pyx_t_4 = ((__pyx_v_T != NULL) != 0);
  if (__pyx_t_4) {
/* … */
    goto __pyx_L3;
  }
+203: 		sigma = calculate_sigma(T, xp, yp)
    __pyx_v_sigma = calculate_sigma(__pyx_v_T, __pyx_v_xp, __pyx_v_yp);
+204: 		sigmalist = c_double_array_to_list(sigma, 3)
    __pyx_t_3 = __pyx_f_5anuga_15fit_interpolate_9fitsmooth_c_double_array_to_list(__pyx_v_sigma, 3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 204, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    if (!(likely(PyList_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "list", Py_TYPE(__pyx_t_3)->tp_name), 0))) __PYX_ERR(0, 204, __pyx_L1_error)
    __Pyx_DECREF_SET(__pyx_v_sigmalist, ((PyObject*)__pyx_t_3));
    __pyx_t_3 = 0;
+205: 		free(sigma)
    free(__pyx_v_sigma);
+206: 		found = 1
    __pyx_v_found = 1;
+207: 		index = T.index
    __pyx_t_5 = __pyx_v_T->index;
    __pyx_v_index = __pyx_t_5;
 208: 	else:
+209: 		sigmalist = [-1, -1, -1]
  /*else*/ {
    __pyx_t_3 = PyList_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 209, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_INCREF(__pyx_int_neg_1);
    __Pyx_GIVEREF(__pyx_int_neg_1);
    PyList_SET_ITEM(__pyx_t_3, 0, __pyx_int_neg_1);
    __Pyx_INCREF(__pyx_int_neg_1);
    __Pyx_GIVEREF(__pyx_int_neg_1);
    PyList_SET_ITEM(__pyx_t_3, 1, __pyx_int_neg_1);
    __Pyx_INCREF(__pyx_int_neg_1);
    __Pyx_GIVEREF(__pyx_int_neg_1);
    PyList_SET_ITEM(__pyx_t_3, 2, __pyx_int_neg_1);
    __Pyx_DECREF_SET(__pyx_v_sigmalist, ((PyObject*)__pyx_t_3));
    __pyx_t_3 = 0;
+210: 		index = -10
    __pyx_v_index = -10L;
+211: 		found = 0
    __pyx_v_found = 0;
  }
  __pyx_L3:;
 212: 
+213: 	return [found, sigmalist, index]
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_v_found); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 213, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_6 = __Pyx_PyInt_From_long(__pyx_v_index); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 213, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_7 = PyList_New(3); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 213, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_GIVEREF(__pyx_t_3);
  PyList_SET_ITEM(__pyx_t_7, 0, __pyx_t_3);
  __Pyx_INCREF(__pyx_v_sigmalist);
  __Pyx_GIVEREF(__pyx_v_sigmalist);
  PyList_SET_ITEM(__pyx_t_7, 1, __pyx_v_sigmalist);
  __Pyx_GIVEREF(__pyx_t_6);
  PyList_SET_ITEM(__pyx_t_7, 2, __pyx_t_6);
  __pyx_t_3 = 0;
  __pyx_t_6 = 0;
  __pyx_r = __pyx_t_7;
  __pyx_t_7 = 0;
  goto __pyx_L0;
 214: 
+215: def items_in_tree(object tree):
/* Python wrapper */
static PyObject *__pyx_pw_5anuga_15fit_interpolate_9fitsmooth_11items_in_tree(PyObject *__pyx_self, PyObject *__pyx_v_tree); /*proto*/
static PyMethodDef __pyx_mdef_5anuga_15fit_interpolate_9fitsmooth_11items_in_tree = {"items_in_tree", (PyCFunction)__pyx_pw_5anuga_15fit_interpolate_9fitsmooth_11items_in_tree, METH_O, 0};
static PyObject *__pyx_pw_5anuga_15fit_interpolate_9fitsmooth_11items_in_tree(PyObject *__pyx_self, PyObject *__pyx_v_tree) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("items_in_tree (wrapper)", 0);
  __pyx_r = __pyx_pf_5anuga_15fit_interpolate_9fitsmooth_10items_in_tree(__pyx_self, ((PyObject *)__pyx_v_tree));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5anuga_15fit_interpolate_9fitsmooth_10items_in_tree(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_tree) {
  quad_tree *__pyx_v_quadtree;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("items_in_tree", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("anuga.fit_interpolate.fitsmooth.items_in_tree", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__13 = PyTuple_Pack(2, __pyx_n_s_tree, __pyx_n_s_quadtree); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(0, 215, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__13);
  __Pyx_GIVEREF(__pyx_tuple__13);
/* … */
  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_5anuga_15fit_interpolate_9fitsmooth_11items_in_tree, NULL, __pyx_n_s_anuga_fit_interpolate_fitsmooth_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 215, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_items_in_tree, __pyx_t_1) < 0) __PYX_ERR(0, 215, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_codeobj__14 = (PyObject*)__Pyx_PyCode_New(1, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__13, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_anuga_fit_interpolate_fitsmooth, __pyx_n_s_items_in_tree, 215, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__14)) __PYX_ERR(0, 215, __pyx_L1_error)
 216: 
 217: 	cdef quad_tree* quadtree
 218: 
+219: 	quadtree = <quad_tree* > PyCapsule_GetPointer(tree, "quad tree")
  __pyx_t_1 = PyCapsule_GetPointer(__pyx_v_tree, ((char const *)"quad tree")); if (unlikely(__pyx_t_1 == ((void *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 219, __pyx_L1_error)
  __pyx_v_quadtree = ((quad_tree *)__pyx_t_1);
 220: 
+221: 	return quadtree.count
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_quadtree->count); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 221, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;
 222: 
+223: def return_full_D(object D_cap, int n):
/* Python wrapper */
static PyObject *__pyx_pw_5anuga_15fit_interpolate_9fitsmooth_13return_full_D(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_mdef_5anuga_15fit_interpolate_9fitsmooth_13return_full_D = {"return_full_D", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5anuga_15fit_interpolate_9fitsmooth_13return_full_D, METH_VARARGS|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_5anuga_15fit_interpolate_9fitsmooth_13return_full_D(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_D_cap = 0;
  int __pyx_v_n;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("return_full_D (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_D_cap,&__pyx_n_s_n,0};
    PyObject* values[2] = {0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_D_cap)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_n)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("return_full_D", 1, 2, 2, 1); __PYX_ERR(0, 223, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "return_full_D") < 0)) __PYX_ERR(0, 223, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
    }
    __pyx_v_D_cap = values[0];
    __pyx_v_n = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_n == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 223, __pyx_L3_error)
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("return_full_D", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 223, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("anuga.fit_interpolate.fitsmooth.return_full_D", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5anuga_15fit_interpolate_9fitsmooth_12return_full_D(__pyx_self, __pyx_v_D_cap, __pyx_v_n);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5anuga_15fit_interpolate_9fitsmooth_12return_full_D(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_D_cap, int __pyx_v_n) {
  sparse_dok *__pyx_v_D_mat;
  int __pyx_v_i;
  int __pyx_v_j;
  edge_key_t __pyx_v_key;
  edge_t *__pyx_v_s;
  PyObject *__pyx_v_ret_D = 0;
  PyObject *__pyx_v_temp = 0;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("return_full_D", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("anuga.fit_interpolate.fitsmooth.return_full_D", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_ret_D);
  __Pyx_XDECREF(__pyx_v_temp);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__15 = PyTuple_Pack(9, __pyx_n_s_D_cap, __pyx_n_s_n, __pyx_n_s_D_mat, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_key, __pyx_n_s_s, __pyx_n_s_ret_D, __pyx_n_s_temp); if (unlikely(!__pyx_tuple__15)) __PYX_ERR(0, 223, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__15);
  __Pyx_GIVEREF(__pyx_tuple__15);
/* … */
  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_5anuga_15fit_interpolate_9fitsmooth_13return_full_D, NULL, __pyx_n_s_anuga_fit_interpolate_fitsmooth_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 223, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_return_full_D, __pyx_t_1) < 0) __PYX_ERR(0, 223, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_codeobj__16 = (PyObject*)__Pyx_PyCode_New(2, 0, 9, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__15, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_anuga_fit_interpolate_fitsmooth, __pyx_n_s_return_full_D, 223, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__16)) __PYX_ERR(0, 223, __pyx_L1_error)
 224: 
 225: 	cdef sparse_dok* D_mat
 226: 	cdef int i,j
 227: 	cdef edge_key_t key
 228: 	cdef edge_t* s
 229: 	cdef list ret_D
 230: 	cdef list temp
 231: 
+232: 	D_mat = <sparse_dok* > PyCapsule_GetPointer(D_cap, "sparse dok")
  __pyx_t_1 = PyCapsule_GetPointer(__pyx_v_D_cap, ((char const *)"sparse dok")); if (unlikely(__pyx_t_1 == ((void *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 232, __pyx_L1_error)
  __pyx_v_D_mat = ((sparse_dok *)__pyx_t_1);
 233: 
+234: 	assert D_mat.num_rows <= n and get_dok_rows(D_mat) <= n, "fitsmooth.return_full_D: sparse_dok is bigger than size specified for return."
  #ifndef CYTHON_WITHOUT_ASSERTIONS
  if (unlikely(!Py_OptimizeFlag)) {
    __pyx_t_3 = ((__pyx_v_D_mat->num_rows <= __pyx_v_n) != 0);
    if (__pyx_t_3) {
    } else {
      __pyx_t_2 = __pyx_t_3;
      goto __pyx_L3_bool_binop_done;
    }
    __pyx_t_3 = ((get_dok_rows(__pyx_v_D_mat) <= __pyx_v_n) != 0);
    __pyx_t_2 = __pyx_t_3;
    __pyx_L3_bool_binop_done:;
    if (unlikely(!__pyx_t_2)) {
      PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_fitsmooth_return_full_D_sparse_d);
      __PYX_ERR(0, 234, __pyx_L1_error)
    }
  }
  #endif
 235: 
+236: 	ret_D = []
  __pyx_t_4 = PyList_New(0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 236, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_v_ret_D = ((PyObject*)__pyx_t_4);
  __pyx_t_4 = 0;
+237: 	for i in xrange(n):
  __pyx_t_5 = __pyx_v_n;
  __pyx_t_6 = __pyx_t_5;
  for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) {
    __pyx_v_i = __pyx_t_7;
+238: 		temp = []
    __pyx_t_4 = PyList_New(0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 238, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_XDECREF_SET(__pyx_v_temp, ((PyObject*)__pyx_t_4));
    __pyx_t_4 = 0;
+239: 		for j in xrange(n):
    __pyx_t_8 = __pyx_v_n;
    __pyx_t_9 = __pyx_t_8;
    for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
      __pyx_v_j = __pyx_t_10;
+240: 			key.i = i
      __pyx_v_key.i = __pyx_v_i;
+241: 			key.j = j
      __pyx_v_key.j = __pyx_v_j;
+242: 			s = find_dok_entry(D_mat, key)
      __pyx_v_s = find_dok_entry(__pyx_v_D_mat, __pyx_v_key);
+243: 			if s:
      __pyx_t_2 = (__pyx_v_s != 0);
      if (__pyx_t_2) {
/* … */
        goto __pyx_L9;
      }
+244: 				temp.append(s.entry)
        __pyx_t_4 = PyFloat_FromDouble(__pyx_v_s->entry); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 244, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_4);
        __pyx_t_11 = __Pyx_PyList_Append(__pyx_v_temp, __pyx_t_4); if (unlikely(__pyx_t_11 == ((int)-1))) __PYX_ERR(0, 244, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 245: 			else:
+246: 				temp.append(float(0))
      /*else*/ {
        __pyx_t_4 = __Pyx_PyNumber_Float(__pyx_int_0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 246, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_4);
        __pyx_t_11 = __Pyx_PyList_Append(__pyx_v_temp, __pyx_t_4); if (unlikely(__pyx_t_11 == ((int)-1))) __PYX_ERR(0, 246, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      }
      __pyx_L9:;
    }
+247: 		ret_D.append(temp)
    __pyx_t_11 = __Pyx_PyList_Append(__pyx_v_ret_D, __pyx_v_temp); if (unlikely(__pyx_t_11 == ((int)-1))) __PYX_ERR(0, 247, __pyx_L1_error)
  }
 248: 
+249: 	return ret_D
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_ret_D);
  __pyx_r = __pyx_v_ret_D;
  goto __pyx_L0;
 250: 
+251: def build_matrix_B(object smoothing_mat_cap, object AtA_cap, double alpha):
/* Python wrapper */
static PyObject *__pyx_pw_5anuga_15fit_interpolate_9fitsmooth_15build_matrix_B(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_mdef_5anuga_15fit_interpolate_9fitsmooth_15build_matrix_B = {"build_matrix_B", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_5anuga_15fit_interpolate_9fitsmooth_15build_matrix_B, METH_VARARGS|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_5anuga_15fit_interpolate_9fitsmooth_15build_matrix_B(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_smoothing_mat_cap = 0;
  PyObject *__pyx_v_AtA_cap = 0;
  double __pyx_v_alpha;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("build_matrix_B (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_smoothing_mat_cap,&__pyx_n_s_AtA_cap,&__pyx_n_s_alpha,0};
    PyObject* values[3] = {0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_smoothing_mat_cap)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_AtA_cap)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("build_matrix_B", 1, 3, 3, 1); __PYX_ERR(0, 251, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_alpha)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("build_matrix_B", 1, 3, 3, 2); __PYX_ERR(0, 251, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "build_matrix_B") < 0)) __PYX_ERR(0, 251, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
    }
    __pyx_v_smoothing_mat_cap = values[0];
    __pyx_v_AtA_cap = values[1];
    __pyx_v_alpha = __pyx_PyFloat_AsDouble(values[2]); if (unlikely((__pyx_v_alpha == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 251, __pyx_L3_error)
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("build_matrix_B", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 251, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("anuga.fit_interpolate.fitsmooth.build_matrix_B", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5anuga_15fit_interpolate_9fitsmooth_14build_matrix_B(__pyx_self, __pyx_v_smoothing_mat_cap, __pyx_v_AtA_cap, __pyx_v_alpha);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5anuga_15fit_interpolate_9fitsmooth_14build_matrix_B(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_smoothing_mat_cap, PyObject *__pyx_v_AtA_cap, double __pyx_v_alpha) {
  sparse_dok *__pyx_v_smoothing_mat;
  sparse_dok *__pyx_v_dok_AtA;
  sparse_csr *__pyx_v_B;
  PyObject *__pyx_v_data = 0;
  PyObject *__pyx_v_colind = 0;
  PyObject *__pyx_v_row_ptr = 0;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("build_matrix_B", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("anuga.fit_interpolate.fitsmooth.build_matrix_B", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_data);
  __Pyx_XDECREF(__pyx_v_colind);
  __Pyx_XDECREF(__pyx_v_row_ptr);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__17 = PyTuple_Pack(9, __pyx_n_s_smoothing_mat_cap, __pyx_n_s_AtA_cap, __pyx_n_s_alpha, __pyx_n_s_smoothing_mat, __pyx_n_s_dok_AtA, __pyx_n_s_B, __pyx_n_s_data, __pyx_n_s_colind, __pyx_n_s_row_ptr); if (unlikely(!__pyx_tuple__17)) __PYX_ERR(0, 251, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__17);
  __Pyx_GIVEREF(__pyx_tuple__17);
/* … */
  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_5anuga_15fit_interpolate_9fitsmooth_15build_matrix_B, NULL, __pyx_n_s_anuga_fit_interpolate_fitsmooth_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 251, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_build_matrix_B, __pyx_t_1) < 0) __PYX_ERR(0, 251, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 252: 
 253: 	cdef sparse_dok* smoothing_mat
 254: 	cdef sparse_dok* dok_AtA
 255: 	cdef sparse_csr* B
 256: 	cdef list data, colind, row_ptr
 257: 
+258: 	smoothing_mat = <sparse_dok* > PyCapsule_GetPointer(smoothing_mat_cap, "sparse dok")
  __pyx_t_1 = PyCapsule_GetPointer(__pyx_v_smoothing_mat_cap, ((char const *)"sparse dok")); if (unlikely(__pyx_t_1 == ((void *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 258, __pyx_L1_error)
  __pyx_v_smoothing_mat = ((sparse_dok *)__pyx_t_1);
+259: 	dok_AtA = <sparse_dok* > PyCapsule_GetPointer(AtA_cap, "sparse dok")
  __pyx_t_1 = PyCapsule_GetPointer(__pyx_v_AtA_cap, ((char const *)"sparse dok")); if (unlikely(__pyx_t_1 == ((void *)NULL) && PyErr_Occurred())) __PYX_ERR(0, 259, __pyx_L1_error)
  __pyx_v_dok_AtA = ((sparse_dok *)__pyx_t_1);
 260: 
+261: 	add_sparse_dok(smoothing_mat, alpha, dok_AtA, 1)
  add_sparse_dok(__pyx_v_smoothing_mat, __pyx_v_alpha, __pyx_v_dok_AtA, 1.0);
 262: 
+263: 	B = make_csr()
  __pyx_v_B = make_csr();
+264: 	convert_to_csr_ptr(B, smoothing_mat)
  convert_to_csr_ptr(__pyx_v_B, __pyx_v_smoothing_mat);
 265: 
+266: 	data = c_double_array_to_list(B.data, B.num_entries)
  __pyx_t_2 = __pyx_f_5anuga_15fit_interpolate_9fitsmooth_c_double_array_to_list(__pyx_v_B->data, __pyx_v_B->num_entries); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 266, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (!(likely(PyList_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "list", Py_TYPE(__pyx_t_2)->tp_name), 0))) __PYX_ERR(0, 266, __pyx_L1_error)
  __pyx_v_data = ((PyObject*)__pyx_t_2);
  __pyx_t_2 = 0;
+267: 	colind = c_int_array_to_list(B.colind, B.num_entries)
  __pyx_t_2 = __pyx_f_5anuga_15fit_interpolate_9fitsmooth_c_int_array_to_list(__pyx_v_B->colind, __pyx_v_B->num_entries); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 267, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (!(likely(PyList_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "list", Py_TYPE(__pyx_t_2)->tp_name), 0))) __PYX_ERR(0, 267, __pyx_L1_error)
  __pyx_v_colind = ((PyObject*)__pyx_t_2);
  __pyx_t_2 = 0;
+268: 	row_ptr = c_int_array_to_list(B.row_ptr, B.num_rows)
  __pyx_t_2 = __pyx_f_5anuga_15fit_interpolate_9fitsmooth_c_int_array_to_list(__pyx_v_B->row_ptr, __pyx_v_B->num_rows); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 268, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (!(likely(PyList_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "list", Py_TYPE(__pyx_t_2)->tp_name), 0))) __PYX_ERR(0, 268, __pyx_L1_error)
  __pyx_v_row_ptr = ((PyObject*)__pyx_t_2);
  __pyx_t_2 = 0;
 269: 
+270: 	delete_csr_matrix(B)
  delete_csr_matrix(__pyx_v_B);
 271: 
+272: 	return [data, colind, row_ptr]
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = PyList_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 272, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_v_data);
  __Pyx_GIVEREF(__pyx_v_data);
  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_v_data);
  __Pyx_INCREF(__pyx_v_colind);
  __Pyx_GIVEREF(__pyx_v_colind);
  PyList_SET_ITEM(__pyx_t_2, 1, __pyx_v_colind);
  __Pyx_INCREF(__pyx_v_row_ptr);
  __Pyx_GIVEREF(__pyx_v_row_ptr);
  PyList_SET_ITEM(__pyx_t_2, 2, __pyx_v_row_ptr);
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;