Mercurial > octave
view libcruft/qpsol/qpcrsh.f @ 2329:30c606bec7a8
[project @ 1996-07-19 01:29:05 by jwe]
Initial revision
author | jwe |
---|---|
date | Fri, 19 Jul 1996 01:29:55 +0000 |
parents | |
children |
line wrap: on
line source
SUBROUTINE QPCRSH( UNITQ, QPHESS, N, NCOLR, NCOLZ, NCTOTL, NFREE, * NHESS, NQ, NROWH, NCOLH, NROWRT, NCOLRT, * KFREE, HSIZE, * HESS, RT, SCALE, ZY, HZ, WRK ) C C IMPLICIT REAL*8(A-H,O-Z) INTEGER N, NCOLR, NCOLZ, NCTOTL, NFREE, NHESS, NQ, * NROWH, NCOLH, NROWRT, NCOLRT INTEGER KFREE(N) DOUBLE PRECISION HSIZE DOUBLE PRECISION HESS(NROWH,NCOLH), RT(NROWRT,NCOLRT), * SCALE(NCTOTL), ZY(NQ,NQ), HZ(N) DOUBLE PRECISION WRK(N) LOGICAL UNITQ EXTERNAL QPHESS C INTEGER NOUT, MSG, ISTART DOUBLE PRECISION WMACH COMMON /SOLMCH/ WMACH(15) COMMON /SOL1CM/ NOUT, MSG, ISTART C LOGICAL SCLDQP COMMON /SOL2LP/ SCLDQP C C ********************************************************************* C QPCRSH COMPUTES THE CHOLESKY FACTOR R OF THE PROJECTED HESSIAN C Z(T) H Z, GIVEN Z AND ITS DIMENSIONS NFREE BY NCOLZ. C IF THE PROJECTED HESSIAN IS INDEFINITE, A SMALLER CHOLESKY C FACTORIZATION R1(T) R1 = Z1(T) H Z1 IS RETURNED, WHERE Z1 IS C COMPOSED OF NCOLR COLUMNS OF Z. COLUMN INTERCHANGES ARE C USED TO MAXIMIZE NCOLR. THESE ARE APPLIED TO Z. C C SYSTEMS OPTIMIZATION LABORATORY, STANFORD UNIVERSITY. C ORIGINAL VERSION OF JANUARY 1983. C ********************************************************************* C INTEGER I, J, JTHCOL, J1, K, KMAX, KSAVE, LEN, NUM DOUBLE PRECISION D, DMAX, DMIN, EPSMCH, T DOUBLE PRECISION DSQRT DOUBLE PRECISION DABS, DMAX1 DOUBLE PRECISION ZERO , ONE DATA ZERO , ONE * /0.0D+0, 1.0D+0/ C EPSMCH = WMACH(3) C NCOLR = 0 IF (NCOLZ .EQ. 0) GO TO 900 C C --------------------------------------------------------------------- C COMPUTE Z(T) H Z AND STORE THE UPPER-TRIANGULAR SYMMETRIC PART C IN THE FIRST NCOLZ COLUMNS OF RT. C --------------------------------------------------------------------- DO 200 K = 1, NCOLZ CALL ZEROVC( N, WRK, N, 1 ) IF (UNITQ) GO TO 130 C C EXPAND THE COLUMN OF Z INTO AN N-VECTOR. C DO 120 I = 1, NFREE J = KFREE(I) WRK(J) = ZY(I,K) 120 CONTINUE IF (SCLDQP) CALL DSCALE( N, SCALE, N, 1, WRK, N, 1 ) JTHCOL = 0 GO TO 150 C C ONLY BOUNDS ARE IN THE WORKING SET. THE K-TH COLUMN OF Z IS C JUST A COLUMN OF THE IDENTITY MATRIX. C 130 JTHCOL = KFREE(K) WRK(JTHCOL) = ONE C C SET RT(*,K) = TOP OF H * (COLUMN OF Z). C 150 CALL QPHESS( N, NROWH, NCOLH, JTHCOL, HESS, WRK, HZ ) NHESS = NHESS + 1 C IF (UNITQ .AND. SCLDQP) * CALL SSCALE( N, SCALE(JTHCOL), HZ, N, 1 ) IF (SCLDQP) * CALL DSCALE( N, SCALE, N, 1, HZ, N, 1 ) C CALL ZYPROD( 4, N, NFREE, NCOLZ, NFREE, NQ, UNITQ, * KFREE, KFREE, HZ, ZY, WRK ) C CALL COPYVC( NCOLZ, HZ, NCOLZ, 1, RT(1,K), NCOLZ, 1 ) C C UPDATE AN ESTIMATE OF THE SIZE OF THE PROJECTED HESSIAN. C HSIZE = DMAX1( HSIZE, DABS(RT(K,K)) ) 200 CONTINUE C C --------------------------------------------------------------------- C FORM THE CHOLESKY FACTORIZATION R(T) R = Z(T) H Z AS FAR AS C POSSIBLE, USING SYMMETRIC ROW AND COLUMN INTERCHANGES. C --------------------------------------------------------------------- DMIN = EPSMCH * HSIZE C DO 400 J = 1, NCOLZ C C FIND THE MAXIMUM REMAINING DIAGONAL. C KMAX = J DMAX = RT(J,J) DO 310 K = J, NCOLZ D = RT(K,K) IF (DMAX .GE. D) GO TO 310 DMAX = D KMAX = K 310 CONTINUE C C SEE IF THE DIAGONAL IS BIG ENOUGH. C IF (DMAX .LE. DMIN) GO TO 500 NCOLR = J C C PERMUTE THE COLUMNS OF Z. C IF (KMAX .EQ. J) GO TO 350 IF (UNITQ) GO TO 315 CALL COPYVC( NFREE, ZY(1,KMAX), NFREE, 1, WRK , NFREE, 1 ) CALL COPYVC( NFREE, ZY(1,J) , NFREE, 1, ZY(1,KMAX),NFREE, 1 ) CALL COPYVC( NFREE, WRK , NFREE, 1, ZY(1,J) ,NFREE, 1 ) GO TO 312 C C Z IS NOT STORED EXPLICITLY. C 315 KSAVE = KFREE(KMAX) KFREE(KMAX) = KFREE(J) KFREE(J) = KSAVE C C INTERCHANGE ROWS AND COLUMNS OF THE PROJECTED HESSIAN. C 312 DO 320 I = 1, J T = RT(I,KMAX) RT(I,KMAX) = RT(I,J) RT(I,J) = T 320 CONTINUE C DO 330 K = J, KMAX T = RT(K,KMAX) RT(K,KMAX) = RT(J,K) RT(J,K) = T 330 CONTINUE C DO 340 K = KMAX, NCOLZ T = RT(KMAX,K) RT(KMAX,K) = RT(J,K) RT(J,K) = T 340 CONTINUE C RT(KMAX,KMAX) = RT(J,J) C C SET THE DIAGONAL ELEMENT OF R. C 350 D = DSQRT(DMAX) RT(J,J) = D IF (J .EQ. NCOLZ) GO TO 400 C C SET THE ABOVE-DIAGONAL ELEMENTS OF THE K-TH ROW OF R, C AND UPDATE THE ELEMENTS OF ALL REMAINING ROWS. C J1 = J + 1 DO 360 K = J1, NCOLZ T = RT(J,K)/D RT(J,K) = T C C R(I,K) = R(I,K) - T * R(J,I), I = J1, K. C NUM = K - J LEN = NROWRT*(NUM - 1) + 1 IF (T .NE. ZERO) * CALL AXPY( NUM, (- T), RT(J,J1), LEN, NROWRT, * RT(J1,K), NUM, 1 ) 360 CONTINUE 400 CONTINUE C 500 IF (NCOLR .EQ. NCOLZ) GO TO 900 IF (MSG .GE. 80) WRITE (NOUT, 1000) NCOLR, NCOLZ C 900 RETURN C 1000 FORMAT(/ 42H //QPCRSH// INDEFINITE PROJECTED HESSIAN. * / 20H //QPCRSH// NCOLR =, I5, 6X, 7HNCOLZ =, I5) C C END OF QPCRSH END