OSDN Git Service

MOPAC 6.06 is included in the binary
[molby/Molby.git] / mopac606_nbo / src / ijkl.f
1       SUBROUTINE IJKL(CP, CF, NELEC, NMOS, DIJKL)
2       IMPLICIT DOUBLE PRECISION (A-H,O-Z)
3       INCLUDE 'SIZES'
4       DIMENSION CP(NORBS,NMOS), CF(NORBS,NORBS),
5      1DIJKL(NORBS,NMOS,(NMOS*(NMOS+1))/2)
6 ************************************************************************
7 *
8 *   IJKL FILLS THE XY ARRAY.  XY HOLDS THE TWO-ELECTRON INTEGRALS OVER
9 *        MOLECULAR ORBITALS IN THE ACTIVE SPACE.
10 *        XY(I,J,K,L) = <IJ|1/R(1,2)|KL>
11 *
12 *           ON INPUT
13 *
14 * CP     = M.O.'S OVER C.I. ACTIVE SPACE (NORMALLY 1 TO 5 M.O.S)
15 * CF     = ALL M.O.'S, INCLUDING THOSE IN CP
16 * NORBS  = NUMBER OF ATOMIC ORBITALS
17 * NELEC  = NUMBER OF OCCUPIED M.O.S NOT INVOLVED IN THE C.I.
18 * NMOS   = NUMBER OF M.O.S INVOLVED IN THE C.I. (NORMALLY 1 TO 5 M.O.S)
19 *          ALSO CALLED THE ACTIVE SPACE OF THE C.I.
20 *
21 *  NOTE: THIS SUBROUTINE IS UNUSUAL IN THAT ONE FUNCTION IS TO
22 *        FILL THE ARRAY XY WHICH IS NOT PASSED AS AN ARGUMENT,
23 *        INSTEAD IT IS PASSED VIA COMMON BLOCK XYIJKL.
24 *
25 ************************************************************************
26       COMMON /MOLKST/ NUMAT,NAT(NUMATM),NFIRST(NUMATM),NMIDLE(NUMATM),
27      1                NLAST(NUMATM), NORBS, NELECS,NALPHA,NBETA,
28      2                NCLOSE,NOPEN,NDUMY,FRACT
29       COMMON /VECTOR/ DUMY1(MORB2+MAXORB), CIJ(10*MAXORB),
30      1WCIJ(10*MAXORB), DUMY(MORB2-19*MAXORB)
31       COMMON /XYIJKL/ XY(NMECI,NMECI,NMECI,NMECI)
32       DIMENSION CKL(10*MAXORB)
33       DIMENSION NB(0:8)
34       EQUIVALENCE (CKL, CIJ)
35       DATA NB /1,0,0,10,0,0,0,0,45/
36 C
37 C  CALCULATE TWO-ELECTRON INTEGRALS FOR THE SET DIJKL(K,L,IJ)
38 C  THE INDEX K RUNS OVER ALL M.O.'S, L OVER ACTIVE-SPACE M.O.'S,
39 C  AND IJ OVER LOWER-HALF TRIANGLE OF ACTIVE-SPACE M.O.'S, J FASTER THAN
40 C  I.
41 C  ALL ACTIVE-SPACE INTERACTIONS ARE COPIED INTO THE ARRAY XY
42 C
43       IJ=0
44       DO 70 I=1,NMOS
45          DO 70 J=1,I
46             IJ=IJ+1
47             IPQ=0
48             DO 10 II=1,NUMAT
49                DO 10 IP=NFIRST(II),NLAST(II)
50                   DO 10 IQ=NFIRST(II),IP
51                      IPQ=IPQ+1
52    10       CIJ(IPQ)=CP(IP,I)*CP(IQ,J)+CP(IP,J)*CP(IQ,I)
53 C
54 C  CIJ HOLDS THE DENSITY DISTRIBUTION PSI(I)*PSI(J) OVER ATOMIC BASES
55 C  I AND J ARE M.O. INDICES WITHIN THE ACTIVE SPACE.  CIJ(M,N) IS FOR
56 C  THE ATOMIC BASES M AND N FOR M.O.'S I AND J.
57 C
58             CALL PARTXY (CIJ,WCIJ)
59 C
60 C WCIJ HOLDS THE KET PART OF THE INTEGRAL <K,L|1/R(1,2)|I,J>
61 C THAT IS, |1/R(1,2)|I,J>.  WCIJ(M,N) IS FOR THE ATOMIC BASES M AND N
62 C FOR M.O.'S K AND L.
63 C
64    20       CONTINUE
65             DO 60 K=1,NORBS
66                DO 50 L=1,NMOS
67 C
68 C  ABOUT TO CALCULATE <I,J|1/R(1,2)|K,L>
69 C
70                   IPQ=0
71                   DO 30 II=1,NUMAT
72                      DO 30 IP=NFIRST(II),NLAST(II)
73                         DO 30 IQ=NFIRST(II),IP
74                            IPQ=IPQ+1
75    30             CKL(IPQ)=CF(IP,K)*CP(IQ,L)+CP(IP,L)*CF(IQ,K)
76 C
77 C CKL HOLDS THE DENSITY DISTRIBUTION PSI(K)*PSI(L) OVER ATOMIC BASES.
78 C K IS THE INDEX OF A M.O.; L IS AN INDEX OF A M.O. IN THE ACTIVE SPACE.
79 C
80                   SUM=0.D0
81                   DO 40 II=1,IPQ
82    40             SUM=SUM+CKL(II)*WCIJ(II)
83 C
84 C  SUM IS THE INTEGRAL <I,J|1/R(1,2)|K,L>
85 C
86                   DIJKL(K,L,IJ)=SUM
87    50          CONTINUE
88    60       CONTINUE
89    70 CONTINUE
90 C
91 C  NOW SPREAD THE INTEGRALS OVER THE XY ARRAY.  XY IS ENTIRELY
92 C  IN ACTIVE SPACE
93 C
94       DO 80 K=1,NMOS
95          KK=NELEC+K
96 C
97 C  K IS A M.O. INDEX IN ACTIVE SPACE
98 C KK IS A M.O. INDEX
99 C
100          DO 80 L=1,NMOS
101             IJ=0
102             DO 80 I=1,NMOS
103                DO 80 J=1,I
104                   IJ=IJ+1
105                   SUM=DIJKL(KK,L,IJ)
106                   XY(I,J,K,L)=SUM
107                   XY(I,J,L,K)=SUM
108                   XY(J,I,K,L)=SUM
109                   XY(J,I,L,K)=SUM
110                   XY(K,L,I,J)=SUM
111                   XY(K,L,J,I)=SUM
112                   XY(L,K,I,J)=SUM
113    80 CONTINUE
114       RETURN
115       END