ED-04 Criticality
在本教程中,我们将研究临界自旋链,并建立它们与共形场论描述之间的联系。在连续量子相变处,自旋链变得具有标度不变性,其长程物理由一个 维共形场论(CFT)描述。有限链永远不可能真正处于相变点,但它继承了相变的一个普适特征:低能有限尺寸能谱会按 CFT 初级算符及其后代算符的标度维数 组织成一座座能级塔,能级间距以 的方式趋于零。精确对角化是直接观察这一现象的理想工具,因为它能给出仅有几十个格点的链的完整低能谱(包括动量),这已经足以分辨出普适的算符内容。
伊辛链
我们要考虑的第一个模型是临界伊辛链,由如下哈密顿量给出:
这里第一个求和遍历所有最近邻对。 称为横场;系统在 处变为临界。当 时,若 基态为反铁磁的,若 则为铁磁的。该系统是精确可解的(P. Pfeuty, Annals of Physics 57, 79 (1970))。
在上面的方程中, 指的是该场的标度维数。标度场以群的形式出现:其中最低的一个称为初级场(primary field),并伴随无穷多个标度维数为 ()的后代场。
在伊辛模型的精确解中(Pfeuty 论文中的方程 (3.7)),长程关联被发现按如下方式衰减:
此外,我们预期单位算符的标度维数为 0。
因此我们预期伊辛模型的 CFT 中会出现标度维数 0、1/8、1、1+1/8。为了看到这一点,我们将按照 对能谱中的所有能量做重新标度。这会使最低的两个态恰好落在我们预期的标度维数处;然后我们就可以检验谱的其余部分是否与此一致。
参数
| 参数 | 含义 | 取值 |
|---|---|---|
LATTICE | 周期链 | chain lattice |
MODEL | 量子自旋模型 | spin |
local_S | 每个格点的自旋量子数 | 1/2 |
Jxy | 面内()耦合 | 0 |
Jz | 伊辛()耦合 | |
Gamma | 横场 | 0.5(临界点,$\Gamma/ |
NUMBER_EIGENVALUES | 向 sparsediag 请求的低能本征态数目 | 5 |
L | 链长 | 10, 12 |
注意,一旦 (横场会翻转自旋), 就不再守恒,因此与前面的教程不同,这里没有 CONSERVED_QUANTUMNUMBERS 这一行,sparsediag 对角化整条链,仅按总动量分辨。
格子
临界横场伊辛链使用与前面教程相同的、来自 ALPS 格子库的周期性 chain lattice,现在还带有伊辛键 和格点上的横场 :
Jz Jz Jz Jz
o------o------o------ ... ------o (each o also feels an on-site field Gamma S^x)
0 1 2 L-1
|______________________________________|
Jz (bond L-1 -- 0, periodic)方法
在 处,链没有守恒的 ,因此 sparsediag 的 Lanczos 迭代是在完整的 维希尔伯特空间上运行的(对 分别只有 和 个态);请求 NUMBER_EIGENVALUES=5 会返回观察初级场及其最初几个后代场所需的五个最低态。由于我们只需要少数几个低能态而非完整能谱,即使没有利用对称子空间来缩小问题规模,稀疏 Lanczos 对角化的代价仍然远低于全对角化。
使用命令行
参数文件 parm_ising 设置了两种系统尺寸:
LATTICE = "chain lattice"
MODEL = "spin"
local_S = 0.5
Jxy = 0
Jz = -1
Gamma = 0.5
NUMBER_EIGENVALUES = 5
{L=10}
{L=12}parameter2xml parm_ising
sparsediag --write-xml parm_ising.in.xmlPython 版本
伊辛模拟的参数文件可以在这里找到。该模拟通过 Python 脚本运行。
我们首先导入一些模块:
import pyalps
import pyalps.plot
import numpy as np
import matplotlib.pyplot as plt
import copy
import math接下来,让我们为两种系统尺寸设置参数。请注意要使用横场 ,而不是纵场 。
parms = []
for L in [10,12]:
parms.append({
'LATTICE' : "chain lattice",
'MODEL' : "spin",
'local_S' : 0.5,
'Jxy' : 0,
'Jz' : -1,
'Gamma' : 0.5,
'NUMBER_EIGENVALUES' : 5,
'L' : L
})如你所见,我们将模拟两种系统尺寸。现在让我们设置输入文件并运行模拟:
prefix = 'ising'
input_file = pyalps.writeInputFiles(prefix,parms)
res = pyalps.runApplication('sparsediag', input_file)
# res = pyalps.runApplication('sparsediag', input_file, MPI=2, mpirun='mpirun')
data = pyalps.loadEigenstateMeasurements(pyalps.getResultFiles(prefix=prefix))通过取消倒数第二行的注释,并调整任务数目和你的 mpirun 可执行文件名称(默认为 mpirun),你可以让 ALPS 同时使用多个 CPU。
首先,我们为每个 L 值提取最低态和第一激发态,并将其收集到一个字典中:
E0 = {}
E1 = {}
for Lsets in data:
L = pyalps.flatten(Lsets)[0].props['L']
allE = []
for q in pyalps.flatten(Lsets):
allE += list(q.y)
allE = np.sort(allE)
E0[L] = allE[0]
E1[L] = allE[1]上面的代码之所以有效,是因为我们知道 ALPS 会按模拟分组加载能量——因此 data 是一个列表的列表,顶层是不同的模拟,下一层是不同的动量。现在我们按照上面给出的公式对能量做重新标度,并将数据收集为动量的函数:
for q in pyalps.flatten(data):
L = q.props['L']
q.y = (q.y-E0[L])/(E1[L]-E0[L]) * (1./8.)
spectrum = pyalps.collectXY(data, 'TOTAL_MOMENTUM', 'Energy', foreach=['L'])为便于比较,我们还要显示初级场及其最初几个后代场:
for SD in [0.125, 1, 1+0.125, 2]:
d = pyalps.DataSet()
d.x = np.array([0,4])
d.y = SD+0*d.x
spectrum += [d]最后我们绘制图像:
pyalps.plot.plot(spectrum)
plt.legend(prop={'size':8})
plt.xlabel("$k$")
plt.ylabel("E_0")
plt.xlim(-0.02, math.pi+0.02)
plt.show()输出数据
对同一哈密顿量独立进行对角化,得到以下两种链长下重新标度后的低能能级(对动量求和后排序):
| 能级 1 | 能级 2 | 能级 3 | 能级 4 | |
|---|---|---|---|---|
| 10 | 0(定义值) | 0.125(定义值) | 0.994 | 1.107, 1.107 |
| 12 | 0(定义值) | 0.125(定义值) | 0.996 | 1.112, 1.112 |
根据构造,前两个重新标度后的能级恰好位于 0 和 0.125;第三、第四个能级则是对角化给出的真正预测值,在这样小的尺寸下已经与预期的 CFT 值 1 和 1.125 相差不到百分之几,并随 增大而进一步收敛——这是伊辛 CFT 算符内容 的直接数值证据。
海森堡链
现在让我们考虑一个更复杂的例子:自旋 1/2 自由度的反铁磁海森堡链,由下式描述:
该模型的临界理论具有中心荷 ,初级场为 0、0.5 和 1。与伊辛模型不同,有限尺寸修正仅以对数方式消失,因此在我们所能达到的系统尺寸下相当显著。
参数
| 参数 | 含义 | 取值 |
|---|---|---|
LATTICE | 周期链 | chain lattice |
MODEL | 量子自旋模型 | spin |
local_S | 每个格点的自旋量子数 | 1/2 |
Jxy、Jz | 面内和伊辛耦合(此处为各向同性) | 1, 1 |
NUMBER_EIGENVALUES | 每个动量子空间请求的本征态数 | 5 |
CONSERVED_QUANTUMNUMBERS、Sz_total | 限制在包含我们所需完整 CFT 能级塔的 子空间 | Sz, 0 |
L | 链长 | 10, 12 |
格子
与上面相同的周期性 chain lattice(参见 ALPS 格子库),现在具有各向同性海森堡耦合,没有横场:
J J J J
o-------o-------o--- ... ---o
0 1 2 L-1
|_________________________________|
J (bond L-1 -- 0, periodic)方法
与伊辛点不同,海森堡链守恒 ,因此我们可以将 sparsediag 限制在 子空间——它已经包含了基态,以及足够多的低能能级塔以读出 CFT 内容,同时将子空间维数从 ()降低到 。
使用命令行
参数文件设置了两种系统尺寸:
LATTICE = "chain lattice"
MODEL = "spin"
local_S = 0.5
Jxy = 1
Jz = 1
NUMBER_EIGENVALUES = 5
CONSERVED_QUANTUMNUMBERS = 'Sz'
Sz_total = 0
{L=10}
{L=12}parameter2xml parm_heisenberg
sparsediag --write-xml parm_heisenberg.in.xmlPython 版本
该 Python 文件与上面的描述类似,因此这里不再详细说明。主要的区别在于我们可以利用系统的 U(1) 对称性;我们也只针对 子空间运行模拟,因为它包含了所有相关的态。heisenberg.py 中使用的重新标度将第一激发能级固定在 0.5(自旋算符的标度维数)而不是 0.125,因为这里最领先的初级场是 。
观察能谱,尝试辨认不同的标度场,以及它们随系统尺寸增大如何趋近正确的值。你会发现这相当困难。关于该系统的详细讨论,请参阅 I. Affleck, D. Gepner, H.J. Schulz and T. Ziman, J. Phys. A: Math. Gen. 22, 511 (1989) 以及下一篇教程。
输出数据
独立进行对角化,按 (其中 为三重态能隙)重新标度后的 子空间能级如下:
| 三重态能隙 | 能级 1 | 能级 2 | 能级 3 | 能级 4、5 | |
|---|---|---|---|---|---|
| 10 | 0.4232 | 0 | 0.500(定义值) | 0.880 | 1.149, 1.149 |
| 12 | 0.3558 | 0 | 0.500(定义值) | 0.857 | 1.149, 1.149 |
| 14 | 0.3071 | 0 | 0.500(定义值) | 0.839 | 1.148, 1.148 |
| 16 | 0.2702 | 0 | 0.500(定义值) | 0.825 | 1.145, 1.145 |
第三个能级本应收敛到标度维数为 1 的后代场,但它却缓慢地远离这一目标,从 时的 0.880 变为 时的 0.825,而不是像伊辛能级那样单调趋近。这种迟缓的、非单调的行为正是上文提到的边际不相关算符的实际表现:其对数压低的修正在可达到的 范围内主导了尺寸依赖性,只有在天文数字般大的尺寸下才会消退。ED-05 展示了如何通过调节到附近的一个阻挫点来消除这个边际算符,从而恢复快速的、教科书式的 收敛。
总结
无论是精确可解的横场伊辛链,还是收敛较为困难的海森堡链,仅凭有限尺寸精确对角化能谱就都证实了各自场论所预言的普适 CFT 算符内容(伊辛:,维数 ;海森堡:,维数 )——海森堡的例子还说明了一个边际不相关算符是如何使这种收敛在数值上具有欺骗性的。
问题
- 对于伊辛链,为什么从第三个能级开始,重新标度后的能量会成对简并出现(例如在 1.107 附近的两个态)?(提示:考虑相应后代算符的动量量子数。)
- 对偏离临界点的 值(例如 或 )重复伊辛 CFT 分析。随着 增大,重新标度后的能谱是否仍然呈现出 CFT 的特征?
- 对于海森堡链,随着 从 10 增大到 16,第三个重新标度能级远离而不是趋近其 CFT 目标值。如果可能的话,计算再多几个尺寸(例如 )——这种漂移最终会反转吗?在只能获得少数几个系统尺寸的情况下,你要如何区分"非常缓慢的单调收敛"与"真正的非单调行为"?