新版本wannier90wanniertools由于分组问题导致版本不匹配时wannier90_hr.dat的变换脚本,适用于wannier90v3.1.0wanniertoolsv2.6.1转换脚本,详情见这里这里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68

import numpy as np
import os


def creat_trans_matrix(dim):
base = int(dim/2)
# dim = base*2

Us = np.zeros([dim, dim])

for i in range(base):
Us[2*i, i] = 1
Us[2*i+1, base+i] = 1

Us = np.matrix(Us)
return Us


def load_wannier_hr(path_to_hr_file):

file_path = os.path.join(
path_to_hr_file,
"wannier90_hr.dat"
)

with open(file_path, 'r') as f:
origin_data = f.readlines()
pass

num_wann = int(origin_data[1])
nrpts = int(origin_data[2])
n = 0
if nrpts % 15:
n = int(nrpts/15 + 1)

head = origin_data[:n+3]
data = origin_data[n+3:]
return num_wann, nrpts, head, data


def create_indices_map(dim):
indices_ori = np.array([i+1 for i in range(dim)])
Us = creat_trans_matrix(dim)
indices = np.array(indices_ori * Us.T, dtype=int)[0]
return dict(zip(indices_ori, indices))


if __name__ == "__main__":

num_wann, nrpts, head, data = load_wannier_hr('./')
indices_map = create_indices_map(num_wann)

with open('new_wannier90_hr.dat.dat', 'w+') as f:
for i in head:
f.write(i)
for i in data:
line = i.split()
line[3] = indices_map[int(line[3])]
line[4] = indices_map[int(line[4])]
for j in line:
j = str(j)
if len(j) == 2 or len(j) == 9:
f.write(' '+j)
else:
f.write(' '+j)
f.write('\n')