1
SUBROUTINE CDIAG (H,NH,S,NS,N,E,Z,NZ,AUX)
3
* SOLVES THE COMPLEX GENERAL EIGENVALUE PROBLEM H*Z = E*S*Z
4
* WHERE S AND H ARE COMPLEX HERMITIAN MATRICES
6
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
7
DIMENSION H(2*NH*N),S(2*NS*N),Z(2*NZ*N),E(N),AUX(N,5)
12
* REDUCE GENERAL EIGENVALUE PROBLEM TO A NORMAL ONE
13
CALL REDUCC (NH,NS,N,H,S,AUX)
16
C CALL EIGCH (H,NH,11,E,Z,NZ,AUX(1,2),IER)
18
* NEXT LINE FOR SLATEC. AUX 4*N REALS
19
C CALL CHIEV (H,NH,N,E,Z,NZ,AUX(1,2),1,INFO)
21
* NEXT THREE LINES FOR IBM-ESSL. AUX 4*N REALS
22
C CALL PACK (NH,N,H,H,+1)
23
C CALL ZHPEV (1,H,E,Z,NZ,N,AUX(1,2),4*N)
24
C CALL PACK (NH,N,H,H,-1)
26
* NEXT LINES FOR EISPACK. AUX 2*N REALS.
28
WRITE (6,*) 'CDIAG: NH AND NZ MUST BE EQUAL. NH,NZ =',NH,NZ
31
CALL TRANS (2,NH*N,H,H,Z)
32
CALL EISCH1 (NH,N,H,H(NH*N+1),E,Z,Z(NZ*N+1),IER,AUX(1,2))
34
WRITE (6,*) 'CDIAG: AN ERROR OCCURRED IN EISCH1. IER =',IER
37
CALL TRANS (NZ*N,2,Z,Z,H)
39
* UNDO THE REDUCTION OF GENERAL EIGENVALUE PROBLEM BY REDUCC.
40
CALL REBAKK (NS,NZ,N,S,AUX,Z)
47
SUBROUTINE TRANS (N1,N2,A,B,AUX)
49
* TRANSPOSES MATRIX A(N1,N2) TO B(N2,N1). A AND B MAY BE
50
* THE SAME PHYSICAL ARRAY. WRITTEN BY J.SOLER
52
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
53
DIMENSION A(N1,N2),B(N2,N1),AUX(N1*N2)
71
SUBROUTINE PACK (NA,N,A,AP,ISN)
73
* PACKS (ISN=1) OR UNPACKS (ISN=-1) A COMPLEX HERMITIAN
74
* MATRIX TO OR FROM PACKED LOWER MODE. WRITTEN BY J.SOLER
76
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
77
DIMENSION A(2,NA,N),AP(2,*)
108
SUBROUTINE REDUCC (NH,NS,N,H,S,DL)
110
* GENERALIZATION OF REDUC1 (COMPLEX)
111
* CHOLESKY FACTORIZATION OF S ( S=L*TRANSPOSE(L) )
112
* USING SCHMIDT' ORTHONORMALIZATION METHOD
113
* I) REPRESENTS A NON-ORTHOGONAL BASIS FUNCTION
114
* I> REPRESENTS A ORTHONORMAL WAVE FUNCTION
115
* OBTAINED FROM M.METHFESSEL. SLIGHTLY REWRITTEN BY J.SOLER.
117
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
118
DIMENSION H(2,NH,N),S(2,NS,N),DL(N)
119
PARAMETER (ZERO=0.D0,ONE=1.D0)
121
* OBTAIN TRANSFER MATRIX <IJ) FOR I<J USING CHOLESKY FACTORIZATION
127
XR=XR-S(1,J,K)*S(1,I,K)-S(2,J,K)*S(2,I,K)
128
XI=XI+S(1,J,K)*S(2,I,K)-S(2,J,K)*S(1,I,K)
132
WRITE (6,*) 'REDUCC: MATRIX S NOT POS. DEFINITE. I=',I
144
* OBTAIN MATRIX <IHJ) FOR I.LE.J
151
XR=XR-H(1,J,K)*S(1,I,K)+H(2,J,K)*S(2,I,K)
152
XI=XI-H(1,J,K)*S(2,I,K)-H(2,J,K)*S(1,I,K)
159
* OBTAIN MATRIX <IHJ> FOR I.LE.J
165
XR=XR-S(1,J,K)*H(1,I,K)+S(2,J,K)*H(2,I,K)
166
XI=XI+S(1,J,K)*H(2,I,K)+S(2,J,K)*H(1,I,K)
169
XR=XR-S(1,J,K)*H(1,K,I)-S(2,J,K)*H(2,K,I)
170
XI=XI-S(1,J,K)*H(2,K,I)+S(2,J,K)*H(1,K,I)
177
* OBTAIN MATRIX <IHJ> FOR I.GE.J
188
SUBROUTINE REBAKK (NS,NZ,N,S,DL,Z)
190
* BACK TRANSFORMATION OF THE EIGENVECTORS OF THE
191
* GENERAL EIGENVALUE PROBLEM: A*X = LAMBDA*B*X
192
* THE FORWARD TRANSFORMATION WAS PERFORMED BY ROUTINE 'REDUCC'
194
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
195
DIMENSION S(2,NS,N),Z(2,NZ,N),DL(N)
201
XR=XR-S(1,K,J)*Z(1,K,I)+S(2,K,J)*Z(2,K,I)
202
XI=XI-S(1,K,J)*Z(2,K,I)-S(2,K,J)*Z(1,K,I)
211
SUBROUTINE EISCH1(NM,N,AR,AI,WR,ZR,ZI,IERR,WORK)
213
C ALL EIGENVALUES AND CORRESPONDING EIGENVECTORS OF A COMPLEX
216
* ADAPTED TO DOUBLE PRECISION BY J.SOLER 30/10/89
217
* FOR SINGLE PRECISION SIMPLY COMMENT OUT NEXT LINE
218
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
219
* PARAMETERS INTRODUCED BY J.SOLER
220
PARAMETER (ZERO=0.D0,ONE=1.D0)
221
DIMENSION AR(NM,NM),AI(NM,NM),WR(N),ZR(NM,NM),ZI(NM,NM),WORK(*)
222
CALL HTRIDI(NM,N,AR,AI,WR,ZI,ZI,WORK)
227
CALL TQL2C(NM,N,WR,ZI,ZR,IERR)
229
CALL HTRIBK(NM,N,AR,AI,WORK,N,ZR,ZI)
233
SUBROUTINE HTRIDI(NM,N,AR,AI,D,E,E2,TAU)
234
* ADAPTED TO DOUBLE PRECISION BY J.SOLER 30/10/89
235
* FOR SINGLE PRECISION SIMPLY COMMENT OUT NEXT LINE
236
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
237
* PARAMETERS INTRODUCED BY J.SOLER
238
PARAMETER (ZERO=0.D0,ONE=1.D0)
239
DIMENSION AR(NM,N),AI(NM,N),D(N),E(N),E2(N),TAU(2,N)
240
* INTEGER I,J,K,L,N,II,NM,JP1
241
* REAL F,FI,G,GI,H,HH,SI,SCALE
251
IF (L .LT. 1) GO TO 130
253
120 SCALE = SCALE + ABS(AR(I,K)) + ABS(AI(I,K))
254
IF (SCALE .NE. ZERO) GO TO 140
261
AR(I,K) = AR(I,K) / SCALE
262
AI(I,K) = AI(I,K) / SCALE
263
H = H + AR(I,K) * AR(I,K) + AI(I,K) * AI(I,K)
265
E2(I) = SCALE * SCALE * H
268
* NEXT LINE CHANGED BY J.SOLER.
269
* F = CABS(CMPLX(AR(I,L),AI(I,L)))
270
F = SQRT(AR(I,L)**2+AI(I,L)**2)
271
IF (F .EQ. ZERO) GO TO 160
272
TAU(1,L) = (AI(I,L) * TAU(2,I) - AR(I,L) * TAU(1,I)) / F
273
SI = (AR(I,L) * TAU(2,I) + AI(I,L) * TAU(1,I)) / F
276
AR(I,L) = G * AR(I,L)
277
AI(I,L) = G * AI(I,L)
278
IF (L .EQ. 1) GO TO 270
280
160 TAU(1,L) = -TAU(1,I)
288
G = G + AR(J,K) * AR(I,K) + AI(J,K) * AI(I,K)
289
GI = GI - AR(J,K) * AI(I,K) + AI(J,K) * AR(I,K)
292
IF (L .LT. JP1) GO TO 220
294
G = G + AR(K,J) * AR(I,K) - AI(K,J) * AI(I,K)
295
GI = GI - AR(K,J) * AI(I,K) - AI(K,J) * AR(I,K)
299
F = F + E(J) * AR(I,J) - TAU(2,J) * AI(I,J)
307
GI = TAU(2,J) - HH * FI
310
AR(J,K) = AR(J,K) - F * E(K) - G * AR(I,K)
311
X + FI * TAU(2,K) + GI * AI(I,K)
312
AI(J,K) = AI(J,K) - F * TAU(2,K) - G * AI(I,K)
313
X - FI * E(K) - GI * AR(I,K)
316
AR(I,K) = SCALE * AR(I,K)
317
AI(I,K) = SCALE * AI(I,K)
323
AI(I,I) = SCALE * SCALE * H
328
SUBROUTINE TQL2C(NM,N,D,E,Z,IERR)
329
* ADAPTED TO DOUBLE PRECISION BY J.SOLER 30/10/89
330
* FOR SINGLE PRECISION SIMPLY COMMENT OUT NEXT LINE
331
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
332
* PARAMETERS INTRODUCED BY J.SOLER
333
PARAMETER (ZERO=0.D0,ONE=1.D0,TWO=2.D0,EPMACH=2.D0**(-23))
334
DIMENSION D(N),E(N),Z(NM,N)
335
* INTEGER I,J,K,L,M,N,II,NM,MML,IERR
336
* VARIABLE MACHEP CHANGED TO PARAMETER EPMACH. J.SOLER.
337
* REAL B,C,F,G,H,P,R,S,MACHEP
340
IF (N .EQ. 1) GO TO 1001
348
* H = MACHEP * (ABS(D(L)) + ABS(E(L)))
349
H = EPMACH * (ABS(D(L)) + ABS(E(L)))
352
IF (ABS(E(M)) .LE. B) GO TO 120
354
120 IF (M .EQ. L) GO TO 220
355
130 IF (J .EQ. 30) GO TO 1000
357
P = (D(L+1) - D(L)) / (TWO * E(L))
359
H = D(L) - E(L) / (P + SIGN(R,P))
371
IF (ABS(P) .LT. ABS(E(I))) GO TO 150
380
E(I+1) = S * E(I) * R
383
160 P = C * D(I) - S * G
384
D(I+1) = H + S * (C * G + S * D(I))
387
Z(K,I+1) = S * Z(K,I) + C * H
388
Z(K,I) = C * Z(K,I) - S * H
393
IF (ABS(E(L)) .GT. B) GO TO 130
401
IF (D(J) .GE. P) GO TO 260
405
IF (K .EQ. I) GO TO 300
419
SUBROUTINE HTRIBK(NM,N,AR,AI,TAU,M,ZR,ZI)
420
* ADAPTED TO DOUBLE PRECISION BY J.SOLER 30/10/89
421
* FOR SINGLE PRECISION SIMPLY COMMENT OUT NEXT LINE
422
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
423
* PARAMETER INTRODUCED BY J.SOLER
424
PARAMETER (ZERO=0.D0)
425
DIMENSION AR(NM,N),AI(NM,N),TAU(2,N),ZR(NM,M),ZI(NM,M)
427
* INTEGER I,J,K,L,M,N,NM
430
ZI(K,J) = (- ZR(K,J)) * TAU(2,K)
431
ZR(K,J) = ZR(K,J) * TAU(1,K)
433
IF (N .EQ. 1) GO TO 200
437
IF (H .EQ. ZERO) GO TO 140
442
S = S + AR(I,K) * ZR(K,J) - AI(I,K) * ZI(K,J)
443
SI = SI + AR(I,K) * ZI(K,J) + AI(I,K) * ZR(K,J)
448
ZR(K,J) = ZR(K,J) - S * AR(I,K) - SI * AI(I,K)
449
ZI(K,J) = ZI(K,J) - SI * AR(I,K) + S * AI(I,K)