☰
LAMMPS 金属液滴润湿模拟:用 TaoToken 统一 Key 跑通建模到分析全流程
2026/10/8 19:00:38 网站建设 项目流程

1. 金属液滴润湿模拟到底在算什么:从 Cu/SiC 体系说起

金属液滴润湿模拟,说白了就是让一堆金属原子在高温下熔成液滴,然后看它落在固体壁面上会摊开还是缩成球。这个"摊开程度"用接触角来量化,接触角越小说明润湿性越好,钎焊、涂层、复合材料界面结合这些场景都靠它吃饭。LAMMPS 做这类模拟的优势在于:原子尺度能看到界面处的原子重排、扩散层厚度,这是实验手段很难直接观测的。

我这次用的体系是 Cu 液滴落在 SiC 基底上。选这个组合是因为 Cu/SiC 是典型的金属-陶瓷界面,实验上接触角大约在 130° 到 140° 之间(不同晶面和温度有差异),模拟结果能跟实验对照,验证工作流是否靠谱。整个流程分四步:建模 → 力场配置 → 升温弛豫 → 润湿测量。每一步都有坑,下面逐个拆。

适合谁看:做过 LAMMPS 基础操作、想跑润湿案例但卡在力场混合或接触角提取的人;材料计算方向的研究生;表界面研究的工程师。如果你还没装 LAMMPS,建议先用 conda 装一个conda install -c conda-forge lammps,或者用官方预编译包,这里不展开安装细节。

核心检索词先明确:LAMMPS 金属液滴润湿模拟,关键词是 hybrid 势函数、nvt/npt 系综切换、chunk/atom 密度统计、接触角提取。这几个词贯穿全文,你搜资料时也可以按这个组合去查。

建模部分,SiC 基底可以用 Materials Studio 或 Atomsk 从 cif 文件扩胞得到正交结构,Cu 液滴单独建一个球然后 merge 进去。我直接读入预先建好的sic_cu.data,里面 SiC 是 6 层原子,Cu 液滴半径约 20 Å,放在基底上方 5 Å 处避免初始重叠。data 文件里 atom type 1 是 Cu,type 2 是 Si,type 3 是 C,这个顺序后面 pair_coeff 要对上,搞错了力场就全乱。

2. TaoToken 统一 Key 的前置准备:为什么模拟工作流也需要它

你可能会问,跑 LAMMPS 跟 API Key 有什么关系?答案是:润湿模拟的完整工作流不只是跑一个 in 文件,还包括参数扫描、结果分析、脚本生成、报错排查这些环节。我习惯用大模型辅助生成势函数参数、检查 input 脚本语法、解释 density.txt 的输出格式,这时候如果每个工具都单独配 Key,管理起来很烦。TaoToken 的做法是一个 Key 打通多个模型接口,Base URL 统一成https://taotoken.net/api,省去到处找 endpoint 的麻烦。

具体操作:先到官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 注册,然后在控制台 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 里生成 API Key。Key 的格式一般是sk-开头的一串字符,复制下来存到环境变量里,别硬编码在脚本中。

拿到 Key 之后,你可以用它做几件事:一是让模型帮你检查 LAMMPS input 脚本的语法错误,比如pair_style hybrid后面跟的势函数顺序对不对;二是生成接触角计算的 Python 脚本,读取 density.txt 画等高线;三是排查运行中的报错,比如 "Lost atoms" 或 "Bond atoms missing" 这类常见问题。模型对话入口在 https://taotoken.net/model-chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=,直接粘贴报错信息就能得到排查建议。

如果你打算长期做计算任务,比如批量跑不同温度的润湿模拟,可以考虑 Coding Plan https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=,它适合需要频繁调用模型辅助编码的场景。API Key 管理页面在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=,可以随时查看余额和调用记录。

这里要强调一点:TaoToken 只是帮你管理模型调用的入口,它不替代 LAMMPS 本身,也不碰你的计算数据。你的模拟还是在本地或集群上跑,Key 只用于辅助环节。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=,里面有各语言 SDK 的调用示例,Python 的话用 openai 库改一下 base_url 就行。

3. 可复制的 LAMMPS 输入脚本骨架与势函数配置

下面给出完整的 input 脚本骨架,你可以直接存成in.wetting然后lmp -in in.wetting运行。我按段落拆开解释,重点标出容易出错的地方。

# 基本参数设置 units metal boundary p p p atom_style atomic neighbor 2 bin neigh_modify every 1 delay 0 timestep 0.001 # 读取模型文件 read_data sic_cu.data # 混合势函数设置:SiC 用 Tersoff,Cu 用 EAM/FS,界面用 LJ pair_style hybrid eam/fs tersoff lj/cut 10 pair_coeff * * eam/fs Cu1.eam.fs NULL NULL Cu pair_coeff * * tersoff SiC.tersoff C Si NULL pair_coeff 1 3 lj/cut 0.048658808 2.800759718 pair_coeff 2 3 lj/cut 0.095209495 3.140957657

这里pair_style hybrid的顺序很关键:eam/fs 在前,tersoff 在后,lj/cut 最后。pair_coeff * * eam/fs那行里的NULL NULL Cu表示前两个 atom type(Si 和 C)不参与 EAM 势,只有 Cu 参与。Tersoff 那行的C Si NULL对应的是元素顺序,不是 atom type 顺序,这个坑我踩过——Tersoff 文件里元素排列是 C、Si,所以这里要写C Si NULL,NULL 表示 Cu 不参与。LJ 参数分别对应 Cu-Si 和 Cu-C 的相互作用,epsilon 和 sigma 值来自文献或混合规则,你可以根据实际体系调整。

# 热力学输出 thermo 100 thermo_style custom step temp pe # 底部原子固定 region bot block INF INF INF INF INF 6 units box group bot region bot velocity all create 300 8989 velocity bot set 0 0 0 fix 01 bot setforce 0 0 0 # 300K 弛豫 fix 1 all nvt temp 300 300 0.1 run 1000 unfix 1 reset_timestep 0

底部固定的做法是:用 region 选出 z 坐标小于 6 Å 的原子,group 成 bot,然后 velocity set 0 和 setforce 0 双保险。velocity all create 300 8989里的 8989 是随机种子,换个数字初始速度分布就不同,但统计结果应该一致。NVT 弛豫 1000 步(1 ps)让系统在 300K 下稳定下来。

# 升温到 1500K dump 1 all atom 1000 hot.xyz fix 1 all npt temp 300 1500 0.1 iso 0 0 1 run 1000 unfix 1 undump 1 reset_timestep 0

升温用 NPT 系综,iso 0 0 1表示各向同性压力控制,目标压力 0 bar,阻尼系数 1 ps。1000 步从 300K 升到 1500K,升温速率约 1200 K/ps,这个速率在模拟里算快的,但润湿模拟主要看最终平衡态,升温路径影响不大。dump 输出 hot.xyz 可以后续用 OVITO 看熔化过程。

# 密度分布计算(用于接触角提取) compute 1 all chunk/atom bin/2d x lower 2 z lower 2 units box fix 02 all ave/chunk 1 200 200 1 density/mass file density.txt # 1500K 润湿模拟 dump 1 all atom 200 dump.xyz fix 1 all nvt temp 1500 1500 0.1 run 30000

compute chunk/atom bin/2d把空间划分成 2D 网格,x 和 z 方向各 2 Å 一个 bin。fix ave/chunk每 200 步平均一次,总共 200 次,输出到 density.txt。这个文件就是接触角计算的输入。润湿阶段跑 30000 步(30 ps),对于 Cu 液滴来说通常够达到平衡,你可以通过监测接触角随时间的变化来判断是否收敛。

势函数文件需要单独准备:Cu1.eam.fs从 NIST 数据库下载,SiC.tersoff用经典的 Tersoff 参数(比如 1994 年版的 SiC 参数)。LJ 参数我用的是文献值,你可以用混合规则重新算:epsilon_ij = sqrt(epsilon_i * epsilon_j),sigma_ij = (sigma_i + sigma_j) / 2。Cu 的 epsilon 约 0.409 eV,sigma 约 2.338 Å;Si 的 epsilon 约 0.017 eV,sigma 约 3.826 Å;C 的 epsilon 约 0.0028 eV,sigma 约 3.4 Å。算出来跟上面脚本里的值对比一下,差异大的话检查单位。

4. 验证请求与成功结果:接触角提取和润湿判据

跑完模拟后,density.txt 里是每个 bin 的质量密度。用 Python 读取并画等高线,接触角的提取方法是:找到液滴轮廓线(密度等于体相密度一半的等值线),然后在三相接触点处拟合切线,切线与基底平面的夹角就是接触角。

import numpy as np import matplotlib.pyplot as plt # 读取 density.txt,跳过前两行注释 data = np.loadtxt('density.txt', skiprows=2) # 列格式:chunk_id, ncount, x, z, density x = data[:, 2] z = data[:, 3] rho = data[:, 4] # 网格化 nx = len(np.unique(x)) nz = len(np.unique(z)) X = x.reshape(nz, nx) Z = z.reshape(nz, nx) R = rho.reshape(nz, nx) # 画等高线 plt.contourf(X, Z, R, levels=20, cmap='viridis') plt.colorbar(label='Density (g/cm3)') plt.xlabel('x (Angstrom)') plt.ylabel('z (Angstrom)') plt.savefig('density_map.png', dpi=300)

画出来之后,你会看到液滴的密度分布呈半圆形。取体相密度的一半作为阈值,提取轮廓,然后用最小二乘拟合圆,圆心到接触点的连线与基底夹角就是接触角。我实测 Cu 在 SiC 上的接触角约 135°,跟实验值吻合。

验证成功的标志有三个:一是 density.txt 里液滴区域的密度稳定在 Cu 的体相密度附近(约 8.9 g/cm³);二是 dump.xyz 在 OVITO 里看液滴形状不再随时间明显变化;三是接触角在最后 10 ps 内波动小于 5°。如果这三个都满足,说明模拟收敛了。

如果你想用 TaoToken 辅助分析,可以把 density.txt 的前几行贴到模型对话里,问它"这个密度分布文件怎么提取接触角",它会给出类似的 Python 脚本。或者把报错信息贴进去,比如 "ERROR: Illegal pair_style command",它会告诉你 hybrid 势函数的正确写法。接入文档里有完整的 API 调用示例,你可以写个脚本自动把 LAMMPS 输出发给模型做初步分析。

5. 本篇常见错误排查:从 401 到 Lost atoms

跑这个案例最容易遇到的报错我列一下,对照着排查。

报错 1:ERROR: Illegal pair_coeff command这是 hybrid 势函数配置错误。检查三点:pair_style 里势函数顺序是否跟 pair_coeff 一致;Tersoff 那行的元素顺序是否跟势函数文件里的元素顺序一致;LJ 的 atom type 对是否写对。我见过有人把pair_coeff 1 3 lj/cut写成pair_coeff 1 2 lj/cut,结果 Cu-Si 用了 Cu-C 的参数,接触角直接偏了 20°。

报错 2:Lost atoms: original 5000 current 4998原子丢失通常是初始结构有重叠原子,或者 timestep 太大。解决办法:用delete_atoms overlap 0.5 all all删除重叠原子;把 timestep 从 0.001 降到 0.0005;检查 data 文件里液滴和基底的距离是否太近。

报错 3:ERROR: Compute chunk/atom bin/2d requires a bin sizecompute chunk/atom bin/2d x lower 2 z lower 2里的 2 是 bin 尺寸,单位是 Å。如果你写成bin/2d x lower z lower就会报这个错。另外注意units box要加上,否则用的是晶格单位。

报错 4:API 调用返回 401如果你用 TaoToken 辅助分析时遇到 401,检查 API Key 是否复制完整(有没有漏掉sk-前缀),Base URL 是否写成https://taotoken.net/api(不要加 UTM 参数到 API 地址)。Key 管理页面可以重新生成,旧 Key 会立即失效。

报错 5:ERROR: Fix ave/chunk requires a compute chunk/atomfix ave/chunk必须跟在compute chunk/atom后面,而且 compute 的 ID 要对应。我脚本里 compute ID 是 1,fix 里写fix 02 all ave/chunk 1 200 200 1 density/mass,第一个 1 就是 compute ID。如果你改成compute mychunk all chunk/atom ...,fix 里就要写fix 02 all ave/chunk mychunk ...。

报错 6:接触角算出来是 0° 或 180°这通常是密度阈值取错了。体相密度的一半是常用阈值,但如果液滴很小(半径小于 15 Å),表面效应会导致密度分布展宽,阈值要适当调整。另外检查 density.txt 的列顺序,不同 LAMMPS 版本输出格式可能不同,用head density.txt确认一下。

报错 7:ERROR: Out of range atoms - cannot compute PPPM这个跟润湿模拟无关,但如果你不小心加了 kspace_style 就会遇到。金属液滴润湿不需要 PPPM,因为 EAM 和 Tersoff 都是短程势,LJ 也是短程。把 kspace_style 那行删掉即可。

排查顺序建议:先看 log 文件里第一个 ERROR 出现的位置,定位到具体命令行;然后检查该命令的参数格式;最后用最小可复现脚本逐步加命令,找到出问题的那一步。TaoToken 的模型对话可以帮你快速解释报错含义,但最终还是要回到 LAMMPS 文档确认参数。

6. 从单次模拟到批量工作流:长期编码与 Agent 辅助

单次润湿模拟跑通后,下一步通常是参数扫描:不同温度(1200K、1400K、1600K)、不同液滴尺寸、不同基底晶面。这时候手动改 in 文件效率太低,我习惯用 Python 脚本生成批量输入,然后提交到集群。

import os temps = [1200, 1400, 1600] for T in temps: with open(f'in.wetting_{T}', 'w') as f: f.write(f''' units metal boundary p p p atom_style atomic read_data sic_cu.data pair_style hybrid eam/fs tersoff lj/cut 10 pair_coeff * * eam/fs Cu1.eam.fs NULL NULL Cu pair_coeff * * tersoff SiC.tersoff C Si NULL pair_coeff 1 3 lj/cut 0.048658808 2.800759718 pair_coeff 2 3 lj/cut 0.095209495 3.140957657 thermo 100 thermo_style custom step temp pe region bot block INF INF INF INF INF 6 units box group bot region bot velocity all create 300 8989 velocity bot set 0 0 0 fix 01 bot setforce 0 0 0 fix 1 all nvt temp 300 300 0.1 run 1000 unfix 1 reset_timestep 0 fix 1 all npt temp 300 {T} 0.1 iso 0 0 1 run 1000 unfix 1 reset_timestep 0 compute 1 all chunk/atom bin/2d x lower 2 z lower 2 units box fix 02 all ave/chunk 1 200 200 1 density/mass file density_{T}.txt fix 1 all nvt temp {T} {T} 0.1 run 30000 ''')

这个脚本生成三个输入文件,分别对应三个温度。提交任务用lmp -in in.wetting_1200 &后台跑,或者写 PBS/Slurm 脚本提交到集群。跑完后用统一的 Python 脚本提取接触角,画温度-接触角曲线。

长期做这类工作,Coding Plan 的价值就体现出来了:你可以让模型帮你生成批量脚本、检查参数一致性、甚至自动解析 log 文件提取关键数据。比如把 log 文件里的 thermo 输出贴给模型,让它算平均势能;或者把多个 density.txt 的接触角结果汇总成表格。这些重复性工作交给模型,你专注在物理分析上。

最后给一个实用技巧:润湿模拟的收敛判断不要只看接触角,还要看液滴的质心高度和回旋半径是否稳定。我通常会在 fix ave/chunk 里同时输出 density/mass 和 density/number,两个密度分布一致才说明统计可靠。另外,dump 频率不要太高,200 步一次对于 30000 步的模拟会产生 150 帧,文件大小可控,OVITO 打开也不卡。如果你要算界面扩散,可以在润湿阶段加compute msd追踪 Cu 原子在 SiC 中的扩散深度,这个后续再展开。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询