Mercurial > octave-nkf
view libcruft/qpsol/delcon.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 DELCON( MODFYG, ORTHOG, UNITQ, * JDEL, KDEL, NACTIV, NCOLZ, NFREE, * N, NQ, NROWA, NROWRT, NCOLRT, * KACTIV, KFREE, * A, QTG, RT, ZY ) C C IMPLICIT REAL*8(A-H,O-Z) LOGICAL MODFYG, ORTHOG, UNITQ INTEGER JDEL, KDEL, NACTIV, NCOLZ, NFREE, N, NQ, * NROWA, NROWRT, NCOLRT INTEGER KACTIV(N), KFREE(N) DOUBLE PRECISION ASIZE, DTMAX, DTMIN DOUBLE PRECISION A(NROWA,N), RT(NROWRT,NCOLRT), QTG(N), * ZY(NQ,NQ) C INTEGER NOUT, MSG, ISTART COMMON /SOL1CM/ NOUT, MSG, ISTART COMMON /SOL5CM/ ASIZE, DTMAX, DTMIN C C ********************************************************************* C DELCON UPDATES THE FACTORIZATION OF THE MATRIX OF C CONSTRAINTS IN THE WORKING SET, A(FREE) * (Z Y) = (0 T). C C IF THERE ARE NO GENERAL CONSTRAINTS IN THE WORKING SET AND THE C MATRIX Q = (Z Y) IS THE IDENTITY, Q WILL NOT BE C TOUCHED. C C SYSTEMS OPTIMIZATION LABORATORY, STANFORD UNIVERSITY. C VERSION OF DECEMBER 1981. REV. OCT. 1982. C ********************************************************************* C INTEGER I, IBEGIN, IFREED, INCT, ISTORE, K, KA, * KB, L, LDIAG, LENQ, LENRT, NACTPI, NACTP1, * NACTV1, NCOLZ1, NFIXD1, NFREEI, NFREE1 DOUBLE PRECISION CS, ONE, SN, STORE DOUBLE PRECISION DMAX1 DATA ONE/1.0D+0/ C LENQ = NQ*(NQ - 1) + 1 IF (JDEL .GT. N) GO TO 200 C C ------------------------------------------------------------------ C A SIMPLE BOUND IS BEING DELETED FROM THE WORKING SET. C ------------------------------------------------------------------ IFREED = KDEL - NACTIV IF (MSG .GE. 80) *WRITE (NOUT, 1010) NACTIV, NCOLZ, NFREE,IFREED,JDEL, UNITQ NACTV1 = NACTIV NFREE1 = NFREE + 1 IBEGIN = 1 KFREE(NFREE1) = JDEL C C ADD THE GRADIENT CORRESPONDING TO THE NEWLY-FREED VARIABLE TO THE C END OF Q(FREE)(T)G(FREE). THIS IS DONE BY INTERCHANGING THE C APPROPRIATE ELEMENTS OF QTG AND KACTIV. C IF (.NOT. MODFYG) GO TO 120 IF (IFREED .EQ. 1) GO TO 120 NFREEI = NFREE + IFREED NACTP1 = NACTIV + 1 NACTPI = NACTIV + IFREED STORE = QTG(NFREE1) QTG(NFREE1) = QTG(NFREEI) QTG(NFREEI) = STORE ISTORE = KACTIV(NACTP1) KACTIV(NACTP1) = KACTIV(NACTPI) KACTIV(NACTPI) = ISTORE C C COPY THE INCOMING COLUMN OF A INTO THE END OF T. C 120 IF (UNITQ ) GO TO 400 IF (NACTIV .EQ. 0) GO TO 150 C DO 130 KA = 1, NACTIV I = KACTIV(KA) RT(KA,NFREE1) = A(I,JDEL) 130 CONTINUE C C EXPAND Q BY ADDING A UNIT ROW AND COLUMN. C 150 CALL ZEROVC( NFREE, ZY(NFREE1,1), LENQ, NQ ) CALL ZEROVC( NFREE, ZY(1,NFREE1), NQ, 1 ) ZY(NFREE1,NFREE1) = ONE GO TO 400 C C ------------------------------------------------------------------ C A GENERAL CONSTRAINT IS BEING DELETED FROM THE WORKING SET. C ------------------------------------------------------------------ 200 IF (MSG .GE. 80) *WRITE (NOUT, 1020) NACTIV, NCOLZ, NFREE, KDEL, JDEL, UNITQ NACTV1 = NACTIV - 1 NFREE1 = NFREE IBEGIN = KDEL IF (KDEL .GT. NACTV1) GO TO 400 C C DELETE A ROW OF T AND MOVE THE ONES BELOW IT UP. C DO 220 I = KDEL, NACTV1 KACTIV(I) = KACTIV(I+1) LENRT = NROWRT*I + 1 LDIAG = NFREE - I CALL COPYVC( I+1, RT(I+1,LDIAG), LENRT, NROWRT, * RT(I,LDIAG), LENRT, NROWRT ) 220 CONTINUE C C ------------------------------------------------------------------ C ELIMINATE THE SUPER-DIAGONAL ELEMENTS OF T, C USING A BACKWARD SWEEP OF 2*2 TRANFORMATIONS. C ------------------------------------------------------------------ 400 IF (IBEGIN .GT. NACTV1) GO TO 800 K = NFREE1 - IBEGIN L = NACTV1 - IBEGIN C DO 420 I = IBEGIN, NACTV1 CALL ELMGEN( ORTHOG, RT(I,K+1), RT(I,K), CS, SN ) IF (L .GT. 0) * CALL ELM ( ORTHOG, L, RT(I+1,K+1), L, 1, * RT(I+1,K ), L, 1, CS, SN ) IF (NACTV1 .GT. 0) * CALL ELM ( ORTHOG, NFREE1, ZY(1,K+1), NQ, 1, * ZY(1,K ), NQ, 1, CS, SN ) IF (MODFYG) * CALL ELM ( ORTHOG, 1, QTG(K+1), 1, 1, QTG(K), 1, 1, CS, SN ) K = K - 1 L = L - 1 420 CONTINUE C C ------------------------------------------------------------------ C COMPRESS THE ELEMENTS OF KACTIV CORRESPONDING TO FIXED VARIABLES. C ------------------------------------------------------------------ 800 NFIXD1 = N - NFREE1 KB = NACTV1 + 1 IF (NFIXD1 .EQ. 0) GO TO 900 DO 810 K = 1, NFIXD1 KACTIV(KB) = KACTIV(KB+1) KB = KB + 1 810 CONTINUE C C ------------------------------------------------------------------ C ESTIMATE THE CONDITION NUMBER OF T. C ------------------------------------------------------------------ 900 NCOLZ1 = NCOLZ + 1 LENRT = NROWRT*(NACTV1 - 1) + 1 INCT = NROWRT - 1 IF (NACTV1 .GT. 0) * CALL CONDVC( NACTV1, RT(NACTV1,NCOLZ1+1), LENRT, INCT, * DTMAX, DTMIN ) C RETURN C 1010 FORMAT(/ 34H //DELCON// SIMPLE BOUND DELETED. * / 49H //DELCON// NACTIV NCOLZ NFREE IFREED JDEL UNITQ * / 13H //DELCON// , 3I6, I7, I5, L6 ) 1020 FORMAT(/ 40H //DELCON// GENERAL CONSTRAINT DELETED. * / 49H //DELCON// NACTIV NCOLZ NFREE KDEL JDEL UNITQ * / 13H //DELCON// , 5I6, L6 ) C C END OF DELCON END