LAMMPS三阶张量格式与单位
读取稀疏三阶文件、恢复原子坐标索引,实际检查regular与ESKM转换和非质量加权定义。
阅读本篇目录
拿到三阶文件后,还需要确认每个索引、符号和单位代表什么。本篇直接读取配套Morse例子的稀疏原生输出,将其恢复为稠密张量,并检查regular与ESKM在real单位下的换算。
下载三阶张量输入、原始稀疏文件、独立能量差分与解析核对脚本,解压进入run.sh目录。
1 提交小体系例子#
sbatch submit.slurm
核时P100模板1GPU1CPU,使用P100构建中的普通CPU路径,不启用GPU或KOKKOS后缀。套餐用户用yskit生成所属分区脚本,在已分配资源中执行bash run.sh;不要在登录节点模拟。已有work请重新解压。
版本LAMMPS30Sep2026、GNU C++13.3.0/C++17、Open MPI5.0.10;分析ASE3.29.0。三个张量运行分别是regular 0.001Å、regular 0.0001Å和eskm 0.0001Å;另有一次四点能量扫描。inputs是新输入,reference是本文原始实算,work是新运行。
2 原生每行的八个字段#
head -n 8 work/cases/regular-0p0001/third-order.dat
head -n 8 work/cases/eskm-0p0001/third-order.dat
每行前五项为i、α、j、β、k,后三项分别为γ=x、y、z的数值。本例all组与原子ID一一对应,原子编号1、2,坐标编号1、2、3对应x、y、z。
原生文本省略近零行。本例实际保留56行,脚本将未写出的行补零,再按(x1,y1,z1,x2,y2,z2)顺序恢复6×6×6张量。对实际材料应另行核对分组、稀疏阈值与原子映射,不把任意缺失项都视为物理上严格为零。
3 real单位中的ESKM输入#
units real
atom_style atomic
atom_modify map array
boundary f f f
region box block -10 10 -10 10 -10 10 units box
create_box 2 box
mass 1 1.0
mass 2 2.0
create_atoms 1 single 0 0 0 units box
create_atoms 2 single 1.6 0 0 units box
pair_style morse 4.5
pair_coeff * * 0.5 2.0 1.6
neighbor 0.3 bin
thermo_style custom step atoms pe
thermo_modify norm no format float %.16g
run 0
third_order all eskm 0.0001 file third-order.dat binary no
run 0
write_dump all custom final.dump id type x y z fx fy fz modify sort id format float %.16g
本例regular原生量使用kcal/mol/ų;ESKM能量单位为10J/mol,Å长度不变,因此同一原生分量的数值乘418.4。恢复到regular单位时先除418.4,再取相反数得到本篇的能量Phi3。
例如ESKM原生第一个x1,x1,x1约−10041.600667,除418.4约−24.000001595,再取相反数得到能量三阶导数约+24.000001595kcal/mol/ų。
本例质量分别为1和2;换算后的全部分量仍与regular一致,说明这里没有按质量加权。不要将其当成已除以质量的动力学矩阵。418.4仅针对本例real/Å设置,其他单位制不能直接照搬这一常数。
4 在终端查看一个已转换分量#
module load ase/3.29.0
python - <<'PY'
import csv
for row in csv.DictReader(open('work/analysis/tensor-components.csv')):
if row['case']=='regular-0p0001' and [row[k] for k in ['i','alpha','j','beta','k','gamma']]==['2','1','2','1','2','1']:
print(row)
PY
该行是x2,x2,x2;native_normalized约+24,energy_phi3约−24,analytic_phi3为−24。保留三列便于检查转换,而不是只保存一个不知道定义的数值。
5 换成真实体系时的顺序#
先用经过目标结构检查的势模型优化基准几何,固定边界、超胞和原子顺序,再选择位移步长运行third_order;保留原生输出,核对少量能量导数与符号,最后按接收程序需要的晶胞、原子和坐标索引转换格式。
本例的CSV是教学用笛卡尔张量表,并不是直接可交给ShengBTE或Phono3py的完整材料输入。晶体应用还需要相应的超胞/原胞映射、截断、声学和对称性检查及完整统计。三阶张量随坐标数立方增长,应先用小模型确认格式和输出规模。
当前脚本的解析目标专门针对这里的Morse模型。换势或换结构时要替换相应核对部分,不把本例的−24等解析数值用于其他材料。
提取、转换与重画#
module load ase/3.29.0
python analyze.py work
python plot_results.py work
python check_results.py work
head -n 12 work/analysis/tensor-components.csv
ls work/figures
CSV同时保留原生归一化值、按能量定义的Phi3和解析值;JSON保留完整6×6×6张量、两个步长误差及独立能量差分。查看本文数据时将work改成reference。
函数输入见三阶力常数实操,原生格式参数见官方third_order。