目录

使用PBE和HSE06泛函计算GaAs的能带结构

在本教程中您将会学到在VNL-ATK中如何进行FHI-aims计算。FHI-aims是一个全电子的电子结构模拟程序包,因此FHI-aims程序不使用任何赝势。此外可以通过它实现包括杂化泛函、总能的随机相位近似(RPA)和激发态的GW近似等比GGA更高级的方法。在https://aimsclub.fhi-berlin.mpg.de 可以获得更多详细介绍。

概要

我们将使用PBE和HSE06密度泛函来计算GaAs的能带结构。后者使用准确交换(exact exchange)的一种带有屏蔽的变体。HSE06计算量更大,但是通常比标准GGA方法准确。请见参考文献[HSE03], [PMH+06]和[KVIS06]。

提示

  • 要使用QuantumATK中的FHI-aims计算,license文件中需要包括QuantumATKFHIAIMS功能。
  • QuantumATK 从 2017 版开始不再包含FHI-aims吗,原有的永久版权用户可以继续使用。
  • QuantumATK从2018版开始包含自主开发的平面波程序(ATK-DFT-PlaneWave),支持HSE06杂化泛函计算。ATK-DFT-PlaneWave支持更多的计算选项。

提示

本教程假定您在使用Virtual Nanolab(VNL)计算并查看结果方面有一定的经验。如果您之前没有用过VNL,请参考基本入门教程

警告

本教程为了缩短计算时间,使用了较低准确度的设置。在进行需要发表的科学研究工作中,请记得仔细考察K点网格、基组和积分网格的相关设置的收敛性。

PBE能带结构计算

atkpython pbe.py > pbe.log

这个计算应该只需要几分钟,之后GaAs能带结构将会出现在 LabFloor 窗口中。使用 Bandstructure Analyzer 可以进行可视化,还可以在费米能级附近放大。

HSE06能带结构计算

接下来使用HSE06泛函来计算相同的能带结构并与PBE计算的结果对比。对于周期性体系,HSE06的计算量会比较大,所以我们将选择比较粗糙的6x6x6的K点网格。PBE和HSE06计算可以方便地通过同一个Python脚本逐个进行。

PBE计算

HSE计算

mpiexec -n 4 atkpython hse.py > hse.log

如果使用笔记本电脑中的4核CPU并行计算,此计算大概需要30分钟时间。

当计算结束后,您可以在 LabFloor 中选中两个能带结构数据对象,使用 Compare Data 插件将两个能带结构放在一个图中显示:

两个能带结构有明显不同;HSE06 导带(绿色,对象ID为gID003)相对PBE结果上移,导致预测带隙为1.36eV,与实验值1.52eV差别小了很多。

注意

请注意以上结果仅仅是由中等准确度(“Light” 积分网格 和 “Tier 1” 基组)和粗糙的K点网格得到。如果使用 Tight 设置,更多的基函数和更多K点可以给出不同的结果(很好的收敛)。详见下面。

也注意到在能带结构计算之前通常应该进行第一性原理的几何结构优化。

基组和积分网格

由不同的FHI-aims设置计算获得的GaAs带隙

如上图显示,FHI-aims计算结果基本上随计算设置而定。“Tight”意思是比”Light”更精细的积分网格,而“Tier 2”比“Tier 1”具有更多的基函数。显而易见的是“Tight”基组可以获得收敛性更好的带隙。但是更大的基组明显需要更多的计算机时。注意K格点密度在此计算中没有进行优化。

锗能带结构

为了更加完整,您也能够使用HSE06计算锗的能带结构:下载 germanium.py 和运行计算。16核并行大概需要25分钟,当然在更少的核数上面也可以计算。结果如下。

germanium.py
# -------------------------------------------------------------
# Bulk Configuration
# -------------------------------------------------------------
 
# Set up lattice
lattice = FaceCenteredCubic(5.6574*Angstrom)
 
# Define elements
elements = [Germanium, Germanium]
 
# Define coordinates
fractional_coordinates = [[ 0.  ,  0.  ,  0.  ],
                          [ 0.25,  0.25,  0.25]]
 
# Set up configuration
bulk_configuration = BulkConfiguration(
    bravais_lattice=lattice,
    elements=elements,
    fractional_coordinates=fractional_coordinates
    )
 
# -------------------------------------------------------------
# Calculator
# -------------------------------------------------------------
#----------------------------------------
# Basis Set
#----------------------------------------
basis_set = FHIaimsBasisSet()
species_bases = [
    FHIaimsBasisSetSpecies(Germanium, Light, 1),
    ]
basis_set.setAndCheckSpeciesBasis(species_bases)
 
#----------------------------------------
# Exchange-Correlation
#----------------------------------------
exchange_correlation = FHIaims_Hybrid_HSE06
exchange_correlation._setShortName("FHIaims_Hybrid_HSE06")
 
numerical_accuracy_parameters = NumericalAccuracyParameters(
    k_point_sampling=(9, 9, 9),
    )
 
iteration_control_parameters = IterationControlParameters(
    damping_factor=0.6,
    )
 
#----------------------------------------
# FHI-aims Parameters
#----------------------------------------
fhiaims_parameters = FHIaimsParameters()
fhiaims_parameters.addControlKeywordValuePair("sc_accuracy_eev","0.001")
fhiaims_parameters.addControlKeywordValuePair("charge","0")
fhiaims_parameters.addControlKeywordValuePair("sc_accuracy_etot","1e-06")
fhiaims_parameters.addControlKeywordValuePair("sc_accuracy_rho","1e-05")
fhiaims_parameters.addControlKeywordValuePair("occupation_type","gaussian 0.000001")
 
#----------------------------------------
# Working Directory
#----------------------------------------
working_directory = '.'
 
#----------------------------------------
# FHI-aims calculator
#----------------------------------------
calculator = FHIaimsCalculator(
    basis_set=basis_set,
    exchange_correlation=exchange_correlation,
    numerical_accuracy_parameters=numerical_accuracy_parameters,
    iteration_control_parameters=iteration_control_parameters,
    fhiaims_parameters=fhiaims_parameters,
    working_directory=working_directory,
    )
 
bulk_configuration.setCalculator(calculator)
nlprint(bulk_configuration)
bulk_configuration.update()
nlsave('germanium.nc', bulk_configuration)
 
# -------------------------------------------------------------
# Bandstructure
# -------------------------------------------------------------
bandstructure = Bandstructure(
    configuration=bulk_configuration,
    route=['X', 'G', 'L'],
    points_per_segment=51,
    bands_above_fermi_level=All
    )
nlsave('germanium.nc', bandstructure)

参考文献