使用FCClasses3程序计算系间窜越速率
使用FCClasses3程序计算系间窜越速率

使用FCClasses3程序计算系间窜越速率

使用FCClasses3程序计算系间窜越速率
Calculating Intersystem Crossing Rate via FCClasses3 Program

Jiawei Xu
Released: 2023-06-12 / Updated: 2023-06-12

计算系间窜越(Intersystem Crossing, ISC)速率是准确考察多态反应机理的关键之一,其方法并不唯一。本文将介绍由意大利金属有机化学研究所Fabrizio Santoro等开发的FCClasses程序的安装以及计算ISC速率的方法。

1. 程序安装

FCClasses的最新版本为3.0.1,可在http://www.iccom.cnr.it/en/fcclasses登记并下载程序源代码和手册。FCClasses3是Fortran写的,需要gfortran或ifort编译器,支持LaPack或MKL数学库,默认使用LaPack,同时可选FFTW快速傅立叶变换库。

tar -xf fcclasses3-3.0.1.tar.gz
mkdir fcclasses3
cd fcclasses3-3.0.1
./configure --prefix=/home/jwxu/programs/fcclasses3 --with-mkl --with-fftw (如不使用MKL或FFTW,不写即可)
make -j && make install -j
make test
cd ..
rm -rf fcclasses3-3.0.1*

make test后会运行一系列任务检查是否安装正确,一般不需要全部运行完,如前几个任务都显示成功运行,就可以结束测试。安装完成后,所有的可执行文件都在/home/jwxu/programs/fcclasses3/bin下,并需要在.bashrc中添加环境变量:export PATH=$PATH:/home/jwxu/programs/fcclasses3/bin。FCClasses的绝大多数任务都可以直接在登陆节点上运行。

2. 计算系间窜越速率

以S1-T1之间的系间窜越过程为例,首先通过Gaussian16进行构型优化和频率计算,得到.fchk文件。FCClasses需要提供结构、梯度和Hessian矩阵信息,由其自带的脚本可以生成对应格式的输入文件:

gen_fcc_state -i S1.fchk
gen_fcc_state -i T1.fchk

以上命令产生了S1.fcc和T1.fcc两个文件。准备以下输入文件fcc.inp:

$$$
PROPERTY     =   NR0  ; OPA/EMI/ECD/CPL/RR/TPA/MCD/IC
MODEL        =   AH   ; Adiabatic Hessian; AS/ASF/AH/VG/VGF/VH
DE           =   0.150 ; Energy difference in eV
NR0_COUPL    =   5.00E-6 ; Spin-orbit coupling integral in a.u.
TEMP         =   298.15 ; Temperature in K
BROADFUN     =   GAU  ; GAU/LOR/VOI
HWHM         =   0.06 ; Broadening width in eV
METHOD       =   TD   ; Time-dependent; TI/TD
ROT          =   1    ; Rotate state 1
;VIBRATIONAL ANALYSIS
NORMALMODES  =   COMPUTE   ; COMPUTE/READ/IMPLICIT
COORDS       =   CARTESIAN ; CARTESIAN/INTERNAL
;INPUT DATA FILES
STATE1_FILE  =   S1.fcc
STATE2_FILE  =   T1.fcc

注意修改输入文件中的两态能量差(末态减去初态)以及旋轨耦合积分的数值。然后运行:

fcclasses3 fcc.inp

运行成功后得到一系列输出文件,可从fcc.out读取系间窜越速率,同时目录下的其他输出文件还提供了Huang-Rhys因子、Duschinsky矩阵以及位移矢量的相关信息。

 ========================================================
 Non-radiative rate constant (s-1)  1.425E+08
 (for Ead =    -0.177 eV)
 ========================================================

3. 便捷脚本

以下是一个全自动计算ISC速率的脚本,可供参考:

#!/bin/bash
# Usage: ./runfcc mol1 S1 T1

mol=$1
state1=$2
state2=$3

exc="S1 T2"

mkdir -p $mol/fcc-$state1-$state2; cd $mol/fcc-$state1-$state2

### Generate .fcc inputs
cp ../$state1/$mol-$state1.chk ../$state2/$mol-$state2.chk .
for i in *.chk
do
  name=`basename $i .chk`
  fchk16 $i $name.fchk
  gen_fcc_state -i $name.fchk
done
rm *.chk

### Get energy difference
if [[ "$exc" =~ "$state1" ]]
then
  set `grep "E(TD-HF/TD-DFT)" ../$state1/$mol-$state1.log | tail -1`
else
  set `grep "SCF Done" ../$state1/$mol-$state1.log | tail -1`
fi
E1=$5

if [[ "$exc" =~ "$state2" ]]
then
  set `grep "E(TD-HF/TD-DFT)" ../$state2/$mol-$state2.log | tail -1`
else
  set `grep "SCF Done" ../$state2/$mol-$state2.log | tail -1`
fi
E2=$5

dE=`echo "scale=10; ($E2)-($E1)" | bc`
dE=`echo "$dE*27.2114" | bc`
echo "The energy difference is $dE eV."

### Get spin-orbit coupling integral from DALTON output
grep "B excited state no., symmetry, spin:             ${state1:0-1}" ../../dalton/$state1*dalton/$mol/*.out -A 3 -B 2 > null1
grep "C excited state no., symmetry, spin:             ${state2:0-1}" null1 -A 3 -B 2 > null2
set `grep X1SPNORB null2 -A 5`; socx=${39}
set `grep Y1SPNORB null2 -A 5`; socy=${39}
set `grep Z1SPNORB null2 -A 5`; socz=${39}

soc2=`echo "scale=20; ($socx^2)+($socy^2)+($socz^2)" | bc`
soc=`echo "sqrt($soc2)" | bc`
rm null1 null2
echo "The spin-orbit coupling integral is $soc a.u."

### Generate FCClasses main input
rm -f $mol-fcc-$state1-$state2.inp
cat >> $mol-fcc-$state1-$state2.inp << EOF
\$\$\$
PROPERTY     =   NR0  ; OPA/EMI/ECD/CPL/RR/TPA/MCD/IC
MODEL        =   AH   ; AS/ASF/AH/VG/VGF/VH
DE           =   $dE
NR0_COUPL    =   $soc ; SOC
TEMP         =   298.15 ; (temperature in K)
BROADFUN     =   GAU  ; GAU/LOR/VOI
HWHM         =   0.06 ; (broadening width in eV)
METHOD       =   TD   ; TI/TD
ROT          =   1    ; Rotate state 1
;VIBRATIONAL ANALYSIS
NORMALMODES  =   COMPUTE   ; COMPUTE/READ/IMPLICIT
COORDS       =   CARTESIAN ; CARTESIAN/INTERNAL
;INPUT DATA FILES
STATE1_FILE  =   $mol-$state1.fcc
STATE2_FILE  =   $mol-$state2.fcc
EOF

### Run FCClasses
fcclasses3 $mol-fcc-$state1-$state2.inp