Tests for bz grid address routine in C-gridsys library and python

This commit is contained in:
Atsushi Togo 2023-01-25 23:32:59 +09:00
parent a2e4db86be
commit ece7d519a4
4 changed files with 1444 additions and 5 deletions

View File

@ -40,10 +40,13 @@
#include "bzgrid.h"
#include "grgrid.h"
#include "lagrid.h"
#include "niggli.h"
#include "tetrahedron_method.h"
#include "triplet.h"
#include "triplet_iw.h"
#define GRIDSYS_NIGGLI_TOLERANCE 1e-5
void gridsys_get_all_grid_addresses(long (*gr_grid_addresses)[3],
const long D_diag[3]) {
grg_get_all_grid_addresses(gr_grid_addresses, D_diag);
@ -126,23 +129,45 @@ long gridsys_get_bz_grid_addresses(long (*bz_grid_addresses)[3], long *bz_map,
const long type) {
BZGrid *bzgrid;
long i, j, size;
long inv_Mpr_int[3][3];
double inv_Lr[3][3], inv_Mpr[3][3];
double niggli_lattice[9];
if ((bzgrid = (BZGrid *)malloc(sizeof(BZGrid))) == NULL) {
warning_print("Memory could not be allocated.");
return 0;
}
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
niggli_lattice[i * 3 + j] = rec_lattice[i][j];
}
}
if (!niggli_reduce(niggli_lattice, GRIDSYS_NIGGLI_TOLERANCE)) {
return 0;
}
if (!lagmat_inverse_matrix_d3(inv_Lr, (double(*)[3])niggli_lattice,
GRIDSYS_NIGGLI_TOLERANCE)) {
return 0;
}
lagmat_multiply_matrix_d3(inv_Mpr, inv_Lr, rec_lattice);
lagmat_cast_matrix_3d_to_3l(inv_Mpr_int, inv_Mpr);
// printf("%ld %ld %ld\n", inv_Mpr_int[0][0], inv_Mpr_int[0][1],
// inv_Mpr_int[0][2]);
// printf("%ld %ld %ld\n", inv_Mpr_int[1][0], inv_Mpr_int[1][1],
// inv_Mpr_int[1][2]);
// printf("%ld %ld %ld\n", inv_Mpr_int[2][0], inv_Mpr_int[2][1],
// inv_Mpr_int[2][2]);
bzgrid->addresses = bz_grid_addresses;
bzgrid->gp_map = bz_map;
bzgrid->bzg2grg = bzg2grg;
bzgrid->type = type;
lagmat_multiply_matrix_l3(bzgrid->Q, inv_Mpr_int, Q);
lagmat_copy_matrix_d3(bzgrid->reclat, (double(*)[3])niggli_lattice);
for (i = 0; i < 3; i++) {
bzgrid->D_diag[i] = D_diag[i];
bzgrid->PS[i] = PS[i];
for (j = 0; j < 3; j++) {
bzgrid->Q[i][j] = Q[i][j];
bzgrid->reclat[i][j] = rec_lattice[i][j];
}
}
if (bzg_get_bz_grid_addresses(bzgrid)) {

View File

@ -604,3 +604,246 @@ TEST(test_gridsys, test_gridsys_get_ir_grid_map_wurtzite) {
free(ir_grid_map);
ir_grid_map = NULL;
}
/**
* @brief gridsys_get_bz_grid_addresses by FCC
* Return BZ grid addresses
*/
TEST(test_gridsys, test_gridsys_get_bz_grid_addresses_FCC) {
long D_diag[3] = {4, 4, 4};
long ref_bz_addresses[89][3] = {
{0, 0, 0}, {1, 0, 0}, {-2, 0, 0}, {2, 0, 0}, {-1, 0, 0},
{0, 1, 0}, {1, 1, 0}, {2, 1, 0}, {-1, 1, 0}, {0, -2, 0},
{0, 2, 0}, {1, 2, 0}, {-2, -2, 0}, {2, 2, 0}, {-1, -2, 0},
{0, -1, 0}, {1, -1, 0}, {-2, -1, 0}, {-1, -1, 0}, {0, 0, 1},
{1, 0, 1}, {2, 0, 1}, {-1, 0, 1}, {0, 1, 1}, {1, 1, 1},
{2, 1, 1}, {-1, 1, 1}, {0, 2, 1}, {1, 2, 1}, {2, 2, 1},
{-1, -2, 1}, {-1, -2, -3}, {-1, 2, 1}, {3, 2, 1}, {0, -1, 1},
{1, -1, 1}, {-2, -1, 1}, {-2, -1, -3}, {2, -1, 1}, {2, 3, 1},
{-1, -1, 1}, {0, 0, -2}, {0, 0, 2}, {1, 0, 2}, {-2, 0, -2},
{2, 0, 2}, {-1, 0, -2}, {0, 1, 2}, {1, 1, 2}, {2, 1, 2},
{-1, 1, -2}, {-1, 1, 2}, {-1, -3, -2}, {3, 1, 2}, {0, -2, -2},
{0, 2, 2}, {1, 2, 2}, {-2, -2, -2}, {2, 2, 2}, {-1, -2, -2},
{0, -1, -2}, {1, -1, -2}, {1, -1, 2}, {1, 3, 2}, {-3, -1, -2},
{-2, -1, -2}, {-1, -1, -2}, {0, 0, -1}, {1, 0, -1}, {-2, 0, -1},
{-1, 0, -1}, {0, 1, -1}, {1, 1, -1}, {-2, 1, -1}, {-2, -3, -1},
{2, 1, -1}, {2, 1, 3}, {-1, 1, -1}, {0, -2, -1}, {1, -2, -1},
{1, 2, -1}, {1, 2, 3}, {-3, -2, -1}, {-2, -2, -1}, {-1, -2, -1},
{0, -1, -1}, {1, -1, -1}, {-2, -1, -1}, {-1, -1, -1},
};
long ref_bz_map[65] = {0, 1, 2, 4, 5, 6, 7, 8, 9, 11, 12, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
29, 30, 34, 35, 36, 40, 41, 43, 44, 46, 47, 48, 49,
50, 54, 56, 57, 59, 60, 61, 65, 66, 67, 68, 69, 70,
71, 72, 73, 77, 78, 79, 83, 84, 85, 86, 87, 88, 89};
long ref_bzg2grg[89] = {
0, 1, 2, 2, 3, 4, 5, 6, 7, 8, 8, 9, 10, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 27, 27, 27, 28, 29,
30, 30, 30, 30, 31, 32, 32, 33, 34, 34, 35, 36, 37, 38, 39, 39, 39, 39,
40, 40, 41, 42, 42, 43, 44, 45, 45, 45, 45, 46, 47, 48, 49, 50, 51, 52,
53, 54, 54, 54, 54, 55, 56, 57, 57, 57, 57, 58, 59, 60, 61, 62, 63};
double rec_lattice[3][3] = {{-1, 1, 1}, {1, -1, 1}, {1, 1, -1}};
long PS[3] = {0, 0, 0};
long Q[3][3] = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}};
long bz_grid_addresses[125][3];
long bz_map[65];
long bzg2grg[125];
long bz_size, i, j;
bz_size = gridsys_get_bz_grid_addresses(bz_grid_addresses, bz_map, bzg2grg,
D_diag, Q, PS, rec_lattice, 2);
ASSERT_EQ(89, bz_size);
for (i = 0; i < 89; i++) {
for (j = 0; j < 3; j++) {
ASSERT_EQ(ref_bz_addresses[i][j], bz_grid_addresses[i][j]);
}
}
for (i = 0; i < 65; i++) {
ASSERT_EQ(ref_bz_map[i], bz_map[i]);
}
for (i = 0; i < 89; i++) {
ASSERT_EQ(ref_bzg2grg[i], bzg2grg[i]);
}
}
/**
* @brief gridsys_get_bz_grid_addresses by wurtzite (angle 120)
* @details Niggli reduction changes (swaps) basis vectors.
* Return BZ grid addresses
*/
TEST(test_gridsys, test_gridsys_get_bz_grid_addresses_wurtzite1) {
long ref_bz_addresses[155][3] = {
{0, 0, 0}, {0, 1, 0}, {0, 2, 0}, {0, -2, 0},
{0, -1, 0}, {0, 0, 1}, {0, 1, 1}, {0, 2, 1},
{0, -3, 1}, {0, -2, 1}, {0, -1, 1}, {-4, 0, -18},
{0, 0, 2}, {-4, 1, -18}, {0, 1, 2}, {1, 1, 2},
{5, 1, 22}, {-4, -3, -18}, {0, -3, 2}, {1, 2, 2},
{5, 2, 22}, {-4, -2, -18}, {0, -2, 2}, {-4, -1, -18},
{0, -1, 2}, {1, 0, 3}, {1, 1, 3}, {1, 2, 3},
{1, 3, 3}, {-4, -2, -17}, {1, -1, 3}, {-4, -1, -17},
{1, 0, 4}, {1, 1, 4}, {1, 2, 4}, {1, -2, 4},
{1, 3, 4}, {1, -1, 4}, {1, 0, 5}, {1, 1, 5},
{1, 2, 5}, {1, -2, 5}, {1, -1, 5}, {-3, 0, -14},
{1, 0, 6}, {-3, 1, -14}, {1, 1, 6}, {-3, 2, -14},
{1, 2, 6}, {-3, -3, -14}, {1, -3, 6}, {-3, -2, -14},
{1, -2, 6}, {-3, -1, -14}, {1, -1, 6}, {-3, 0, -13},
{-3, 1, -13}, {2, 1, 7}, {-3, -3, -13}, {2, 2, 7},
{-3, -2, -13}, {-3, -1, -13}, {2, 0, 8}, {2, 1, 8},
{2, 2, 8}, {2, 3, 8}, {-3, -2, -12}, {2, -1, 8},
{-3, -1, -12}, {2, 0, 9}, {2, 1, 9}, {2, 2, 9},
{2, -2, 9}, {2, 3, 9}, {2, -1, 9}, {-2, 0, -10},
{2, 0, 10}, {-2, 1, -10}, {2, 1, 10}, {-2, 2, -10},
{2, 2, 10}, {-2, -2, -10}, {2, -2, 10}, {-2, -1, -10},
{2, -1, 10}, {-2, 0, -9}, {-2, 1, -9}, {-2, 2, -9},
{-2, -3, -9}, {-2, -2, -9}, {-2, -1, -9}, {-2, 0, -8},
{-2, 1, -8}, {3, 1, 12}, {-2, -3, -8}, {3, 2, 12},
{-2, -2, -8}, {-2, -1, -8}, {3, 0, 13}, {3, 1, 13},
{3, 2, 13}, {3, 3, 13}, {-2, -2, -7}, {3, -1, 13},
{-2, -1, -7}, {-1, 0, -6}, {3, 0, 14}, {-1, 1, -6},
{3, 1, 14}, {-1, 2, -6}, {3, 2, 14}, {-1, -2, -6},
{3, -2, 14}, {-1, 3, -6}, {3, 3, 14}, {-1, -1, -6},
{3, -1, 14}, {-1, 0, -5}, {-1, 1, -5}, {-1, 2, -5},
{-1, -2, -5}, {-1, -1, -5}, {-1, 0, -4}, {-1, 1, -4},
{-1, 2, -4}, {-1, -3, -4}, {-1, -2, -4}, {-1, -1, -4},
{-1, 0, -3}, {-1, 1, -3}, {4, 1, 17}, {-1, -3, -3},
{4, 2, 17}, {-1, -2, -3}, {-1, -1, -3}, {0, 0, -2},
{4, 0, 18}, {0, 1, -2}, {4, 1, 18}, {0, 2, -2},
{4, 2, 18}, {0, 3, -2}, {4, 3, 18}, {-5, -2, -22},
{-1, -2, -2}, {0, -1, -2}, {4, -1, 18}, {-5, -1, -22},
{-1, -1, -2}, {0, 0, -1}, {0, 1, -1}, {0, 2, -1},
{0, -2, -1}, {0, 3, -1}, {0, -1, -1}};
long ref_bz_map[101] = {
0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 13, 17,
21, 23, 25, 26, 27, 28, 30, 32, 33, 34, 35, 37, 38,
39, 40, 41, 42, 43, 45, 47, 51, 53, 55, 56, 58, 60,
61, 62, 63, 64, 65, 67, 69, 70, 71, 72, 74, 75, 77,
79, 81, 83, 85, 86, 87, 89, 90, 91, 92, 94, 96, 97,
98, 99, 100, 101, 103, 105, 107, 109, 111, 115, 117, 118, 119,
120, 121, 122, 123, 124, 126, 127, 128, 129, 131, 133, 134, 135,
137, 139, 141, 145, 149, 150, 151, 152, 154, 155};
long ref_bzg2grg[155] = {
0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10, 10, 11, 11, 11, 11, 12,
12, 12, 12, 13, 13, 14, 14, 15, 16, 17, 18, 18, 19, 19, 20, 21, 22, 23,
23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 31, 32, 32, 32, 32, 33, 33, 34,
34, 35, 36, 36, 37, 37, 38, 39, 40, 41, 42, 43, 43, 44, 44, 45, 46, 47,
48, 48, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 56, 57, 57, 58,
59, 60, 61, 61, 62, 62, 63, 64, 65, 66, 67, 68, 68, 69, 69, 70, 70, 71,
71, 72, 72, 73, 73, 73, 73, 74, 74, 75, 76, 77, 78, 79, 80, 81, 82, 82,
83, 84, 85, 86, 86, 87, 87, 88, 89, 90, 90, 91, 91, 92, 92, 93, 93, 93,
93, 94, 94, 94, 94, 95, 96, 97, 98, 98, 99};
double rec_lattice[3][3] = {
{3.111, -1.5555, 0}, {0, 2.694205031173388, 0}, {0, 0, 4.978}};
long PS[3] = {0, 0, 0};
long D_diag[3] = {1, 5, 20}; // [5, 5, 4]
long Q[3][3] = {{-1, 0, 4}, {0, -1, 0}, {-1, 0, 5}};
long bz_grid_addresses[180][3];
long bz_map[101];
long bzg2grg[180];
long bz_size, i, j;
bz_size = gridsys_get_bz_grid_addresses(bz_grid_addresses, bz_map, bzg2grg,
D_diag, Q, PS, rec_lattice, 2);
ASSERT_EQ(155, bz_size);
for (i = 0; i < 155; i++) {
for (j = 0; j < 3; j++) {
ASSERT_EQ(ref_bz_addresses[i][j], bz_grid_addresses[i][j]);
}
}
for (i = 0; i < 101; i++) {
ASSERT_EQ(ref_bz_map[i], bz_map[i]);
}
for (i = 0; i < 155; i++) {
ASSERT_EQ(ref_bzg2grg[i], bzg2grg[i]);
}
}
/**
* @brief gridsys_get_bz_grid_addresses by wurtzite (angle 60)
* @details Niggli reduction doesn't change (swap) basis vectors.
* Return BZ grid addresses
*/
TEST(test_gridsys, test_gridsys_get_bz_grid_addresses_zincblende2) {
long ref_bz_addresses[155][3] = {
{0, 0, 0}, {0, 1, 0}, {0, 2, 0}, {0, -2, 0},
{0, -1, 0}, {0, 0, 1}, {0, 1, 1}, {0, 2, 1},
{0, -2, 1}, {0, 3, 1}, {0, -1, 1}, {-4, 0, -18},
{0, 0, 2}, {-4, 1, -18}, {0, 1, 2}, {-4, 2, -18},
{0, 2, 2}, {-4, 3, -18}, {1, -2, 2}, {0, 3, 2},
{5, -2, 22}, {-4, -1, -18}, {1, -1, 2}, {0, -1, 2},
{5, -1, 22}, {1, 0, 3}, {1, 1, 3}, {-4, 1, -17},
{1, -3, 3}, {-4, 2, -17}, {1, -2, 3}, {1, -1, 3},
{1, 0, 4}, {1, 1, 4}, {1, 2, 4}, {1, -3, 4},
{1, -2, 4}, {1, -1, 4}, {1, 0, 5}, {1, 1, 5},
{1, 2, 5}, {1, -2, 5}, {1, -1, 5}, {-3, 0, -14},
{1, 0, 6}, {-3, 1, -14}, {1, 1, 6}, {-3, 2, -14},
{1, 2, 6}, {-3, -2, -14}, {-3, 3, -14}, {1, -2, 6},
{1, 3, 6}, {-3, -1, -14}, {1, -1, 6}, {-3, 0, -13},
{-3, 1, -13}, {-3, 2, -13}, {-3, 3, -13}, {2, -2, 7},
{-3, -1, -13}, {2, -1, 7}, {2, 0, 8}, {2, 1, 8},
{-3, 1, -12}, {2, -3, 8}, {-3, 2, -12}, {2, -2, 8},
{2, -1, 8}, {2, 0, 9}, {2, 1, 9}, {2, 2, 9},
{2, -3, 9}, {2, -2, 9}, {2, -1, 9}, {-2, 0, -10},
{2, 0, 10}, {-2, 1, -10}, {2, 1, 10}, {-2, 2, -10},
{2, 2, 10}, {-2, -2, -10}, {2, -2, 10}, {-2, -1, -10},
{2, -1, 10}, {-2, 0, -9}, {-2, 1, -9}, {-2, 2, -9},
{-2, -2, -9}, {-2, 3, -9}, {-2, -1, -9}, {-2, 0, -8},
{-2, 1, -8}, {-2, 2, -8}, {-2, 3, -8}, {3, -2, 12},
{-2, -1, -8}, {3, -1, 12}, {3, 0, 13}, {3, 1, 13},
{-2, 1, -7}, {3, -3, 13}, {-2, 2, -7}, {3, -2, 13},
{3, -1, 13}, {-1, 0, -6}, {3, 0, 14}, {-1, 1, -6},
{3, 1, 14}, {-1, 2, -6}, {-1, -3, -6}, {3, 2, 14},
{3, -3, 14}, {-1, -2, -6}, {3, -2, 14}, {-1, -1, -6},
{3, -1, 14}, {-1, 0, -5}, {-1, 1, -5}, {-1, 2, -5},
{-1, -2, -5}, {-1, -1, -5}, {-1, 0, -4}, {-1, 1, -4},
{-1, 2, -4}, {-1, -2, -4}, {-1, 3, -4}, {-1, -1, -4},
{-1, 0, -3}, {-1, 1, -3}, {-1, 2, -3}, {-1, 3, -3},
{4, -2, 17}, {-1, -1, -3}, {4, -1, 17}, {0, 0, -2},
{4, 0, 18}, {0, 1, -2}, {-5, 1, -22}, {4, 1, 18},
{-1, 1, -2}, {0, -3, -2}, {-5, 2, -22}, {4, -3, 18},
{-1, 2, -2}, {0, -2, -2}, {4, -2, 18}, {0, -1, -2},
{4, -1, 18}, {0, 0, -1}, {0, 1, -1}, {0, 2, -1},
{0, -3, -1}, {0, -2, -1}, {0, -1, -1}};
long ref_bz_map[101] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 13, 15,
17, 21, 25, 26, 28, 30, 31, 32, 33, 34, 36, 37, 38,
39, 40, 41, 42, 43, 45, 47, 49, 53, 55, 56, 57, 58,
60, 62, 63, 65, 67, 68, 69, 70, 71, 73, 74, 75, 77,
79, 81, 83, 85, 86, 87, 88, 90, 91, 92, 93, 94, 96,
98, 99, 101, 103, 104, 105, 107, 109, 113, 115, 117, 118, 119,
120, 121, 122, 123, 124, 125, 127, 128, 129, 130, 131, 133, 135,
137, 141, 145, 147, 149, 150, 151, 153, 154, 155};
long ref_bzg2grg[155] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 13,
13, 13, 13, 14, 14, 14, 14, 15, 16, 16, 17, 17, 18, 19, 20, 21, 22, 22,
23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 31, 32, 32, 33, 33, 33, 33, 34,
34, 35, 36, 37, 38, 38, 39, 39, 40, 41, 41, 42, 42, 43, 44, 45, 46, 47,
47, 48, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 56, 57, 58, 58,
59, 60, 61, 62, 63, 63, 64, 64, 65, 66, 66, 67, 67, 68, 69, 70, 70, 71,
71, 72, 72, 72, 72, 73, 73, 74, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83,
83, 84, 85, 86, 87, 88, 88, 89, 89, 90, 90, 91, 91, 91, 91, 92, 92, 92,
92, 93, 93, 94, 94, 95, 96, 97, 97, 98, 99};
double rec_lattice[3][3] = {{0.3214400514304082, 0.0, 0.0},
{0.1855835002216734, 0.3711670004433468, 0.0},
{0.0, 0.0, 0.20088388911209323}};
long PS[3] = {0, 0, 0};
long D_diag[3] = {1, 5, 20}; // [5, 5, 4]
long Q[3][3] = {{-1, 0, 4}, {0, -1, 0}, {-1, 0, 5}};
long bz_grid_addresses[180][3];
long bz_map[101];
long bzg2grg[180];
long bz_size, i, j;
bz_size = gridsys_get_bz_grid_addresses(bz_grid_addresses, bz_map, bzg2grg,
D_diag, Q, PS, rec_lattice, 2);
ASSERT_EQ(155, bz_size);
for (i = 0; i < 155; i++) {
for (j = 0; j < 3; j++) {
ASSERT_EQ(ref_bz_addresses[i][j], bz_grid_addresses[i][j]);
}
}
for (i = 0; i < 101; i++) {
ASSERT_EQ(ref_bz_map[i], bz_map[i]);
}
for (i = 0; i < 155; i++) {
ASSERT_EQ(ref_bzg2grg[i], bzg2grg[i]);
}
}

View File

@ -1121,7 +1121,8 @@ def _relocate_BZ_grid_address(
else:
bz_map = np.zeros(np.prod(D_diag) * 9 + 1, dtype="int_")
reclat_T = np.array(reciprocal_lattice.T, dtype="double", order="C")
# Mpr^-1 = Lr^-1 Lp
reclat_T = np.array(np.transpose(reciprocal_lattice), dtype="double", order="C")
reduced_basis = get_reduced_bases(reclat_T)
tmat_inv = np.dot(np.linalg.inv(reduced_basis.T), reclat_T.T)
tmat_inv_int = np.rint(tmat_inv).astype("int_")

File diff suppressed because it is too large Load Diff