Two-electron SCF Fortran Code

Started: 02 Aug 2025
Updated: 05 Aug 2025

Table of Content

Main Program

two-electron SCF fortran code diagram

HF Calculation

	IMPLICIT DOUBLE PRECISION(A-H, O-Z)
	IOP = 2 
	N = 3 
	R = 1.4632D0
	ZETA1 = 2.0925D0
	ZETA2 = 1.24D0
	ZA = 2.0D0
	ZB = 1.0D0
	! Call the subroutine to perform the calculation
	CALL HFCALC(IOP, N, R, ZETA1, ZETA2, ZA, ZB)
	END 

	SUBROUTINE HFCALC(IOP, N, R, ZETA1, ZETA2, ZA, ZB)
	IMPLICIT DOUBLE PRECISION (A-H,O-Z)
	IF (IOP .EQ. 0) GOTO 20
	PRINT 10, N, ZA, ZB
10    FORMAT(1H1, 2X, 4HSTO-, I1,21HG FOR ATOMIC NUMBERS, 
     +       F5.2, 5H AND, F5.2)
	 CALL INTGRL(IOP, N, R, ZETA1, ZETA2, ZA, ZB) ! calculate integrals
	 CALL COLECT(IOP, N, R, ZETA1, ZETA2, ZA, ZB) ! put all integrals into arrays
	 CALL SCF(IOP, N, R, ZETA1, ZETA2, ZA, ZB) ! perform SCF calculation
20    CONTINUE
	RETURN
	END

Integral

SCF requires the evaluation of several integrals over the basis set $\{\phi_{\mu} \}$:

Overlap Integral

Core Hamiltonian

Kinetic Energy Integral

Potential Integral

Two-electron Integral Derivation

Electron Repulsion G matrix

Collecting the elements

Self-Consistent Field (SCF) Procedure

Integral Solutions

Two-Electron Integral

FUNCTION TWOE(A, B, C, D, RAB2, RCD2, RPQ2)
    IMPLICIT DOUBLE PRECISION (A-H,O-Z)
    DATA PI/3.1415926535898D0/
    TWOE=2.0D0*PI**(2.5D0)/((A+B)*(C+D)*DSQRT(A+B+C+D))
    + *F0((A+B)*(C+D)*RPQ2/(A*B+C*D))
    + *DEXP(-A*B*RAB2/(A+B)-C*D*RCD2/(C+D))
    RETURN
END 
\[(ab|cd) = \frac{2\pi^{5/2}}{(a+b)(c+d)\sqrt{a+b+c+d}} \times \exp\left(-\frac{ab}{a+b}R_{AB}^2 - \frac{cd}{c+d}R_{CD}^2\right) \times F_0(T)\]

where $ T = \frac{(a+b)(c+d)}{a+b+c+d}R^2_{PQ}$ and $F_0(T)$ is the error function computed using F0(ARG) function.

Overlap Energy

FUNCTION S(A,B,RAB2)
    IMPLICIT DOUBLE PRECISION(A-H, O-Z)
    DATA PI/3.1415926535898D0/
    S = (PI/(A+B))**1.5D0*DEXP(-A*B*RAB2/(A+B))
    RETURN
END

Kinetic Energy

FUNCTION T(A,B,RAB2)
IMPLICIT DOUBLE PRECISION(A-H, O-Z)
DATA PI/3.1415926535898D0/
    T=A*B/(A+B)*(3.0D0-2.0D0*A*B*RAB2/(A+B))*(PI/(A+B))**1.5D0
    +    *DEXP(-A*B*RAB2/(A+B))
    RETURN
END

Potential Energy

FUNCTION V(A,B,RAB2,RCP2,ZC)
    IMPLICIT DOUBLE PRECISION(A-H, O-Z)
    DATA PI/3.1415926535898D0/
    V=2.0D0*PI/(A+B)*FO((A+B)*RCP2)*DEXP(-A*B*RAB2/(A+B))
    V = -V*ZC
    RETURN
END

Diagonalization

\[C=\left(\begin{array}{cc} \cos \theta & \sin \theta \\ \sin \theta & -\cos \theta \end{array}\right)\] \[\theta=\frac{1}{2} \arctan \left(\frac{2 F_{12}}{F_{11}-F_{22}}\right)\] \[\begin{aligned} &E_{11}=F_{11} \cos ^2 \theta+F_{22} \sin ^2 \theta+F_{12} \sin (2 \theta)\\ &E_{22}=F_{11} \sin ^2 \theta+F_{22} \cos ^2 \theta-F_{12} \sin (2 \theta) \end{aligned}\]
SUBROUTINE DIAG(F,C,E)
        IMPLICIT DOUBLE PRECISION(A-H,O-Z)
        DIMENSION F(2,2), C(2,2), E(2,2)
        DATA PI/3.1415926535898D0/
        IF (DABS(F(1,1)-F(2,2)) .GT. 1.0D-20) GO TO 10

        THETA = PI/4.0D0
        GO TO 20
  10    CONTINUE

        THETA = 0.5D0*DATAN(2.0D0*F(1,2)/(F(1,1)-F(2,2)))
  20    CONTINUE
        C(1,1) = DCOS(THETA)
        C(2,1) = DSIN(THETA)
        C(1,2) = DSIN(THETA)
        C(2,2) = -DCOS(THETA)
        E(1,1) = F(1,1)*DCOS(THETA)**2+F(2,2)*DSIN(THETA)**2
     $  +F(1,2)*DSIN(2.0D0*THETA)
        E(2,2) = F(2,2)*DCOS(THETA)**2+F(1,1)*DSIN(THETA)**2
     $  -F(1,2)*DSIN(2.0D0*THETA)
        E(2,1) = 0.0D0
        E(1,2) = 0.0D0

        IF(E(2,2) .GT. E(1,1)) GO TO 30
        TEMP = E(2,2)
        E(2,2) = E(1,1)
        E(1,1) = TEMP
        TEMP = C(1,2)
        C(1,2) = C(1,1)
        C(1,1) = TEMP
        TEMP = C(2,2)
        C(2,2) = C(2,1)
        C(2,1) = TEMP
  30    RETURN
       END

Auxilliary Subroutine, Function

Matrix Multiplication

    SUBROUTINE MULT(A,B,C,IM,M)
        IMPLICIT DOUBLE PRECISION(A-H,O-Z)
        DIMENSION A(IM,IM), B(IM,IM), C(IM,IM)
        DO 10, I=1,M
        DO 10, J=1,M
        C(I,J)=0.0D0
        DO 10 K=1,M
10     C(I,J) = C(I,J) + A(I,K)*B(K,J)
        RETURN
    END

Error Function

    FUNCTION FO(ARG)
        IMPLICIT DOUBLE PRECISION(A-H,O-Z)
        DATA PI/3.1415926535898D0/
        IF (ARG .LT. 1.0D-6) GO TO 10

        FO=DSQRT(PI/ARG)*DARF(DSQRT(ARG))/2.0D0
        GO TO 20

10     FO=1.0D0-ARG/3.0D0
20     CONTINUE
        RETURN
    END
    FUNCTION DARF(ARG)
        IMPLICIT DOUBLE PRECISION(A-H,O-Z)
        DIMENSION A(5)
        DATA P/0.3275911D0/
        DATA A/0.254829592D0, -0.284496736D0,1.421413741D0,
    $   -1.453152027D0,1.061405429D0/
        T=1.0D0/(1.0D0+P*ARG)
        TN = T
        POLY = A(1)*TN
        DO 10 I=2,5
        TN = TN*T
        POLY=POLY + A(I)*TN
10     CONTINUE
        DARF = 1.0D0-POLY*DEXP(-ARG*ARG)
        RETURN
    END