常见问题
重启中断的计算任务?
BDF支持一部分常见任务的断点续算,包括:
SCF单点能:用
guess
关键词读取中断任务的最后一步SCF迭代的分子轨道作为初猜。具体而言,只需在$scf模块中指定初猜为readmo
,并且重新运行该输入文件即可。
$scf ... guess readmo $end
TDDFT单点能:当TDDFT任务中断,且idiag不等于2时,可以读取该任务最后一步TDDFT迭代(当idiag=1时为Davidson迭代,当idiag=3时为iVI迭代)的TDDFT激发矢量作为初猜。其中当idiag=3时,只有采用C(1)对称性的计算允许断点续算。
TDDFT任务断点续算的方式是:在$scf模块里用
guess
关键词读取被中断的任务的收敛的SCF波函数,并在$tddft模块里用iguess
指定读取被中断的任务的TDDFT激发矢量。假设输入文件为$scf ... $end $tddft ... iguess 21 $end
其中iguess=21的十位数2表示选择tight-binding初始猜测(但这对于这个例子而言不是必要的,也就是说以下的讨论对iguess=1或iguess=11也是适用的),而个位数1表示将每步的TDDFT激发矢量写到文件(当idiag=1时,激发矢量保存在后缀为.dvdsonvec*的文件中;当idiag=3时,激发矢量保存在后缀为.tdx的文件中)。如该任务中断,断点续算的方法为将该输入文件改成:
$scf ... guess readmo $end $tddft ... iguess 11 # or 10, if the user is sure that the job will not be interrupted again $end
其中
guess readmo
是为了读取之前SCF迭代的轨道,从而避免浪费时间重新进行SCF迭代;而iguess=11的十位数1表示从.dvdsonvec*或.tdx文件内读取TDDFT激发矢量作为初猜。关于iguess各种取值的意义,详见 tddft 小节。需要注意的是:(1)由于Davidson和iVI方法的特点,以上方法节省的TDDFT迭代次数比同等条件下SCF断点续算节省的迭代次数要少,因此除非之前已经中断的那个任务的TDDFT迭代已经接近收敛,否则断点续算可能并不比从头计算节省迭代次数;(2)TDDFT默认不将迭代当中的TDDFT激发矢量保存到硬盘,必须指定iguess为1、11或21才能将迭代当中的TDDFT激发矢量保存到硬盘。如果此前中断的计算没有包含该关键词,则无法进行断点续算。之所以程序没有默认保存每步的激发矢量,主要是因为这样导致的硬盘读写时间可能不可忽略,因此用户在执行计算时需要权衡是否需要指定保存激发矢量。
结构优化:在$compass模块中加入
restart
关键词即可,具体参见 compass 小节。数值频率计算:在$bdfopt模块中加入
restarthess
关键词即可,具体参见 bdfopt 小节。
BDF如何引用?
使用BDF首先要引用BDF程序的原文 [1, 95, 96, 97] 。除此以外,使用BDF的不同功能还应当同时引用对应方法的文章,参见 引用说明 小节。
TDDFT计算的虚激发能/复激发能问题
如果基态波函数不稳定或者SCF收敛得到的态并非真正的基态,TDDFT计算会提示出现虚激发能, 极少情况下甚至出现复激发能。虚激发能和复激发能无物理意义。当使用Davidson方法时,程序会给出警告**Warning: Imaginary Excitation Energy!**,并在迭代收敛后给出所有虚/复激发能的模;当使用iVI方法时,程序会给出警告**Error in ETDVSI: ABBA mat is not positive! Suggest to use nH-iVI.**,且后续计算不会尝试继续求解虚/复激发能,而是只求解实激发能(因此当使用iVI方法时,不能仅根据最终收敛的激发能全部是实数就断定体系不存在虚/复激发能的激发态)。这时,应重新优化基态波函数,寻找稳定的解,或采用TDA计算激发能。
TDDFT的J、K算符可用内存与计算效率
如果TDDFT计算要求解的根的数目较多,程序默认的内存不够,造成TDDFT计算效率降低。TDDFT模块的关键词 MEMJKOP 可用来设置TDDFT计算J、K算符时最大可用内存。例如要求计算 4 个根,TDDFT给出了如下输出:
Maximum memory to calculate JK operator: 1024.000 M
Allow to calculate 2 roots at one pass for RPA ...
Allow to calculate 4 roots at one pass for TDA ...
提示计算JK算符最大可用内存为 1024M ,这里的单位是兆字节(MB),如果是RPA(即TDDFT)计算,每次积分计算允许算2个根,TDA计算允许算4个根。如果用户要求的是TDA计算,一次积分计算将得到所有根的JK算符,RPA计算需要将积分计算两次,计算效率降低。可以设置 MEMJKOP
为2048MB,增加内存使得每步迭代只需计算一次积分。注意,实际用到的物理内存大约是 2048MB*OMP_NUM_THREADS ,即需要乘以OpenMP线程的数目。
计算出现segmentation fault与可用stack区内存
BDF计算如果出现 segmentation fault ,大多数情况下都是用户可用的stack区内存不够造成的,Linux系统下,可通过命令 ulimit 设置可用stack区内存大小。
首先输入命令:
$ulimit -a
输出提示如下:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 256378
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 4096
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 4096
cpu time (seconds, -t) unlimited
max user processes (-u) 256378
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
这里的 stack size (kbytes, -s) 4096
表示用户可用的stack区内存大小为4096KB,只有4兆,可通过命令
ulimit -s unlimited
设置用户可用stack区内存大小不受限。很多Linux发行版都对stack区内存有限制。严格的说,stack区内存限制大小分为 硬上限 和 软限制 ,普通用户仅有权限设置小于 硬上限 的stack区内存。如果 ulimit -s unlimited
提示错误,
$ulimit -S
-bash: ulimit: stack size: cannot modify limit: Operation not permitted
需要用root账户更改可用stack区的内存 硬上限 或者联系您的系统管理员解决问题。
此外,有时 segmentation fault 也可能是OpenMP的stack区内存不足导致的,此时仅设置 ulimit
还不够,还需要设置OMP_STACKSIZE、KMP_STACKSIZE等环境变量,具体方法参见 OpenMP的stack区内存大小 小节。
OpenMP并行计算
BDF支持OpenMP并行计算,需要在运行脚本中设置可用的OpenMP线程数目,如下:
export OMP_NUM_THREADS=8
这里设置最大可用8个OpenMP线程并行计算。
OpenMP的stack区内存大小
Intel编译器可用stack区内存,特别是使用OpenMP并行计算时,intel编译器将并行区的动态内存放入stack区以获得较高的计算效率。因而,用户需要在BDF的运行脚本中设置OpenMP可用stack区内存大小,如下:
export OMP_STACKSIZE=2048M
这里设置了OpenMP每个线程可用堆区(Stack)内存大小为2048MB. 注意: 如果使用OpenMP做多线程并行,系统使用的总堆区内存为 OMP_STACKSIZE*OMP_NUM_THREADS 。
重要
环境变量OMP_STACKSIZE是通用环境变量,与其它OpenMP运行库的特殊环境变量之间存在覆盖关系:
KMP_STACKSIZE(Intel OpenMP) > GOMP_STACKSiZE(GNU OpenMP) > OMP_STACKSIZE
因此如果在脚本中设置了优先级更高的环境变量,会覆盖OMP_STACKSIZE的值。
Intel 2018版Fortran编译器
Intel 2018版的Fortran编译器Bug较多,编译BDF应避免使用该版本的编译器。
SCF不收敛
参见 SCFTech 章节的 处理自洽场计算的不收敛问题 小节。
SCF能量远低于预期值(较预期值低1 Hartree以上),或SCF能量显示为一串星号
一般是基组线性相关问题导致的。参见 SCFTech 章节的 处理自洽场计算的不收敛问题 小节关于基组线性相关问题的讨论。注意虽然该章节主要讨论的是基组线性相关问题导致SCF不收敛的问题的解决方法,但是这些方法对于基组线性相关问题仅导致SCF能量错误、而并未导致不收敛的情形也是适用的。
如何使用自定义基组
参见 Gaussian-Basis-Set 里的 自定义基组文件 小节。
程序没有进行任何计算就结束
提示“Warning!!! The following input line is skipped. You may need to check the input file!”,且程序没有进行任何计算就结束
首先检查输入文件有没有明显的错误,尤其对于简洁输入,第一行必须以 #!
开头。如果没有的话,检查是不是某些行前面多加了空格,尤其是输入文件的第一行。当使用简洁输入时,第一行的 #!
前面不得有空格,如用户是从其他地方复制来的输入文件,可能因为排版问题,会多复制一些空格,此时必须手动将这些空格删去。