DMRG-07 模拟
在本教程中,我们将 DMRG-07 简介 中建立的理论工具付诸实践,使用 ALPS dmrg 应用程序计算一维无自旋费米子链的基态能量,工作流程与自旋链的 DMRG-03 相同。
感兴趣的物理现象
具有最近邻排斥作用的无自旋费米子链——即 – 模型——是最简单的相互作用费米子模型。尽管如此,它包含了一维金属的基本物理:弱耦合时它是 Luttinger 液体,一种没有准粒子的临界金属态;而在强排斥下(半满填充时 )它会发生相变,进入有能隙的电荷有序绝缘体。通过简介中推导的 Jordan–Wigner 变换,它恰好是 XXZ 自旋链的另一副面孔,因此这里得到的每一个结果都可以与自旋链教程相互印证。与 DMRG-03 一样,我们从最基本的可观测量——基态能量 ——入手,在相图上两个存在精确参考值的点上进行计算:自由费米子点 ,以及映射到 DMRG-03 各向同性海森堡链的相互作用强度 。
模型
我们研究含 个格点的开链上的 – 哈密顿量,
其中 为跳跃振幅, 为最近邻排斥强度, 为(可依赖于格点的)化学势。该模型是可积的:通过 Jordan–Wigner 变换,它等价于由 Yang 和 Yang 精确求解的 XXZ 链,其临界相是 Luttinger 液体的标准格点实现。
将简介中的对照表逐键应用于开链,可得
其中 是格点 的配位数(体内 ,两个端点处 )。因此,XXZ 链等于具有依赖于格点的化学势 的 – 模型,两者相差常数 ——这一记账细节将在下文用来与 DMRG-03 进行基准比较。
在玻色子基下运行费米子
hardcore boson 与 spinless fermions 具有完全相同的参数(t、V、mu#)和相同的守恒量子数 N。我们使用 MODEL="hardcore boson" 运行模拟:经典的 dmrg 应用程序不能可靠地处理 MODEL="spinless fermions" 的费米子符号记账(扫描无法变分收敛),而 Jordan–Wigner 等价性保证了在玻色子基下工作不会损失任何一般性。诸如 sparsediag 之类的精确对角化应用程序可以直接处理 MODEL="spinless fermions",可用于在小链上验证这一等价性(见文末的思考题)。方法选择
在半满填充时,相关的希尔伯特空间扇区的维数为
远远超出完全对角化或稀疏对角化的能力范围。DMRG 是计算一维基态的首选方法:下面的每次运行(32 个格点的链,最多保留 个态,4 次扫描)在笔记本电脑上不到一分钟即可完成,同时将 收敛到十位或更多有效数字。
自由费米子()
在 时,模型是一个自由费米子能带 。对于开链,单粒子本征态是驻波,能量为
因此在填充数 下的精确基态能量就是 个最低 之和。对于 、(半满填充):
这给了我们一份难得的奢侈:一个带有精确有限尺寸参考值的相互作用代码基准。
参数
| 参数 | 含义 | 值 |
|---|---|---|
LATTICE | 内置开链,无需格点文件(见 ALPS 格点库) | open chain lattice |
MODEL | 硬核玻色子 – 模型,无自旋费米子链的 Jordan–Wigner 等价形式 | hardcore boson |
CONSERVED_QUANTUMNUMBERS | 固定的量子数,用于对 进行块对角化 | N |
N_total | 目标粒子数扇区(半满填充) | 16 |
t | 最近邻跳跃振幅 | 1 |
V | 最近邻排斥强度 | 0 |
L | 链长 | 32 |
SWEEPS | DMRG 有限系统扫描次数 | 4 |
NUMBER_EIGENVALUES | 请求的本征态数目 | 1 |
MAXSTATES | 截断后保留的键维数 | 100(单次运行);20、40、60(多次运行) |
注意与自旋教程的一个结构性差异:守恒量子数只有粒子数 N,而且扇区用 N_total 而非 Sz_total 选择——这是简介中对照表 的费米子一侧。半满填充 对应于 DMRG-03 中使用的 扇区。
格点
来自 ALPS 格点库的内置 open chain lattice 就足够了:每个格点都是等价的(),每条键都携带相同的跳跃 :
t t t t t
o-------o-------o-------o . . . o-------o-------o
1 2 3 4 30 31 32
every bond: hopping t, interaction V=0
every site: chemical potential mu=0开放边界条件是 DMRG 的自然选择(见 DMRG-01),在这里还有一个额外的好处:Jordan–Wigner 映射是精确的,没有边界宇称因子(见简介中关于边界的注意事项)。
参数文件
单次运行参数文件 spinless_free:
LATTICE="open chain lattice"
MODEL="hardcore boson"
CONSERVED_QUANTUMNUMBERS="N"
N_total=16
t=1
V=0
SWEEPS=4
NUMBER_EIGENVALUES=1
L=32
{MAXSTATES=100}以及多次运行文件 spinless_free_multiple,用于研究结果随保留态数的收敛:
LATTICE="open chain lattice"
MODEL="hardcore boson"
CONSERVED_QUANTUMNUMBERS="N"
N_total=16
t=1
V=0
SWEEPS=4
NUMBER_EIGENVALUES=1
L=32
{ MAXSTATES=20 }
{ MAXSTATES=40 }
{ MAXSTATES=60 }运行模拟
将 ALPS 可执行文件加入 PATH 后,把参数文件转换为 XML 并运行 dmrg 应用程序:
parameter2xml spinless_free
dmrg --write-xml spinless_free.in.xml
parameter2xml spinless_free_multiple
dmrg --write-xml spinless_free_multiple.in.xml第一对命令生成 spinless_free.task1.out.xml;第二对命令生成三个输出文件 spinless_free_multiple.task#.out.xml,每个 MAXSTATES 值对应一个。
海森堡点处的相互作用费米子()
现在我们打开相互作用,取 、,即 、:这是费米子语言下 DMRG-03 的各向同性海森堡链。为使对应关系精确成立而非仅在渐近意义下成立,必须包含前面推导的依赖于格点的化学势 :体内格点 ,而只有一个近邻的两个端点格点 。于是预言的基态能量为
其中使用了 DMRG-03 中计算的 海森堡能量。
参数
| 参数 | 含义 | 值 |
|---|---|---|
LATTICE_LIBRARY | 自定义格点文件(见下文) | my_lattice.xml |
LATTICE | 两个端点顶点具有单独类型的开链 | open chain lattice with special edges |
MODEL | 硬核玻色子 – 模型,无自旋费米子链的 Jordan–Wigner 等价形式 | hardcore boson |
CONSERVED_QUANTUMNUMBERS | 固定的量子数 | N |
N_total | 目标粒子数扇区(半满填充) | 16 |
t | 最近邻跳跃振幅() | 0.5 |
V | 最近邻排斥强度() | 1 |
mu0 | 两个端点格点上的化学势(,) | 0.5 |
mu1 | 体内格点上的化学势(,) | 1 |
SWEEPS | DMRG 有限系统扫描次数 | 4 |
NUMBER_EIGENVALUES | 请求的本征态数目 | 1 |
MAXSTATES | 截断后保留的键维数 | 100(单次运行);20、40、60(多次运行) |
格点
内置开链使每个顶点都具有相同的类型,因而具有相同的化学势。为了给两个端点格点各自的 ,我们重用 DMRG-03 中自旋-1 链的技巧:一个自定义格点,其中端点顶点为类型 0,体内顶点为类型 1。这样 ALPS 模型库便提供了按类型区分的参数 mu0 和 mu1:
t,V t,V t,V t,V t,V
o-------o-------o------ . . . ------o-------o
1 2 3 31 32
site 1, 32 (type 0): mu0 = V/2 (z = 1, one neighbor)
sites 2..31 (type 1): mu1 = V (z = 2, two neighbors)
every bond (type 0): hopping t, interaction V这里适用与 DMRG-03 相同的格点图逻辑,只是原因不同:在那里特殊边缘携带的是不同的自旋,这里携带的是不同的化学势。完整的格点文件 my_lattice.xml(有删节——省略的顶点和边的规律显而易见):
<LATTICES>
<GRAPH name = "open chain lattice with special edges" dimension="1" vertices="32" edges="31">
<VERTEX id="1" type="0"><COORDINATE>1</COORDINATE></VERTEX>
<VERTEX id="2" type="1"><COORDINATE>2</COORDINATE></VERTEX>
<VERTEX id="3" type="1"><COORDINATE>3</COORDINATE></VERTEX>
<!-- ... vertices 4 to 30, all type="1" ... -->
<VERTEX id="31" type="1"><COORDINATE>31</COORDINATE></VERTEX>
<VERTEX id="32" type="0"><COORDINATE>32</COORDINATE></VERTEX>
<EDGE source="1" target="2" id="1" type="0" vector="1"/>
<EDGE source="2" target="3" id="2" type="0" vector="1"/>
<!-- ... edges 3 to 30 ... -->
<EDGE source="31" target="32" id="31" type="0" vector="1"/>
</GRAPH>
</LATTICES>对任意 ,都可以用几行 Python 生成该文件:
L = 32
print('<LATTICES>')
print(f'<GRAPH name = "open chain lattice with special edges" dimension="1" vertices="{L}" edges="{L-1}">')
for i in range(1, L+1):
vtype = 0 if i in (1, L) else 1
print(f'<VERTEX id="{i}" type="{vtype}"><COORDINATE>{i}</COORDINATE></VERTEX>')
for i in range(1, L):
print(f'<EDGE source="{i}" target="{i+1}" id="{i}" type="0" vector="1"/>')
print('</GRAPH>')
print('</LATTICES>')参数文件
单次运行参数文件 spinless_tV:
LATTICE_LIBRARY="my_lattice.xml"
LATTICE="open chain lattice with special edges"
MODEL="hardcore boson"
CONSERVED_QUANTUMNUMBERS="N"
N_total=16
t=0.5
V=1
mu0=0.5
mu1=1
SWEEPS=4
NUMBER_EIGENVALUES=1
{MAXSTATES=100}以及多次运行文件 spinless_tV_multiple:
LATTICE_LIBRARY="my_lattice.xml"
LATTICE="open chain lattice with special edges"
MODEL="hardcore boson"
CONSERVED_QUANTUMNUMBERS="N"
N_total=16
t=0.5
V=1
mu0=0.5
mu1=1
SWEEPS=4
NUMBER_EIGENVALUES=1
{ MAXSTATES=20 }
{ MAXSTATES=40 }
{ MAXSTATES=60 }运行模拟
parameter2xml spinless_tV
dmrg --write-xml spinless_tV.in.xml
parameter2xml spinless_tV_multiple
dmrg --write-xml spinless_tV_multiple.in.xml结果评估
下面的 Python 脚本(用 alpspython 运行)加载所有运行的收敛本征态测量结果以及两次单次运行的迭代历史,打印能量和截断误差,并绘制收敛曲线:
import pyalps
import matplotlib.pyplot as plt
import pyalps.plot
# converged measurements of all runs
for prefix in ['spinless_free', 'spinless_free_multiple',
'spinless_tV', 'spinless_tV_multiple']:
data = pyalps.loadEigenstateMeasurements(pyalps.getResultFiles(prefix=prefix))
for run in data:
print(prefix, '| MAXSTATES =', run[0].props['MAXSTATES'])
for s in run:
print(' ', s.props['observable'], ':', s.y[0])
# iteration history of the two single runs
iter = pyalps.loadMeasurements(pyalps.getResultFiles(prefix='spinless_free'),
what=['Iteration Energy','Iteration Truncation Error'])
plt.figure()
pyalps.plot.plot(iter[0][0])
plt.title('Iteration history of ground state energy (V=0)')
plt.ylabel('$E_0$')
plt.xlabel('iteration')
plt.show()自由费米子
MAXSTATES | 截断误差 | ||
|---|---|---|---|
| 20 | |||
| 40 | |||
| 60 | |||
| 100 |
在 时,DMRG 能量 与精确的自由费米子值 在十二位数字上一致——而这台相互作用代码对模型是自由的这一事实一无所知。迭代历史展现出 DMRG-03 中熟悉的模式:能量在无限系统预热阶段陡然下降,并在第一次扫描内稳定到收敛值:

处的相互作用费米子
MAXSTATES | 截断误差 | ||
|---|---|---|---|
| 20 | |||
| 40 | |||
| 60 | |||
| 100 | — |
的结果 与 Jordan–Wigner 预言 在 DMRG-03 参考能量的每一位数字上都一致——这是对简介中推导的算符对照表的直接数值验证:

在两种情形下,能量误差都在很好的近似程度上正比于截断误差——这是 外推所用的标准经验法则,而多次运行让我们可以对它进行定量检验:

小结
在粒子数守恒的基下,DMRG 在 、 个态时将半满填充无自旋费米子链的基态能量收敛到几乎机器精度:自由点在十二位数字上重现了精确的驻波能量 ,相互作用点 通过 Jordan–Wigner 平移 在所有给出的数字上重现了 DMRG-03 的海森堡能量,并且两种情形下能量误差都随截断误差线性变化。
思考题
- 将 对截断误差 作拟合,并外推到 。与未经处理的 结果相比,外推得到的自由费米子能量与精确值有多接近?
- 设置
N_total=8(四分之一填充)以偏离半满填充。自由费米子基准 仍然是精确的——DMRG 在 方向的收敛变得更容易还是更困难?为什么? - 让相互作用扫过临界点:保持 ,计算 时的 。在 ()之外,半满填充的链会出现电荷有序——你能否从收敛行为或局域密度中探测到这一相变?
- 在小链上端到端地验证 Jordan–Wigner 等价性:用
sparsediag分别以MODEL="spinless fermions"和MODEL="hardcore boson"运行 、,并确认两者的能谱在每个扇区中逐一吻合。 - 在不使用特殊边缘化学势的情况下重复 的运行(内置
open chain lattice,均匀的mu=1)。结果不再与海森堡预言相符——在对 逐键记账中,是哪一项造成了这一差异?