OpenLibm/slatec/orthol.f
Viral B. Shah c977aa998f Add Makefile.extras to build libopenlibm-extras.
Replace amos with slatec
2012-12-31 16:37:05 -05:00

187 lines
5.9 KiB
Fortran

*DECK ORTHOL
SUBROUTINE ORTHOL (A, M, N, NRDA, IFLAG, IRANK, ISCALE, DIAG,
+ KPIVOT, SCALES, COLS, CS)
C***BEGIN PROLOGUE ORTHOL
C***SUBSIDIARY
C***PURPOSE Subsidiary to BVSUP
C***LIBRARY SLATEC
C***TYPE SINGLE PRECISION (ORTHOL-S)
C***AUTHOR Watts, H. A., (SNLA)
C***DESCRIPTION
C
C Reduction of the matrix A to upper triangular form by a sequence of
C orthogonal HOUSEHOLDER transformations pre-multiplying A
C
C Modeled after the ALGOL codes in the articles in the REFERENCES
C section.
C
C **********************************************************************
C INPUT
C **********************************************************************
C
C A -- Contains the matrix to be decomposed, must be dimensioned
C NRDA by N
C M -- Number of rows in the matrix, M greater or equal to N
C N -- Number of columns in the matrix, N greater or equal to 1
C IFLAG -- Indicates the uncertainty in the matrix data
C = 0 when the data is to be treated as exact
C =-K when the data is assumed to be accurate to about
C K digits
C ISCALE -- Scaling indicator
C =-1 if the matrix A is to be pre-scaled by
C columns when appropriate.
C Otherwise no scaling will be attempted
C NRDA -- Row dimension of A, NRDA greater or equal to M
C DIAG,KPIVOT,COLS -- Arrays of length at least n used internally
C ,CS,SCALES
C
C **********************************************************************
C OUTPUT
C **********************************************************************
C
C IFLAG - Status indicator
C =1 for successful decomposition
C =2 if improper input is detected
C =3 if rank of the matrix is less than N
C A -- Contains the reduced matrix in the strictly upper triangular
C part and transformation information in the lower part
C IRANK -- Contains the numerically determined matrix rank
C DIAG -- Contains the diagonal elements of the reduced
C triangular matrix
C KPIVOT -- Contains the pivotal information, the column
C interchanges performed on the original matrix are
C recorded here.
C SCALES -- Contains the column scaling parameters
C
C **********************************************************************
C
C***SEE ALSO BVSUP
C***REFERENCES G. Golub, Numerical methods for solving linear least
C squares problems, Numerische Mathematik 7, (1965),
C pp. 206-216.
C P. Businger and G. Golub, Linear least squares
C solutions by Householder transformations, Numerische
C Mathematik 7, (1965), pp. 269-276.
C***ROUTINES CALLED CSCALE, R1MACH, SDOT, XERMSG
C***REVISION HISTORY (YYMMDD)
C 750601 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 900402 Added TYPE section. (WRB)
C 910408 Updated the AUTHOR and REFERENCES sections. (WRB)
C 920501 Reformatted the REFERENCES section. (WRB)
C***END PROLOGUE ORTHOL
DIMENSION A(NRDA,*),DIAG(*),KPIVOT(*),COLS(*),CS(*),SCALES(*)
C
C **********************************************************************
C
C MACHINE PRECISION (COMPUTER UNIT ROUNDOFF VALUE) IS DEFINED
C BY THE FUNCTION R1MACH.
C
C***FIRST EXECUTABLE STATEMENT ORTHOL
URO = R1MACH(3)
C
C **********************************************************************
C
IF (M .GE. N .AND. N .GE. 1 .AND. NRDA .GE. M) GO TO 1
IFLAG=2
CALL XERMSG ('SLATEC', 'ORTHOL', 'INVALID INPUT PARAMETERS.', 2,
+ 1)
RETURN
C
1 ACC=10.*URO
IF (IFLAG .LT. 0) ACC=MAX(ACC,10.**IFLAG)
SRURO=SQRT(URO)
IFLAG=1
IRANK=N
C
C COMPUTE NORM**2 OF JTH COLUMN AND A MATRIX NORM
C
ANORM=0.
DO 2 J=1,N
KPIVOT(J)=J
COLS(J)=SDOT(M,A(1,J),1,A(1,J),1)
CS(J)=COLS(J)
ANORM=ANORM+COLS(J)
2 CONTINUE
C
C PERFORM COLUMN SCALING ON A WHEN SPECIFIED
C
CALL CSCALE(A,NRDA,M,N,COLS,CS,DUM,DUM,ANORM,SCALES,ISCALE,0)
C
ANORM=SQRT(ANORM)
C
C
C CONSTRUCTION OF UPPER TRIANGULAR MATRIX AND RECORDING OF
C ORTHOGONAL TRANSFORMATIONS
C
C
DO 50 K=1,N
MK=M-K+1
IF (K .EQ. N) GO TO 25
KP=K+1
C
C SEARCHING FOR PIVOTAL COLUMN
C
DO 10 J=K,N
IF (COLS(J) .GE. SRURO*CS(J)) GO TO 5
COLS(J)=SDOT(MK,A(K,J),1,A(K,J),1)
CS(J)=COLS(J)
5 IF (J .EQ. K) GO TO 7
IF (SIGMA .GE. 0.99*COLS(J)) GO TO 10
7 SIGMA=COLS(J)
JCOL=J
10 CONTINUE
IF (JCOL .EQ. K) GO TO 25
C
C PERFORM COLUMN INTERCHANGE
C
L=KPIVOT(K)
KPIVOT(K)=KPIVOT(JCOL)
KPIVOT(JCOL)=L
COLS(JCOL)=COLS(K)
COLS(K)=SIGMA
CSS=CS(K)
CS(K)=CS(JCOL)
CS(JCOL)=CSS
SC=SCALES(K)
SCALES(K)=SCALES(JCOL)
SCALES(JCOL)=SC
DO 20 L=1,M
ASAVE=A(L,K)
A(L,K)=A(L,JCOL)
20 A(L,JCOL)=ASAVE
C
C CHECK RANK OF THE MATRIX
C
25 SIG=SDOT(MK,A(K,K),1,A(K,K),1)
DIAGK=SQRT(SIG)
IF (DIAGK .GT. ACC*ANORM) GO TO 30
C
C RANK DEFICIENT PROBLEM
IFLAG=3
IRANK=K-1
CALL XERMSG ('SLATEC', 'ORTHOL',
+ 'RANK OF MATRIX IS LESS THAN THE NUMBER OF COLUMNS.', 1, 1)
RETURN
C
C CONSTRUCT AND APPLY TRANSFORMATION TO MATRIX A
C
30 AKK=A(K,K)
IF (AKK .GT. 0.) DIAGK=-DIAGK
DIAG(K)=DIAGK
A(K,K)=AKK-DIAGK
IF (K .EQ. N) GO TO 50
SAD=DIAGK*AKK-SIG
DO 40 J=KP,N
AS=SDOT(MK,A(K,K),1,A(K,J),1)/SAD
DO 35 L=K,M
35 A(L,J)=A(L,J)+AS*A(L,K)
40 COLS(J)=COLS(J)-A(K,J)**2
50 CONTINUE
C
C
RETURN
END