LAMMPS 中随机替换原子
在使用 LAMMPS 构建模型时,有时需要在主组分原子中随机替换为其他种类原子。比如 Fe 的 10×20×30 晶格中 15% Ni 被替换,可以通过以下方式进行替换。以下使用的脚本和文件见百度云盘,提取码 ei4i。推荐使用 LAMMPS 内建
shell+Python
命令替换。
set type/fraction 命令
set type/fraction
是 LAMMPS
的内建命令,可以指定选中类型的原子一部分为另一种原子,用法如下:
1 | set type type-1-ID type/fraction type-2-ID fraction seed |
以上表示type-1-ID
类型的原子中有fraction
比例被替换成type-2-ID
类型原子。比如我们实现上述
Fe 晶格中部分被替换成 Ni,LAMMPS 脚本(test.in)如下:
1 | ##### 初始化(Initialization) |
打开日志文件(test.lammps),我们发现总原子数为 12000,然而 Ni 原子数为1837,所以,set type/fraction 不能精确替换原子。
对 data 文件进行文本操作
该方式操作自由度高,甚至任意更改任意原子的属性。但对于比较大的 data 文件,通过其它软件处理缓慢。此处采用 Matlab 软件处理 data 文件。如下所示,最简单 data 文件(test1.data)格式如下:
现在我们要把Atom # atomic
中部分原子的 type 替换为
2。思路如下:
- 从 data 文件中获取总原子数
- 设定替换比例,计算替换原子数,随机从所有原子 ID 中选取替换原子数量的 ID
- 读取 data 文件,将上一步选取的 ID 的原子类型更改为 2
Matlab 处理脚本(test.m)如下:
1 | clear; close all; clc; |
相关的 Matlab
的命令有fopen, fgetl, fgets, fprintf, strsplit, randperm
等。在替换部分原子
type
时,虽然我们可以一次性读取所有原子数据到矩阵,即Atom # atomic
和Velocities
之间的数据,但如果
data
文件有几百兆,则可能爆内存。建议逐行读取,虽然缓慢,但起码还可以处理文件。
调用shell
命令
LAMMPS
内建shell
命令,可以调用外部命令执行外部脚本,如调用 Python
程序取随机数组。由于可以把替换比例等参数直接加入 LAMMPS
脚本中,因此可以快速生成多个替换比例的
data文件,这种方式大大提高建模的效率,尤其是 data 文件超大(>
1G)时该方式是唯一准确有效的替换方式,极力推荐。思路如下:
- 利用 LAMMPS 自带命令(
lattice
等)构建未替换模型 - 设置替换比例变量(
variable
),计算总原子数,将替换比例和总原子数通过shell
命令导出文本 - 利用
shell
命令调用 Python,通过 Python 脚本将替换的原子 ID 导出文本 - 利用
shell
命令将替换的原子 ID 分组(group
) - 设定上一步分组的原子类型
LAMMPS 脚本(test3.in)如下,其中 Natoms.txt 是导出文本:
1 | log test3.lammps |
Python 脚本(test.py)如下,该脚本根据 LAMMPS 中导出的含原子数量和替换比例的文件 ID.txt,随机选取替换原子 ID,再将原子 ID 导出文本。
1 | # -*- coding: utf-8 -*- |