跳至内容
通过 Python 使用 ALPS

通过 Python 使用 ALPS

用 Python 运行 ALPS 程序

为了演示如何从 Python 使用 ALPS,我们来看一个简单的经典蒙特卡洛模拟:用 spinmc 应用求解正方晶格上的二维铁磁 Ising 模型。在接近临界温度时,局域自旋翻转更新会遭遇临界慢化——自关联时间发散,导致相继的组态在统计上远非独立——因此我们改用团簇算法('UPDATE': "cluster"),一次性翻转整个由取向一致的自旋组成的团簇。我们将计算磁化强度 ∣m∣|m| 随温度的变化,以及它的 Binder cumulant——这是精确定位临界温度的标准有限尺寸分析工具(关于这一分析的完整讨论,参见 MC-07 Phase Transition)。

启动 Python

Python 只允许某个扩展模块与编译它时所用的完全相同版本的 Python 一起使用。如果你从源码构建 ALPS(例如在 Linux 上就是必须的),可以在配置 ALPS 时指定要使用的 Python 解释器。之后 ALPS 会创建一个名为

alpspython

的脚本,它会设置好查找 ALPS 扩展模块所需的路径,然后调用你指定的 Python 解释器。

详细说明

导入 ALPS 模块

启动 Python 后,导入我们需要的模块:

import pyalps
import matplotlib.pyplot as plt
import pyalps.plot

完整的 Python 脚本位于教程目录下的 tutorials/intro-01-basics/tutorial-full.py。

准备输入

为了准备输入,我们创建一个包含模拟参数的 Python 字典列表:

parms = []
for t in [1.5,2,2.5]:
    parms.append(
        { 
            'LATTICE'        : "square lattice", 
            'T'              : t,
            'J'              : 1,
            'THERMALIZATION' : 1000,
            'SWEEPS'         : 100000,
            'UPDATE'         : "cluster",
            'MODEL'          : "Ising",
            'L'              : 8
        }
    )

接下来,我们为 ALPS 模拟写出输入文件:

input_file = pyalps.writeInputFiles('parm1',parms)

参数 'parm1' 告诉该函数使用 parm1 作为所有模拟文件的前缀。该函数返回主模拟文件的名称(此处为 parm1.in.xml)。

运行模拟

在串行机器上运行模拟

要运行模拟,只需调用 runApplication 函数:

pyalps.runApplication('spinmc',input_file,Tmin=5,writexml=True)

参数 writexml=True 会告诉 ALPS 同时把所有结果也写入 XML 文件。这会拖慢 I/O 速度,但很方便,因为你只需在浏览器中打开输出的 XML 文件就能查看结果。不过,如果你测量的物理量很多,文件会变得非常大,写入也会耗时过长。

在并行机器上运行模拟

要在并行机器上使用 MPI 运行模拟,改为调用以下命令:

pyalps.runApplication('spinmc',input_file,Tmin=5,writexml=True,MPI=4)

其中 MPI 参数指定要启动的进程数。

加载模拟结果

获取结果文件

在加载结果之前,我们需要先获取结果文件的列表。这里只关注我们刚刚创建的文件(即以前缀 parm1 开头的文件),从而得到文件列表:

result_files = pyalps.getResultFiles(prefix='parm1')
print(result_files)

加载结果

接下来,我们可能想知道都测量了哪些物理量。为此可以加载观测量列表:

print(pyalps.loadObservableList(result_files))

我们决定加载磁化强度的绝对值及其平方,并打印出所加载的内容:

data = pyalps.loadMeasurements(result_files,['|Magnetization|','Magnetization^2'])
print(data)

打印出的内容中,加载的数值保存在 y 中,所有模拟参数则保存在名为 props 的字典中。

绘制结果

例如,要绘制 |Magnetization| 随温度变化的图像,我们通过调用 collectXY,把 |Magnetization| 的值收集到 y,把温度 T 收集到 x:

plotdata = pyalps.collectXY(data,'T','|Magnetization|')

在 Python 中用 matplotlib 绘图

然后我们使用 matplotlib 和 pyalps.plot 模块来绘图:

plt.figure()
pyalps.plot.plot(plotdata)
plt.xlim(0,3)
plt.ylim(0,1)
plt.title('Ising model')
plt.show()

转换为其他格式

我们也可以调用相应函数,把数据集转换为其他绘图格式,例如纯文本、Grace 或 Gnuplot:

print(pyalps.plot.convertToText(plotdata))
print(pyalps.plot.makeGracePlot(plotdata))
print(pyalps.plot.makeGnuplotPlot(plotdata))

评估数据

我们可以很容易地对结果求值来计算一些函数,例如计算 Binder cumulant 比值 ⟨m2⟩/⟨∣m∣⟩2\langle m^2 \rangle / \langle |m|\rangle ^2。我们创建一个新的 DataSet 并填入数据:

binder = pyalps.DataSet()
binder.props = pyalps.dict_intersect([d[0].props for d in data])
binder.x = [d[0].props['T'] for d in data]
binder.y = [d[1].y[0]/(d[0].y[0]*d[0].y[0]) for d in data]
print(binder)

表达式 d[1].y[0]/(d[0].y[0]*d[0].y[0]) 使用 jackknife 分析来为存在关联的物理量计算正确的蒙特卡洛误差棒。

最后,我们再制作一张图:

plt.figure()
pyalps.plot.plot(binder)
plt.xlabel('T')
plt.ylabel('Binder cumulant')
plt.show()

完整示例脚本

完整的脚本位于文件 tutorials/intro-01-basics/tutorial-full.py。

下面给出针对各种任务的一些更小的脚本:

运行与绘图

更复杂的评估

拆分为子任务

准备、运行、评估这几项任务也可以拆分成子任务:

更多示例

关于各函数用法的更多示例,以及更高级的应用,可以在教程中找到。此外,别忘了可以通过函数的 __doc__ 属性查看其文档,例如:

print(pyalps.plot.plot.__doc__)

关于大多数 ALPS 应用共有的输入参数,请参见常用参数。关于能生成与本文所示 Python 方式相同输出文件的命令行流程,请参见使用命令行。关于本节其余内容的概览,请参见运行模拟。