      SUBROUTINE FPOUT1(VPRNT1,DMISS,*)
C
C     FLOATING POINT OUTPUT SUBROUTINE
C
C     BOB STOUT, JULY 1972
C     MODIFIED JANUARY, 1973 BY BOB STOUT FOR DATAOUT AND XPRINT
C      REVISED SEPT. 1974
C
C     PERFORMS DYNAMIC OUTPUT FORMATTING FOR FLOATING POINT DATA.
C     ALL DATA IS PRINTED WITH THREE SIGNIFICANT FIGURES.
C     ALL SUMMARY STATISTICS ARE PRINTED WITH 4 SIGNIFICANT FIGURES,
C     EXCEPT THE SUM OF SQUARED OBSERVATIONS WHICH IS PRINTED WITH 6
C     FIGURES.
C
C     SUPERVISOR MUST INITIALIZE OVNAM IN /IO1/ WITH AN 8-CHARACTER
C     NAME FOR EACH VARIABLE WHICH MAY BE PRINTED.  NOV MUST CONTAIN
C     THE NUMBER OF POSSIBLE OUTPUT VARIABLES.	THE ORDER OF VARIABLE
C     NAMES IN OVNAM AND THE ORDER OF VALUES IN VPRNT AND VALUES
C     MUST CORRESPOND.	COSTPT MUST ALSO BE INITIALIZED--SEE BELOW
C     FOR DETAILS.
C
C------------------------------
C
C     ENTRY FPOUT1 MUST BE CALLED BY SUBROUTINE MODEL BEFORE DATA IS
C     SIMULATED FOR THE FIRST SUBJECT IN EACH EXPERIMENTAL GROUP.
C     FPOUT1 PRINTS ANY OUTPUT HEADING NECESSARY, AND PERFORMS INITIAL-
C     IZATION.	RETURN 1 FROM FPOUT1 INDICATES A FATAL ERROR SUCH AS
C     THERE BEING NO VARIABLES TO BE PRINTED.
C
C     ARGUMENTS:
C     VPRNT1 L*1  DIM(NOV).  VECTOR CONTAINING A .TRUE. VALUE FOR EACH
C		  VARIABLE WHOSE VALUE IS TO BE PRINTED FOR THE GROUP
C		  ABOUT TO BE SIMULATED, IN ANY CONDITION.  VPRNT1
C		  SHOULD BE THE INCLUSIVE OR OF ALL THE VPRNT2
C		  VECTORS ACROSS ALL CONDITIONS IN A WITHIN-
C		  SUBJECTS MULTIVARIATE DESIGN.  FOR ALL OTHER
C		  DESIGNS, VPRNT1 AND VPRNT2 MUST BE IDENTICAL.
C     DMISS  R*4  DIM(NOV).  VECTOR CONTAINING VALUES WHICH INDICATE
C		  'MISSING DATA' FOR EACH OUTPUT VARIABLE.  IF NO DATA
C		  IS EVER GOING TO BE MISSING, SOME UNLIKELY VALUE LIKE
C		  -10.E+10 SHOULD APPEAR IN THE APPROPRIATE SLOT IN
C		  DMISS.  WHEN DESCRIPTIVE STATISTICS ARE PRINTED FOR
C		  A GROUP THESE STATISTICS REFER ONLY TO THAT SUBSET
C		  OF SUBJECTS FOR WHOM COMPLETE DATA IS AVAILABLE.
C
C------------------------------
C
C     ENTRY FPOUT2 SHOULD BE CALLED BY SUBROUTINE MODEL TO PASS THE
C     VALUES OF VARIABLES TO BE PRINTED.  DATA MUST BE PASSED TO FPOUT2
C     IN A SUBJECT-BY-SUBJECT FASHION.	WHEN A WITHIN-SUBJECTS DESIGN
C     IS BEING SIMULATED, FPOUT2 MUST BE CALLED IN THE FOLLOWING
C     KIND OF SEQUENCE:
C	1ST CALL:  SUBJ 1  1ST CONDITION
C	2ND CALL:  SUBJ 1  2ND CONDITION
C	. . .
C	KTH CALL:  SUBJ 1  KTH CONDITION
C     K+1ST CALL:  SUBJ 2  1ST CONDITION
C     AND SO ON.  FPOUT2 CHECKS TO MAKE SURE THAT THE SUBJECT NUMBER
C     DOES NOT CHANGE BEFORE DATA FOR ALL CONDITIONS HAS COME IN.
C     AN ERROR MESSAGE IS PRINTED AND A RETURN 1 EXECUTED IF ANYTHING
C     GOES WRONG.
C
C     ARGUMENTS:
C     SUBJ    I*4  SUBJECT NUMBER
C     NCOND   I*4  NUMBER INDICATING WHETHER THE DATA PASSED IN VALUES
C		   IS FOR THE 1ST, 2ND, OR KTH CONDITION IN WHICH THE
C		   CURRENT SUBJECT HAS SERVED (NCOND IS IGNORED FOR
C		   BETWEEN-SUBJECTS DESIGNS).  NCOND SHOULD ***NOT***
C		   CONTAIN THE 'CONDITION NUMBER'--THE NUMBER WHICH
C		   INDICATES WHAT SET OF VARIABLE SETTINGS IS TO BE
C		   USED--NCOND SHOULD INDICATE THAT THIS IS, SAY, THE
C		   THIRD TREATMENT (CONDITION) TO WHICH THIS SUBJECT
C		   HAS BEEN SUBJECTED (THE SUBJECT MAY HAVE BEEN SUB-
C		   JECTED TO THE SAME TREATMENT THREE TIMES).
C     VPRNT2  L*1  DIM(NOV).  VECTOR CONTAINING A .TRUE. VALUE FOR
C		   EVERY VARIABLE WHOSE VALUE IS TO BE PRINTED FOR THE
C		   CONDITION CURRENTLY BEING SIMULATED.  VPRNT2 MAY BE
C		   DIFFERENT FROM ONE CONDITION TO THE NEXT IN WITHIN-
C		   SUBJECTS MULTIVARIATE EXPERIMENTS.  IN ALL OTHER
C		   CASES, VPRNT1 AND VPRNT2 MUST BE THE SAME.
C     VALUES  R*4  DIM(NOV).  VECTOR CONTAINING THE VALUES FOR EACH
C		   OUTPUT VARIABLE FOR THE GIVEN SUBJECT AND CONDITION.
C		   SEE DISCUSSION OF DMISS FOR MISSING DATA HANDLING.
C
C------------------------------
C
C     ENTRY FPOUT3 MUST BE CALLED AFTER ALL THE DATA FOR AN EXPERIMENT-
C     AL GROUP HAS BEEN PROCESSED SO THAT OUTPUT CAN BE FINISHED AND
C     STATISTICS PRINTED.
C
C     ARGUMENTS:
C     COST    R*4  SHOULD CONTAIN THE COST OF RUNNING THIS EXPER-
C		   IMENTAL GROUP.  COST IS PRINTED ONLY IF COSTPT IN
C		   /IO1/ IS .TRUE.
C
C------------------------------
C
C
      LOGICAL*4 VPRNT1(6),VPRNT2(6),OK,TRUBL,MEAN,VAR,SS,COV,CORR
      LOGICAL*4 COSTPT, DATOUT
      INTEGER*4 OVNAM,LINE,CONDS,OVN(8,6),CLABEL(2,16),OVPTRS(6)
      INTEGER*4 SUBJ,ODEV1,ODEV2,ODEV3,ODEV4,OPTR,N(16),SINK
      REAL*4 DMISS(6),VALUES(6),OUTVEC(16),SX(6,16),SXX(6,16)
      REAL*4 SXY(15,16)
C
      COMMON /IO/ IDEV(4),ODEV1,ODEV2,ODEV3,ODEV4,LINE(80)
      COMMON /IO1/ NOV,SINK,OVNAM(8,6),COSTPT,DATOUT
      COMMON /CNDTNS/ NCD,CONDS(16)
      COMMON /STAT1/ MEAN,VAR,SS,COV,CORR
C
C------------------------------
C
      OK=.TRUE.
C
C     CHECK WHICH VARIABLES HAVE TO BE PRINTED
      NVOUT=0
      DO 1 I=1,NOV
      IF(.NOT.VPRNT1(I))GO TO 1
      NVOUT=NVOUT+1
C     ADD ENTRY TO LIST OF VARIABLE LABELS
      DO 2 J=1,8
 2    OVN(J,NVOUT)=OVNAM(J,I)
      OVPTRS(NVOUT)=I
 1    CONTINUE
C
C     SET UP LIST OF CONDITION LABELS
      DO 3 I=1,NCD
      J=CONDS(I)
 3    CALL CCHARS(J,CLABEL(1,I))
C
C     SET UP TO DO STATISTICS
      DO 4 I=1,NCD
      N(I)=0
      DO 5 J=1,6
      SX(J,I)=0.
      SXX(J,I)=0.
      K1=J+1
      IF(J.EQ.6)GO TO 5
      DO 6 K=K1,6
      K2=(K-1)*(K-2)/2+J
 6    SXY(K2,I)=0.
 5    CONTINUE
 4    CONTINUE
C
C     SHOULD HAVE AT LEAST ONE DEPENDENT VARIABLE
      IF(NVOUT.GT.0)GO TO 7
      WRITE(ODEV1,1001)
      OK=.FALSE.
      RETURN 1
C
C     DETERMINE OUTPUT FORMAT
 7    IF(NCD.GT.1 .AND. NVOUT.LE.1)GO TO 10
      IF(NCD.GT.1 .AND. NVOUT.GT.1)GO TO 11
      IF(NVOUT.GT.1)GO TO 12
C
C     NO. OF CONDITIONS = 1, NO. OF VARIABLES OUTPUT = 1
      ASSIGN 110 TO IX1
      ASSIGN 502 TO IX2
      NCOND1=1
      OPTR=1
      WRITE(SINK,1002)(OVN(I,1),I=1,8)
      RETURN
C
C     NO. OF CONDITIONS > 1, NO. OF VARIABLES OUT = 1
 10   ASSIGN 210 TO IX1
      ASSIGN 503 TO IX2
      OPTR=0
      WRITE(SINK,1003)(OVN(I,1),I=1,8),((CLABEL(J,K),J=1,2),
     1 K=1,NCD)
      RETURN
C
C     NO. OF CONDITIONS = 1, NO. OF VARIABLES OUT > 1
 12   ASSIGN 310 TO IX1
      ASSIGN 504 TO IX2
      NCOND1=1
      OPTR=0
      WRITE(SINK,1004)((OVN(I,J),I=1,8),J=1,NVOUT)
      RETURN
C
C     NO. OF CONDITIONS > 1, NO. OF VARIABLES OUTPUT > 1
 11   ASSIGN 410 TO IX1
      ASSIGN 503 TO IX2
      OPTR=0
      WRITE(SINK,1005)((OVN(I,J),I=1,8),J=1,NVOUT)
      RETURN
C
C------------------------------
C
C     ENTRY TO HAVE DATA PRINTED
      ENTRY FPOUT2(SUBJ,NCOND,VPRNT2,VALUES,*)
      IF(.NOT.OK)RETURN
      TRUBL=.FALSE.
C
C     TEST FOR LEGALITY
      IF(NCOND.GT.0 .AND. NCOND.LE.NCD)GO TO 101
C     ERROR IN SUBROUTINE MODEL
      WRITE(ODEV1,1006)NCOND
      RETURN 1
C
C     BRANCH ON TYPE OF DESIGN
 101  GO TO IX1,(110,210,310,410)
C
C------------------------------
C
C     BETWEEN-SS DESIGN, ONE DEP. VAR.
 110  I=OVPTRS(1)
      IF(DATOUT)WRITE(ODEV2,9000)VALUES(I)
      OUTVEC(OPTR)=VALUES(I)
      OPTR=OPTR+1
      IF(OPTR.LE.5)GO TO 900
C
C     PRINT LINE
      WRITE(SINK,1007)(OUTVEC(J),J=1,5)
      OPTR=1
      GO TO 900
C
C------------------------------
C
C     WITHIN-SS DESIGN, ONE DEPENDENT VARIABLE
 210  IF(OPTR.EQ.0)ISUBJ=SUBJ
      NCOND1=NCOND
      IF(SUBJ.EQ.ISUBJ)GO TO 211
C
C     DID NOT GET ALL DATA FOR LAST SUBJECT
      WRITE(ODEV1,1008)ISUBJ,OPTR
      WRITE(ODEV1,1009)ISUBJ,(OUTVEC(J),J=1,OPTR)
      OPTR=0
      TRUBL=.TRUE.
      GO TO 210
C
 211  I=OVPTRS(1)
      OUTVEC(NCOND)=VALUES(I)
      OPTR=OPTR+1
      IF(OPTR.LT.NCD)GO TO 900
C
C     HAVE ALL VALUES FOR THIS SUBJECT--PRINT LINE
      WRITE(SINK,1009)SUBJ,(OUTVEC(J),J=1,NCD)
      IF(DATOUT)WRITE(ODEV2,9000)(OUTVEC(J),J=1,NCD)
      OPTR=0
      GO TO 900
C
C------------------------------
C
C     HAVE BETWEEN-SS DESIGN, SEVERAL VARIABLES
 310  DO 311 I=1,NVOUT
      J=OVPTRS(I)
 311  OUTVEC(I)=VALUES(J)
      WRITE(SINK,1009)SUBJ,(OUTVEC(J),J=1,NVOUT)
      IF(DATOUT)WRITE(ODEV2,9000)(OUTVEC(J),J=1,NVOUT)
      GO TO 900
C
C------------------------------
C
C     WITHIN-SS DESIGN, SEVERAL VARIABLES
 410  DO 411 I=1,NVOUT
      J=OVPTRS(I)
      OUTVEC(I)=VALUES(J)
      IF(.NOT.VPRNT2(J))OUTVEC(I)=-0.
 411  CONTINUE
      NCOND1=NCOND
      WRITE(SINK,1011)SUBJ,CLABEL(1,NCOND),CLABEL(2,NCOND),(OUTVEC(J),
     1 J=1,NVOUT)
      IF(DATOUT)WRITE(ODEV2,9001)NCOND,(OUTVEC(J),J=1,NVOUT)
      GO TO 900
C
C------------------------------
C
C     STATISTICS-GATHERING SECTION
 900  DO 901 I=1,NOV
      IF(.NOT.VPRNT2(I))GO TO 901
      IF(VALUES(I).EQ.DMISS(I))GO TO 910
 901  CONTINUE
      N(NCOND1)=N(NCOND1)+1
      DO 902 I=1,NOV
      IF(.NOT.VPRNT2(I))GO TO 902
      V=VALUES(I)
      SX(I,NCOND1)=SX(I,NCOND1)+V
      SXX(I,NCOND1)=SXX(I,NCOND1)+V*V
      IF(I.EQ.NOV)GO TO 902
      J=I+1
      DO 903 K=J,NOV
      IF(.NOT.VPRNT2(K))GO TO 903
      K1=(K-1)*(K-2)/2+I
      SXY(K1,NCOND1)=SXY(K1,NCOND1)+V*VALUES(K)
 903  CONTINUE
 902  CONTINUE
C
 910  IF(TRUBL)RETURN 1
      RETURN
C
C------------------------------
C
C     ENTRY TO FINISH OUTPUT AND PRINT STATISTICS
      ENTRY FPOUT3(COST)
      IF(.NOT.OK)RETURN
      GO TO IX2,(502,503,504)
C
C     FINISH PRINTING LINE OF VALUES IF NECESSARY
 502  OPTR=OPTR-1
      IF(OPTR.GT.0)WRITE(SINK,1007)(OUTVEC(J),J=1,OPTR)
      GO TO 503
C
C     MAKE SURE ALL DATA IN FOR LAST SUBJECT
 504  IF(OPTR.EQ.0)GO TO 503
      WRITE(ODEV1,1008)ISUBJ,OPTR
      WRITE(ODEV1,1009)ISUBJ,(OUTVEC(J),J=1,OPTR)
C
C     SEE IF ANY STATISTICS NEED TO BE PRINTED
 503  IF(.NOT.(MEAN.OR.SS.OR.VAR.OR.COV.OR.CORR))GO TO 550
C
C     PRINT STATISTICS CONDITION BY CONDITION
      DO 510 IC=1,NCD
      WRITE(SINK,1502)
      IF(NCD.GT.1)WRITE(SINK,1503)CLABEL(1,IC),CLABEL(2,IC),IC
      WRITE(SINK,1501)N(IC)
      IF(N(IC).LE.1)GO TO 510
      XN=N(IC)
      XN1=1./(XN-1.)
C
C     ARE ANY INDIVIDUAL VARIABLE STATISTICS TO BE PRINTED?
      IF(.NOT.(MEAN.OR.SS.OR.VAR))GO TO 511
      DO 512 I=1,NOV
      IF(.NOT.VPRNT1(I))GO TO 512
C     PRINT VARIABLE NAME
      WRITE(SINK,1504)(OVNAM(K,I),K=1,8)
      XBAR=SX(I,IC)/XN
      V=(SXX(I,IC)-XBAR*SX(I,IC))*XN1
      SD=SQRT(V)
      IF(MEAN)WRITE(SINK,1505)XBAR
      IF(VAR)WRITE(SINK,1506)V,SD
      IF(SS)WRITE(SINK,1507)SXX(I,IC)
 512  CONTINUE
C
C     PRINT CORRELATION STATISTICS AS APPROPRIATE
 511  IF(.NOT.(COV.OR.CORR) .OR. XN.LT.3. .OR. NVOUT.LE.1)GO TO 510
      I1=NOV-1
      DO 515 I=1,I1
      IF(.NOT.VPRNT1(I))GO TO 515
      XBAR=SX(I,IC)/XN
      SD=(SXX(I,IC)-XBAR*SX(I,IC))*XN1
      SD=SQRT(SD)
      J1=I+1
      DO 516 J=J1,NOV
      IF(.NOT.VPRNT1(J))GO TO 516
      WRITE(SINK,1502)
      K1=(J-1)*(J-2)/2+I
      CV=(SXY(K1,IC)-XBAR*SX(J,IC))*XN1
      IF(COV)WRITE(SINK,1509)(OVNAM(K,I),K=1,8),(OVNAM(K1,J),K1=
     1 1,8),CV
      SD2=(SXX(J,IC)-SX(J,IC)*SX(J,IC)/XN)*XN1
      SD2=SQRT(SD2)*SD
      R=0.
      IF(SD2.GT.10.0E-10)R=CV/SD2
      IF(CORR)WRITE(SINK,1510)(OVNAM(K,I),K=1,8),(OVNAM(K1,J),K1=
     1	1,8),R
 516  CONTINUE
 515  CONTINUE
 510  CONTINUE
C
C     QUIT
 550  IF(COSTPT)WRITE(SINK,1512)COST
      RETURN
C
C-----------------------------
C
 1001 FORMAT(1H0,'NO DEPENDENT VARIABLE?')
 1002 FORMAT(1H0,4X,8A1,' SCORES')
 1003 FORMAT(1H0,10X,8A1,' SCORES'/1X,'SUBJ  COND:',2X,6(2A1,8X)/
     1 15X,6(2A1,8X)/15X,6(2A1,8X))
 1004 FORMAT(1H0,'SUBJ',4X,6(2X,8A1))
 1005 FORMAT(1H0,'SUBJ COND',6(2X,8A1))
 1006 FORMAT(1H0,'BAD CALL TO FPOUT2; NCOND=',I4)
 1007 FORMAT(10X,5G10.3)
 1008 FORMAT(1H0,'DATA INCOMPLETE FOR SUBJ',I4,' # VALUES=',I3)
 1009 FORMAT(1X,I4,5X,6G10.3,(/11X,6G10.3))
 1011 FORMAT(1X,I4,3X,2A1,1X,6G10.3)
C
 1501 FORMAT(5X,'NO. OF SS WITH COMPLETE DATA:',I5)
 1502 FORMAT('	')
 1503 FORMAT(5X,'CONDITION ',2A1,' (',I2,')')
 1504 FORMAT(1H0,4X,'VARIABLE: ',8A1)
 1505 FORMAT(5X,'MEAN: ',G10.4)
 1506 FORMAT(5X,'VARIANCE: ',G10.4/5X,'STD. DEVIATION: ',G10.4)
 1507 FORMAT(5X,'SUM OF SQUARED OBSERVATIONS: ',G15.6)
 1509 FORMAT(5X,'COVARIANCE  OF ',8A1,' AND ',8A1,' IS: ',G12.4)
 1510 FORMAT(5X,'CORRELATION OF ',8A1,' AND ',8A1,' IS:',F8.4)
 1512 FORMAT(1H0,4X,'COST: ',G12.4)
 9000 FORMAT(8G10.3)
C     FMT 9001 IS NECESSITATED BY INCOMPETENT IMPLEMENTATION OF
C     G FORMATS IN IBM FORTRAN IV.
 9001 FORMAT(I10,7G10.3/(8G10.3))
C
      END
      SUBROUTINE URAND(X)
C
C     SUBROUTINE TO GENERATE PSEUDO-RANDOM NUMBERS UNIFORMLY DISTRI-
C     BUTED OVER THE INTERVAL (0,1)
C
      X=RAN(DUMMY)
      RETURN
      END
      SUBROUTINE NRAND(MEAN,SIGMA,X)
C
C     SUBROUTINE TO GENERATE PSEUDO-RANDOM NUMBERS WITH AN APPROXIMATE
C     NORMAL DISTRIBUTION WITH LOCATION PARAMETER MEAN AND STANDARD DEVIA-
C     TION SIGMA.  VALUE GENERATED IS RETURNED IN X.
C     REQUIRES SUBROUTINE URAND.
C
      REAL MEAN
C
C
      X=0.
      DO 1 I=1,12
      CALL URAND(Y)
 1    X=X+Y
      X=X-6.
      X=X*SIGMA
      X=X+MEAN
      RETURN
      END
      SUBROUTINE URAND1(XL1,XL2,X)
C
C     SUBROUTINE TO GENERATE PSEUDO-RANDOM NUMBERS DISTRIBUTED UNIFORMLY
C     OVER THE INTERVAL (XL1,XL2).  XL1 AND XL2 DO NOT HAVE TO BE
C     PROPERLY ORDERED.
C     REQUIRES SUBROUTINE URAND.
C
C
      X1=AMIN1(XL1,XL2)
      DIFF=XL2-XL1
      DIFF=ABS(DIFF)
      CALL URAND(X)
      X=DIFF*X
      X=X+X1
      RETURN
      END
      SUBROUTINE URAND2(L1,L2,IX)
C
C     SUBROUTINE TO GENERATE PSEUDO-RANDOM INTEGERS DISTRIBUTED
C     UNIFORMLY OVER THE INTERVAL (L1,L2).  L1 AND L2 DO NOT HAVE
C     TO BE PROPERLY ORDERED.
C     REQUIRES SUBROUTINES URAND1 AND URAND.
C
C
      L=MIN0(L1,L2)
      IDIFF=L2-L1
      IDIFF=IABS(IDIFF)
      DIFF=IDIFF+1
      CALL URAND1(0.,DIFF,X)
      IX=X
      IF(IX.GE.(IDIFF+1))IX=IDIFF
      IX=L+IX
      RETURN
      END
      SUBROUTINE BINOM(N,P,IX)
C
C     SUBROUTINE TO GENERATE BINOMIAL RANDOM VARIABLES
C     VALUES ARE RETURNED IN IX.
C     NORMAL APPROXIMATION USED IF N*P>15
C     POISSON APPROXIMATION USED IF P<.1 AND N>25
C     OTHERWISE, NUMBERS GENERATED BY N DRAWS
C     REQUIRES SUBROUTINE URAND
C
C
      IX=0
      IF(N.EQ.0 .OR. P.EQ.0.)RETURN
      IF(N.LT.0 .OR. P.LT.-0.00001 .OR. P.GT.1.00001)STOP '3901'
C
      P1=1.-P
      P2=AMIN1(P,P1)
      XN=N
      IF((P2*XN).GT.15.)GO TO 1
      IF(P2.LT.0.1 .AND. N.GT.25)GO TO 3
C
C     USE REAL LIVE BINOMIAL PROCESS TO GENERATE NUMBERS
      DO 2 I=1,N
      CALL URAND(X)
      IF(X.LE.P)IX=IX+1
 2    CONTINUE
      RETURN
C
C     USE NORMAL APPROXIMATION
 1    XM=P*XN
      S=P*P1*XN
      S=SQRT(S)
      CALL NRAND(XM,S,X)
      X=X+.5
      IX=X
      IF(IX.LT.0)IX=0
      IF(IX.GT.N)IX=N
      RETURN
C
C     USE POISSON APPROXIMATION
 3    XM=P2*XN
      CALL POISSN(XM,IX)
      IF(IX.GT.N)IX=N
      IF(P.EQ.P2)RETURN
      IX=N-IX
      RETURN
      END
      SUBROUTINE POISSN(LAMBDA,IX)
C
C     SUBROUTINE TO GENERATE RANDOM INTEGER NUMBERS WITH A POISSON
C     DISTRIBUTION WITH INTENSITY PARAMETER LAMBDA
C     REQUIRES SUBROUTINES URAND AND NRAND
C     NORMAL APPROXIMATION IS USED FOR LAMBDA>16
C
C
      REAL*4 LAMBDA
C
C     TAKE CARE OF PROGRAMMING ERRORS, EXTREME CASES
      IF(LAMBDA.LT.0.)STOP '3903'
      IX=0
      IF(LAMBDA.LT.1.0E-8)RETURN
C
      IF(LAMBDA.GT.16.)GO TO 1
C
C     DO IT THE HARD WAY
      CALL URAND(UNIFRV)
      P=EXP(-LAMBDA)
      CUMP=P
      X=0.
      DO 2 I=1,100
      X=X+1.
      IF(UNIFRV.LE.CUMP)GO TO 3
      P=P*LAMBDA/X
 2    CUMP=CUMP+P
C
C     IF WE EVER FINISH THE DO LOOP, THERE IS PROBABLY SOMETHING WRONG
C
 3    IX=I-1
      RETURN
C
C     USE NORMAL APPROXIMATION
 1    P=SQRT(LAMBDA)
      CALL NRAND(LAMBDA,P,X)
      IX=X+.5
      IF(IX.LT.0)IX=0
      RETURN
      END
      SUBROUTINE MULNOM(PTABLE,N1,N2,N3,N4,IV1,IV2,IV3,IV4)
C
C     SUBROUTINE TO GENERATE PSEUDO-RANDOM NUMBERS WITH A MULTIVARIATE
C     MULTINOMIAL DISTRIBUTION SPECIFIED BY A TABLE OF PROBABILITIES.
C     1-4 VARIABLES MAY BE GENERATED.  REQUIRES SUBROUTINE URAND.
C
C
C     ARGUMENTS:
C     PTABLE  REAL*4  DIMENSIONS (N1,N2,N3,N4)
C     TABLE OF PROBABILITIES.  PTABLE(I,J,K,L) SHOULD CONTAIN THE PROB-
C     ABILITY THAT VARIABLE 1 = I, VARIABLE 2 = J, ETC.
C
C     N1, N2, N3, N4  INTEGER*4
C     DIMENSIONS OF PTABLE.  FOR TABLES OF M DIMENSIONS (M<4), USE N1
C     THRU NM AND SET N(M+1) THRU N4 TO 1.
C
C     IV1, IV2, IV3, IV4  INTEGER*4
C     THE VALUES GENERATED ARE RETURNED IN THESE LOCATIONS.
C
C
C     ERROR HALTS:
C     STOP 3904  ONE OF N1-N4 IS LESS THAN 1
C     STOP 3905  A VALUE IN PTABLE IS LESS THAN -.000001 OR GREATER
C		 THAN 1.000001
C     STOP 3906  THE VALUES IN PTABLE SUM TO LESS THAN .999--THIS COND-
C		 ITION IS NOT NECESSARILY DISCOVERED ON THE FIRST CALL
C		 TO MULNOM
C
C------------------------------
C
      REAL*4 PTABLE(N1,N2,N3,N4)
C
C     ERROR TESTING
      IF(N1.LT.1 .OR. N2.LT.1 .OR. N3.LT.1 .OR. N4.LT.1)STOP '3904'
C
      CALL URAND(X)
      P=0.
      DO 1 IV4=1,N4
      DO 1 IV3=1,N3
      DO 1 IV2=1,N2
      DO 1 IV1=1,N1
      P1=PTABLE(IV1,IV2,IV3,IV4)
      IF(P1.LT.-0.000001 .OR. P1.GT.1.000001)STOP '3905'
      P=P+P1
      IF(X.LE.P) RETURN
 1    CONTINUE
      IF(P.LT.0.999)STOP '3906'
      RETURN
      END
      SUBROUTINE CMULNM(PTABLE,N1,N2,N3,N4,IV1,IV2,IV3,IV4)
C
C     SUBROUTINE TO GENERATE PSEUDO-RANDOM NUMBERS WITH A COND-
C     ITIONAL MULTIVARIATE MULTINOMIAL DISTRIBUTION AS SPECIFIED BY A
C     TABLE OF PROBABILITIES.  CAN HANDLE UP TO 4 VARIABLES; VALUES
C     RETURNED MAY BE CONDITIONED ON ANY COMBINATION OF 0 TO 4 OF THE
C     VARIABLES.  REQUIRES SUBROUTINE URAND.
C
C
C     ARGUMENTS:
C     PTABLE  REAL*4  DIMENSIONS (N1,N2,N3,N4)
C     TABLE OF PROBABILITIES.  PTABLE(I,J,K,L) SHOULD CONTAIN THE
C     PROBABILITY THAT VARIABLE 1 = I, VARIABLE 2 = J, ETC.
C
C     N1, N2, N3, N4  INTEGER*4
C     DIMENSIONS OF PTABLE.  FOR TABLES OF M DIMENSIONS (M<4) USE N1
C     THRU NM AND SET N(M+1) THRU N4 TO 1.
C
C     IV1, IV2, IV3, IV4  INTEGER*4
C     VALUES GENERATED ARE RETURNED IN THESE LOCATIONS.  THE VALUES IN
C     IV1-IV4 AT THE TIME CMULNM IS CALLED INDICATE WHICH VARIABLES
C     ARE TO BE ASSIGNED VALUES BY THE PROGRAM AND WHICH ARE TO COND-
C     ITION THE SELECTION OF THE OTHERS.  IF IVJ IS GREATER THAN 0,
C     ITS VALUE IS USED TO CONDITION THE SELECTION OF THE VARIABLES
C     WHOSE VALUES ARE 0 OR LESS.
C
C
C     ERROR HALTS:
C     STOP 3907  ONE OF N1-N4 IS LESS THAN 1
C     STOP 3908  A VALUE IN PTABLE IS LESS THAN -0.000001 OR GREATER
C		 THAN 1.000001
C     STOP 3909  THE VALUES IN PTABLE SUM TO MORE THAN 1.001--THIS
C		 CONDITION IS NOT NECESSARILY DISCOVERED ON THE FIRST
C		 CALL TO CMULNM
C     STOP 3910  THE PROBABILITIES IN ONE HYPERPLANE OF PTABLE SUM TO
C		 LESS THAN 10**-20.  THIS CONDITION IS NOT NECESSARILY
C		 DISCOVERED ON THE FIRST CALL
C
C--------------------------
      REAL*4 PTABLE(N1,N2,N3,N4)
C
C     ERROR TESTING
      IF(N1.LT.1 .OR. N2.LT.1 .OR. N3.LT.1 .OR. N4.LT.1)STOP '3907'
C
      IF(IV1.GT.0 .AND. IV2.GT.0 .AND. IV3.GT.0 .AND. IV4.GT.0)RETURN
C
C     COMPUTE MULTIPLIER FACTOR
      I1A=1
      I1B=N1
      IF(IV1.LT.1)GO TO 1
      I1A=IV1
      I1B=IV1
 1    I2A=1
      I2B=N2
      IF(IV2.LT.1)GO TO 2
      I2A=IV2
      I2B=IV2
 2    I3A=1
      I3B=N3
      IF(IV3.LT.1)GO TO 3
      I3A=IV3
      I3B=IV3
 3    I4A=1
      I4B=N4
      IF(IV4.LT.1)GO TO 4
      I4A=IV4
      I4B=IV4
C
 4    PT=0.
      DO 5 L=I4A,I4B
      DO 5 K=I3A,I3B
      DO 5 J=I2A,I2B
      DO 5 I=I1A,I1B
      P1=PTABLE(I,J,K,L)
      IF(P1.LT.-0.000001 .OR. P1.GT.1.000001)STOP '3908'
      PT=PT+P1
 5    CONTINUE
      IF(PT.GT.1.001)STOP '3909'
      IF(PT.LT.10.0E-20)STOP '3910'
      PT=1./PT
C
C     SELECT VALUES FOR THE UNSPECIFIED VARIABLES
      CALL URAND(X)
      P=0.
      DO 6 IV4=I4A,I4B
      DO 6 IV3=I3A,I3B
      DO 6 IV2=I2A,I2B
      DO 6 IV1=I1A,I1B
      P=P+PT*PTABLE(IV1,IV2,IV3,IV4)
      IF(X.LE.P)RETURN
 6    CONTINUE
      RETURN
      END
      SUBROUTINE REXP(BETA,VALUE)
C     SUBROUTINE TO GENERATE RANDOM NUMBERS WITH AN EXPONENTIAL DIST-
C     RIBUTION WITH SCALE PARAMETER BETA.  FOR STANDARD EXPONENTIALS,
C     SET BETA=1.  IF BETA IS LESS THAN -.00001, AN ERROR HALT
C     (STOP 3620) OCCURS.  THE RANDOM NUMBER GENERATED IS RETURNED
C     IN VALUE.
C
C
C
C
      IF(BETA .LT. -.00001)STOP 3620
      IF(BETA .LT. 0.)BETA=0.
C
C     EXPONENTIALS ARE EASY
      CALL URAND(X)
      VALUE=-BETA*ALOG(X)
      RETURN
      END
C     SUBROUTINE TO GENERATE PSEUDO-RANDOM NUMBERS HAVING A
C     DOUBLE EXPONENTIAL DISTRIBUTION WITH LOCATION PARAMETER
C     ALPHA AND SCALE PARAMETER BETA.  IF BETA < -0.00001 AN
C     ERROR HALT (STOP 3617) OCCURS.  THE RANDOM NUMBER GEN-
C     ERATED IS RETURNED IN VALUE.
C
C------------------------------
C
      SUBROUTINE RDEXP(ALPHA, BETA, VALUE)
C
C
      IF(BETA .LT. -0.00001)STOP 3617
C
      CALL URAND(X)
      VALUE=-BETA*ALOG(X)
      CALL URAND(X)
      IF(X .GT. 0.5)VALUE=-VALUE
      VALUE=VALUE+ALPHA
      RETURN
      END
      SUBROUTINE RGAMMA(IALPHA, BETA, VALUE)
C     SUBROUTINE TO GENERATE PSEUDO-RANDOM NUMBERS HAVING A
C     GAMMA DISTRIBUTION WITH SHAPE PARAMETER IALPHA AND SCALE
C     PARAMETER BETA.  THE RANDOM NUMBER GENERATED IS RETURNED
C     IN VALUE.  IF IALPHA IS LESS THAN OR EQUAL TO ZERO, AN
C     ERROR HALT (STOP 3621) OCCURS.  IF BETA IS LESS THAN -.00001
C     A STOP 3622 OCCURS.
C
C     NOTE: FOR IALPHA < 31 THE GENERATION PROCESS INVOLVES
C     GENERATING UP TO 30 RANDOM EXPONENTIALS, SO FOR 5<IALPHA<31
C     THIS ALGORITHM IS RATHER SLOW, ALTHOUGH QUITE ACCURATE.
C     FOR IALPHA GREATER THAN OR EQUAL TO 31, A NORMAL APPROXI-
C     MATION IS USED WHICH IS FAST BUT DOES NOT HAVE TAILS OF
C     THE PROPER SHAPE, SO IF THE SHAPE OF THE TAILS IS CRITICAL
C     THIS ALGORITHM SHOULD NOT BE USED FOR IALPHA GREATER THAN
C     OR EQUAL TO 31.
C
C
      INTEGER IALPHA
      REAL  BETA, GAMMA
      REAL*8 C1, E1, PI
	GAMMA=GAMMA!DEC-10 BUG REQUIRES THIS
	E1=E1!DITTO
	C1=C1!DEC-10 BUG
	PI=PI!DITTO
C
C     TRAP ERRORS
      IF(IALPHA .LE. 0)STOP 3621
      IF(BETA .LT. -.00001)STOP 3622
      IF(BETA .LT. 0.)BETA=0.
C
      IF(IALPHA .GE. 31)GO TO 20
C
C     GENERATE VALUE BY SUM OF EXPONENTIALS
      VALUE=0.
C
C     ADD APPROPRIATE NO. OF STANDARD RANDOM EXPONENTIALS
      DO 10 J=1,IALPHA
      CALL URAND(X)
      X=-ALOG(X)
 10   VALUE=VALUE+X
      VALUE=VALUE*BETA
      RETURN
C
C     USE APPROXIMATION FOR LARGE VALUES OF SHAPE PARAMETER
 20   X1=IALPHA
      X1=X1*BETA
      X2=X1*BETA
      X2=SQRT(X2)
 21   CALL NRAND(X1, X2, VALUE)
      IF(VALUE .LE. 0.)GO TO 21
      RETURN
      END
      SUBROUTINE PLFN(TABLE,N,XIN,YOUT)
C     SUBROUTINE TO CALCULATE A PIECEWISE LINEAR FUNCTION OF A
C     CONTINUOUS-VALUED VARIABLE.
C
C     ARGUMENTS:
C
C     TABLE  REAL*4
C     THE DIMENSIONS OF TABLE MUST BE (N,2), WHERE N IS THE NUMBER OF
C     GRID POINTS.  XIN IS COMPARED AGAINST THE VALUES IN TABLE(1-N,1)
C     AND THE VALUE OF YOUT IS CALCULATED BY LINEAR INTERPOLATION
C     USING THE APPROPRIATE VALUES IN TABLE(1-N,2).  NOTE: NUMBERS
C     IN THE UPPER HALF OF TABLE (TABLE(1-N,1)) MUST INCREASE FROM
C     LEFT TO RIGHT; THAT IS, TABLE(1,1) MUST BE LESS THAN TABLE(2,1)
C     AND SO ON.  THERE IS, OF COURSE, NO SUCH RESTRICTION ON THE
C     NUMBERS IN THE LOWER HALF OF TABLE (TABLE(1-N,2)).  THE VALUES
C     IN THE UPPER HALF OF TABLE DO NOT HAVE TO BE EQUALLY SPACED.
C
C     N  INTEGER*4
C     FIRST DIMENSION OF TABLE; SEE ABOVE.  IF N IS LESS THAN 2
C     AN ERROR HALT (STOP 3701) OCCURS.
C
C     XIN  REAL*4
C     X-VALUE FOR WHICH A CORRESPONDING Y-VALUE IS TO BE CALCULATED.
C     VALUES OF XIN WHICH ARE LESS THAN THE VALUE IN TABLE(1,1) ARE
C     TREATED AS THOUGH THEY WERE EQUAL TO TABLE(1,1); SIMILARLY,
C     VALUES OF XIN WHICH ARE GREATER THAN THE VALUE IN TABLE(N,1)
C     ARE TREATED AS THOUGH THEY WERE EQUAL TO TABLE(N,1).  THIS
C     MEANS THAT THE Y-VALUES IN THE ENDS OF THE TABLE ARE TREATED
C     BY THE PROGRAM AS ASYMPTOTIC VALUES OF THE FUNCTION.
C
C     YOUT  REAL*4
C     CONTAINS ON RETURN THE ESTIMATED VALUE OF THE FUNCTION, THE
C     RESULT OF THE CALCULATION.
C
C
      REAL TABLE(N,2)
C
C
      IF(N.LE.1)STOP 3701
      X=XIN
      IF(X.LT.TABLE(1,1))X=TABLE(1,1)
C
      DO 1 I=2,N
      IF(X.LE.TABLE(I,1))GO TO 2
 1    CONTINUE
      X=TABLE(N,1)
 2    D=(X-TABLE(I-1,1))/(TABLE(I,1)-TABLE(I-1,1))
      YOUT=D*(TABLE(I,2)-TABLE(I-1,2))+TABLE(I-1,2)
      RETURN
      END
      SUBROUTINE INTPOL(TABLE,N1,N2,N3,N4,X1,X2,X3,X4,VALUE)
C     SUBROUTINE TO PERFORM LINEAR INTERPOLATION IN TABLES OF UP
C     TO 4 DIMENSIONS.
C
C     ARGUMENTS:
C
C     TABLE  REAL*4
C     TABLE IN WHICH INTERPOLATING IS TO BE DONE.  TABLE MUST BE DIM-
C     ENSIONED (N1,N2,N3,N4).
C
C     N1,N2,N3,N4  INTEGER*4
C     DIMENSIONS OF TABLE.  IF ANY OF N1-4 IS LESS THAN 1 OR GREATER
C     THAN 10000 AN ERROR MESSAGE WILL BE PRINTED AND THE PROGRAM WILL
C     HALT (STOP 3700).
C
C     X1,X2,X3,X4  REAL*4
C     X1-4 ARE THE SUBSCRIPT VALUES TO BE USED IN CALCULATING A
C     VALUE FROM THE TABLE.  *****ALWAYS REMEMBER THAT X1-4 ARE
C     REAL NUMBERS, NOT INTEGERS*****  IF ANY OF X1-4 EXCEEDS
C     100,000 IN ABSOLUTE VALUE, AN ERROR MESSAGE WILL BE PRINTED
C     AND THE PROGRAM WILL HALT (STOP 3700).  OTHERWISE, HOWEVER,
C     AN X-VALUE LESS THAN 1 IS TREATED AS BEING EQUAL TO 1, AND
C     A VALUE FOR ANY XJ WHICH IS GREATER THAN THE CORRESPONDING
C     NJ IS TREATED AS EQUAL TO NJ.  THUS, THE VALUES IN THE
C     EXTREME PARTS OF THE TABLE ARE TREATED AS ASYMPTOTIC VALUES.
C
C     VALUE  REAL*4
C     THE NUMBER CALCULATED BY INTERPOLATION IS RETURNED IN VALUE.
C
C------------------------------
C
      REAL TABLE(N1,N2,N3,N4), Y(4), T(2,2,2)
      INTEGER M(4), L(4,2), ODEV1
      LOGICAL*4 GIVEUP
      COMMON /IO/IDEV(4),ODEV1
C
C------------------------------
C
C     ISN'T FORTRAN AWFUL?
      M(1)=N1
      M(2)=N2
      M(3)=N3
      M(4)=N4
      Y(1)=X1
      Y(2)=X2
      Y(3)=X3
      Y(4)=X4
C
C     ERROR CHECKING + OTHER TASKS
      GIVEUP=.FALSE.
      DO 1 I=1,4
      IF(M(I).GT.0 .AND. M(I).LE.10000)GO TO 2
C
C     INVALID DIMENSION
      WRITE(ODEV1,1001)I,M(I)
      GIVEUP=.TRUE.
C
 2    IF(ABS(Y(I)).LE.100000.)GO TO 3
C
C     INVALID SUBSCRIPT
      WRITE(ODEV1,1002)I,Y(I)
      GIVEUP=.TRUE.
      GO TO 1
C
C     TRUNCATION, ETC.
 3    IF(Y(I).LT.1.)Y(I)=1.
      Z=M(I)
      IF(Y(I).GT.Z)Y(I)=Z
      L(I,1)=Y(I)+0.000001
      L(I,2)=L(I,1)+1
      IF(L(I,2).GT.M(I))L(I,2)=M(I)
 1    CONTINUE
      IF(GIVEUP)STOP 3700
C
C------------------------------
C
C     COLLAPSE TABLE STARTING WITH 4RTH DIMENSION
      D=L(4,1)
      D=Y(4)-D
      L1=L(4,1)
      L2=L(4,2)
      DO 14 K=1,2
      K1=L(3,K)
      DO 14 J=1,2
      J1=L(2,J)
      DO 14 I=1,2
      I1=L(1,I)
 14   T(I,J,K)=D*(TABLE(I1,J1,K1,L2)-TABLE(I1,J1,K1,L1))
     1	+TABLE(I1,J1,K1,L1)
C     AREN'T YOU GLAD THAT'S OVER?
C
C     3RD DIMENSION
      D=L(3,1)
      D=Y(3)-D
      DO 13 I=1,2
      DO 13 J=1,2
 13   T(I,J,1)=D*(T(I,J,2)-T(I,J,1))+T(I,J,1)
C
C     2ND DIMENSION
      D=L(2,1)
      D=Y(2)-D
      DO 12 I=1,2
 12   T(I,1,1)=D*(T(I,2,1)-T(I,1,1))+T(I,1,1)
C
C     AND THE FIRST DIMENSION SHALL BE THE LAST
      D=L(1,1)
      D=Y(1)-D
      VALUE=D*(T(2,1,1)-T(1,1,1))+T(1,1,1)
      RETURN
C
C
 1001 FORMAT(1H0,'INTPOL ERROR--INVALID DIMENSION (',I1,'): ',I8)
 1002 FORMAT(1H0,'INTPOL ERROR--INVALID SUBSCRIPT FOR DIM. ',
     1	I1,': ',G15.6)
      END
      SUBROUTINE CHANCE(P, *)
C     SUBROUTINE TO SELECT ONE OF TWO ALTERNATIVE PATHS PROB-
C     ABILISTICALLY
C
C     P IS THE PROBABILITY THAT THE PROGRAM SHOULD BRANCH TO THE
C     STATEMENT SPECIFIED BY THE STATEMENT NUMBER IN THE CALLING
C     SEQUENCE; WITH PROBABILITY 1-P THE PROGRAM WILL EXECUTE THE
C     STATEMENT FOLLOWING THE CALL.  FOR EXAMPLE, THE CODE BELOW
C     WOULD CAUSE THE PROGRAM TO BRANCH TO THE STATEMENT LABELED
C     100 WITH PROBABILITY .8, AND WOULD PROCEED INSTEAD TO
C     STATEMENT 200 AFTER THE CALL WITH PROBABILITY .2.
C
C	   CALL CHANCE(.8, &100)
C      200 . . .
C	   . . .
C      100 . . .
C
C
C     IF P IS OUTSIDE THE RANGE (-.00001, 1.00001) AN ERROR HALT
C     (STOP 3603) WILL OCCUR.
C
C------------------------------
C
C
      IF(P .LT. -.00001 .OR. P .GT. 1.00001)STOP 3603
      CALL URAND(X)
      IF(X .LE. P)RETURN 1
      RETURN
      END
      SUBROUTINE ROUND(X, UNIT)
C     SUBROUTINE TO ROUND FLOATING POINT NUMBERS TO ANY SPECIFIED
C     DEGREE OF PRECISION.  THE NUMBER TO BE ROUNDED SHOULD BE IN X,
C     AND THE MAGNITUDE OF THE UNIT TO BE USED IN ROUNDING X SHOULD
C     BE IN UNIT.  THUS, IF YOU WANT X TO VARY IN STEPS OF .25, SET
C     UNIT=.25; FOR STEPS OF 25, SET UNIT=25., AND SO ON.  THE
C     ROUNDED NUMBER IS RETURNED IN X.	IF UNIT IS LESS THAN OR EQUAL
C     TO 10**-20, AN ERROR HALT (STOP 3704) WILL OCCUR.
C
C
      REAL X, UNIT
C
C     PREVENT FLOATING POINT OVERFLOWS, DIVIDING BY 0, ETC.
      IF(UNIT .LE. 1.E-20)STOP 3704
      Y=X/UNIT+.5
      Y=AINT(Y)
      X=Y*UNIT
      RETURN
      END
      SUBROUTINE STETTR(DFN,DX,DY,DXN,DH)
C     STETTR
C
C     NUMERICAL INTEGRATION SUBROUTINE FOR THE SOLUTION OF
C     Y'=DFN(DX,DY) USING A TWO STEP ALGORITHM DUE TO HANS J. STETTER.
C
C     THE ORDER FOUR RUNGE-KUTTA METHOD IS USED FOR OBTAINING INITIAL
C     VALUES.  THE STETTER ALGORITHM IS ALSO OF ORDER FOUR.  THE
C     PRINCIPAL ADVANTAGE OF THE STETTER ALGORITHM IS THAT IT IS
C     ROUGHLY TWICE AS FAST AS THE ORDER 4 RUNGE-KUTTA METHOD.
C
C     REFERENCE:
C	STETTER, H. J.	STABILIZING PREDICTORS FOR WEAKLY UNSTABLE
C	CORRECTORS.  MATHEMATICS OF COMPUTATION, 1965, VOL. 19,
C	84-89.
C
C
C     EXECUTION IS TERMINATED IF ERRORS IN THE CALLING PARAMETERS ARE
C     DETECTED.
C
C     ROBERT L. STOUT
C     DEPARTMENT OF PSYCHOLOGY
C     UNIVERSITY OF MICHIGAN
C     NOV. 25, 1968
C     MODIFIED MAY 23, 1973
C     MODIFIED SEPT. 23, 1973
C
C
C     ARGUMENTS (ALL IN DOUBLE PRECISION):
C	DFN  FUNCTION BEING INTEGRATED (MUST BE A DOUBLE PRECISION
C	     FUNCTION)
C	DX   X-VALUE FROM WHICH INTEGRATION IS TO START (CONTAINS
C	     X-VALUE AT WHICH INTEGRATION STOPPED ON RETURN)
C	DY   INITIAL VALUE OF THE INTEGRAL (CONTAINS THE FINAL
C	     VALUE OF THE INTEGRAL ON RETURN)
C	DXN  X-VALUE AT WHICH INTEGRATION IS TO STOP
C	DH   INTEGRATION STEPSIZE
C
C------------------------------
C
C
      IMPLICIT REAL*8(D)
      EXTERNAL DFN
C
C     CHECK LEGALITY
      IF(DH .LE. 0.D0 .OR. DXN .LE. DX)GO TO 1
C
C     INITIALIZATION
      DF0=DFN(DX,DY)
      DY0=DY
      DX1=DX+DH
      CALL RUNGK(DFN,DX,DY,DX1,DH)
      DF1=DFN(DX1,DY)
      DY1=DY
      DX=DX1
      D1=.5D0*DH
      D2=2.D0*DH
      D3=DH/3.0D0
C
C     MAIN INTEGRATION LOOP
 2    DX=DX+DH
C     ARE WE DONE?
      IF(DX.GE.(DXN+D1))GO TO 3
C     PROTECT THE CUSTOMER FROM POLES (NOT THE EAST EUROPEAN KIND)
      IF(DX.GT.DXN)DX=DXN
C
C     PREDICT
      DY2=-4.0D0*DY1+5.0D0*DY0+D2*(2.0D0*DF1+DF0)
C
C     CORRECT
      DF2=DFN(DX,DY2)
      DY2=DY0+D3*(DF2+4.0D0*DF1+DF0)
C
C     PUSH DOWN ARGUMENTS
      DY0=DY1
      DY1=DY2
      DF0=DF1
      DF1=DFN(DX,DY2)
      GO TO 2
C
C
C     DONE
 3    DY=DY1
      RETURN
C
C
C     ERROR CONDITION
 1    WRITE(6,1001)DH,DX,DY,DXN
      STOP 3703
C
C
 1001 FORMAT(1H0,9X,'ERROR CONDITION IN STETTR'/10X,'DH=',G15.8/10X,
     1'DX=',G15.8/10X,'DY=',G15.8/10X,'DXN=',G15.8)
      END
      SUBROUTINE RUNGK(DFN,DX,DY,DXN,DH)
C
C     FOURTH ORDER RUNGE-KUTTA INTEGRATION SUBROUTINE
C
C     DFN IS THE FUNCTION NAME, DX AND DY ITS ARGUMENTS.  ALL NAMES
C     BEGINNING WITH D ARE DOUBLE PRECISION NAMES.
C     DX AND DY MUST BE INITIALIZED BY THE CALLING PROGRAM.  DXN
C     MUST ALSO BE SET TO THE TERMINATING X VALUE, AND DH TO THE
C     STEPSIZE.
C
C     ROBERT L. STOUT
C     DEPARTMENT OF PSYCHOLOGY
C     UNIVERSITY OF MICHIGAN
C     NOVEMBER 25, 1968
C     REVISED MAY 23, 1973
C     REVISED SEPT. 23, 1973
C
C------------------------------
C
      IMPLICIT REAL*8(D)
C
C     CHECK LEGALITY
      IF(DH .LE. 0.0D0 .OR. DXN .LE. DX)GO TO 1
C
C     INITIALIZE
      DK1=DFN(DX,DY)
      DH2=.5D0*DH
      DZ=DH/6.0D0
C
C     INTEGRATE
 2    IF(DX.GE.(DXN+DH2))RETURN
      DA=DX+DH2
      DB=DY+DH2*DK1
      DK2=DFN(DA,DB)
      DB=DY+DH2*DK2
      DK3=DFN(DA,DB)
      DX=DX+DH
      DB=DY+DH*DK3
      DK4=DFN(DX,DB)
      DY=DY+DZ*(DK1+2.0D0*DK2+2.0D0*DK3+DK4)
      DK1=DFN(DX,DY)
      GO TO 2
C
C     BAD CALL
   1  WRITE(6,1001)DX,DY,DXN,DH
      STOP 3702
C
C
 1001 FORMAT(1H0,'BAD CALL TO RUNGK'/1X,'DX=',G15.8,2X,'DY=',G15.8,2X,
     1 'DXN=',G15.8,2X,'DH=',G15.8)
      END
      SUBROUTINE NEXT(LPTR,NAME,BC,NUM,FNUM,SFLAG,*,*,*)
C
C     SUBROUTINE TO GET NEXT INTERESTING THING FROM LINE STARTING
C     AT LPTR
C
C     A SEPARATE SUBROUTINE RETURN IS PROVIDED FOR EACH CLASS
C     OF INTERESTING THINGS:
C	RETURN 0  ALPHAMERIC NAME (1-8 CHARACTERS)
C	RETURN 1  NUMBER
C	RETURN 2  NON-BLANK BREAK CHARACTER
C	RETURN 3  END OF LINE
C
C     ARGUMENTS:
C	LPTR  INTEGER*4  POINTER TO THE NEXT CHARACTER TO BE
C			 PROCESSED BY NEXT.  POINTS TO CHARACTER
C			 AFTER THE LAST ONE PROCESSED BY NEXT
C			 ON RETURN.
C	NAME  INTEGER*4  8 CHARACTER VECTOR IN WHICH ALPHA-
C			 MERIC NAMES CAN BE RETURNED.
C	BC    INTEGER*4  CONTAINS BREAK CHARACTER AFTER RETURN 2.
C	NUM   INTEGER*4  CONTAINS ROUNDED INTEGER VALUE OF NUMBER
C			 AFTER RETURN 1.
C	FNUM  REAL*4	 CONTAINS FLOATING POINT VALUE FOR NUMBER
C			 AFTER RETURN 1.
C
C     ALPHAMERIC NAMES 9 OR MORE CHARACTERS LONG ARE TRUNCATED TO
C     8 CHARACTERS WITH A WARNING MESSAGE
C
C
      IMPLICIT INTEGER*4 (A-E)
      INTEGER*4 NAME(8), LINE, BLANK
      INTEGER*4 ODEV1, ODV
      LOGICAL*4 SFLAG
      COMMON /IO/IDEV(4), ODEV1, ODV(3), LINE(80)
      DATA BLANK/' '/
C
C     INITIALIZATION
      ISIGN=1
      NUM=0
      FNUM=0.
      LWP1=1
      LWP2=80
      BC=BLANK
C
      DO 1 I=1,8
 1    NAME(I)=BLANK
C
C     MAKE SURE LPTR IS REASONABLE
      IF(LPTR.LE.0)LPTR=1
C     CHECK FOR END-OF-LINE CONDITION
 2    IF(LPTR.GT.80)RETURN 3
C
C     SEARCH FOR START OF FIRST INTERESTING THING
      C=LINE(LPTR)
      LPTR=LPTR+1
      CALL CINT(C,ICT,IDV)
      IF(SFLAG .AND. ICT.EQ.7)ICT=1
      GO TO (3,4,2,6,6,6),ICT
C
C     HAVE A BREAK CHARACTER OF SOME SORT
 7    BC=C
      RETURN 2
C
C     HAVE '+', '-', OR '.' WHICH MAY BE BREAK CHARACTERS OR
C     START OF NUMBER
C     IF A NUMBER IS COMING IN, NEXT CHAR SHOULD BE DIGIT IF 1ST CHAR
C     WAS '.', DIGIT OR . IF 1ST CHAR WAS + OR -
 6    IF(LPTR.GT.80)GO TO 7
      CALL CINT(LINE(LPTR), ICT1,IDV)
      IF(SFLAG .AND. ICT1.EQ.7)ICT1=1
      GO TO (7,8,7,9,7,7,7,7),ICT1
C
C     2ND CHAR WAS '.', WHICH IS OK IF 1ST CHAR WAS + OR -
 9    IF(ICT.EQ.4)GO TO 7
C     OK, HAVE + OR - FOLLOWED BY . SO FAR
C     DIGIT MUST BE NEXT, OR ELSE
      I=LPTR+1
      IF(I.GT.80)GO TO 7
      CALL CINT(LINE(I),ICT1,IDV)
      IF(ICT1.NE.2)GO TO 7
C     FINALLY, IT IS CLEAR THAT A NUMBER IS COMING
C
C     SET UP TO START CONVERTING NUMBER
 8    IF(ICT.EQ.6)ISIGN=-1
      IF(ICT.EQ.4)GO TO 10
      GO TO 20
C
C
C     A NUMBER IS BEING CONVERTED.  NO DECIMAL POINT ENCOUNTERED YET
 4    FNUM=10.*FNUM
      X=IDV
      FNUM=FNUM+X
C
 20   IF(LPTR.GT.80)GO TO 11
      C=LINE(LPTR)
      CALL CINT(C,ICT,IDV)
C     CHECK FOR DECIMAL POINT
      IF(ICT.EQ.4)GO TO 12
      IF(ICT.NE.2)GO TO 11
C     HAVE ANOTHER DIGIT
      LPTR=LPTR+1
      GO TO 4
C
C     HAVE HIT DECIMAL POINT IN NUMBER
 12   LPTR=LPTR+1
 10   XMULT=.1
C
 13   IF(LPTR.GT.80)GO TO 11
      C=LINE(LPTR)
      CALL CINT(C,ICT,IDV)
      IF(ICT.NE.2)GO TO 11
C     ANOTHER DIGIT
      X=IDV
      FNUM=FNUM+XMULT*X
      XMULT=.1*XMULT
      LPTR=LPTR+1
      GO TO 13
C
C     END OF NUMBER
 11   IF(ISIGN.LT.0)FNUM=-FNUM
      X=FNUM
      IF(X.LE.0.)X=X-1.
      X=X+.5
      NUM=X
C     RETURN WITH CONVERTED NUMBER
      RETURN 1
C
C
C     LOOKS LIKE AN ALPHAMERIC NAME COMING UP
 3    NAME(1)=C
      LWP1=LPTR-1
      NPTR=2
C
 15   IF(LPTR.GT.80)RETURN
      C=LINE(LPTR)
      LPTR=LPTR+1
      CALL CINT(C,ICT,IDV)
      IF(SFLAG .AND. ICT.EQ.7)ICT=1
      GO TO (14,14),ICT
C
C     END OF ALPHAMERIC NAME
      LPTR=LPTR-1
      RETURN
C
C     ADD CHARACTER TO NAME UNLESS TOO LONG
 14   IF(NPTR.GT.8)GO TO 16
      NAME(NPTR)=C
      NPTR=NPTR+1
      GO TO 15
C
C     LONG WORD--MORE THAN 8 CHARACTERS
C     FIND END OF LONG WORD
 16   LWP2=LPTR-1
      IF(LPTR.GT.80)GO TO 17
      C=LINE(LPTR)
      CALL CINT(C,ICT,IDV)
      IF(SFLAG .AND. ICT.EQ.7)ICT=1
      IF(ICT.GT.2)GO TO 17
      LPTR=LPTR+1
      GO TO 16
C
C     PRINT MESSAGE THAT WORD HAS BEEN SHORTENED
 17   WRITE(ODEV1,1001)(LINE(I),I=LWP1,LWP2)
      WRITE(ODEV1,1002)NAME
      RETURN
C
 1001 FORMAT(' UNDULY LONG WORD: ',80A1)
 1002 FORMAT(' SHORTENED TO: ',8A1)
      END
      SUBROUTINE CINT(C,ICT,IDV)
C
C     CHARACTER DECODING SUBROUTINE
C
C     ARGUMENT C MUST BE A CHARACTER IN THE LEFTMOST BYTE OF AN
C     INTEGER*4 WORD, WITH A BLANK IN THE RIGHT BYTE
C
C     ARGUMENT ICT IS AN INTEGER*4 WORD WHICH CONTAINS A NUMBER
C     INDICATING THE TYPE OF CHARACTER WHEN CINT RETURNS (SEE
C     BELOW FOR RETURN CODES)
C
C     IDV IS AN INTEGER*4 WORD USED TO RETURN THE NUMERIC VALUE
C     WHEN C IS AN INTEGER
C
C     RETURN CODES:
C	1  C IS ALPHABETIC
C	2  C IS DIGIT; NUMERIC VALUE OF DIGIT IS IN IDV
C	3  C IS A BLANK
C	4  C IS A PERIOD
C	5  C IS A +
C	6  C IS A -
C	7  C IS A *
C	8  C IS NONE OF THE ABOVE
C
C
      IMPLICIT INTEGER*4 (C)
      INTEGER*4 SPEC(5),ALPHA(26),NUM(10)
      DATA ALPHA/'A','B','C','D','E','F','G','H','I','J','K','L',
     1     'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'/
      DATA NUM/'0','1','2','3','4','5','6','7','8','9'/
      DATA SPEC/' ','.','+','-','*'/
C
C
      IDV=0
C     SEE IF C IS ALPHABETIC
      ICT=1
      DO 10 I=1,26
  10  IF (C.EQ.ALPHA(I)) RETURN
C     SEE IF C IS NUMERIC
      DO 20 I=1,10
   20 IF (C.EQ.NUM(I)) GO TO 21
      GO TO 22
   21 ICT = 2
      IDV = I-1
      RETURN
   22  CONTINUE
C
C     CHECK FOR SPECIAL CHARACTER
 2    DO 3 I=1,5
      IF(C.NE.SPEC(I))GO TO 3
      ICT=I+2
      RETURN
 3    CONTINUE
C     CHARACTER C IS NONE OF THE ABOVE
      ICT=8
      RETURN
      END
      SUBROUTINE SFIND(S1,S2,N1,N2,START,SPTR,EPTR,*)
C
C     SUBROUTINE TO FIND THE FIRST OCCURRENCE, IF ANY, OF A
C     GIVEN STRING OF CHARACTERS IN A SECOND STRING, STARTING
C     AT A GIVEN POINT IN THE SECOND STRING.  RETURNS POINTERS
C     TO THE BEGINNING AND END POSITIONS OF THE MATCHED STRING
C     IN THE SECOND STRING.  NORMAL RETURN INDICATES THAT A
C     MATCH HAS OCCURRED, RETURN 1 INDICATES NO MATCH.
C
C     ARGUMENTS:
C	S1     INTEGER*4  VECTOR OF LENGTH N1 CONTAINING STRING
C			  TO BE MATCHED
C	S2     INTEGER*4  VECTOR OF LENGTH N2 CONTAINING STRING
C			  TO BE SEARCHED
C	N1     INTEGER*4  LENGTH OF S1
C	N2     INTEGER*4  LENGTH OF S2
C	START  INTEGER*4  POINTER TO 1ST CHARACTER TO BE EXAMINED
C			  IN S2
C	SPTR   INTEGER*4  POINTS TO START OF MATCH IN S2 ON
C			  NORMAL RETURN
C	EPTR   INTEGER*4  POINTS TO END OF MATCH IN S2 ON NORMAL
C			  RETURN
C
C
      IMPLICIT INTEGER*4 (A-H,O-Z)
      INTEGER*4 START,SPTR,EPTR,ODEV1,ODV
      DIMENSION S1(N1), S2(N2)
      COMMON /IO/IDEV(4),ODEV1,ODV(3),ALINE(80)
C
      SPTR=0
      EPTR=0
C     CHECK STRING LENGTHS FOR LEGALITY
      IF(N1.GT.0 .AND. N2.GT.0)GO TO 1
C     BAD VALUE FOR N1 AND/OR N2
      WRITE(ODEV1,1001)N1,N2,START
 1001 FORMAT(' BAD CALL TO SFIND  N1=',I8,'  N2=',I8,
     1	'  START=',I8)
      STOP 767
C
 1    IF(START.LE.0)START=1
      I=START
C
C     CHECK FOR END OF 2ND STRING
 2    IF(I.GT.N2)RETURN 1
C
C     TRY TO MATCH 1ST CHAR OF S1 WITH A CHAR IN S2
      IF(S1(1).EQ.S2(I))GO TO 3
C
C     NO LUCK
 4    I=I+1
      GO TO 2
C
C     SEE IF CAN MATCH REST OF S1 WITH SUCCEEDING CHARS IN S2
 3    IF(N1.EQ.1)GO TO 5
      DO 6 J=2,N1
      K=I+J-1
      IF(K.GT.N2)RETURN 1
      IF(S2(K).NE.S1(J))GO TO 4
 6    CONTINUE
 5    SPTR=I
      EPTR=I+N1-1
      RETURN
      END
      SUBROUTINE INPUT(IDEVNO,ECHO,*,*)
C
C     SUBROUTINE TO READ A LINE OF TEXTUAL DATA FROM A GIVEN DEVICE
C     AND STORE IT IN LINE.
C
C     NORMAL RETURN INDICATES THAT THE LINE WAS SUCCESSFULLY
C     READ, AND NO SUPERVISOR COMMAND PREFIX CHARACTER PAIRS
C     ('>>', '<<', OR '&&') WERE FOUND.
C     RETURN 1 INDICATES AN END-OF-FILE WAS ENCOUNTERED
C     RETURN 2 INDICATES THE LINE CONTAINS COMMAND PREFIX CHARS
C
C     ARGUMENT:
C	IDEVNO	INTEGER*4  NUMBER OF DEVICE FROM WHICH INPUT
C			   IS TO BE READ.  LEGAL VALUES RANGE
C			   FROM 0 TO 99.
C	ECHO	LOGICAL*4  IF .TRUE., CAUSES INPUT LINES TO BE PRINTED
C			   ON ODEV1.
C
C
      IMPLICIT INTEGER*4 (L), INTEGER*4 (A-K,M-Z)
      COMMON /IO/IDEV(4),ODEV(4),LINE(80)
C
C     CPFX CONTAINS THE ALLOWABLE COMMAND PREFIX CHARACTER PAIRS.
C     NCPFX IS THE NUMBER OF SUCH PAIRS.  TO CHANGE PREFIX CHAR-
C     ACTERS, ALTER THE DATA BELOW AND ALSO IN THE SUPERVISOR MAIN
C     PROGRAM.
      INTEGER*4 CPFX(2,3)
!!      DATA NCPFX/3/, CPFX/'>','>','<','<','&','&'/
C
      LOGICAL*4 ECHO
      EQUIVALENCE (ODEV1,ODEV(1))
      DATA NCPFX/3/, CPFX/'>','>','<','<','&','&'/
C
C     TEST LEGALITY OF CALL
      IF(IDEVNO.GE.0 .AND. IDEVNO.LT.100)GO TO 1
C     BAD CALL
      WRITE(ODEV1,1001)IDEVNO
      STOP '6769'
C
C     TRY TO READ LINE
 1    READ(IDEVNO,1002,END=2,ERR=3)LINE
C
      IF(ECHO) JMAX=JMAXX(LINE,80)
      IF(ECHO) WRITE(ODEV1,1005) (LINE(III),III=1,JMAX)
C
C     SEARCH LINE FOR SUPERVISOR COMMAND
      DO 4 I=1,NCPFX
      CALL SFIND(CPFX(1,I),LINE,2,80,1,J,K,&4)
C     THERE IS A SUPERVISOR COMMAND IN THE LINE
      RETURN 2
C
 4    CONTINUE
C     NO COMMAND--NORMAL RETURN
      RETURN
C
C     END-OF-FILE ENCOUNTERED.	TELL THE WORLD.
 2    WRITE(ODEV1,1003)IDEVNO
      RETURN 1
C
C     DEVICE ERROR--TIME TO QUIT BEFORE THINGS GET WORSE
 3    WRITE(ODEV1,1004)IDEVNO
      STOP 6770
C
 1001 FORMAT(' BAD CALL TO INPUT:  DEVICE NO.=',I8)
 1002 FORMAT(80A1)
 1003 FORMAT(1H0,'END-OF-FILE ON DEVICE',I3)
 1004 FORMAT(1H0,'DEVICE',I3,' HAS FAILED.')
 1005 FORMAT(1X,80A1)
      END
      SUBROUTINE NMATCH(NAME1,NAME2,*)
C
C     SUBROUTINE TO DETERMINE WHETHER OR NOT TWO 8-CHARACTER
C     ALPHAMERIC NAMES MATCH
C
C     BOTH NAME1 AND NAME2 MUST CONTAIN ONLY ALPHAMERIC CHAR-
C     ACTERS AND TRAILING BLANKS, EXCEPT THAT NAME1 MAY CONTAIN
C     ASTERISKS TO DENOTE VARIABLE STRING ELEMENTS.  NAME1 MAY
C     CONTAIN UP TO 4 *'S; IT IS NOT LEGAL TO PUT TWO ASTERISKS
C     IN A ROW.
C
C     NMATCH RETURNS NORMALLY IF THE TWO NAMES MATCH, DOES A
C     RETURN 1 IF THEY DO NOT.
C
C     ARGUMENTS:
C	NAME1  INTEGER*4  8 CHARACTER VECTOR, MAY CONTAIN *'S
C	NAME2  INTEGER*4  8 CHARACTER VECTOR, MAY NOT CONTAIN *'S
C
C
      IMPLICIT INTEGER*4 (A-H,O-Z)
      INTEGER*4 NAME1(8),NAME2(8)
C
      DATA STAR/'*'/, BLANK/' '/
C
C     TRY TO MATCH 1ST CHUNK OF NAME1 UP TO 1ST * OR END
      N1PTR=0
      N2PTR=0
      DO 1 I=1,8
      IF(NAME1(I).NE.STAR)GO TO 1
      IF(I.EQ.1)GO TO 3
      I2=I-1
C
C     MUST HAVE EXACT MATCH FROM 1 TO I2
 2    DO 4 J=1,I2
      IF(NAME1(J).NE.NAME2(J))RETURN 1
 4    CONTINUE
C     SO FAR SO GOOD
      N1PTR=I2
      N2PTR=I2
      GO TO 3
 1    CONTINUE
C     NO STARS MEANS EXACT MATCH NECESSARY
      I2=8
      GO TO 2
C
C
C     SEE IF DONE
 3    IF(N1PTR.LT.8)GO TO 5
      IF(N2PTR.EQ.8 .OR. NAME2(N2PTR+1).EQ.BLANK)RETURN
      RETURN 1
C
 5    IF(NAME1(N1PTR+1).EQ.STAR)GO TO 11
      IF(N2PTR.EQ.8)RETURN
      IF(NAME2(N2PTR+1).EQ.BLANK)RETURN
      RETURN 1
C
C     FIND NEXT CLUMP OF NON-BLANK CHARS FOLLOWING *, IF ANY
 11   I1=N1PTR+2
C     IF LAST SIGNIFICANT CHARACTER OF NAME1 IS *, CAN QUIT
      IF(I1.GT.8)RETURN
      IF(NAME1(I1).EQ.BLANK)RETURN
C
C     MORE ALPHAMERIC CHARACTERS TO BE MATCHED
      DO 6 I=I1,8
      IF(NAME1(I).NE.STAR .AND. NAME1(I).NE.BLANK)GO TO 6
C     HAVE END OF CLUMP OF CHARACTERS
      I2=I-1
      GO TO 7
 6    CONTINUE
      I2=8
C
C     SCAN THRU NAME2 FOR SEQUENCE OF CHARS MATCHING CLUMP IN NAME1
 7    N2=N2PTR+1
      IF(N2.GT.8)RETURN 1
C
C     TRY TO MATCH 1ST CHAR OR CLUMP
      N1I1=NAME1(I1)
      DO 8 I=N2,8
      IF(NAME2(I).NE.N1I1)GO TO 8
C     HAVE 1ST CHAR MATCH--TRY FOR REST
      IF(I2.EQ.I1)GO TO 9
C
      I11=I1+1
      DO 10 J=I11,I2
      K=I+J-I1
      IF(K.GT.8)RETURN 1
      IF(NAME2(K).NE.NAME1(J))GO TO 8
 10   CONTINUE
C
C     IF CLUMP IN NAME1 IS AT END OF WORD, NAME2 CLUMP SHOULD BE THERE TOO
 9    IF(I2.LT.8 .AND. NAME1(I2+1).NE.BLANK)GO TO 12
C     NOW AT END OF WORD IN NAME1--BETTER BE AT END IN NAME2
      K=I+I2-I1
      IF(K.LT.8 .AND. NAME2(K+1).NE.BLANK)GO TO 8
C
C     SUCCESS
 12   N1PTR=I2
      N2PTR=I+I2-I1
      GO TO 3
 8    CONTINUE
      RETURN 1
      END
      SUBROUTINE NSRCH(NAME,NTABLE,START,STOP,NNUM,*)
C
C     SUBROUTINE TO DETERMINE WHETHER A GIVEN NAME IS IN A GIVEN
C     RANGE OF A TABLE OF NAMES, AND, IF SO, WHICH ONE IT IS
C
C     A NORMAL RETURN IS EXECUTED WHEN THE NAME IS FOUND IN THE
C     TABLE, RETURN 1 IF IT IS NOT
C
C     ARGUMENTS:
C	NAME   INTEGER*4  8 CHARACTER VECTOR CONTAINING NAME TO
C			  BE LOOKED FOR IN NTABLE.  MAY NOT CON-
C			  TAIN *'S.
C	NTABLE INTEGER*4  TABLE OF NAMES AND ABBREVIATIONS DIMEN-
C			  SIONED (8,N), WHERE N IS GREATER THAN OR
C			  OR EQUAL TO STOP.  NAMES IN NTABLE MAY
C			  CONTAIN *'S.
C	START  INTEGER*4  POINTER TO THE 1ST NAME IN NTABLE TO BE
C			  SCANNED FOR A MATCH WITH NAME.
C	STOP   INTEGER*4  POINTER TO THE LAST NAME TO BE SCANNED.
C	NNUM   INTEGER*4  CONTAINS POINTER TO THE FIRST NAME WHICH
C			  MATCHED NAME ON NORMAL RETURN.  EQUALS
C			  ZERO ON RETURN 1.
C
C
      IMPLICIT INTEGER*4 (A-Z)
      INTEGER*4 NAME(8),NTABLE(8,STOP),LINE,NT(8)
      COMMON /IO/IDEV(4),ODEV(4),LINE(80)
      EQUIVALENCE (ODEV1,ODEV(1))
C
C
C     TEST LEGALITY OF ARGS
      IF(STOP.GE.1 .AND. START.LE.STOP)GO TO 1
C     ILLEGAL SITUATION
      WRITE(ODEV1,1001)START,STOP
      STOP '6768'
C
 1    IF(START.LE.1)START=1
      DO 2 I=START,STOP
      DO 3 J=1,8
 3    NT(J)=NTABLE(J,I)
      CALL NMATCH(NT,NAME,&2)
C
C     HAVE MATCH
      NNUM=I
      RETURN
 2    CONTINUE
C     NO LUCK
      NNUM=0
      RETURN 1
C
 1001 FORMAT(' BAD CALL TO NSRCH  START=',I8,'	STOP=',I8)
      END
      SUBROUTINE ATQ(BC,LPTR,*)
C
C     SUBROUTINE TO TEST FOR PRESENCE OF '@END' IN LINE(80)
C     ENTRY ATQ TESTS BC TO SEE IF IT IS '@', AND, IF SO,
C     TESTS FOR E* AFTER THE '@'.
C     ENTRY ATEND ASSUMES THAT AN '@' HAS ALREADY BEEN DETECTED
C     AND JUST CHECKS FOR E*.
C
C     BOTH ENTRIES GIVE NORMAL RETURNS IF '@END' IS NOT FOUND,
C     RETURN 1 IF IT IS.
C     IN NO CASE IS LPTR CHANGED.
C
C     ARGUMENTS:
C	LPTR  INTEGER*4  POINTER INTO LINE(80)
C	BC    INTEGER*4  BREAK CHAR TO BE TESTED FOR '@'
C
C     THIS VERSION OF ATQ AND ATEND ACCEPTS '@' ALONE AS
C     END-OF-STRING WHETHER OR NOT FOLLOWED BY E*.
C
C
      IMPLICIT INTEGER*4 (O), INTEGER*4 (A-H)
      INTEGER*4 N(8),ENDX(8),LINE
      COMMON /IO/IDEV(4),ODEV1,ODEV(3),LINE(80)
!!      DATA AT/'@'/
!!      DATA ENDX/'E','*',6*' '/
      LOGICAL*4 F
      DATA AT/'@'/
      DATA ENDX/'E','*',6*' '/
      DATA F/.FALSE./
C
C
C     SEE IF BC IS AN '@'
      IF(BC.EQ.AT)GO TO 3
      RETURN
C
C
      ENTRY ATEND(LPTR,*)
C
 3    I=LPTR
      CALL NEXT(I,N,BC,J,X,F,&1,&1,&1)
C     SEE IF NEXT THING AFTER '@' IS E*
      CALL NMATCH(ENDX,N,&1)
C
C     OK--HAVE CLEAR EOS
      RETURN 1
C
C     '@' NOT FOLLOWED BY E*
 1    CONTINUE
      RETURN 1
C
      END
      SUBROUTINE CVALS(NC)
C
C     SUBROUTINE TO GET THE VALUES OF ALL SIMULATION VARIABLES
C     INTO THE 'CURRENT VALUES' VECTORS IN /VARS1/
C
C     ARGUMENT:
C     NC  I*4  NUMBER OF EXPTL CONDITION
C
C------------------------------
C
      INTEGER*4 SPECI(12,32),SPECF(12,32),SI(12),SF(12)
      INTEGER*4 IVARS(12,32),IV(12)
      REAL*4 FVARS(12,32),FV(12)
      LOGICAL*4 FLAGS(12,32),FLGS(12),ENTERD(36)
      COMMON /VARS/ IVARS,FVARS,SPECI,SPECF,FLAGS,ENTERD
      COMMON /VARS1/ IV,FV,SI,SF,FLGS
C
      IF(NC.GT.0 .AND. NC.LE.32)GO TO 1
      STOP '1973'
 1    DO 2 I=1,12
      FLGS(I)=FLAGS(I,NC)
      IV(I)=IVARS(I,NC)
      FV(I)=FVARS(I,NC)
      SI(I)=SPECI(I,NC)
 2    SF(I)=SPECF(I,NC)
      RETURN
      END
      SUBROUTINE EVAL(VNO,TYPE,VSPTR,NC,X,*)
C
C     SUBROUTINE USED IN MAKING LEGALITY TESTS ON INPUT
C     GETS FP VALUE FOR SPECIFIED VARIABLE; IF VARIABLE NUMBER IS
C     NEGATIVE, THE 'SPECIAL' VALUE OF THE VARIABLE IS WHAT IS RETURNED
C     RETURN 1 INDICATES THAT THE VARIABLE HAS A SPECIAL VALUE WHEN A
C     NORMAL VALUE IS CALLED FOR, OR VICE VERSA.  IN THAT CASE, A ZERO
C     VALUE IS RETURNED IN X.
C
C     ARGUMENTS:
C     VNO    I*2  VARIABLE NUMBER (SEE ABOVE)
C     TYPE   I*2  INTERNAL TYPE OF VARIABLE
C     VSPTR  I*2  VARIABLE STORAGE POINTER
C     NC     I*4  EXPTL CONDITION NUMBER
C     X      R*4  CONTAINS VALUE OF VARIABLE ON RETURN
C
C
      INTEGER*4 VNO,TYPE,VSPTR
C
C     GET FP VALUE FOR VARIABLE
      CALL VALUE(VSPTR,TYPE,NC,X,IX,&1)
      IF((VNO.GE.0).AND.(IX.EQ.0))RETURN
      IF((VNO.GE.0).AND.(IX.NE.0))GO TO 2
      IF((VNO.LT.0).AND.(IX.EQ.0))GO TO 2
      X=IX
      RETURN
 2    X=0.
      RETURN 1
C
C     ERROR
 1    STOP '1974'
      END
      SUBROUTINE ABBREV(LIST,NPTR,LAST,IDEV,LPTR,ECHO,*)
C
C     SUBROUTINE TO READ A LIST OF NAMES/ABBREVIATIONS ENCLOSED IN
C     PARENTHESES
C
C     NAMES ARE STORED SEQUENTIALLY IN LIST STARTING AT SLOT NPTR+1
C     LIST OF NAMES MUST BE TERMINATED BY ')'; END-OF-FILE OR @END
C     WILL CAUSE ERROR MESSAGE AND ERROR RETURN
C     IF TOO MANY ERRORS ARE ENCOUNTERED, ABBREV ASSUMES THAT THE
C     RIGHT PARENTHESIS IS MISSING AND QUITS PROCESSING
C     INITIAL LEFT PARENTHESIS IS NOT NECESSARY
C
C     RETURN 1 INDICATES FATAL ERROR(S)
C
C     ARGUMENTS:
C     LIST  I*2  LIST IN WHICH NAMES/ABBREVNS ARE TO BE STORED.
C		 DIM(8,LAST)
C     NPTR  I*4  POINTER TO THE LAST SLOT USED IN LIST.  ON RETURN,
C		 POINTS TO THE LAST SLOT USED BY ABBREV
C     LAST  I*4  MAXIMUM NUMBER OF NAMES THAT CAN BE STORED IN LIST
C     IDEV  I*4  INPUT DEVICE NUMBER
C     LPTR  I*4  POINTER INTO LINE TO THE 1ST CHARACTER TO BE SCANNED
C		 BY ABBREV.  ON RETURN, POINTS TO THE CHARACTER AFTER
C		 THE LAST ONE PROCESSED BY ABBREV
C     ECHO  L*1  WHEN ECHO=.TRUE. INPUT IS ECHOED ON ODEV1
C
C------------------------------
C
      IMPLICIT INTEGER*4 (A-H,P-Z), INTEGER*4 (O)
      INTEGER*4 LIST(8,LAST), ABV(8), LINE
      LOGICAL*4 T,ECHO
      REAL*4 FNUM
!!      DATA T/.TRUE./, RPAREN/') '/
      COMMON /IO/IDV(4),ODEV1,ODV(3),LINE(80)
      DATA T/.TRUE./, RPAREN/') '/
C
C------------------------------
C
C     TEST FOR PROGRAM ERROR
      IF(NPTR.LT.0)GO TO 112
      IF(LAST.LE.0)GO TO 112
      IF(IDEV.LT.0 .OR. IDEV.GT.99)GO TO 112
      NERR=0
C
C------------------------------
C
C     GET NEXT THING FROM LIST OF ABBREVIATIONS
 1    CALL NEXT(LPTR,ABV,BC,NUM,FNUM,T,&100,&10,&11)
C
C     HAVE ANOTHER ABBREV--ADD TO LIST IF HAVE ROOM
      IF(NPTR.LT.LAST)GO TO 2
C
C     LIST OVERFLOW
      WRITE(ODEV1,1001)ABV
      GO TO 110
C
 2    NPTR=NPTR+1
      DO 3 I=1,8
 3    LIST(I,NPTR)=ABV(I)
      GO TO 1
C
C     BREAK CHAR MAY BE ')' OR '@'; IGNORE IF NOT
 10   CALL ATQ(BC,LPTR,&111)
      IF(BC.NE.RPAREN)GO TO 1
C     END OF ABBREVN LIST
      IF(NERR.GT.0)RETURN 1
      RETURN
C
C     END OF LINE
 11   CALL INPUT(IDEV,ECHO,&102,&120)
 120  LPTR=1
      GO TO 1
C
C------------------------------
C
C     NUMBER IN INPUT
 100  WRITE(ODEV1,1002)FNUM
      GO TO 110
C
C     END-OF-FILE
 102  WRITE(ODEV1,1003)
      GO TO 111
C
C     IF TOO MANY ERRORS, PROBABLY HAVE UNCLOSED PARENTHESIS
 110  NERR=NERR+1
      IF(NERR.LT.5)GO TO 1
C
C     GIVE UP
 111  WRITE(ODEV1,1004)LINE
      IF(NPTR.LE.0)RETURN 1
      WRITE(ODEV1,1006)((LIST(I,IS1),I=1,8),IS1=1,NPTR)
      RETURN 1
C
C     BAD CALL
 112  WRITE(ODEV1,1007)NPTR,LAST,IDEV,LPTR
      STOP '1921'
C
C------------------------------
C
 1001 FORMAT(1H0,'NAME LIST OVERFLOW.  NAME:',8A1)
 1002 FORMAT(1H0,'NUMBER IN LIST OF NAMES:',F12.4)
 1003 FORMAT(1H0,'ABBREV ABORT')
 1004 FORMAT(1H0,'MISSING RT PARENTHESIS.  LAST LINE:'/1X,80A1)
 1006 FORMAT(' NAME LIST:'/(1X,7(8A1,', ')))
 1007 FORMAT(1H0,'BAD CALL TO ABBREV'/'   NPTR	LAST  IDEV'
     1 ,'  LPTR'/1X,4I6)
      END
      SUBROUTINE CCHARS(NC,CC)
C
C     SUBROUTINES DEALING WITH ALPHABETIC CONDITION LABELS
C     CCHARS PRODUCES A LABEL GIVEN A CONDITION NUMBER
C     CCNUM PRODUCES A CONDITION NUMBER GIVEN A LABEL
C
C     CCHARS
C     WORKS ONLY FOR CONDITION NUMBERS BETWEEN 1 AND 26**2
C
C     ARGUMENTS:
C     NC  I*4  NUMBER OF CONDITION
C     CC  I*2  DIM(2).	RETURN VECTOR FOR PAIR OF CONDITION CHARACTERS
C	       CHARACTERS ARE RIGHT JUSTIFIED IN CC.
C
C------------------------------
C
      INTEGER*4 CC(2), ABC(26), BLANK
      INTEGER*4 NAME(8)
      INTEGER*4 ODEV1
      COMMON /IO/IDEV(4),ODEV1
        DATA BLANK/'  '/
        DATA ABC/'A','B','C','D','E','F','G','H','I','J','K','L',
     1    'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'/
C
      I=0
      NC1=NC
      CC(1)=BLANK
      IF(NC1.LE.26)GO TO 1
 2    I=I+1
      NC1=NC1-26
      IF(NC1.GT.26)GO TO 2
      CC(1)=ABC(I)
 1    CC(2)=ABC(NC1)
      RETURN
C
C------------------------------
C
C     CCNUM
C     PRINTS AN ERROR MESSAGE AND DOES RETURN 1 IF CONDITION LABEL IS
C     TOO LONG OR SPECIFIES A CONDITION NOT DEFINED BY THE STUDENT
C
C     ARGUMENTS:
C     NAME    I*2  DIM(8).  CHARACTER VECTOR CONTAINING CONDITION LABEL
C		   LEFT JUSTIFIED WITH AT LEAST ONE TRAILING BLANK
C     NUM     I*4  CONDITION NUMBER IS RETURNED IN NUM
C     NCONDS  I*4  MUST CONTAIN THE NUMBER OF CONDITIONS DEFINED BY THE
C		   STUDENT
C
C------------------------------
C
      ENTRY CCNUM(NAME,NUM,NCONDS,*)
!!      INTEGER*4 NAME(8)
!!      INTEGER*4 ODEV1
!!      COMMON /IO/IDEV(4),ODEV1
C
      NUM=0
      DO 10 I=1,3
      IF(NAME(I).EQ.BLANK)GO TO 12
      NUM=26*NUM
      DO 11 J=1,26
      IF(NAME(I).EQ.ABC(J))GO TO 13
 11   CONTINUE
C     UNIDENTIFIABLE CHARACTER
      GO TO 20
C
 13   NUM=NUM+J
 10   CONTINUE
C     TOO MANY CHARACTERS
      GO TO 20
C
C     SEE IF NUMBER IS TOO BIG
 12   IF(NUM.LE.0 .OR. NUM.GT.NCONDS)GO TO 20
      RETURN
C
C     ILLEGAL CONDITION LABEL
 20   WRITE(ODEV1,1001)NAME
      NUM=1
      RETURN 1
C
 1001 FORMAT(1H0,'ILLEGAL CONDITION LABEL: ',8A1)
      END
      SUBROUTINE NXT(LPTR,NAME,NUM,FNUM,ECHO,IDEV,*,*,*,*,*,*)
C
C     AUXILIARY SUBROUTINE FOR USE BY SIM DATA LOADER
C     ADAPTS SUBROUTINE NEXT FOR SPECIAL APPLICATION
C
C     RETURNS:
C     0  NAME
C     1  NUMBER
C     2  SLASH
C     3  @END
C     4  (
C     5  )
C     6  EOF
C
C------------------------------
C
      INTEGER*4 NAME(8),BC,SLASH,RPAREN,LPAREN
      LOGICAL*4 F,ECHO
      DATA F/.FALSE./, SLASH/'/'/, LPAREN/'('/, RPAREN/')'/
C
C------------------------------
C
 6    CALL NEXT(LPTR,NAME,BC,NUM,FNUM,F,&1,&2,&3)
      RETURN
 1    RETURN 1
 2    CALL ATQ(BC,LPTR,&5)
      IF(BC.EQ.SLASH)RETURN 2
      IF(BC.EQ.LPAREN)RETURN 4
      IF(BC.EQ.RPAREN)RETURN 5
      GO TO 6
C
 3    CALL INPUT(IDEV,ECHO,&7,&8)
 8    LPTR=1
      GO TO 6
C
 5    RETURN 3
 7    RETURN 6
      END
      SUBROUTINE VALUE(PTR,TYPE,NC,X,IX,*)
C
C     SUBROUTINE TO GET VALUE OF VARIABLE
C
      INTEGER*4 PTR,TYPE
      INTEGER*4 SPECI(12,32),SPECF(12,32)
      LOGICAL*4 FLAGS(12,32),ENTERD(36)
      COMMON /VARS/IVARS(12,32),FVARS(12,32),SPECI,SPECF,FLAGS,ENTERD
C
C
      I=TYPE
      GO TO (1,2,1,1,2,1,9,1,2,9),I
C     INTEGER VARIABLE
 1    X=IVARS(PTR,NC)
      IX=SPECI(PTR,NC)
      RETURN
C     FLOATING POINT VARIABLE
 2    X=FVARS(PTR,NC)
      IX=SPECF(PTR,NC)
      RETURN
C     FLAG VARIABLE
 9    RETURN 1
      END
      SUBROUTINE RJUST(NVEC,NVP,VLIST,VPTR)
C
C     SUBROUTINE TO TAKE A NAME FROM A LIST OF LEFT-JUSTIFIED NAMES,
C     RIGHT-JUSTIFY IT, AND PLACE IT IN A LIST OF RIGHT-JUSTIFIED NAMES
C
C     ARGUMENTS:
C     NVEC   I*2  DIM(8,NVP+).	VECTOR OF NAMES INTO WHICH RIGHT-
C		  JUSTIFIED NAME IS TO BE PLACED
C     NVP    I*4  POINTER INTO NVEC INDICATING WHERE RIGHT-JUSTIFIED
C		  NAME SHOULD BE PUT
C     VLIST  I*2  DIM(8,75 OR SO).  VECTOR OF LEFT-JUSTIFIED NAMES
C		  FROM WHICH NAME IS TO BE TAKEN
C     VPTR   I*2  POINTER INDICATING WHICH NAME IS TO BE TAKEN FROM
C		  VLIST
C
C------------------------------
C
C
      INTEGER*4 NVEC(8,NVP),VLIST(8,75),VPTR,BLANK
      DATA BLANK/' '/
C
      DO 1 I=1,8
 1    NVEC(I,NVP)=VLIST(I,VPTR)
C
      DO 2 I=1,8
      IF(NVEC(8,NVP).NE.BLANK)GO TO 3
      DO 4 J=1,7
      K=8-J
 4    NVEC(K+1,NVP)=NVEC(K,NVP)
      NVEC(1,NVP)=BLANK
 2    CONTINUE
 3    RETURN
      END
      SUBROUTINE INTERP(IDEV,EOS,ECHOF,NVARS,NVN,NKW,NIVAR,NFVAR,
     1 NFLAGS,NERR,MAXC,NPC,NCG,VLIST,VNUM,GVNPTR,VSPTR,ETYPE,
     2 ENTERD,KWR,KWLIST,KVAL,IVARS,SPECI,DIVARS,DSPECI,FVARS,
     3 SPECF,DFVARS,DSPECF,FLAGS,DFLAGS,*,*)
C
C     INPUT INTERPRETER SUBROUTINE
C
C     DETERMINES VARIABLE SETTINGS FROM FREE FORM INPUT
C
C     IF MULTIPLE VALUES ARE GIVEN FOR ONE OR MORE VARIABLES, A COM-
C     PLETE FACTORIAL DESIGN WILL BE GENERATED
C
C     ALL OUTPUT GOES ON ODEV1
C
C     RETURN 1 MEANS END-OF-FILE WAS ENCOUNTERED
C     RETURN 2 MEANS SUPERVISOR COMMAND PREFIX CHARACTERS WERE FOUND
C     IN THE CURRENT INPUT LINE.  ENTRY INTP1 SHOULD BE CALLED TO
C     RESUME INPUT ANALYSIS WITH THE NEXT LINE FROM IDEV.
C
C
C     ARGUMENTS:
C     IDEV    I*4  INPUT DEVICE NUMBER BETWEEN 0 AND 99
C     EOS     I*4  EOS DETERMINES WHAT CONDITIONS REPRESENT END-OF-
C		   STRING.  IF EOS IS NEGATIVE OR 0, "@END" AND EOF ARE
C		   THE ONLY END-OF-STRING INDICATORS; IF EOS=K>0, INPUT
C                  WILL ALSO BE TERMINATED AFTER K LINES EXCLUDING
C                  SUPERVISIOR COMMAND LINES.
C     ECHOF   L*1  ECHOF=.TRUE. CAUSES INPUT LINES TO BE ECHOED ON
C		   ODEV1
C     NVARS   I*4  TOTAL NUMBER OF VARIABLES OF ALL TYPES
C     NVN     I*4  NUMBER OF VARIABLE NAMES AND ABBREVIATIONS
C     NKW     I*4  NUMBER OF KEYWORDS AND KEYWORD ABBREVIATIONS
C     NIVAR   I*4  NUMBER OF INTEGER VARIABLES
C     NFVAR   I*4  NUMBER OF FLOATING POINT VARIABLES
C     NFLAGS  I*4  NUMBER OF FLAG VARIABLES
C     NERR    I*4  ON RETURN, CONTAINS NUMBER OF SERIOUS ERRORS
C		   DETECTED IN THE INPUT STRING
C     MAXC    I*4  MAXIMUM NUMBER OF CONDITIONS ALLOWED
C     NPC     I*4  NUMBER OF CONDITIONS GENERATED BY PRIOR STRINGS
C     NCG     I*4  CONTAINS NUMBER OF NEW CONDITIONS GENERATED BY NEW
C		   INPUT ON RETURN
C     VLIST   I*2  LIST OF VARIABLE NAMES AND ABBREVIATIONS.
C		   DIM(8,NVN)
C     VNUM    I*2  LIST OF VARIABLE NUMBERS CORRESPONDING TO THE NAMES
C		   AND ABBREVIATIONS IN VLIST.	DIM(NVN)
C     GVNPTR  I*2  LIST OF POINTERS INTO VLIST TO THE GENERIC NAME OF
C		   EACH VARIABLE.  DIM(NVARS)
C     VSPTR   I*2  LIST OF POINTERS INTO IVARS/FVARS (AND SPECI/SPECF)
C		   OR FLAGS WHICH POINT TO THE SLOT FOR EACH VARIABLE
C		   IN THE APPROPRIATE ARRAY.  DIM(NVARS)
C     ETYPE   I*2  LIST CONTAINING EXTERNAL VARIABLE TYPE FOR EACH VAR-
C		   IABLE.  DIM(NVARS).	TYPES ARE:
C		     1	NUMI
C		     2	NUMF
C		     3	KWD
C		     4	KI
C		     5	KF
C		     6	IND
C		     7	FLAG
C		     8	INTERNAL-USE-ONLY INTEGER
C		     9	INTERNAL FLOATING POINT
C		    10	INTERNAL FLAG
C     ENTERD  L*1  VECTOR WHICH CONTAINS ON RETURN THE VALUE .TRUE.
C		   FOR EVERY VARIABLE EXPLICITLY GIVEN A VALUE BY THE
C		   USER, .FALSE. FOR ALL OTHERS.  DIM(NVARS)
C     KWR     I*2  ARRAY OF POINTERS INTO KWLIST.  DIM(2,NVARS).
C		   KWR(1,VARNO) POINTS TO THE 1ST KWD VALUE FOR THE
C		   GIVEN VARIABLE, KWR(2,VARNO) TO THE LAST
C     KWLIST  I*2  LIST OF ALL KEYWORDS AND KWD ABBREVIATIONS.
C		   DIM(8,NKW)
C     KVAL    I*4  VECTOR CONTAINING THE NUMERIC VALUE ASSOCIATED WITH
C		   EACH KWD/ABBREV IN KWLIST.  DIM(NKW)
C     IVARS   I*4  TABLE CONTAINING VALUES OF INTEGER VARIABLES FOR
C		   EACH CONDITION ON RETURN.  DIM(NIVAR,MAXC)
C     SPECI   I*2  TABLE WHICH CONTAINS NONZERO VALUE ON RETURN IF A
C		   KEYWORD IS GIVEN AS A VALUE FOR A KI VARIBLE.
C		   DIM(NIVAR,MAXC)
C     DIVARS  I*4  VECTOR CONTAINING DEFAULT VALUES TO GO IN IVARS
C		   FOR EACH INTEGER VARIABLE.  DIM(NIVAR)
C     DSPECI  I*2  VECTOR CONTAINING DEFAULT VALUES TO GO IN SPECI.
C		   DIM(NIVAR)
C     FVARS   R*4  TABLE CONTAINING VALUES OF FLOATING POINT VAR-
C		   IABLES FOR EVERY CONDITION ON RETURN.
C		   DIM(NFVAR,MAXC)
C     SPECF   I*2  TABLE WHICH CONTAINS NONZERO VALUE ON RETURN
C		   IF A KEYWORD IS GIVEN AS A VALUE FOR A KF
C		   VARIABLE.  DIM(NFVAR,MAXC)
C     DFVARS  R*4  VECTOR CONTAINING DEFAULT VALUES TO GO IN FVARS.
C		   DIM(NFVAR)
C     DSPECF  I*2  VECTOR CONTAINING DEFAULT VALUES TO GO IN
C		   SPECF.  DIM(NFVAR)
C     FLAGS   L*1  TABLE IN WHICH VALUES OF FLAG VARIABLES ARE RET-
C		   URNED.  DIM(NFLAGS,MAXC)
C     DFLAGS  L*1  VECTOR OF DEFAULT VALUES FOR FLAGS.	DIM(NFLAGS)
C
C--------------------
C--------------------
C
      IMPLICIT INTEGER*4 (O), INTEGER*4 (A-H,P-Z)
      INTEGER*4 LINE
      COMMON /IO/IDV(4),ODEV1,ODV(3),LINE(80)
C
C     TYPE SPECS AND DIMENSIONS FOR ARGUMENTS
      INTEGER*4 VLIST(8,NVN), VNUM(NVN), GVNPTR(NVARS), VSPTR(NVARS),
     1 ETYPE(NVARS), KWR(2,NVARS)
      INTEGER*4 KWLIST(8,NKW), SPECI(NIVAR,MAXC), DSPECI(NIVAR),
     1 SPECF(NFVAR,MAXC), DSPECF(NFVAR)
C
      INTEGER*4 EOS, IVARS(NIVAR,MAXC), DIVARS(NIVAR), KVAL(NKW)
C
      REAL*4 FVARS(NFVAR,MAXC), DFVARS(NFVAR)
C
      LOGICAL*4 ECHOF, ENTERD(NVARS), FLAGS(NFLAGS,MAXC),
     1 DFLAGS(NFLAGS)
C
C     TYPE SPECS FOR LOCAL VARIABLES
      INTEGER*4 NAME(8), TRASH(8), VNAME(8)
      INTEGER*4 TYPE
      REAL*4 FNUM
      LOGICAL*4 SPF, EOF, F
C
      DATA EQUALS/'='/
      DATA F/.FALSE./
C
C--------------------
C--------------------
C
C     MAKE SURE NOTHING FUNNY IS GOING ON
      IF(IDEV.LT.0 .OR. IDEV.GT.99)GO TO 1
      IF(NVARS.LE.0)GO TO 1
      IF(NVN.LT.NVARS)GO TO 1
      IF(NKW.LT.0)GO TO 1
      IF(NIVAR.LT.0 .OR. NFVAR.LT.0)GO TO 1
      IF((NIVAR+NFLAGS+NFVAR).LT.NVARS)GO TO 1
      IF(NFLAGS.LT.0)GO TO 1
      IF(NPC.LT.0)GO TO 1
      IF(MAXC.GE.1)GO TO 2
C
C     ERROR
 1    WRITE(ODEV1,1001)IDEV,NVARS,NVN,NKW,NIVAR,NFVAR,NFLAGS,NPC,
     1 MAXC
      STOP 7401
C
C--------------------
C--------------------
C
C     INITIALIZATION
 2    NERR=0
      NCG=1
      NL=0
      NV=0
      NVALS=0
      EOF=.FALSE.
      DO 3 I=1,NVARS
 3    ENTERD(I)=.FALSE.
C
C     STORE DEFAULTS
      I1=NPC+1
      IF(NIVAR.LE.0)GO TO 950
      DO 951 I=1,NIVAR
      IVARS(I,I1)=DIVARS(I)
 951  SPECI(I,I1)=DSPECI(I)
 950  IF(NFVAR.LE.0)GO TO 952
      DO 953 I=1,NFVAR
      FVARS(I,I1)=DFVARS(I)
 953  SPECF(I,I1)=DSPECF(I)
 952  IF(NFLAGS.LE.0)GO TO 954
      DO 955 I=1,NFLAGS
 955  FLAGS(I,I1)=DFLAGS(I)
 954  CONTINUE
      GO TO 6
C
C
C--------------------
C--------------------
C
C     ENTRY TO RESUME INPUT AFTER SUPERVISOR COMMAND
      ENTRY INTP1(NERR,NCG,*,*)
C
C     SEE IF SHOULD ACCEPT MORE LINES
 6    IF(EOS.GT.0 .AND. NL.GE.EOS)GO TO 900
C
C     READ LINE
      CALL INPUT(IDEV,ECHOF,&901,&902)
      NL=NL+1
      LPTR=1
C
C
C     GET NEXT INTERESTING THING FROM LINE
 7    SPF=.FALSE.
      CALL NEXT(LPTR,NAME,BC,NUM,FNUM,F,&8,&9,&6)
C
C     HAVE VAR NAME, INDICATOR KWD, OR KWD VALUE FOR PRECEDING VAR-
C     IABLE; WHAT FOLLOWS MAY DICTATE WHICH
      L1=LPTR
      CALL NEXT(L1,TRASH,BC,NUM,FNUM,F,&11,&12,&11)
C
C     TEST HYPOTHESIS THAT NAME(8) IS VALUE FOR PRECEDING VARIABLE
 11   IF(NV.EQ.0)GO TO 13
C     BRANCH ON TYPE OF PRECEDING VARIABLE
      GO TO (13,13,14,14,14,14,13,13,13,13),TYPE
C
C     SCAN KWD RANGE FOR PRECEDING VARIABLE
 14   K1=KWR(1,NV)
      K2=KWR(2,NV)
      CALL NSRCH(NAME,KWLIST,K1,K2,K,&13)
C
C     HAVE MATCH--NAME IS VALUE FOR PRECEDING VARIABLE
      NUM=KVAL(K)
      IF(TYPE.EQ.4 .OR. TYPE.EQ.5)SPF=.TRUE.
      IF(TYPE.EQ.5)GO TO 200
      GO TO 100
C
C--------------------
C
C     MIGHT HAVE INDICATOR KWD
 13   DO 16 I=1,NVARS
      IF(ETYPE(I).NE.6)GO TO 16
C
C     SCAN KWD RANGE FOR THIS INDICATOR VARIABLE
      K1=KWR(1,I)
      K2=KWR(2,I)
      CALL NSRCH(NAME,KWLIST,K1,K2,K,&16)
C
C     HAVE MATCH--FINISH OFF PRECEDING VARIABLE
      ASSIGN 25 TO IX
      GO TO 800
 25   IF(NV.NE.I)NVALS=0
      NV=I
      J1=GVNPTR(NV)
      DO 17 J=1,8
 17   VNAME(J)=VLIST(J,J1)
      TYPE=ETYPE(NV)
      IF(TYPE.LE.0 .OR. TYPE.GT.10)GO TO 701
      NUM=KVAL(K)
      GO TO 100
 16   CONTINUE
      GO TO 18
C
C--------------------
C
C     SEE IF BREAK CHARACTER IS '='
 12   IF(BC.NE.EQUALS)GO TO 11
C
C
C     PROBABLY HAVE VARIABLE NAME
 18   K=0
 22   J=K+1
      CALL NSRCH(NAME,VLIST,J,NVN,K,&19)
C
C     WE SEEM TO HAVE A VARIABLE NAME
      I=VNUM(K)
      IF(I.LE.0 .OR. I.GT.NVARS)GO TO 700
      IF(ETYPE(I).GT.7)GO TO 22
C
C     SEE IF VARIABLE NAME HAS ALREADY BEEN USED
      IF(.NOT.ENTERD(I))GO TO 23
C
C     VAR NAME HAS ALREADY APPEARED IN THE LIST
      J=GVNPTR(I)
      WRITE(ODEV1,1006)(VLIST(I1,J),I1=1,8),NAME
      GO TO 99
C
C     FINISH PROCESSING PREVIOUS VARIABLE
 23   ASSIGN 24 TO IX
      GO TO 800
 24   NV=I
      TYPE=ETYPE(NV)
      IF(TYPE.LE.0 .OR.TYPE.GT.10)GO TO 701
      DO 20 I=1,8
 20   VNAME(I)=NAME(I)
C
C     FLAG VARIABLES ARE HANDLED HERE
      IF(TYPE.NE.7)GO TO 7
      I=VSPTR(NV)
      DO 27 J=1,NCG
      K=NPC+J
 27   FLAGS(I,K)=.TRUE.
      ENTERD(NV)=.TRUE.
      NVALS=1
      GO TO 7
C
C--------------------
C--------------------
C
C     HAVE NUMBER WHICH BETTER BE VALUE FOR PRECEDING VARIABLE
 8    IF(NV.EQ.0)GO TO 21
      GO TO (100,200,21,100,200),TYPE
C
C     MEANINGLESS NUMBER
 21   WRITE(ODEV1,1003)FNUM
      GO TO 99
C
C
C     INVESTIGATE BREAK CHARACTER
 9    CALL ATQ(BC,LPTR,&900)
      GO TO 7
C
C
C     UNRECOGNIZABLE NAME
 19   WRITE(ODEV1,1005)NAME
C
C
C     COME HERE AFTER ERROR
 99   NERR=NERR+1
C     FINISH PROCESSING OF PREVIOUS VARIABLE
      ASSIGN 7 TO IX
      GO TO 800
C
C--------------------
C--------------------
C
C     ENTER VALUE FOR INTEGER VARIABLE
 100  NVALS=NVALS+1
      ENTERD(NV)=.TRUE.
      LOC=VSPTR(NV)
      IF(NVALS.GT.1)GO TO 101
C
C     FIRST VALUE FOR VARIABLE DOES NOT GENERATE ANY NEW CONDITIONS
      IC=NPC
 106  IF(SPF)GO TO 102
C
C     STORE INTEGER VALUE
      DO 103 I=1,NCG
      I1=IC+I
      SPECI(LOC,I1)=0
 103  IVARS(LOC,I1)=NUM
      GO TO 7
C
C     STORE 'SPECIAL' VALUE
 102  DO 104 I=1,NCG
      I1=IC+I
      IVARS(LOC,I1)=0
 104  SPECI(LOC,I1)=NUM
      GO TO 7
C
C     MUST GENERATE NEW CONDITIONS
 101  NX=NPC+NCG*NVALS
      IF(NX.LE.MAXC)GO TO 105
C
C     TOO MANY CONDITIONS GENERATED
 110  J1=GVNPTR(NV)
      WRITE(ODEV1,1007)MAXC,(VLIST(J2,J1),J2=1,8),VNAME
      GO TO 99
C
C
 105  IC=NPC+(NVALS-1)*NCG
C     COPY VALUES FOR ALL VARIABLES INTO NEW CONDITIONS
      ASSIGN 106 TO IY
      GO TO 600
C
C--------------------
C--------------------
C
C     ENTER VALUE FOR FLOATING POINT VARIABLE
 200  NVALS=NVALS+1
      ENTERD(NV)=.TRUE.
      LOC=VSPTR(NV)
      IF(NVALS.GT.1)GO TO 201
C
C     FIRST VALUE FOR VARIABLE DOES NOT GENERATE ANY NEW CONDITIONS
      IC=NPC
C
 206  IF(SPF)GO TO 202
C
C     STORE FLOATING POINT VALUE
      DO 203 I=1,NCG
      I1=IC+I
      SPECF(LOC,I1)=0
 203  FVARS(LOC,I1)=FNUM
      GO TO 7
C
C     STORE 'SPECIAL' VALUE
 202  DO 204 I=1,NCG
      I1=IC+I
      FVARS(LOC,I1)=0.
 204  SPECF(LOC,I1)=NUM
      GO TO 7
C
C     MUST GENERATE NEW CONDITIONS
 201  NX=NPC+NCG*NVALS
      IF(NX.GT.MAXC)GO TO 110
      IC=NPC+(NVALS-1)*NCG
C
C     COPY VALUES FOR ALL VARIABLES INTO NEW CONDITIONS
      ASSIGN 206 TO IY
      GO TO 600
C
C--------------------
C--------------------
C
C     COPY VALUES FOR ALL VARIABLES INTO NEW CONDITIONS
 600  DO 601 I=1,NCG
      I1=NPC+I
      I2=IC+I
      IF(NIVAR.LE.0)GO TO 603
      DO 602 J=1,NIVAR
      IVARS(J,I2)=IVARS(J,I1)
 602  SPECI(J,I2)=SPECI(J,I1)
C
 603  IF(NFVAR.LE.0)GO TO 605
      DO 604 J=1,NFVAR
      FVARS(J,I2)=FVARS(J,I1)
 604  SPECF(J,I2)=SPECF(J,I1)
C
 605  IF(NFLAGS.LE.0)GO TO 601
      DO 606 J=1,NFLAGS
 606  FLAGS(J,I2)=FLAGS(J,I1)
 601  CONTINUE
      GO TO IY,(106,206)
C
C--------------------
C--------------------
C
C     END-OF-FILE
 901  EOF=.TRUE.
C
C     END-OF-STRING
C     FINISH PROCESSING OF LAST VARIABLE
 900  ASSIGN 903 TO IX
      GO TO 800
 903  IF(EOF)RETURN1
      RETURN
C
C     COMMAND ENCOUNTERED
 902  RETURN 2
C
C
C     BAD VALUE IN VNUM
 700  WRITE(ODEV1,1008)K,NAME,I
      STOP 7402
C
C     BAD VALUE IN ETYPE
 701  WRITE(ODEV1,1009)NV,NAME,TYPE
      STOP 7403
C
C--------------------
C--------------------
C
C     THIS SECTION FINISHES PROCESSING OF A VARIABLE AFTER NEW
C     VARIABLE ENCOUNTERED, EOS, OR ERROR
 800  IF(NV.EQ.0)GO TO 801
      IF(NVALS.GT.0)GO TO 802
C
C     NO VALUES ENTERED FOR LAST VARIABLE
      NERR=NERR+1
      J1=GVNPTR(NV)
      WRITE(ODEV1,1004)(VLIST(J2,J1),J2=1,8),VNAME
      NVALS=1
C
C     ADD IN EXTRA CONDITIONS, IF ANY
 802  NCG=NCG*NVALS
      NV=0
 801  NVALS=0
      GO TO IX,(25,24,7,903)
C
C--------------------
C--------------------
C
 1001 FORMAT(1H0,'BAD CALL TO INTERP'/1X,'   IDEV  NVARS',
     1 4X,'NVN	  NKW  NIVAR  NFVAR NFLAGS    NPC   MAXC'
     2 /1X,10I7)
 1003 FORMAT(1H0,'MEANINGLESS NUMBER: ', G12.5)
 1004 FORMAT(1H0,'NO VALUE GIVEN FOR VARIABLE ',8A1,' ('
     1 , 8A1, ')')
 1005 FORMAT(1H0,'UNRECOGNIZABLE NAME: ',8A1/)
 1006 FORMAT(1H0,'VARIABLE NAME ',8A1,' (',8A1,') APPEARS',
     1	' TWICE')
 1007 FORMAT(1H0,'MORE THAN',I4,' CONDITIONS GENERATED BY'/
     1 ' EXTRA VALUES FOR VARIABLE ',8A1,' (',8A1,')')
 1008 FORMAT(1H0,'BAD VALUE IN VNUM FOR NAME ',I4,2X,8A1,
     1	'  VALUE=',I8)
 1009 FORMAT(1H0,'BAD VALUE IN ETYPE FOR VARIABLE',I4,2X,8A1,
     1	'  TYPE=',I8)
      END
      SUBROUTINE JIGGLE
C     SYSTEM-DEPENDENT SUBROUTINE TO 'JIGGLE' THE RANDOM NUMBERS
C     GENERATOR BEFORE EACH RUN TO PREVENT EXACT REPEATABILITY OF
C     RESULTS.
C
      INTEGER*4 SINK
      INTEGER*4 OVNAM
      LOGICAL*4 COSTPT,DATOUT
      COMMON /IO1/NOV,SINK,OVNAM(8,6),COSTPT,DATOUT
      DIMENSION JX(2)
	CALL TIME (X,Y)
	DECODE (5,1,Y) A
  1     FORMAT (1X,F4.1)
	I=10*(A-INT(A))*A
	CALL SETRAN(I)
	RETURN
C
C
C     SYSTEM-DEPENDENT SUBROUTINE TO PRINT A LINE CONTAINING TIME
C     AND DATE IN OUTPUT HEADING FOR EACH EXPTL GROUP.
C     PURELY OPTIONAL.
C
      ENTRY TANDD
!!      INTEGER*4 SINK
!!      INTEGER*4 OVNAM
!!      LOGICAL*4 COSTPT,DATOUT
!!      COMMON /IO1/NOV,SINK,OVNAM(8,6),COSTPT,DATOUT
!!      DIMENSION JX(2)
C
	CALL TIME (IX,IY)
	CALL DATE (JX)
	WRITE (SINK,1011) JX,IX,IY
C  
 1011    FORMAT (1X,2A5,3X,2A5)
      END
      INTEGER FUNCTION JMAXX(ILINE,JJ)
C	FUNCTION RETURNS THE POSTION NUMBER(PLACE) OF THE LAST 
C	NON-BLANK CHARACTER IN THE PASSED VECTOR OR MATRIX,ILINE.
C	JJ=MAX DIMENSION OF PASSED VECTOR OR MATRIX(I*J*ETC).
      DIMENSION ILINE(1)
      DATA IBLANK/' '/
      JMAX=1
      DO 2 K=1,JJ
      IF(ILINE(K).NE.IBLANK) GO TO 1
      GO TO 2
 1    JMAX=K
 2    CONTINUE
      JMAXX=JMAX
      RETURN
      END
      SUBROUTINE BATCHK(ODEV1)
C	PROGRAM TO ASSIGN A VALUE OF 3 TO ODEV1 IF A BATCH
C	JOB IS BEING RUN, OR A VALUE OF 5 IF JOB IS AT THE TERMINAL
C	USES DEC-10 SPECFIC MACRO FUNCTION SUBROUTINE 'BATCH'
C	'BATCH' MAY OR MAY NOT BE INSTELATION SPECFIC
      INTEGER BATCH, ODEV1
      I=BATCH(I)
      IF(I.EQ.0) ODEV1=3
      IF(I.NE.0) ODEV1=5
      RETURN
      END
