1. 引言
aiida-lammps 是基于 AiiDA 工作流框架开发的 Python 软件包,用于在自动化计算工作流中调用 LAMMPS 分子动力学模拟引擎。它把 LAMMPS 的输入文件生成、任务提交、结果解析和数据结构化存储封装成标准化的 AiiDA 计算节点,让研究者可以以可追溯、可复现的方式批量运行分子动力学模拟。
本文将从功能特性、安装方法、语法与参数、9 个实际应用案例以及常见错误与注意事项五个方面,系统介绍 aiida-lammps 的使用方法。
2. aiida-lammps 核心功能
aiida-lammps 的核心价值在于把 LAMMPS 模拟纳入 AiiDA 的自动化数据管理体系中,主要功能包括以下几个方面。
2.1 输入文件自动生成
aiida-lammps 提供结构化的输入构建方式,用户无需手写完整的 LAMMPS in 文件。它通过 Python 对象描述模拟体系,包括原子类型、力场参数、模拟盒子、系综设置等,再由插件自动生成符合 LAMMPS 语法的输入文件。
2.2 计算任务全生命周期管理
插件负责把计算任务提交到本地或远程计算资源,监控任务状态,并在计算结束后自动收集输出文件。整个过程通过 AiiDA 的进程机制实现,每一步都有完整的日志和 provenance 记录。
2.3 结果自动解析与入库
计算完成后,aiida-lammps 会解析 LAMMPS 输出的 log 文件、dump 文件等,提取能量、温度、压力、原子轨迹等关键数据,并以 AiiDA 节点的形式存入数据库,方便后续查询和比较。
2.4 数据结构化与可复现性
所有输入参数、力场文件、初始结构和计算结果都以数据节点的形式关联存储,形成完整的计算图谱。任何人只要拿到 AiiDA 数据库,就能完整复现每一次模拟。
2.5 批量参数扫描
借助 AiiDA 的工作流能力,aiida-lammps 可以方便地对温度、压力、原子比例等参数进行批量扫描,自动生成并提交大量并行任务。
3. 安装方法
aiida-lammps 的安装分为 Python 包安装、AiiDA 核心安装和插件注册三个步骤。
3.1 环境准备
建议使用 conda 创建独立的 Python 环境,避免依赖冲突。aiida-lammps 需要 Python 3.8 及以上版本。
conda create -n aiida-lammps python=3.9 conda activate aiida-lammps3.2 安装 AiiDA 核心
pip install aiida-core3.3 安装 aiida-lammps 插件
pip install aiida-lammps3.4 初始化 AiiDA 数据库
首次使用需要初始化 AiiDA 的配置文件和数据目录。
verdi setup verdi profile set default3.5 注册插件
安装完成后,插件会自动注册到 AiiDA 中。可以通过以下命令确认插件是否被识别。
verdi plugin list aiida.calculations | grep lammps3.6 安装 LAMMPS 可执行文件
aiida-lammps 本身不包含 LAMMPS 二进制文件,需要单独安装 LAMMPS,并确保其可执行文件在系统 PATH 中,或在 AiiDA 计算资源中正确配置。
conda install -c conda-forge lammps4. 语法与参数详解
aiida-lammps 的使用遵循 AiiDA 的标准模式:先构建输入数据结构,再创建计算节点,最后提交任务。下面介绍核心的语法要素。
4.1 导入模块
from aiida.orm import load_code from aiida.plugins import DataFactory from aiida_lammps.common.parameters import LammpsParameters StructureData = DataFactory('structure') LammpsParameters = DataFactory('lammps.parameters')4.2 构建晶体结构
使用 AiiDA 的 StructureData 描述模拟体系的初始原子构型。
from aiida.orm import StructureData import numpy as np 以铝的面心立方晶胞为例 a = 4.05 # 晶格常数,单位埃 cell = [[a, 0, 0], [0, a, 0], [0, 0, a]] structure = StructureData(cell=cell) structure.append_atom(position=(0, 0, 0), symbols='Al') structure.append_atom(position=(a/2, a/2, 0), symbols='Al') structure.append_atom(position=(a/2, 0, a/2), symbols='Al') structure.append_atom(position=(0, a/2, a/2), symbols='Al')4.3 设置 LAMMPS 参数
LammpsParameters 是插件提供的核心参数容器,用于描述力场、系综、模拟步数等设置。
parameters = LammpsParameters( pair_style='eam', pair_coeff=['* * Al_mm.eam.alloy Al'], units='metal', atom_style='atomic', timestep=0.001, thermostat='nvt', temperature=300, pressure=0, nsteps=10000, dump_rate=1000, dump_file='dump.lammpstrj' )4.4 创建计算节点并提交
from aiida.orm import load_code from aiida.engine import submit from aiida_lammps.calculations.lammps import LammpsCalculation code = load_code('lammps@localhost') builder = LammpsCalculation.get_builder() builder.code = code builder.structure = structure builder.parameters = parameters builder.metadata.options.resources = {'num_machines': 1, 'num_mpiprocs_per_machine': 4} builder.metadata.options.max_wallclock_seconds = 3600 calc = submit(builder) print(f'计算任务已提交,PK = {calc.pk}')4.5 常用参数说明
下表汇总了 aiida-lammps 中常用的参数及其含义。
| 参数名 | 类型 | 说明 | 示例值 |
|---|---|---|---|
| pair_style | str | 定义原子间相互作用势类型 | eam、lj/cut、tersoff |
| pair_coeff | list | 指定势函数参数和元素映射 | ['* * Al_mm.eam.alloy Al'] |
| units | str | 单位制,影响所有物理量 | metal、real、lj |
| atom_style | str | 原子属性定义方式 | atomic、charge、molecular |
| timestep | float | 积分时间步长,单位由 units 决定 | 0.001 |
| thermostat | str | 控温方式 | nvt、npt、nve |
| temperature | float | 目标温度 | 300 |
| pressure | float | 目标压力,用于 npt 系综 | 0 |
| nsteps | int | 总模拟步数 | 10000 |
| dump_rate | int | 轨迹输出频率 | 1000 |
| dump_file | str | 轨迹文件名 | dump.lammpstrj |
5. 九个实际应用案例
下面通过 9 个具体案例展示 aiida-lammps 在不同场景下的应用方式。
案例一:金属晶格常数优化
通过在不同初始晶格常数下运行 NPT 系综模拟,找到能量最低的平衡晶格常数。
from aiida.orm import StructureData from aiida.plugins import DataFactory from aiida.engine import submit from aiida_lammps.calculations.lammps import LammpsCalculation LammpsParameters = DataFactory('lammps.parameters') def run_lattice_optimization(lattice_constant): cell = [[lattice_constant, 0, 0], [0, lattice_constant, 0], [0, 0, lattice_constant]] structure = StructureData(cell=cell) structure.append_atom(position=(0, 0, 0), symbols='Al') structure.append_atom(position=(lattice_constant/2, lattice_constant/2, 0), symbols='Al') structure.append_atom(position=(lattice_constant/2, 0, lattice_constant/2), symbols='Al') structure.append_atom(position=(0, lattice_constant/2, lattice_constant/2), symbols='Al') parameters = LammpsParameters( pair_style='eam', pair_coeff=['* * Al_mm.eam.alloy Al'], units='metal', atom_style='atomic', timestep=0.001, thermostat='npt', temperature=300, pressure=0, nsteps=5000 ) return structure, parameters 对多个晶格常数批量提交 for a in [3.95, 4.00, 4.05, 4.10, 4.15]: structure, parameters = run_lattice_optimization(a) builder = LammpsCalculation.get_builder() builder.code = load_code('lammps@localhost') builder.structure = structure builder.parameters = parameters builder.metadata.options.resources = {'num_machines': 1, 'num_mpiprocs_per_machine': 4} submit(builder)案例二:液态氩的径向分布函数计算
使用 Lennard-Jones 势模拟液态氩,计算径向分布函数 g(r) 以分析其微观结构。
from aiida.orm import StructureData from aiida.plugins import DataFactory LammpsParameters = DataFactory('lammps.parameters') 构建 1000 个氩原子的无序初始结构 structure = StructureData(cell=[[50, 0, 0], [0, 50, 0], [0, 0, 50]]) import random random.seed(42) for i in range(1000): pos = (random.uniform(0, 50), random.uniform(0, 50), random.uniform(0, 50)) structure.append_atom(position=pos, symbols='Ar') parameters = LammpsParameters( pair_style='lj/cut 10.0', pair_coeff=['* * 0.0103 3.40'], units='real', atom_style='atomic', timestep=1.0, thermostat='nvt', temperature=85, nsteps=20000, dump_rate=1000, dump_file='dump.lammpstrj', compute_rdf=True, rdf_bins=200, rdf_cutoff=10.0 )案例三:聚合物链的拉伸模拟
构建一条聚乙烯链,施加拉伸应变,观察应力-应变响应。
from aiida.orm import StructureData from aiida.plugins import DataFactory LammpsParameters = DataFactory('lammps.parameters') 构建聚乙烯链(简化模型,仅示意) structure = StructureData(cell=[[100, 0, 0], [0, 30, 0], [0, 0, 30]]) 沿 x 方向排列碳原子,间隔 1.54 埃 for i in range(50): x = i * 1.54 structure.append_atom(position=(x, 0, 0), symbols='C') structure.append_atom(position=(x, 0, 0), symbols='H') structure.append_atom(position=(x, 0, 0), symbols='H') parameters = LammpsParameters( pair_style='pcff', units='real', atom_style='molecular', timestep=0.5, thermostat='npt', temperature=300, pressure=0, nsteps=50000, fix_deform='x erate 0.001', dump_rate=5000, dump_file='polymer_stretch.lammpstrj' )案例四:纳米压痕模拟
模拟金刚石压头压入铜表面的过程,分析载荷-位移曲线。
from aiida.orm import StructureData from aiida.plugins import DataFactory LammpsParameters = DataFactory('lammps.parameters') 构建铜基底(面心立方,多层) a = 3.61 structure = StructureData(cell=[[20a, 0, 0], [0, 20a, 0], [0, 0, 10*a]]) for i in range(20): for j in range(20): for k in range(10): x = i * a y = j * a z = k * a structure.append_atom(position=(x, y, z), symbols='Cu') structure.append_atom(position=(x + a/2, y + a/2, z), symbols='Cu') structure.append_atom(position=(x + a/2, y, z + a/2), symbols='Cu') structure.append_atom(position=(x, y + a/2, z + a/2), symbols='Cu') parameters = LammpsParameters( pair_style='eam', pair_coeff=['* * Cu_mm.eam.alloy Cu'], units='metal', atom_style='atomic', timestep=0.001, thermostat='nve', nsteps=100000, fix_indent='indenter sphere 0 0 50 10', indent_velocity=0.01, dump_rate=1000, dump_file='indent.lammpstrj' )案例五:水分子团簇的蒸发模拟
模拟水分子团簇在真空中的蒸发过程,统计蒸发速率。
from aiida.orm import StructureData from aiida.plugins import DataFactory LammpsParameters = DataFactory('lammps.parameters') 构建水分子团簇(TIP4P 模型) structure = StructureData(cell=[[100, 0, 0], [0, 100, 0], [0, 0, 100]]) 在中心放置 100 个水分子(简化示意) for i in range(100): import random cx, cy, cz = random.uniform(45, 55), random.uniform(45, 55), random.uniform(45, 55) structure.append_atom(position=(cx, cy, cz), symbols='O') structure.append_atom(position=(cx + 0.96, cy, cz), symbols='H') structure.append_atom(position=(cx - 0.96, cy, cz), symbols='H') parameters = LammpsParameters( pair_style='lj/cut/coul/long 10.0', pair_coeff=['* * 0.0 0.0', 'O O 0.1553 3.166', 'H H 0.0 0.0'], units='real', atom_style='charge', timestep=1.0, thermostat='nvt', temperature=350, nsteps=100000, dump_rate=1000, dump_file='water_evap.lammp《动手学PyTorch建模与应用:从深度学习到大模型》是一本从零基础上手深度学习和大模型的PyTorch实战指南。全书共11章,前6章涵盖深度学习基础,包括张量运算、神经网络原理、数据预处理及卷积神经网络等;后5章进阶探讨图像、文本、音频建模技术,并结合Transformer架构解析大语言模型的开发实践。书中通过房价预测、图像分类等案例讲解模型构建方法,每章附有动手练习题,帮助读者巩固实战能力。内容兼顾数学原理与工程实现,适配PyTorch框架最新技术发展趋势。