123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291 |
- *DECK U11US
- SUBROUTINE U11US (A, MDA, M, N, UB, DB, MODE, NP, KRANK, KSURE, H,
- + W, EB, IR, IC)
- C***BEGIN PROLOGUE U11US
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to ULSIA
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (U11US-S, DU11US-D)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C This routine performs an LQ factorization of the
- C matrix A using Householder transformations. Row
- C and column pivots are chosen to reduce the growth
- C of round-off and to help detect possible rank
- C deficiency.
- C
- C***SEE ALSO ULSIA
- C***ROUTINES CALLED ISAMAX, ISWAP, SAXPY, SDOT, SNRM2, SSCAL, SSWAP,
- C XERMSG
- C***REVISION HISTORY (YYMMDD)
- C 810801 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
- C 900328 Added TYPE section. (WRB)
- C***END PROLOGUE U11US
- DIMENSION A(MDA,*),UB(*),DB(*),H(*),W(*),EB(*)
- INTEGER IC(*),IR(*)
- C
- C INITIALIZATION
- C
- C***FIRST EXECUTABLE STATEMENT U11US
- J=0
- KRANK=M
- DO 10 I=1,N
- IC(I)=I
- 10 CONTINUE
- DO 12 I=1,M
- IR(I)=I
- 12 CONTINUE
- C
- C DETERMINE REL AND ABS ERROR VECTORS
- C
- C
- C
- C CALCULATE ROW LENGTH
- C
- DO 30 I=1,M
- H(I)=SNRM2(N,A(I,1),MDA)
- W(I)=H(I)
- 30 CONTINUE
- C
- C INITIALIZE ERROR BOUNDS
- C
- DO 40 I=1,M
- EB(I)=MAX(DB(I),UB(I)*H(I))
- UB(I)=EB(I)
- DB(I)=0.0
- 40 CONTINUE
- C
- C DISCARD SELF DEPENDENT ROWS
- C
- I=1
- 50 IF(EB(I).GE.H(I)) GO TO 60
- IF(I.EQ.KRANK) GO TO 70
- I=I+1
- GO TO 50
- C
- C MATRIX REDUCTION
- C
- 60 CONTINUE
- KK=KRANK
- KRANK=KRANK-1
- IF(MODE.EQ.0) RETURN
- IF(I.GT.NP) GO TO 64
- CALL XERMSG ('SLATEC', 'U11US',
- + 'FIRST NP ROWS ARE LINEARLY DEPENDENT', 8, 0)
- KRANK=I-1
- RETURN
- 64 CONTINUE
- IF(I.GT.KRANK) GO TO 70
- CALL SSWAP(1,EB(I),1,EB(KK),1)
- CALL SSWAP(1,UB(I),1,UB(KK),1)
- CALL SSWAP(1,W(I),1,W(KK),1)
- CALL SSWAP(1,H(I),1,H(KK),1)
- CALL ISWAP(1,IR(I),1,IR(KK),1)
- CALL SSWAP(N,A(I,1),MDA,A(KK,1),MDA)
- GO TO 50
- C
- C TEST FOR ZERO RANK
- C
- 70 IF(KRANK.GT.0) GO TO 80
- KRANK=0
- KSURE=0
- RETURN
- 80 CONTINUE
- C
- C M A I N L O O P
- C
- 110 CONTINUE
- J=J+1
- JP1=J+1
- JM1=J-1
- KZ=KRANK
- IF(J.LE.NP) KZ=J
- C
- C EACH ROW HAS NN=N-J+1 COMPONENTS
- C
- NN=N-J+1
- C
- C UB DETERMINES ROW PIVOT
- C
- 115 IMIN=J
- IF(H(J).EQ.0.) GO TO 170
- RMIN=UB(J)/H(J)
- DO 120 I=J,KZ
- IF(UB(I).GE.H(I)*RMIN) GO TO 120
- RMIN=UB(I)/H(I)
- IMIN=I
- 120 CONTINUE
- C
- C TEST FOR RANK DEFICIENCY
- C
- IF(RMIN.LT.1.0) GO TO 200
- TT=(EB(IMIN)+ABS(DB(IMIN)))/H(IMIN)
- IF(TT.GE.1.0) GO TO 170
- C COMPUTE EXACT UB
- DO 125 I=1,JM1
- W(I)=A(IMIN,I)
- 125 CONTINUE
- L=JM1
- 130 W(L)=W(L)/A(L,L)
- IF(L.EQ.1) GO TO 150
- LM1=L-1
- DO 140 I=L,JM1
- W(LM1)=W(LM1)-A(I,LM1)*W(I)
- 140 CONTINUE
- L=LM1
- GO TO 130
- 150 TT=EB(IMIN)
- DO 160 I=1,JM1
- TT=TT+ABS(W(I))*EB(I)
- 160 CONTINUE
- UB(IMIN)=TT
- IF(UB(IMIN)/H(IMIN).GE.1.0) GO TO 170
- GO TO 200
- C
- C MATRIX REDUCTION
- C
- 170 CONTINUE
- KK=KRANK
- KRANK=KRANK-1
- KZ=KRANK
- IF(MODE.EQ.0) RETURN
- IF(J.GT.NP) GO TO 172
- CALL XERMSG ('SLATEC', 'U11US',
- + 'FIRST NP ROWS ARE LINEARLY DEPENDENT', 8, 0)
- KRANK=J-1
- RETURN
- 172 CONTINUE
- IF(IMIN.GT.KRANK) GO TO 180
- CALL ISWAP(1,IR(IMIN),1,IR(KK),1)
- CALL SSWAP(N,A(IMIN,1),MDA,A(KK,1),MDA)
- CALL SSWAP(1,EB(IMIN),1,EB(KK),1)
- CALL SSWAP(1,UB(IMIN),1,UB(KK),1)
- CALL SSWAP(1,DB(IMIN),1,DB(KK),1)
- CALL SSWAP(1,W(IMIN),1,W(KK),1)
- CALL SSWAP(1,H(IMIN),1,H(KK),1)
- 180 IF(J.GT.KRANK) GO TO 300
- GO TO 115
- C
- C ROW PIVOT
- C
- 200 IF(IMIN.EQ.J) GO TO 230
- CALL SSWAP(1,H(J),1,H(IMIN),1)
- CALL SSWAP(N,A(J,1),MDA,A(IMIN,1),MDA)
- CALL SSWAP(1,EB(J),1,EB(IMIN),1)
- CALL SSWAP(1,UB(J),1,UB(IMIN),1)
- CALL SSWAP(1,DB(J),1,DB(IMIN),1)
- CALL SSWAP(1,W(J),1,W(IMIN),1)
- CALL ISWAP(1,IR(J),1,IR(IMIN),1)
- C
- C COLUMN PIVOT
- C
- 230 CONTINUE
- JMAX=ISAMAX(NN,A(J,J),MDA)
- JMAX=JMAX+J-1
- IF(JMAX.EQ.J) GO TO 240
- CALL SSWAP(M,A(1,J),1,A(1,JMAX),1)
- CALL ISWAP(1,IC(J),1,IC(JMAX),1)
- 240 CONTINUE
- C
- C APPLY HOUSEHOLDER TRANSFORMATION
- C
- TN=SNRM2(NN,A(J,J),MDA)
- IF(TN.EQ.0.0) GO TO 170
- IF(A(J,J).NE.0.0) TN=SIGN(TN,A(J,J))
- CALL SSCAL(NN,1.0/TN,A(J,J),MDA)
- A(J,J)=A(J,J)+1.0
- IF(J.EQ.M) GO TO 250
- DO 248 I=JP1,M
- BB=-SDOT(NN,A(J,J),MDA,A(I,J),MDA)/A(J,J)
- CALL SAXPY(NN,BB,A(J,J),MDA,A(I,J),MDA)
- IF(I.LE.NP) GO TO 248
- IF(H(I).EQ.0.0) GO TO 248
- TT=1.0-(ABS(A(I,J))/H(I))**2
- TT=MAX(TT,0.0)
- T=TT
- TT=1.0+.05*TT*(H(I)/W(I))**2
- IF(TT.EQ.1.0) GO TO 244
- H(I)=H(I)*SQRT(T)
- GO TO 246
- 244 CONTINUE
- H(I)=SNRM2(N-J,A(I,J+1),MDA)
- W(I)=H(I)
- 246 CONTINUE
- 248 CONTINUE
- 250 CONTINUE
- H(J)=A(J,J)
- A(J,J)=-TN
- C
- C
- C UPDATE UB, DB
- C
- UB(J)=UB(J)/ABS(A(J,J))
- DB(J)=(SIGN(EB(J),DB(J))+DB(J))/A(J,J)
- IF(J.EQ.KRANK) GO TO 300
- DO 260 I=JP1,KRANK
- UB(I)=UB(I)+ABS(A(I,J))*UB(J)
- DB(I)=DB(I)-A(I,J)*DB(J)
- 260 CONTINUE
- GO TO 110
- C
- C E N D M A I N L O O P
- C
- 300 CONTINUE
- C
- C COMPUTE KSURE
- C
- KM1=KRANK-1
- DO 318 I=1,KM1
- IS=0
- KMI=KRANK-I
- DO 315 II=1,KMI
- IF(UB(II).LE.UB(II+1)) GO TO 315
- IS=1
- TEMP=UB(II)
- UB(II)=UB(II+1)
- UB(II+1)=TEMP
- 315 CONTINUE
- IF(IS.EQ.0) GO TO 320
- 318 CONTINUE
- 320 CONTINUE
- KSURE=0
- SUM=0.0
- DO 328 I=1,KRANK
- R2=UB(I)*UB(I)
- IF(R2+SUM.GE.1.0) GO TO 330
- SUM=SUM+R2
- KSURE=KSURE+1
- 328 CONTINUE
- 330 CONTINUE
- C
- C IF SYSTEM IS OF REDUCED RANK AND MODE = 2
- C COMPLETE THE DECOMPOSITION FOR SHORTEST LEAST SQUARES SOLUTION
- C
- IF(KRANK.EQ.M .OR. MODE.LT.2) GO TO 360
- MMK=M-KRANK
- KP1=KRANK+1
- I=KRANK
- 340 TN=SNRM2(MMK,A(KP1,I),1)/A(I,I)
- TN=A(I,I)*SQRT(1.0+TN*TN)
- CALL SSCAL(MMK,1.0/TN,A(KP1,I),1)
- W(I)=A(I,I)/TN+1.0
- A(I,I)=-TN
- IF(I.EQ.1) GO TO 350
- IM1=I-1
- DO 345 II=1,IM1
- TT=-SDOT(MMK,A(KP1,II),1,A(KP1,I),1)/W(I)
- TT=TT-A(I,II)
- CALL SAXPY(MMK,TT,A(KP1,I),1,A(KP1,II),1)
- A(I,II)=A(I,II)+TT*W(I)
- 345 CONTINUE
- I=I-1
- GO TO 340
- 350 CONTINUE
- 360 CONTINUE
- RETURN
- END
|