static int test_spg_get_stabilized_reciprocal_mesh(void) { SpglibDataset *dataset; double lattice[3][3] = {{4, 0, 0}, {0, 4, 0}, {0, 0, 3}}; double position[][3] = { {0, 0, 0}, {0.5, 0.5, 0.5}, {0.3, 0.3, 0}, {0.7, 0.7, 0}, {0.2, 0.8, 0.5}, {0.8, 0.2, 0.5}, }; int types[] = {1, 1, 2, 2, 2, 2}; int num_atom = 6; dataset = spg_get_dataset(lattice, position, types, num_atom, 1e-5); if (dataset == NULL) { return 1; } int m = 40; int mesh[] = {m, m, m}; int is_shift[] = {1, 1, 1}; int grid_address[m * m * m][3]; int grid_mapping_table[m * m * m]; double q[] = {0, 0.5, 0.5}; printf("*** spg_get_stabilized_reciprocal_mesh of Rutile structure ***:\n"); int num_ir = spg_get_stabilized_reciprocal_mesh(grid_address, grid_mapping_table, mesh, is_shift, 1, dataset->n_operations, dataset->rotations, 1, (double(*)[3])q); spg_free_dataset(dataset); if (num_ir) { printf("Number of irreducible k-points stabilized by q=(0, 1/2, 1/2) of Rutile with\n"); printf("40x40x40 Monkhorst-Pack mesh is %d (8000).\n", num_ir); return 0; } else { return 1; } }
static int test_spg_relocate_BZ_grid_address(void) { double rec_lattice[3][3] = {{-0.17573761, 0.17573761, 0.17573761}, { 0.17573761, -0.17573761, 0.17573761}, { 0.17573761, 0.17573761, -0.17573761}}; int rotations[][3][3] = {{{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}}; int m = 40; int mesh[] = {m, m, m}; int is_shift[] = {0, 0, 0}; int bz_grid_address[(m + 1) * (m + 1) * (m + 1)][3]; int bz_map[m * m * m * 8]; int grid_address[m * m * m][3]; int grid_mapping_table[m * m * m]; double q[] = {0, 0, 0}; int num_ir = spg_get_stabilized_reciprocal_mesh(grid_address, grid_mapping_table, mesh, is_shift, 1, 1, rotations, 1, (double(*)[3])q); if (num_ir) { printf("*** spg_relocate_BZ_grid_address of NaCl structure ***:\n"); int num_q = spg_relocate_BZ_grid_address(bz_grid_address, bz_map, grid_address, mesh, rec_lattice, is_shift); printf("Number of k-points of NaCl Brillouin zone\n"); printf("with Gamma-centered 40x40x40 Monkhorst-Pack mesh is %d (65861).\n", num_q); return 0; } else { return 1; } }
static PyObject * get_stabilized_reciprocal_mesh(PyObject *self, PyObject *args) { PyArrayObject* grid_address_py; PyArrayObject* map; PyArrayObject* mesh; PyArrayObject* is_shift; int is_time_reversal; PyArrayObject* rotations; PyArrayObject* qpoints; if (!PyArg_ParseTuple(args, "OOOOiOO", &grid_address_py, &map, &mesh, &is_shift, &is_time_reversal, &rotations, &qpoints)) { return NULL; } int (*grid_address)[3] = (int(*)[3])PyArray_DATA(grid_address_py); int *map_int = (int*)PyArray_DATA(map); const int* mesh_int = (int*)PyArray_DATA(mesh); const int* is_shift_int = (int*)PyArray_DATA(is_shift); SPGCONST int (*rot)[3][3] = (int(*)[3][3])PyArray_DATA(rotations); const int num_rot = PyArray_DIMS(rotations)[0]; SPGCONST double (*q)[3] = (double(*)[3])PyArray_DATA(qpoints); const int num_q = PyArray_DIMS(qpoints)[0]; const int num_ir = spg_get_stabilized_reciprocal_mesh(grid_address, map_int, mesh_int, is_shift_int, is_time_reversal, num_rot, rot, num_q, q); return PyLong_FromLong((long) num_ir); }
static PyObject * get_stabilized_reciprocal_mesh(PyObject *self, PyObject *args) { PyArrayObject* grid_address_py; PyArrayObject* map; PyArrayObject* mesh; PyArrayObject* is_shift; int is_time_reversal; PyArrayObject* rotations; PyArrayObject* qpoints; if (!PyArg_ParseTuple(args, "OOOOiOO", &grid_address_py, &map, &mesh, &is_shift, &is_time_reversal, &rotations, &qpoints)) { return NULL; } int (*grid_address)[3] = (int(*)[3])grid_address_py->data; int *map_int = (int*)map->data; const int* mesh_int = (int*)mesh->data; const int* is_shift_int = (int*)is_shift->data; SPGCONST int (*rot)[3][3] = (int(*)[3][3])rotations->data; const int num_rot = rotations->dimensions[0]; SPGCONST double (*q)[3] = (double(*)[3])qpoints->data; const int num_q = qpoints->dimensions[0]; const int num_ir = spg_get_stabilized_reciprocal_mesh(grid_address, map_int, mesh_int, is_shift_int, is_time_reversal, num_rot, rot, num_q, q); return PyInt_FromLong((long) num_ir); }
static PyObject * get_stabilized_reciprocal_mesh(PyObject *self, PyObject *args) { int i, j, k; PyArrayObject* grid_point; PyArrayObject* map; PyArrayObject* mesh; PyArrayObject* is_shift; int is_time_reversal; PyArrayObject* rotations; PyArrayObject* qpoints; if (!PyArg_ParseTuple(args, "OOOOiOO", &grid_point, &map, &mesh, &is_shift, &is_time_reversal, &rotations, &qpoints)) { return NULL; } long *grid_long = (long*)grid_point->data; const int num_grid = grid_point->dimensions[0]; int grid_int[num_grid][3]; long *map_long = (long*)map->data; int map_int[num_grid]; int mesh_int[3]; int is_shift_int[3]; const long* mesh_long = (long*)mesh->data; const long* is_shift_long = (long*)is_shift->data; for (i = 0; i < 3; i++) { mesh_int[i] = (int) mesh_long[i]; is_shift_int[i] = (int) is_shift_long[i]; } const long* rot_long = (long*)rotations->data; const int num_rot = rotations->dimensions[0]; int rot[num_rot][3][3]; for (i = 0; i < num_rot; i++) { for (j = 0; j < 3; j++) { for (k = 0; k < 3; k++) { rot[i][j][k] = (int) rot_long[ i*9 + j*3 + k ]; } } } SPGCONST double (*q)[3] = (double(*)[3])qpoints->data; const int num_q = qpoints->dimensions[0]; /* Check memory space */ if (mesh_int[0]*mesh_int[1]*mesh_int[2] > num_grid) { return NULL; } const int num_ir = spg_get_stabilized_reciprocal_mesh(grid_int, map_int, mesh_int, is_shift_int, is_time_reversal, num_rot, rot, num_q, q); for (i = 0; i < mesh_int[0] * mesh_int[1] * mesh_int[2]; i++) { for (j = 0; j < 3; j++) { grid_long[ i*3 + j ] = (long) grid_int[i][j]; } map_long[i] = (long) map_int[i]; } return PyInt_FromLong((long) num_ir); }