|
|
偶然发现,对于GNU-Linux系统上运行的gaussian 16,可以通过魔改l123.exe的方式来以FCHK的形式保存IRC中间点的波函数。
按以下步骤进行:
1. 将g16程序目录下的l123.exe重命名为l123.exec
2. 在g16程序目录下新建一个bash脚本,内容如下,写好后命名为l123.exe并设置权限为700
- #!/bin/bash
- # get_irc_point_id <g16_log_file> <start_line_no> <back_line_no>
- function get_irc_point_id(){
- if [[ $# -ne 3 || ! -f $1 || $2 -ge $3 || $(($2 + 100)) -le $3 ]]; then
- return 1 # file name or line number error
- else
- local PT_NO=$(awk -v stl=$2 -v btl=$3 'sub(/.*OF POINTS ALONG THE PATH =[ ]+/,"") && NR>=stl && NR<=btl { print }' $1)
- local PP_REC=$(awk -v stl=$2 -v btl=$3 '/Point Number:.*Path Number:/ && NR>=stl && NR<=btl { print }' $1)
- local PT_NO_REP=$(echo $PP_REC | sed 's/.*Point Number:[ ]*\([0-9]*\).*/\1/')
- local PATH_NO=$(echo $PP_REC | sed 's/.*Path Number:[ ]*\([0-9]*\).*/\1/')
- if [[ -z "$PT_NO" || ! -z "$(echo "$PT_NO" | sed 's/[0-9]//g')" ]]; then
- return 2 # point number not found
- elif [[ "$PATH_NO" == "1" && $PT_NO != "$PT_NO_REP" ]]; then
- return 3 # point number mismatch
- elif [[ -z "$PATH_NO" || ! -z $(echo "$PATH_NO" | sed 's/[0-9]//g') ]]; then
- return 4 # path number not found
- else
- echo "path${PATH_NO}_pt$PT_NO_REP"
- return 0
- fi
- fi
- }
- # get_last_irc_point_id <g16_log_file>
- # determine whether the last L123 IRC output block in g16_log_file print converged point info.
- # if the converged point info is found there, it is printed as "path<xxx>_pt<yyy>";
- # otherwise return error code.
- function get_last_irc_point_id(){
- if [[ ! -f $1 ]]; then
- return 5
- else
- local TARGET_RANGE=$(awk '/IRC-IRC-IRC-IRC/ {print NR}' $1 | tail -n2)
- get_irc_point_id $1 $TARGET_RANGE
- return $?
- fi
- }
- prog_path=$(dirname $0)
- if [[ ! -f "$IGAUSS_CHK_PATH" || ! -f "$IGAUSS_LOG_PATH" ]]; then
- #echo "IRC wfn backup: checkpoint or log file not set properly from env!"
- else
- IGAUSS_CHK_BACKUP_PATH=$IGAUSS_CHK_PATH.bak.chk
- LAST_POINT_ID=$(get_last_irc_point_id $IGAUSS_LOG_PATH)
- if [[ $? -eq 0 && ! -z "$LAST_POINT_ID" ]]; then
- formchk $IGAUSS_CHK_BACKUP_PATH $IGAUSS_CHK_PATH.$LAST_POINT_ID.fchk
- fi
- cp $IGAUSS_CHK_PATH $IGAUSS_CHK_BACKUP_PATH
- fi
- exec $prog_path/l123.exec $*
复制代码
3. 之后在执行IRC计算任务前,如果设置环境变量IGAUSS_CHK_PATH为任务的chk文件绝对路径,并设置环境变量IGAUSS_LOG_PATH为任务的输出文件绝对路径(均包含文件名),则在IRC运行过程中,会有一系列后缀为pathM_ptN.fchk的文件保存到chk文件所在的文件夹下,它们存了中间各点的SCF波函数,可以用multiwfn查看。关于最后一个点的波函数,可以从原chk中读出,就不额外存了。 |
|