PLUMED专题

PLUMED矩阵实操:构造、求逆与特征分解

从四原子坐标提取三个距离,演示外积、矩阵乘法、求逆和特征分解,并读取32帧原生结果。

更新于 2026-11-13约 6 分钟阅读按任务与环境选择适用配置
阅读本篇目录

当集体变量不再是一个数,而是一组距离或一个矩阵时,可以把PLUMED的标量、向量和矩阵Action串成一条计算链。本例用32帧四原子XYZ演示,重点是输入语法和输出读取;这些帧是明确构造的几何输入,不是分子动力学轨迹,也不是材料PCA结果。

1. 先看已有结果#

下载PLUMED矩阵与分类资料包,保存为example.zip:

python3 -m zipfile -e example.zip .
cd plumed-matrix-covariance
bash results.sh
bash read.sh
bash plot.sh

这几条命令先读取随包保存的真实计算结果。CSV在data/,图片在figures/,完整输入和原生输出分别在inputs/与reference-results/。

原生矩阵、逆矩阵与乘积

三个距离以nm为单位,数值再按1nm归一化作为无量纲特征。令v=(r,s,t),构造正定矩阵M=I+v vᵀ,这样可以清楚观察求逆和特征分解。图中第三个矩阵应接近单位矩阵。

2. 看完整输入#

cat inputs/eigen-components/plumed.dat
head -n 6 inputs/eigen-components/scan.xyz
UNITS LENGTH=nm ENERGY=kj/mol TIME=ps
r: DISTANCE ATOMS=1,2 NOPBC
s: DISTANCE ATOMS=1,3 NOPBC
t: DISTANCE ATOMS=1,4 NOPBC
v: CONCATENATE ARG=r,s,t
v2: CUSTOM ARG=v FUNC=x+0.1 PERIODIC=NO
v3: CUSTOM ARG=v FUNC=x*x PERIODIC=NO
ident: CONSTANT NROWS=3 NCOLS=3 VALUES=1,0,0,0,1,0,0,0,1
outer: OUTER_PRODUCT ARG=v,v
m: COMBINE ARG=outer,ident COEFFICIENTS=1,1 PERIODIC=NO
inv: INVERT_MATRIX ARG=m
eig: DIAGONALIZE ARG=m VECTORS=all
evals: CONCATENATE ARG=eig.vals-1,eig.vals-2,eig.vals-3
evecs: VSTACK ARG=eig.vecs-1,eig.vecs-2,eig.vecs-3
det: PRODUCT ARG=evals
tr: TRANSPOSE ARG=m
prod: MATRIX_PRODUCT ARG=m,inv
mv: MATRIX_VECTOR_PRODUCT ARG=m,v
rows: VSTACK ARG=v,v2,v3
columns: TRANSPOSE ARG=rows
dis: DISSIMILARITIES ARG=rows,columns
vor: VORONOI ARG=dis
weights: CONSTANT VALUES=1,2,3
cov: COVARIANCE_MATRIX ARG=v,v2,v3 WEIGHTS=weights
PRINT ARG=r,s,t,det STRIDE=1 FILE=COLVAR FMT=%.14g
DUMPVECTOR ARG=v STRIDE=1 FILE=v.dat FMT=%.14g PRINT_ONE_FILE
DUMPVECTOR ARG=v2 STRIDE=1 FILE=v2.dat FMT=%.14g PRINT_ONE_FILE
DUMPVECTOR ARG=v3 STRIDE=1 FILE=v3.dat FMT=%.14g PRINT_ONE_FILE
DUMPVECTOR ARG=m STRIDE=1 FILE=m.dat FMT=%.14g PRINT_ONE_FILE
DUMPVECTOR ARG=outer STRIDE=1 FILE=outer.dat FMT=%.14g PRINT_ONE_FILE
DUMPVECTOR ARG=inv STRIDE=1 FILE=inv.dat FMT=%.14g PRINT_ONE_FILE
DUMPVECTOR ARG=evals STRIDE=1 FILE=eig-vals.dat FMT=%.14g PRINT_ONE_FILE
DUMPVECTOR ARG=evecs STRIDE=1 FILE=eig-vecs.dat FMT=%.14g PRINT_ONE_FILE
DUMPVECTOR ARG=tr STRIDE=1 FILE=tr.dat FMT=%.14g PRINT_ONE_FILE
DUMPVECTOR ARG=prod STRIDE=1 FILE=prod.dat FMT=%.14g PRINT_ONE_FILE
DUMPVECTOR ARG=mv STRIDE=1 FILE=mv.dat FMT=%.14g PRINT_ONE_FILE
DUMPVECTOR ARG=rows STRIDE=1 FILE=rows.dat FMT=%.14g PRINT_ONE_FILE
DUMPVECTOR ARG=dis STRIDE=1 FILE=dis.dat FMT=%.14g PRINT_ONE_FILE
DUMPVECTOR ARG=vor STRIDE=1 FILE=vor.dat FMT=%.14g PRINT_ONE_FILE
DUMPVECTOR ARG=cov STRIDE=1 FILE=cov.dat FMT=%.14g PRINT_ONE_FILE
Action 本例用途
CONCATENATE 三个标量距离连接为向量
OUTER_PRODUCT 计算v vᵀ
INVERT_MATRIX 求M的逆
DIAGONALIZE 得到特征值与特征向量
TRANSPOSE 转置矩阵
MATRIX_PRODUCT 核对M M⁻¹
MATRIX_VECTOR_PRODUCT 计算M v

这里的特征值组件名称是eig.vals-1、eig.vals-2、eig.vals-3,向量对应eig.vecs-1等;不要写成不存在的通用eig.vals。特征向量按列读取。该构建的DETERMINANT快捷入口不适用,本例用显式DIAGONALIZE加三个特征值的PRODUCT得到行列式。

3. 实际运行#

本例使用CP2K配套的PLUMED 2.10.1 CPU程序。CP2K为Intel oneAPI 2024.2 / Intel MPI构建;这里运行的是独立PLUMED driver,无需调用CP2K或GPU。脚本设置单线程,分析使用NumPy与Matplotlib。

source /etc/profile.d/lmod.sh
module purge
module load cp2k/2026.2-8173m
export LD_LIBRARY_PATH=/public/software/cp2k/deps/2026.2/8173m/plumed-2.10.1/lib:${LD_LIBRARY_PATH:-}

想复跑三组坐标后处理,在一个新解压目录中执行:

sbatch run.slurm

任务完成后:

bash read.sh work analysis-new
bash plot.sh analysis-new figures-new work

提交脚本按CPU整节点规则申请56核,程序实际单线程。没有CPU资源时,仍可读取随包结果,不要把计算命令直接搬到登录节点。

要理解底层driver命令,可以在已准备好环境的计算任务中查看脚本对应步骤:

cd work/eigen-components
/public/software/cp2k/deps/2026.2/8173m/plumed-2.10.1/bin/plumed driver \
  --plumed plumed.dat --ixyz scan.xyz --length-units nm --box 1,1,1

正式复跑用前面的sbatch,不要在已完成目录重复执行driver覆盖结果。

4. 提取结果#

head reference-results/eigen-components/COLVAR
head reference-results/eigen-components/eig-vals.dat
head data/PLUMED-matrix-max-errors.csv

DUMPVECTOR按每帧、每个矩阵行输出,parameter=0,1,2是矩阵行号;不是额外的时间帧。本例矩阵独立计算最大差约5.0×10⁻¹⁴,特征对残差约4.0×10⁻¹⁴。这些数说明这条数据链的数学一致性,不能据此判断任意真实体系的采样已经充分。

需要根据你的体系选择资源?联系讨论计算需求。实际可用软件与权限,以当前账户和运行环境为准。

查看配图

放大后可滚动查看细节,按 Esc 关闭。

100%查看原图 ↗