LAMMPS中Metal势函数的压力单位解析与实战避坑指南
·
背景痛点:为什么metal单位的压力总让人困惑?
LAMMPS的metal单位制是材料模拟中最常用的体系之一,但新手常遇到这样的问题:明明输出压力显示10000,文献中却写着10 GPa。这是因为metal单位下的压力实际以$\text{eV/Å}^3$为基准(1 eV/ų ≈ 160.217 GPa),而很多人误将输出值直接当作国际单位或atm。

技术解析:metal单位的物理含义
在metal单位制中,压力(pressure)的换算关系为:
$$ 1\ \text{eV/Å}^3 = 160.217\ \text{GPa} = 1,602,177\ \text{atm} $$
与其他单位制的对比:
real: 1 atm = 101.325 kPaelectron: 1 Ha/Bohr³ ≈ 294.21 GPasi: 直接使用Pa国际单位
代码实战:铜晶体NPT模拟示例
# 铜晶体模拟基础设置
units metal
boundary p p p
atom_style atomic
# 创建FCC铜晶格(晶格常数3.615 Å)
lattice fcc 3.615
region box block 0 10 0 10 0 10
create_box 1 box
create_atoms 1 box
# 使用EAM势函数(Cu_u3.eam)
pair_style eam
pair_coeff * * Cu_u3.eam
# NPT系综设置(目标压力0 GPa = 0 eV/ų)
fix mynpt all npt temp 300 300 100 iso 0 0 1000
# 实时单位转换(输出GPa值)
variable press_GPa equal "pext*160.217"
thermo_style custom step temp press v_press_GPa
# 运行模拟
run 10000
关键注释:
- pext是LAMMPS输出的原始压力值(eV/ų)
- v_press_GPa通过乘法因子转换为GPa
验证方法:用理想气体状态方程检查
import numpy as np
# 验证1 eV/ų ≈ 160.217 GPa
kB = 8.617333e-5 # eV/K (metal单位制的玻尔兹曼常数)
T = 300 # 温度(K)
rho = 0.01 # 原子数/ų
pressure_metal = kB * T * rho # 计算结果应为eV/ų
pressure_GPa = pressure_metal * 160.217
print(f"理论值: {pressure_GPa} GPa")
金属模拟中的5大单位陷阱
- 温度单位混淆:
metal的temp实际是kB*T(单位eV),需用compute temp获取真实温度 - 弹性常数单位:
elastic命令输出的模量单位是eV/ų,需乘以160.217转为GPa - 应力应变输出:
compute stress/atom结果需要同样换算 - 时间步长误解:
metal下1时间单位≈1 fs,但实际与质量单位相关 - 混合单位危险:同时使用
metal和real单位会导致数据灾难

思考题延伸
对于非正交晶系(如六方晶格),应力张量输出需要额外考虑基矢变换。你知道如何用LAMMPS的compute stress/atom结合Voigt记号转换吗?欢迎在评论区讨论你的解决方案!
(提示:需要用到rotate命令和矩阵变换)
更多推荐


所有评论(0)