view libcruft/qpsol/findp.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 FINDP ( NULLR, UNITPG, UNITQ,
     *                   N, NCLIN, NCLIN0, NCTOTL, NQ,
     *                   NROWA, NROWRT, NCOLRT, NCOLR, NCOLZ, NFREE,
     *                   ISTATE, KFREE,
     *                   DINKY, GTP, PNORM, RDLAST, ZTGNRM,
     *                   A, AP, P, QTG, RT, V, ZY, WORK )
C
C     IMPLICIT           REAL*8(A-H,O-Z)
      LOGICAL            NULLR, UNITPG, UNITQ
      INTEGER            N, NCLIN, NCLIN0, NCTOTL, NQ, NROWA,
     *                   NROWRT, NCOLRT, NCOLR, NFREE
      INTEGER            ISTATE(NCTOTL), KFREE(N)
      DOUBLE PRECISION   DINKY, GTP, PNORM, RDLAST, ZTGNRM
      DOUBLE PRECISION   A(NROWA,N), AP(NCLIN0), QTG(N), P(N),
     *                   RT(NROWRT,NCOLRT), V(N), ZY(NQ,NQ)
      DOUBLE PRECISION   WORK(N)
C
      INTEGER            NOUT, MSG, ISTART
      COMMON    /SOL1CM/ NOUT, MSG, ISTART
C
C  *********************************************************************
C  FINDP   COMPUTES THE FOLLOWING QUANTITIES FOR  LPCORE,  QPCORE  AND
C  LCCORE ...
C
C  (1) THE SEARCH DIRECTION  P  (AND ITS 2-NORM).
C  (2) THE VECTOR  V  SUCH THAT  R(T)V = - Z(T)G(FREE).  THIS VECTOR IS
C      REQUIRED BY  LCCORE  ONLY.
C  (3) THE VECTOR  AP,  WHERE  A  IS THE MATRIX OF LINEAR CONSTRAINTS.
C      AND, IF  NULLR  IS FALSE,
C  (4) THE  (NCOLR)-TH DIAGONAL ELEMENT OF THE CHOLESKY FACTOR OF THE
C      PROJECTED HESSIAN.
C
C  SYSTEMS OPTIMIZATION LABORATORY, STANFORD UNIVERSITY.
C  ORIGINAL VERSION OF DECEMBER 1982. REV. MAY 1983.
C  *********************************************************************
C
      INTEGER            I, J
      DOUBLE PRECISION   ONE
      DOUBLE PRECISION   DOT, V2NORM
      DATA               ONE /1.0D+0/
C
      CALL COPYVC( NCOLR,          QTG, NCOLR, 1, P, NCOLR, 1 )
      CALL SSCALE( NCOLR, (- ONE), P  , NCOLR, 1 )
      IF (NULLR) GO TO 200
      RDLAST   = RT(NCOLR,NCOLR)
C  ***
C  CORRECTION INSERTED BY MHW, 22 OCT 1985.
C  THIS ENSURES A NON-ZERO SEARCH DIRECTION.
C  ***
      IF (NCOLR .LT. NCOLZ .AND. ZTGNRM .LE. DINKY)  P(NCOLR) = RDLAST
C
C  ---------------------------------------------------------------------
C  SOLVE THE SYSTEM   R(T)R (PZ) = - Z(T)G(FREE).
C  ---------------------------------------------------------------------
      IF (UNITPG) GO TO 120
C
C  PERFORM THE FORWARD SUBSTITUTION  R(T)V = - Z(T)G(FREE).
C
      CALL RSOLVE( 2, NROWRT, NCOLR, RT, P )
      GO TO 130
C
C  THE PROJECTED GRADIENT IS A MULTIPLE OF THE UNIT VECTOR, THE FORWARD
C  SUBSTITUTION MAY BE AVOIDED.
C
  120 IF (ZTGNRM .LE. DINKY) P(NCOLR) = - ONE
      IF (ZTGNRM .GT. DINKY) P(NCOLR) =   P(NCOLR) / RDLAST
C
C  PERFORM THE BACKWARD SUBSTITUTION   R(PZ) = P.
C
  130 CALL COPYVC( NCOLR, P, NCOLR, 1, V, NCOLR, 1 )
      CALL RSOLVE( 1, NROWRT, NCOLR, RT, P )
C
C  ---------------------------------------------------------------------
C  THE VECTOR  (PZ)  HAS BEEN COMPUTED.
C  ---------------------------------------------------------------------
C  COMPUTE THE DIRECTIONAL DERIVATIVE  G(T)P = (GZ)(T)(PZ).
C
  200 GTP    = DOT( NCOLR, QTG, NCOLR, 1, P, NCOLR, 1 )
C
C  ---------------------------------------------------------------------
C  COMPUTE  P = Z * PZ.
C  ---------------------------------------------------------------------
C  NACTIV  AND  KACTIV  ARE NOT USED IN  ZYPROD.  N  AND  KFREE  SERVE
C  AS ARGUMENTS FOR  NACTIV  AND  KACTIV.
C
      CALL ZYPROD( 1, N, N, NCOLR, NFREE, NQ, UNITQ,
     *             KFREE, KFREE, P, ZY, WORK )
C
      PNORM = V2NORM( NFREE, WORK, NFREE, 1 )
      IF (MSG .GE. 80) WRITE (NOUT, 1100) (P(J), J = 1, N)
C
C  ---------------------------------------------------------------------
C  COMPUTE  AP.
C  ---------------------------------------------------------------------
      IF (NCLIN .EQ. 0) GO TO 900
      CALL ZEROVC( NCLIN, AP, NCLIN, 1 )
      DO 410 J = 1, N
         IF (ISTATE(J) .GT. 0) GO TO 410
         CALL AXPY( NCLIN, P(J), A(1,J), NCLIN, 1, AP, NCLIN, 1 )
  410 CONTINUE
      IF (MSG .GE. 80  .AND.  NCLIN .GT. 0)
     *   WRITE (NOUT, 1000) (AP(I), I = 1, NCLIN)
C
  900 RETURN
C
 1000 FORMAT(/ 20H //FINDP //  AP ...  / (1P5E15.5))
 1100 FORMAT(/ 20H //FINDP //   P ...  / (1P5E15.5))
C
C  END OF FINDP
      END