Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
/* 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;
}