MC-03 磁化强度
本教程研究两种几何构型上 海森堡模型的磁化曲线 :一维链和两腿梯子。
由于 looper 量子蒙特卡洛程序在磁场中表现不佳,我们改用有向圈随机级数展开程序 dirloop_sse。
这两种几何构型给出定性上不同的磁化曲线。 海森堡链是无能隙的:只要一加上磁场,它的磁化强度就从 平滑上升。 两腿梯子具有自旋能隙 :当 时磁化强度严格为零,只有到达某个有限的临界场之后才开始上升,从而在 处形成一个明显的平台。
一维海森堡链
我们模拟 20 个格点的 反铁磁海森堡链,温度为 ,磁场取遍 。 温度足够低,因此结果接近基态的磁化曲线。
在命令行下设置并运行
参数文件 parm3a:
LATTICE="chain lattice"
MODEL="spin"
local_S=1/2
L=20
J=1
T=0.08
THERMALIZATION=2000
SWEEPS=10000
{h=0;}
{h=0.1;}
{h=0.2;}
{h=0.3;}
{h=0.4;}
{h=0.5;}
{h=0.6;}
{h=0.7;}
{h=0.8;}
{h=0.9;}
{h=1.0;}
{h=1.2;}
{h=1.4;}
{h=1.6;}
{h=1.8;}
{h=2.0;}
{h=2.2;}
{h=2.4;}
{h=2.5;}使用随机级数展开程序转换并运行:
parameter2xml parm3a
dirloop_sse --Tmin 10 --write-xml parm3a.in.xml在 Python 中设置并运行
脚本 tutorial3a.py:
import pyalps
import matplotlib.pyplot as plt
import pyalps.plot
parms = []
for h in [0., 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.5]:
parms.append(
{
'LATTICE' : "chain lattice",
'MODEL' : "spin",
'local_S' : 0.5,
'T' : 0.08,
'J' : 1,
'THERMALIZATION' : 1000,
'SWEEPS' : 20000,
'L' : 20,
'h' : h
}
)
input_file = pyalps.writeInputFiles('parm3a', parms)
pyalps.runApplication('dirloop_sse', input_file, Tmin=5)计算与作图
载入磁化强度密度,并把它作为磁场的函数画出来:
data = pyalps.loadMeasurements(pyalps.getResultFiles(prefix='parm3a'), 'Magnetization Density')
magnetization = pyalps.collectXY(data, x='h', y='Magnetization Density')
plt.figure()
pyalps.plot.plot(magnetization)
plt.xlabel('Field $h/J$')
plt.ylabel('Magnetization $m$')
plt.ylim(0.0, 0.55)
plt.title('Quantum Heisenberg chain')
plt.show()磁化强度从零开始连续上升,并在饱和场 处达到饱和值 。
一维海森堡梯子
两腿梯子增加了连接两条链的横档耦合 。 我们使用 20 个横档(共 40 个格点),并把磁场范围延伸到 以便达到饱和。
在命令行下设置并运行
参数文件 parm3b 与 parm3a 结构相同,改动如下:
LATTICE="ladder"
MODEL="spin"
local_S=1/2
L=20
J0=1
J1=1
T=0.08
THERMALIZATION=2000
SWEEPS=10000
{h=0;}
{h=0.2;}
{h=0.4;}
{h=0.6;}
{h=0.8;}
{h=1.0;}
{h=1.2;}
{h=1.4;}
{h=1.6;}
{h=1.8;}
{h=2.0;}
{h=2.2;}
{h=2.4;}
{h=2.6;}
{h=2.8;}
{h=3.0;}
{h=3.2;}
{h=3.4;}
{h=3.5;}parameter2xml parm3b
dirloop_sse --Tmin 10 --write-xml parm3b.in.xml在 Python 中设置并运行
脚本 tutorial3b.py 是对 tutorial3a.py 的改写:把前缀改为 parm3b,把 LATTICE 改为 "ladder",把 J 换成 J0=J1=1,并把磁场扫描范围延伸到 3.5。
计算与作图
data = pyalps.loadMeasurements(pyalps.getResultFiles(prefix='parm3b'), 'Magnetization Density')
magnetization = pyalps.collectXY(data, x='h', y='Magnetization Density')
plt.figure()
pyalps.plot.plot(magnetization)
plt.xlabel('Field $h/J$')
plt.ylabel('Magnetization $m$')
plt.ylim(0.0, 0.55)
plt.title('Quantum Heisenberg ladder')
plt.show()与链不同,梯子的磁化强度在达到某个有限的下临界场 之前始终为零,这正反映了自旋能隙的存在;此后磁化强度上升,直到在 处达到饱和。
汇总两次模拟
在同一个目录下运行完两次模拟之后,脚本 tutorial3full.py 会把两条磁化曲线叠加在同一张图上:
import pyalps
import matplotlib.pyplot as plt
import pyalps.plot
data = pyalps.loadMeasurements(pyalps.getResultFiles(), 'Magnetization Density')
magnetization = pyalps.collectXY(data, x='h', y='Magnetization Density', foreach=['LATTICE'])
for m in magnetization:
if m.props['LATTICE'] == 'chain lattice':
m.props['label'] = 'chain'
elif m.props['LATTICE'] == 'ladder':
m.props['label'] = 'ladder'
plt.figure()
pyalps.plot.plot(magnetization)
plt.xlabel('Field $h/J$')
plt.ylabel('Magnetization $m$')
plt.ylim(0.0, 0.55)
plt.legend()
plt.title('Quantum Heisenberg models')
plt.show()把两者画在一起,无能隙的链与有能隙的梯子之间的对比便一目了然。

思考题
- 链的磁化强度从哪个磁场开始上升?这告诉你关于链的自旋能隙的什么信息?
- 根据你的数据估计梯子的下临界场 。它与已知的自旋能隙 相比如何?
- 两个模型都在 处饱和。各自在什么磁场下达到饱和?为什么饱和场不同?
- 在更高的温度下重复模拟,例如 。热涨落如何影响磁化曲线中各种特征的尖锐程度?
- (附加)通过添加表示宽度的
W参数试试三腿或四腿梯子,或者改变local_S来研究自旋-1 或自旋-3/2 的链。临界场是否呈现出系统性的规律?