HyperAI超神经

LAMMPS:以单晶铝为例,模拟材料单轴拉伸

LAMMPS(Large-scale Atomic/Molecular Massively Parallel Simulator)是一种经典的分子动力学仿真代码,专注于材料建模。它旨在在并行计算机上高效运行,并且易于扩展和修改。 LAMMPS 最初由美国能源部机构桑迪亚国家实验室开发,现在包括来自许多机构的许多研究小组和个人的贡献。 LAMMPS 的大部分资金来自美国能源部(DOE)。 LAMMPS 是根据 GNU 公共许可证版本 2(GPLv2)的条款分发的开源软件。

一、教程内容

在本次教程中,我们通过改变材料的晶格常数,实现模拟对施加材料单轴应变的情况,后续再计算并绘制材料的应变应力曲线。通过本教程的学习您将学会:

  1. 使用 npt 让系统结构达到弛豫
  2. 使用 fix 结合 variable 命令改变晶格常数
  3. 使用 compute 命令计算系统应力
1

二、输入文件

  • Al99.eam.alloy  材料的 eam 势
  • in.txt  输入文件
  • pl.py  绘制图像脚本

三、输入文件解析

系统初始化与基础设置

units metal               # 采用金属单位制(长度:Å,时间:ps,质量:g/mol,能量:eV 等)
dimension 3               # 三维空间模拟
boundary p p p            # 三个方向均为周期性边界条件(模拟无限大晶体)
atom_style atomic         # 原子类型为「基本原子」,仅包含位置和类型信息
variable latparam equal 4.05  # 定义铝的晶格常数为 4.05Å(FCC 铝的典型值)

原子结构构建

lattice  fcc ${latparam} orient x 1 0 0 orient y 0 1 0 orient z 0 0 1  # 定义 FCC 晶格
# 晶格常数为 ${latparam},晶向沿 x[100] 、 y[010] 、 z[001](标准笛卡尔坐标系)

region whole block 0 10 0 10 0 10  # 定义模拟区域:一个立方体,在 x 、 y 、 z 方向各包含 10 个晶格常数长度 
create_box 1 whole # 创建容纳原子的「盒子」,仅包含 1 种原子类型,边界为上述 region 定义的范围
create_atoms 1 region whole # 在盒子内填充类型为 1 的原子,按 FCC 晶格排列

原子间相互作用势设置

pair_style eam/alloy  # 采用嵌入原子法(EAM)合金势描述原子间相互作用(适合金属体系)
pair_coeff * * Al99.eam.alloy Al  # 配置势函数参数:
                                  # - 第一个*:所有原子类型(此处仅 1 种)
                                  # - 第二个*:所有原子类型的相互作用
                                  # - Al99.eam.alloy:势函数文件(预训练的铝势)
                                  # - Al:指定原子类型 1 对应元素为铝

计算量定义(用于后续分析)

compute csym all centro/atom fcc  # 计算每个原子的中心对称参数(用于识别 FCC 结构完整性,缺陷处会偏离)
compute peratom all pe/atom       # 计算每个原子的势能(用于分析能量分布)

平衡模拟阶段(消除初始应力,达到稳定状态)

reset_timestep 0  # 重置时间步计数器为 0(平衡阶段作为新起点)
timestep 0.001    # 时间步长为 0.001ps(即 1fs,金属模拟常用精度)

#初始化原子速度:温度 300K(室温),随机种子 12345,消除整体动量(mom yes)和旋转(rot no)
velocity all create 300 12345 mom yes rot no #施加 NPT 系综(恒温、恒压、恒粒子数)进行平衡:
#- temp 300 300 1:温度维持 300K,热浴阻尼系数 1(单位:ps)
#- iso 0 0 1:各向同性压力控制,目标压力 0bar,压力阻尼系数 1(单位:ps)
#- drag 1:原子运动阻尼系数(用于稳定系综)
fix 1 all npt temp 300 300 1 iso 0 0 1 drag 1 #热力学输出设置:
thermo 1000 #每 1000 步输出一次热力学信息
thermo_style custom step lx ly lz press pxx pyy pzz pe temp #输出内容:
#步数、盒子尺寸(x/y/z)、总压力、压力张量分量、势能、温度 run 20000 #运行 20000 步平衡模拟(总时间 20000×0.001ps=20ps)
unfix 1 #平衡结束,移除 NPT 约束
#记录平衡后的 x 方向盒子长度(用于后续计算应变)
variable tmp equal "lx" #临时变量存储当前 x 方向长度
variable L0 equal ${tmp} #定义 L0 为初始长度(拉伸前的平衡长度)
print "Initial Length, L0: ${L0}" #输出初始长度,便于验证

单轴拉伸变形阶段

reset_timestep 0  #重置时间步计数器为 0(拉伸阶段作为新起点)

#重新施加 NPT 系综,但仅控制温度和横向压力:
#- temp 300 300 1:维持温度 300K
#- y 0 0 1 z 0 0 1:y 和 z 方向压力保持 0bar(横向自由,模拟单轴拉伸)
fix 1 all npt temp 300 300 1 y 0 0 1 z 0 0 1 drag 1 #定义拉伸速率:
variable srate equal 1.0e10 #应变速率为 1e10 /s(分子动力学常用高应变速率,远高于实验)
variable srate1 equal "v_srate / 1.0e12" #转换为 LAMMPS 单位(应变速率单位:ps⁻¹,1e10/s = 1e-2 ps⁻¹)
#施加 x 方向拉伸变形:
#- deform 1 x:沿 x 方向变形,变形组为 1(所有原子)
#- erate ${srate1}:按上述应变速率拉伸
#- units box:变形基于盒子尺寸
#- remap x:原子坐标随盒子拉伸同步更新(避免原子「跑出」盒子)
fix 2 all deform 1 x erate ${srate1} units box remap x

拉伸过程数据输出

#定义应变和应力变量:
variable strain equal "(lx - v_L0)/v_L0"  #工程应变 =(当前 x 长度 - 初始长度)/ 初始长度
variable p1 equal "v_strain"              #p1 对应工程应变(无量纲)
variable p2 equal "-pxx/10000"            #x 方向应力(GPa):pxx 为 LAMMPS 内置压力张量(单位 bar),负号转为拉应力,除以 10000 转换为 GPa
variable p3 equal "-pyy/10000"            #y 方向应力(GPa)
variable p4 equal "-pzz/10000"            #z 方向应力(GPa)

#输出应变-应力数据到文件:
#- 每 100 步输出一次 p1(应变)、 p2(x 应力)、 p3(y 应力)、 p4(z 应力)
#- 保存到 Al_tens_100.def1.txt,不在屏幕显示
fix def1 all print 100 "${p1} ${p2} ${p3} ${p4}" file Al_tens_100.def1.txt screen no #输出原子轨迹文件(用于可视化):
#- 每 100 步保存一次,文件名为 md.lammpstrj
#- 包含原子 ID 、类型、 x/y/z 坐标
dump trace all custom 100 md.lammpstrj id type x y z #热力学信息输出设置:
thermo 1000 #每 1000 步输出一次
thermo_style custom step v_strain temp v_p2 v_p3 v_p4 ke pe press #输出步数、应变、温度、三方向应力、动能、势能、总压力
run 30000 #拉伸阶段运行 30000 步(总时间 30ps,累积应变约 0.3)

模拟结束

print "All done"  # 输出完成信息,提示模拟结束

四、上手模拟

1. 克隆本容器后进入容器设置
2. 待加载完毕后打开工作空间
3. 随后打开终端
4. 输入以下命令运行 lammps
mpirun --allow-run-as-root -np 2 lmp -sf gpu -pk gpu 1 < in.txt 

五、文件输出

  • Al_tens_100.def1.txt:应变 – 应力曲线数据,可用于分析弹性模量、屈服强度等力学性能。
  • md.lammpstrj:原子轨迹文件,可通过 VMD 、 Ovito 等软件可视化拉伸过程中的晶体结构演变

六、绘制应变-应力图像

1. 在终端输入以下命令
python pl.py
2. 打开绘制的图片
3. 可以得到曲线
aluminum_stress_strain