from pythtb import *
import numpy as np
import matplotlib.pyplot as plt
# 定义晶格和轨道
lat = [[1.0, 0.0], [0.0, 1.0]]
orb = [[0.0, 0.0], [0.5, 0.0], [0.0, 0.5]]
# 增加参数分辨率
t2_values = np.linspace(0.1, 1.0, 300) # t2 的范围
phi_values = np.linspace(0, 2 * np.pi, 300) # phi 的范围
gap_values = np.zeros((len(t2_values), len(phi_values))) # 用于存储能隙大小
# 遍历每个参数值
for i, t2 in enumerate(t2_values):
for j, phi in enumerate(phi_values):
# 创建模型
my_model = tb_model(2, 2, lat, orb)
# 定义跃迁矩阵元
t1 = 1.0
t2_complex = t2 * np.exp(1.j * phi)
t3 = 0.2
# 设置跃迁
my_model.set_hop(t1, 0, 1, [0, 0])
my_model.set_hop(t1, 0, 2, [0, 0])
my_model.set_hop(t1, 0, 1, [-1, 0])
my_model.set_hop(t1, 0, 2, [0, -1])
my_model.set_hop(t2_complex, 1, 2, [0, 0])
my_model.set_hop(t2_complex, 2, 1, [-1, 0])
my_model.set_hop(t2_complex, 1, 2, [1, -1])
my_model.set_hop(t2_complex, 2, 1, [0, 1])
my_model.set_hop(t3, 0, 0, [1, 0])
my_model.set_hop(t3, 0, 0, [0, 1])
my_model.set_hop(t3, 1, 1, [1, 0])
my_model.set_hop(t3, 1, 1, [0, 1])
my_model.set_hop(t3, 2, 2, [1, 0])
my_model.set_hop(t3, 2, 2, [0, 1])
# 定义动量路径
path = [[0.0, 0.0], [0.5, 0.0], [0.5, 0.5], [0.0, 0.0]]
nk = 201 # 增加k点数量
(k_vec, k_dist, k_node) = my_model.k_path(path, nk)
# 计算能带
evals = my_model.solve_all(k_vec)
# 计算能隙
gap = np.min(evals[1] - evals[0])
gap_values[i, j] = gap
# 创建网格
T2, PHI = np.meshgrid(t2_values, phi_values)
# 绘制相图
fig, ax = plt.subplots(figsize=(8, 6))
c = ax.pcolormesh(T2, PHI/np.pi, gap_values.T, cmap='viridis', shading='auto')
fig.colorbar(c, ax=ax, label='Gap Size')
# 添加等高线(能隙为0)
contour = ax.contour(T2, PHI/np.pi, gap_values.T,
levels=[0], colors='red', linewidths=2)
ax.clabel(contour, inline=True, fontsize=10, fmt="Gap=0")
# 其余设置
ax.set_xlabel('$ t_2$', fontsize=12)
ax.set_ylabel('$\phi / \pi$', fontsize=12)
ax.set_title('Phase Diagram with Gap Contour', fontsize=14)
ax.set_ylim(0, 2)
# 添加陈数标注
ax.text(0.8, 1.45, 'C=-1', color='red', va='center')
ax.text(0.8, 0.6, 'C=1', color='red', va='center')
ax.text(0.85, 0.1, 'C=1', color='red', va='center')
ax.text(0.85, 1.8, 'C=-1', color='red', va='center')
plt.tight_layout()
plt.show()
等高线变成白色