在上期教程中,我们尝试了自编程,根据实验或者DFT计算获得的数值来拟合一个eam势函数,那么在这期教程中,我们将介绍一个成熟的开源软件——potfit,使用它来拟合一个单元素或者多元素合金的eam势函数。
首先我们需要去github上面下载他的源代码:
https://github.com/potfit/potfit
然后又到了我们喜闻乐见的新手噩梦环节——源代码编译。不过说实话,potfit代码量不是很大,依赖库也仅有lapack或者mkl,编译难度并不算多高。官网地址:
https://potfit.net/wiki/doku.php?id=start
不过另一个坏消息就是potfit的编译方法虽然在官网有非常详细的教程,但是这个网址依托国外服务器,如果不用点特殊手段没法上去,此外,potfit的使用手册也是在这个官网上的。不过这些都是小问题,这期教程我首先带大家来编译一下这个potfit。
首先potfit使用的是一个名为waf的轻量级的python3脚本来替代CMake的作用,来自动生成符合当前环境的Makefile。此外还通过pkg-config来搜索动态库的安装位置。pkg-config不是Ubuntu默认自带的,但是可以通过如下命令安装:
sudo apt updatesudo apt install pkg-config
如果同学们使用的是Ubuntu系统,那么Ubuntu会自带一个python3解释器,就不需要额外配置了,如果是其他的Linux发行版,安装python3的教程也一抓一大把,这里不再赘述。
然后在potfit的运行过程中会涉及大量的线性代数运算,所以需要链接一个线性代数库,potfit提供的选择是lapack和intel mkl库,这里建议同学们如果使用的是intel的CPU那就使用intel的MKL库,速度和性能都相当的一流。amd的cpu也可以用mkl库,只是性能上会有部分损失。关于MKL库的安装,之前我有一期教程讲过:
https://mp.weixin.qq.com/s/HZ0dAaOHOtw83xuKPfaoDQ
那么安装完potfit唯一一个外部库之后,接下来就是使用waf这个脚本来构建Makefile了。同学们如果从GitHub上下载了potfit的源代码,并进入其根目录就会看到如下的文件结构:
potfit为用户提供了很多的编译选项,其中比较重要的有两点,一点就是是否开启MPI并行,这个很好理解,就是是否使用MPI并行嘛,这个建议是开启,如果我们想要做出一个足够精确能用的eam势函数,那么我们需要的计算量是非常非常大的,所以使用MPI并行可以有效的提高我们的研究效率。
第二个建议开启的编译选项就是是否在拟合势函数过程中考虑模型的virial应力。这个选项我认为非常重要,因为用eam势函数的不说100%,起码有70%的同学是用它来研究金属的力学性能,而计算过程中virial应力的变化是我们极其关注的一个性质。所以开启virial应力可以极大的提高我们拟合出来的势函数对于力学性能描述精度。
明确了目标之后,我们就需要使用waf来定制不同目标下的Makefile了。
首先是如果你使用的是intel的MKL库,且MKL库的根目录被你安装在了
/opt/intel/oneapi/mkl/下面,当然这个路径也是intel的MKL库的默认安装路径。那么使用如下的命令进行配置:
python3 ./waf configure -i eam -m apot --enable-mpi --enable-stress --math-lib=mkl --math-lib-base-dir=/opt/intel/oneapi/mkl/
如果正确运行,会出现如下提示:
接下来就是编译potfit:
python3 ./waf build
如果没有报错你会看到如下输出:
同时,在bin目录下你会看到一个可执行文件:
这个名字一大串的就是我们刚刚编译出来的potfit可执行程序了。接下来我们就可以用这个可执行程序来拟合eam势函数了。
当然这里补充一点知识就是potfit不仅仅可以用来拟合eam,常见的两体势比如LJ和Morse势都可以拟合,而常见的多体势如tersoff和meam它也可以拟合,只是这些势函数不在我们这篇教程的讨论范围以内,同学们感兴趣可以参考官网手册自行学习。
为了使用potfit来拟合一个eam势函数,我们需要至少准备三个必须的输入文件,他们分别是:
1. 控制拟合过程的输入参数文件。
2. 用于拟合eam势函数的构型文件。
3. 规定初始eam势函数的参数,以及对应参数取值上下限的势函数参数文件。
首先我们来看一下这三个文件中最简单的文件,那就是第一个文件,用于设置拟合过程中的优化迭代参数的输入参数文件,这个文件的文件名可以是任何名字,然后,根据官网教程,以下文本内容是能够满足拟合一个eam势函数文件的最简单的文本:
ntypes 1 # 本次迭代中共需要拟合几种元素config train_set.config # 包含所有训练集的文件名字, 必须startpot dummy.pot # 定义拟合eam势函数的各个参数的初始值和范围的参数文件, 必须tempfile dummy.tmp # 训练过程中的临时输出文件, 必须# general optionswrite_lammps 1 # 要求迭代完成之后输出lammps可以读取的势函数文件lammpspotsteps 2000 # lammps的eam文件中有多少数据点# Minimization optionsopt 1 # 是否开启优化, 1表示开启优化anneal_temp 1000 # 模拟退火算法中的初始温度eng_weight 10 # 能量的权重系数stress_weight 1 # virial应力的权重系数seed 456789 # 随机数种子
文本文件的基本语法很简单,就是每一行开始有个关键字,后面跟着关键字对应的参数,然后支持注释语法, 注释以#开头。
关键字的具体含义和内容可以参考官网:
https://potfit.net/wiki/doku.php?id=parameters
但是说实话,
虽然上面的文本文件内容很少,
我个人认为对于99%的拟合情况都足以适用,不需要添加其他的关键字了,只是需要根据自己的体系对一些参数进行微调。
之后我们来看一下,较为复杂的第二个需要我们准备的文件,那就是用来定义eam势函数的解析表达式以及解析表达式中的参数的初始值和上下限的势函数参数文件。
这个
势函数
参数文件在上述文本文件中通过第三行的startpot关键字定义,即dummy.pot文件。那么,让我们以单元素Al为例,看看这个文件的内容:
#F 0 3#T EAM#C Al## Al-Al Al Al#Eglobal 1h 2.92834910 0.5000 20.0000typem


