home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
fortran
/
library
/
linpack
/
ssv.for
< prev
next >
Wrap
Text File
|
1984-01-06
|
12KB
|
458 lines
C MAIN PROGRAM
INTEGER LUNIT
C ALLOW 5000 UNDERFLOWS.
C CALL TRAPS(0,0,5001,0,0)
C
C OUTPUT UNIT NUMBER
C
LUNIT = 6
C
CALL SSVTS(LUNIT)
STOP
END
SUBROUTINE SSVTS(LUNIT)
C LUNIT IS THE OUTPUT UNIT NUMBER.
C
C TESTS
C SSVDC
C
C LINPACK. THIS VERSION DATED 08/14/78 .
C G.W. STEWART, UNIVERSITY OF MARYLAND, ARGONNE NATIONAL LAB.
C
C SUBROUTINES AND FUNCTIONS
C
C EXTERNAL SMACH,SSVT1,SXGEN
C FORTRAN FLOAT
C
C INTERNAL VARIABLES
C
INTEGER LUNIT
INTEGER I,J,N,P,LDX,LDU,LDV,CASE,NCASE
REAL X(25,25),XX(25,25),U(25,25),V(25,25),S(25),E(25),WORK(25)
REAL SMACH,HUGE,TINY
LOGICAL NOTWRT
LDU = 25
LDV = 25
LDX = 25
HUGE = SMACH(3)
TINY = SMACH(2)
NOTWRT = .TRUE.
NCASE = 12
WRITE (LUNIT,430)
DO 290 CASE = 1, NCASE
WRITE (LUNIT,300) CASE
GO TO (10, 40, 70, 90, 110, 130, 170, 210, 240, 250, 260,
* 270), CASE
C
C BIDIAGONAL MATRIX WITH ZERO AT END.
C
10 CONTINUE
WRITE (LUNIT,310)
N = 4
P = 4
DO 30 I = 1, 4
DO 20 J = 1, 4
X(I,J) = 0.0E0
20 CONTINUE
30 CONTINUE
X(1,1) = 1.0E0
X(1,2) = 1.0E0
X(2,2) = 2.0E0
X(2,3) = 1.0E0
X(3,3) = 3.0E0
X(3,4) = 1.0E0
CALL SSVT1(X,LDX,N,P,S,E,U,LDU,V,LDV,WORK,XX,CASE,NOTWRT,
* LUNIT,11)
GO TO 280
C
C BIDIAGONAL MATRIX WITH ZERO IN THE MIDDLE.
C
40 CONTINUE
WRITE (LUNIT,320)
N = 5
P = 5
DO 60 I = 1, 5
DO 50 J = 1, 5
X(I,J) = 0.0E0
50 CONTINUE
60 CONTINUE
X(1,1) = 1.0E0
X(1,2) = 1.0E0
X(2,3) = 1.0E0
X(3,3) = 2.0E0
X(3,4) = 1.0E0
X(4,4) = 3.0E0
X(4,5) = 1.0E0
X(5,5) = 4.0E0
CALL SSVT1(X,LDX,N,P,S,E,U,LDU,X,LDX,WORK,XX,CASE,NOTWRT,
* LUNIT,11)
GO TO 280
C
C TEST CASE WITH N .GT. P.
C
70 CONTINUE
WRITE (LUNIT,330)
N = 8
P = 4
DO 80 I = 1, 4
S(I) = FLOAT(I)
80 CONTINUE
CALL SXGEN(X,LDX,N,P,S)
CALL SSVT1(X,LDX,N,P,S,E,X,LDX,V,LDV,WORK,XX,CASE,NOTWRT,
* LUNIT,21)
GO TO 280
C
C TEST CASE WITH N .LT. P.
C
90 CONTINUE
WRITE (LUNIT,340)
N = 4
P = 8
DO 100 I = 1, 8
S(I) = FLOAT(I)
100 CONTINUE
CALL SXGEN(X,LDX,N,P,S)
CALL SSVT1(X,LDX,N,P,S,E,X,LDX,V,LDV,WORK,XX,CASE,NOTWRT,
* LUNIT,11)
GO TO 280
C
C TEST CASE WITH N = P = LDX = LDU = LDV.
C
110 CONTINUE
WRITE (LUNIT,350)
N = 25
P = 25
DO 120 I = 1, 25
S(I) = FLOAT(I)
120 CONTINUE
CALL SXGEN(X,LDX,N,P,S)
CALL SSVT1(X,LDX,N,P,S,E,X,LDX,V,LDV,WORK,XX,CASE,NOTWRT,
* LUNIT,11)
GO TO 280
C
C TEST FOR OVERFLOW CONTROL.
C
130 CONTINUE
WRITE (LUNIT,360)
N = 4
P = 8
DO 140 I = 1, 8
S(I) = FLOAT(I)
140 CONTINUE
CALL SXGEN(X,LDX,N,P,S)
DO 160 I = 1, 4
DO 150 J = 1, 8
X(I,J) = HUGE*X(I,J)
150 CONTINUE
160 CONTINUE
CALL SSVT1(X,LDX,N,P,S,E,U,LDU,V,LDV,WORK,XX,CASE,NOTWRT,
* LUNIT,11)
GO TO 280
C
C TEST FOR UNDERFLOW CONTROL.
C
170 CONTINUE
WRITE (LUNIT,370)
N = 8
P = 4
DO 180 I = 1, 8
S(I) = FLOAT(I)
180 CONTINUE
CALL SXGEN(X,LDX,N,P,S)
DO 200 I = 1, 8
DO 190 J = 1, 4
X(I,J) = TINY*X(I,J)
190 CONTINUE
200 CONTINUE
CALL SSVT1(X,LDX,N,P,S,E,U,LDU,V,LDV,WORK,XX,CASE,NOTWRT,
* LUNIT,11)
GO TO 280
C
C ZERO MATRIX.
C
210 CONTINUE
WRITE (LUNIT,380)
N = 8
P = 4
DO 230 I = 1, N
DO 220 J = 1, P
X(I,J) = 0.0E0
220 CONTINUE
230 CONTINUE
CALL SSVT1(X,LDX,N,P,S,E,U,LDU,V,LDV,WORK,XX,CASE,NOTWRT,
* LUNIT,11)
GO TO 280
C
C 1X1 MATRIX.
C
240 CONTINUE
WRITE (LUNIT,390)
N = 1
P = 1
X(1,1) = 2.0E0
CALL SSVT1(X,LDX,N,P,S,E,U,LDU,V,LDV,WORK,XX,CASE,NOTWRT,
* LUNIT,11)
GO TO 280
C
C 2X2 MATRIX.
C
250 CONTINUE
WRITE (LUNIT,400)
N = 2
P = 2
X(1,1) = 3.0E0
X(1,2) = 1.0E0
X(2,1) = 1.0E0
X(2,2) = 2.0E0
CALL SSVT1(X,LDX,N,P,S,E,U,LDU,V,LDV,WORK,XX,CASE,NOTWRT,
* LUNIT,11)
GO TO 280
C
C COLUMN VECTOR.
C
260 CONTINUE
WRITE (LUNIT,410)
N = 4
P = 1
X(1,1) = 1.0E0
X(2,1) = 0.0E0
X(3,1) = 0.0E0
X(4,1) = 2.0E0
CALL SSVT1(X,LDX,N,P,S,E,U,LDU,V,LDV,WORK,XX,CASE,NOTWRT,
* LUNIT,11)
GO TO 280
C
C ROW VECTOR.
C
270 CONTINUE
WRITE (LUNIT,420)
N = 1
P = 4
X(1,1) = 0.0E0
X(1,2) = 1.0E0
X(1,3) = 2.0E0
X(1,4) = 3.0E0
CALL SSVT1(X,LDX,N,P,S,E,U,LDU,V,LDV,WORK,XX,CASE,NOTWRT,
* LUNIT,11)
280 CONTINUE
290 CONTINUE
WRITE (LUNIT,440)
RETURN
300 FORMAT ( / 5H1CASE, I3)
310 FORMAT ( / 35H BIDIAGONAL MATRIX WITH ZERO AT END)
320 FORMAT ( / 38H BIDIAGONAL MATRIX WITH ZERO IN MIDDLE)
330 FORMAT ( / 13H 8 X 4 MATRIX)
340 FORMAT ( / 13H 4 X 8 MATRIX)
350 FORMAT ( / 15H 25 X 25 MATRIX)
360 FORMAT ( / 14H OVERFLOW TEST)
370 FORMAT ( / 15H UNDERFLOW TEST)
380 FORMAT ( / 12H ZERO MATRIX)
390 FORMAT ( / 13H 1 X 1 MATRIX)
400 FORMAT ( / 13H 2 X 2 MATRIX)
410 FORMAT ( / 14H COLUMN VECTOR)
420 FORMAT ( / 11H ROW VECTOR)
430 FORMAT (22H1LINPACK TESTER, SSV** /
* 29H THIS VERSION DATED 08/14/78.)
440 FORMAT ( / 27H1END OF SINGULAR VALUE TEST)
END
SUBROUTINE SARRAY(A,LDA,M,N,NNL,LUNIT)
INTEGER LDA,M,N,NNL,LUNIT
REAL A(LDA,1)
C
C FORTRAN IABS,MIN0
C
INTEGER I,J,K,KU,NL
NL = IABS(NNL)
IF (NNL .LT. 0) GO TO 30
DO 20 I = 1, M
WRITE (6,70)
DO 10 K = 1, N, NL
KU = MIN0(K+NL-1,N)
WRITE (6,70) (A(I,J), J = K, KU)
10 CONTINUE
20 CONTINUE
GO TO 60
30 CONTINUE
DO 50 J = 1, N
WRITE (6,70)
DO 40 K = 1, M, NL
KU = MIN0(K+NL-1,M)
WRITE (6,70) (A(I,J), I = K, KU)
40 CONTINUE
50 CONTINUE
60 CONTINUE
RETURN
70 FORMAT (1H , 8E13.6)
END
SUBROUTINE CSVBM(XX,LDX,N,P,S,U,LDU,V,LDV,X,XSTAT)
INTEGER LDX,N,P,LDU,LDV
REAL XX(LDX,1),S(1),U(LDU,1),V(LDV,1),X(LDX,1)
REAL XSTAT
C
C EXTERNAL SMACH
C FORTRAN AMAX1,ABS,MIN0
C
INTEGER I,J,K,M
REAL T(25)
REAL SMACH,EMAX,XMAX
C
M = MIN0(N,P)
DO 20 J = 1, P
DO 10 I = 1, M
X(I,J) = S(I)*V(J,I)
10 CONTINUE
20 CONTINUE
IF (N .LE. P) GO TO 50
M = P + 1
DO 40 J = 1, P
DO 30 I = M, N
X(I,J) = 0.0E0
30 CONTINUE
40 CONTINUE
50 CONTINUE
M = MIN0(N,P)
DO 90 J = 1, P
DO 70 I = 1, N
T(I) = 0.0E0
DO 60 K = 1, M
T(I) = T(I) + U(I,K)*X(K,J)
60 CONTINUE
70 CONTINUE
DO 80 I = 1, N
X(I,J) = T(I)
80 CONTINUE
90 CONTINUE
EMAX = 0.0E0
XMAX = 0.0E0
DO 110 J = 1, P
DO 100 I = 1, N
EMAX = AMAX1(EMAX,ABS(X(I,J)-XX(I,J)))
XMAX = AMAX1(XMAX,ABS(XX(I,J)))
100 CONTINUE
110 CONTINUE
XSTAT = 0.0E0
IF (EMAX .EQ. 0.0E0) GO TO 140
IF (XMAX .EQ. 0.0E0) GO TO 120
XSTAT = (EMAX/XMAX)/SMACH(1)
GO TO 130
120 CONTINUE
XSTAT = 1.0E10
130 CONTINUE
140 CONTINUE
RETURN
END
SUBROUTINE SSVOT(X,LDX,N,COL,TEST)
INTEGER LDX,N,COL
REAL X(LDX,1)
C
C FORTRAN AMAX1
C
INTEGER I,J,K
REAL ELM
REAL TEST,EMAX,SMACH
EMAX = 0.0E0
DO 30 I = 1, COL
DO 20 J = 1, COL
ELM = 0.0E0
DO 10 K = 1, N
ELM = ELM + X(K,I)*X(K,J)
10 CONTINUE
IF (I .EQ. J) ELM = 1.0E0 - ELM
EMAX = AMAX1(EMAX,ABS(ELM))
20 CONTINUE
30 CONTINUE
TEST = EMAX/SMACH(1)
RETURN
END
SUBROUTINE SSVT1(X,LDX,N,P,S,E,U,LDU,V,LDV,WORK,XX,CASE,NOTWRT,
* LUNIT,JOB)
INTEGER LDX,N,P,LDU,LDV,CASE,LUNIT,JOB
REAL X(LDX,1),S(1),E(1),U(LDU,1),V(LDV,1),WORK(1),XX(LDX,1)
LOGICAL NOTWRT
C
C EXTERNAL SARRAY,SSVBM,SSVDC,SSVOT
C FORTRAN AMAX1,MIN0
C
INTEGER I,J,M,UCOL,INFO
REAL USTAT,VSTAT,XSTAT
REAL XNEW(25,25)
REAL ERRLVL
ERRLVL = 100.0E0
UCOL = N
IF (JOB/10 .GE. 2) UCOL = P
DO 20 J = 1, P
DO 10 I = 1, N
XX(I,J) = X(I,J)
10 CONTINUE
20 CONTINUE
IF (NOTWRT) GO TO 30
WRITE (LUNIT,50)
CALL SARRAY(X,LDX,N,P,5,LUNIT)
30 CONTINUE
CALL SSVDC(X,LDX,N,P,S,E,U,LDU,V,LDV,WORK,JOB,INFO)
M = MIN0(N,P)
IF (NOTWRT) GO TO 40
WRITE (LUNIT,60)
CALL SARRAY(S,P,M,1,-5,LUNIT)
WRITE (LUNIT,70)
CALL SARRAY(U,LDU,N,N,5,LUNIT)
WRITE (LUNIT,80)
CALL SARRAY(V,LDV,P,P,5,LUNIT)
40 CONTINUE
CALL SSVOT(U,LDU,N,UCOL,USTAT)
CALL SSVOT(V,LDV,P,P,VSTAT)
CALL CSVBM(XX,LDX,N,P,S,U,LDU,V,LDV,XNEW,XSTAT)
WRITE (LUNIT,90) XSTAT,USTAT,VSTAT
IF (AMAX1(XSTAT,USTAT,VSTAT) .GT. ERRLVL) WRITE (LUNIT,100)
RETURN
50 FORMAT ( / 2H X)
60 FORMAT ( / 2H S)
70 FORMAT ( / 2H U)
80 FORMAT ( / 2H V)
90 FORMAT ( / 11H STATISTICS //
* 38H U*SIGMA*VH .................., E10.2 /
* 38H UHU ........................., E10.2 /
* 38H VHV ........................., E10.2)
100 FORMAT ( / 35H ***** STATISTICS ABOVE ERROR LEVEL)
END
SUBROUTINE SXGEN(X,LDX,N,P,S)
INTEGER P,N,LDX
REAL X(LDX,1),S(1)
C
C FORTRAN FLOAT,MIN0
C
INTEGER I,J,M,MP1
REAL T,RU,FAC
REAL FP,FN
FP = FLOAT(P)
FN = FLOAT(N)
M = MIN0(N,P)
RU = COS(6.28E0/FLOAT(M+1))
FAC = 1.0E0/FP
DO 20 I = 1, M
FAC = FAC*RU
DO 10 J = 1, P
X(I,J) = -2.0E0*S(I)*FAC
10 CONTINUE
X(I,I) = X(I,I) + FP*S(I)*FAC
20 CONTINUE
IF (M .GE. N) GO TO 50
MP1 = M + 1
DO 40 J = 1, P
DO 30 I = MP1, N
X(I,J) = 0.0E0
30 CONTINUE
40 CONTINUE
50 CONTINUE
DO 80 J = 1, P
T = 0.0E0
DO 60 I = 1, N
T = T + X(I,J)
60 CONTINUE
DO 70 I = 1, N
X(I,J) = X(I,J) - 2.0E0*T/FN
70 CONTINUE
80 CONTINUE
RETURN
END