ED-01 Sparse Diagonalization
在本教程中,我们将学习如何使用稀疏对角化程序 sparsediag,它通过迭代的 Lanczos 算法求解量子哈密顿量的最低本征态,并学习如何在得到的本征态上读取任意可观测量。
一维海森堡链上的测量
作为第一个例子,我们考虑自旋 S=1 的各向同性反铁磁海森堡链,
求和遍历周期链上的最近邻键。该模型是整数自旋反铁磁体的典型例子:Haldane 曾预言(后被数值计算证实),该模型具有唯一的、带能隙的基态,自旋关联呈指数衰减,并在动量 处出现短程反铁磁序的峰值(F.D.M. Haldane, Phys. Rev. Lett. 50, 1153 (1983))。精确对角化让我们可以直接得到有限链的基态波函数,并由此精确计算任意关联函数或结构因子——本教程展示了如何从 sparsediag 中请求此类测量。有限尺寸能隙本身将是下一篇教程 ED-02 的主题。
参数
| 参数 | 含义 | 取值 |
|---|---|---|
LATTICE | 内置的周期一维格子 | chain lattice |
MODEL | 量子自旋模型 | spin |
local_S | 每个格点的自旋量子数 | 1 |
J | 最近邻海森堡耦合 | 1 |
L | 格点数 | 4 |
CONSERVED_QUANTUMNUMBERS | 用于将哈密顿量分块对角化的对称性 | Sz |
MEASURE_CORRELATIONS[...] | 在每个计算得到的本征态上请求 和 | 见下文 |
MEASURE_STRUCTURE_FACTOR[...] | 请求某个关联函数的傅里叶变换 |
格子
chain lattice 是 ALPS 格子库中内置的几何结构之一;它将 L 个格点排列成一个环,用强度为 J 的周期性最近邻键相连:
J J J
o-------o-------o-------o
0 1 2 3
|___________________________|
J (bond 3-0, periodic)方法
L=4 的 S=1 链,其希尔伯特空间维数为 ,利用 Sz 量子数后可分解为维数为 19 的 子空间。由于我们只需要基态(对于下文的结构因子和关联函数,也不需要其他本征态),sparsediag 所采用的迭代 Lanczos 算法是自然的选择:它只需少量的矩阵-向量乘法即可收敛到稀疏哈密顿量的最低本征对,而完全不必构造或对角化整个 矩阵。
使用命令行
参数文件 parm1a 为具有 4 个格点的量子 S=1 链设置了精确对角化:
MODEL="spin"
LATTICE="chain lattice"
CONSERVED_QUANTUMNUMBERS="Sz"
MEASURE_STRUCTURE_FACTOR[Structure Factor Sz]=Sz
MEASURE_CORRELATIONS[Diagonal spin correlations]=Sz
MEASURE_CORRELATIONS[Offdiagonal spin correlations]="Splus:Sminus"
local_S=1
J=1
{L=4;}与其他代码相比,这里新增的是指定应测量哪些算符平均值、局域值、关联函数和结构因子的测量参数。关于这些自定义测量的更多细节可以在这里找到。
按照标准的命令序列,你可以先将输入参数转换为 XML,然后运行应用程序 sparsediag(注意:这些可执行文件位于 ALPS 安装目录下的 bin 目录中,你可以将该目录加入 PATH 以方便使用 ALPS):
parameter2xml parm1a
sparsediag --write-xml parm1a.in.xml在每个 (Sz,P) 子空间(P 表示总动量)中都会计算出最低的本征值和本征态。输出文件 parm1a.task1.out.xml 包含所有计算得到的物理量,可以用普通的网页浏览器查看。在我们的例子中,基态位于 Sz=0、P=0 的子空间。XML 文件中给出的对应对角自旋关联如下:
Diagonal spin correlations[( 0 ) -- ( 0 )] (0.666667,0)
Diagonal spin correlations[( 0 ) -- ( 1 )] (-0.5,0)
Diagonal spin correlations[( 0 ) -- ( 2 )] (0.333333,0)
Diagonal spin correlations[( 0 ) -- ( 3 )] (-0.5,0)上面括号中的数字 [( a ) – ( b )] 指的是格点编号,即 Sz(a)*Sz(b)。右边一列可以读出该关联函数的(复)数值。 该态的 Sz 结构因子输出如下:
Structure Factor Sz[( 0 )] 5.551115123125783e-17
Structure Factor Sz[( 1.570796326794897 )] 0.333333333333333
Structure Factor Sz[( 3.141592653589793 )] 2
Structure Factor Sz[( -1.5707963267948966 )] 0.3333333333333329其中括号中的数字 [(q)] 表示波数。 可以通过在参数文件中添加下面这一行来显式限定 Sz 子空间:
Sz_total=0使用 Python
要在 Python 中设置并运行该模拟,我们使用脚本 tutorial1a.py。该脚本的前几部分导入所需模块 pyalps,将输入参数准备为一个 Python 字典列表,写入输入文件并运行应用程序:
import pyalps
parms = [{
'LATTICE' : "chain lattice",
'MODEL' : "spin",
'local_S' : 1,
'J' : 1,
'L' : 4,
'CONSERVED_QUANTUMNUMBERS' : 'Sz',
'MEASURE_STRUCTURE_FACTOR[Structure Factor Sz]' : 'Sz',
'MEASURE_CORRELATIONS[Diagonal spin correlations]=' : 'Sz',
'MEASURE_CORRELATIONS[Offdiagonal spin correlations]' : 'Splus:Sminus'
}]
input_file = pyalps.writeInputFiles('parm1a',parms)
res = pyalps.runApplication('sparsediag',input_file)现在你可以启动 Python 运行脚本 tutorial1a.py。我们将得到与命令行版本相同的输出文件。
接下来我们加载每个计算得到的本征态上的测量结果:
data = pyalps.loadEigenstateMeasurements(pyalps.getResultFiles(prefix='parm1a'))然后只打印基态的结果:
for sector in data[0]:
print '\nSector with Sz =', sector[0].props['Sz'],
print 'and k =', sector[0].props['TOTAL_MOMENTUM']
for s in sector:
if pyalps.size(s.y[0])==1:
print s.props['observable'], ' : ', s.y[0]
else:
for (x,y) in zip(s.x,s.y[0]):
print s.props['observable'], '(', x, ') : ', y总结
对于 L=4 的 S=1 链,基态位于 子空间,其对角关联函数呈短程反铁磁性,符号随距离交替变化并随间距衰减,而静态结构因子在 处出现强烈的峰值(数值为 2,相邻动量处约为 0.33)——这正是带能隙的 Haldane 链所预期的短程奈尔(Néel)型序的特征,即使在如此小的系统上也已清晰可见。
问题
- 为什么
Diagonal spin correlations[( 0 ) -- ( b )]会随着 从 0 增加到 3 而符号交替变化? - 处的结构因子峰值是有限值(2)而非发散。你预期随着 增大,这个峰值会增大、减小还是保持不变?(可与你将在 ED-02 中计算的有限尺寸能隙作比较。)
- 添加
MEASURE_AVERAGE[Energy per bond]=bond_energy(或直接读出总能量),并利用 检验它是否与上面打印出的对角和非对角关联一致。