3.1 DFT 基础

关于 DFT,网上组内已经有很多更系统、更严格的教材和课程。这里我不再重复造轮子,说点我对 DFT 的“理解”。这里的理解不涉及理论,只是对一个东西的理解——“这是一个什么东西?”

先有一个总印象:

DFT 不是“直接按一个公式算出答案”,而是在一组近似下,通过迭代逐步找到体系电子密度和总能量的一种方法。

1. 为什么会有 DFT

在量子力学里,一个最根本的问题是:给定原子核和电子,如何求这个体系的基态性质?

最直接的想法当然是从薛定谔方程出发。

对于一个电子、两个电子的简单体系,这样做是可行的。 但一旦电子数变多,多体波函数会变得极其复杂。波函数依赖所有电子坐标,维度增长很快,所以直接精确求解在实际材料体系里几乎不现实。

这时一个很重要的思想出现了:

与其直接求复杂的多电子波函数,不如想办法只研究电子密度。

电子密度只依赖空间位置,是一个三维函数,比多体波函数简单得多。

2. 一个很简短的历史脉络

  1. 薛定谔方程给出了量子体系的基本描述
  2. 多电子体系太难直接精确求解
  3. Hohenberg-Kohn 定理告诉我们:基态性质原则上可以由电子密度决定
  4. Kohn-Sham 方法把真实的多电子问题,转写成一组较容易处理的单电子方程
  5. 交换-相关能没法精确写出,所以实际计算要做近似

这也是 DFT 的核心气质:

  • 理论基础很漂亮
  • 实际计算必须依赖近似
  • 好不好用,很大程度上取决于你选了什么近似、研究的是什么问题

所以 DFT 不是“绝对正确”,而是一套在精度和计算成本之间非常成功的 trade-off 方案。

3. DFT 到底在做什么

可以先把 DFT 粗略理解成:

给定原子核位置,去寻找一组自洽的电子密度,使体系总能量尽可能合理地描述这个材料。

这里有几个关键词:

  • 原子核位置:也就是你的结构
  • 电子密度:真正的核心未知量
  • 自洽:你猜一个密度,算出势,再解方程得到新的密度,然后不断重复,直到前后差别足够小

这就是大家常说的 SCF,也就是 self-consistent field,自洽场迭代。

4. DFT 如何实际求解

从计算流程上看,一次最普通的 DFT 计算,大致是在做下面这些事。

4.1 输入一个初始结构

你需要先告诉程序:

  • 原子有哪些元素
  • 每个原子在哪里
  • 晶胞长什么样子

这就是结构信息。

如果是分子,重点是坐标。 如果是晶体或表面,除了坐标,还要有晶胞和周期性边界条件。

4.2 猜一个初始电子密度

程序不可能凭空知道真实电子密度,所以一开始会先猜一个初始密度。

这个初始猜测可能来自:

  • 原子密度的叠加
  • 上一次计算结果
  • 某种默认初始化方式

4.3 根据当前密度构造 Kohn-Sham 方程

接着程序会根据当前电子密度,构造一个有效势。

这个势里通常包括:

  • 原子核对电子的作用
  • 电子之间的平均库仑作用
  • 交换-相关作用

然后程序求解 Kohn-Sham 方程,得到一组轨道和对应占据。

4.4 由新轨道生成新的电子密度

算出这些轨道之后,就可以反过来重新构造电子密度。

于是你会得到:

  • 旧密度
  • 新密度

如果它们差得还比较大,说明还没有收敛,就继续迭代。

4.5 重复迭代直到自洽

所以一个 SCF 循环可以粗略画成:

text
输入结构、赝势、泛函、k 点、截断能等参数
   
给一个初始电子密度 rho_in
   
┌─  rho_in 构造有效势 V_eff
     
  求解 Kohn-Sham 方程,得到一组轨道和本征值
     
  根据轨道占据重新构造电子密度 rho_out
     
  计算总能、带电情况、磁矩等相关量
     
  比较 rho_out  rho_in 是否足够接近
     
  是否收敛?
     ├─ 是:输出收敛后的能量、电子结构、密度等结果
     └─ 否:对 rho_in  rho_out  mixing,生成新的输入密度
└──────────────────────────────────────────────↺

如果你想再把这个图读得更“程序化”一点,也可以理解成:

text
初始猜测
   
电子步 1
   
电子步 2
   
电子步 3
   
...
   
直到电子密度 / 总能 / 波函数变化小于收敛阈值

这里有几个关键词值得先记住:

  • rho_in:这一轮拿来算势的输入密度
  • rho_out:这一轮求解后得到的新密度
  • mixing:不是完全相信新密度,而是把新旧密度按一定方式混合,避免迭代发散
  • 收敛阈值:程序判断“够接近了,可以停了”的标准

这就是 DFT 计算里最核心的一层。

5. 结构优化和静态计算是什么关系

很多新手第一次接触 DFT 时,会把“算一次能量”和“做结构优化”混在一起。

其实可以先这样区分:

  • 静态计算:结构固定,只求这个结构下的电子态和能量
  • 结构优化:在反复做静态计算的基础上,再根据力去移动原子,直到结构也收敛

所以结构优化可以理解成“双重迭代”:

  • 内层:电子密度的 SCF 自洽
  • 外层:原子位置的几何优化

6. 一个 DFT 计算需要什么东西

如果你只是想先知道“真正上机时要准备什么”,那最少可以从下面几个东西来理解。

6.1 结构

这是最基本的输入。

你至少要知道:

  • 元素种类
  • 原子坐标
  • 晶胞参数

没有结构,程序根本不知道你在算什么。

6.2 元素对应的赝势或 PAW 数据

真实原子里,芯电子和价电子都存在。

但在很多 DFT 程序里,我们不会把所有电子都显式处理,而是用赝势或 PAW 方法,把核心部分“等效处理”掉,只重点描述价电子。

所以不同元素通常需要对应的赝势文件。

你可以先把它理解成:

它告诉程序,某种元素应该如何被近似表示。

6.3 交换-相关泛函

这是 DFT 里最典型的近似来源之一。

你总会听到这些名字:

  • LDA
  • PBE
  • PBEsol
  • SCAN
  • HSE

它们本质上是在回答同一个问题:

交换-相关能应该怎样近似?

不同泛函的精度、计算代价和适用场景都不一样。

对初学者来说,先知道一件事就够了:

  • 泛函不是随便选的
  • 同一个体系,不同泛函可能会给出不同结果

6.4 基组或数值表示方式

程序需要一种方式来表示波函数或电子态。

不同软件的实现不一样,但你通常会遇到这些概念:

  • 平面波
  • 局域原子轨道
  • 实空间网格

如果你在用平面波程序,例如 VASP,常见的相关参数就是:

  • 截断能 ENCUT

它决定你用多大的基组去展开波函数。

6.5 布里渊区采样

如果是周期性体系,你通常还要设置:

  • k

因为晶体体系的电子态和倒空间采样有关。

所以做固体、表面、体相材料计算时,经常要做 k 点收敛测试。

6.6 收敛标准

你还需要告诉程序,什么时候算“够了”。

常见的收敛标准包括:

  • 电子步收敛阈值
  • 力收敛阈值
  • 最大迭代步数

如果这些标准太松,结果可能不可靠。 如果太严,计算会很慢,甚至不收敛。

6.7 任务类型

最后你还要明确自己到底要算什么。

比如:

  • 单点能
  • 结构优化
  • 态密度
  • 能带
  • 振动频率

不同任务,对输入参数和后处理方式的要求都不一样。

7. 初学者可以先建立的一个最小清单

如果你现在还不熟,先不要追求把所有理论都搞懂。

先学会每次计算都问自己这几个问题:

  1. 我现在算的是什么结构?
  2. 我用的是什么泛函?
  3. 我用的是什么赝势或势函数?
  4. k 点和截断能是否合理?
  5. 我做的是静态计算还是结构优化?
  6. 我的结果是否真的收敛了?

8. 一个 VASP 的最小案例

上面这些内容还是偏概念。接下来我们给1个最小的例子实战一下,最小可以先看一个 VASP 单点计算目录长什么样。

先记住一句最重要的话:

对 VASP 来说,最核心的输入通常就是四个文件:INCARPOSCARPOTCARKPOINTS

你可以先把它们粗略理解成:

  • INCAR:这次计算想怎么做
  • POSCAR:结构长什么样
  • POTCAR:元素对应的赝势 / PAW 数据
  • KPOINTSk 点怎么取

8.1 一个最小目录

text
si_scf/
├── INCAR
├── POSCAR
├── POTCAR
└── KPOINTS

这就是一个最经典的最小 VASP 计算目录。

8.2 这四个文件分别在说什么

INCAR

先放一个非常简化的例子:

text
SYSTEM = Si
ENCUT = 520
EDIFF = 1E-5
IBRION = -1
NSW = 0

你现在不需要把每个参数都背下来,只要先建立这些直觉:

  • ENCUT:平面波截断能
  • EDIFF:电子步收敛标准
  • IBRION = -1:不做离子步优化
  • NSW = 0:不做结构优化步

所以这一组设置对应的是:

固定结构,做一次静态 SCF 计算。

POSCAR

下面给一个极简的 Si 晶体结构例子:

text
# POSCAR
Si
1.0
5.43 0.00 0.00
0.00 5.43 0.00
0.00 0.00 5.43
Si
2
Direct
0.00 0.00 0.00
0.25 0.25 0.25

你现在先只要知道:

  • 前面几行定义晶胞
  • 元素种类和原子个数写在中间
  • 最后是原子坐标

POTCAR

POTCAR 一般不是手写,而是由对应元素的赝势文件拼接得到。

对这个例子来说,如果只有 Si 元素,那它的 POTCAR 就来自 Si 对应的势文件。

对新手来说,这里最重要的不是记命令,而是知道:

  • POTCAR 必须和结构里的元素顺序一致
  • 你用了什么势,往往会影响结果

KPOINTS

一个最小的自动网格例子:

text
Automatic mesh
0
Gamma
6 6 6
0 0 0

这表示:

  • 用一个 6 x 6 x 6Gamma 中心网格采样倒空间

这个值不是永远固定的,实际中往往要做收敛测试。

8.3 这个计算在做什么

如果把上面四个文件放在一起,这个最小案例做的事情可以粗略说成:

  1. 给出一个 Si 晶体结构
  2. 选择对应 Si 的势函数
  3. 设定平面波截断能和 k
  4. 做一次静态自洽计算
  5. 输出总能量、电子结构相关文件和日志

8.4 运行之后通常会看到什么

如果计算正常完成,你通常会在目录里看到这些常见输出:

  • OUTCAR
  • OSZICAR
  • CONTCAR
  • vasprun.xml

对刚入门的人来说,先知道它们的大致定位就够了:

  • OUTCAR:最详细的大日志
  • OSZICAR:SCF 迭代信息,适合快速看收敛
  • CONTCAR:输出结构
  • vasprun.xml:更适合程序化解析的完整输出