DFT计算方法与应用

密度泛函理论(DFT)概述

密度泛函理论(Density Functional Theory, DFT)是一种在量子力学框架下用于研究多电子系统的方法,主要应用于固体物理、材料科学和化学等领域。DFT的核心思想是利用电子密度而非波函数来描述系统,这大大简化了计算的复杂性。DFT的主要理论基础是霍恩-科什定理(Hohenberg-Kohn Theorem),该定理指出系统的基态性质完全由其电子密度决定,而电子密度可以通过求解一个单粒子薛定谔方程(即Kohn-Sham方程)来获得。

量子化学仿真软件:VASP_(5).DFT计算方法与应用-LMLPHP

霍恩-科什定理

霍恩-科什定理分为两个部分:

  1. 第一定理:对于任何给定的外部势场,系统的基态电子密度是唯一的。

  2. 第二定理:系统的基态能量可以通过一个泛函(即电子密度的函数)来表示,这个泛函被称为基态能量泛函。

Kohn-Sham方程

Kohn-Sham方程是DFT中最核心的方程,形式如下:

$$

\left( -\frac{\hbar^2}{2m_e} \nabla^2 + V_{\text{ext}}(\mathbf{r}) + V_{\text{H}}(\mathbf{r}) + V_{\text{xc}}(\mathbf{r}) \right) \psi_i(\mathbf{r}) = \epsilon_i \psi_i(\mathbf{r})

$$

其中:

  • ψ i ( r ) \psi_i(\mathbf{r}) ψi(r)是第 i i i个Kohn-Sham轨道的波函数。

  • ϵ i \epsilon_i ϵi是第 i i i个Kohn-Sham轨道的能量。

  • V ext ( r ) V_{\text{ext}}(\mathbf{r}) Vext(r)是外部势场,通常为核-电子相互作用势。

  • V H ( r ) V_{\text{H}}(\mathbf{r}) VH(r)是哈特里势,描述电子之间的经典库仑相互作用。

  • V xc ( r ) V_{\text{xc}}(\mathbf{r}) Vxc(r)是交换-相关势,描述电子之间的量子力学交换和相关效应。

DFT计算的基本步骤

在使用DFT进行计算时,通常需要遵循以下基本步骤:

  1. 初始化电子密度:选择一个初始的电子密度分布。

  2. 构建Kohn-Sham方程:根据初始电子密度计算哈特里势和交换-相关势。

  3. 求解Kohn-Sham方程:使用数值方法求解Kohn-Sham方程,得到Kohn-Sham轨道及其能量。

  4. 更新电子密度:根据求解得到的Kohn-Sham轨道更新电子密度。

  5. 收敛检查:检查电子密度的收敛性,如果未收敛,返回步骤2继续迭代,直到电子密度收敛。

初始化电子密度

初始化电子密度通常可以通过一些简单的模型来实现,例如均匀电子气体模型或原子轨道叠加模型。在VASP中,可以通过设置 ISTART 参数来选择初始电子密度的来源。


# 初始化电子密度的示例

# 设置ISTART参数

ISTART = 0  # 从头计算,不使用之前的电子密度

构建Kohn-Sham方程

构建Kohn-Sham方程需要计算哈特里势和交换-相关势。在VASP中,这些势场的计算可以通过设置不同的交换-相关泛函来实现,例如LDA(Local Density Approximation)或GGA(Generalized Gradient Approximation)。


# 设置交换-相关泛函

# 在INCAR文件中设置

ISMEAR = 0  # 选择Gaussian smearing

SIGMA = 0.05  # 设置smearing宽度

ENCUT = 520  # 设置平面波截断能

EDIFF = 1E-6  # 设置电子自洽循环的收敛条件

求解Kohn-Sham方程

求解Kohn-Sham方程通常使用自洽场(Self-Consistent Field, SCF)方法。在VASP中,可以通过设置 ALGO 参数来选择不同的SCF算法。


# 设置SCF算法

# 在INCAR文件中设置

ALGO = 'Normal'  # 选择标准的SCF算法

更新电子密度

更新电子密度是通过求解Kohn-Sham方程后得到的新轨道来计算的。在VASP中,可以通过设置 NELM 参数来控制SCF循环的最大次数。


# 控制SCF循环的最大次数

# 在INCAR文件中设置

NELM = 60  # 设置最大SCF循环次数为60

收敛检查

收敛检查是通过比较连续迭代之间的电子密度差异来实现的。在VASP中,可以通过设置 EDIFF 参数来控制电子密度的收敛条件。


# 设置电子密度的收敛条件

# 在INCAR文件中设置

EDIFF = 1E-6  # 设置电子密度的收敛阈值为1E-6

DFT在材料科学中的应用

DFT在材料科学中的应用非常广泛,包括但不限于以下几个方面:

  1. 电子结构计算:计算材料的电子能带结构、态密度等。

  2. 能量计算:计算材料的总能量、形成能等。

  3. 力和应力计算:计算原子间的力和应力,用于结构优化和分子动力学模拟。

  4. 光学性质计算:计算材料的介电函数、吸收光谱等。

  5. 磁性性质计算:计算材料的磁矩和磁相互作用。

电子结构计算

电子结构计算是DFT中最基本的应用之一,通过计算材料的电子能带结构和态密度,可以了解材料的电子行为和电子能级分布。

能带结构计算

能带结构计算通常需要进行非自洽计算(Nonscf Calculation),在VASP中可以通过设置 ICHARG 参数来实现。


# 能带结构计算的示例

# 在INCAR文件中设置

ICHARG = 11  # 非自洽计算

KBM = 'True'  # 设置为True以计算能带结构

ISYM = 0  # 关闭对称性以确保所有k点都被计算

态密度计算

态密度计算可以提供材料的电子态分布信息,通过设置 DOS 参数来实现。


# 态密度计算的示例

# 在INCAR文件中设置

DOS = 'True'  # 开启态密度计算

EMAX = 10  # 设置能量的最大值

EMIN = -10  # 设置能量的最小值

NEDOS = 3000  # 设置能量点的数量

能量计算

能量计算是DFT中最常见的应用之一,可以用于计算材料的总能量、形成能、反应能等。

总能量计算

总能量计算可以通过自洽场(SCF)计算来实现,确保系统的电子密度收敛。


# 总能量计算的示例

# 在INCAR文件中设置

NSW = 0  # 不进行动力学模拟

ISMEAR = 0  # 选择Gaussian smearing

SIGMA = 0.05  # 设置smearing宽度

ENCUT = 520  # 设置平面波截断能

EDIFF = 1E-6  # 设置电子自洽循环的收敛条件

形成能计算

形成能计算需要计算材料的总能量及其组成元素的总能量,然后通过公式计算形成能。


# 形成能计算的示例

# 计算材料A和其组成元素B、C的总能量

# 在INCAR文件中设置

NSW = 0  # 不进行动力学模拟

ISMEAR = 0  # 选择Gaussian smearing

SIGMA = 0.05  # 设置smearing宽度

ENCUT = 520  # 设置平面波截断能

EDIFF = 1E-6  # 设置电子自洽循环的收敛条件



# 假设材料A的总能量为E_A,元素B的总能量为E_B,元素C的总能量为E_C

# 形成能计算公式

E_form = E_A - (n_B * E_B + n_C * E_C)

力和应力计算

力和应力计算是结构优化和分子动力学模拟的基础,通过计算原子间的力和应力,可以优化材料的结构或模拟其动力学行为。

结构优化

结构优化可以通过设置 IBRION 参数来实现,选择不同的优化算法,例如共轭梯度法(Conjugate Gradient, CG)或牛顿-拉夫森法(Newton-Raphson)。


# 结构优化的示例

# 在INCAR文件中设置

IBRION = 2  # 选择共轭梯度法

NSW = 100  # 设置最大离子步数为100

EDIFFG = -0.01  # 设置结构优化的收敛条件

分子动力学模拟

分子动力学模拟可以通过设置 IBRION 参数来实现,选择不同的动力学算法,例如Verlet算法或Nose-Hoover恒温器。


# 分子动力学模拟的示例

# 在INCAR文件中设置

IBRION = 0  # 选择Verlet算法

NSW = 1000  # 设置最大离子步数为1000

POTIM = 0.5  # 设置时间步长

ISIF = 2  # 仅优化离子位置

光学性质计算

光学性质计算可以用于研究材料的介电函数、吸收光谱等光学行为。

介电函数计算

介电函数计算可以通过设置 LEPSILON 参数来实现,计算系统的介电响应。


# 介电函数计算的示例

# 在INCAR文件中设置

LEPSILON = True  # 开启介电函数计算

IBRION = 8  # 选择光学性质计算

NSW = 1  # 设置离子步数为1

EDIFF = 1E-8  # 设置电子密度的收敛条件

吸收光谱计算

吸收光谱计算可以通过设置 LOPTICS 参数来实现,计算系统的光学吸收行为。


# 吸收光谱计算的示例

# 在INCAR文件中设置

LOPTICS = True  # 开启吸收光谱计算

IBRION = 8  # 选择光学性质计算

NSW = 1  # 设置离子步数为1

EDIFF = 1E-8  # 设置电子密度的收敛条件

磁性性质计算

磁性性质计算可以用于研究材料的磁矩和磁相互作用。

非自旋极化计算

非自旋极化计算适用于非磁性材料,通过设置 ISPIN 参数来实现。


# 非自旋极化计算的示例

# 在INCAR文件中设置

ISPIN = 1  # 设置为1表示非自旋极化计算

自旋极化计算

自旋极化计算适用于磁性材料,通过设置 ISPIN 参数来实现,并且需要提供初始磁矩。


# 自旋极化计算的示例

# 在INCAR文件中设置

ISPIN = 2  # 设置为2表示自旋极化计算

MAGMOM = [1.0, 0.0, 0.0]  # 提供初始磁矩

DFT计算的高级应用

DFT计算的高级应用包括一些扩展的方法和技巧,例如杂化泛函、van der Waals相互作用等。这些方法可以提高计算的准确性和可靠性,特别是在处理复杂材料时。

杂化泛函

杂化泛函(Hybrid Functionals)是一种结合了LDA/GGA和Hartree-Fock方法的交换-相关泛函,可以提供更准确的能带结构和电子性质。LDA和GGA泛函在某些情况下可能会低估带隙,而杂化泛函可以显著改善这一点。

HSE06泛函

HSE06泛函是一种常用的杂化泛函,通过设置 LHFCALCHFSCREEN 参数来实现。HSE06泛函在计算带隙较大的材料时特别有效。


# HSE06泛函计算的示例

# 在INCAR文件中设置

LHFCALC = True  # 开启杂化泛函计算

HFSCREEN = 0.2  # 设置混合参数

ISMEAR = 0  # 选择Gaussian smearing

SIGMA = 0.05  # 设置smearing宽度

ENCUT = 520  # 设置平面波截断能

EDIFF = 1E-6  # 设置电子自洽循环的收敛条件



# 运行VASP计算

os.system('vasp')



# 读取总能量

with open('OSZIC', 'r') as f:

    lines = f.readlines()

    for line in lines:

        if 'energy  without entropy' in line:

            energy_HSE06 = float(line.split()[4])

            break



print(f'HSE06泛函计算的总能量为: {energy_HSE06}')

van der Waals相互作用

van der Waals相互作用是DFT计算中常常被忽略的相互作用,但对某些材料(如二维材料、分子晶体等)的性质有重要影响。可以通过设置 IVDW 参数来实现。

DFT-D3方法

DFT-D3方法是一种常用的van der Waals相互作用修正方法,通过设置 IVDW 参数来实现。DFT-D3方法可以有效地描述长程相互作用,提高计算的准确性。


# DFT-D3方法计算的示例

# 在INCAR文件中设置

IVDW = 12  # 选择DFT-D3方法

ISMEAR = 0  # 选择Gaussian smearing

SIGMA = 0.05  # 设置smearing宽度

ENCUT = 520  # 设置平面波截断能

EDIFF = 1E-6  # 设置电子自洽循环的收敛条件



# 运行VASP计算

os.system('vasp')



# 读取总能量

with open('OSZIC', 'r') as f:

    lines = f.readlines()

    for line in lines:

        if 'energy  without entropy' in line:

            energy_DFTD3 = float(line.split()[4])

            break



print(f'DFT-D3方法计算的总能量为: {energy_DFTD3}')

DFT计算的注意事项

在进行DFT计算时,需要注意以下几个方面,以确保计算的准确性和效率:

  1. 平面波截断能(ENCUT):截断能的选择对计算结果有重要影响,通常需要通过收敛测试来确定合适的截断能。

  2. k点网格(KPOINTS):k点网格的选择对计算结果也有重要影响,需要通过收敛测试来确定合适的k点密度。

  3. 交换-相关泛函(XC_FUNCTIONAL):选择合适的交换-相关泛函对计算结果的准确性至关重要,不同的泛函适用于不同的材料。

  4. 计算资源(NPAR, NCORE):合理的设置计算资源可以提高计算效率,减少计算时间。

平面波截断能的选择

平面波截断能的选择可以通过收敛测试来确定。通常,选择不同的截断能进行计算,直到总能量的变化小于某个阈值。


# 平面波截断能收敛测试的示例

# 在INCAR文件中设置

ENCUT = 520  # 初始截断能

EDIFF = 1E-6  # 设置电子自洽循环的收敛条件

prev_energy = 1E10  # 初始能量设为一个大值



# 逐步增加截断能,直到总能量变化小于阈值

while True:

    # 生成INCAR文件

    with open('INCAR', 'w') as f:

        f.write('ENCUT = {}\n'.format(ENCUT))

        f.write('EDIFF = {}\n'.format(EDIFF))

        f.write('ISMEAR = 0\n')

        f.write('SIGMA = 0.05\n')

        f.write('NELM = 60\n')



    # 运行VASP计算

    os.system('vasp')



    # 读取总能量

    with open('OSZIC', 'r') as f:

        lines = f.readlines()

        for line in lines:

            if 'energy  without entropy' in line:

                energy = float(line.split()[4])

                break



    # 检查能量变化

    if abs(energy - prev_energy) < 1E-4:

        break

    prev_energy = energy

    ENCUT += 50  # 增加截断能



print(f'收敛的截断能为: {ENCUT}')

k点网格的选择

k点网格的选择也可以通过收敛测试来确定。通常,选择不同的k点密度进行计算,直到总能量的变化小于某个阈值。


# k点网格收敛测试的示例

# 在KPOINTS文件中设置

kpoints = [8, 8, 8]  # 初始k点网格

prev_energy = 1E10  # 初始能量设为一个大值



# 逐步增加k点密度,直到总能量变化小于阈值

while True:

    # 生成KPOINTS文件

    with open('KPOINTS', 'w') as f:

        f.write('Automatic mesh\n')

        f.write('0\n')

        f.write('Gamma\n')

        f.write(f'{kpoints[0]} {kpoints[1]} {kpoints[2]}\n')

        f.write('0 0 0\n')



    # 生成INCAR文件

    with open('INCAR', 'w') as f:

        f.write('ENCUT = 520\n')

        f.write('EDIFF = 1E-6\n')

        f.write('ISMEAR = 0\n')

        f.write('SIGMA = 0.05\n')

        f.write('NELM = 60\n')



    # 运行VASP计算

    os.system('vasp')



    # 读取总能量

    with open('OSZIC', 'r') as f:

        lines = f.readlines()

        for line in lines:

            if 'energy  without entropy' in line:

                energy = float(line.split()[4])

                break



    # 检查能量变化

    if abs(energy - prev_energy) < 1E-4:

        break

    prev_energy = energy

    kpoints = [k + 2 for k in kpoints]  # 增加k点密度



print(f'收敛的k点网格为: {kpoints}')

交换-相关泛函的选择

选择合适的交换-相关泛函对计算结果的准确性至关重要。不同的泛函适用于不同的材料,需要根据具体材料的性质来选择。


# 交换-相关泛函选择的示例

# 在INCAR文件中设置

# 选择LDA泛函

with open('INCAR', 'w') as f:

    f.write('LDA = True\n')

    f.write('ISMEAR = 0\n')

    f.write('SIGMA = 0.05\n')

    f.write('ENCUT = 520\n')

    f.write('EDIFF = 1E-6\n')



# 运行VASP计算

os.system('vasp')



# 读取总能量

with open('OSZIC', 'r') as f:

    lines = f.readlines()

    for line in lines:

        if 'energy  without entropy' in line:

            energy_LDA = float(line.split()[4])

            break



# 选择GGA泛函

with open('INCAR', 'w') as f:

    f.write('LDA = False\n')

    f.write('GGA = True\n')

    f.write('ISMEAR = 0\n')

    f.write('SIGMA = 0.05\n')

    f.write('ENCUT = 520\n')

    f.write('EDIFF = 1E-6\n')



# 运行VASP计算

os.system('vasp')



# 读取总能量

with open('OSZIC', 'r') as f:

    lines = f.readlines()

    for line in lines:

        if 'energy  without entropy' in line:

            energy_GGA = float(line.split()[4])

            break



# 比较不同泛函的计算结果

if energy_LDA < energy_GGA:

    print('LDA泛函更合适')

else:

    print('GGA泛函更合适')

计算资源的设置

合理的设置计算资源可以提高计算效率,减少计算时间。在VASP中,可以通过设置 NPARNCORE 参数来实现。NPAR 控制并行化程度,NCORE 控制每个节点上的核心数。


# 计算资源设置的示例

# 在INCAR文件中设置

with open('INCAR', 'w') as f:

    f.write('ENCUT = 520\n')

    f.write('EDIFF = 1E-6\n')

    f.write('ISMEAR = 0\n')

    f.write('SIGMA = 0.05\n')

    f.write('NELM = 60\n')

    f.write('NPAR = 4\n')  # 设置并行化程度

    f.write('NCORE = 8\n')  # 设置每个节点上的核心数



# 运行VASP计算

os.system('vasp')



# 读取总能量

with open('OSZIC', 'r') as f:

    lines = f.readlines()

    for line in lines:

        if 'energy  without entropy' in line:

            energy = float(line.split()[4])

            break



print(f'计算的总能量为: {energy}')

总结

密度泛函理论(DFT)是一种强大的工具,广泛应用于固体物理、材料科学和化学等领域。通过合理的设置和优化,DFT可以提供准确的电子结构、能量、力和应力、光学性质以及磁性性质等信息。高级应用如杂化泛函和van der Waals相互作用的修正,可以进一步提高计算的准确性。在实际计算中,需要注意平面波截断能、k点网格、交换-相关泛函和计算资源的设置,以确保计算的高效性和可靠性。

01-02 00:16