home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
fortran
/
library
/
linpack
/
sud.for
< prev
next >
Wrap
Text File
|
1984-04-30
|
13KB
|
440 lines
C MAIN PROGRAM
INTEGER LUNIT
C ALLOW 5000 UNDERFLOWS.
C CALL TRAPS(0,0,5001,0,0) This is doesn't work on PC's!
C
C OUTPUT UNIT NUMBER
C
LUNIT = 6
C
CALL SQRXX(LUNIT)
STOP
END
SUBROUTINE SQRXX(LUNIT)
INTEGER LUNIT
REAL RX(20,10),R(10,10),XROW(10),Z(10,4),YROW(10),S(10)
REAL SCALE,TINY,HUGE,RHO(2),C(10),SMACH
INTEGER N,P,LDX,LDR,LDZ,CASE
LOGICAL NOTWRT,OFLOW,UFLOW
COMMON SCALE,NOTWRT,OFLOW,UFLOW
LDZ = 10
LDX = 20
LDR = 10
NOTWRT = .TRUE.
OFLOW = .FALSE.
UFLOW = .FALSE.
TINY = SMACH(2)
HUGE = SMACH(3)
SCALE = 1.0E0
DO 60 CASE = 1, 3
GO TO (10, 20, 30), CASE
10 CONTINUE
N = 20
P = 10
GO TO 40
20 CONTINUE
N = 10
P = 4
GO TO 40
30 CONTINUE
N = 10
P = 1
40 CONTINUE
CALL SGETRX(RX,LDX,N,P,S)
WRITE (LUNIT,130) CASE,N,P
IF (NOTWRT) GO TO 50
WRITE (LUNIT,160)
CALL SARRAY(RX,LDX,N,P,P,LUNIT)
50 CONTINUE
CALL SDRUD1(R,LDR,RX,LDX,N,P,XROW,C,S,LUNIT)
CALL SDRUD2(R,LDR,RX,LDX,P,XROW,YROW,Z,LDZ,RHO,C,S,LUNIT)
CALL SDRDD(R,LDR,RX,LDX,P,Z,LDZ,XROW,YROW,RHO,C,S,LUNIT)
60 CONTINUE
CASE = 4
N = 10
P = 4
WRITE (LUNIT,130) CASE,N,P
WRITE (LUNIT,140)
CALL SGETRX(RX,LDX,N,P,S)
DO 80 J = 1, P
DO 70 I = 1, N
RX(I,J) = HUGE*RX(I,J)
70 CONTINUE
80 CONTINUE
SCALE = HUGE
OFLOW = .TRUE.
IF (NOTWRT) GO TO 90
WRITE (LUNIT,160)
CALL SARRAY(RX,LDX,N,P,P,LUNIT)
90 CONTINUE
CALL SDRUD1(R,LDR,RX,LDX,N,P,XROW,C,S,LUNIT)
CALL SDRUD2(R,LDR,RX,LDX,P,XROW,YROW,Z,LDZ,RHO,C,S,LUNIT)
CALL SDRDD(R,LDR,RX,LDX,P,Z,LDZ,XROW,YROW,RHO,C,S,LUNIT)
OFLOW = .FALSE.
CASE = 5
N = 10
P = 4
WRITE (LUNIT,130) CASE,N,P
WRITE (LUNIT,150)
CALL SGETRX(RX,LDX,N,P,S)
DO 110 J = 1, P
DO 100 I = 1, N
RX(I,J) = TINY*RX(I,J)
100 CONTINUE
110 CONTINUE
SCALE = TINY
UFLOW = .TRUE.
IF (NOTWRT) GO TO 120
WRITE (LUNIT,160)
CALL SARRAY(RX,LDX,N,P,P,LUNIT)
120 CONTINUE
CALL SDRUD1(R,LDR,RX,LDX,N,P,XROW,C,S,LUNIT)
CALL SDRUD2(R,LDR,RX,LDX,P,XROW,YROW,Z,LDZ,RHO,C,S,LUNIT)
CALL SDRDD(R,LDR,RX,LDX,P,Z,LDZ,XROW,YROW,RHO,C,S,LUNIT)
RETURN
C
130 FORMAT (11H1 CASE =, I2, 5X, 3HN =, I2, 5X, 3HP =, I2 /////)
140 FORMAT (22H OVERFLOW TEST /////)
150 FORMAT (24H UNDERFLOW TEST /////)
160 FORMAT (5H RX)
END
SUBROUTINE SARRAY(A,LDA,M,N,NNL,LUNIT)
INTEGER LDA,M,N,NNL,LUNIT
REAL A(LDA,1)
C X
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 (LUNIT,70)
DO 10 K = 1, N, NL
KU = MIN0(K+NL-1,N)
WRITE (LUNIT,70) (A(I,J), J = K, KU)
10 CONTINUE
20 CONTINUE
GO TO 60
30 CONTINUE
DO 50 J = 1, N
WRITE (LUNIT,70)
DO 40 K = 1, M, NL
KU = MIN0(K+NL-1,M)
WRITE (LUNIT,70) (A(I,J), I = K, KU)
40 CONTINUE
50 CONTINUE
60 CONTINUE
RETURN
C
70 FORMAT (1H , 4(2E13.6, 4X))
END
SUBROUTINE SDRDD(R,LDR,RX,LDX,P,Z,LDZ,XROW,YROW,RHO,C,S,LUNIT)
INTEGER LDR,LDX,LDZ,P,LUNIT
REAL R(LDR,1),RX(LDX,1),Z(LDZ,1),XROW(1),YROW(1),S(1)
REAL RHO(1),SCALE,C(1)
LOGICAL NOTWRT,OFLOW,UFLOW
COMMON SCALE,NOTWRT,OFLOW,UFLOW
INTEGER I,J,JP1,PM1
WRITE (LUNIT,50)
CALL SCHDD(R,LDR,P,XROW,Z,LDZ,2,YROW,RHO,C,S,INFO)
PM1 = P - 1
IF (PM1 .LT. 1) GO TO 30
DO 20 J = 1, PM1
JP1 = J + 1
DO 10 I = JP1, P
R(I,J) = 0.0E0
10 CONTINUE
20 CONTINUE
30 CONTINUE
IF (NOTWRT) GO TO 40
WRITE (LUNIT,80)
CALL SARRAY(R,LDR,P,P,P,LUNIT)
WRITE (LUNIT,60)
CALL SARRAY(Z,LDZ,P,2,2,LUNIT)
WRITE (LUNIT,70) (RHO(I), I = 1, 2)
40 CONTINUE
CALL SMPDD(R,LDR,P,RX,LDX,Z,Z(1,3),LDZ,RHO,LUNIT)
RETURN
50 FORMAT ( /////
* 46H STEP THREE DOWNDATING XROW,YROW AND Z, ///)
60 FORMAT ( /// 4H Z)
70 FORMAT ( /// 6H RHO // 1H , 2E13.6)
80 FORMAT (4H R)
END
SUBROUTINE SDRUD1(R,LDR,RX,LDX,N,P,XROW,C,S,LUNIT)
INTEGER N,P,LDR,LDX,LUNIT
REAL R(LDR,1),RX(LDX,1),XROW(1),S(1)
REAL C(1)
LOGICAL NOTWRT,OFLOW
REAL RELM,XELM,Y,Z
REAL XMAX,RMAX,TEST,T,SCALE,SMACH
COMMON SCALE,NOTWRT,OFLOW,UFLOW
DO 20 I = 1, P
DO 10 J = 1, P
R(I,J) = 0.0E0
10 CONTINUE
20 CONTINUE
DO 40 I = 1, N
DO 30 J = 1, P
XROW(J) = RX(I,J)
30 CONTINUE
CALL SCHUD(R,LDR,P,XROW,Z,1,0,Y,Y,C,S)
40 CONTINUE
WRITE (LUNIT,100)
IF (NOTWRT) GO TO 50
WRITE (LUNIT,120)
CALL SARRAY(R,LDR,P,P,P,LUNIT)
50 CONTINUE
RMAX = 0.0E0
XMAX = 0.0E0
DO 90 I = 1, P
DO 80 J = 1, I
RELM = 0.0E0
XELM = 0.0E0
NIM = MIN0(I,J)
DO 60 K = 1, NIM
RELM = RELM + R(K,I)/SCALE*(R(K,J)/SCALE)
60 CONTINUE
DO 70 K = 1, N
XELM = XELM + RX(K,I)/SCALE*(RX(K,J)/SCALE)
70 CONTINUE
T = AMAX1(ABS(XELM),0.0E0)
XMAX = AMAX1(XMAX,T)
T = AMAX1(ABS(XELM-RELM),0.0E0)
RMAX = AMAX1(RMAX,T)
80 CONTINUE
90 CONTINUE
TEST = RMAX/XMAX/SMACH(1)
WRITE (LUNIT,110) TEST
RETURN
C
100 FORMAT ( ///// 25H STEP ONE UPDATING X ///)
110 FORMAT ( /// 15H STATISTICS //
* 42H RH*R ............................, E10.2)
120 FORMAT (4H R)
END
SUBROUTINE SDRUD2(R,LDR,RX,LDX,P,XROW,YROW,Z,LDZ,RHO,C,S,LUNIT)
INTEGER LDR,LDX,LDZ,P,LUNIT
REAL R(LDR,1),RX(LDX,1),XROW(1),YROW(1),Z(LDZ,1),S(1)
REAL RHO(1),C(1)
REAL SCALE
LOGICAL NOTWRT,OFLOW,UFLOW
COMMON SCALE,NOTWRT,OFLOW,UFLOW
DO 20 I = 1, P
DO 10 J = 1, P
RX(I,J) = R(I,J)
10 CONTINUE
20 CONTINUE
DO 40 I = 1, P
Z(I,1) = 0.0E0
DO 30 J = I, P
Z(I,1) = Z(I,1) + R(I,J)
30 CONTINUE
Z(I,2) = Z(I,1) + SCALE
Z(I,3) = Z(I,1)
Z(I,4) = Z(I,2)
40 CONTINUE
DO 60 I = 1, P
XROW(I) = 0.0E0
DO 50 J = 1, I
XROW(I) = XROW(I) + R(J,I)
50 CONTINUE
60 CONTINUE
YROW(1) = 0.0E0
DO 70 I = 1, P
YROW(1) = YROW(1) + XROW(I)
70 CONTINUE
YROW(2) = YROW(1) - SCALE
RHO(1) = SCALE
RHO(2) = SCALE
IF (NOTWRT) GO TO 80
WRITE (LUNIT,100)
CALL SARRAY(XROW,P,P,1,-P,LUNIT)
WRITE (LUNIT,110)
CALL SARRAY(Z,LDZ,P,2,2,LUNIT)
WRITE (LUNIT,120)
CALL SARRAY(YROW,2,2,1,-2,LUNIT)
80 CONTINUE
CALL SCHUD(R,LDR,P,XROW,Z,LDZ,2,YROW,RHO,C,S)
WRITE (LUNIT,130)
IF (NOTWRT) GO TO 90
WRITE (LUNIT,150)
CALL SARRAY(R,LDR,P,P,P,LUNIT)
WRITE (LUNIT,110)
CALL SARRAY(Z,LDZ,P,2,2,LUNIT)
WRITE (LUNIT,140) (RHO(I), I = 1, 2)
90 CONTINUE
CALL SMPUD(R,LDR,RX,LDX,P,XROW,Z,LDZ,RHO,LUNIT)
RETURN
C
100 FORMAT ( ///// 7H XROW)
110 FORMAT ( /// 4H Z)
120 FORMAT ( /// 7H YROW)
130 FORMAT ( ///// 41H STEP TWO UPDATING XROW, YROW AND Z ///)
140 FORMAT ( /// 6H RHO // 1H , 2E13.6)
150 FORMAT (4H R)
END
SUBROUTINE SGETRX(X,LDX,N,P,S)
INTEGER N,P,LDX
REAL X(LDX,1),S(1)
INTEGER PD2,PD2D1,I
PD2 = MAX0(P/2,1)
PD2D1 = PD2 + 1
DO 10 I = 1, PD2
S(I) = 1.0E0
10 CONTINUE
IF (P .LT. PD2D1) GO TO 30
DO 20 I = PD2D1, P
S(I) = 0.5E0
20 CONTINUE
30 CONTINUE
CALL SXGEN(X,LDX,N,P,S)
RETURN
END
SUBROUTINE SMPDD(R,LDR,P,ROLD,LDRD,Z,ZUP,LDZ,RHO,LUNIT)
INTEGER LDR,P,LDRD,LDZ,LUNIT
REAL R(LDR,1),ROLD(LDRD,1),Z(LDZ,1),ZUP(LDZ,1)
REAL RHO(1),SMACH
REAL T
INTEGER I,J
REAL TR,TZ(2),TRHO(2),MAXOLD,MAXREL,SCALE
LOGICAL NOTWRT,OFLOW,UFLOW
COMMON SCALE,NOTWRT,OFLOW,UFLOW
MAXOLD = 0.0E0
MAXREL = 0.0E0
DO 20 J = 1, P
DO 10 I = 1, J
T = ROLD(I,J)
MAXOLD = AMAX1(MAXOLD,AMAX1(ABS(T),0.0E0))
T = ROLD(I,J) - R(I,J)
MAXREL = AMAX1(MAXREL,AMAX1(ABS(T),0.0E0))
10 CONTINUE
20 CONTINUE
TR = MAXREL/MAXOLD/SMACH(1)
DO 40 I = 1, 2
MAXOLD = 0.0E0
MAXREL = 0.0E0
DO 30 J = 1, P
T = ZUP(J,I)
MAXOLD = AMAX1(MAXOLD,AMAX1(ABS(T),0.0E0))
T = ZUP(J,I) - Z(J,I)
MAXREL = AMAX1(MAXREL,AMAX1(ABS(T),0.0E0))
30 CONTINUE
TZ(I) = MAXREL/MAXOLD/SMACH(1)
TRHO(I) = ABS(RHO(I)/SCALE-1.0E0)/SMACH(1)
40 CONTINUE
WRITE (LUNIT,50) TR,TZ,TRHO
RETURN
C
50 FORMAT ( /// 25H STATSTICS STEP THREE //
* 33H R ....................., E10.2 /
* 33H Z(1) .................., E10.2 /
* 33H Z(2) .................., E10.2 /
* 33H RHO(1) ................, E10.2 /
* 33H RHO(2) ................, E10.2)
END
SUBROUTINE SMPUD(R,LDR,RX,LDX,P,XROW,Z,LDZ,RHO,LUNIT)
INTEGER LDR,LDX,P,LDZ
REAL R(LDR,1),RX(LDX,1),XROW(1),Z(LDZ,1)
REAL RHO(1)
REAL RELM,XELM,TMP1(10),TMP
REAL TEST1,TEST2(2),TEST3,TEST4,MAXR,MAXX,T
LOGICAL NOTWRT,OFLOW,UFLOW
REAL SCALE,SMACH
COMMON SCALE,NOTWRT,OFLOW,UFLOW
MAXR = 0.0E0
MAXX = 0.0E0
DO 30 I = 1, P
DO 20 J = 1, I
RELM = 0.0E0
XELM = 0.0E0
NIM = MIN0(I,J)
DO 10 K = 1, NIM
RELM = RELM + R(K,I)/SCALE*(R(K,J)/SCALE)
XELM = XELM + RX(K,I)/SCALE*(RX(K,J)/SCALE)
10 CONTINUE
XELM = XELM + XROW(I)/SCALE*(XROW(J)/SCALE)
T = AMAX1(ABS(XELM),0.0E0)
MAXX = AMAX1(MAXX,T)
T = AMAX1(ABS(XELM-RELM),0.0E0)
MAXR = AMAX1(MAXR,T)
20 CONTINUE
30 CONTINUE
TEST1 = MAXR/MAXX/SMACH(1)
TMP = 0.0E0
DO 50 I = 1, P
TMP1(I) = 0.0E0
DO 40 J = I, P
TMP1(I) = TMP1(I) + RX(I,J)
40 CONTINUE
TMP = TMP + XROW(I)
50 CONTINUE
DO 80 K = 1, 2
MAXR = 0.0E0
MAXX = 0.0E0
DO 70 I = 1, P
RELM = 0.0E0
XELM = 0.0E0
DO 60 J = 1, I
RELM = RELM + R(J,I)/SCALE*(Z(J,K)/SCALE)
XELM = XELM + RX(J,I)/SCALE*(TMP1(J)/SCALE)
60 CONTINUE
XELM = XELM + XROW(I)/SCALE*(TMP/SCALE)
T = AMAX1(ABS(XELM-RELM),0.0E0)
MAXR = AMAX1(MAXR,T)
T = AMAX1(ABS(XELM),0.0E0)
MAXX = AMAX1(MAXX,T)
70 CONTINUE
TEST2(K) = MAXR/MAXX/SMACH(1)
80 CONTINUE
TEST3 = ABS(RHO(1)/SCALE-1.0E0)/SMACH(1)
T = SQRT(2.0E0+FLOAT(P))
TEST4 = ABS(RHO(2)/SCALE-T)/T/SMACH(1)
WRITE (LUNIT,90) TEST1,TEST2,TEST3,TEST4
RETURN
90 FORMAT ( /// 24H STATISTICS STEP TWO //
* 31H RH*R ................, E10.2 /
* 31H RH*Z(1) ............., E10.2 /
* 31H RH*Z(2) ............., E10.2 /
* 31H RHO(1) .............., E10.2 /
* 31H RHO(2) .............., E10.2)
END
SUBROUTINE SXGEN(X,LDX,N,P,S)
INTEGER LDX,N,P
REAL X(LDX,1),S(1)
INTEGER I,J,M,MP1
REAL FN,FP
REAL FAC,RU,T
FP = FLOAT(P)
FN = FLOAT(N)
M = MIN0(N,P)
RU = 1.0E0
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