Add test_gridsys_get_thm_relative_grid_address

This commit is contained in:
Atsushi Togo 2023-01-23 23:02:24 +09:00
parent 626910a210
commit bad5862efa
5 changed files with 85 additions and 111 deletions

View File

@ -107,12 +107,17 @@ double gridsys_get_thm_integration_weight(const double omega,
return thm_get_integration_weight(omega, tetrahedra_omegas, function);
}
void gridsys_get_thm_all_relative_grid_address(
long relative_grid_address[4][24][4][3]) {
thm_get_all_relative_grid_address(relative_grid_address);
}
/* Get one dataset of relative grid address used for tetrahedron */
/* method. rec_lattice is used to choose the one. */
/* rec_lattice : microzone basis vectors in column vectors */
void gridsys_get_thm_relative_grid_address(
long gridsys_get_thm_relative_grid_address(
long relative_grid_addresses[24][4][3], const double rec_lattice[3][3]) {
thm_get_relative_grid_address(relative_grid_addresses, rec_lattice);
return thm_get_relative_grid_address(relative_grid_addresses, rec_lattice);
}
/* The rotations are those after proper transformation in GRGrid. */

View File

@ -39,12 +39,58 @@
extern "C" {
#endif
/* Generalized regular (GR) grid
Integer grid matrix M_g is unimodular transformed to integer diagnonal matrix D
by D = P M_g Q, which can be achieved by Smith normal form like transformation.
P and Q used are integer unimodular matrices with determinant=1.
S in PS is doubled shift with respect to microzone basis vectors, i.e.,
half-grid shift along an axis corresponds to 1.
*/
/**
* @brief Return all GR-grid addresses with respect to n_1, n_2, n_3
*
* @param gr_grid_addresses all GR-grid addresses
* @param D_diag Numbers of divisions along a, b, c directions of GR-grid
* @return void
*/
void gridsys_get_all_grid_addresses(long (*gr_grid_addresses)[3],
const long D_diag[3]);
/**
* @brief Return double grid address in GR-grid
*
* @param address_double double grid address, i.e., possibly with shift in
* GR-grid
* @param address single grid address in GR-grid
* @param PS shift in GR-grid
* @return void
*/
void gridsys_get_double_grid_address(long address_double[3],
const long address[3], const long PS[3]);
/**
* @brief Return single grid address in GR-grid with given grid point index.
*
* @param address Single grid address in GR-grid
* @param grid_index Grid point index in GR-grid
* @param D_diag Numbers of divisions along a, b, c directions of GR-grid
* @return void
*/
void gridsys_get_grid_address_from_index(long address[3], const long grid_index,
const long D_diag[3]);
/**
* @brief
*
* @param address_double
* @param D_diag
* @param PS
* @return long
*/
long gridsys_get_double_grid_index(const long address_double[3],
const long D_diag[3], const long PS[3]);
long gridsys_get_grid_index_from_address(const long address[3],
@ -64,7 +110,9 @@ long gridsys_transform_rotations(long (*transformed_rots)[3][3],
double gridsys_get_thm_integration_weight(const double omega,
const double tetrahedra_omegas[24][4],
const char function);
void gridsys_get_thm_relative_grid_address(
void gridsys_get_thm_all_relative_grid_address(
long relative_grid_address[4][24][4][3]);
long gridsys_get_thm_relative_grid_address(
long relative_grid_addresses[24][4][3], const double rec_lattice[3][3]);
void gridsys_get_ir_grid_map(long *ir_grid_map, const long (*rotations)[3][3],
const long num_rot, const long D_diag[3],

View File

@ -718,7 +718,7 @@ static double _I_32(const double omega, const double vertices_omegas[4]);
static double _I_33(const double omega, const double vertices_omegas[4]);
static double _I_4(void);
void thm_get_relative_grid_address(long relative_grid_address[24][4][3],
long thm_get_relative_grid_address(long relative_grid_address[24][4][3],
const double rec_lattice[3][3]) {
long i, j, k, main_diag_index;
@ -732,6 +732,7 @@ void thm_get_relative_grid_address(long relative_grid_address[24][4][3],
}
}
}
return main_diag_index;
}
void thm_get_all_relative_grid_address(

View File

@ -37,7 +37,7 @@
#include <stddef.h>
void thm_get_relative_grid_address(long relative_grid_address[24][4][3],
long thm_get_relative_grid_address(long relative_grid_address[24][4][3],
const double rec_lattice[3][3]);
void thm_get_all_relative_grid_address(long relative_grid_address[4][24][4][3]);
double thm_get_integration_weight(const double omega,

View File

@ -485,111 +485,31 @@ TEST(test_gridsys, test_gridsys_get_thm_integration_weight) {
}
}
/**
* @brief gridsys_get_thm_relative_grid_address
* Return relative grid addresses for linear tetrahedron method.
*/
TEST(test_gridsys, test_gridsys_get_thm_relative_grid_address) {
const long ref_rel_grid_addresses = {
{
{{0, 0, 0}, {1, 0, 0}, {1, 1, 0}, {1, 1, 1}},
{{0, 0, 0}, {1, 0, 0}, {1, 0, 1}, {1, 1, 1}},
{{0, 0, 0}, {0, 1, 0}, {1, 1, 0}, {1, 1, 1}},
{{0, 0, 0}, {0, 1, 0}, {0, 1, 1}, {1, 1, 1}},
{{0, 0, 0}, {0, 0, 1}, {1, 0, 1}, {1, 1, 1}},
{{0, 0, 0}, {0, 0, 1}, {0, 1, 1}, {1, 1, 1}},
{{0, 0, 0}, {0, 1, 0}, {0, 1, 1}, {-1, 0, 0}},
{{0, 0, 0}, {0, 0, 1}, {0, 1, 1}, {-1, 0, 0}},
{{0, 0, 0}, {1, 0, 0}, {1, 0, 1}, {0, -1, 0}},
{{0, 0, 0}, {0, 0, 1}, {1, 0, 1}, {0, -1, 0}},
{{0, 0, 0}, {0, 0, 1}, {-1, -1, 0}, {0, -1, 0}},
{{0, 0, 0}, {0, 0, 1}, {-1, -1, 0}, {-1, 0, 0}},
{{0, 0, 0}, {1, 0, 0}, {1, 1, 0}, {0, 0, -1}},
{{0, 0, 0}, {0, 1, 0}, {1, 1, 0}, {0, 0, -1}},
{{0, 0, 0}, {0, 1, 0}, {-1, 0, -1}, {0, 0, -1}},
{{0, 0, 0}, {0, 1, 0}, {-1, 0, -1}, {-1, 0, 0}},
{{0, 0, 0}, {1, 0, 0}, {0, -1, -1}, {0, 0, -1}},
{{0, 0, 0}, {1, 0, 0}, {0, -1, -1}, {0, -1, 0}},
{{0, 0, 0}, {-1, -1, -1}, {0, -1, -1}, {0, 0, -1}},
{{0, 0, 0}, {-1, -1, -1}, {0, -1, -1}, {0, -1, 0}},
{{0, 0, 0}, {-1, -1, -1}, {-1, 0, -1}, {0, 0, -1}},
{{0, 0, 0}, {-1, -1, -1}, {-1, 0, -1}, {-1, 0, 0}},
{{0, 0, 0}, {-1, -1, -1}, {-1, -1, 0}, {0, -1, 0}},
{{0, 0, 0}, {-1, -1, -1}, {-1, -1, 0}, {-1, 0, 0}},
},
{
{{0, 0, 0}, {1, 0, 0}, {0, 1, 0}, {0, 1, 1}},
{{0, 0, 0}, {1, 0, 0}, {0, 0, 1}, {0, 1, 1}},
{{0, 0, 0}, {-1, 1, 0}, {-1, 1, 1}, {-1, 0, 0}},
{{0, 0, 0}, {-1, 0, 1}, {-1, 1, 1}, {-1, 0, 0}},
{{0, 0, 0}, {-1, 1, 0}, {0, 1, 0}, {-1, 1, 1}},
{{0, 0, 0}, {0, 1, 0}, {-1, 1, 1}, {0, 1, 1}},
{{0, 0, 0}, {-1, 0, 1}, {0, 0, 1}, {-1, 1, 1}},
{{0, 0, 0}, {0, 0, 1}, {-1, 1, 1}, {0, 1, 1}},
{{0, 0, 0}, {0, 0, 1}, {0, -1, 0}, {1, -1, 0}},
{{0, 0, 0}, {1, 0, 0}, {0, 0, 1}, {1, -1, 0}},
{{0, 0, 0}, {-1, 0, 1}, {0, -1, 0}, {-1, 0, 0}},
{{0, 0, 0}, {-1, 0, 1}, {0, 0, 1}, {0, -1, 0}},
{{0, 0, 0}, {0, 1, 0}, {0, 0, -1}, {1, 0, -1}},
{{0, 0, 0}, {1, 0, 0}, {0, 1, 0}, {1, 0, -1}},
{{0, 0, 0}, {-1, 1, 0}, {0, 0, -1}, {-1, 0, 0}},
{{0, 0, 0}, {-1, 1, 0}, {0, 1, 0}, {0, 0, -1}},
{{0, 0, 0}, {0, -1, -1}, {1, -1, -1}, {0, 0, -1}},
{{0, 0, 0}, {0, -1, -1}, {1, -1, -1}, {0, -1, 0}},
{{0, 0, 0}, {1, -1, -1}, {0, 0, -1}, {1, 0, -1}},
{{0, 0, 0}, {1, 0, 0}, {1, -1, -1}, {1, 0, -1}},
{{0, 0, 0}, {1, -1, -1}, {0, -1, 0}, {1, -1, 0}},
{{0, 0, 0}, {1, 0, 0}, {1, -1, -1}, {1, -1, 0}},
{{0, 0, 0}, {0, -1, -1}, {0, 0, -1}, {-1, 0, 0}},
{{0, 0, 0}, {0, -1, -1}, {0, -1, 0}, {-1, 0, 0}},
},
{
{{0, 0, 0}, {1, 0, 0}, {0, 1, 0}, {1, 0, 1}},
{{0, 0, 0}, {0, 1, 0}, {0, 0, 1}, {1, 0, 1}},
{{0, 0, 0}, {-1, 1, 0}, {0, 0, 1}, {-1, 0, 0}},
{{0, 0, 0}, {-1, 1, 0}, {0, 1, 0}, {0, 0, 1}},
{{0, 0, 0}, {1, -1, 1}, {0, -1, 0}, {1, -1, 0}},
{{0, 0, 0}, {0, -1, 1}, {1, -1, 1}, {0, -1, 0}},
{{0, 0, 0}, {1, 0, 0}, {1, -1, 1}, {1, -1, 0}},
{{0, 0, 0}, {1, 0, 0}, {1, -1, 1}, {1, 0, 1}},
{{0, 0, 0}, {0, -1, 1}, {1, -1, 1}, {0, 0, 1}},
{{0, 0, 0}, {1, -1, 1}, {0, 0, 1}, {1, 0, 1}},
{{0, 0, 0}, {0, -1, 1}, {0, -1, 0}, {-1, 0, 0}},
{{0, 0, 0}, {0, -1, 1}, {0, 0, 1}, {-1, 0, 0}},
{{0, 0, 0}, {1, 0, 0}, {0, 0, -1}, {0, 1, -1}},
{{0, 0, 0}, {1, 0, 0}, {0, 1, 0}, {0, 1, -1}},
{{0, 0, 0}, {-1, 0, -1}, {0, 0, -1}, {-1, 1, -1}},
{{0, 0, 0}, {-1, 0, -1}, {-1, 1, -1}, {-1, 0, 0}},
{{0, 0, 0}, {0, 0, -1}, {-1, 1, -1}, {0, 1, -1}},
{{0, 0, 0}, {0, 1, 0}, {-1, 1, -1}, {0, 1, -1}},
{{0, 0, 0}, {-1, 1, 0}, {-1, 1, -1}, {-1, 0, 0}},
{{0, 0, 0}, {-1, 1, 0}, {0, 1, 0}, {-1, 1, -1}},
{{0, 0, 0}, {0, 0, -1}, {0, -1, 0}, {1, -1, 0}},
{{0, 0, 0}, {1, 0, 0}, {0, 0, -1}, {1, -1, 0}},
{{0, 0, 0}, {-1, 0, -1}, {0, 0, -1}, {0, -1, 0}},
{{0, 0, 0}, {-1, 0, -1}, {0, -1, 0}, {-1, 0, 0}},
},
{
{{0, 0, 0}, {1, 0, 0}, {1, 1, 0}, {0, 0, 1}},
{{0, 0, 0}, {0, 1, 0}, {1, 1, 0}, {0, 0, 1}},
{{0, 0, 0}, {0, 1, 0}, {-1, 0, 1}, {-1, 0, 0}},
{{0, 0, 0}, {0, 1, 0}, {-1, 0, 1}, {0, 0, 1}},
{{0, 0, 0}, {1, 0, 0}, {0, -1, 1}, {0, -1, 0}},
{{0, 0, 0}, {1, 0, 0}, {0, -1, 1}, {0, 0, 1}},
{{0, 0, 0}, {-1, -1, 1}, {-1, -1, 0}, {0, -1, 0}},
{{0, 0, 0}, {-1, -1, 1}, {-1, -1, 0}, {-1, 0, 0}},
{{0, 0, 0}, {-1, -1, 1}, {0, -1, 1}, {0, -1, 0}},
{{0, 0, 0}, {-1, -1, 1}, {-1, 0, 1}, {-1, 0, 0}},
{{0, 0, 0}, {-1, -1, 1}, {0, -1, 1}, {0, 0, 1}},
{{0, 0, 0}, {-1, -1, 1}, {-1, 0, 1}, {0, 0, 1}},
{{0, 0, 0}, {0, 0, -1}, {1, 0, -1}, {1, 1, -1}},
{{0, 0, 0}, {0, 0, -1}, {0, 1, -1}, {1, 1, -1}},
{{0, 0, 0}, {1, 0, 0}, {1, 0, -1}, {1, 1, -1}},
{{0, 0, 0}, {0, 1, 0}, {0, 1, -1}, {1, 1, -1}},
{{0, 0, 0}, {1, 0, 0}, {1, 1, 0}, {1, 1, -1}},
{{0, 0, 0}, {0, 1, 0}, {1, 1, 0}, {1, 1, -1}},
{{0, 0, 0}, {0, 0, -1}, {0, 1, -1}, {-1, 0, 0}},
{{0, 0, 0}, {0, 1, 0}, {0, 1, -1}, {-1, 0, 0}},
{{0, 0, 0}, {0, 0, -1}, {1, 0, -1}, {0, -1, 0}},
{{0, 0, 0}, {1, 0, 0}, {1, 0, -1}, {0, -1, 0}},
{{0, 0, 0}, {0, 0, -1}, {-1, -1, 0}, {0, -1, 0}},
{{0, 0, 0}, {0, 0, -1}, {-1, -1, 0}, {-1, 0, 0}},
},
};
long all_rel_grid_address[4][24][4][3];
long rel_grid_addresses[24][4][3];
double rec_vectors[4][3][3] = {{{-1, 1, 1}, {1, -1, 1}, {1, 1, -1}},
{{-1, -1, -1}, {1, 1, -1}, {1, -1, 1}},
{{1, 1, -1}, {-1, -1, -1}, {-1, 1, 1}},
{{1, -1, 1}, {-1, 1, 1}, {-1, -1, -1}}};
long i, j, k, l, main_diagonal;
gridsys_get_thm_all_relative_grid_address(all_rel_grid_address);
for (i = 0; i < 4; i++) {
main_diagonal = gridsys_get_thm_relative_grid_address(
rel_grid_addresses, rec_vectors[i]);
ASSERT_EQ(i, main_diagonal);
for (j = 0; j < 24; j++) {
for (k = 0; k < 4; k++) {
for (l = 0; l < 3; l++) {
ASSERT_EQ(all_rel_grid_address[i][j][k][l],
rel_grid_addresses[j][k][l]);
}
}
}
}
}