view libcruft/qpsol/addcon.f @ 2937:9d26524e2869

[project @ 1997-05-06 05:49:53 by jwe]
author jwe
date Tue, 06 May 1997 05:55:13 +0000
parents 30c606bec7a8
children
line wrap: on
line source

C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C     FILE CMSUBS66 FORTRAN
C
C     ADDCON   ALLOC    BDPERT   BNDALF   CHKDAT   DELCON
C     FINDP    GETLAM   PRTSOL   RSOLVE   TQADD    TSOLVE   ZYPROD
C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
      SUBROUTINE ADDCON( MODFYG, MODFYR, ORTHOG, UNITQ, INFORM,
     *                   IFIX, IADD, JADD, NACTIV, NCOLR, NCOLZ, NFREE,
     *                   N, NQ, NROWA, NROWRT, NCOLRT, KFREE,
     *                   CONDMX, CSLAST, SNLAST,
     *                   A, QTG, RT, ZY, WRK1, WRK2 )
C
C     IMPLICIT           REAL*8(A-H,O-Z)
      LOGICAL            MODFYG, MODFYR, ORTHOG, UNITQ
      INTEGER            INFORM, IFIX, IADD, JADD, NACTIV, NCOLR,
     *                   NCOLZ, NFREE, N, NQ, NROWA, NROWRT, NCOLRT
      INTEGER            KFREE(N)
      DOUBLE PRECISION   CONDMX, CSLAST, SNLAST
      DOUBLE PRECISION   A(NROWA,N), QTG(N), RT(NROWRT,NCOLRT),
     *                   ZY(NQ,NQ), WRK1(N), WRK2(N)
C
      INTEGER            NOUT, MSG, ISTART
      DOUBLE PRECISION   ASIZE, DTMAX, DTMIN
      DOUBLE PRECISION   WMACH
      COMMON    /SOLMCH/ WMACH(15)
      COMMON    /SOL1CM/ NOUT, MSG, ISTART
      COMMON    /SOL5CM/ ASIZE, DTMAX, DTMIN
C
C  *********************************************************************
C  ADDCON  UPDATES THE FACTORIZATION OF THE MATRIX OF
C  CONSTRAINTS IN THE WORKING SET,  A(FREE) * (Z Y) = (0 T).
C  IF THE LOGICAL VARIABLE  MODFYR  IS TRUE, THE CHOLESKY FACTORIZATION
C  OF THE PROJECTED HESSIAN, R(T)*R, IS UPDATED ALSO.
C
C  THERE ARE THREE SEPARATE CASES TO CONSIDER (ALTHOUGH EACH CASE
C  SHARES CODE WITH ANOTHER)...
C
C  (1) A FREE VARIABLE BECOMES FIXED ON ONE OF ITS BOUNDS WHEN THERE
C      ARE ALREADY SOME GENERAL CONSTRAINTS IN THE WORKING SET.
C
C  (2) A FREE VARIABLE BECOMES FIXED ON ONE OF ITS BOUNDS WHEN THERE
C      ARE ONLY BOUND CONSTRAINTS IN THE WORKING SET.
C
C  (3) A GENERAL CONSTRAINT (CORRESPONDING TO ROW  IADD  OF  A) IS
C      ADDED TO THE WORKING SET.
C
C      IN CASES (1) AND (2), WE ASSUME THAT  KFREE(IFIX) = JADD.
C  IN ALL CASES,  JADD  IS THE INDEX OF THE CONSTRAINT BEING ADDED.
C
C  IF THERE ARE NO GENERAL CONSTRAINTS IN THE WORKING SET,  THE
C  MATRIX  Q = (Z Y)  IS THE IDENTITY AND WILL NOT BE TOUCHED.
C
C  IF  MODFYR  IS TRUE AND  NCOLZ IS GREATER THAN ONE ON ENTRY,
C  CSLAST AND SNLAST CONTAIN THE LAST OF THE SEQUENCE OF GIVENS
C  ROTATIONS USED TO REDUCE THE INTERMEDIATE UPPER-HESSENBERG MATRIX
C  TO UPPER-TRIANGULAR FORM.  THESE ELEMENTS ARE NEEDED BY QPCORE.
C
C  IF  MODFYG  IS TRUE ON ENTRY, THE COLUMN TRANSFORMATIONS ARE
C  APPLIED TO THE VECTOR  Q(T)GRAD,  STORED IN  QTG.
C
C  SYSTEMS OPTIMIZATION LABORATORY, STANFORD UNIVERSITY.
C  VERSION OF JANUARY 1982.  REV. OCT. 1982.  MARCH 1983.
C  MARCH 1983.  HOUSEHOLDER REFLECTION USED TO ADD GENERAL CONSTRAINT.
C  APRIL 1983.  ELIMINATIONS ADDED AS AN OPTION.
C  *********************************************************************
C
      INTEGER            I, INCT, ISWAP, ITRANS, J, K, KP1, LDIAG, LENQ,
     *                   LENRT, LROWA, LROWR, NACT1, NCOLZ1, NELM,NFREE1
      DOUBLE PRECISION   BETA, COND, CONDBD, CS, D, DELTA, DTNEW,
     *                   EPSMCH, ONE, POINT9, SN, TDTMAX, TDTMIN,
     *                   ZERO
      DOUBLE PRECISION   DOT, QUOTNT, V2NORM
      DOUBLE PRECISION   DMAX1, DMIN1
      DATA               ZERO  , POINT9, ONE
     *                  /0.0D+0, 0.9D+0, 1.0D+0/
C
      EPSMCH = WMACH(3)
C
C  IF THE CONDITION ESTIMATOR OF THE UPDATED FACTORS IS GREATER THAN
C  CONDBD,  A WARNING MESSAGE IS PRINTED.
C
      CONDBD = EPSMCH**(- POINT9)
      LENQ   = NQ   *(NQ - 1) + 1
      LROWA  = NROWA*(N  - 1) + 1
      NCOLZ1 = NCOLZ - 1
      IF (JADD .GT. N) GO TO 200
C
C  ---------------------------------------------------------------------
C  A SIMPLE BOUND HAS ENTERED THE WORKING SET.  IADD  IS NOT USED.
C  ---------------------------------------------------------------------
      IF (MSG .GE. 80)
     *WRITE (NOUT, 1010) NACTIV, NCOLZ, NFREE, IFIX, JADD, UNITQ
C
C  SET  WRK1 = APPROPRIATE ROW OF  Q.
C  REORDER THE ELEMENTS OF  KFREE (THIS REQUIRES REORDERING THE
C  CORRESPONDING ROWS OF  Q).
C
      NFREE1 = NFREE - 1
      NACT1  = NACTIV
      IF (UNITQ) GO TO 120
C
C  Q  IS STORED EXPLICITLY.  INTERCHANGE COMPONENTS  IFIX  AND  NFREE
C  OF  KFREE  AND SWAP THE CORRESPONDING ROWS OF  Q.
C
      CALL COPYVC( NFREE, ZY(IFIX,1), LENQ, NQ, WRK1, N, 1 )
      IF (IFIX .EQ. NFREE) GO TO 400
      KFREE(IFIX) = KFREE(NFREE)
      CALL COPYVC( NFREE, ZY(NFREE,1), LENQ, NQ, ZY(IFIX,1), LENQ, NQ )
      GO TO 400
C
C  Q  IS NOT STORED, BUT  KFREE  DEFINES AN ORDERING OF THE COLUMNS
C  OF THE IDENTITY MATRIX THAT IMPLICITLY DEFINE  Z.
C  REORDER  KFREE  SO THAT VARIABLES  IFIX+1,...,NFREE  ARE MOVED ONE
C  POSITION TO THE LEFT.
C
  120 CALL ZEROVC( NFREE, WRK1, N, 1 )
      WRK1(IFIX) = ONE
      IF (IFIX .EQ. NFREE) GO TO 400
      DO 130 I = IFIX, NFREE1
         KFREE(I) = KFREE(I+1)
  130 CONTINUE
      GO TO 400
C
C  ---------------------------------------------------------------------
C  A GENERAL CONSTRAINT HAS ENTERED THE WORKING SET.  IFIX IS NOT USED.
C  ---------------------------------------------------------------------
  200 IF (MSG .GE. 80)
     *WRITE (NOUT, 1020) NACTIV, NCOLZ, NFREE, IADD, JADD, UNITQ
C
      NACT1  = NACTIV + 1
C
C  TRANSFORM THE INCOMING ROW OF  A  BY  Q(T).
C
      CALL COPYVC( N, A(IADD,1), LROWA, NROWA, WRK1, N, 1 )
      CALL ZYPROD( 8, N, NACTIV, NCOLZ, NFREE, NQ, UNITQ,
     *             KFREE, KFREE, WRK1, ZY, WRK2 )
C
      IF (.NOT. UNITQ) GO TO 250
C
C  THIS IS THE FIRST GENERAL CONSTRAINT TO BE ADDED  --  SET  Q = I.
C
      DO 220 J = 1, NFREE
         CALL ZEROVC( NFREE, ZY(1,J), NFREE, 1 )
         ZY(J,J) = ONE
  220 CONTINUE
      UNITQ  = .FALSE.
C
C  CHECK THAT THE INCOMING ROW IS NOT DEPENDENT UPON THOSE
C  ALREADY IN THE WORKING SET.
C
  250 DTNEW  = V2NORM( NCOLZ, WRK1, NCOLZ, 1 )
      IF (NACT1 .GT. 1) GO TO 300
C
C  THIS IS THE ONLY GENERAL CONSTRAINT IN THE WORKING SET.
C
      COND   = QUOTNT( ASIZE, DTNEW )
      IF (COND .GE. CONDMX) GO TO 910
      IF (COND .GE. CONDBD) WRITE (NOUT, 2000) JADD
      DTMAX  = DTNEW
      DTMIN  = DTNEW
      GO TO 400
C
C  THERE ARE ALREADY SOME GENERAL CONSTRAINTS IN THE WORKING SET.
C  UPDATE THE ESTIMATE OF THE CONDITION NUMBER.
C
  300 TDTMAX = DMAX1( DTNEW, DTMAX )
      TDTMIN = DMIN1( DTNEW, DTMIN )
      COND   = QUOTNT( TDTMAX, TDTMIN )
      IF (COND .GE. CONDMX) GO TO 910
      IF (COND .GE. CONDBD) WRITE (NOUT, 2000) JADD
      DTMAX  = TDTMAX
      DTMIN  = TDTMIN
C
C  ---------------------------------------------------------------------
C  USE ONE OR MORE COLUMN TRANSFORMATIONS TO REDUCE THE FIRST  NCOLZ1
C  ELEMENTS OF  WRK1  TO ZERO.  THIS AFFECTS  ZY,  EXCEPT IF (UNITQ).
C  THE TRANSFORMATIONS MAY ALSO BE APPLIED TO  QTG  AND  R.
C  ---------------------------------------------------------------------
C
  400 IF (NCOLZ1 .EQ. 0    ) GO TO 600
      IF (MODFYR .OR. UNITQ) GO TO 500
C
C  ---------------------------------------------------------------------
C  THERE IS NO  R.  USE A SINGLE ELIMINATION OR HOUSEHOLDER MATRIX.
C  ---------------------------------------------------------------------
      IF (ORTHOG) GO TO 440
C
C  *********************************************************************
C  ELIMINATION.
C  WE USE   ELM( ..., ZERO, ZERO )   TO PERFORM AN INTERCHANGE.
C  *********************************************************************
      CALL ETAGEN( NCOLZ1, WRK1(NCOLZ), WRK1, NCOLZ1, 1, ISWAP, ITRANS )
      IF (ISWAP .GT. 0)
     *   CALL ELM   ( ORTHOG, NFREE, ZY(1,NCOLZ), NFREE, 1,
     *                               ZY(1,ISWAP), NFREE, 1, ZERO, ZERO )
C
      IF (ITRANS .EQ. 0) GO TO 420
C
      DO 410 J = 1, NCOLZ1
         D     = WRK1(J)
         IF (D .EQ. ZERO) GO TO 410
         CALL AXPY( NFREE, D, ZY(1,NCOLZ), NFREE, 1, ZY(1,J), NFREE, 1 )
  410 CONTINUE
C
  420 IF (.NOT. MODFYG) GO TO 600
      IF (ISWAP .GT. 0)
     *   CALL ELM   ( ORTHOG, 1, QTG(NCOLZ), 1, 1,
     *                           QTG(ISWAP), 1, 1, ZERO, ZERO )
C
      IF (ITRANS .GT. 0)
     *   CALL AXPY( NCOLZ1, QTG(NCOLZ), WRK1, NCOLZ1, 1,
     *                                  QTG , NCOLZ1, 1 )
      GO TO 600
C
C  *********************************************************************
C  ORTHOGONAL TRANSFORMATION.
C  WE USE A HOUSEHOLDER REFLECTION,   I  -  1/BETA  V V(T).
C
C  THERE ARE TWO WAYS OF APPLYING THE REFLECTION.  THE UPDATE TO  Z
C  IS DONE VIA   W  =  Z * V,   Z  =  Z  -  1/BETA  W V(T),
C  WHERE  V = WRK1 (FROM HOUSEHOLDER), AND  W = WRK2 (WORKSPACE).
C
C  THE UPDATE TO  QTG  IS THE MORE USUAL  D =  - QTG(T)*V / BETA,
C  QTG  =  QTG  +  D * V.
C
C  NOTE THAT  DELTA  HAS TO BE STORED AFTER THE REFLECTION IS USED.
C  *********************************************************************
  440 CALL REFGEN( NCOLZ1, WRK1(NCOLZ), WRK1, NCOLZ1, 1, BETA, DELTA )
      IF (BETA .LE. ZERO) GO TO 600
      CALL ZEROVC( NFREE, WRK2, NFREE, 1 )
C
      DO 450 J = 1, NCOLZ
         D     = WRK1(J)
         IF (D .EQ. ZERO) GO TO 450
         CALL AXPY( NFREE, D, ZY(1,J), NFREE, 1, WRK2, NFREE, 1 )
  450 CONTINUE
C
      DO 460 J = 1, NCOLZ
         D     = WRK1(J)
         IF (D .EQ. ZERO) GO TO 460
         D     = - D/BETA
         CALL AXPY( NFREE, D, WRK2, NFREE, 1, ZY(1,J), NFREE, 1 )
  460 CONTINUE
C
      IF (.NOT. MODFYG) GO TO 470
      D      = DOT( NCOLZ, WRK1, NCOLZ, 1, QTG, NCOLZ, 1 )
      D      = - D/BETA
      CALL AXPY( NCOLZ, D, WRK1, NCOLZ, 1, QTG, NCOLZ, 1 )
C
  470 WRK1(NCOLZ) = DELTA
      GO TO 600
C
C  ---------------------------------------------------------------------
C  R  HAS TO BE MODIFIED.  USE A SEQUENCE OF 2*2 TRANSFORMATIONS.
C  ---------------------------------------------------------------------
  500 LROWR  = NCOLR
C
      DO 510 K = 1, NCOLZ1
C
C        COMPUTE THE TRANSFORMATION THAT REDUCES WRK1(K) TO ZERO,
C        THEN APPLY IT TO THE RELEVANT COLUMNS OF  Z  AND  GRAD(T)Q.
C
         KP1    = K + 1
         CALL ELMGEN( ORTHOG, WRK1(KP1), WRK1(K), CS, SN )
         IF (.NOT. UNITQ)
     *   CALL ELM   ( ORTHOG, NFREE, ZY(1,KP1), NFREE, 1,
     *                               ZY(1,K  ), NFREE, 1, CS, SN )
         IF (MODFYG)
     *   CALL ELM   ( ORTHOG, 1, QTG(KP1), 1, 1, QTG(K), 1, 1, CS, SN )
C
C        APPLY THE SAME TRANSFORMATION TO THE COLS OF  R  IF RELEVANT.
C        THIS GENERATES A SUBDIAGONAL ELEMENT IN  R  WHICH MUST BE
C        ELIMINATED BY A ROW ROTATION.  THE LAST SUCH ROW ROTATION
C        IS NEEDED BY  QPCORE.
C
         IF (.NOT. (MODFYR  .AND.  K .LT. NCOLR)) GO TO 510
         RT(KP1,K) = ZERO
         CALL ELM   ( ORTHOG, KP1, RT(1,KP1), KP1, 1,
     *                             RT(1,K  ), KP1, 1, CS, SN )
         CALL ROTGEN( RT(K,K), RT(KP1,K), CSLAST, SNLAST )
         LROWR  = LROWR - 1
         LENRT  = NROWRT*(LROWR - 1) + 1
         CALL ROT3  ( LROWR, RT(K,KP1), LENRT, NROWRT,
     *                     RT(KP1,KP1), LENRT, NROWRT, CSLAST, SNLAST )
  510 CONTINUE
C
C  ---------------------------------------------------------------------
C  IF ADDING A GENERAL CONSTRAINT, INSERT THE NEW ROW OF  T  AND EXIT.
C  ---------------------------------------------------------------------
  600 IF (JADD .LE. N) GO TO 700
      LENRT  = NROWRT*NACTIV + 1
      CALL COPYVC( NACT1, WRK1(NCOLZ), NACT1, 1,
     *                RT(NACT1,NCOLZ), LENRT, NROWRT )
      GO TO 900
C
C  ---------------------------------------------------------------------
C  WE ARE ADDING A BOUND.  CONTINUE REDUCING THE ELEMENTS OF  WRK1
C  TO ZERO.  THIS AFFECTS  Y,  T  AND  QTG.
C  ---------------------------------------------------------------------
C  FIRST, SET THE SUPER-DIAGONAL ELEMENTS OF T TO ZERO.
C
  700 IF (NACTIV .EQ. 0) GO TO 790
      LENRT = NROWRT*(NACTIV - 1) + 1
      CALL ZEROVC( NACTIV, RT(NACTIV,NCOLZ), LENRT, (NROWRT - 1) )
      NELM   = 1
      LDIAG  = NACTIV
C
      DO 710 K = NCOLZ, NFREE1
         CALL ELMGEN( ORTHOG, WRK1(K+1), WRK1(K), CS, SN )
         CALL ELM   ( ORTHOG, NFREE, ZY(1,K+1), NQ, 1,
     *                               ZY(1,K  ), NQ, 1, CS, SN )
         CALL ELM   ( ORTHOG, NELM, RT(LDIAG,K+1), NROWRT, 1,
     *                              RT(LDIAG,K  ), NROWRT, 1, CS, SN )
         IF (MODFYG)
     *   CALL ELM   ( ORTHOG, 1, QTG(K+1), 1, 1, QTG(K), 1, 1, CS, SN )
         NELM  = NELM  + 1
         LDIAG = LDIAG - 1
  710 CONTINUE
C
C  ---------------------------------------------------------------------
C  THE DIAGONALS OF  T  HAVE BEEN ALTERED.  RECOMPUTE THE LARGEST AND
C  SMALLEST VALUES.
C  ---------------------------------------------------------------------
      LENRT  = NROWRT*(NACTIV - 1) + 1
      INCT   = NROWRT - 1
      CALL CONDVC( NACTIV, RT(NACTIV,NCOLZ1+1), LENRT, INCT,
     *             DTMAX, DTMIN )
      IF ((DTMIN/DTMAX)*CONDMX .LT. ONE) GO TO 910
      IF ((DTMIN/DTMAX)*CONDBD .LT. ONE) WRITE (NOUT, 2000) JADD
C
C  THE LAST ROW OF  ZY  HAS BEEN TRANSFORMED TO A MULTIPLE OF THE
C  UNIT VECTOR  E(NFREE).  IF ORTHOGONAL TRANSFORMATIONS HAVE BEEN
C  USED THROUGHOUT, THE LAST COLUMN OF  ZY  IS THE SAME.   WE CAN
C  THEREFORE RESURRECT THE GRADIENT ELEMENT OF THE NEWLY-FIXED VARIABLE.
C
  790 IF (ORTHOG .AND. MODFYG)
     *QTG(NFREE) = QTG(NFREE)/WRK1(NFREE)
C
C  ---------------------------------------------------------------------
C  THE FACTORIZATION HAS BEEN SUCCESSFULLY UPDATED.
C  ---------------------------------------------------------------------
  900 INFORM = 0
      RETURN
C
C  THE PROPOSED WORKING SET APPEARS TO BE LINEARLY DEPENDENT.
C
  910 INFORM = 1
      IF (.NOT. MSG .GE. 80) RETURN
C
      WRITE (NOUT, 3000)
      IF (JADD .LE. N) WRITE (NOUT, 3010) ASIZE, DTMAX, DTMIN
      IF (JADD .GT. N) WRITE (NOUT, 3020) ASIZE, DTMAX, DTMIN, DTNEW
      RETURN
C
 1010 FORMAT(/ 32H //ADDCON//  SIMPLE BOUND ADDED.
     *       / 49H //ADDCON//  NACTIV NCOLZ NFREE  IFIX  JADD UNITQ
     *       / 13H //ADDCON//  , 5I6, L6 )
 1020 FORMAT(/ 38H //ADDCON//  GENERAL CONSTRAINT ADDED.
     *       / 49H //ADDCON//  NACTIV NCOLZ NFREE  IADD  JADD UNITQ
     *       / 13H //ADDCON//  , 5I6, L6 )
 2000 FORMAT(/ 12H *** WARNING
     *       / 48H *** SERIOUS ILL-CONDITIONING IN THE WORKING SET,
     *         25H AFTER ADDING CONSTRAINT ,  I5
     *       / 48H *** OVERFLOW MAY OCCUR IN SUBSEQUENT ITERATIONS //)
 3000 FORMAT(/ 42H //ADDCON//  DEPENDENT CONSTRAINT REJECTED )
 3010 FORMAT(/ 41H //ADDCON//     ASIZE     DTMAX     DTMIN
     *       / 11H //ADDCON//, 1P3E10.2 )
 3020 FORMAT(/ 51H //ADDCON//     ASIZE     DTMAX     DTMIN     DTNEW
     *       / 11H //ADDCON//, 1P4E10.2 )
C
C  END OF ADDCON
      END