本 Blog 提供计算边界极化的完整代码,理论部分参考边界极化这篇 Blog。

代码

串行

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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
# using LinearAlgebra,PyPlot,DelimitedFiles
# s_x\sigma_0\tau_z
using LinearAlgebra,DelimitedFiles
# ==================================================
function Wannier(h0::Float64,yn::Int64,dir::Int64)
hn::Int64 = 8
# yn::Int64 = 50
N::Int64 = yn*hn
nx::Int64 = 200 # 在离散方向上的撒点数目
Kx = range(0,2,length = nx)
ham = zeros(ComplexF64,N,N)
Noccu::Int64 = Int(N/2) # 占据态数目为哈密顿量矩阵维度一半
Wave = zeros(ComplexF64,N,N,nx) # 存储每个离散点上的本征矢量(波函数)
Wan = zeros(ComplexF64,Noccu,Noccu)# 存储Wannier占据态波函数,占据态数目是哈密顿量矩阵的一半
ang = zeros(Float64,Noccu) # 对每个离散的点,都会对应一组占据态的Wannier本征值
F = zeros(ComplexF64,Noccu,Noccu)
for ix in 1:nx # 对离散的ki进行Wilson loop构建
kx = Kx[ix]*pi
if dir == 0
ham = openx(h0,yn,kx)
else
ham = openy(h0,yn,kx)
end
val,vec = eigen(ham)
Wave[:,:,ix] = vec[:,:] # 首先存储所有点上的本征矢量
end
Wave[:,:,nx] = Wave[:,:,1] # 首尾相连

for i1 in 1:Noccu
F[i1,i1] = 1
end

for i1 in 1:nx-1
for i2 in 1:Noccu
for i3 in 1:Noccu
Wan[i2,i3] = Wave[:,i2,i1]'*Wave[:,i3,i1 + 1] # 计算波函数交叠
end
end
F = F*Wan
end
F = -im*log(F)
return F # 得到Wannier哈密顿量
end
# =================================================
function openx(h0::Float64,yn::Int64,ky::Float64)
hn::Int64 = 8
# yn::Int64 = 50
N::Int64 = yn*hn
m0::Float64 = 1.
tx::Float64 = 2.0
ty::Float64 = 2.0
ax::Float64 = 2.0
ay::Float64 = 2.0
#-----------------
dx::Float64 = 0.
dy::Float64 = -dx
d0::Float64 = 0.4
#h0::Float64 = 0.6 # 层间耦合
tp::Float64 = -0. # inversion breaking
Ham = zeros(ComplexF64,N,N)
g1 = zeros(ComplexF64,hn,hn)
g2 = zeros(ComplexF64,hn,hn)
g3 = zeros(ComplexF64,hn,hn)
g4 = zeros(ComplexF64,hn,hn)
g5 = zeros(ComplexF64,hn,hn)
g6 = zeros(ComplexF64,hn,hn)
g1,g2,g3,g4,g5,g6 = Pauli()
for k = 0:yn-1
if (k == 0) # Only right block in first line
for m = 1:hn
for l = 1:hn
Ham[m,l] = (m0-ty*cos(ky))*g1[m,l] + ay*sin(ky)*g3[m,l] + (d0 + dy*cos(ky))*g4[m,l] + h0*g5[m,l] + tp*g6[m,l]

Ham[m,l + hn] = (-tx*g1[m,l] - im*ax*g2[m,l])/2.0+ dx/2.0*g4[m,l]
end
end
elseif ( k==yn-1 ) # Only left block in last line
for m = 1:hn
for l = 1:hn
Ham[k*hn + m,k*hn + l] = (m0-ty*cos(ky))*g1[m,l] + ay*sin(ky)*g3[m,l] + (d0 + dy*cos(ky))*g4[m,l]+ h0*g5[m,l] + tp*g6[m,l]

Ham[k*hn + m,k*hn + l - hn] = -tx*g1[m,l]/2 + im*ax*g2[m,l]/2 + dx/2.0*g4[m,l]
end
end
else
for m = 1:hn
for l = 1:hn # k start from 1,matrix block from 2th row
Ham[k*hn + m,k*hn + l] = (m0 - ty*cos(ky))*g1[m,l] + ay*sin(ky)*g3[m,l] + (d0 + dy*cos(ky))*g4[m,l]+ h0*g5[m,l] + tp*g6[m,l]

Ham[k*hn + m,k*hn + l + hn] = (-tx*g1[m,l] - im*ax*g2[m,l])/2 + dx/2.0*g4[m,l]
Ham[k*hn + m,k*hn + l - hn] = -tx*g1[m,l]/2 + im*ax*g2[m,l]/2 + dx/2.0*g4[m,l]
end
end
end
end
return Ham
end
# ==========================================================
function openy(h0::Float64,yn::Int64,kx::Float64)
hn::Int64 = 8
# yn::Int64 = 50
N::Int64 = yn*hn
m0::Float64 = 1.
tx::Float64 = 2.0
ty::Float64 = 2.0
ax::Float64 = 2.0
ay::Float64 = 2.0
#-----------------
dx::Float64 = 0.
dy::Float64 = -dx
d0::Float64 = 0.4
# h0::Float64 = 0.2 # 层间耦合
tp::Float64 = -0. # inversion breaking
Ham = zeros(ComplexF64,N,N)
g1 = zeros(ComplexF64,hn,hn)
g2 = zeros(ComplexF64,hn,hn)
g3 = zeros(ComplexF64,hn,hn)
g4 = zeros(ComplexF64,hn,hn)
g5 = zeros(ComplexF64,hn,hn)
g6 = zeros(ComplexF64,hn,hn)
g1,g2,g3,g4,g5,g6 = Pauli()
for k = 0:yn-1
if (k == 0) # Only right block in first line
for m = 1:hn
for l = 1:hn
Ham[m,l] = (m0-tx*cos(kx))*g1[m,l] + ax*sin(kx)*g2[m,l] + (d0 + dx*cos(kx))*g4[m,l]+ h0*g5[m,l] + tp*g6[m,l]

Ham[m,l + hn] = (-ty*g1[m,l] - im*ay*g3[m,l])/2 + dy/2.0*g4[m,l]
end
end
elseif ( k==yn-1 ) # Only left block in last line
for m = 1:hn
for l = 1:hn
Ham[k*hn + m,k*hn + l] = (m0-tx*cos(kx))*g1[m,l] + ax*sin(kx)*g2[m,l] + (d0 + dx*cos(kx))*g4[m,l]+ h0*g5[m,l] + tp*g6[m,l]

Ham[k*hn + m,k*hn + l - hn] = -ty*g1[m,l]/2 + im*ay*g3[m,l]/2 + dy/2.0*g4[m,l]
end
end
else
for m = 1:hn
for l = 1:hn # k start from 1,matrix block from 2th row
Ham[k*hn + m,k*hn + l] = (m0-tx*cos(kx))*g1[m,l] + ax*sin(kx)*g2[m,l] + (d0 + dx*cos(kx))*g4[m,l]+ h0*g5[m,l] + tp*g6[m,l]

Ham[k*hn + m,k*hn + l + hn] = (-ty*g1[m,l] - im*ay*g3[m,l] )/2 + dy/2.0*g4[m,l]
Ham[k*hn + m,k*hn + l - hn] = -ty*g1[m,l]/2 + im*ay*g3[m,l]/2 + dy/2.0*g4[m,l]
end
end
end
end
return Ham
end
# ===================================================
function Pauli()
hn::Int64 = 8
g1 = zeros(ComplexF64,hn,hn)
g2 = zeros(ComplexF64,hn,hn)
g3 = zeros(ComplexF64,hn,hn)
g4 = zeros(ComplexF64,hn,hn)
g5 = zeros(ComplexF64,hn,hn)
g6 = zeros(ComplexF64,hn,hn)
#---------Kinetic energy
g1[1,1] = 1
g1[2,2] = -1
g1[3,3] = 1
g1[4,4] = -1
g1[5,5] = -1
g1[6,6] = 1
g1[7,7] = -1
g1[8,8] = 1
#----------SOC-x
g2[1,2] = 1
g2[2,1] = 1
g2[3,4] = -1
g2[4,3] = -1
g2[5,6] = 1
g2[6,5] = 1
g2[7,8] = -1
g2[8,7] = -1
#---------SOC-y
g3[1,2] = -im
g3[2,1] = im
g3[3,4] = -im
g3[4,3] = im
g3[5,6] = im
g3[6,5] = -im
g3[7,8] = im
g3[8,7] = -im
#-------------------SC pairing
g4[1,7] = -1
g4[2,8] = -1
g4[3,5] = 1
g4[4,6] = 1
g4[7,1] = -1
g4[8,2] = -1
g4[5,3] = 1
g4[6,4] = 1
#-------------------- layer couple
g5[1,3] = 1
g5[2,4] = 1
g5[3,1] = 1
g5[4,2] = 1
g5[5,7] = -1
g5[6,8] = -1
g5[7,5] = -1
g5[8,6] = -1
#--------------------
g6[1,2] = 1
g6[2,1] = 1
g6[3,4] = 1
g6[4,3] = 1
g6[5,6] = -1
g6[6,5] = -1
g6[7,8] = -1
g6[8,7] = -1
return g1,g2,g3,g4,g5,g6
end
# ==================================================
function Wannier_spectrum()
# 开边界方向Wannier谱的计算
h0n::Int64 = 10
yn::Int64 = 10 # 开边界方向原胞数
hn::Int64 = 8
N::Int64 = Int(yn*hn/2) # 占据态数目
vals = zeros(Float64,h0n + 1,N)
hvals = []
f2 = open("process.dat","w")
for i1 = 0:h0n
writedlm(f2,i1/h0n)
vals[i1 + 1,:] = Wilson(i1/h0n,yn)
append!(hvals,i1/h0n)
end
f1 = open("test2.dat","w")
writedlm(f1,[hvals vals])
close(f1)
close(f2)
return hvals,vals
end
# ==================================================
function rho(yn::Int64,h0::Float64,dir::Int64)
# 计算所有格点上的极化分布
# yn 开边界方向原胞数. h0 层间耦合强度
hn::Int64 = 8
N::Int64 = yn*hn
Nocc::Int64 = Int(N/2)
kn::Int64 = 50
re1 = zeros(Float64,yn)
ham_wan = Wannier(h0,yn,dir) # 得到Wannier哈密顿量
val2,vec2 = eigen(ham_wan)
val2 = map(real,val2)/(2*pi)
for ik = -kn:kn
kx = ik*pi/kn
if dir == 0
println("openx")
ham = openx(h0,yn,kx)
else
println("openy")
ham = openy(h0,yn,kx)
end
val1,vec1 = eigen(ham)
for j1 = 1:Nocc # Wannier哈密顿量要对所有本征矢量求和
for n1 = 1:Nocc # 哈密顿量要对所有占据态求和
for ibeta = 1:hn # 对一个格点上的本征矢量所有分量求和
for iy = 1:yn # 计算每个格点上的边界极化
re1[iy] = re1[iy] + abs(vec1[(iy - 1)*hn + ibeta,n1]*vec2[n1,j1])^2*val2[j1]
end
end
end
end
end
return re1/(2*kn + 1)
end
# =================================================
function edge_pro()
# 边界极化
yn::Int64 = 40 # 开边界方向原胞数
h0n::Int64 = 50
rho_all = zeros(Float64,h0n,yn)
h0list = []
re1::Float64 = 0.0
for ih = 1:h0n
rho_all[ih,:] = rho(yn,ih/h0n,0) # 计算出每个格点上的极化强度
append!(h0list,ih/h0n)
end

f1 = open("m1-pro-all-ox.dat","w")
writedlm(f1,[h0list rho_all])
close(f1)

f2 = open("m1-pro-ox.dat","w")
for ih = 1:h0n
re1 = 0
for iy = 1:Int(yn/2)
re1 += rho_all[ih,iy] # 计算边界上的极化强度大小,对一半边界格点求和
end
re1 = map(x->Int(round(x*2))/2,re1)
writedlm(f2,[h0list[ih] re1])
end
close(f2)
#--------------------------------------------------
h0list = []
for ih = 1:h0n
rho_all[ih,:] = rho(yn,ih/h0n,2) # 计算出每个格点上的极化强度
append!(h0list,ih/h0n)
end

f1 = open("m1-pro-all-oy.dat","w")
writedlm(f1,[h0list rho_all])
close(f1)

f2 = open("m1-pro-oy.dat","w")
for ih = 1:h0n
re1 = 0
for iy = 1:Int(yn/2)
re1 += rho_all[ih,iy] # 计算边界上的极化强度大小,对一半边界格点求和
end
re1 = map(x->Int(round(x*2))/2,re1)
writedlm(f2,[h0list[ih] re1])
end
close(f2)
end
# ====================================================
function main1()
# 计算不同格点位置处的rho
yn::Int64 = 40 # 开边界方向原胞数
h0::Float64 = 0.6 # 层间耦合大小
re1::Float64 = 0
iylist = []
relist = []
for iy = 1:yn
re1 = rho(yn,h0,iy)
append!(iylist,iy)
append!(relist,re1)
end
f1 = open("edge_rho.dat","w")
writedlm(f1,[iylist relist/max(relist)]) # 对结果进行缩放
close(f1)
end
# ====================================================
@timed edge_pro()

并行版本

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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
# using LinearAlgebra,PyPlot,DelimitedFiles
# s_x\sigma_0\tau_z
using DelimitedFiles
using ProgressMeter
@everywhere using SharedArrays, LinearAlgebra,Distributed,DelimitedFiles
# ==================================================
@everywhere function Wannier(h0::Float64,yn::Int64,dir::Int64)
hn::Int64 = 8
# yn::Int64 = 50
N::Int64 = yn*hn
nx::Int64 = 200 # 在离散方向上的撒点数目
Kx = range(0,2,length = nx)
ham = zeros(ComplexF64,N,N)
Noccu::Int64 = Int(N/2) # 占据态数目为哈密顿量矩阵维度一半
Wave = zeros(ComplexF64,N,N,nx) # 存储每个离散点上的本征矢量(波函数)
Wan = zeros(ComplexF64,Noccu,Noccu)# 存储Wannier占据态波函数,占据态数目是哈密顿量矩阵的一半
ang = zeros(Float64,Noccu) # 对每个离散的点,都会对应一组占据态的Wannier本征值
F = zeros(ComplexF64,Noccu,Noccu)
for ix in 1:nx # 对离散的ki进行Wilson loop构建
kx = Kx[ix]*pi
if dir == 0
ham = openx(h0,yn,kx)
else
ham = openy(h0,yn,kx)
end
val,vec = eigen(ham)
Wave[:,:,ix] = vec[:,:] # 首先存储所有点上的本征矢量
end
Wave[:,:,nx] = Wave[:,:,1] # 首尾相连

for i1 in 1:Noccu
F[i1,i1] = 1
end

for i1 in 1:nx-1
for i2 in 1:Noccu
for i3 in 1:Noccu
Wan[i2,i3] = Wave[:,i2,i1]'*Wave[:,i3,i1 + 1] # 计算波函数交叠
end
end
F = F*Wan
end
F = -im*log(F)
return F # 得到Wannier哈密顿量
end
# =================================================
@everywhere function openx(h0::Float64,yn::Int64,ky::Float64)
hn::Int64 = 8
# yn::Int64 = 50
N::Int64 = yn*hn
m0::Float64 = -1.
tx::Float64 = 2.0
ty::Float64 = 2.0
ax::Float64 = 2.0
ay::Float64 = 2.0
h4::Float64 = 2.0
#-----------------
dx::Float64 = 0.
dy::Float64 = -dx
d0::Float64 = 0.4
#h0::Float64 = 0.6 # 层间耦合
tp::Float64 = -0. # inversion breaking
Ham = zeros(ComplexF64,N,N)
g1 = zeros(ComplexF64,hn,hn)
g2 = zeros(ComplexF64,hn,hn)
g3 = zeros(ComplexF64,hn,hn)
g4 = zeros(ComplexF64,hn,hn)
g5 = zeros(ComplexF64,hn,hn)
g6 = zeros(ComplexF64,hn,hn)
g1,g2,g3,g4,g5,g6 = Pauli()
for k = 0:yn-1
if (k == 0) # Only right block in first line
for m = 1:hn
for l = 1:hn
Ham[m,l] = (m0-ty*cos(ky))*g1[m,l] + ay*sin(ky)*g3[m,l] + (d0 + dy*cos(ky))*g4[m,l] + h0*g5[m,l] + tp*g6[m,l]

Ham[m,l + hn] = (-tx*g1[m,l] - im*ax*g2[m,l])/2.0+ dx/2.0*g4[m,l] - h4*cos(ky)*g1[m,l]
end
end
elseif ( k==yn-1 ) # Only left block in last line
for m = 1:hn
for l = 1:hn
Ham[k*hn + m,k*hn + l] = (m0-ty*cos(ky))*g1[m,l] + ay*sin(ky)*g3[m,l] + (d0 + dy*cos(ky))*g4[m,l]+ h0*g5[m,l] + tp*g6[m,l]

Ham[k*hn + m,k*hn + l - hn] = -tx*g1[m,l]/2 + im*ax*g2[m,l]/2 + dx/2.0*g4[m,l] - h4*cos(ky)*g1[m,l]
end
end
else
for m = 1:hn
for l = 1:hn # k start from 1,matrix block from 2th row
Ham[k*hn + m,k*hn + l] = (m0 - ty*cos(ky))*g1[m,l] + ay*sin(ky)*g3[m,l] + (d0 + dy*cos(ky))*g4[m,l]+ h0*g5[m,l] + tp*g6[m,l]

Ham[k*hn + m,k*hn + l + hn] = (-tx*g1[m,l] - im*ax*g2[m,l])/2 + dx/2.0*g4[m,l] - h4*cos(ky)*g1[m,l]
Ham[k*hn + m,k*hn + l - hn] = -tx*g1[m,l]/2 + im*ax*g2[m,l]/2 + dx/2.0*g4[m,l] - h4*cos(ky)*g1[m,l]
end
end
end
end
return Ham
end
# ==========================================================
@everywhere function openy(h0::Float64,yn::Int64,kx::Float64)
hn::Int64 = 8
# yn::Int64 = 50
N::Int64 = yn*hn
m0::Float64 = -1.
tx::Float64 = 2.0
ty::Float64 = 2.0
ax::Float64 = 2.0
ay::Float64 = 2.0
h4::Float64 = 2.0
#-----------------
dx::Float64 = 0.
dy::Float64 = -dx
d0::Float64 = 0.4
# h0::Float64 = 0.2 # 层间耦合
tp::Float64 = -0. # inversion breaking
Ham = zeros(ComplexF64,N,N)
g1 = zeros(ComplexF64,hn,hn)
g2 = zeros(ComplexF64,hn,hn)
g3 = zeros(ComplexF64,hn,hn)
g4 = zeros(ComplexF64,hn,hn)
g5 = zeros(ComplexF64,hn,hn)
g6 = zeros(ComplexF64,hn,hn)
g1,g2,g3,g4,g5,g6 = Pauli()
for k = 0:yn-1
if (k == 0) # Only right block in first line
for m = 1:hn
for l = 1:hn
Ham[m,l] = (m0-tx*cos(kx))*g1[m,l] + ax*sin(kx)*g2[m,l] + (d0 + dx*cos(kx))*g4[m,l]+ h0*g5[m,l] + tp*g6[m,l]

Ham[m,l + hn] = (-ty*g1[m,l] - im*ay*g3[m,l])/2 + dy/2.0*g4[m,l] - h4*cos(kx)*g1[m,l]
end
end
elseif ( k==yn-1 ) # Only left block in last line
for m = 1:hn
for l = 1:hn
Ham[k*hn + m,k*hn + l] = (m0-tx*cos(kx))*g1[m,l] + ax*sin(kx)*g2[m,l] + (d0 + dx*cos(kx))*g4[m,l]+ h0*g5[m,l] + tp*g6[m,l]

Ham[k*hn + m,k*hn + l - hn] = -ty*g1[m,l]/2 + im*ay*g3[m,l]/2 + dy/2.0*g4[m,l] - h4*cos(kx)*g1[m,l]
end
end
else
for m = 1:hn
for l = 1:hn # k start from 1,matrix block from 2th row
Ham[k*hn + m,k*hn + l] = (m0-tx*cos(kx))*g1[m,l] + ax*sin(kx)*g2[m,l] + (d0 + dx*cos(kx))*g4[m,l]+ h0*g5[m,l] + tp*g6[m,l]

Ham[k*hn + m,k*hn + l + hn] = (-ty*g1[m,l] - im*ay*g3[m,l] )/2 + dy/2.0*g4[m,l] - h4*cos(kx)*g1[m,l]
Ham[k*hn + m,k*hn + l - hn] = -ty*g1[m,l]/2 + im*ay*g3[m,l]/2 + dy/2.0*g4[m,l] - h4*cos(kx)*g1[m,l]
end
end
end
end
return Ham
end
# ===================================================
@everywhere function Pauli()
hn::Int64 = 8
g1 = zeros(ComplexF64,hn,hn)
g2 = zeros(ComplexF64,hn,hn)
g3 = zeros(ComplexF64,hn,hn)
g4 = zeros(ComplexF64,hn,hn)
g5 = zeros(ComplexF64,hn,hn)
g6 = zeros(ComplexF64,hn,hn)
#---------Kinetic energy
g1[1,1] = 1
g1[2,2] = -1
g1[3,3] = 1
g1[4,4] = -1
g1[5,5] = -1
g1[6,6] = 1
g1[7,7] = -1
g1[8,8] = 1
#----------SOC-x
g2[1,2] = 1
g2[2,1] = 1
g2[3,4] = -1
g2[4,3] = -1
g2[5,6] = 1
g2[6,5] = 1
g2[7,8] = -1
g2[8,7] = -1
#---------SOC-y
g3[1,2] = -im
g3[2,1] = im
g3[3,4] = -im
g3[4,3] = im
g3[5,6] = im
g3[6,5] = -im
g3[7,8] = im
g3[8,7] = -im
#-------------------SC pairing
g4[1,7] = -1
g4[2,8] = -1
g4[3,5] = 1
g4[4,6] = 1
g4[7,1] = -1
g4[8,2] = -1
g4[5,3] = 1
g4[6,4] = 1
#-------------------- layer couple
g5[1,3] = 1
g5[2,4] = 1
g5[3,1] = 1
g5[4,2] = 1
g5[5,7] = -1
g5[6,8] = -1
g5[7,5] = -1
g5[8,6] = -1
#--------------------
g6[1,2] = 1
g6[2,1] = 1
g6[3,4] = 1
g6[4,3] = 1
g6[5,6] = -1
g6[6,5] = -1
g6[7,8] = -1
g6[8,7] = -1
return g1,g2,g3,g4,g5,g6
end
# ==================================================
@everywhere function Wannier_spectrum()
# 开边界方向Wannier谱的计算
h0n::Int64 = 10
yn::Int64 = 10 # 开边界方向原胞数
hn::Int64 = 8
N::Int64 = Int(yn*hn/2) # 占据态数目
vals = zeros(Float64,h0n + 1,N)
hvals = []
f2 = open("process.dat","w")
for i1 = 0:h0n
writedlm(f2,i1/h0n)
vals[i1 + 1,:] = Wilson(i1/h0n,yn)
append!(hvals,i1/h0n)
end
f1 = open("test2.dat","w")
writedlm(f1,[hvals vals])
close(f1)
close(f2)
return hvals,vals
end
# ==================================================
@everywhere function rho(yn::Int64,h0::Float64,dir::Int64)
# 计算所有格点上的极化分布
# yn 开边界方向原胞数. h0 层间耦合强度
hn::Int64 = 8
N::Int64 = yn*hn
Nocc::Int64 = Int(N/2)
kn::Int64 = 50
re1 = zeros(Float64,yn)
# re1 = SharedArray(zeros(Float64,yn))
ham_wan = Wannier(h0,yn,dir) # 得到Wannier哈密顿量
val2,vec2 = eigen(ham_wan)
val2 = map(real,val2)/(2*pi)
for ik = -kn:kn
kx = ik*pi/kn
if dir == 0
ham = openx(h0,yn,kx)
else
ham = openy(h0,yn,kx)
end
val1,vec1 = eigen(ham)
for j1 = 1:Nocc # Wannier哈密顿量要对所有本征矢量求和
for n1 = 1:Nocc # 哈密顿量要对所有占据态求和
for ibeta = 1:hn # 对一个格点上的本征矢量所有分量求和
for iy = 1:yn # 计算每个格点上的边界极化
re1[iy] = re1[iy] + abs(vec1[(iy - 1)*hn + ibeta,n1]*vec2[n1,j1])^2*val2[j1]
end
end
end
end
end
return re1/(2*kn + 1)
end
# =================================================
@everywhere function edge_pro()
# 边界极化
yn::Int64 = 40 # 开边界方向原胞数
h0n::Int64 = 50
# rho_all = zeros(Float64,h0n,yn)
rho_all = SharedArray(zeros(Float64,h0n,yn))
h0list = SharedArray(zeros(Float64,h0n,1))
re1::Float64 = 0.0
@sync @distributed for ih = 1:h0n
rho_all[ih,:] = rho(yn,ih/h0n,0) # 计算出每个格点上的极化强度
h0list[ih,1] = ih/h0n
#append!(h0list,ih/h0n)
end

f1 = open("m1-pro-all-ox.dat","w")
writedlm(f1,[h0list rho_all])
close(f1)

f2 = open("m1-pro-ox.dat","w")
for ih = 1:h0n
re1 = 0
for iy = 1:Int(yn/2)
re1 += rho_all[ih,iy] # 计算边界上的极化强度大小,对一半边界格点求和
end
re1 = map(x->Int(round(x*2))/2,re1)
writedlm(f2,[h0list[ih] re1])
end
close(f2)
#--------------------------------------------------
h0list = SharedArray(zeros(Float64,h0n,1))
@sync @distributed for ih = 1:h0n
rho_all[ih,:] = rho(yn,ih/h0n,2) # 计算出每个格点上的极化强度
h0list[ih,1] = ih/h0n
#append!(h0list,ih/h0n)
end

f1 = open("m1-pro-all-oy.dat","w")
writedlm(f1,[h0list rho_all])
close(f1)

f2 = open("m1-pro-oy.dat","w")
for ih = 1:h0n
re1 = 0
for iy = 1:Int(yn/2)
re1 += rho_all[ih,iy] # 计算边界上的极化强度大小,对一半边界格点求和
end
re1 = map(x->Int(round(x*2))/2,re1)
writedlm(f2,[h0list[ih] re1])
end
close(f2)
end
# ====================================================
@everywhere function main1()
# 计算不同格点位置处的rho
yn::Int64 = 40 # 开边界方向原胞数
h0::Float64 = 0.6 # 层间耦合大小
re1::Float64 = 0
iylist = []
relist = []
for iy = 1:yn
re1 = rho(yn,h0,iy)
append!(iylist,iy)
append!(relist,re1)
end
f1 = open("edge_rho.dat","w")
writedlm(f1,[iylist relist/max(relist)]) # 对结果进行缩放
close(f1)
end
# ====================================================
@time edge_pro()

鉴于该网站分享的大都是学习笔记,作者水平有限,若发现有问题可以发邮件给我

  • yxliphy@gmail.com

也非常欢迎喜欢分享的小伙伴投稿