ABACUS计算模拟实例 | III. 材料平衡晶格常数计算
©️ Copyright 2023 @ Authors
作者:Jinghang Wang (AISI电子结构团队实习生) 📨
日期:2024-6-21
共享协议:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
快速开始:点击上方的 开始连接 按钮,选择 ABACUS:3.6.3-user-guide 镜像及 c32_m64_cpu 节点配置,并在连接后点击右上方的切换内核,选择Bash内核稍等片刻即可运行。本教程运行时间较长,因此不要求完成具体计算,若要完成可按该配置进行。
🎯 本教程旨在帮助初学者学习使用ABACUS自动计算材料的晶格常数,然后使用Brich-Murnaghan方程拟合,最终得到晶体材料的平衡晶格常数。
本节教程目录如下:
1. 自动计算材料晶格常数
2. Birch-Murnaghan方程拟合
在使用ABACUS进行计算时,所有操作都需要在指定的文件夹目录下进行。我们已经准备好了数据集ABACUS-cases,其中文件夹“3”对应本节教程。
首先我们将数据集中的文件复制到根目录下:
Birch_fitting.jpg INPUT Ni_fcc_energy.csv STRU result Birch_fitting.py KPT OUT.Ni lattice_constant.sh time.json
1.自动计算材料晶格常数
在文件夹中,Birch_fitting.py
, INPUT
, KPT
, lattice_constant.sh
是本次教程的输入文件,其余均为输出文件。
INPUT
文件中的关键参数:
nspin 2: Ni为磁性体系,因此要打开自旋极化;
smearing_method mp: 一阶Methfessel-Paxton方法,对应VASP中的ISMEAR=1,适用于金属体系。
INPUT_PARAMETERS RUNNING ABACUS-DFT #Parameters (1.General) suffix Ni # suffix of OUTPUT DIR nspin 2 # 1/2/4 4 for SOC symmetry 1 # 0/1 1 for open, default # symmetry_autoclose 1 # if symmetry error: set symmetry to 0 # symmetry_prec 1e-5 # default esolver_type ksdft # ksdft, ofdft, sdft, tddft, lj, dp # dft_functional pbe # same as upf file, can be lda/pbe/scan/hf/pbe0/hse ks_solver genelpa # default for ksdft-lcao pseudo_dir /abacus-develop/tests/PP_ORB orbital_dir /abacus-develop/tests/PP_ORB #init_wfc file #init_chg file #Parameters (2.Iteration) calculation scf # scf relax cell-relax md ecutwfc 50 # Ry, Default: 50 scf_thr 1e-7 scf_nmax 100 #relax_nmax 200 #relax_method bfgs # cg, bfgs, cg_bfgs, sd, "fire" #force_thr_ev 0.05 # ev # stress_thr 5 #Parameters (3.Basis) basis_type lcao # lcao or pw # kspacing 0.25 # replace KPT # gamma_only 1 # 0/1, replace KPT #Parameters (4.Smearing) smearing_method mp # mp/gaussian/fd/fixed, mp for metal gau for semicon smearing_sigma 0.008 # Rydberg, 0.008 for mp 0.001 for gau #Parameters (5.Mixing) mixing_type broyden # pulay/broyden, Default: broyden #mixing_beta 0.2 # for metal: 0.05-0.4, 0 - 0.1 for difficult #mixing_gg0 1.5 # only for transition metal #Parameters (6.Calculation) cal_force 1 cal_stress 1 out_stru 1 # print STRU in OUT out_chg 1 # print CHG or not out_wfc_lcao 1 # print wfc or not, 0: not 1: text format 2: binary format out_bandgap 0 out_mul 0 # print Mulliken charge and mag of atom in mulliken.txt # out_interval 1 # restart_save auto # false, auto, other # restart_load false
K_POINTS 0 Gamma 7 7 7 0 0 0
这里为读者提供自动计算晶格常数的lattice_constant.sh
脚本:
运行该脚本即可获得不同晶格常数下的能量,晶格常数从3埃变化到4埃,用于下一步拟合。
注意:不同于VASP,abacus中的初始磁矩在STRU文件中指定,并且一共有三种指定方式,详见:ABACUS 使用教程|磁性材料计算 ,这里采用按元素设定,对所有Ni原子设置初始磁矩为2.
astart=3.00 #Note: IN bash script, there should be no whitespace in variable assignment. e.g. astart = 30 will fail astep=0.04 n=25 echo "lat,ene">Ni_fcc_energy.csv for ((b=0; b<=$n; b++)) do i=$(echo "$astart + $astep * $b" | bc) # use bash calculator cat > STRU << ! ATOMIC_SPECIES Ni 58.693 Ni_ONCV_PBE-1.0.upf NUMERICAL_ORBITAL Ni_gga_9au_100Ry_4s2p2d1f.orb LATTICE_CONSTANT 1.889726 LATTICE_VECTORS $i 0.000000000000 0.000000000000 0.000000000000 $i 0.000000000000 0.000000000000 0.000000000000 $i ATOMIC_POSITIONS Direct Ni 2.0 4 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.5 0.5 0.5 0.0 0.5 ! mpirun -n 32 abacus >> result 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 echo "$i,$E" >> Ni_fcc_energy.csv done
该过程使用32核需要运行30分钟,感兴趣的用户可以自行计算。去除下面的#号注释即可运行。
运行完毕后,晶格常数和能量都输出在Ni_fcc_energy.csv
文件中:
lat,ene 3.00,-16768.13483400 3.04,-16770.05924100 3.08,-16771.71528400 3.12,-16773.13166800 3.16,-16774.33095700 3.20,-16775.33304400 3.24,-16776.15902800 3.28,-16776.82763200 3.32,-16777.35683300 3.36,-16777.76238600 3.40,-16778.05503200 3.44,-16778.25080900 3.48,-16778.36217100 3.52,-16778.39511200 3.56,-16778.36122700 3.60,-16778.26955900 3.64,-16778.12907600 3.68,-16777.94620800 3.72,-16777.72523800 3.76,-16777.47636900 3.80,-16777.20101800 3.84,-16776.90549900 3.88,-16776.59369800 3.92,-16776.26749900 3.96,-16775.92957500 4.00,-16775.58235100
2. Birch-Murnaghan方程拟合
很多实际的应用,如测定相变、膨胀系数、弹性、热电效应、组分变化、应力等,都要求精确地测定晶格常数。理论计算平衡晶格常数多采用固体的状态方程(equation of state, EOS),该方程表示晶体体系的总能量E随体系体积V的变化,即具有E(V)的形式。晶体的状态方程对于基础科学和应用科学具有重要的意义,比如平衡体积(V0)、体弹性模量(B0)以及它的一阶导数(B0'),这些可测的物理量与晶体的状态方程直接相关。在高压下状态方程可用好几种不同的函数形式来描述,比如Murnaghan方程、Birch-Murnaghan(BM)方程和普适方程等。
三阶Birch-Murnaghan方程如下:
由该方程可以看出,当V=V0时,E=E0,这就分别是平衡晶格常数及其对应的能量。在实际操作中,我们就可以在平衡晶格常数a0附近计算得到若干E-V数据点,经曲线拟合得到体系最低能量对应的晶格常数。采用最小二乘法拟合可以得到V0, E0, B0, B0'。拟合脚本Birch_fitting.py
如下:
import numpy as np import pandas as pd from matplotlib import pyplot as plt from scipy.optimize import leastsq # Birch-Murnaghan EOS def Birch_Murnaghan(p,x): E0,V0,B0,B1=p return E0+(9*V0*B0/16)*((((V0/(x**3))**(2/3)-1)**3)*B1+(((V0/(x**3))**(2/3)-1)**2)*(6-4*(V0/(x**3))**(2/3))) # error def error(p,x,y): return Birch_Murnaghan(p,x)-y def main(): # read data filename="Ni_fcc_energy.csv" DataFrame=pd.read_csv(filename) x=np.array(DataFrame['lat']) y=np.array(DataFrame['ene']) # fitting by least square method p0=[ min(y), min(x)**3, 10, 1 ] # initial args para=leastsq(error, p0, args=(x,y)) # optimized args y_fitted=Birch_Murnaghan(para[0],x) # fitting curves print ("Emin=", para[0][0], "opt_lat", para[0][1]**(1/3)) print ("B0=", para[0][2], "B1=", para[0][3]) # plot plt.figure(figsize=(8,6)) plt.scatter(x,y,20, color='r', label='ABACUS computed data') plt.plot(x,y_fitted, '-b', label='Birch-Murnaghan Fitting') plt.xlabel('Lattice constant/Å', fontsize=20) plt.ylabel('Energy/eV',fontsize=20) plt.legend(fontsize=10) plt.savefig("Birch_fitting.jpg", dpi=300) print (para[0]) if __name__=='__main__': main()
Emin= -16778.37920200902 opt_lat 3.523123194799099 B0= 1.2606500039348976 B1= 4.8107190112115115 [-1.67783792e+04 4.37304039e+01 1.26065000e+00 4.81071901e+00]
拟合结果如下图所示。得到平衡晶格常数为3.523 Å,与实验值3.52 Å非常接近。通过拟合还可以得到Ni的FCC结构的体模量B0=1.261 eV/Å,根据1.0 eV/Å = 160.2 GPa,转化后为202.0122 GPa(实验值约为180 GPa,误差在12.3%左右)。
恭喜你完成了第三个ABACUS计算模拟实例🎉
如果你还想尝试更多的计算实例,可以点击下方了解ABACUS计算模拟合集链接: ABACUS计算模拟实例 | 概述