PLUMED矩阵实操:构造、求逆与特征分解
从四原子坐标提取三个距离,演示外积、矩阵乘法、求逆和特征分解,并读取32帧原生结果。
阅读本篇目录
当集体变量不再是一个数,而是一组距离或一个矩阵时,可以把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⁻¹⁴。这些数说明这条数据链的数学一致性,不能据此判断任意真实体系的采样已经充分。