Small Box FFT学习笔记(二):顶层调用

从本篇开始,将开始对于SBFFT相关代码的学习。我使用的是北京大学陈默涵老师使用Fortran 03语言编写的SBFFT软件包(相关信息参见这里)。我的学习思路是首先弄清楚顶层相关子程序(subroutine)的调用,然后学习底层的基本数据结构以及SBFFT算法的实现,最后将顶层调用的子程序与上一篇中的计算流程对应起来。本文讨论的子程序调用也可以看作软件一个简明版本的API手册。

在SBFFT软件包中计算Hartree势(上一篇中我们称为库仑势)是通过调用CalPotPlus4中的CalculatePotentialPlus4子程序(CalPotential4.f90文件)实现的。在这一子程序中,通过调用一系列形式为CalculateHartree*的子程序来实现输入的电荷密度rhoIn到库仑势potential的计算,注意这两个数组的大小总是一致的。下面先来介绍这些子程序的相关参数:

(1) HartInit模块中的CalculateHartreePotPlus子程序(HartInit.f90文件),这一子程序使用全局算法计算库仑势,需要进行两次DG-FFT计算。

subroutine CalculateHartreePotPlus(
	real*8, dimension( *, *, * )  	rhoIn,
	real*8, dimension( *, *, * )  	potential,
	logical  						calcEnergy,
	real*8, dimension(9)  			locETable
	)

(2) HartInit模块中的CalculateHartreeSB子程序(HartInit.f90文件),这一子程序使用分块方法计算库仑势,即使用上一篇中的计算流程。

subroutine CalculateHartreeSB(
	real*8, dimension( *, *, * )  	rhoIn,
	real*8, dimension( *, *, * )  	potential,
	logical  						calcEnergy,
	real*8  						energy_short,
	real*8  						energy_long
	)

(3) HartStep1模块中的CalculateHartree_step1子程序(HartStep1.f90文件),这一子程序与CalculateHartreePotPlus类似,也是进行全局的DG-FFT计算,不同的是这一子程序可以使用自定义的核函数,并且通过short_kernel_flag和long_kernel_flag两个变量来分别控制是否使用短程和长程项。

subroutine CalculateHartree_step1(
	logical  						short_kernel_flag,
	logical  						long_kernel_flag,
	real*8, dimension( *, *, * )  	rhoIn,
	real*8, dimension( *, *, * )  	potential,
	logical  						calcEnergy,
	real*8,  						energy_long,
	real*8, dimension(9)  			locETable
	)

(4) HartStep2模块中的CalculateHartree_step2子程序(HartStep2.f90文件),通过分块方法计算短程库仑势,即使用上一篇中的算法。

subroutine CalculateHartree_step2(
	real*8, dimension( *, *, * )  	rhoIn,
	real*8, dimension( *, *, * )  	potential,
	logical  						calcEnergy,
	real*8,  						energy_short
	)

(5) HartStep3模块中的CalculateHartree_step3子程序(HartStep3.f90文件),通过分块方法计算长程库仑势,即使用上一篇中的算法。

subroutine CalculateHartree_step3(
	real*8, dimension( *, *, * )  	rhoIn,
	real*8, dimension( *, *, * )  	potential,
	logical  						calcEnergy,
	real*8,  						energy_long
	)

(6) HartStep4模块中的CalculateHartree_step4子程序(HartStep4.f90文件),与CalculateHartree_step3功能相似,不同之处在于(当calcEnergy为.TRUE.)时还将计算分块方法和全局算法得到的Hartree能量并进行比较。

subroutine CalculateHartree_step4(
	real*8, dimension( *, *, * )  	rhoIn,
	real*8, dimension( *, *, * )  	potential,
	logical  						calcEnergy,
	real*8  						energy_long
	)

在CalculatePotentialPlus4子程序中是通过字符串sbtype_har来控制使用不同的算法来对短程和长程项进行处理,具体说明如下:

(1) sbtype_har为”DGBX”时,使用全局算法计算短程和长程项,相应的调用为:

call CalculateHartreePotPlus(rhoIn, potential, ...)

(2) sbtype_har为”DSBX”时,使用分块方法计算短程和长程项,相应的调用为:

call CalculateHartreeSB(rhoIn, potential, ...)

(3) sbtype_har为”DGT1″时,使用全局算法计算短程和长程项,但是使用自定义的核函数,相应的调用为:

call CalculateHartree_step1('TRUE', 'TRUE', rhoIn, potential, ...)

(4) sbtype_har为”DGT2″时,短程项使用分块算法,长程项使用全局算法,相应的调用为:

call CalculateHartree_step1('FALSE', 'TRUE', rhoIn, potential, ...)
call CalculateHartree_step2(rhoIn, potential, ...)

(5) sbtype_har为”DGT3″时,短程项使用全局算法,长程项使用分块算法 ,相应的调用为:

call CalculateHartree_step1('TRUE', 'False', rhoIn, potential, ...)
call CalculateHartree_step3(rhoIn, potential, ...)

(6) sbtype_har为”DGT4″时,与(5)计算效果相同,增加全局算法计算长程项并与分块方法进行比较 ,相应的调用为:

call CalculateHartree_step1('TRUE', 'False', rhoIn, potential, ...)
call CalculateHartree_step4(rhoIn, potential, ...)

可以看到”DGBX”和”DSBX”选项是常用的,分别对应全局算法和上一篇中介绍的分块算法,”DGT*”选项可以用于测试。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注