最近在看密度泛函的书,于是就想自己写一个能计算电子密度的程序,这样就可以具体地了解一些体系。而且由于更早一些时候才正经学了基组的知识,想弄清楚怎么把市面上的基组放在程序中使用(之前写 HF 程序用的是 STO-3G,不涉及到分裂价层,而且没有涉及更多的壳层)。所以写这么一个程序还是可以帮我学到很多东西的。
代码上传到 GitHub:https://github.com/St-Maxwell/ElectronDensity
参考了 Sobereva 的文章:高斯 fch 文件与 wfn 波函数文件的介绍及转换方法、利用 wfn 文件计算电子密度的代码的编写方法。
电子密度
在空间 r 处找到任意一个电子的概率。 ρ(r)=N∫|Ψ(x1,x2,…,xN)|2dω1dx2…dxN 将上式展开为空间轨道(分子轨道){ψa},为 ρ(r)=2N/2∑a|ψa(r)|2 若是自然轨道,则为 ρ(r)=N/2∑aλa|ηa(r)|2 其中 ηa 是自然轨道,λ 是自然轨道占据数。 实际计算中将用一组基函数将轨道展开,则密度的表达式可写为 ρ(r)=N/2∑aλa|∑iCaiφi(r)|2 Cai 是展开系数,λa 对于分子轨道就是 2,对于自然轨道则是非整数。 基函数同样可以用一组 Gaussian 型函数(Gaussian Type Function,GTF)展开: φ=∑iaiχGTFi(x,y,z) ai 是收缩系数,χGTF 假定是 Cartesian 型 GTF,有如下形式 χ=Nxlxylyzlze−ζr2 归一化系数 N 的表达式为 N=(2ζπ)3/4[(4ζ)lx+ly+lz(2lx−1)!!(2ly−1)!!(2lz−1)!!]1/2=(2ζπ)3/4[(8ζ)lx+ly+lzlx!ly!lz!(2lx)!(2ly)!(2lz)!]1/2电子密度的梯度
电子密度的梯度为 ∇ρ(r)=∂ρ(r)∂xx+∂ρ(r)∂yy+∂ρ(r)∂zz 以 ∂ρ/∂x 为例: ∂ρ∂x=∂∂xN/2∑aλaψ2a(r)=N/2∑a2λaψa(r)∂ψa(r)∂x 分子轨道的导数最终可以用 GTF 的导数的线性组合表示: ∂ψa(r)∂x=∑iCai∑jaij∂χj(r)∂x GTF 关于 x 的导数很容易得到,为 ∂χj(r)∂x=(lxxlx−1−2ζxlx+1)Nylyzlze−ζr2 梯度的模 |∇ρ|=√(∂ρ∂x)2+(∂ρ∂y)2+(∂ρ∂z)2需要从.fch 文件读取的量
波函数类型 如果是自然轨道,需要手动将.fch
文件第一行内容改为 isNO
;
从第二行确定波函数为 R
、U
、RO
。若使用的方法首字母为 O,且为闭壳层的情况,会误认为波函数为 RO
,虽然并不影响密度的计算。
1 | SP RB3LYP 6-31G(d,p) |
.fch 文件波函数类型
Gaussian
- 限制性分子轨道
- 闭壳层:默认即可
- 限制性开壳层:
RO
- 非限制性分子轨道
- 开壳层:默认即可
- 自旋极化单重态:
UHF/DFT guess=mix
- 自然轨道
density=current
+guess(save,only,naturalorbitals) chkbasis
- 限制性闭壳层:默认
- 非限制性开壳层:默认
- 限制性开壳层:不支持(
RO
后 HF 都没有解析梯度) - 自旋极化单重态:以
UHF/DFT guess=mix
作为参考态 - Gaussian 输出的.fch 中,自然轨道不包含自旋信息,其占据数为 0--2。虽然会输出
beta
轨道信息,但实际上和alpha
轨道的信息一模一样。
用法
1 | use m_basis_func |
例子
CH3 自由基

自由基所在平面上的电子密度。
H2 分子

H2 沿所在轴的电子密度,注意到在核的位置电子密度梯度不连续。
电子密度梯度的空间分布,分子所在轴为 z 轴。可以与上图电子密度的变化进行对照。