Algorithm used in outwin in WIEN2k (CN)
背景
outwin.f在WIEN2k各程序中出现, 它包含例程outwin
. 之前大略知道它是用来计算原子球内的径向波函数的, 但对于其算法一直很模糊, 一方面由于它涉及相对论方程, 另一方面它除了输入参数的德语注释外一句注释也没有. 最近在研究局域基组生成的问题, 而这个例程出现频率非常高, 因此准备多啃一下这块代码.
不同SRC文件下的 outwin.f 版本也不尽同. SRC_nmr
, SRC_lapw7
等仍然使用Adams-Moulton四阶算法, SRC_lapw2
对于第四个以外的格点允许用五阶算法. SRC_lapw7
中的注释更多一些, 但仍然用的是四阶算法. 这里尝试对 SRC_lapw7
中的 outwin.f 源码进行解读.
原理
在 Rydberg 单位下, 具有量子数 $\kappa$ 的大分量波函数 $u(r)=G(r)/r$ 满足1
其中
$\alpha$ 为精细结构常数, 在Rydberg单位下 $\alpha=2/c$, $c$ 为光速. 为在步长$h$的对数格点上进行数值计算, 作变量替换 $r=r_0 e^x$, $\mathrm{d}r=r\mathrm{d}x$, 得到关于$x$的方程组
方便起见, 上式中略去了 G,F,M 的变量 $r\equiv r(x)$, 撇号表示关于x求导.
源码解读
参数
行66-81
行83-91
从81行开始是对第四个及以后的格点的循环. X
为-h, DRDI
为rh. 其他一些的中间量与式
从而可以将式
令$A=G, B=F/c$, $A’=G’, B’=F’/c$, 得到
行92-96
由行列式解线性方程的知识可知, 这部分求解的是这样一个矩阵方程
这里下标c表示在代码(code)中的定义. B1
和 B2
在 93 和 94 行计算, 基于Adams-Moulton算法, 因为 8/3 来自于四阶算法
其中 $f(t_{n}, y_{n})=y’_{n}$ 为第n格点上y的导数.
利用上式, $A’_{n+3}$ 可以写成
将式
如果把上式看成未知数 $A_{n+3}$ 和 $B_{n+3}$ 的二元一次方程, 其系数矩阵和 DGn
和DFn
的含义(见下面一节)以及系数Rn
, 可以发现式子 B1
和B2
也是一致的. 因此我们定义的$A$和$B$与outwin.f中的含义是一致的.
行98-103
更新最外的三个点的导数值, 以用于计算下一个格点上的B1
和B2
. 其中Dx1
和Dx2
分别用Dx2
和Dx3
替代, 即97, 98, 101和102行, 在格点迭代的语境下很好理解. DG3
的更新表达式
1
DG3 = U*B(K) - X*A(K)
由式 X
等于-h, 可得 DG3
是$h$乘以A在格点K上的导数. 同理, DF3
的更新表达式
1
DF3 = X*B(K) - Y*A(K)
意味着$DF3 = -h B_K - Y_K A_K = h B’_K$. 因此DF3
是$h$乘以B在格点K上的导数.
行107-109
这一个循环对B进行了scaling, $B \to cB/2= F/2=\alpha F$. 报告1指出F与小分量有关, 但具体关系暂未推导.
行111-113
由于$A=G=ru$, 因此VAL
就是最后一个格点上的波函数值. 而SLO
的数学表示
为波函数在边界上的导数.
总结
作者阅读WIEN2k v16.1版本中例程outwin
源码并试图理解其所用到的算法. outwin.f 中的outwin
例程利用Adams-Moulton算法求解标量相对论方程