ABACUS计算模拟实例 | IV. 堆垛层错能的计算
©️ Copyright 2023 @ Authors
作者:Jinghang Wang (AISI电子结构团队实习生) 📨
日期:2024-5-30
共享协议:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
快速开始:由于本案例需要比较长的计算时间(使用32核需要4h以上),因此本案例不会要求完成具体计算,只展示输入输出文件以及用到的命令。如果你想进行计算,可点击上方的 开始连接 按钮,选择 abacus:3.6.3-user-guide 镜像及 c32_m64_cpu 节点配置,并在连接后点击右上方的切换内核,选择Bash内核稍等片刻即可运行。
🎯 本教程旨在帮助初学者学习堆垛层错能构型建模以及使用ABACUS自动计算堆垛层错能曲线。
本节教程目录如下:
1. 堆垛层错建模
2. 堆垛层错能计算
3. 广义堆垛层错能曲线
在使用ABACUS进行计算时,所有操作都需要在指定的文件夹目录下进行。我们已经准备好了数据集ABACUS-cases,其中文件夹“4”对应本节教程。
首先我们将数据集中的文件复制到根目录下:
Cu_ONCV_PBE-1.0.upf INPUT cif2STRU.py stacking_fault.sh Cu_fcc_energy.csv OUT.ABACUS model.sh structure Cu_gga_8au_100Ry_4s2p2d1f.orb SFE.jpg result
1. 堆垛层错建模
铜是一种具有具有很高的延展性和可塑性的优良的导电和导热材料。由于其优良的导电性,铜是电线、电缆和电气设备中最常用的材料之一。同时,铜也是许多重要合金(如黄铜和青铜)的主要成分,广泛应用于机械制造和船舶业中,是现代工业不可或缺的重要材料。
在晶体学领域,堆垛层错是晶体材料中可能出现的平面缺陷,堆垛层错能等于形成完整堆垛层错的完美晶格晶体的能量变化。堆垛层错通常处于较高能量状态,可能在晶体生长过程中产生或由塑性变形引起。低层错能材料中的位错也可能解离成扩展位错,这是一种以部分位错为界的层错。
堆垛层错最常出现在紧密堆积的晶体结构中。FCC和HCP结构都属于密堆结构,它们之间的区别仅在于堆叠顺序。对于FCC晶体,堆垛层错能等于沿[111]方向的ABCABC原子堆垛顺序通过原子层滑移变成ABAB原子堆垛顺序的双层HCP原子的能量变化。在计算过程中,我们通常只关注有一到两层或三层原子堆垛中断的情况。堆垛层错能量变化在很大程度上反应了一种材料的强度,这是研究金属力学性能的一个非常重要的指标。我们将以FCC-Cu体系为研究对象来介绍堆垛层错能的第一性原理计算。
堆垛层错能的定义式为:
式中:表示超胞发生剪切形变后的总能;为完美晶格超胞的总能;表示滑移面的面积。堆垛层错形成过程示意图见图1。
本案例中,我们使用Atomsk软件进行建模。建模过程用到了model.sh
和cif2STRU.py
:前者会调用Atomsk完成建模,创建structure
文件夹,并将所有20个构型均放在其中用于后续自洽计算;后者用于调用ase将生成的cif格式的构型转为ABACUS的可以识别的STRU文件格式。cif2STRU.py
脚本的运行包含在model.sh
中。
# create a perfect FCC-Ni lattice with 12 atom layers and define the lattice orientation atomsk --create fcc 3.62 Cu orient [1-10] [11-2] [111] -duplicate 1 2 4 Cu_initial.cif astep=0.073893 #Note: IN bash script, there should be no whitespace in variable assignment. e.g. astart = 30 will fail astep_frac=0.05 n=20 mkdir structure for ((b=0; b<=$n; b++)) do # move the top half atom layers to construct FCC-Ni lattice with intrinsic stacking fault i=$(echo "scale=7; $astep * $b" | bc) # displacement atomsk Cu_initial.cif -shift above 0.5*box z 0.0 $i 0.0 Cu_isf.cif # create structure python3 cif2STRU.py sed -i -e '/LATTICE_VECTORS/{n;n;n;s/.*/0.0000000000 0.0000000000 40.080090000/;}' STRU # add vaccum layer cp STRU ./structure/STRU_$b done
from ase.io import read, write from pathlib import Path # cif to STRU cs_dir = './' cs_vasp = Path(cs_dir, 'Cu_isf.cif') cs_atoms = read(cs_vasp, format='cif') cs_stru = Path(cs_dir, 'STRU') pp = {'Cu':'Cu_ONCV_PBE-1.0.upf'} basis = {'Cu': 'Cu_gga_8au_100Ry_4s2p2d1f.orb'} write(cs_stru, cs_atoms, format='abacus', pp=pp, basis=basis, scaled=False)
ATOMIC_SPECIES Cu 63.546 Cu_ONCV_PBE-1.0.upf NUMERICAL_ORBITAL Cu_gga_8au_100Ry_4s2p2d1f.orb LATTICE_CONSTANT 1.889726 LATTICE_VECTORS 2.5597000000 0.0000000000 0.0000000000 0.0000000000 8.8672000000 0.0000000000 0.0000000000 0.0000000000 40.080090000 ATOMIC_POSITIONS Cartesian Cu 0.0000000000 48 0.0000000000 0.0000000000 0.0000000000 1 1 1 mag 0.0 0.0000000000 2.9557300000 4.1800250000 1 1 1 mag 0.0 2.5597000000 1.4778700000 2.0900000000 1 1 1 mag 0.0 1.2798500000 3.6946700000 2.0900000000 1 1 1 mag 0.0 1.2798500000 0.7389300000 4.1800250000 1 1 1 mag 0.0 1.2798500000 2.2168000000 0.0000000000 1 1 1 mag 0.0 0.0000000000 4.4336000000 0.0000000000 1 1 1 mag 0.0 0.0000000000 7.3893300000 4.1800250000 1 1 1 mag 0.0 0.0000000000 5.9114700000 2.0900000000 1 1 1 mag 0.0 1.2798500000 8.1282700000 2.0900000000 1 1 1 mag 0.0 1.2798500000 5.1725300000 4.1800250000 1 1 1 mag 0.0 1.2798500000 6.6504000000 0.0000000000 1 1 1 mag 0.0 0.0000000000 0.0000000000 6.2700250000 1 1 1 mag 0.0 2.5597000000 2.9557300000 10.450050000 1 1 1 mag 0.0 0.0000000000 1.4778700000 8.3600250000 1 1 1 mag 0.0 1.2798500000 3.6946700000 8.3600250000 1 1 1 mag 0.0 1.2798500000 0.7389300000 10.450050000 1 1 1 mag 0.0 1.2798500000 2.2168000000 6.2700250000 1 1 1 mag 0.0 2.5597000000 4.4336000000 6.2700250000 1 1 1 mag 0.0 2.5597000000 7.3893300000 10.450050000 1 1 1 mag 0.0 0.0000000000 5.9114700000 8.3600250000 1 1 1 mag 0.0 1.2798500000 8.1282700000 8.3600250000 1 1 1 mag 0.0 1.2798500000 5.1725300000 10.450050000 1 1 1 mag 0.0 1.2798500000 6.6504000000 6.2700250000 1 1 1 mag 0.0 0.0000000000 0.0000000000 12.540050000 1 1 1 mag 0.0 2.5597000000 3.6946610000 16.720075000 1 1 1 mag 0.0 0.0000000000 2.2168000000 14.630050000 1 1 1 mag 0.0 1.2798500000 4.4336000000 14.630050000 1 1 1 mag 0.0 1.2798500000 1.4778610000 16.720075000 1 1 1 mag 0.0 1.2798500000 2.2168000000 12.540050000 1 1 1 mag 0.0 2.5597000000 4.4336000000 12.540050000 1 1 1 mag 0.0 0.0000000000 8.1282610000 16.720075000 1 1 1 mag 0.0 0.0000000000 6.6504000000 14.630050000 1 1 1 mag 0.0 1.2798500000 0.0000000000 14.630050000 1 1 1 mag 0.0 1.2798500000 5.9114610000 16.720075000 1 1 1 mag 0.0 1.2798500000 6.6504000000 12.540050000 1 1 1 mag 0.0 2.5597000000 0.7389300000 18.810075000 1 1 1 mag 0.0 0.0000000000 3.6946610000 22.990100000 1 1 1 mag 0.0 0.0000000000 2.2168000000 20.900075000 1 1 1 mag 0.0 1.2798500000 4.4336000000 20.900075000 1 1 1 mag 0.0 1.2798500000 1.4778610000 22.990100000 1 1 1 mag 0.0 1.2798500000 2.9557300000 18.810075000 1 1 1 mag 0.0 2.5597000000 5.1725300000 18.810075000 1 1 1 mag 0.0 2.5597000000 8.1282610000 22.990100000 1 1 1 mag 0.0 0.0000000000 6.6504000000 20.900075000 1 1 1 mag 0.0 1.2798500000 0.0000000000 20.900075000 1 1 1 mag 0.0 1.2798500000 5.9114610000 22.990100000 1 1 1 mag 0.0 1.2798500000 7.3893300000 18.810075000 1 1 1 mag 0.0
2. 堆垛层错能计算
在准备好了构型之后,便可以编写一个自动计算的脚本用于完成全部构型的自洽计算,这里使用的脚本为stacking_fault.sh
:
astep=0.073893 #Note: IN bash script, there should be no whitespace in variable assignment. e.g. astart = 30 will fail astep_frac=0.05 n=20 echo "displace,ene" > Cu_fcc_energy.csv for ((b=0; b<=$n; b++)) do cp ./structure/STRU_$b ./STRU mpirun -n 32 abacus >> result # get energy energy_line=$(grep "etot" OUT.*/running_scf.log) E_value=$(echo $energy_line | awk '{for(i=1;i<=NF;i++) if ($i=="is") print $(i+1)}') E=$(printf "%.8f" $E_value) # Keep eight decimal places # get displacement in fraction j=$(echo "scale=2; $astep_frac * $b" | bc | awk '{printf "%.2f", $0}') echo "$j,$E" >> Cu_fcc_energy.csv done
脚本中首先设置了原子层移动的相对和绝对步长,之后复制structure
中对应的STRU文件到当前目录下用于自洽计算,然后进行自洽计算,最后获取自洽计算得到的能量输出到Cu_fcc_energy.csv
文件中。
ABACUS相关输入如下:
INPUT_PARAMETERS calculation scf symmetry 1 ecutwfc 80 scf_thr 1e-7 scf_nmax 300 relax_nmax 200 basis_type lcao smearing_method mp smearing_sigma 0.008 cal_stress 1 cal_force 1 kspacing 0.14
然后我们直接运行脚本便可开始计算。
3. 广义堆垛层错能曲线
计算完成后,我们便可以通过一个画图脚本plot.py
来可视化输出Cu_fcc_energy.csv
中的能量-位移关系。FCC-Cu体系的广义堆垛层错能(generalized stacking fault energy curves, GSFE)结果如下图2所示,计算结果和A.Hunter[1]的研究结果一致。从图中可以看出,在FCC-Cu材料中,本征堆垛层错形成时,堆垛层错能为正值。这说明在FCC-Cu体系中,需要一定的外力或者能量才能使体系产生堆垛层错。
恭喜你完成了第四个ABACUS计算模拟实例🎉
如果你还想尝试更多的计算实例,可以点击下方了解ABACUS计算模拟合集链接: ABACUS计算模拟实例 | 概述