从紧束缚模型出发构建WannierTools需要的数据
之前学习用WannierTools来计算一些拓扑性质,其中也涉及到了利用它来研究一个紧束缚模型的问题,这里主要是详细分析一下我们如何从紧束缚模型出发来造出WannierTools所需要的数据结构.
紧束缚模型哈密顿量
这是一个2D量子自旋霍尔效应, 在其中加上一个Zeeman场$h_z$. 参数选取为$m_0=1.5, t_x=t_y=1.0, A_x=A_y=1.0, h_z=0.2.$ 紧束缚模型哈密顿量的做法就是将三角函数改写成指数函数形式
这里假设了晶格常数$a=1$
接下来可以将(\ref{ham1})中的每一项都改写成关于指数形式的矩阵, 这里矩阵的直积顺序为$s_i\otimes\sigma_i$.
这里的$h_z$与$m_0$中并不涉及hopping, 最后代表的是onsite能量, 即就是$(000)$方向的跃迁.
构建WannierTools紧束缚数据
接下来就是结合(\ref{tri},\ref{ax},\ref{ay},\ref{tx},\ref{ty})来构建WannierTools计算所需要的紧束缚模型数据.
其中最主要的结构如下
下面给一个具体的例子来写这个数据, 比如要写$x$负方向的一个矩阵
产生程序
最后把自己写的构建这个模型数据的Fortran程序附上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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134! Chern insulator
! usage:
! compile and run
! gfortran writeHmnR.f90 -o writehmnr
! ./writehmnr
! H = Ax sin(kx)sigma_x s_z + Ay sin(ky) sigma_y s_0 + (m0 - tx cos(kx) - ty cos(ky))sigma_z s_0 + lam1 sigma_0 s_x
program writeHmnR
implicit none
integer, parameter :: dp=kind(1d0) ! 双精度计算
complex(dp), parameter :: im = (0d0, 1d0) ! 虚数单位i
complex(dp), parameter :: zzero = (0d0, 0d0)
integer :: i, j
integer :: ir
integer :: nwann
!> arrays for hamiltonian storage
integer :: nrpts
integer, allocatable :: ndegen(:)
integer, allocatable :: irvec(:, :)
complex(dp), allocatable :: hmnr(:, :, :)
!> three lattice constants
real(dp) :: Ax,Ay,m0,tx,ty,lamc
Ax = 1d0
Ay = 1d0
m0 = 1.5d0
tx = 1d0
ty = 1d0
lamc = 0.2d0 ! 层间耦合大小
nwann = 2 ! 构建紧束缚模型时候Wannier轨道的数目,这个模型中有4个轨道,化学式为零时占据两个
nrpts = 17
allocate(irvec(3, nrpts)) ! 该模型时2D的,所以hopping的方向也就只有2个,所以在之后的设置中保持第三个方向上恒为0
allocate(ndegen(nrpts))
allocate(hmnr(nwann*2, nwann*2, nrpts))
irvec = 0
ndegen = 1 ! 手动设置紧束缚模型数据所需要
hmnr = zzero ! 矩阵初始化
! 0 0 onsite能量
ir = 1 ! ir用来记录这里一共会有多少个hopping的方位(包括了onsite)
irvec(1, ir) = 0
irvec(2, ir) = 0
hmnr(1, 1, ir) = m0
hmnr(2, 2, ir) = m0
hmnr(3, 3, ir) = -m0
hmnr(4, 4, ir) = -m0
hmnr(1 ,2, ir) = lamc
hmnr(2 ,1, ir) = lamc
hmnr(3 ,4, ir) = lamc
hmnr(4 ,3, ir) = lamc
!1 0 x正反向hopping
ir = ir + 1
irvec(1, ir) = 1
irvec(2, ir) = 0
hmnr(1, 1, ir) = tx/2.0
hmnr(2, 2, ir) = tx/2.0
hmnr(3, 3, ir) = -tx/2.0
hmnr(4, 4, ir) = -tx/2.0
hmnr(1, 3, ir) = ax/(2.0*im)
hmnr(2, 4, ir) = -ax/(2.0*im)
hmnr(3, 1, ir) = ax/(2.0*im)
hmnr(4, 2, ir) = -ax/(2.0*im)
!-1 0 x负方向hopping
ir = ir+ 1
irvec(1, ir) = -1
irvec(2, ir) = 0
hmnr(1, 1, ir) = tx/2.0
hmnr(2, 2, ir) = tx/2.0
hmnr(3, 3, ir) = -tx/2.0
hmnr(4, 4, ir) = -tx/2.0
hmnr(1, 3, ir) = -ax/(2.0*im)
hmnr(2, 4, ir) = ax/(2.0*im)
hmnr(3, 1, ir) = -ax/(2.0*im)
hmnr(4, 2, ir) = ax/(2.0*im)
! 0 1 y正方向hopping
ir = ir + 1
irvec(1, ir) = 0
irvec(2, ir) = 1
hmnr(1, 1, ir) = ty/2.0
hmnr(2, 2, ir) = ty/2.0
hmnr(3, 3, ir) = -ty/2.0
hmnr(4, 4, ir) = -ty/2.0
hmnr(1, 3, ir) = -im*ay/(2.0*im)
hmnr(2, 4, ir) = -im*ay/(2.0*im)
hmnr(3, 1, ir) = im*ay/(2.0*im)
hmnr(4, 2, ir) = im*ay/(2.0*im)
!0 -1 y负方向hopping
ir = ir + 1
irvec(1, ir) = 0
irvec(2, ir) = -1
hmnr(1, 1, ir) = ty/2.0
hmnr(2, 2, ir) = ty/2.0
hmnr(3, 3, ir) = -ty/2.0
hmnr(4, 4, ir) = -ty/2.0
hmnr(1, 3, ir) = im*ay/(2.0*im)
hmnr(2, 4, ir) = im*ay/(2.0*im)
hmnr(3, 1, ir) = -im*ay/(2.0*im)
hmnr(4, 2, ir) = -im*ay/(2.0*im)
nrpts = ir
!> write to new_hr.dat
open(unit=105, file='ChernInsulator2L_hr.dat')
write(105, *)'Two Layers Chern Insulator couple'
write(105, *)nwann*2
write(105, *)nrpts
write(105, '(15I5)')(ndegen(i), i=1, nrpts)
do ir = 1, nrpts
do i = 1, nwann*2
do j = 1, nwann*2
write(105, '(5I5, 2f16.8)')irvec(:, ir), i, j, HmnR(i, j, ir)
end do
end do
end do
close(105)
stop
end ! end of program
所有这些内容可以点击这里下载
公众号
相关内容均会在公众号进行同步,若对该Blog感兴趣,欢迎关注微信公众号。
{:.info}
![]() |
yxliphy@gmail.com |