Improve tests of get_bz_triplets_at_q

This commit is contained in:
Atsushi Togo 2023-02-08 12:02:49 +09:00
parent 6c6b37b1b3
commit a7c408ce75
7 changed files with 1256 additions and 597 deletions

View File

@ -205,7 +205,8 @@ long gridsys_get_triplets_at_q(long *map_triplets, long *map_q,
rec_rotations, swappable);
}
long gridsys_get_bz_triplets_at_q(long (*triplets)[3], const long grid_point,
long gridsys_get_bz_triplets_at_q(long (*ir_triplets)[3],
const long bz_grid_index,
const long (*bz_grid_addresses)[3],
const long *bz_map, const long *map_triplets,
const long num_map_triplets,
@ -231,8 +232,8 @@ long gridsys_get_bz_triplets_at_q(long (*triplets)[3], const long grid_point,
}
bzgrid->size = num_map_triplets;
num_ir =
tpl_get_BZ_triplets_at_q(triplets, grid_point, bzgrid, map_triplets);
num_ir = tpl_get_BZ_triplets_at_q(ir_triplets, bz_grid_index, bzgrid,
map_triplets);
free(bzgrid);
bzgrid = NULL;

View File

@ -225,10 +225,10 @@ long gridsys_rotate_bz_grid_index(const long bz_grid_index,
* @brief Find independent q' of (q, q', q'') with given q.
*
* @param map_triplets Mapping table from all grid points to grid points of
* independent q'
* independent q' in GR-grid
* @param map_q Mapping table from all grid points to grid point indices of
* irreducible q-points under the stabilizer subgroup of q
* @param grid_point Grid point of q
* @param grid_index Grid point index of q in GR-grid
* @param D_diag Diagonal elements of diagnoal matrix D of Smith normal form
* @param is_time_reversal With (1) or without (0) time reversal symmetry
* @param num_rot Number of rotation matrices
@ -238,7 +238,7 @@ long gridsys_rotate_bz_grid_index(const long bz_grid_index,
* @return long Number of unique element of map_triplets
*/
long gridsys_get_triplets_at_q(long *map_triplets, long *map_q,
const long grid_point, const long D_diag[3],
const long grid_index, const long D_diag[3],
const long is_time_reversal, const long num_rot,
const long (*rec_rotations)[3][3],
const long swappable);
@ -246,8 +246,8 @@ long gridsys_get_triplets_at_q(long *map_triplets, long *map_q,
/**
* @brief Search grid point triplets considering BZ surface.
*
* @param triplets Ir-triplets by grid point indices in bz_grid_addresses
* @param grid_point Grid point of q
* @param ir_triplets Ir-triplets by grid point indices in BZ-grid
* @param bz_grid_index Grid point of q in BZ-grid
* @param bz_grid_addresses Grid point addresses of shortest grid points
* @param bz_map List of accumulated numbers of BZ grid points from the
* first GR grid point to the last grid point. In type-II, [0, 1, 3, 4, ...]
@ -261,7 +261,8 @@ long gridsys_get_triplets_at_q(long *map_triplets, long *map_q,
* dense, recommended) of bz_map
* @return long
*/
long gridsys_get_bz_triplets_at_q(long (*triplets)[3], const long grid_point,
long gridsys_get_bz_triplets_at_q(long (*ir_triplets)[3],
const long bz_grid_index,
const long (*bz_grid_addresses)[3],
const long *bz_map, const long *map_triplets,
const long num_map_triplets,

View File

@ -311,19 +311,21 @@ contains
integer(c_long) :: map_triplets(75), map_q(75)
real(c_double) :: rec_lattice(3, 3)
integer(c_long) :: grid_point, is_time_reversal, num_rot, num_gp, swappable
integer :: i, j, k, num_triplets_1, num_triplets_2, bz_size
integer :: i, j, k, num_triplets_1, num_triplets_2, bz_size, i_grgp
integer(c_long) :: triplets(3, 75)
integer(c_long) :: bz_grid_addresses(3, 108)
integer(c_long) :: bz_map(75)
integer(c_long) :: bzg2grg(108)
integer :: ref_num_triplets(4)
integer(c_long) :: ref_triplets(3, 45, 4)
integer(c_long) :: ref_ir_weights(45, 4)
integer :: ref_num_triplets(4, 2)
integer(c_long) :: ref_triplets(3, 45, 4, 2)
integer(c_long) :: ref_ir_weights(45, 4, 2)
integer :: shape_of_array(2)
integer :: grgp(2)
ref_num_triplets(:) = [18, 24, 30, 45]
ref_triplets(:, :, :) = &
grgp(:) = [1, 7]
ref_num_triplets(:, :) = reshape([18, 24, 30, 45, 24, 24, 45, 45], [4, 2])
ref_triplets(:, :, :, :) = &
reshape([ &
1, 0, 4, 1, 1, 3, 1, 2, 2, 1, 5, 91, 1, 7, 90, &
1, 10, 87, 1, 12, 85, 1, 13, 84, 1, 14, 83, 1, 18, 79, &
@ -360,10 +362,47 @@ contains
1, 36, 60, 1, 38, 59, 1, 39, 57, 1, 41, 56, 1, 42, 55, &
1, 43, 54, 1, 44, 53, 1, 45, 52, 1, 46, 50, 1, 48, 49, &
1, 62, 35, 1, 63, 34, 1, 64, 33, 1, 65, 32, 1, 66, 31, &
1, 67, 29, 1, 69, 28, 1, 70, 26, 1, 72, 25, 1, 73, 24], &
[3, 45, 4])
1, 67, 29, 1, 69, 28, 1, 70, 26, 1, 72, 25, 1, 73, 24, &
8, 0, 89, 8, 1, 88, 8, 2, 87, 8, 3, 86, 9, 4, 92, &
8, 5, 84, 8, 6, 82, 8, 8, 81, 8, 10, 80, 8, 11, 85, &
8, 12, 78, 8, 13, 76, 8, 14, 75, 8, 17, 79, 8, 19, 71, &
8, 20, 69, 9, 22, 67, 8, 24, 65, 8, 27, 62, 8, 29, 66, &
8, 31, 58, 8, 32, 57, 8, 40, 50, 8, 48, 48, 0, 0, 0, &
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
8, 0, 89, 8, 1, 88, 8, 2, 87, 8, 3, 86, 9, 4, 92, &
8, 5, 84, 8, 6, 82, 8, 8, 81, 8, 10, 80, 8, 11, 85, &
8, 12, 78, 8, 13, 76, 8, 14, 75, 8, 17, 79, 8, 19, 71, &
8, 20, 69, 9, 22, 67, 8, 24, 65, 8, 27, 62, 8, 29, 66, &
8, 31, 58, 8, 32, 57, 8, 40, 50, 8, 48, 48, 0, 0, 0, &
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
8, 0, 89, 8, 1, 88, 8, 2, 87, 8, 3, 86, 9, 4, 92, &
8, 5, 84, 8, 6, 82, 8, 8, 81, 8, 10, 80, 8, 11, 85, &
8, 12, 78, 8, 13, 76, 8, 14, 75, 8, 16, 74, 8, 17, 79, &
8, 19, 71, 8, 20, 69, 9, 22, 67, 9, 23, 73, 8, 24, 65, &
8, 25, 64, 8, 27, 62, 8, 29, 66, 8, 31, 58, 8, 32, 57, &
8, 33, 56, 8, 34, 55, 8, 40, 50, 9, 41, 49, 9, 42, 54, &
8, 43, 46, 8, 44, 45, 8, 48, 48, 8, 50, 40, 8, 51, 38, &
9, 53, 36, 8, 58, 31, 9, 61, 35, 8, 62, 27, 8, 63, 26, &
8, 71, 19, 9, 72, 18, 8, 79, 17, 8, 81, 8, 8, 89, 0, &
8, 0, 89, 8, 1, 88, 8, 2, 87, 8, 3, 86, 9, 4, 92, &
8, 5, 84, 8, 6, 82, 8, 8, 81, 8, 10, 80, 8, 11, 85, &
8, 12, 78, 8, 13, 76, 8, 14, 75, 8, 16, 74, 8, 17, 79, &
8, 19, 71, 8, 20, 69, 9, 22, 67, 9, 23, 73, 8, 24, 65, &
8, 25, 64, 8, 27, 62, 8, 29, 66, 8, 31, 58, 8, 32, 57, &
8, 33, 56, 8, 34, 55, 8, 40, 50, 9, 41, 49, 9, 42, 54, &
8, 43, 46, 8, 44, 45, 8, 48, 48, 8, 50, 40, 8, 51, 38, &
9, 53, 36, 8, 58, 31, 9, 61, 35, 8, 62, 27, 8, 63, 26, &
8, 71, 19, 9, 72, 18, 8, 79, 17, 8, 81, 8, 8, 89, 0 &
], &
[3, 45, 4, 2])
ref_ir_weights(:, :) = &
ref_ir_weights(:, :, :) = &
reshape([ &
2, 2, 1, 8, 4, 8, 4, 8, 8, 4, 4, 2, 4, 4, 2, 4, 2, 4, 0, 0, 0, 0, 0, &
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
@ -372,10 +411,17 @@ contains
1, 1, 1, 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, &
2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, &
1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2], &
[45, 4])
1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, &
2, 4, 4, 4, 4, 4, 2, 2, 4, 4, 4, 4, 4, 2, 2, 4, 4, 2, 2, 4, 2, 4, &
2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
2, 4, 4, 4, 4, 4, 2, 2, 4, 4, 4, 4, 4, 2, 2, 4, 4, 2, 2, 4, 2, 4, &
2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &
1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 1, 2, &
1, 2, 2, 2, 1, 2, 2, 2, 2, 1, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 1, 1, &
1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 1, &
2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 1, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 1, 1 &
], [45, 4, 2])
grid_point = 1
num_rot = 12
num_gp = 75
D_diag(:) = [1, 5, 15]
@ -389,26 +435,29 @@ contains
bz_grid_addresses, bz_map, bzg2grg, &
D_diag, Q, PS, rec_lattice, int(2, c_long))
call assert_int(bz_size, 93)
i = 1
do j = 0, 1
swappable = 1 - j
do k = 0, 1
is_time_reversal = 1 - k
num_triplets_1 = gridsys_get_triplets_at_q( &
map_triplets, map_q, grid_point, D_diag, &
is_time_reversal, num_rot, &
wurtzite_tilde_rec_rotations_without_time_reversal, swappable)
num_triplets_2 = gridsys_get_bz_triplets_at_q( &
triplets, grid_point, bz_grid_addresses, bz_map, &
map_triplets, num_gp, D_diag, Q, int(2, c_long))
write (*, '("swappable:", i0, ", is_time_reversal:", i0)', advance='no') swappable, is_time_reversal
call assert_int(num_triplets_1, num_triplets_2)
call assert_int(num_triplets_1, ref_num_triplets(i))
shape_of_array(:) = [3, num_triplets_2]
call assert_2D_array_c_long( &
triplets, ref_triplets(:, :, i), shape_of_array)
write (*, '(" OK")')
i = i + 1
do i_grgp = 1, 2
grid_point = grgp(i_grgp)
i = 1
do j = 0, 1
swappable = 1 - j
do k = 0, 1
is_time_reversal = 1 - k
num_triplets_1 = gridsys_get_triplets_at_q( &
map_triplets, map_q, grid_point, D_diag, &
is_time_reversal, num_rot, &
wurtzite_tilde_rec_rotations_without_time_reversal, swappable)
num_triplets_2 = gridsys_get_bz_triplets_at_q( &
triplets, bz_map(grid_point + 1), bz_grid_addresses, bz_map, &
map_triplets, num_gp, D_diag, Q, int(2, c_long))
write (*, '("swappable:", i0, ", is_time_reversal:", i0)', advance='no') swappable, is_time_reversal
call assert_int(num_triplets_1, num_triplets_2)
call assert_int(num_triplets_1, ref_num_triplets(i, i_grgp))
shape_of_array(:) = [3, num_triplets_2]
call assert_2D_array_c_long( &
triplets, ref_triplets(:, :, i, i_grgp), shape_of_array)
write (*, '(" OK")')
i = i + 1
end do
end do
end do

View File

@ -1031,97 +1031,202 @@ TEST(test_gridsys, test_gridsys_get_triplets_at_q_wurtzite_force_SNF) {
* @details Four patterns, is_time_reversal x swappable, are tested.
*/
TEST(test_gridsys, test_gridsys_get_bz_triplets_at_q_wurtzite_force_SNF) {
long ref_triplets[8][45][3] = {
{{1, 0, 4}, {1, 1, 3}, {1, 2, 2}, {1, 5, 91}, {1, 7, 90},
{1, 10, 87}, {1, 12, 85}, {1, 13, 84}, {1, 14, 83}, {1, 18, 79},
{1, 19, 77}, {1, 23, 74}, {1, 31, 66}, {1, 32, 65}, {1, 33, 64},
{1, 36, 60}, {1, 38, 59}, {1, 41, 56}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
{{1, 0, 4}, {1, 1, 3}, {1, 2, 2}, {1, 5, 91}, {1, 7, 90},
{1, 8, 88}, {1, 10, 87}, {1, 11, 86}, {1, 12, 85}, {1, 13, 84},
{1, 14, 83}, {1, 15, 81}, {1, 17, 80}, {1, 18, 79}, {1, 19, 77},
{1, 23, 74}, {1, 31, 66}, {1, 32, 65}, {1, 33, 64}, {1, 34, 63},
{1, 35, 62}, {1, 36, 60}, {1, 38, 59}, {1, 41, 56}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
{{1, 0, 4}, {1, 1, 3}, {1, 2, 2}, {1, 3, 1}, {1, 4, 0},
{1, 5, 91}, {1, 7, 90}, {1, 8, 88}, {1, 10, 87}, {1, 11, 86},
{1, 12, 85}, {1, 13, 84}, {1, 14, 83}, {1, 15, 81}, {1, 17, 80},
{1, 18, 79}, {1, 19, 77}, {1, 21, 76}, {1, 22, 75}, {1, 23, 74},
{1, 31, 66}, {1, 32, 65}, {1, 33, 64}, {1, 34, 63}, {1, 35, 62},
{1, 36, 60}, {1, 38, 59}, {1, 39, 57}, {1, 41, 56}, {1, 42, 55},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
{{1, 0, 4}, {1, 1, 3}, {1, 2, 2}, {1, 3, 1}, {1, 4, 0},
{1, 5, 91}, {1, 7, 90}, {1, 8, 88}, {1, 10, 87}, {1, 11, 86},
{1, 12, 85}, {1, 13, 84}, {1, 14, 83}, {1, 15, 81}, {1, 17, 80},
{1, 18, 79}, {1, 19, 77}, {1, 21, 76}, {1, 22, 75}, {1, 23, 74},
{1, 31, 66}, {1, 32, 65}, {1, 33, 64}, {1, 34, 63}, {1, 35, 62},
{1, 36, 60}, {1, 38, 59}, {1, 39, 57}, {1, 41, 56}, {1, 42, 55},
{1, 43, 54}, {1, 44, 53}, {1, 45, 52}, {1, 46, 50}, {1, 48, 49},
{1, 62, 35}, {1, 63, 34}, {1, 64, 33}, {1, 65, 32}, {1, 66, 31},
{1, 67, 29}, {1, 69, 28}, {1, 70, 26}, {1, 72, 25}, {1, 73, 24}},
{{1, 0, 4}, {1, 1, 3}, {1, 2, 2}, {1, 5, 30}, {1, 6, 28},
{1, 10, 25}, {1, 11, 23}, {1, 13, 21}, {1, 16, 19}, {1, 31, 66},
{1, 32, 65}, {1, 33, 64}, {1, 36, 92}, {1, 37, 90}, {1, 41, 87},
{1, 42, 85}, {1, 44, 83}, {1, 47, 81}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
{{1, 0, 4}, {1, 1, 3}, {1, 2, 2}, {1, 5, 30}, {1, 6, 28},
{1, 10, 25}, {1, 11, 23}, {1, 13, 21}, {1, 16, 19}, {1, 31, 66},
{1, 32, 65}, {1, 33, 64}, {1, 34, 63}, {1, 35, 62}, {1, 36, 92},
{1, 37, 90}, {1, 39, 89}, {1, 40, 88}, {1, 41, 87}, {1, 42, 85},
{1, 44, 83}, {1, 46, 82}, {1, 47, 81}, {1, 48, 80}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
{{1, 0, 4}, {1, 1, 3}, {1, 2, 2}, {1, 3, 1}, {1, 4, 0},
{1, 5, 30}, {1, 6, 28}, {1, 8, 27}, {1, 9, 26}, {1, 10, 25},
{1, 11, 23}, {1, 13, 21}, {1, 15, 20}, {1, 16, 19}, {1, 17, 18},
{1, 31, 66}, {1, 32, 65}, {1, 33, 64}, {1, 34, 63}, {1, 35, 62},
{1, 36, 92}, {1, 37, 90}, {1, 39, 89}, {1, 40, 88}, {1, 41, 87},
{1, 42, 85}, {1, 44, 83}, {1, 46, 82}, {1, 47, 81}, {1, 48, 80},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
{{1, 0, 4}, {1, 1, 3}, {1, 2, 2}, {1, 3, 1}, {1, 4, 0},
{1, 5, 30}, {1, 6, 28}, {1, 8, 27}, {1, 9, 26}, {1, 10, 25},
{1, 11, 23}, {1, 13, 21}, {1, 15, 20}, {1, 16, 19}, {1, 17, 18},
{1, 31, 66}, {1, 32, 65}, {1, 33, 64}, {1, 34, 63}, {1, 35, 62},
{1, 36, 92}, {1, 37, 90}, {1, 39, 89}, {1, 40, 88}, {1, 41, 87},
{1, 42, 85}, {1, 44, 83}, {1, 46, 82}, {1, 47, 81}, {1, 48, 80},
{1, 62, 35}, {1, 63, 34}, {1, 64, 33}, {1, 65, 32}, {1, 66, 31},
{1, 67, 61}, {1, 68, 59}, {1, 70, 58}, {1, 71, 57}, {1, 72, 56},
{1, 73, 54}, {1, 75, 52}, {1, 77, 51}, {1, 78, 50}, {1, 79, 49}}};
long ref_ir_weights[8][45] = {
{2, 2, 1, 8, 4, 8, 4, 8, 8, 4, 4, 2, 4, 4, 2, 4, 2, 4, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{2, 2, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 4, 2,
4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{1, 1, 1, 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1,
1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2},
{2, 2, 1, 4, 4, 2, 4, 2, 4, 4, 4, 2, 8, 8, 4, 8, 4, 8, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{2, 2, 1, 4, 4, 2, 4, 2, 4, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4,
4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4,
4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}};
long ref_num_triplets[8] = {18, 24, 30, 45, 18, 24, 30, 45};
long ref_triplets[2][8][45][3] = {
{{{1, 0, 4}, {1, 1, 3}, {1, 2, 2}, {1, 5, 91}, {1, 7, 90},
{1, 10, 87}, {1, 12, 85}, {1, 13, 84}, {1, 14, 83}, {1, 18, 79},
{1, 19, 77}, {1, 23, 74}, {1, 31, 66}, {1, 32, 65}, {1, 33, 64},
{1, 36, 60}, {1, 38, 59}, {1, 41, 56}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
{{1, 0, 4}, {1, 1, 3}, {1, 2, 2}, {1, 5, 91}, {1, 7, 90},
{1, 8, 88}, {1, 10, 87}, {1, 11, 86}, {1, 12, 85}, {1, 13, 84},
{1, 14, 83}, {1, 15, 81}, {1, 17, 80}, {1, 18, 79}, {1, 19, 77},
{1, 23, 74}, {1, 31, 66}, {1, 32, 65}, {1, 33, 64}, {1, 34, 63},
{1, 35, 62}, {1, 36, 60}, {1, 38, 59}, {1, 41, 56}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
{{1, 0, 4}, {1, 1, 3}, {1, 2, 2}, {1, 3, 1}, {1, 4, 0},
{1, 5, 91}, {1, 7, 90}, {1, 8, 88}, {1, 10, 87}, {1, 11, 86},
{1, 12, 85}, {1, 13, 84}, {1, 14, 83}, {1, 15, 81}, {1, 17, 80},
{1, 18, 79}, {1, 19, 77}, {1, 21, 76}, {1, 22, 75}, {1, 23, 74},
{1, 31, 66}, {1, 32, 65}, {1, 33, 64}, {1, 34, 63}, {1, 35, 62},
{1, 36, 60}, {1, 38, 59}, {1, 39, 57}, {1, 41, 56}, {1, 42, 55},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
{{1, 0, 4}, {1, 1, 3}, {1, 2, 2}, {1, 3, 1}, {1, 4, 0},
{1, 5, 91}, {1, 7, 90}, {1, 8, 88}, {1, 10, 87}, {1, 11, 86},
{1, 12, 85}, {1, 13, 84}, {1, 14, 83}, {1, 15, 81}, {1, 17, 80},
{1, 18, 79}, {1, 19, 77}, {1, 21, 76}, {1, 22, 75}, {1, 23, 74},
{1, 31, 66}, {1, 32, 65}, {1, 33, 64}, {1, 34, 63}, {1, 35, 62},
{1, 36, 60}, {1, 38, 59}, {1, 39, 57}, {1, 41, 56}, {1, 42, 55},
{1, 43, 54}, {1, 44, 53}, {1, 45, 52}, {1, 46, 50}, {1, 48, 49},
{1, 62, 35}, {1, 63, 34}, {1, 64, 33}, {1, 65, 32}, {1, 66, 31},
{1, 67, 29}, {1, 69, 28}, {1, 70, 26}, {1, 72, 25}, {1, 73, 24}},
{{1, 0, 4}, {1, 1, 3}, {1, 2, 2}, {1, 5, 30}, {1, 6, 28},
{1, 10, 25}, {1, 11, 23}, {1, 13, 21}, {1, 16, 19}, {1, 31, 66},
{1, 32, 65}, {1, 33, 64}, {1, 36, 92}, {1, 37, 90}, {1, 41, 87},
{1, 42, 85}, {1, 44, 83}, {1, 47, 81}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
{{1, 0, 4}, {1, 1, 3}, {1, 2, 2}, {1, 5, 30}, {1, 6, 28},
{1, 10, 25}, {1, 11, 23}, {1, 13, 21}, {1, 16, 19}, {1, 31, 66},
{1, 32, 65}, {1, 33, 64}, {1, 34, 63}, {1, 35, 62}, {1, 36, 92},
{1, 37, 90}, {1, 39, 89}, {1, 40, 88}, {1, 41, 87}, {1, 42, 85},
{1, 44, 83}, {1, 46, 82}, {1, 47, 81}, {1, 48, 80}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
{{1, 0, 4}, {1, 1, 3}, {1, 2, 2}, {1, 3, 1}, {1, 4, 0},
{1, 5, 30}, {1, 6, 28}, {1, 8, 27}, {1, 9, 26}, {1, 10, 25},
{1, 11, 23}, {1, 13, 21}, {1, 15, 20}, {1, 16, 19}, {1, 17, 18},
{1, 31, 66}, {1, 32, 65}, {1, 33, 64}, {1, 34, 63}, {1, 35, 62},
{1, 36, 92}, {1, 37, 90}, {1, 39, 89}, {1, 40, 88}, {1, 41, 87},
{1, 42, 85}, {1, 44, 83}, {1, 46, 82}, {1, 47, 81}, {1, 48, 80},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},
{{1, 0, 4}, {1, 1, 3}, {1, 2, 2}, {1, 3, 1}, {1, 4, 0},
{1, 5, 30}, {1, 6, 28}, {1, 8, 27}, {1, 9, 26}, {1, 10, 25},
{1, 11, 23}, {1, 13, 21}, {1, 15, 20}, {1, 16, 19}, {1, 17, 18},
{1, 31, 66}, {1, 32, 65}, {1, 33, 64}, {1, 34, 63}, {1, 35, 62},
{1, 36, 92}, {1, 37, 90}, {1, 39, 89}, {1, 40, 88}, {1, 41, 87},
{1, 42, 85}, {1, 44, 83}, {1, 46, 82}, {1, 47, 81}, {1, 48, 80},
{1, 62, 35}, {1, 63, 34}, {1, 64, 33}, {1, 65, 32}, {1, 66, 31},
{1, 67, 61}, {1, 68, 59}, {1, 70, 58}, {1, 71, 57}, {1, 72, 56},
{1, 73, 54}, {1, 75, 52}, {1, 77, 51}, {1, 78, 50}, {1, 79, 49}}},
{{
{8, 0, 89}, {8, 1, 88}, {8, 2, 87}, {8, 3, 86}, {9, 4, 92},
{8, 5, 84}, {8, 6, 82}, {8, 8, 81}, {8, 10, 80}, {8, 11, 85},
{8, 12, 78}, {8, 13, 76}, {8, 14, 75}, {8, 17, 79}, {8, 19, 71},
{8, 20, 69}, {9, 22, 67}, {8, 24, 65}, {8, 27, 62}, {8, 29, 66},
{8, 31, 58}, {8, 32, 57}, {8, 40, 50}, {8, 48, 48}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
},
{
{8, 0, 89}, {8, 1, 88}, {8, 2, 87}, {8, 3, 86}, {9, 4, 92},
{8, 5, 84}, {8, 6, 82}, {8, 8, 81}, {8, 10, 80}, {8, 11, 85},
{8, 12, 78}, {8, 13, 76}, {8, 14, 75}, {8, 17, 79}, {8, 19, 71},
{8, 20, 69}, {9, 22, 67}, {8, 24, 65}, {8, 27, 62}, {8, 29, 66},
{8, 31, 58}, {8, 32, 57}, {8, 40, 50}, {8, 48, 48}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
},
{
{8, 0, 89}, {8, 1, 88}, {8, 2, 87}, {8, 3, 86}, {9, 4, 92},
{8, 5, 84}, {8, 6, 82}, {8, 8, 81}, {8, 10, 80}, {8, 11, 85},
{8, 12, 78}, {8, 13, 76}, {8, 14, 75}, {8, 16, 74}, {8, 17, 79},
{8, 19, 71}, {8, 20, 69}, {9, 22, 67}, {9, 23, 73}, {8, 24, 65},
{8, 25, 64}, {8, 27, 62}, {8, 29, 66}, {8, 31, 58}, {8, 32, 57},
{8, 33, 56}, {8, 34, 55}, {8, 40, 50}, {9, 41, 49}, {9, 42, 54},
{8, 43, 46}, {8, 44, 45}, {8, 48, 48}, {8, 50, 40}, {8, 51, 38},
{9, 53, 36}, {8, 58, 31}, {9, 61, 35}, {8, 62, 27}, {8, 63, 26},
{8, 71, 19}, {9, 72, 18}, {8, 79, 17}, {8, 81, 8}, {8, 89, 0},
},
{
{8, 0, 89}, {8, 1, 88}, {8, 2, 87}, {8, 3, 86}, {9, 4, 92},
{8, 5, 84}, {8, 6, 82}, {8, 8, 81}, {8, 10, 80}, {8, 11, 85},
{8, 12, 78}, {8, 13, 76}, {8, 14, 75}, {8, 16, 74}, {8, 17, 79},
{8, 19, 71}, {8, 20, 69}, {9, 22, 67}, {9, 23, 73}, {8, 24, 65},
{8, 25, 64}, {8, 27, 62}, {8, 29, 66}, {8, 31, 58}, {8, 32, 57},
{8, 33, 56}, {8, 34, 55}, {8, 40, 50}, {9, 41, 49}, {9, 42, 54},
{8, 43, 46}, {8, 44, 45}, {8, 48, 48}, {8, 50, 40}, {8, 51, 38},
{9, 53, 36}, {8, 58, 31}, {9, 61, 35}, {8, 62, 27}, {8, 63, 26},
{8, 71, 19}, {9, 72, 18}, {8, 79, 17}, {8, 81, 8}, {8, 89, 0},
},
{
{7, 0, 28}, {8, 1, 27}, {8, 2, 26}, {8, 5, 22}, {8, 6, 20},
{7, 8, 19}, {7, 11, 16}, {7, 13, 15}, {7, 17, 17}, {7, 31, 90},
{8, 32, 89}, {8, 33, 88}, {8, 36, 84}, {8, 37, 82}, {7, 39, 81},
{7, 42, 78}, {7, 44, 77}, {7, 48, 79}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
},
{
{7, 0, 28}, {8, 1, 27}, {8, 2, 26}, {8, 5, 22}, {8, 6, 20},
{7, 8, 19}, {7, 11, 16}, {7, 13, 15}, {7, 17, 17}, {7, 31, 90},
{8, 32, 89}, {8, 33, 88}, {8, 36, 84}, {8, 37, 82}, {7, 39, 81},
{7, 42, 78}, {7, 44, 77}, {7, 48, 79}, {7, 49, 71}, {7, 50, 70},
{8, 53, 67}, {7, 56, 65}, {8, 58, 63}, {7, 59, 62}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
},
{
{7, 0, 28}, {8, 1, 27}, {8, 2, 26}, {8, 5, 22}, {8, 6, 20},
{7, 8, 19}, {7, 11, 16}, {7, 13, 15}, {7, 17, 17}, {7, 18, 9},
{7, 19, 8}, {8, 22, 5}, {7, 25, 3}, {8, 27, 1}, {7, 28, 0},
{7, 31, 90}, {8, 32, 89}, {8, 33, 88}, {8, 36, 84}, {8, 37, 82},
{7, 39, 81}, {7, 42, 78}, {7, 44, 77}, {7, 48, 79}, {7, 49, 71},
{7, 50, 70}, {8, 53, 67}, {7, 56, 65}, {8, 58, 63}, {7, 59, 62},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0},
},
{
{7, 0, 28}, {8, 1, 27}, {8, 2, 26}, {8, 5, 22}, {8, 6, 20},
{7, 8, 19}, {7, 11, 16}, {7, 13, 15}, {7, 17, 17}, {7, 18, 9},
{7, 19, 8}, {8, 22, 5}, {7, 25, 3}, {8, 27, 1}, {7, 28, 0},
{7, 31, 90}, {8, 32, 89}, {8, 33, 88}, {8, 36, 84}, {8, 37, 82},
{7, 39, 81}, {7, 42, 78}, {7, 44, 77}, {7, 48, 79}, {7, 49, 71},
{7, 50, 70}, {8, 53, 67}, {7, 56, 65}, {8, 58, 63}, {7, 59, 62},
{7, 62, 59}, {8, 63, 58}, {8, 64, 57}, {8, 67, 53}, {8, 68, 51},
{7, 70, 50}, {7, 73, 47}, {7, 75, 46}, {7, 79, 48}, {7, 80, 40},
{7, 81, 39}, {8, 84, 36}, {7, 87, 34}, {8, 89, 32}, {7, 90, 31},
}}};
long ref_ir_weights[2][8][45] = {
{{2, 2, 1, 8, 4, 8, 4, 8, 8, 4, 4, 2, 4, 4, 2, 4, 2, 4, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{2, 2, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 4, 2,
4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{1, 1, 1, 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1,
1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2},
{2, 2, 1, 4, 4, 2, 4, 2, 4, 4, 4, 2, 8, 8, 4, 8, 4, 8, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{2, 2, 1, 4, 4, 2, 4, 2, 4, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4,
4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4,
4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}},
{{2, 4, 4, 4, 4, 4, 2, 2, 4, 4, 4, 4, 4, 2, 2, 4, 4, 2, 2, 4, 2, 4, 2,
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{2, 4, 4, 4, 4, 4, 2, 2, 4, 4, 4, 4, 4, 2, 2, 4, 4, 2, 2, 4, 2, 4, 2,
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 1, 2,
1, 2, 2, 2, 1, 2, 2, 2, 2, 1, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 1, 1},
{1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 1, 2,
1, 2, 2, 2, 1, 2, 2, 2, 2, 1, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 1, 1},
{2, 4, 4, 4, 4, 2, 2, 2, 1, 4, 8, 8, 8, 8, 4, 4, 4, 2, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{2, 4, 4, 4, 4, 2, 2, 2, 1, 2, 4, 4, 4, 4, 2, 4, 4, 2, 4, 2, 4, 4, 4,
2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{1, 2, 2, 2, 2, 1, 2, 2, 1, 2, 1, 2, 2, 2, 1, 2, 4, 4, 4, 4, 2, 4, 4,
2, 4, 2, 4, 4, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{1, 2, 2, 2, 2, 1, 2, 2, 1, 2, 1, 2, 2, 2, 1, 1, 2, 2, 2, 2, 1, 2, 2,
1, 2, 1, 2, 2, 2, 1, 1, 2, 2, 2, 2, 1, 2, 2, 1, 2, 1, 2, 2, 2, 1}}};
long ref_num_triplets[2][8] = {{18, 24, 30, 45, 18, 24, 30, 45},
{24, 24, 45, 45, 18, 24, 30, 45}};
long D_diag[2][3] = {{1, 5, 15}, {5, 5, 3}};
long PS[3] = {0, 0, 0};
@ -1130,9 +1235,10 @@ TEST(test_gridsys, test_gridsys_get_bz_triplets_at_q_wurtzite_force_SNF) {
double rec_lattice[3][3] = {{0.3214400514304082, 0.0, 0.0},
{0.18558350022167336, 0.37116700044334666, 0.0},
{0.0, 0.0, 0.20088388911209318}};
long grid_point = 1;
long map_triplets[75], map_q[75];
long i, j, k, ll, count, num_triplets_1, num_triplets_2, bz_size;
long map_triplets[75], map_q[75], weights[75], ir_weights[75];
long i, j, k, ll, count, num_triplets_1, num_triplets_2, bz_size, i_grgp,
grid_point, ir_count;
long grgp[2] = {1, 7};
long is_time_reversal[2] = {1, 0};
long swappable[2] = {1, 0};
long rec_rotations[2][12][3][3];
@ -1159,38 +1265,63 @@ TEST(test_gridsys, test_gridsys_get_bz_triplets_at_q_wurtzite_force_SNF) {
}
}
count = 0;
for (i = 0; i < 2; i++) { // force_SNF True or False
bz_size =
gridsys_get_bz_grid_addresses(bz_grid_addresses, bz_map, bzg2grg,
D_diag[i], Q[i], PS, rec_lattice, 2);
ASSERT_EQ(93, bz_size);
// for (ll = 0; ll < 93; ll++) {
// printf("[%ld, %ld, %ld]\n", bz_grid_addresses[ll][0],
// bz_grid_addresses[ll][1], bz_grid_addresses[ll][2]);
// }
for (j = 0; j < 2; j++) { // swappable
for (k = 0; k < 2; k++) { // is_time_reversal
num_triplets_1 = gridsys_get_triplets_at_q(
map_triplets, map_q, grid_point, D_diag[i],
is_time_reversal[k], 12, rec_rotations[i], swappable[j]);
num_triplets_2 = gridsys_get_bz_triplets_at_q(
triplets, grid_point, bz_grid_addresses, bz_map,
map_triplets, 75, D_diag[i], Q[i], 2);
ASSERT_EQ(num_triplets_1, num_triplets_2);
ASSERT_EQ(num_triplets_1, ref_num_triplets[count]);
for (ll = 0; ll < num_triplets_2; ll++) {
// printf("%ld %ld %ld %ld [%ld %ld %ld] [%ld %ld
// %ld]\n", i,
// j, k, ll, ref_triplets[count][ll][0],
// ref_triplets[count][ll][1],
// ref_triplets[count][ll][2], triplets[ll][0],
// triplets[ll][1], triplets[ll][2]);
ASSERT_EQ(ref_triplets[count][ll][0], triplets[ll][0]);
ASSERT_EQ(ref_triplets[count][ll][1], triplets[ll][1]);
ASSERT_EQ(ref_triplets[count][ll][2], triplets[ll][2]);
for (i_grgp = 0; i_grgp < 2; i_grgp++) {
count = 0;
grid_point = grgp[i_grgp];
for (i = 0; i < 2; i++) { // force_SNF True or False
bz_size = gridsys_get_bz_grid_addresses(bz_grid_addresses, bz_map,
bzg2grg, D_diag[i], Q[i],
PS, rec_lattice, 2);
ASSERT_EQ(93, bz_size);
// for (ll = 0; ll < 93; ll++) {
// printf("[%ld, %ld, %ld]\n", bz_grid_addresses[ll][0],
// bz_grid_addresses[ll][1], bz_grid_addresses[ll][2]);
// }
for (j = 0; j < 2; j++) { // swappable
for (k = 0; k < 2; k++) { // is_time_reversal
num_triplets_1 = gridsys_get_triplets_at_q(
map_triplets, map_q, grid_point, D_diag[i],
is_time_reversal[k], 12, rec_rotations[i],
swappable[j]);
for (ll = 0; ll < 75; ll++) {
weights[ll] = 0;
ir_weights[ll] = 0;
}
for (ll = 0; ll < 75; ll++) {
weights[map_triplets[ll]]++;
}
ir_count = 0;
for (ll = 0; ll < 75; ll++) {
if (weights[ll] > 0) {
ir_weights[ir_count] = weights[ll];
ir_count++;
}
}
for (ll = 0; ll < num_triplets_1; ll++) {
ASSERT_EQ(ref_ir_weights[i_grgp][count][ll],
ir_weights[ll]);
}
num_triplets_2 = gridsys_get_bz_triplets_at_q(
triplets, bz_map[grid_point], bz_grid_addresses, bz_map,
map_triplets, 75, D_diag[i], Q[i], 2);
ASSERT_EQ(num_triplets_1, num_triplets_2);
ASSERT_EQ(num_triplets_1, ref_num_triplets[i_grgp][count]);
for (ll = 0; ll < num_triplets_2; ll++) {
// printf("%ld %ld %ld %ld [%ld %ld %ld] [%ld %ld
// %ld]\n", i,
// j, k, ll, ref_triplets[count][ll][0],
// ref_triplets[count][ll][1],
// ref_triplets[count][ll][2], triplets[ll][0],
// triplets[ll][1], triplets[ll][2]);
ASSERT_EQ(ref_triplets[i_grgp][count][ll][0],
triplets[ll][0]);
ASSERT_EQ(ref_triplets[i_grgp][count][ll][1],
triplets[ll][1]);
ASSERT_EQ(ref_triplets[i_grgp][count][ll][2],
triplets[ll][2]);
}
count++;
}
count++;
}
}
}

View File

@ -94,12 +94,12 @@ class ReciprocalToNormal:
sum_fc3 = 0j
for i, j, k in list(np.ndindex((num_atom,) * 3)):
sum_fc3_cart = 0
for l, m, n in list(np.ndindex((3, 3, 3))):
for ll, m, n in list(np.ndindex((3, 3, 3))):
sum_fc3_cart += (
e1[i * 3 + l, b1]
e1[i * 3 + ll, b1]
* e2[j * 3 + m, b2]
* e3[k * 3 + n, b3]
* self._fc3_reciprocal[i, j, k, l, m, n]
* self._fc3_reciprocal[i, j, k, ll, m, n]
)
mass_sqrt = np.sqrt(np.prod(self._masses[[i, j, k]]))
sum_fc3 += sum_fc3_cart / mass_sqrt

View File

@ -281,7 +281,7 @@ def _get_triplets_reciprocal_mesh_at_q(
return map_triplets, map_q
def _get_BZ_triplets_at_q(grid_point, bz_grid: BZGrid, map_triplets):
def _get_BZ_triplets_at_q(bz_grid_index, bz_grid: BZGrid, map_triplets):
"""Grid point triplets are searched considering BZ surface.
Looking for q+q'+q''=G with smallest |G|. In this condition,
@ -294,8 +294,8 @@ def _get_BZ_triplets_at_q(grid_point, bz_grid: BZGrid, map_triplets):
Parameters
----------
grid_number : int
Grid point of q0 as defined by bz_grid.
bz_grid_index : int
Grid point of q0 as defined in BZ-grid.
bz_grid : BZGrid
Data structure to represent BZ grid.
map_triplets : ndarray or None
@ -328,7 +328,7 @@ def _get_BZ_triplets_at_q(grid_point, bz_grid: BZGrid, map_triplets):
triplets = -np.ones((len(ir_weights), 3), dtype="int_")
num_ir_ret = phono3c.BZ_triplets_at_q(
triplets,
grid_point,
bz_grid_index,
bz_grid.addresses,
bz_grid.gp_map,
map_triplets,

File diff suppressed because it is too large Load Diff