Processing math: 100%
0%

利用.fch 文件计算电子密度的代码

最近在看密度泛函的书,于是就想自己写一个能计算电子密度的程序,这样就可以具体地了解一些体系。而且由于更早一些时候才正经学了基组的知识,想弄清楚怎么把市面上的基组放在程序中使用(之前写 HF 程序用的是 STO-3G,不涉及到分裂价层,而且没有涉及更多的壳层)。所以写这么一个程序还是可以帮我学到很多东西的。

代码上传到 GitHub:https://github.com/St-Maxwell/ElectronDensity

参考了 Sobereva 的文章:高斯 fch 文件与 wfn 波函数文件的介绍及转换方法利用 wfn 文件计算电子密度的代码的编写方法

电子密度

在空间 r 处找到任意一个电子的概率。 ρ(r)=N|Ψ(x1,x2,,xN)|2dω1dx2dxN 将上式展开为空间轨道(分子轨道){ψa},为 ρ(r)=2N/2a|ψa(r)|2 若是自然轨道,则为 ρ(r)=N/2aλa|ηa(r)|2 其中 ηa 是自然轨道,λ 是自然轨道占据数。 实际计算中将用一组基函数将轨道展开,则密度的表达式可写为 ρ(r)=N/2aλ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(2lx1)!!(2ly1)!!(2lz1)!!]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/2aλaψ2a(r)=N/2a2λaψa(r)ψa(r)x 分子轨道的导数最终可以用 GTF 的导数的线性组合表示: ψa(r)x=iCaijaijχj(r)x GTF 关于 x 的导数很容易得到,为 χj(r)x=(lxxlx12ζxlx+1)Nylyzlzeζr2 梯度的模 |ρ|=(ρx)2+(ρy)2+(ρz)2

需要从.fch 文件读取的量

波函数类型 如果是自然轨道,需要手动将.fch 文件第一行内容改为 isNO; 从第二行确定波函数为 RURO。若使用的方法首字母为 O,且为闭壳层的情况,会误认为波函数为 RO,虽然并不影响密度的计算。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
SP        RB3LYP                                   6-31G(d,p)
电子数
Number of electrons I 10
Number of alpha electrons I 5
Number of beta electrons I 5
基函数数目
Number of basis functions I 25
收缩壳层数目
Number of contracted shells I 10
原函数数目
Number of primitive shells I 21
壳层类型
Shell types I N= 10
每个壳层的收缩度
Number of primitives per shell I N= 10
原函数的指数
Primitive exponents R N= 21
原函数收缩系数
Contraction coefficients R N= 21
原函数收缩系数(sp(p)型函数)
P(S=P) Contraction coefficients R N= 21
基函数坐标
Coordinates of each shell R N= 30
分子轨道系数
Alpha MO coefficients R N= 625
对于自然轨道,这一部分数据实际上是轨道占据数
Alpha Orbital Energies R N= 25

.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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
use m_basis_func
use m_routines
type(molecule) :: mol
integer :: iounit
character(len=80) filename
real(kind=8) :: x, y, z

! read .fch file
write(*,*) "Input .fch file"
read(*,*) filename
open(newunit=iounit, file=filename, status='old', action='read')
call read_basis_func(iounit, mol)
call read_mo_coeff(iounit, mol)
close(iounit)

write(*,*) mol%density(x, y, z, 't')
! 't' - total density
! 'a' - alpha density
! 'b' - beta density
write(*,*) mol%den_grad(x, y, z, 'x')
! 'x' - x component of gradient
! 'y' - y component of gradient
! 'z' - z component of gradient
! 'm' - magnitude of gradient

例子

CH3 自由基



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

H2 分子



H2 沿所在轴的电子密度,注意到在核的位置电子密度梯度不连续。


电子密度梯度的空间分布,分子所在轴为 z 轴。可以与上图电子密度的变化进行对照。