static PyObject * py_niggli_reduce(PyObject *self, PyObject *args) { PyArrayObject* lattice; double eps; if (!PyArg_ParseTuple(args, "Od", &lattice, &eps)) { return NULL; } double *lat = (double(*))PyArray_DATA(lattice); int result = niggli_reduce(lat, eps); return PyLong_FromLong((long) result); }
/* Return 0 if failed */ static int change_basis_tricli(int int_transform_mat[3][3], SPGCONST double conv_lattice[3][3], SPGCONST double primitive_lattice[3][3], const double symprec) { int i, j; double niggli_cell[9]; double smallest_lattice[3][3], inv_lattice[3][3], transform_mat[3][3]; for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { niggli_cell[i * 3 + j] = conv_lattice[i][j]; } } if (! niggli_reduce(niggli_cell, symprec * symprec)) { return 0; } for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { smallest_lattice[i][j] = niggli_cell[i * 3 + j]; } } if (mat_get_determinant_d3(smallest_lattice) < 0) { for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { smallest_lattice[i][j] = -smallest_lattice[i][j]; } } } mat_inverse_matrix_d3(inv_lattice, primitive_lattice, 0); mat_multiply_matrix_d3(transform_mat, inv_lattice, smallest_lattice); mat_cast_matrix_3d_to_3i(int_transform_mat, transform_mat); return 1; }