1 SUBROUTINE DIAG(FAO,VECTOR,NOCC,EIG,MDIM,N)
2 IMPLICIT DOUBLE PRECISION(A-H,O-Z)
4 DIMENSION FAO(*),VECTOR(MDIM,*),EIG(*),WS(MAXORB)
5 C***********************************************************************
7 C "FAST" DIAGONALISATION PROCEDURE.
9 C ON INPUT FAO CONTAINS THE LOWER HALF TRIANGLE OF THE MATRIX TO BE
10 C DIAGONALISED, PACKED.
11 C VECTOR CONTAINS THE OLD EIGENVECTORS ON INPUT, THE NEW
13 C NOCC = NUMBER OF OCCUPIED MOLECULAR ORBITALS.
14 C EIG = EIGENVALUES FROM AN EXACT DIAGONALISATION
15 C MDIM = DECLARED SIZE OF MATRIX "C".
16 C N = NUMBER OF ATOMIC ORBITALS IN BASIS SET
18 C DIAG IS A PSEUDO-DIAGONALISATION PROCEDURE, IN THAT THE VECTORS THAT
19 C ARE GENERATED BY IT ARE MORE NEARLY ABLE TO BLOCK-DIAGONALISE
20 C THE FOCK MATRIX OVER MOLECULAR ORBITALS THAN THE STARTING
21 C VECTORS. IT MUST BE CONSIDERED PSEUDO FOR SEVERAL REASONS:
22 C (A) IT DOES NOT GENERATE EIGENVECTORS - THE SECULAR DETERMINANT
23 C IS NOT DIAGONALISED, ONLY THE OCCUPIED-VIRTUAL INTERSECTION.
24 C (B) MANY SMALL ELEMENTS IN THE SEC.DET. ARE IGNORED AS BEING TOO
25 C SMALL COMPARED WITH THE LARGEST ELEMENT.
26 C (C) WHEN ELEMENTS ARE ELIMINATED BY ROTATION, THE REST OF THE
27 C SEC. DET. IS ASSUMED NOT TO CHANGE, I.E. ELEMENTS CREATED
29 C (D) THE ROTATION REQUIRED TO ELIMINATE THOSE ELEMENTS CONSIDERED
30 C SIGNIFICANT IS APPROXIMATED TO USING THE EIGENVALUES OF THE
31 C EXACT DIAGONALISATION THROUGHOUT THE REST OF THE ITERATIVE
34 C (NOTE:- IN AN ITERATIVE PROCEDURE ALL THE APPROXIMATIONS PRESENT IN
35 C DIAG BECOME VALID AT SELF-CONSISTENCY, SELF-CONSISTENCY IS
36 C NOT SLOWED DOWN BY USE OF THESE APPROXIMATIONS)
39 C "FAST SEMIEMPIRICAL CALCULATIONS",
40 C STEWART. J.J.P., CSASZAR, P., PULAY, P., J. COMP. CHEM.,
43 C***********************************************************************
44 COMMON /SCRACH/ FMO(MORB2), XDUMY(MAXPAR**2-MORB2)
45 C FMO IS A WORK-SPACE OF SIZE (N-NOCC)*NOCC, IT WILL HOLD
46 C THE FOCK MOLECULAR ORBITAL INTERACTION MATRIX.
48 C FIRST, CONSTRUCT THAT PART OF A SECULAR DETERMINANT OVER MOLECULAR
49 C ORBITALS WHICH CONNECTS THE OCCUPIED AND VIRTUAL SETS.
51 C***********************************************************************
58 C EPS IS THE SMALLEST NUMBER WHICH, WHEN ADDED TO 1.D0, IS NOT
62 C INCREASE EPS TO ALLOW FOR A LOT OF ROUND-OFF
64 BIGEPS=10.D0*SQRT(EPS)
69 C# CALL TIMER('SQUARING')
76 10 SUM=SUM+FAO(KK)*VECTOR(K,I)
82 20 SUM=SUM+FAO(K2)*VECTOR(K,I)
88 40 SUM=SUM+WS(K)*VECTOR(K,J)
89 IF(TINY.LT.ABS(SUM)) TINY=ABS(SUM)
93 C***********************************************************************
95 C NOW DO A CRUDE 2 BY 2 ROTATION TO "ELIMINATE" SIGNIFICANT ELEMENTS
97 C***********************************************************************
98 C# CALL TIMER('ROTATING')
103 IF(ABS(FMO(IJ)).LT.TINY) GOTO 80
105 C BEGIN 2 X 2 ROTATIONS
112 C USE BIGEPS TO DETERMINE WHETHER TO DO A 2 BY 2 ROTATION
114 IF(ABS(C/D).LT.BIGEPS) GOTO 80
116 C AT THIS POINT WE KNOW THAT
117 E=SIGN(SQRT(4.D0*C*C+D*D),D)
118 ALPHA=SQRT(0.5D0*(1.D0+D/E))
119 BETA=-SIGN(SQRT(1.D0-ALPHA*ALPHA),C)
121 C ROTATION OF PSEUDO-EIGENVECTORS
126 VECTOR(M,J)=ALPHA*A+BETA*B
127 VECTOR(M,I)=ALPHA*B-BETA*A
131 C# CALL TIMER('RETURNING')