限时福利领取


背景痛点:为什么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 kPa
  • electron: 1 Ha/Bohr³ ≈ 294.21 GPa
  • si: 直接使用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大单位陷阱

  1. 温度单位混淆metaltemp实际是kB*T(单位eV),需用compute temp获取真实温度
  2. 弹性常数单位elastic命令输出的模量单位是eV/ų,需乘以160.217转为GPa
  3. 应力应变输出compute stress/atom结果需要同样换算
  4. 时间步长误解metal下1时间单位≈1 fs,但实际与质量单位相关
  5. 混合单位危险:同时使用metalreal单位会导致数据灾难

单位换算对照表

思考题延伸

对于非正交晶系(如六方晶格),应力张量输出需要额外考虑基矢变换。你知道如何用LAMMPScompute stress/atom结合Voigt记号转换吗?欢迎在评论区讨论你的解决方案!

(提示:需要用到rotate命令和矩阵变换)

Logo

音视频技术社区,一个全球开发者共同探讨、分享、学习音视频技术的平台,加入我们,与全球开发者一起创造更加优秀的音视频产品!

更多推荐