重なり積分を詳細に計算します

重なり積分

重なり積分は量子化学計算を行う上では「基本のき」です。このページでは量子化学計算を行うにあたり、必要な基底関数(原子軌道とイメージしてください)の重なり積分をp軌道まで含めて計算する詳細について解説します。

量子化学計算の基底関数にはGauss関数が用いられますが、Gauss関数同士の積もまたGauss関数であることを利用していることに注目です。

目次

(s|s)について

早速ですが、まずはs軌道同士の重なり積分を計算します。位置$\boldsymbol{A}$にある原子Aのs軌道($G(a,\boldsymbol{A})$)と位置$\boldsymbol{B}$にある原子Bのs軌道($G(b,\boldsymbol{B})$)の重なり積分(s|s)を考えます。

Gauss関数同士の積もまたGauss関数

量子化学プログラミングにおいて、もっともよく利用するのは「Gauss関数同士の積はGauss関数」という性質です。

計算するとすぐにわかりますが、位置$\boldsymbol{A}$を中心とするガウス関数$G(a,\boldsymbol{A}=\exp(-a\boldsymbol{r}_A^2)$と位置$\boldsymbol{B}=\exp(-b\boldsymbol{r}_B^2)$を中心とするガウス関数$G(b,\boldsymbol{B})$の積は、(係数$K_{AB}=\exp(-\frac{ab}{a+b}AB^2)$が新たに付け加わりますが、)係数$a+b$で位置$\frac{a\boldsymbol{A}+b\boldsymbol{B}}{a+b}$を中心とするガウス関数になります。

重なり01

この性質を利用するとs軌道同士の積分はかなり簡単にもとまります。

重なり積分02

最後にガウス積分の公式$\int^\infty_{-\infty}\exp(-ax^2)dx=\sqrt{\pi/a}$を使っています。

$(s|s)$は以下のコードで表現できます。「SSS」が$\exp(-\frac{ab}{a+b}AB^2)(\frac{\pi}{a+b})^{\frac{3}{2}}$を表しています。EX、CXはガウス関数の指数と係数を表していいます(基底関数が$\text{CX}\exp(-\text{EX}r^2)$の形です)。

           ZETA = EX(I_BAS,I)+EX(J_BAS,J)
           GZAI = EX(I_BAS,I)*EX(J_BAS,J)/ZETA
           SSS  = EXP(-GZAI*d2)*(PI/ZETA)**(1.50d0)
           CXIJ= CX(I_BAS,I)*CX(J_BAS,J)

           IF((NBAS_TYPE(I_BAS).EQ.0).AND.(NBAS_TYPE(J_BAS).EQ.0)) THEN
C         < s1 | s1 >
           s_t = s_t + CXIJ*SSS

           ENDIF

(p|s)について

s軌道同士の重なり積分の次はp軌道とs軌道の重なり積分を考えましょう。

計算の前に、そもそも位置$\boldsymbol{A}$を中心とするp軌道の原子軌道がどのように表されるかご存じでしょうか?

じつは、量子化学計算のpx軌道は$\boldsymbol{r}_A=\boldsymbol{r}-\boldsymbol{A}$を利用して、$(x-A_x)\exp(-a\boldsymbol{r}_A^2)$で表すことができます。つまりs軌道$G(a,\boldsymbol{A}=\exp(-a\boldsymbol{r}_A^2)$に$(x-A_x)$をかけるだけでpx軌道を表すことができるのです。

そして、このp軌道(px軌道)は原子位置$\boldsymbol{A}$の$x$座標でs軌道を偏微分することで得られることもわかります。$\boldsymbol{r}_A^2=(x-A_x)^2+(y-A_y)^2+(z-A_z)^2$であることから確認は難しくありません。

重なり積分03

このp軌道(px軌道)は原子位置$\boldsymbol{A}$の$x$座標でs軌道を偏微分することで得られることを利用すると、$(p_x|s)$は$(s|s)$に$(P_x-A_x)$をかけたものに等しいことがわかります。

重なり積分04

$(p_x|s)$は下のようなコードで記述できます。SSSが$(s|s)$を表しています。

C          < px | s1 >
           DO NDimI = 1,3
           IF((NBAS_TYPE(I_BAS).EQ.NDimI)
     1                               .AND.(NBAS_TYPE(J_BAS).EQ.0)) THEN
          
            s_t = s_t + CXIJ *(PP(NDimI)-PA(NDimI))*SSS
           ENDIF
           ENDDO

(p|p)について

$(p|p)$も$(p|s)$と同じように$(x-A_x)\exp(-a\boldsymbol{r}_A^2)=\frac{1}{2a}\frac{\partial}{\partial{A}_x}\exp(-a\boldsymbol{r}_A^2)$を利用することで計算が簡単にできます。

重なり積分05

$(p|p)$の積分をサブルーチンは次のように書けます。

      SUBROUTINE CALC_PP(NDimI,NDimJ,PA,PB,PP,ZETA,GZAI,d2,SSS,VAL)

      IMPLICIT NONE
      INTEGER  NDimI,NDimJ
      DOUBLE PRECISION  ZETA,GZAI,d2,SSS,VAL
      DOUBLE PRECISION  PA(3),PB(3),PC(3),PD(3)
      DOUBLE PRECISION  PP(3),PQ(3),PR(3) 

      VAL = (PP(NDimI)-PA(NDimI))*(PP(NDimJ)-PB(NDimJ))*SSS

      IF(NDimI.EQ.NDimJ) THEN
      VAL = VAL + 0.50d0/ZETA*SSS
      ENDIF

      ENDSUBROUTINE

まとめ

このページでは量子化学計算の基本となる重なり積分の計算を行いました。$(s|s)$の重なり積分は一般的なGauss積分をそのまま利用できるのは明らかかと思います。さらにp軌道が混じった重なり積分であっても少し工夫をすると$(s|s)$の積分と同じように求めることがわかったかと思います。

また、プログラミングについても重なり積分の最終的な標識を素直に記述すれば求められることがわかります。

目次