Mercurial > octave-nkf
diff libcruft/npsol/npkey.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 diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcruft/npsol/npkey.f Fri Jul 19 01:29:55 1996 +0000 @@ -0,0 +1,332 @@ +*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + SUBROUTINE NPKEY ( NOUT, BUFFER, KEY ) + + IMPLICIT DOUBLE PRECISION(A-H,O-Z) + CHARACTER*(*) BUFFER + +************************************************************************ +* NPKEY decodes the option contained in BUFFER in order to set +* a parameter value in the relevant element of the parameter arrays. +* +* +* Input: +* +* NOUT A unit number for printing error messages. +* NOUT must be a valid unit. +* +* Output: +* +* KEY The first keyword contained in BUFFER. +* +* +* NPKEY calls OPNUMB and the subprograms +* LOOKUP, SCANNR, TOKENS, UPCASE +* (now called OPLOOK, OPSCAN, OPTOKN, OPUPPR) +* supplied by Informatics General, Inc., Palo Alto, California. +* +* Systems Optimization Laboratory, Stanford University. +* This version of NPKEY dated 12-July-1986. +************************************************************************ +*----------------------------------------------------------------------- + PARAMETER (MXPARM = 30) + INTEGER IPRMLS(MXPARM), IPSVLS + DOUBLE PRECISION RPRMLS(MXPARM), RPSVLS + + COMMON /LSPAR1/ IPSVLS(MXPARM), + $ IDBGLS, ITMAX1, ITMAX2, LCRASH, LDBGLS, LPROB , + $ MSGLS , NN , NNCLIN, NPROB , IPADLS(20) + + COMMON /LSPAR2/ RPSVLS(MXPARM), + $ BIGBND, BIGDX , BNDLOW, BNDUPP, TOLACT, TOLFEA, + $ TOLRNK, RPADLS(23) + + EQUIVALENCE (IPRMLS(1), IDBGLS), (RPRMLS(1), BIGBND) + + SAVE /LSPAR1/, /LSPAR2/ +*----------------------------------------------------------------------- +*----------------------------------------------------------------------- + INTEGER IPRMNP(MXPARM), IPSVNP + DOUBLE PRECISION RPRMNP(MXPARM), RPSVNP + + COMMON /NPPAR1/ IPSVNP(MXPARM), + $ IDBGNP, ITMXNP, JVRFY1, JVRFY2, JVRFY3, JVRFY4, + $ LDBGNP, LFORMH, LVLDER, LVERFY, MSGNP , NLNF , + $ NLNJ , NLNX , NNCNLN, IPADNP(15) + + COMMON /NPPAR2/ RPSVNP(MXPARM), + $ CDINT , CTOL , EPSRF , ETA , FDINT , FTOL , + $ RPADNP(24) + + EQUIVALENCE (IPRMNP(1), IDBGNP), (RPRMNP(1), CDINT) + + SAVE /NPPAR1/, /NPPAR2/ +*----------------------------------------------------------------------- + EQUIVALENCE (IDBGNP, IDBG ), (ITMXNP, NMAJOR), (ITMAX2, NMINOR) + EQUIVALENCE (LDBGLS, MNRDBG), (LDBGNP, MJRDBG), (MSGLS , MSGQP ) + + EXTERNAL OPNUMB + LOGICAL FIRST , MORE , NUMBER, OPNUMB, SORTED + SAVE FIRST + + PARAMETER ( MAXKEY = 38, MAXTIE = 19, MAXTOK = 10) + CHARACTER*16 KEYS(MAXKEY), TIES(MAXTIE), TOKEN(MAXTOK) + CHARACTER*16 KEY, KEY2, KEY3, VALUE + + PARAMETER (IDUMMY = -11111, RDUMMY = -11111.0, + $ SORTED = .TRUE., ZERO = 0.0 ) + + DATA FIRST + $ /.TRUE./ + DATA KEYS + $ / 'BEGIN ', + $ 'CENTRAL ', 'COLD ', 'CONSTRAINTS ', + $ 'CRASH ', 'DEBUG ', 'DEFAULTS ', + $ 'DERIVATIVE ', 'DIFFERENCE ', + $ 'END ', 'FEASIBILITY ', 'FUNCTION ', + $ 'HESSIAN ', 'HOT ', 'INFINITE ', + $ 'IPRMLS ', 'ITERATIONS ', 'ITERS:ITERATIONS', + $ 'ITNS :ITERATIONS', 'LINEAR ', 'LINESEARCH ', + $ 'LIST ', 'LOWER ', + $ 'MAJOR ', 'MINOR ', + $ 'NOLIST ', + $ 'NONLINEAR ', 'OPTIMALITY ', 'PRINT ', + $ 'PROBLEM ', 'ROW ', 'RPRMLS ', + $ 'START ', 'STOP ', 'UPPER ', + $ 'VARIABLES ', 'VERIFY ', 'WARM '/ + + DATA TIES + $ / 'BOUND ', 'CONSTRAINTS ', 'DEBUG ', + $ 'FEASIBILITY ', 'GRADIENTS ', + $ 'ITERATIONS ', 'ITERS:ITERATIONS', + $ 'ITNS :ITERATIONS', 'JACOBIAN ', 'LEVEL ', + $ 'NO ', + $ 'NO. :NUMBER', + $ 'NUMBER ', 'OBJECTIVE ', 'PRINT ', + $ 'STEP ', 'TOLERANCE ', + $ 'VARIABLES ', 'YES '/ +*----------------------------------------------------------------------- + + IF (FIRST) THEN + FIRST = .FALSE. + DO 10 I = 1, MXPARM + RPRMLS(I) = RDUMMY + IPRMLS(I) = IDUMMY + RPRMNP(I) = RDUMMY + IPRMNP(I) = IDUMMY + 10 CONTINUE + END IF + +* Eliminate comments and empty lines. +* A '*' appearing anywhere in BUFFER terminates the string. + + I = INDEX( BUFFER, '*' ) + IF (I .EQ. 0) THEN + LENBUF = LEN( BUFFER ) + ELSE + LENBUF = I - 1 + END IF + IF (LENBUF .LE. 0) THEN + KEY = '*' + GO TO 900 + END IF + +* ------------------------------------------------------------------ +* Extract up to MAXTOK tokens from the record. +* NTOKEN returns how many were actually found. +* KEY, KEY2, KEY3 are the first tokens if any, otherwise blank. +* ------------------------------------------------------------------ + NTOKEN = MAXTOK + CALL OPTOKN( BUFFER(1:LENBUF), NTOKEN, TOKEN ) + KEY = TOKEN(1) + KEY2 = TOKEN(2) + KEY3 = TOKEN(3) + +* Certain keywords require no action. + + IF (KEY .EQ. ' ' .OR. KEY .EQ. 'BEGIN' ) GO TO 900 + IF (KEY .EQ. 'LIST' .OR. KEY .EQ. 'NOLIST') GO TO 900 + IF (KEY .EQ. 'END' ) GO TO 900 + +* Most keywords will have an associated integer or real value, +* so look for it no matter what the keyword. + + I = 1 + NUMBER = .FALSE. + + 50 IF (I .LT. NTOKEN .AND. .NOT. NUMBER) THEN + I = I + 1 + VALUE = TOKEN(I) + NUMBER = OPNUMB( VALUE ) + GO TO 50 + END IF + + IF (NUMBER) THEN + READ (VALUE, '(BN, E16.0)') RVALUE + ELSE + RVALUE = ZERO + END IF + +* Convert the keywords to their most fundamental form +* (upper case, no abbreviations). +* SORTED says whether the dictionaries are in alphabetic order. +* LOCi says where the keywords are in the dictionaries. +* LOCi = 0 signals that the keyword wasn't there. + + CALL OPLOOK( MAXKEY, KEYS, SORTED, KEY , LOC1 ) + CALL OPLOOK( MAXTIE, TIES, SORTED, KEY2, LOC2 ) + +* ------------------------------------------------------------------ +* Decide what to do about each keyword. +* The second keyword (if any) might be needed to break ties. +* Some seemingly redundant testing of MORE is used +* to avoid compiler limits on the number of consecutive ELSE IFs. +* ------------------------------------------------------------------ + MORE = .TRUE. + IF (MORE) THEN + MORE = .FALSE. + IF (KEY .EQ. 'CENTRAL ') THEN + CDINT = RVALUE + ELSE IF (KEY .EQ. 'COLD ') THEN + LCRASH = 0 + ELSE IF (KEY .EQ. 'CONSTRAINTS ') THEN + NNCLIN = RVALUE + ELSE IF (KEY .EQ. 'CRASH ') THEN + TOLACT = RVALUE + ELSE IF (KEY .EQ. 'DEBUG ') THEN + IDBG = RVALUE + ELSE IF (KEY .EQ. 'DEFAULTS ') THEN + DO 20 I = 1, MXPARM + IPRMLS(I) = IDUMMY + RPRMLS(I) = RDUMMY + IPRMNP(I) = IDUMMY + RPRMNP(I) = RDUMMY + 20 CONTINUE + ELSE IF (KEY .EQ. 'DERIVATIVE ') THEN + LVLDER = RVALUE + ELSE IF (KEY .EQ. 'DIFFERENCE ') THEN + FDINT = RVALUE + ELSE IF (KEY .EQ. 'FEASIBILITY ') THEN + TOLFEA = RVALUE + CTOL = RVALUE + ELSE IF (KEY .EQ. 'FUNCTION ') THEN + EPSRF = RVALUE + ELSE + MORE = .TRUE. + END IF + END IF + + IF (MORE) THEN + MORE = .FALSE. + IF (KEY .EQ. 'HESSIAN ') THEN + LFORMH = 1 + IF (KEY2.EQ. 'NO ') LFORMH = 0 + ELSE IF (KEY .EQ. 'HOT ') THEN + LCRASH = 2 + ELSE IF (KEY .EQ. 'INFINITE ') THEN + IF (KEY2.EQ. 'BOUND ') BIGBND = RVALUE * 0.99999 + IF (KEY2.EQ. 'STEP ') BIGDX = RVALUE + IF (LOC2.EQ. 0 ) WRITE(NOUT, 2320) KEY2 + ELSE IF (KEY .EQ. 'IPRMLS ') THEN +* Allow things like IPRMLS 21 = 100 to set IPRMLS(21) = 100 + IVALUE = RVALUE + IF (IVALUE .GE. 1 .AND. IVALUE .LE. MXPARM) THEN + READ (KEY3, '(BN, I16)') IPRMLS(IVALUE) + ELSE + WRITE(NOUT, 2400) IVALUE + END IF + ELSE IF (KEY .EQ. 'ITERATIONS ') THEN + NMAJOR = RVALUE + ELSE IF (KEY .EQ. 'LINEAR ') THEN + IF (KEY2 .EQ. 'CONSTRAINTS ') NNCLIN = RVALUE + IF (KEY2 .EQ. 'FEASIBILITY ') TOLFEA = RVALUE + IF (LOC2 .EQ. 0 ) WRITE(NOUT, 2320) KEY2 + ELSE IF (KEY .EQ. 'LINESEARCH ') THEN + ETA = RVALUE + ELSE IF (KEY .EQ. 'LOWER ') THEN + BNDLOW = RVALUE + ELSE + MORE = .TRUE. + END IF + END IF + + IF (MORE) THEN + MORE = .FALSE. + IF (KEY .EQ. 'MAJOR ') THEN + IF (KEY2.EQ. 'DEBUG ') MJRDBG = RVALUE + IF (KEY2.EQ. 'ITERATIONS ') NMAJOR = RVALUE + IF (KEY2.EQ. 'PRINT ') MSGNP = RVALUE + IF (LOC2.EQ. 0 ) WRITE(NOUT, 2320) KEY2 + ELSE IF (KEY .EQ. 'MINOR ') THEN + IF (KEY2.EQ. 'DEBUG ') MNRDBG = RVALUE + IF (KEY2.EQ. 'ITERATIONS ') NMINOR = RVALUE + IF (KEY2.EQ. 'PRINT ') MSGQP = RVALUE + IF (LOC2.EQ. 0 ) WRITE(NOUT, 2320) KEY2 + ELSE IF (KEY .EQ. 'NONLINEAR ') THEN + IF (KEY2.EQ. 'CONSTRAINTS ') NNCNLN = RVALUE + IF (KEY2.EQ. 'FEASIBILITY ') CTOL = RVALUE + IF (KEY2.EQ. 'JACOBIAN ') NLNJ = RVALUE + IF (KEY2.EQ. 'OBJECTIVE ') NLNF = RVALUE + IF (KEY2.EQ. 'VARIABLES ') NLNX = RVALUE + IF (LOC2.EQ. 0 ) WRITE(NOUT, 2320) KEY2 + ELSE IF (KEY .EQ. 'OPTIMALITY ') THEN + FTOL = RVALUE + ELSE + MORE = .TRUE. + END IF + END IF + + IF (MORE) THEN + MORE = .FALSE. + IF (KEY .EQ. 'PRINT ') THEN + MSGNP = RVALUE + ELSE IF (KEY .EQ. 'PROBLEM ') THEN + IF (KEY2.EQ. 'NUMBER ') NPROB = RVALUE + ELSE IF (KEY .EQ. 'ROW ') THEN + IF (KEY2.EQ. 'TOLERANCE ') CTOL = RVALUE + IF (LOC2.EQ. 0 ) WRITE(NOUT, 2320) KEY2 + ELSE IF (KEY .EQ. 'RPRMLS ') THEN +* Allow things like RPRMLS 21 = 2 to set RPRMLS(21) = 2.0 + IVALUE = RVALUE + IF (IVALUE .GE. 1 .AND. IVALUE .LE. MXPARM) THEN + READ (KEY3, '(BN, E16.0)') RPRMLS(IVALUE) + ELSE + WRITE(NOUT, 2400) IVALUE + END IF + ELSE IF (KEY .EQ. 'START ') THEN + IF (KEY2.EQ. 'CONSTRAINTS ') JVRFY3 = RVALUE + IF (KEY2.EQ. 'OBJECTIVE ') JVRFY1 = RVALUE + IF (LOC2.EQ. 0 ) WRITE(NOUT, 2320) KEY2 + ELSE IF (KEY .EQ. 'STOP ') THEN + IF (KEY2.EQ. 'CONSTRAINTS ') JVRFY4 = RVALUE + IF (KEY2.EQ. 'OBJECTIVE ') JVRFY2 = RVALUE + IF (LOC2.EQ. 0 ) WRITE(NOUT, 2320) KEY2 + ELSE IF (KEY .EQ. 'UPPER ') THEN + BNDUPP = RVALUE + ELSE IF (KEY .EQ. 'VARIABLES ') THEN + NN = RVALUE + ELSE IF (KEY .EQ. 'VERIFY ') THEN + IF (KEY2.EQ. 'OBJECTIVE ') LVERFY = 1 + IF (KEY2.EQ. 'CONSTRAINTS ') LVERFY = 2 + IF (KEY2.EQ. 'NO ') LVERFY = -1 + IF (KEY2.EQ. 'YES ') LVERFY = 3 + IF (KEY2.EQ. 'GRADIENTS ') LVERFY = 3 + IF (KEY2.EQ. 'LEVEL ') LVERFY = RVALUE + IF (LOC2.EQ. 0 ) LVERFY = 3 + ELSE IF (KEY .EQ. 'WARM ') THEN + LCRASH = 1 + ELSE + WRITE(NOUT, 2300) KEY + END IF + END IF + + 900 RETURN + + 2300 FORMAT(' XXX Keyword not recognized: ', A) + 2320 FORMAT(' XXX Second keyword not recognized: ', A) + 2330 FORMAT(' XXX Third keyword not recognized: ', A) + 2400 FORMAT(' XXX The PARM subscript is out of range:', I10) + +* End of NPKEY + + END