static PyObject * get_dataset(PyObject *self, PyObject *args) { int i, j, k, n; double symprec, angle_tolerance; SpglibDataset *dataset; PyArrayObject* lattice; PyArrayObject* position; PyArrayObject* atom_type; PyObject *array, *vec, *mat, *rot, *trans, *wyckoffs, *equiv_atoms; PyObject *std_lattice, *std_types, *std_positions; if (!PyArg_ParseTuple(args, "OOOdd", &lattice, &position, &atom_type, &symprec, &angle_tolerance)) { return NULL; } SPGCONST double (*lat)[3] = (double(*)[3])PyArray_DATA(lattice); SPGCONST double (*pos)[3] = (double(*)[3])PyArray_DATA(position); const int num_atom = PyArray_DIMS(position)[0]; const int* typat = (int*)PyArray_DATA(atom_type); dataset = spgat_get_dataset(lat, pos, typat, num_atom, symprec, angle_tolerance); array = PyList_New(15); n = 0; /* Space group number, international symbol, hall symbol */ PyList_SetItem(array, n, PyLong_FromLong((long) dataset->spacegroup_number)); n++; PyList_SetItem(array, n, PyLong_FromLong((long) dataset->hall_number)); n++; PyList_SetItem(array, n, PYUNICODE_FROMSTRING(dataset->international_symbol)); n++; PyList_SetItem(array, n, PYUNICODE_FROMSTRING(dataset->hall_symbol)); n++; /* Transformation matrix */ mat = PyList_New(3); for (i = 0; i < 3; i++) { vec = PyList_New(3); for (j = 0; j < 3; j++) { PyList_SetItem(vec, j, PyFloat_FromDouble(dataset->transformation_matrix[i][j])); } PyList_SetItem(mat, i, vec); } PyList_SetItem(array, n, mat); n++; /* Origin shift */ vec = PyList_New(3); for (i = 0; i < 3; i++) { PyList_SetItem(vec, i, PyFloat_FromDouble(dataset->origin_shift[i])); } PyList_SetItem(array, n, vec); n++; /* Rotation matrices */ rot = PyList_New(dataset->n_operations); for (i = 0; i < dataset->n_operations; i++) { mat = PyList_New(3); for (j = 0; j < 3; j++) { vec = PyList_New(3); for (k = 0; k < 3; k++) { PyList_SetItem(vec, k, PyLong_FromLong((long) dataset->rotations[i][j][k])); } PyList_SetItem(mat, j, vec); } PyList_SetItem(rot, i, mat); } PyList_SetItem(array, n, rot); n++; /* Translation vectors */ trans = PyList_New(dataset->n_operations); for (i = 0; i < dataset->n_operations; i++) { vec = PyList_New(3); for (j = 0; j < 3; j++) { PyList_SetItem(vec, j, PyFloat_FromDouble(dataset->translations[i][j])); } PyList_SetItem(trans, i, vec); } PyList_SetItem(array, n, trans); n++; /* Wyckoff letters, Equivalent atoms */ wyckoffs = PyList_New(dataset->n_atoms); equiv_atoms = PyList_New(dataset->n_atoms); for (i = 0; i < dataset->n_atoms; i++) { PyList_SetItem(wyckoffs, i, PyLong_FromLong((long) dataset->wyckoffs[i])); PyList_SetItem(equiv_atoms, i, PyLong_FromLong((long) dataset->equivalent_atoms[i])); } PyList_SetItem(array, n, wyckoffs); n++; PyList_SetItem(array, n, equiv_atoms); n++; std_lattice = PyList_New(3); for (i = 0; i < 3; i++) { vec = PyList_New(3); for (j = 0; j < 3; j++) { PyList_SetItem(vec, j, PyFloat_FromDouble(dataset->std_lattice[i][j])); } PyList_SetItem(std_lattice, i, vec); } PyList_SetItem(array, n, std_lattice); n++; /* Standardized unit cell */ std_types = PyList_New(dataset->n_std_atoms); std_positions = PyList_New(dataset->n_std_atoms); for (i = 0; i < dataset->n_std_atoms; i++) { vec = PyList_New(3); for (j = 0; j < 3; j++) { PyList_SetItem(vec, j, PyFloat_FromDouble(dataset->std_positions[i][j])); } PyList_SetItem(std_types, i, PyLong_FromLong((long) dataset->std_types[i])); PyList_SetItem(std_positions, i, vec); } PyList_SetItem(array, n, std_types); n++; PyList_SetItem(array, n, std_positions); n++; /* Point group */ PyList_SetItem(array, n, PyLong_FromLong((long) dataset->pointgroup_number)); n++; PyList_SetItem(array, n, PYUNICODE_FROMSTRING(dataset->pointgroup_symbol)); n++; spg_free_dataset(dataset); return array; }
static PyObject * get_dataset(PyObject *self, PyObject *args) { int i, j, k; double symprec, angle_tolerance; SpglibDataset *dataset; PyArrayObject* lattice; PyArrayObject* position; PyArrayObject* atom_type; PyObject* array, *vec, *mat, *rot, *trans, *wyckoffs, *equiv_atoms; if (!PyArg_ParseTuple(args, "OOOdd", &lattice, &position, &atom_type, &symprec, &angle_tolerance)) { return NULL; } SPGCONST double (*lat)[3] = (double(*)[3])lattice->data; SPGCONST double (*pos)[3] = (double(*)[3])position->data; const int num_atom = position->dimensions[0]; const int* typat = (int*)atom_type->data; dataset = spgat_get_dataset(lat, pos, typat, num_atom, symprec, angle_tolerance); array = PyList_New(9); /* Space group number, international symbol, hall symbol */ PyList_SetItem(array, 0, PyInt_FromLong((long) dataset->spacegroup_number)); PyList_SetItem(array, 1, PyString_FromString(dataset->international_symbol)); PyList_SetItem(array, 2, PyString_FromString(dataset->hall_symbol)); /* Transformation matrix */ mat = PyList_New(3); for (i = 0; i < 3; i++) { vec = PyList_New(3); for (j = 0; j < 3; j++) { PyList_SetItem(vec, j, PyFloat_FromDouble(dataset->transformation_matrix[i][j])); } PyList_SetItem(mat, i, vec); } PyList_SetItem(array, 3, mat); /* Origin shift */ vec = PyList_New(3); for (i = 0; i < 3; i++) { PyList_SetItem(vec, i, PyFloat_FromDouble(dataset->origin_shift[i])); } PyList_SetItem(array, 4, vec); /* Rotation matrices */ rot = PyList_New(dataset->n_operations); for (i = 0; i < dataset->n_operations; i++) { mat = PyList_New(3); for (j = 0; j < 3; j++) { vec = PyList_New(3); for (k = 0; k < 3; k++) { PyList_SetItem(vec, k, PyInt_FromLong((long) dataset->rotations[i][j][k])); } PyList_SetItem(mat, j, vec); } PyList_SetItem(rot, i, mat); } PyList_SetItem(array, 5, rot); /* Translation vectors */ trans = PyList_New(dataset->n_operations); for (i = 0; i < dataset->n_operations; i++) { vec = PyList_New(3); for (j = 0; j < 3; j++) { PyList_SetItem(vec, j, PyFloat_FromDouble(dataset->translations[i][j])); } PyList_SetItem(trans, i, vec); } PyList_SetItem(array, 6, trans); /* Wyckoff letters, Equivalent atoms */ wyckoffs = PyList_New(dataset->n_atoms); equiv_atoms = PyList_New(dataset->n_atoms); for (i = 0; i < dataset->n_atoms; i++) { PyList_SetItem(wyckoffs, i, PyInt_FromLong((long) dataset->wyckoffs[i])); PyList_SetItem(equiv_atoms, i, PyInt_FromLong((long) dataset->equivalent_atoms[i])); } PyList_SetItem(array, 7, wyckoffs); PyList_SetItem(array, 8, equiv_atoms); spg_free_dataset(dataset); return array; }