跳至内容
ED-01 Sparse Diagonalization

ED-01 Sparse Diagonalization

在本教程中,我们将学习如何使用稀疏对角化程序 sparsediag,它通过迭代的 Lanczos 算法求解量子哈密顿量的最低本征态,并学习如何在得到的本征态上读取任意可观测量。

一维海森堡链上的测量

作为第一个例子,我们考虑自旋 S=1 的各向同性反铁磁海森堡链,

H=Ji,jSiSj,J>0, H = J \sum_{\langle i,j \rangle} \mathbf{S}_i \cdot \mathbf{S}_j , \qquad J>0 ,

求和遍历周期链上的最近邻键。该模型是整数自旋反铁磁体的典型例子:Haldane 曾预言(后被数值计算证实),该模型具有唯一的、带能隙的基态,自旋关联呈指数衰减,并在动量 q=πq=\pi 处出现短程反铁磁序的峰值(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[...]在每个计算得到的本征态上请求 SizSjz\langle S^z_iS^z_j\rangleSi+Sj\langle S^+_iS^-_j\rangle见下文
MEASURE_STRUCTURE_FACTOR[...]请求某个关联函数的傅里叶变换SzS^z

格子

chain latticeALPS 格子库中内置的几何结构之一;它将 L 个格点排列成一个环,用强度为 J 的周期性最近邻键相连:

      J     J     J
  o-------o-------o-------o
  0       1       2       3
  |___________________________|
              J   (bond 3-0, periodic)

方法

L=4 的 S=1 链,其希尔伯特空间维数为 34=813^4=81,利用 Sz 量子数后可分解为维数为 19 的 Sz=0S_z=0 子空间。由于我们只需要基态(对于下文的结构因子和关联函数,也不需要其他本征态),sparsediag 所采用的迭代 Lanczos 算法是自然的选择:它只需少量的矩阵-向量乘法即可收敛到稀疏哈密顿量的最低本征对,而完全不必构造或对角化整个 81×8181\times 81 矩阵。

使用命令行

参数文件 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 链,基态位于 (Sz,P)=(0,0)(S_z,P)=(0,0) 子空间,其对角关联函数呈短程反铁磁性,符号随距离交替变化并随间距衰减,而静态结构因子在 q=πq=\pi 处出现强烈的峰值(数值为 2,相邻动量处约为 0.33)——这正是带能隙的 Haldane 链所预期的短程奈尔(Néel)型序的特征,即使在如此小的系统上也已清晰可见。

问题

  • 为什么 Diagonal spin correlations[( 0 ) -- ( b )] 会随着 bb 从 0 增加到 3 而符号交替变化?
  • q=πq=\pi 处的结构因子峰值是有限值(2)而非发散。你预期随着 LL 增大,这个峰值会增大、减小还是保持不变?(可与你将在 ED-02 中计算的有限尺寸能隙作比较。)
  • 添加 MEASURE_AVERAGE[Energy per bond]=bond_energy(或直接读出总能量),并利用 SiSj=SizSjz+12(Si+Sj+SiSj+)\mathbf{S}_i\cdot\mathbf{S}_j = S^z_iS^z_j + \tfrac12(S^+_iS^-_j+S^-_iS^+_j) 检验它是否与上面打印出的对角和非对角关联一致。