MC-05 玻色子
玻色-哈伯德模型描述晶格上相互作用的玻色子:
其中 是跃迁振幅, 是在位排斥, 是化学势。 在整数填充且 很大时,系统是莫特绝缘体:玻色子被相互作用局域化,超流密度 。 随着 增大,量子涨落最终会驱动系统转变为 的超流相。 本教程使用 ALPS 的蠕虫量子蒙特卡洛程序,在二维正方格子上、填充数 (由 设定)的条件下确定这一量子相变。
跨越相变的超流密度
我们首先在 格子上扫描一个较大的跃迁参数范围,观察超流密度 (在 ALPS 中称为 “Stiffness”)如何随相变演化。
希尔伯特空间在每个格点上截断到 Nmax=2 个玻色子,这在单位填充的莫特叶附近是一个很好的近似。
命令行
参数文件 parm5a:
LATTICE="square lattice"
L=4
MODEL="boson Hubbard"
NONLOCAL=0
U=1.0
mu=0.5
Nmax=2
T=0.1
SWEEPS=500000
THERMALIZATION=10000
{t=0.01;}
{t=0.02;}
{t=0.03;}
{t=0.04;}
{t=0.05;}
{t=0.06;}
{t=0.07;}
{t=0.08;}
{t=0.09;}
{t=0.1;}NONLOCAL=0 关闭非局域测量,使输出保持简洁。
parameter2xml parm5a
worm --Tmin 10 --write-xml parm5a.in.xml--Tmin 10 把检查点间隔设为 10 秒;--write-xml 会写出 XML 输出文件,pyalps 可以把它与 HDF5 结果一起读取。
Python
脚本 tutorial5a.py:
import pyalps
import matplotlib.pyplot as plt
import pyalps.plot
parms = []
for t in [0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1]:
parms.append(
{
'LATTICE' : "square lattice",
'L' : 4,
'MODEL' : "boson Hubbard",
'NONLOCAL' : 0,
'U' : 1.0,
'mu' : 0.5,
'Nmax' : 2,
'T' : 0.1,
'SWEEPS' : 500000,
'THERMALIZATION' : 10000,
't' : t
}
)
input_file = pyalps.writeInputFiles('parm5a', parms)
pyalps.runApplication('worm', input_file, Tmin=10)计算与作图
载入超流刚度,并把它作为跃迁参数的函数画出来:
data = pyalps.loadMeasurements(pyalps.getResultFiles(prefix='parm5a'), 'Stiffness')
rhos = pyalps.collectXY(data, x='t', y='Stiffness')
plt.figure()
pyalps.plot.plot(rhos)
plt.xlabel('Hopping $t/U$')
plt.ylabel('Superfluid density $\\rho_s$')
plt.title('Bose-Hubbard model on a $4\\times 4$ lattice')
plt.show()在小 下 应当很小(与零一致),而在大 下增长到有限值,并在临界跃迁值 附近出现渡越。
定位临界点
为了更精确地确定 ,我们利用有限尺寸标度。 在量子临界点处,,其中 是维数, 是该普适类(三维 XY)的动力学指数。 对于 、,这给出 ,因此组合量 在临界点处是无量纲的,不同 的曲线会在 处相交。
我们在预期临界点附近的细密跃迁参数网格上,模拟三种系统尺寸 。
命令行
参数文件 parm5b:
LATTICE="square lattice"
MODEL="boson Hubbard"
NONLOCAL=0
U=1.0
mu=0.5
Nmax=2
T=0.05
SWEEPS=600000
THERMALIZATION=150000
{L=4; t=0.045;}
{L=4; t=0.05;}
{L=4; t=0.0525;}
{L=4; t=0.055;}
{L=4; t=0.0575;}
{L=4; t=0.06;}
{L=4; t=0.065;}
{L=6; t=0.045;}
{L=6; t=0.05;}
{L=6; t=0.0525;}
{L=6; t=0.055;}
{L=6; t=0.0575;}
{L=6; t=0.06;}
{L=6; t=0.065;}
{L=8; t=0.045;}
{L=8; t=0.05;}
{L=8; t=0.0525;}
{L=8; t=0.055;}
{L=8; t=0.0575;}
{L=8; t=0.06;}
{L=8; t=0.065;}与 parm5a 相比,这里需要更低的温度()和更长的运行时间,才能清晰地分辨出交点。
parameter2xml parm5b
worm --Tmin 10 --write-xml parm5b.in.xmlPython
脚本 tutorial5b.py:
import pyalps
import matplotlib.pyplot as plt
import pyalps.plot
parms = []
for L in [4, 6, 8]:
for t in [0.045, 0.05, 0.0525, 0.055, 0.0575, 0.06, 0.065]:
parms.append(
{
'LATTICE' : "square lattice",
'L' : L,
'MODEL' : "boson Hubbard",
'NONLOCAL' : 0,
'U' : 1.0,
'mu' : 0.5,
'Nmax' : 2,
'T' : 0.05,
'SWEEPS' : 600000,
'THERMALIZATION' : 150000,
't' : t
}
)
input_file = pyalps.writeInputFiles('parm5b', parms)
pyalps.runApplication('worm', input_file, Tmin=10)计算与作图
载入每个系统尺寸的刚度,乘以 之后作图:
data = pyalps.loadMeasurements(pyalps.getResultFiles(prefix='parm5b'), 'Stiffness')
rhos = pyalps.collectXY(data, x='t', y='Stiffness', foreach=['L'])
for s in rhos:
s.y = s.y * float(s.props['L'])
plt.figure()
pyalps.plot.plot(rhos)
plt.xlabel('Hopping $t/U$')
plt.ylabel('$\\rho_s L$')
plt.legend()
plt.title('Finite-size scaling: Bose-Hubbard model')
plt.show()的曲线应当在 附近相交。 二维玻色-哈伯德模型在单位填充下的精确结果是
思考题
- 在粗扫描中, 从哪个跃迁值开始明显不为零?这与 图中的交点一致吗?
- 曲线在哪里相交?你的估计值与精确值 相比如何?
- 有限温度的模拟会系统性地高估 。这是为什么?如果把 进一步降低,交点会如何变化?
- 试着把
Nmax增大到 3。结果变化有多大?在什么样的填充或相互作用强度下,Nmax=2会变成一个很差的近似? - (附加)用更大的系统尺寸重复有限尺寸标度分析。交点的质量会如何改善?