C      ALGORITHM 667, COLLECTED ALGORITHMS FROM ACM.
C      THIS WORK PUBLISHED IN TRANSACTIONS ON MATHEMATICAL SOFTWARE,
C      VOL. 14, NO. 4, PP. 366-388.
      SUBROUTINE SIGMA1(N,X0,NSUC,IPRINT,XMIN,FMIN,NFEV,IOUT)
C
C  SIGMA1  IS A 'DRIVER' SUBROUTINE WHICH SIMPLY CALLS THE PRINCIPAL
C  SUBROUTINE  SIGMA  AFTER HAVING ASSIGNED DEFAULT VALUES TO A NUMBER
C  OF INPUT PARAMETERS OF  SIGMA , AND HAS THEREFORE A CONSIDERABLY
C  LOWER NUMBER OF INPUT PARAMETERS.
C  IT CAN BE USED AS A SIMPLE EXAMPLE OF HOW TO CALL  SIGMA , BUT
C  ALSO AS AN EASY-TO-USE DRIVER FOR THE AVERAGE USER, WHICH MAY FIND
C  IT EASIER TO CALL  SIGMA1  INSTEAD OF  SIGMA , THUS AVOIDING THE
C  TROUBLE OF ASSIGNING A VALUE TO ALL THE INPUT PARAMETERS OS  SIGMA .
C  ALL THE PARAMETERS IN THE DEFINITION OF  SIGMA1  HAVE THE SAME MEA-
C  NING AS IN  SIGMA .
C
C  THE USER OF  SIGMA1  MUST ONLY GIVE VALUES TO THE INPUT PARAMETERS
C      N, X0, NSUC, IPRINT
C  AND OBTAINS ON OUTPUT THE SAME OUTPUT PARAMETERS OF  SIGMA
C      XMIN, FMIN, NFEV, IOUT
C
C  WE RECALL HERE THE MEANING OF THE ABOVE PARAMETERS
C
C  N       IS THE PROBLEM DIMENSION (NUMBER OF VARIABLES)
C  X0      IS AN  N-VECTOR CONTAINING THE INITIAL VALUES OF THE
C          X-VARIABLES
C  NSUC    IS THE REQUESTED NUMBER OF SUCCESSFUL TRIALS
C          AFTER WHICH THE COMPUTATION IS STOPPED.
C  IPRINT  IS AN INDEX USED TO CONTROL THE AMOUNT OF PRINTED OUTPUT
C          BY CONTROLLING THE CALLS TO THE USER-SUPPLIED OUTPUT SUB-
C          ROUTINES  PTSEG  (END-OF-SEGMENT OUTPUT),  PTRIAL  (END-
C          OF-TRIAL OUTPUT), AND  PTKSUC (END-OF-TRIAL OUTPUT RELATED
C          TO THE COUNT OF SUCCESSFUL TRIALS), WHICH ARE DESCRIBED
C          BELOW.
C          IPRINT.LT.0   NO CALL TO THE OUTPUT SUBROUTINES
C          IPRINT.EQ.0   CALL ONLY  PTRIAL  AND  PTKSUC
C          IPRINT.GT.0   CALL ALL OUTPUT SUBROUTINES.
C  XMIN    IS AN N-VECTOR CONTAINING THE COORDINATES OF THE POINT
C          (OR POSSIBLY ONE OF THE POINTS) WHERE THE FINAL VALUE  FMIN
C          OF  FOPT  WAS FOUND.
C  FMIN    IS THE FINAL VALUE OF THE BEST CURRENT MINIMUM FUNCTION
C          VALUE  FOPT.
C  NFEV    IS THE TOTAL NUMBER OF FUNCTION EVALUATION (INCLUDING
C          THOSE USED FOR THE COMPUTATION OF DERIVATIVES, AND FOR
C          THE REJECTED TIME-INTEGRATION STEPS).
C  IOUT    IS THE INDICATOR OF THE STOPPING CONDITIONS, AS FOLLOWS
C          IF  IOUT = -99  A FATAL ERROR WAS DETECTED WHEN PERFOR-
C             MING SOME PRELIMINARY CHECKING OF THE INPUT DATA, AND
C             THE ALGORITHM WAS NOT EVEN STARTED
C          OTHERWISE THE ALGORITHM WAS STARTED, AND THE MEANING OF
C          IOUT  IS AS FOLLOWS
C          IF  IOUT.EQ.0  NO TRIAL HAD A UNIFORM STOP.
C          IF  IOUT.NE.0  THE SIGN AND THE MAGNITUDE OF  IOUT  HAVE
C          THE FOLLOWING MEANING
C          A) THE SIGN OF  IOUT  INDICATES IF THE BEST UNIFORM STOP
C          (I.E. THE ONE IN WHICH  FTFOPT  WAS OBTAINED)
C          IS TO BE CONSIDERED SUCCESSFUL (IOUT.GT.0) OR UNSUCCESSFUL
C          B) THE MAGNITUDE OF  IOUT  INDICATES WHICH ONE OF THE
C          NUMERICAL EQUALITY CRITERIA WAS SATISFIED IN THE BEST
C          UNIFORM STOP
C          IABS(IOUT).EQ.1  RELATIVE DIFFERENCE CRITERION
C          IABS(IOUT).EQ.2  ABSOLUTE DIFFERENCE CRITERION
C          IABS(IOUT).EQ.3  BOTH CRITERIA
C          (IOUT  IS THE FINAL VALUE OF THE INTERNAL PARAMETER  ISTOPT
C          (AN OUTPUT INDICATOR OF THE USER-SUPPLIED SUBROUTINE
C          PTRIAL )).
C          SUCCESS IS CLAIMED BY THE ALGORITHM IF  IOUT .GT. 0,
C          I.E. IF AT LEAST ONE OF THE TRIALS STOPPED SUCCESSFULLY
C          (I.E. WITH A POSITIVE VALUE OF THE TRIAL STOP INDICATOR
C          ISTOP ), AND THE SUCCESSFUL TRIALS (AS COUNTED BY  KSUC )
C          ARE CURRENTLY VALID.
C
      DOUBLE PRECISION X0,XMIN,FMIN
      DOUBLE PRECISION DX,EPS,H,TOLABS,TOLREL
      DOUBLE PRECISION VRMAX,VRMIN,XRMAX,XRMIN
      DIMENSION X0(N),XMIN(N)
      DIMENSION XRMIN(100),XRMAX(100)
      DATA VRMIN,VRMAX /-1.D4,1.D4/
      DATA NTRILD/50/
C
      H = 1.D-10
      EPS = 1.D0
      DX = 1.D-9
      IRAND = 0
      NTRAJ = 0
      ISEGBR = 0
      INKPBR = 0
      KPBR0 = 0
      NPMIN = 10
      NPMAX0 = 100
      INPMAX = 50
      NTRIAL = MAX0(NTRILD,5*NSUC)
      TOLREL = 1.D-3
      TOLABS = 1.D-6
      KPASCA = 10
      IF(N.GT.5)KPASCA = 300
      INHP = 1
      DO 1 IX = 1,N
         XRMIN(IX)=VRMIN
         XRMAX(IX)=VRMAX
 1    CONTINUE
C
      CALL SIGMA ( N, X0, H, EPS, DX,
     1             NTRAJ, ISEGBR, KPBR0, INKPBR,
     2             NPMIN, NPMAX0, INPMAX,
     3             NSUC, NTRIAL, TOLREL, TOLABS, XRMIN, XRMAX,
     4             KPASCA, IRAND, INHP, IPRINT,
     5             XMIN, FMIN, NFEV, IOUT )
C
      RETURN
      END
      SUBROUTINE SIGMA ( N, X0, H, EPS, DX,
     1                   NTRAJ, ISEGBR, KPBR0, INKPBR,
     2                   NPMIN, NPMAX0, INPMAX,
     3                   NSUC, NTRIAL, TOLREL, TOLABS, XRMIN, XRMAX,
     4                   KPASCA, IRAND, INHP, IPRINT,
     5                   XMIN, FMIN, NFEV, IOUT )
C
C  THE SUBROUTINE  SIGMA  IS THE PRINCIPAL SUBROUTINE OF THE PACKAGE
C  SIGMA, WHICH ATTEMPTS TO FIND A GLOBAL MINIMIZER OF A REAL VALUED
C  FUNCTION  F(X) = F(X1,...,XN)  OF  N  REAL VARIABLES  X1,...,XN.
C  THE ALGORITHM AND THE PACKAGE ARE DESCRIBED IN DETAIL IN THE TWO
C  PAPERS PUBLISHED IN THE SAME ISSUE OF THE A.C.M. TRANSACTIONS ON
C  MATHEMATICAL SOFTWARE, BOTH BY
C     F. ALUFFI-PENTINI, V. PARISI, F. ZIRILLI.
C  (1)  A GLOBAL MINIMIZATION ALGORITHM USING STOCHASTIC DIFFERENTIAL
C       EQUATIONS
C  (2)  ALGORITHM SIGMA, A STOCHASTIC-INTEGRATION GLOBAL MINIMIZATION
C       ALGORITHM.
C  THE SOFTWARE IMPLEMENTATION AND ITS USAGE ARE DESCRIBED IN (2).
C
C  METHOD
C
C  A GLOBAL MINIMIZER OF  F(X)  IS SOUGHT BY MONITORING THE VALUES OF
C  F  ALONG TRAJECTORIES GENERATED BY A SUITABLE (STOCHASTIC) DISCRE-
C  TIZATION OF A FIRST-ORDER STOCHASTIC DIFFERENTIAL EQUATION INSPIRED
C  BY STATISTICAL MECHANICS. STARTING FROM AN INITIAL POINT  X0 ,
C  X  IS UPDATED BY THE (STOCHASTIC) DISCRETIZATION STEP
C       X = X + DX1 + DX2
C  WHERE  DX1 = - H * GAM           (FIRST HALF-STEP)
C         DX2 = EPS * SQRT(H) * U   (SECOND HALF-STEP)
C  AND  H  IS THE TIME-INTEGRATION STEPLENGTH,
C  GAM/N  IS COMPUTED AS A FINITE-DIFFERENCE APPROXIMATION TO THE
C     DIRECTIONAL DERIVATIVE OF  F  ALONG AN ISOTROPICALLY RANDOM
C     DIRECTION,
C  EPS  IS A POSITIVE 'NOISE' COEFFICIENT, AND
C  U  IS A RANDOM SAMPLE FROM AN N-DIMENSIONAL GAUSSIAN DISTRIBUTION.
C  WE CONSIDER THE SIMULTANEOUS EVOLUTION OF A GIVEN FIXED NUMBER
C  NTRAJ  OF TRAJECTORIES DURING AN OBSERVATION PERIOD IN WHICH FOR
C  EACH TRAJECTORY  EPS  IS FIXED WHILE  H  AND THE SPATIAL DISCRETI-
C  ZATION INCREMENT  DX  FOR COMPUTING  GAM  ARE AUTOMATICALLY
C  ADJUSTED BY THE ALGORITHM.
C  AFTER EVERY OBSERVATION PERIOD ONE OF THE TRAJECTORIES IS DISCARDED,
C  ALL OTHER TRAJECTORIES CONTINUE UNPERTURBED, AND ONE OF THEM IS SE-
C  LECTED FOR BRANCHING, I.E. GENERATING A SECOND PERTURBED CONTI-
C  NUATION, WITH DIFFERENT STARTING  EPS  AND  DX  (AND THE SAME
C  'PAST HISTORY' OF THE FIRST).
C  THE SET OF SIMULTANEOUS TRAJECTORIES IS CONSIDERED A SINGLE TRIAL,
C  AND THE COMPLETE ALGORITHM IS A SET OF REPEATED TRIALS.
C  A TRIAL IS STOPPED, AT THE END OF AN OBSERVATION PERIOD, AND AFTER
C  HAVING DISCARDED THE WORST TRAJECTORY, IF ALL THE FINAL VALUES OF
C  F  FOR THE REMAINING TRAJECTORIES ARE EQUAL (WITHIN NUMERICAL TO-
C  LERANCES, AND POSSIBLY AT DIFFERENT POINTS  X) TO THEIR MINIMUM
C  VALUE  FTFMIN ('UNIFORM STOP AT THE LEVEL  FTFMIN ').
C  A UNIFORM STOP IS CONSIDERED SUCCESSFUL ONLY IF THE FINAL VALUE
C  FTFMIN  IS (NUMERICALLY) EQUAL TO THE CURRENT BEST MINIMUM  FOPT
C  FOUND SO FAR FROM ALGORITHM START.
C  A TRIAL IS ALSO ANYWAY STOPPED (UNSUCCESSFULLY) IF A GIVEN MAXIMUM
C  NUMBER  NPMAX  OF OBSERVATION PERIODS HAS ELAPSED.
C  TRIALS ARE REPEATED WITH DIFFERENT OPERATING CONDITIONS (INITIAL
C  POINT, MAX TRIAL LENGTH  NPMAX , SEED OF NOISE GENERATOR, POLICY
C  FOR CHOOSING THE STARTING  EPS  FOR THE PERTURBED CONTINUATION,
C  AND TRIAL-START VALUE OF  EPS ).
C  THE OUTCOMES OF ALL THE COMPLETED TRIALS ARE SUMMARIZED BY
C  FTFOPT (THE BEST CURRENT MIMNIMUM VALUE FOUND SO FAR FOR
C  FTFMIN ) AND BY THE CURRENT COUNT  KSUC  OF SUCCESSFUL TRIALS
C  (WHICH IS ZERO AT ALGORITHM START, AND IS UPDATED AT EVERY
C  SUCCESSFULLY-STOPPING TRIALS).
C  THE ALGORITHM IS STOPPED, AT THE END OF A TRIAL, IF A REQUESTED
C  COUNT  NSUC  OF SUCCESSFUL TRIALS HAS BEEN REACHED,
C  OR ANYWAY IF A GIVEN MAXIMUM NUMBER  NTRIAL  OF TRIALS HAS BEEN
C  REACHED.
C  SUCCESS IS CLAIMED IF THE CURRENT COUNT  KSUC  OF SUCCESSFUL TRIALS
C  IS AT LEAST ONE, AND IF SUCH TRIALS ARE CURRENTLY VALID.
C
C  CALL STATEMENT
C
C  THE CALL STATEMENT IS
C     CALL SIGMA ( N, X0, H, EPS, DX,
C                  NTRAJ, ISEGBR, KPBR0, INKPBR,
C                  NPMIN, NPMAX0, INPMAX,
C                  NSUC, NTRIAL, TOLREL, TOLABS, XRMIN, XRMAX,
C                  KPASCA, IRAND, INHP, IPRINT,
C                  XMIN, FMIN, NFEV, IOUT )
C
C  CALL PARAMETERS
C
C  INPUT PARAMETERS ARE THOSE IN LINES 1,3,4,5 OF THE CALL STATEMENT,
C  INPUT-OUTPUT PARAMETERS ARE THOSE IN LINE 2,
C  OUTPUT PARAMETERS ARE THOSE IN LINE 6.
C  NOTE THAT A NUMBER OF OTHER (INTERNAL) PARAMETERS CAN BE OBTAINED
C  BY MEANS OF THE USER-SUPPLIED OUTPUT SUBROUTINES  PTSEG, PTRIAL,
C  AND  PTKSUC, WHICH ARE DESCRIBED BELOW.
C
C  DESCRIPTION OF THE CALL PARAMETERS
C
C  N        IS THE PROBLEM DIMENSION (NUMBER OF VARIABLES)
C  X0       IS AN  N-VECTOR CONTAINING THE INITIAL VALUES OF THE
C          X-VARIABLES
C  H       IS THE INITIAL VALUE OF THE TIME-INTEGRATION STEPLENGTH.
C  EPS     IS THE INITIAL VALUE OF THE NOISE COEFFICIENT.
C  DX      IS THE INITIAL VALUE OF THE MAGNITUDE OF THE DISCRETIZATION
C          INCREMENT FOR COMPUTING THE FINITE-DIFFERENCE DERIVATIVES.
C  NTRAJ   IS THE NUMBER OF SIMULTANEOUS TRAJECTORIES.
C          (NOTE HOWEVER THAT IF THE INPUT VALUE IS ZERO,  NTRAJ  IS
C          SET TO A DEFAULT VALUE (NTRAJ = 7), AND IF THE INPUT VALUE
C          IS OTHERWISE OUTSIDE THE INTERVAL (3,20) NTRAJ IS SET TO
C          THE NEAREST EXTREME VALUE).
C  ISEGBR, KPBR0, INKPBR  DETERMINE, AT THE END OF AN OBSERVATION
C          PERIOD, WHICH ONE OF THE SIMULTANEOUS TRAJECTORIES
C          IS TO BE BRANCHED, AS FOLLOWS.
C          BRANCHING IS NORMALLY PERFORMED ON THE TRAJECTORY WHICH
C          OCCUPIES THE PLACE  ISEGBR  IN THE TRAJECTORY SELECTION OR-
C          DERING, EXCEPT AT (THE END OF) EXCEPTIONAL OBSERVATION
C          PERIODS, WHERE THE FIRST TRAJECTORY IN THE ORDERING IS
C          BRANCHED. EXCEPTIONAL BRANCHING OCCURS AT THE OBSERVATION
C          PERIODS NUMBERED  KP = KPBR0 + J*INKPBR, (J = 1,2,3,...).
C          THEREFORE  ISEGBR  SELECTS THE LEVEL (IN THE ORDERING) AT
C          WHICH NORMAL BRANCHING OCCURS, WHILE  KPBR0  AND  INKPBR
C          SELECT THE FIRST OCCURRENCE AND THE REPETITION FREQUENCY
C          OF THE EXCEPTIONAL OBSERVATION PERIODS.
C          (NOTE HOWEVER THAT IF ONE OF THE INPUT VALUES IS ZERO,
C          THE CORRESPONDING VARIABLE IS SET TO A DEFAULT VALUE
C          ISEGBR = INT((1+NTRAJ)/2), INKPBR = 10, KPBR0 = 3.
C          IF THE INPUT VALUE FOR  ISEGBR  IS OTHERWISE OUTSIDE THE
C          INTERVAL  (1,NTRAJ),  ISEGBR  IS SET TO THE NEAREST
C          EXTREME VALUE, AND IF KPBR0  HAS A VALUE NOT INSIDE THE
C          INTERVAL  (1,INKPBR), IT IS ASSIGNED THE SAME VALUE
C          MODULO  INKPBR).
C  NPMIN   IS THE MINIMUM DURATION OF A TRIAL, I.E. THE MINIMUM
C          NUMBER OF OBSERVATION PERIODS THAT SHOULD ELAPSE BEFORE
C          STARTING TO CHECK THE TRIAL STOPPING CRITERIA.
C  NPMAX0  IS THE MAXIMUM DURATION OF THE FIRST TRIAL, I.E. THE
C          VALUE, FOR THE FIRST TRIAL, OF MAXIMUM ACCEPTABLE
C          NUMBER  NPMAX  OF OBSERVATION PERIODS IN A TRIAL.
C  INPMAX  IS THE INCREMENT FOR  NPMAX , WHEN  NPMAX  IS VARIED
C          FROM ONE TRIAL TO THE FOLLOWING ONE.
C  NSUC    IS THE REQUESTED NUMBER OF SUCCESSFUL TRIALS
C          AFTER WHICH THE COMPUTATION IS STOPPED.
C  TOLREL  AND  TOLABS  ARE THE RELATIVE AND ABSOLUTE TOLERANCES
C          FOR STOPPING A SINGLE TRIAL.
C  XRMIN,  XRMAX  ARE N-VECTORS DEFINING THE ADMISIBLE REGION FOR
C          THE X-VALUES, WITHIN WHICH THE FUNCTION VALUES CAN BE
C          SAFELY COMPUTED.
C  KPASCA  IS THE MINIMUM NUMBER OF TRAJECTORY SEGMENTS THAT SHOULD
C          ELAPSE BEFORE THE RESCALING PROCEDURES ARE ACTIVATED.
C  IRAND   IS A CONTROL INDEX FOR THE INITIALIZATION OF THE RANDOM
C          NUMBER GENERATOR.
C          IRAND.GT.0    THE GENERATOR IS INITIALIZED, BEFORE STAR-
C                        TING THE TRIAL  KT, WITH SEED  IRAND+KT-1
C          IRAND.LE.0    THE GENERATOR IS INITIALIZED (WITH SEED 0)
C                        ONLY AT THE FIRST CALL OF SIGMA
C  INHP    IS A CONTROL INDEX FOR SELECTING THE NUMBER  NHP  OF TIME-
C          INTEGRATION STEPS FOR OBSERVATION PERIOD  KP (DURATION OF
C          TRIAL  KP) AS FOLLOWS (LOG IS BASE 2)
C          INHP=1  NHP = 1 + INT(LOG(KP))      ('SHORT' DURATION)
C          INHP=2  NHP = INT(SQRT(KP))         ('MEDIUM' DURATION)
C          INHP=3  NHP = KP                    ('LONG' DURATION)
C  IPRINT  IS AN INDEX USED TO CONTROL THE AMOUNT OF PRINTED OUTPUT
C          BY CONTROLLING THE CALLS TO THE USER-SUPPLIED OUTPUT SUB-
C          ROUTINES  PTSEG  (END-OF-SEGMENT OUTPUT),  PTRIAL  (END-
C          OF-TRIAL OUTPUT), AND  PTKSUC (END-OF-TRIAL OUTPUT RELATED
C          TO THE COUNT OF SUCCESSFUL TRIALS), WHICH ARE DESCRIBED
C          BELOW.
C          IPRINT.LT.0   NO CALL TO THE OUTPUT SUBROUTINES
C          IPRINT.EQ.0   CALL ONLY  PTRIAL  AND  PTKSUC
C          IPRINT.GT.0   CALL ALL OUTPUT SUBROUTINES.
C  XMIN    IS AN N-VECTOR CONTAINING THE COORDINATES OF THE POINT
C          (OR POSSIBLY ONE OF THE POINTS) WHERE THE FINAL VALUE  FMIN
C          OF  FOPT  WAS FOUND.
C  FMIN    IS THE FINAL VALUE OF THE BEST CURRENT MINIMUM FUNCTION
C          VALUE  FOPT.
C  NFEV    IS THE TOTAL NUMBER OF FUNCTION EVALUATION (INCLUDING
C          THOSE USED FOR THE COMPUTATION OF DERIVATIVES, AND FOR
C          THE REJECTED TIME-INTEGRATION STEPS).
C  IOUT    IS THE INDICATOR OF THE STOPPING CONDITIONS, AS FOLLOWS
C          IF  IOUT = -99  A FATAL ERROR WAS DETECTED WHEN PERFOR-
C             MING SOME PRELIMINARY CHECKING OF THE INPUT DATA, AND
C             THE ALGORITHM WAS NOT EVEN STARTED
C          OTHERWISE THE ALGORITHM WAS STARTED, AND THE MEANING OF
C          IOUT  IS AS FOLLOWS
C          IF  IOUT.EQ.0  NO TRIAL HAD A UNIFORM STOP.
C          IF  IOUT.NE.0  THE SIGN AND THE MAGNITUDE OF  IOUT  HAVE
C          THE FOLLOWING MEANING
C          A) THE SIGN OF  IOUT  INDICATES IF THE BEST UNIFORM STOP
C          (I.E. THE ONE IN WHICH  FTFOPT  WAS OBTAINED)
C          IS TO BE CONSIDERED SUCCESSFUL (IOUT.GT.0) OR UNSUCCESSFUL
C          B) THE MAGNITUDE OF  IOUT  INDICATES WHICH ONE OF THE
C          NUMERICAL EQUALITY CRITERIA WAS SATISFIED IN THE BEST
C          UNIFORM STOP
C          IABS(IOUT).EQ.1  RELATIVE DIFFERENCE CRITERION
C          IABS(IOUT).EQ.2  ABSOLUTE DIFFERENCE CRITERION
C          IABS(IOUT).EQ.3  BOTH CRITERIA
C          (IOUT  IS THE FINAL VALUE OF THE INTERNAL PARAMETER  ISTOPT
C          (AN OUTPUT INDICATOR OF THE USER-SUPPLIED SUBROUTINE
C          PTRIAL )).
C          SUCCESS IS CLAIMED BY THE ALGORITHM IF  IOUT .GT. 0,
C          I.E. IF AT LEAST ONE OF THE TRIALS STOPPED SUCCESSFULLY
C          (I.E. WITH A POSITIVE VALUE OF THE TRIAL STOP INDICATOR
C          ISTOP ), AND THE SUCCESSFUL TRIALS (AS COUNTED BY  KSUC )
C          ARE CURRENTLY VALID.
C
C
C  USER-SUPPLIED SUPROGRAMS
C
C  THE USER MUST PROVIDE THE FUNCTION  FUNCT  TO COMPUTE  F(X),
C  AND THE THREE OUTPUT SUBROUTINE  PTSEG, PTRIAL, PTKSUC .
C  THE CALLS TO THE OUTPUT SUBROUTINES ARE CONTROLLED BY  IPRINT
C  (INPUT PARAMETER TO  SIGMA).
C  A USER NOT INTERESTED IN USING ANY ONE OF THE OUTPUT SUBROUTINES
C  CAN SIMPLY PUT  IPRINT = -1.
C  SAMPLE VERSIONS OF THE OUTPUT SUBROUTINES ARE PROVIDED
C  WITH THE PACKAGE FOR THE BENEFIT OF THE AVERAGE USER.
C  IN THE FOLLOWING DESCRIPTION ALL NON-INTEGER ARGUMENTS ARE
C  DOUBLE PRECISION (INTEGER ARGUMENTS ARE INDICATED BY MEANS OF THE
C  FORTRAN IMPLICIT TYPE DEFINITION CONVENTION).
C
C     THE FUNCTION  FUNCT
C
C     FUNCT  MUST RETURN AS ITS VALUE THE VALUE AT  X  OF THE FUNCTION
C     TO BE MINIMIZED
C     THE DEFINITION STATEMENT IS
C        DOUBLE PRECISION FUNCTION  FUNCT (N, X)
C     WHERE
C     N   IS THE (INPUT) DIMENSION OF THE PROBLEM.
C     X   IS THE (INPUT) N-VECTOR CONTAINING THE COORDINATES OF THE
C         POINT  X  WHERE THE FUNCTION IS TO BE COMPUTED.
C
C     THE SUBROUTINE  PTSEG
C
C     PTSEG  IS CALLED (IF  IPRINT.GT.0) AT THE END OF EVERY OBSER-
C     VATION PERIOD.
C     THE DEFINITION STATEMENT IS
C         SUBROUTINE  PTSEG ( N, XPFMIN, FPFMIN, FPFMAX,
C                                         KP, NFEV, IPRINT )
C     WHERE
C     N   IS THE (INPUT) DIMENSION OF THE PROBLEM
C     FPFMIN, FPFMAX  ARE RESPECTIVELY THE MINIMUM AND THE MAXIMUM
C        AMONG THE VALUES OF  F(X) OBTAINED AT THE FINAL POINTS OF
C        THE TRAJECTORY SEGMENTS OF THE (JUST ELAPSED) OBSERVATION
C        PERIOD  KP.
C     XPFMIN   IS AN N-VECTOR CONTAINING THE COORDINATES OF THE
C        (FINAL) POINT (OR POSSIBLY ONE OF THE POINTS) WHERE
C        FPFMIN WAS OBTAINED.
C     KP   IS THE TOTAL NUMBER OF ELAPSED OBSERVATION PERIODS IN
C        THE CURRENT TRIAL.
C     NFEV   IS THE TOTAL NUMBER OF FUNCTION EVALUATIONS PERFORMED
C        FROM ALGORITHM START.
C
C     THE SUBROUTINE  PTRIAL
C
C     PTRIAL  IS CALLED (IF IPRINT.GE.0) AT THE END OF EVERY TRIAL.
C     THE DEFINITION STATEMENT IS
C         SUBROUTINE PTRIAL ( N, XOPT, FOPT,
C                             FTFMIN, FTFMAX, FTFOPT,
C                             ISTOP, ISTOPT, NFEV, KP, IPRINT )
C     WHERE
C     N   IS THE (INPUT) DIMENSION OF THE PROBLEM.
C     XOPT   IS AN N-VECTOR CONTINING THE COORDINATES OF THE
C        POINT (OR POSSIBLY ONE OF THE POINTS) WHERE THE CURRENT
C        MINIMUM  FOPT  WAS OBTAINED.
C     FOPT   IS THE CURRENT BEST MINIMUM VALUE FOUND FOR  F  FROM
C        ALGORITHM START ( FOPT  IS UPDATED WHENEVER A FUNCTION
C        VALUE IS COMPUTED).
C     FTFMIN, FTFMAX   ARE RESPECTIVELY THE MINIMUM AND THE MAXIMUM
C        AMONG THE VALUES OF  F(X)  OBTAINED AT THE FINAL POINTS OF
C        THE LAST TRAJECTORY SEGMENTS OF THE CURRENT TRIAL.
C     FTFOPT   IS THE CURRENT MINIMUM VALUE OF  FTFMIN  AMONG THE
C        TRIALS WHICH DID NOT STOP FOR REACHING THE MAXIMUM ALLOWED
C        NUMBER OF SEGMENTS (STOPPING INDICATOR  ISTOP = 0, SEE
C        BELOW).  FTFOPT  IS USED BY  SIGMA  TO COMPUTE  KSUC  (INPUT
C        PARAMETER TO THE OUTPUT SUBROUTINE  PTKSUK , SEE BELOW).
C     KP   IS THE TOTAL NUMBER OF ELAPSED OBSERVATION PERIODS IN
C        THE CURRENT TRIAL.
C     NFEV   IS THE TOTAL NUMBER OF FUNCTION EVALUATIONS PERFORMED
C        FROM ALGORITHM START.
C     ISTOP   IS THE INDICATOR OF THE STOPPING CONDITION OF THE TRIAL,
C        AS FOLLOWS
C        ISTOP = 0
C           THE MAXIMUM NUMBER  NPMAX  OF OBSERVATION PERIODS HAS
C           BEEN REACHED.
C        ISTOP.NE.0
C           ALL THE END-OF-SEGMENT VALUES OF  F(X) , (EXCEPT FOR THE
C           JUST DISCARDED SEGMENT) ARE CLOSE ENOUGH TO THEIR COMMON
C           MINIMUM VALUE  FPFMIN , WITH RESPECT TO AN ABSOLUTE OR
C           RELATIVE DIFFERENCE CRITERION, TO BE CONSIDERED NUMERI-
C           CALLY EQUAL.
C           THE ABSOLUTE VALUE AND THE SIGN OF  ISTOP  HAVE THE
C           FOLLOWING MEANING.
C              THE ABSOLUTE VALUE INDICATES WHICH DIFFERENCE
C                 CRITERION WAS SATISFIED
C                 1   RELATIVE DIFFERENCE CRITERION SATISFIED
C                 2   ABSOLUTE DIFFERENCE CRITERION SATISFIED
C                 3   BOTH CRITERIA SATISFIED
C              THE SIGN OF  ISTOP  INDICATES THE RELATIONSHIP BETWEEN
C                 THE END-OF-TRIAL VALUE  FPFMIN  AND THE CURRENT
C                 BEST MINIMUM VALUE  FOPT  (WHICH IS UPDATED WHEN-
C                 EVER A FUNCTION  VALUE IS COMPUTED
C                 ISTOP.GT.0
C                    FPFMIN  IS NUMERICALLY EQUAL (W.R.T. AT LEAST
C                    ONE OF THE ABOVE  DIFFERENCE CRITERIA) TO  FOPT
C                 ISTOP.LT.0
C                    FPFMIN  IS NOT EVEN NUMERICALLY EQUAL TO  FOPT
C                    (AND THEREFORE CANNOT BE CONSIDERED AS AN
C                    ACCEPTABLE GLOBAL MINIMUM).
C     ISTOPT   IS THE VALUE OF THE TRIAL STOPPING INDICATOR  ISTOP
C        CORRESPONDING TO THE (CURRENT OR PAST) TRIAL WHERE  FTFOPT
C        WAS OBTAINED, WITH THE SIGN WHICH IS UPDATED ACCORDING TO
C        THE COMPARISON BETWEEN  FTFOPT  AND THE PRESENT VALUE OF
C        FOPT , AS DESCRIBED ABOVE.
C        THE FINAL VALUE OF  ISTOP IS RETURNED BY  SIGMA  AS THE VALUE
C        OF THE OUTPUT INDICATOR IOUT OF THE ALGORITHM STOPPING CON-
C        DITIONS (WHENEVER THE ALGORITHM WAS STARTED, IOUT.NE.-99,
C        SEE ABOVE).
C
C     THE SUBROUTINE  PTKSUC
C
C     PTKSUC  IS CALLED ONLY AT THE END OF EVERY SUCCESSFUL TRIAL
C     SUCH THAT AN INCREMENT OCCURRED IN THE VALUE OF THE
C     CURRENT MAXIMUM  MSUC  AMONG ALL THE VALUES OF  KSUC  FROM
C     ALGORITHM START. A CALL TO  PTKSUC  THEREFORE PROVIDES
C     THE USER WITH THE OPERATIONALLY INTERESTING INFORMATION THAT
C     ALGORITHM STOP WOULD HAVE TAKEN PLACE, IF  NSUC  (INPUT
C     PARAMETER TO  SIGMA ) HAD BEEN GIVEN A LOWER VALUE, EQUAL TO
C     THE CURRENT  KSUC .
C     PTKSUC  IS CALLED ONLY IF  IPRINT.GE.0  AND  KSUC.LT.NSUC  .
C     THE DEFINITION STATEMENT IS
C         SUBROUTINE  PTKSUC ( KSUC )
C     WHERE  KSUC  IS THE CURRENT COUNT OF SUCCESSFUL TRIALS
C     (1 .LE. KSUC .LE. NSUC)
C
      DOUBLE PRECISION X0,H,EPS,DX,TOLREL,TOLABS
      DOUBLE PRECISION XRMIN,XRMAX,XMIN,FMIN
      DOUBLE PRECISION EPSAG,EPSAP,EPSC
      DOUBLE PRECISION EPSMAX,EPSR,F,FOPT,FTFMAX
      DOUBLE PRECISION FTFMIN,FTFOPT
C
      DOUBLE PRECISION X,HC,DXC,VMVT,EPSCO,VMCOR,VCOR
      DOUBLE PRECISION XRMIC,XRMAC,XOPT,FOPTC
C
      DOUBLE PRECISION DIST,BIAS,GRAGRA,GRA
C
      DIMENSION X0(N),XMIN(N),XRMIN(N),XRMAX(N)
C
      COMMON /DINCOM/ X(100,20),HC(20),DXC(20),VMVT(20,19),EPSCO(20),
     1    VMCOR(20),VCOR(20),XRMIC(100),XRMAC(100),XOPT(100),FOPTC,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJC,NTRAJR,
     3    ISEGBC,INKPBC,KPBR0C,NCF,IFEPC,INHPC
C
      COMMON /SCALE/ DIST(10,10,20),BIAS(10,20),GRAGRA(10,10,20),
     1    GRA(10,20),NGRA(20),LSCA,IDSCA,NX,NORD
C
C  DATA FOR THE VARIATION OF NOISE COEFFICIENT
C
      DATA EPSR/1.D4/,EPSAP/10.D0/,EPSAG/1.D3/
      DATA EPSMAX/1.D15/
C
      IFEP = 1
C
C  INITIALIZE COMMON AREA  /DINCOM/
C
      CALL INIT(N,X0,H,EPS,DX,IRAND,F,
     1    NTRAJ,ISEGBR,INKPBR,KPBR0,INHP,IFEP,XRMIN,XRMAX,IOUT)
C
C  CHECK PARAMETER VALUES
C
      IF(NPMIN.LE.0.OR.NPMAX0.LT.0.OR.INPMAX.LE.0.OR.
     1    NSUC.LE.0.OR.NTRIAL.LE.0)IOUT = -99
      IF (IOUT.EQ.(-99))RETURN
C
C  INITIALIZE VARIABLES
C
      EPSC = EPS
      NPMAX = NPMAX0
      ISTOPT = 0
      ISTOP = 0
      ICCOM = (NTRIAL+NTRIAL+4)/5
      NFEV = 0
      NTES = NSUC
      ICTS = NSUC-1
      FTFOPT = F
C
C  START SERIES OF TRIALS
C
      DO 30 IC = 1,NTRIAL
C
C  SET INITIALIZATION INDEX FOR NOISE GENERATOR
C
         IS = 0
         IF(IRAND.GT.0)IS = IRAND+IC-1
C
C  INITIALIZE TRIAL
C
         IF(IC.GT.1.AND.IC.LE.ICCOM)CALL REINIT(N,X0,EPSC,IS,F,IFEP)
         IF(IC.GT.ICCOM)CALL REINIT(N,XMIN,EPSC,IS,FOPT,IFEP)
C
         FTFMIN = F
         FTFMAX = F
         NFEV = NFEV+1
C
C  PRINT INITIAL CONDITIONS OF TRIAL
C
         IF(IPRINT.GT.0)CALL PTSEG(N,X0,FTFMIN,FTFMAX,0,NFEV)
C
C
C  DEACTIVATE SCALING
C
         IF(KPASCA.GT.NPMAX.OR.N.LE.1)CALL NOSCA
C
C  INITIALIZE COMMON AREA  /SCALE/
C
         IF(KPASCA.LE.NPMAX.AND.N.GT.1)CALL INISCA(N,NTRAJ)
C
C  PERFORM A TRIAL
C
         CALL TRIAL(N,NPMIN,NPMAX,KPASCA,TOLREL,TOLABS,
     1       IPRINT,XMIN,FTFMIN,
     1       FTFMAX,NFEV,KP,ISTOP)
C
C
C     EVALUATE PAST TRIAL AND PREPARE NEXT TRIAL
C
C
C  SET TRIAL DURATION
C
         IF(ISTOP.EQ.0)NPMAX = NPMAX+INPMAX
C
C  RESET CURRENT NUMBER OF SUCCESSES REQUIRED BEFORE STOPPING
C  COMPUTE INDICATOR OF TRIAL STOPPING CONDITIONS
C  UPDATE BEST CURRENT VALUES OF TRIAL STOPPING INDICATOR AND
C  OF FUNCTION  F(X)  AT TRIAL STOP
C
         IF((FTFMIN.GT.FTFOPT.OR.ISTOP.EQ.0).AND.ISTOPT.NE.0)GO TO 10
         IF(ITOLCH(FTFOPT,FTFMIN,TOLREL,TOLABS).EQ.0)NTES = NSUC
C
         FTFOPT = FTFMIN
         ISTOPT = ISTOP
  10     CONTINUE
         ISTOPT = IABS(ISTOPT)
         CALL RCLOPT(N,XMIN,FOPT)
         IF(ITOLCH(FTFOPT,FOPT,TOLREL,TOLABS).EQ.0)ISTOPT = -ISTOPT
         IF(ITOLCH(FTFMIN,FOPT,TOLREL,TOLABS).EQ.0)ISTOP = -ISTOP
C
C  END-OF-TRIAL PRINT OUT
C
         IF(IPRINT.GE.0)
     1      CALL PTRIAL ( N, XOPT, FOPT,
     2                    FTFMIN, FTFMAX, FTFOPT,
     3                    ISTOP, ISTOPT, NFEV, KP, IPRINT )
C
C  UPDATE INITIAL VALUE OF NOISE COEFFICIENT FOR NEXT TRIAL
C
         IF (ISTOP.EQ.0)EPSC = EPSC/EPSR
         IF(ISTOP.GT.0)EPSC = EPSC*EPSAG
         IF(ISTOP.LT.0.AND.IC.LE.ICCOM)EPSC = EPSC*EPSAP
         IF(ISTOP.LT.0.AND.IC.GT.ICCOM)EPSC = EPSC/EPSR
C
C  UPDATE OPERATING CONDITIONS FOR SELECTING (IN THE NEXT TRIAL)
C  THE STARTING VALUE OF THE NOISE COEFFICIENT OF THE NEW TRAJECTORY
C  AFTER BRANCHING
C
         IF (ISTOP.EQ.0)IFEP = 1
         IF (ISTOP.NE.0)IFEP = 2
C
C  UPDATE, PRINT, AND CHECK TRIAL STOPPING CONDITIONS
C
         IF(ISTOP.GT.0.AND.ISTOPT.GT.0)NTES = NTES-1
         IF(NTES.LE.0.OR.ISTOPT.LE.0.OR.ISTOP.LE.0.OR.NTES.GT.ICTS.OR.
     1       IPRINT.LT.0) GO TO 20
         KSUC = NSUC-ICTS
         CALL PTKSUC(KSUC)
         ICTS = NTES-1
  20     CONTINUE
         IF(NTES.LE.0.AND.ISTOPT.GT.0.AND.ISTOP.GT.0)GO TO 40
C
C  CONSTRAIN NOISE COEFFICIENT WITHIN BOUNDS
C
         EPSC = DMIN1(EPSC,EPSMAX)
         IF(EPSC.LE.0.D0)EPSC = 1.D0
  30     CONTINUE
C  END OF SERIES OF TRIALS
C
  40  CONTINUE
C
C  INDICATOR OF STOPPING CONDITIONS
C
      IOUT = ISTOPT
      FMIN = FOPT
C
      RETURN
C
      END
      SUBROUTINE INIT(NX,X0,H0,EPS0,DX0,IRAND,F,N1,N2,N3,N4
     1    ,INH,IFE,XRI,XRA,IT)
C
C  INIT  PERFORMS THE INITIALIZATION OF THE FIRST TRIAL.
C  THE PART OF THE INITIALIZATION WHICH IS COMMON ALSO TO THE TRIALS
C  FOLLOWING THE FIRST ONE IS PERFORMED BY CALLING THE SUBROUTINE
C  REINIT.
C
      DOUBLE PRECISION X0,H0,EPS0,DX0,F,XRI,XRA
      DOUBLE PRECISION FUNCT
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
      DIMENSION X0(NX),XRI(NX),XRA(NX)
      DATA NPMAX/100/
      DATA NTRAJM/20/
      DATA NTRAJ0/7/
      DATA INKPB0/10/
      DATA KPBR00/3/
C
C CHECK PARAMETER VALUES
C
      IT = 0
      IF (NX.GT.NPMAX.OR.NX.LT.1.OR.H0.LE.0.D0.OR.EPS0.LE.0.D0
     1    .OR.DX0.LE.0.D0) IT = -99
      IF (IT.EQ.(-99)) RETURN
C
C INITIALIZE SOME VARIABLES
C
      INHP = INH
      DO 10 IX = 1,NX
         XRMIN(IX) = XRI(IX)
         XRMAX(IX) = XRA(IX)
  10     CONTINUE
      CALL NOSCA
      NTRAJ = N1
      IF(NTRAJ.EQ.0)NTRAJ = NTRAJ0
      NTRAJ = MIN0(NTRAJ,NTRAJM)
      NTRAJ = MAX0(NTRAJ,3)
      N1 = NTRAJ
      ISEGBR = N2
      IF(ISEGBR.EQ.0)ISEGBR = (1+NTRAJ)/2
      ISEGBR = MIN0(ISEGBR,NTRAJ)
      ISEGBR = MAX0(ISEGBR,1)
      N2 = ISEGBR
      INKPBR = N3
      IF(INKPBR.EQ.0)INKPBR = INKPB0
      N3 = INKPBR
      KPBR0 = N4
      IF(KPBR0.EQ.0)KPBR0 = KPBR00
      KPBR0 = MOD(KPBR0,INKPBR)
      N4 = KPBR0
      NDIM = NX
      NTRAJR = NTRAJ-1
      NCF = 1
      F = FUNCT(NX,X0)
      CALL STOOPT(NX,X0,F)
      DO 20 ID = 1,NTRAJ
         H(ID) = H0
         DX(ID) = DX0
  20     CONTINUE
C
C INITIALIZE REMAINING VARIABLES
C
      CALL REINIT(NX,X0,EPS0,IRAND,F,IFE)
C
      RETURN
      END
      SUBROUTINE REINIT(NX,X0,EPS0,IRAND,F,IFE)
C
C  REINIT  PERFORMS THE INITIALIZATION OF ALL TRIALS FOLLOWING THE
C  FIRST TRIAL, AND PART OF THE INITIALIZATION OF THE FIRST TRIAL.
C
      DOUBLE PRECISION X0,EPS0,F
      DOUBLE PRECISION EPSV,G
      DOUBLE PRECISION CHAOS
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
      DIMENSION X0(NX)
      DATA EPSV/1.D0/
C
C INITIALIZE RANDOM NOISE GENERATOR
C
      G = CHAOS(IRAND)
C
      IFEP = IFE
      KGEN = 0
      KTIM = 0
      DO 30 ID = 1,NTRAJ
         DO 10 IC = 1,NDIM
            X(IC,ID) = X0(IC)
  10        CONTINUE
         IE(ID) = 0
         DO 20 IT = 1,NTRAJR
            ISVT(ID,IT) = 1
            VMVT(ID,IT) = F
  20        CONTINUE
         EPS(ID) = EPS0*EPSV**(ISEGBR-ID)
         VMCOR(ID) = F
         VCOR(ID) = F
  30     CONTINUE
      RETURN
      END
      SUBROUTINE TRIAL(N,NPMIN,NPMAX,KPASCA,
     1    TOLREL,TOLABS,IPRINT,XMIN,FMIN,
     2    FMAX,NFEV,NR,ISTOP)
C
C  THE SUBROUTINE  TRIAL  GENERATES A TRIAL, I.E. A SET OF COMPLETE
C  SIMULTANEOUS TRAJECTORIES BY REPEATEDLY PERFORMING
C     A CALL TO THE SUBROUTINE  GENEVA  WHICH GENERATES THE SET OF
C        SIMULTANEOUS TRAJECTORY SEGMENTS CORRESPONDING TO THE CURRENT
C        OBSERVATION PERIOD, AND PERFORMS THE TRAJECTORY SELECTION
C     A (POSSIBLE) CALL TO THE SUBROUTINE  PTSEG  WHICH PERFORMS
C        END-OF-SEGMENT OUTPUT
C     A CHECK OF THE TRIAL STOPPING CRITERIA (WITH THE AID OF THE
C        FUNCTION  ITOLCH
C     A DECISION ABOUT ACTIVATING OR DEACTIVATING THE SCALING OF
C        THE VARIABLES (ACTIONS PERFORMED BY CALLING THE SUBROUTINES
C        ACTSCA  AND  NOSCA).
C
      DOUBLE PRECISION TOLREL,TOLABS,XMIN,FMIN,FMAX
      DIMENSION XMIN(N)
      DATA IRNF/7/
C
      DO 20 IR = 1,NPMAX
C
C ACTIVATE SCALING
C
         IF(IR.GE.KPASCA.AND.IR.GT.N*IRNF)CALL ACTSCA
         NR = IR
C
C GENERATE AND EVALUATE THE SIMULTANEOUS TRAJECTORY SEGMENTS
C PERIOD
C
         CALL GENEVA(N,XMIN,FMIN,FMAX,NFEV)
C
C PRINT RESULTS OF OBSERVATION PERIOD
C
         IF(IPRINT.GT.0)CALL PTSEG(N,XMIN,FMIN,FMAX,IR,NFEV)
C
C CHECK TRIAL STOPPING CONDITIONS
C
         IF(IR.LT.NPMIN)GO TO 10
         ISTOP = ITOLCH(FMAX,FMIN,TOLREL,TOLABS)
         IF(ISTOP.NE.0)GO TO 30
C
  10     CONTINUE
  20     CONTINUE
  30  CONTINUE
      CALL NOSCA
C
      RETURN
      END
      SUBROUTINE GENEVA(NX,XMIN,FMIN,FMAX,NCEF)
C
C  GENEVA  PERFORMS THE GENERATION AND THE FINAL PROCESSING AND
C  EVALUATION OF THE SET OF TRAJECTORY SEGMENTS CORRESPONDING TO
C  THE CURRENT OBSERVATION PERIOD.
C  GENEVA  UPDATES THE SCALING ARRAYS  DIST  AND  BIAS  BY CALLING
C             THE SUBROUTINES  SEGSCA  AND  UPDSCA
C          GENERATES THE TRAJECTORY SEGMENTS BY CALLING THE SUB-
C             ROUTINE  PERIOD
C          DETERMINES SOME END-OF-SEGMENT RESULTS  (FPFMIN, FPFMAX,
C             XPFMIN)  USING THE RESCALING CAPABILITIES OF THE SUB-
C             ROUTINES  SEGSCA  AND  VARSCA.
C
      DOUBLE PRECISION XMIN,FMIN,FMAX
      DOUBLE PRECISION FM
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
      DIMENSION XMIN(NX)
C
C UPDATE SCALING DATA
C
      DO 10 ID = 1,NTRAJ
         CALL SEGSCA(ID)
         CALL UPDSCA(NX,X(1,ID))
  10     CONTINUE
C
C GENERATE THE SIMULTANEOUS TRAJECTORY SEGMENTS
C
      CALL PERIOD
C
C EXTRACT AND RESCALE SOME FINAL VALUES
C
      FM = VCOR(1)
      FMAX = VCOR(1)
      IFM = 1
      DO 30 ID = 2,NTRAJ
         FMAX = DMAX1(FMAX,VCOR(ID))
         IF(VCOR(ID).GE.FM)GO TO 20
         FM = VCOR(ID)
         IFM = ID
  20     CONTINUE
  30     CONTINUE
      DO 40 IC = 1,NDIM
         XMIN(IC) = X(IC,IFM)
  40     CONTINUE
      FMIN = FM
      NCEF = NCF
      CALL SEGSCA(IFM)
      CALL VARSCA(NX,XMIN)
C
      RETURN
      END
      SUBROUTINE PERIOD
C
C  PERIOD  IS CALLED BY SUBROUTINE  GENEVA  TO PERFORM THE GENERATION
C  OF THE TRAJECTORY SEGMENTS.
C  PERIOD  - COMPUTES THE DURATION OF THE OBSERVATION PERIOD, I.E. THE
C              NUMBER  NHP  OF ACCEPTED INTEGRATION STEPS IN A PERIOD
C          - COMPUTES ALL THE SEGMENT STEPS BY REPEATEDLY CALLING THE
C              SUBROUTINE  STEP
C          - PERFORMS THE SEGMENT SELECTION BY CALLING THE SUBROUTINE
C               BRASI
C
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
C
C DETERMINE DURATION OF OBSERVATION PERIOD
C (NUMBER OF TIME INTEGRATION STEPS)
C
      KGEN = KGEN+1
      NKGEN = 1
      IF(INHP.EQ.1)NKGEN=
     1    INT(SNGL(DLOG(DBLE(FLOAT(KGEN))+.5D0)/DLOG(2.D0)))+1
      IF(INHP.EQ.2)NKGEN = INT(SNGL(DSQRT(DBLE(FLOAT(KGEN))+.5D0)))
      IF(INHP.EQ.3)NKGEN = KGEN
C
C PERFORM THE REQUIRED NUMBER OF INTEGRATION STEPS
C (FOR ALL TRAJECTORIES)
C
      DO 10 IK = 1,NKGEN
C
C PERFORM A SINGLE INTEGRATION STEP
C (FOR ALL TRAJECTORIES)
C
         CALL STEP(IK)
  10     CONTINUE
C
C MANAGE THE TRAJECTORY BRANCHING PROCESS
C
      CALL BRASI
      RETURN
      END
      SUBROUTINE BRASI
C
C  BRASI  PERFORMS THE SELECTION PROCESS FOR THE TRAJECTORIES
C  BRASI  - UPDATES THE DATA ABOUT THE PAST TRAJECTORIES
C         - ASKS FOR THE TRAJECTORY-SELECTION ORDERING BY CALLING THE
C              SUBROUTINE  ORDER
C         - DISCARDS ONE OF THE TRAJECTORIES
C         - PERFORMS BRANCHING ON ONE OF THE REMAINING TRAJECTORIES
C         - MOVES THE DATA OF THE UNPERTURBED CONTINUATION
C              TO THE POSITION OF THE PERTURBED CONTINUATION
C         - CALLS THE SUBROUTINE  COMPAS  TO EXAMINE DATA ABOUT PAST
C              HISTORY OF THE TRAJECTORIES AND DISCARD IRRILEVANT DATA
C
      DOUBLE PRECISION DFAC,DLEPMX,DLFACL
      DOUBLE PRECISION EFAC,EPSMAX,FACG
      DOUBLE PRECISION CHAOS
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
C
      DATA FACG/10.D0/
      DATA EFAC/.5D0/
      DATA DFAC/1.D3/
      DATA EPSMAX/1.D15/
      DATA DLFACL /0.301029995663981194D0/
      DATA DLEPMX /25.D0/
C
C UPDATE PAST HISTORY DATA
C
      DO 10 ID = 1,NTRAJ
         VMVT(ID,NTRAJR) = VMCOR(ID)
         ISVT(ID,NTRAJR) = ID
  10     CONTINUE
C
C OBTAIN TRAJECTORY-SELECTION ORDERING
C
      CALL ORDER(IP,IM,IU)
C
C DECIDE WHICH TRAJECTORY IS TO BE BRANCHED
C
      IF(MOD(KGEN,INKPBR).EQ.KPBR0)IM = IP
C
C PERFORM BRANCHING
C
      DO 20 IC = 1,NDIM
         X(IC,IU) = X(IC,IM)
  20     CONTINUE
      H(IU) = H(IM)
      IE(IU) = IE(IM)
      DO 30 IT = 1,NTRAJR
         ISVT(IU,IT) = ISVT(IM,IT)
         VMVT(IU,IT) = VMVT(IM,IT)
  30     CONTINUE
      EPS(IU) = EPS(IM)
      DX(IU) = DX(IM)
      VCOR(IU) = VCOR(IM)
      DO 40 ID = 1,NTRAJ
         VMCOR(ID) = VCOR(ID)
  40     CONTINUE
C
C UPDATE PAST-HISTORY-DATA MATRICES
C
      CALL COMPAS
C
C UPDATE SCALING DATA
C
      CALL MOVSCA(IU,IM)
C
C UPDATE NOISE COEFFICIENT VALUES
C
      IF (EPS(IU).LE.0.D0) GO TO 50
      IF(IFEP.EQ.2)
     1    EPS(IU) = EPS(IU)*FACG**(CHAOS(0)-EFAC)
      IF(IFEP.EQ.1)
     1    EPS(IU) = FACG**(DMIN1(DLEPMX,
     1    DLOG10(EPS(IU))+(CHAOS(-1)-EFAC)*DLFACL))
      EPS(IU) = DMIN1(EPS(IU),EPSMAX)
  50  CONTINUE
C
C UPDATE MAGNITUDE OF SPATIAL DISCRETIZATION INCREMENT
C
      DX(IU) = DX(IU)*DFAC**CHAOS(0)
      RETURN
      END
      SUBROUTINE ORDER(IP,IM,IU)
C
C  ORDER  COMPARES THE TRAJECTORIES FROM THE POINT OV VIEW OF PAST
C  HISTORY (BY CALLING THE FUNCTION  IPREC ) AND FROM THE POINT OF VIEW
C  OF THEIR CURRENT VALUE OF  EPS  (BY CALLING THE FUNCTION  IPRECE)
C  AND PROVIDES THE TRAJECTORY ORDERING NEEDED FOR SELECTING THE TRA-
C  JECTORY WHICH IS TO BE BRANCHED.
C
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
      DIMENSION IORD(20)
      DATA KP/0/
      IR = 0
C
C ASSIGN INITIAL ORDERING
C
  10  CONTINUE
      DO 20 I = 1,NTRAJ
         IORD(I) = I
  20     CONTINUE
C
C SORT TRAJECTORIES ...
C
  30  CONTINUE
      IR = IR+1
C
      DO 60 I = 1,NTRAJR
         I1 = I+1
         DO 50 J = I1,NTRAJ
            K1 = IORD(I)
            K2 = IORD(J)
C
C ... ACCORDING TO PAST HISTORY ...
C
            IF(IR.NE.2)KP = IPREC(K1,K2)
            IF(KP.EQ.0.AND.IR.EQ.1)GO TO 10
C
C ... OR ACCORDING TO NOISE LEVEL
C
            IF(IR.EQ.2)KP = IPRECE(K1,K2)
            IF(KP.EQ.0)GO TO 40
            KM = K1+K2-KP
            IORD(I) = KP
            IORD(J) = KM
  40        CONTINUE
  50        CONTINUE
  60     CONTINUE
      IF(IR.EQ.2)GO TO 30
C
C RETURN THE INDICES OF THE SEGMENTS WHICH IN THE ORDERING
C OCCUPY THE FIRST, THE LAST, AND A SUITABLE MEDIUM LEVEL POSITION
C
      IP = IORD(1)
      IU = IORD(NTRAJ)
      IM = IORD(ISEGBR)
C
      RETURN
      END
      INTEGER FUNCTION IPREC(ID1,ID2)
C
C  IPREC  DETERMINES THE PRECEDENCE RELATION BETWEEN TWO TRAJECTORIES
C  BASED ON THE PAST HISTORY DATA
C
      DOUBLE PRECISION VM1,VM2
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
C
      VM1 = VMVT(ID1,NTRAJR)
      VM2 = VMVT(ID2,NTRAJR)
      DO 10 IIT = 1,NTRAJR
         IT = 1+NTRAJR-IIT
         IF(ISVT(ID1,IT).EQ.ISVT(ID2,IT))GO TO 20
         VM1 = DMIN1(VM1,VMVT(ID1,IT))
         VM2 = DMIN1(VM2,VMVT(ID2,IT))
  10     CONTINUE
  20  CONTINUE
      IPREC = 0
      IF(VM2.LT.VM1)IPREC = ID2
      IF(VM2.GT.VM1)IPREC = ID1
C
      RETURN
      END
      INTEGER FUNCTION IPRECE(ID1,ID2)
C
C  IPRECE  DETERMINES THE PRECEDENCE RELATION BETWEEN TWO TRAJECTORIES
C  BASED ON THEIR CURRENT VALUE OF  EPS
C
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
      IPRECE = 0
      IF(KGEN.GT.ISEGBR*INKPBR)GO TO 10
      IF(EPS(ID2).LT.EPS(ID1))IPRECE = ID1
      IF(EPS(ID2).GT.EPS(ID1))IPRECE = ID2
      RETURN
C
  10  CONTINUE
      IF(EPS(ID2).LT.EPS(ID1))IPRECE = ID2
      IF(EPS(ID2).GT.EPS(ID1))IPRECE = ID1
C
      RETURN
      END
      SUBROUTINE COMPAS
C
C  COMPAS  TAKES CARE OF THE STORAGE OF PAST HISTORY DATA, DISCARDING
C  ALL DATA NOT NEEDED BY THE ONLY USER OF SUCH DATA, THE FUNCTION
C  IPREC .
C
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
C
      IT1 = 1
      DO 30 IT = 2,NTRAJR
         IT1 = IT-1
         DO 10 ID = 1,NTRAJ
            IF(ISVT(ID,IT).NE.ISVT(ID,IT1))GO TO 20
  10        CONTINUE
         GO TO 120
  20     CONTINUE
  30     CONTINUE
      IT1 = 1
      NCV = 0
      DO 50 ID = 1,NTRAJ
         DO 40 IDD = 1,NTRAJ
            IF(ISVT(ID,IT1).EQ.ISVT(IDD,IT1))NCV = NCV+1
  40        CONTINUE
  50     CONTINUE
      DO 80 IT = 2,NTRAJR
         IT1 = IT-1
         NCN = 0
         DO 70 ID = 1,NTRAJ
            DO 60 IDD = 1,NTRAJ
               IF(ISVT(ID,IT).EQ.ISVT(IDD,IT))NCN = NCN+1
  60           CONTINUE
  70        CONTINUE
         IF(NCN.EQ.NCV)GO TO 110
         NCV = NCN
  80     CONTINUE
      DO 90 ID = 1,NTRAJ
         IF(ISVT(1,1).NE.ISVT(ID,1))GO TO 100
  90     CONTINUE
      IT = 2
      GO TO 140
 100  CONTINUE
 110  CONTINUE
 120  CONTINUE
      IT = IT1+1
      DO 130 ID = 1,NTRAJ
         VMVT(ID,IT) = DMIN1(VMVT(ID,IT),VMVT(ID,IT1))
 130     CONTINUE
 140  CONTINUE
      DO 160 ITC = IT,NTRAJR
         ITM = ITC-1
         DO 150 ID = 1,NTRAJ
            VMVT(ID,ITM) = VMVT(ID,ITC)
            ISVT(ID,ITM) = ISVT(ID,ITC)
 150        CONTINUE
 160     CONTINUE
C
      RETURN
      END
      SUBROUTINE STEP(IK)
C
C  STEP  PERFORMS A SINGLE TIME-INTEGRATION STEP FOR EACH ONE OF THE
C  SIMULTANEOUS TRAJECTORIES BY REPEATEDLY CALLING THE SUBROUTINE  SSTEP
C
      DOUBLE PRECISION F
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      DOUBLE PRECISION XID,HID,EPSID,DXID
      DIMENSION XID(100)
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
C
      KTIM = KTIM+1
C
C LOOP ON THE SIMULTANEOUS TRAJECTORY SEGMENTS
      DO 30 ID = 1,NTRAJ
C
C INFORM THE SCALING SUBPROGRAMS (VIA THE COMMON AREA /SCALE/)
C THAT SCALING OPERATIONS ARE TO BE PERFORMED ON SEGMENT  ID .
         CALL SEGSCA(ID)
         F = VCOR(ID)
C
C PERFORM A TIME-INTEGRATION STEP ON SEGMENT  ID .
         KA = KTIM
         NX = NDIM
         DO 10 IX = 1,NX
            XID(IX) = X(IX,ID)
  10        CONTINUE
         HID = H(ID)
         EPSID = EPS(ID)
         DXID = DX(ID)
         IEID = IE(ID)
C
         CALL SSTEP(KA,NX,XID,HID,EPSID,DXID,IEID,F)
C
         DO 20 IX = 1,NX
            X(IX,ID) = XID(IX)
  20        CONTINUE
         H(ID) = HID
         EPS(ID) = EPSID
         DX(ID) = DXID
         IE(ID) = IEID
         VCOR(ID) = F
         VMCOR(ID) = DMIN1(VMCOR(ID),F)
         IF(IK.EQ.1)VMCOR(ID) = F
         IF(KTIM.EQ.1)IE(ID) = 0
  30     CONTINUE
C
      RETURN
      END
      SUBROUTINE SSTEP(KTIM,NDIM,X,H,EPS,DX,IE,F)
C
C  THE BASIC TIME-INTEGRATION STEP FOR A GIVEN TRAJECTORY IS PERFORMED
C  BY THE SUBROUTINE  STEP  WHICH
C   - CALLS THE FUNCTION  FUNCT0  TO COMPUTE THE VALUE OF  F
C   - CALLS THE SUBROUTINE  UNITRV  TO COMPUTE THE RANDOM DIRECTION
C        ALONG WHICH THE DIRECTIONAL DERIVATIVE  GAM/N  IS TO BE
C        COMPUTED
C   - CALLS THE SUBROUTINE  DERFOR (OR DERCEN ) TO COMPUTE THE FORWARD-
C        (OR CENTRAL-) DIFFERENCES DIRECTIONAL DERIVATIVE  GAM/N
C   - CALLS THE SUBROUTINE  NEWH  TO ACCEPT OR REJECT THE FIRST HALF-
C        STEP AND OBTAIN AN UPDATED VALUE FOR  H
C   - CALLS THE SUBROUTINE  CUMSCA  TO UPDATE THE CUMULATED SCALING DATA
C   - UPDATES THE SPATIAL DISCRETIZATION INCREMENT  DX  BASED ON THE
C        RESULTS OF CALLING THE FUNCTION  ITOLCH
C   - CALLS THE SUBROUTINE  GAUSRV  TO PERFORM THE SECOND HALF-STEP.
C
      DOUBLE PRECISION X,H,EPS,DX,F
      DOUBLE PRECISION DFDX,DFDXV,DXMAX,DXMIN
      DOUBLE PRECISION EPSR,FS,FV,FVS,HMINS,HR,HS
      DOUBLE PRECISION RCD,RDX,STF,TOLABS,TOLRA,TOLRI
      DOUBLE PRECISION W,XP
      DOUBLE PRECISION FUNCT0
      DIMENSION X(NDIM)
      DIMENSION W(100),XP(100)
      DATA RDX/1.D-4/
      DATA DXMIN/1.D-35/
      DATA DXMAX/1.D3/
      DATA HR/1.D-1/
      DATA HMINS/1.D-30/
      DATA STF /100.D0/
      DATA RCD/2.D0/
      DATA TOLRI/1.D-5/
      DATA TOLRA/1.D-11/
      DATA TOLABS/0.D0/
C
      IEC = 0
      FV = F
  10  CONTINUE
  20  CONTINUE
C
C TAKE A RANDOM DIRECTION FOR THE DIRECTIONAL DERIVATIVE
      CALL UNITRV(NDIM,W)
C
C COMPUTE FORWARD-DIFFERENCE DERIVATIVE
      CALL DERFOR(NDIM,X,FV,DX,W,DFDX)
C
C TRY THE FIRST HALF-STEP
      DO 30 IC = 1,NDIM
         XP(IC) = X(IC)-H*W(IC)*DFDX*DBLE(FLOAT(NDIM))
  30     CONTINUE
      HS = H
      F = FUNCT0(NDIM,XP)
      FVS = FV+DX*DABS(DFDX)
C
C UPDATE STEPLENGTH  H  AND ACCEPT OR REJECT THE HALF-STEP
      CALL NEWH(KTIM,FVS,F,H,IE,IEC)
      IF(IEC.LE.0)GO TO 50
      IE = IE-1
      IEC = IEC-1
      H = HS
      DFDXV = DFDX
C
C COMPUTE CENTRAL-DIFFERENCES DERIVATIVE
      CALL DERCEN(NDIM,X,FV,DX,W,DFDX)
C
C TRY AGAIN THE FIRST HALF-STEP
      DO 40 IC = 1,NDIM
         XP(IC) = X(IC)-H*W(IC)*DFDX*DBLE(FLOAT(NDIM))
  40     CONTINUE
      F = FUNCT0(NDIM,XP)
      FVS = FV+DX*DABS(DFDXV-DFDX)
C
C
C UPDATE STEPLENGTH  H  AND ACCEPT OR REJECT THE HALF-STEP
      CALL NEWH(KTIM,FVS,F,H,IE,IEC)
C
C UPDATE CUMULATED PAST SCALING DATA
      IF(IEC.GE.1)CALL CUMSCA(NDIM,W,DFDX)
      IF(IEC.GE.1)GO TO 10
      DX = DX*RDX
C
C FIRST HALF-STEP ACCEPTED
  50  CONTINUE
C
C UPDATE CUMULATED PAST SCALING DATA
      CALL CUMSCA(NDIM,W,DFDX)
      FS = FV+DX*DABS(DFDX)
      IF(ITOLCH(FS,FV,TOLRI,TOLABS).EQ.0)DX = DX/RCD
      IF(ITOLCH(FS,FV,TOLRA,TOLABS).GT.0)DX = DX*RCD
      EPSR = DSQRT(H)*EPS
C
C TAKE A SAMPLE INCREMENT OF THE WIENER PROCESS
      CALL GAUSRV(NDIM,W)
C
C TRY THE SECOND HALF-STEP
      DO 60 IC = 1,NDIM
         XP(IC) = XP(IC)+EPSR*W(IC)
  60     CONTINUE
      F = FUNCT0(NDIM,XP)
C
C ACCEPT OR REJECT THE COMPLETE STEP
      IF (F-FV.LE.EPS*EPS*STF) GO TO 70
      H = H*HR
      IE = IE+1
      IF (H.GT.HMINS) GO TO 20
C
C STEP ACCEPTED
  70  CONTINUE
      DO 80 IC = 1,NDIM
         X(IC) = XP(IC)
  80     CONTINUE
      DX = DMIN1(DX,DXMAX)
      DX = DMAX1(DX,DXMIN)
C
      RETURN
      END
      SUBROUTINE NEWH(K,FV,F,H,IE,IEC)
C
C  NEWH  IS CALLED BY THE SUBROUTINE  SSTEP  TO DECIDE WHETHER TO ACCEPT
C  OR REJECT THE FIRST HALF-STEP, AND TO PROVIDE AN UPDATED VALUE FOR  H
C
      DOUBLE PRECISION FV,F,H
      DOUBLE PRECISION FA,FR,HMAX,HMIN,R
      DIMENSION FR(3),FA(4)
      DATA FR/1.05D0,2.D0,10.D0/
      DATA FA/1.D0,1.1D0,2.D0,10.D0/
      DATA HMIN/1.D-30/
      DATA HMAX/1.D25/
      DATA IECMAX/50/
C
      IF(FV.LT.F)GO TO 20
C
C STEP ACCEPTED, POSSIBLY INCREASE THE STEPLENGTH  H
C
      R = FA(1)
      IF(IE*2.LT.K)R = FA(2)
      IF(IE*3.LT.K)R = FA(3)
      IF(IE.EQ.0.AND.K.GT.1)R = FA(4)
      H = H*R
  10  CONTINUE
      IEC = 0
      GO TO 30
C
  20  CONTINUE
      IE = IE+1
      IEC = IEC+1
      IF(IEC.GT.IECMAX)GO TO 10
C
C STEP REJECTED, DECREASE  H
C
      IC = MIN0(3,IEC)
      R = FR(IC)
      H = H/R
  30  CONTINUE
      H = DMIN1(H,HMAX)
      H = DMAX1(H,HMIN)
C
      RETURN
      END
      SUBROUTINE DERFOR(NDIM,X,F,DX,W,DFDX)
C
C  DERFOR  COMPUTED THE FORWARD FINITE-DIFFERNCES DIRECTIONAL
C  DERIVATIVES (CALLING  FUNCT0 )
C
      DOUBLE PRECISION X,F,DX,W,DFDX
      DOUBLE PRECISION DXF,DXFF,DXMAX,FN,S,XX
      DOUBLE PRECISION FUNCT0
      DIMENSION X(NDIM),W(NDIM)
      DIMENSION XX(100)
      DATA DXFF/1.D6/,DXF/1.D1/
      DATA DXMAX/1.D6/
C
  10  CONTINUE
  20  CONTINUE
      S = 0.D0
      DO 30 IC = 1,NDIM
         XX(IC) = X(IC)+W(IC)*DX
         S = S+(XX(IC)-X(IC))**2
  30     CONTINUE
      IF(S.GT.0.D0)GO TO 40
      DX = DX*DXFF
      GO TO 20
  40  CONTINUE
      FN = FUNCT0(NDIM,XX)
      DFDX = (FN-F)/DX
      IF(DX.GT.DXMAX)RETURN
      IF(DABS(DFDX).GT.1.D0)RETURN
      IF(DFDX**2.GT.0.D0)GO TO 50
      DX = DX*DXF
      GO TO 10
  50  CONTINUE
C
      RETURN
      END
      SUBROUTINE DERCEN(NDIM,X,F,DX,W,DFDX)
C
C  DERFOR  COMPUTED THE CENTRAL FINITE-DIFFERNCES DIRECTIONAL
C  DERIVATIVES (CALLING  FUNCT0 )
C
      DOUBLE PRECISION X,F,DX,W,DFDX
      DOUBLE PRECISION FN,FR,XX
      DOUBLE PRECISION FUNCT0
      DIMENSION X(NDIM),W(NDIM)
      DIMENSION XX(100)
C
      DO 10 IC = 1,NDIM
         XX(IC) = X(IC)-W(IC)*DX
  10     CONTINUE
      FR = FUNCT0(NDIM,XX)
      FN = F+DFDX*DX
      DFDX = (FN-FR)/(2.D0*DX)
C
      RETURN
      END
      SUBROUTINE RCLOPT(N,XO,FO)
C
C  RCLOPT  RECALLS THE CURRENT BEST MINIMUM VALUE  FOPT  FOUND SO FAR
C  FROM ALGORITHM START, AND THE POINT  XOPT  (OR POSSIBLY ONE OF THE
C  POINTS) WHERE  FOPT  WAS OBTAINED
C
      DOUBLE PRECISION XO,FO
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
      DIMENSION XO(N)
C
      DO 10 I = 1,N
         XO(I) = XOPT(I)
  10     CONTINUE
      FO = FOPT
C
      RETURN
      END
      SUBROUTINE STOOPT(N,XO,FO)
C
C  STOOPT  STORES THE CURRENT BEST MINIMUM VALUE  FOPT  FOUND SO FAR
C  FROM ALGORITHM START, AND THE POINT  XOPT  (OR POSSIBLY ONE OF THE
C  POINTS) WHERE  FOPT  WAS OBTAINED
C
      DOUBLE PRECISION XO,FO
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
      DIMENSION XO(N)
C
      DO 10 I = 1,N
         XOPT(I) = XO(I)
  10     CONTINUE
      FOPT = FO
C
      RETURN
      END
      DOUBLE PRECISION FUNCTION FUNCT0(N,XX)
C
C  FUNCT0  IS CALLED  WHENEVER THE VALUE OF THE FUNCLION  F  IS REQUIRED
C  IN THE NUMERICAL INTEGRATION PROCESS.
C  THE FUNCTION  FUNCT0
C   - RESCALES THE VARIABLES BY CALLING THE SUBROUTINE  VARSCA
C   - CALLS THE SUBROUTINE  RANGE  TO TAKE CARE OF THE CASES WHERE THE
C      CURRENT POINT  X  IS OUTSIDE A GIVEN ADMISSIBLE REGION
C   - CALLS THE USER-SUPPLIED FUNCTION  FUNCT  TO ACTUALLY COMPUTE THE
C      VALUE OF  F
C   - POSSIBLY CALLS THE SUBROUTINE  STOOPT  TO UPDATE THE CURRENT
C        BEST MINIMUM FUNCTION VALUE  FOPT  AND THE CORRESPONDING
C        MINIMIZER  XOPT
C
      DOUBLE PRECISION XX
      DOUBLE PRECISION F,R,XS
      DOUBLE PRECISION FUNCT
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
      DIMENSION XX(N)
      DIMENSION XS(100)
C
      DO 10 IX = 1,N
         XS(IX) = XX(IX)
  10     CONTINUE
C
C DESCALE  X-VARIABLES
      CALL VARSCA(N,XS)
C
C CONSTRAIN THE  X-VARIABLES WITHIN BOUNDS
      CALL RANGE(N,XS,XRMIN,XRMAX,R)
C
C COMPUTE THE FUNCTION VALUE...
      F = FUNCT(N,XS)+R
C
C ... AND POSSIBLY UPDATE THE BEST CURRENT MINIMUM
      IF(F.LT.FOPT)CALL STOOPT(N,XS,F)
      FUNCT0 = F
      NCF = NCF+1
C
      RETURN
      END
      SUBROUTINE RANGE (N,XS,XRMIN,XRMAX,R)
C
C  RANGE  IS CALLED BY THE FUNCTION  FUNCT0  TO TAKE CARE OF THE CASES
C  WHERE THE CURRENT POINT  X  IS OUTSIDE A GIVEN ADMISSIBLE REGION
C
      DOUBLE PRECISION XS,XRMIN,XRMAX,R
      DOUBLE PRECISION A,B,C,D,DLRMAX,RMAX,RR,XC
      DIMENSION XS(N),XRMIN(N),XRMAX(N)
      DATA RMAX /1.D35/
      DATA DLRMAX/80.5904782547915990D0/
C
      R = 0.D0
      DO 40 I = 1,N
         A = XRMAX(I)
         C = XRMIN(I)
         XC = XS(I)
         IF (XC.LE.A) GO TO 10
         B = A+A-C
         RR = RMAX
         IF (XC.LT.B) RR = DEXP((XC-A)*DLRMAX/(B-A))-1.D0
         R = R+RR
         XS(I) = XRMAX(I)
         GO TO 30
  10     CONTINUE
         IF(XC.GE.C)GO TO 20
         D = C+C-A
         RR = RMAX
         IF (XC.GT.D) RR = DEXP((C-XC)*DLRMAX/(C-D))-1.D0
         R = R+RR
         XS(I) = XRMIN(I)
  20     CONTINUE
  30     CONTINUE
  40     CONTINUE
C
      RETURN
      END
      INTEGER FUNCTION ITOLCH(FMAX,FMIN,TOLREL,TOLABS)
C
C  ITOLCH  DETERMINES  WHETHER TWO QUANTITIES ARE TO BE CONSIDERED NU-
C  MERICALLY EQUAL WITH RESPECT TO AN ABSOLUTE (OR RELATIVE) DIFFERENCE
C  CRITERION, WITHIN GIVEN TOLERANCES
C
      DOUBLE PRECISION FMAX,FMIN,TOLREL,TOLABS
C
      ISTOP = 0
C
C CHECK RELATIVE DIFFERENCE AGAINST  TOLREL
      IF(DABS(FMAX-FMIN).LE.TOLREL*(DABS(FMIN)+DABS(FMAX))/2.D0)
     1    ISTOP=ISTOP+1
C
C CHECK ABSOLUTE DIFFERENCE AGAINST  TOLABS
      IF(FMAX-FMIN.LE.TOLABS)ISTOP = ISTOP+2
      ITOLCH = ISTOP
C
      RETURN
      END
      SUBROUTINE INISCA(N,ND)
C
C  INISCA  INITIALIZES THE COOMON AREA  /SCALE/  FOR THE SCALING DATA
C
      DOUBLE PRECISION DIST,BIAS,GRAGRA,GRA
      COMMON /SCALE/ DIST(10,10,20),BIAS(10,20),GRAGRA(10,10,20),
     1    GRA(10,20),NGRA(20),LSCA,IDSCA,NX,NORD
      DATA NXMSCA/10/
C
      LSCA = -1
      IF(N.GT.NXMSCA.OR.N.EQ.1)RETURN
      LSCA = 0
      NX = N
      NORD = ND
      IDSCA = 1
      DO 1 ID = 1,NORD
         DO 2 IX = 1,NX
            DO 3 IY = 1,NX
               DIST(IX,IY,ID) = 0.D0
               GRAGRA(IX,IY,ID) = 0.D0
   3           CONTINUE
            DIST(IX,IX,ID) = 1.D0
            BIAS(IX,ID) = 0.D0
            GRA(IX,ID) = 0.D0
   2        CONTINUE
         NGRA(ID) = 0
   1     CONTINUE
C
      RETURN
      END
      SUBROUTINE NOSCA
C
C  NOSCA  DEACTIVATES THE SCALING
C
      DOUBLE PRECISION DIST,BIAS,GRAGRA,GRA
      COMMON /SCALE/ DIST(10,10,20),BIAS(10,20),GRAGRA(10,10,20),
     1    GRA(10,20),NGRA(20),LSCA,IDSCA,NX,NORD
C
      LSCA = -1
C
      RETURN
      END
      SUBROUTINE SEGSCA(ID)
C
C  SEGSCA  SELECTS THE TRAJECTORY WHICH MUST BE RESCALED
C
      DOUBLE PRECISION DIST,BIAS,GRAGRA,GRA
      COMMON /SCALE/ DIST(10,10,20),BIAS(10,20),GRAGRA(10,10,20),
     1    GRA(10,20),NGRA(20),LSCA,IDSCA,NX,NORD
C
      IDSCA = ID
C
      RETURN
      END
      SUBROUTINE VARSCA(N,X)
C
C  VARSCA  COMPUTES THE RESCALED VARIABLE  AX + B
C
      DOUBLE PRECISION X
      DOUBLE PRECISION XB
      DOUBLE PRECISION DIST,BIAS,GRAGRA,GRA
      COMMON /SCALE/ DIST(10,10,20),BIAS(10,20),GRAGRA(10,10,20),
     1    GRA(10,20),NGRA(20),LSCA,IDSCA,NX,NORD
      DIMENSION X(N),XB(10)
C
      IF(LSCA.LE.0)RETURN
      DO 1 I = 1,N
         XB(I) = BIAS(I,IDSCA)
         DO  2 J = 1,N
            XB(I) = XB(I)+DIST(I,J,IDSCA)*X(J)
   2        CONTINUE
   1     CONTINUE
      DO 3 I = 1,N
         X(I) = XB(I)
   3     CONTINUE
C
      RETURN
      END
      SUBROUTINE CUMSCA(N,W,DFDX)
C
C  CUMSCA  STORES CUMULATED STATISTICAL DATA ON THE ILL-CONDITIONING OF
C  F(AX+B) W.R.T. X
C
      DOUBLE PRECISION W,DFDX
      DOUBLE PRECISION DFDXMA
      DOUBLE PRECISION DIST,BIAS,GRAGRA,GRA
      COMMON /SCALE/ DIST(10,10,20),BIAS(10,20),GRAGRA(10,10,20),
     1    GRA(10,20),NGRA(20),LSCA,IDSCA,NX,NORD
      DIMENSION W(N)
      DATA DFDXMA/1.D8/
C
      IF(LSCA.LE.0)RETURN
      IF(DABS(DFDX).GT.DFDXMA)RETURN
      DO 1 I = 1,N
         DO 2 J = 1,N
            GRAGRA(I,J,IDSCA) = GRAGRA(I,J,IDSCA)+DFDX*W(I)*DFDX*W(J)
   2        CONTINUE
         GRA(I,IDSCA) = GRA(I,IDSCA)+DFDX*W(I)
   1     CONTINUE
      NGRA(IDSCA) = NGRA(IDSCA)+1
C
      RETURN
      END
      SUBROUTINE ACTSCA
C
C  ACTSCA  ACTIVATES THE RESCALING
C
      DOUBLE PRECISION DIST,BIAS,GRAGRA,GRA
      COMMON /SCALE/ DIST(10,10,20),BIAS(10,20),GRAGRA(10,10,20),
     1    GRA(10,20),NGRA(20),LSCA,IDSCA,NX,NORD
C
      IF(LSCA.EQ.0)LSCA = 1
C
      RETURN
      END
      SUBROUTINE MOVSCA(IU,IM)
C
C  MOVSCA  MOVES THE SCALING DATA OF THE UNPERTURBED CONTINUATION TO THE
C  POSITION OF THE PERTURBED CONTINUATION
C
      DOUBLE PRECISION DIST,BIAS,GRAGRA,GRA
      COMMON /SCALE/ DIST(10,10,20),BIAS(10,20),GRAGRA(10,10,20),
     1    GRA(10,20),NGRA(20),LSCA,IDSCA,NX,NORD
C
      IF(LSCA.LT.0)RETURN
      DO 1 I = 1,NX
         DO 2 J = 1,NX
            DIST(I,J,IU) = DIST(I,J,IM)
            GRAGRA(I,J,IU) = GRAGRA(I,J,IM)
   2        CONTINUE
         BIAS(I,IU) = BIAS(I,IM)
         GRA(I,IU) = GRA(I,IM)
   1     CONTINUE
      NGRA(IU) = NGRA(IM)
C
      RETURN
      END
      SUBROUTINE UPDSCA(N,X)
C
C  UPDSCA  UPDATES THE SCALING MATRIX  A  AND THE BIAS VECTOR  B BY
C  CALLING  EIGSCA  AND  VARSCA
C
      DOUBLE PRECISION X
      DOUBLE PRECISION AGRAI,ALA1,ALPHA,AMCOR,BIAST
      DOUBLE PRECISION CD,COR,DISTT,SN
      DOUBLE PRECISION EIGSCA
      DOUBLE PRECISION DIST,BIAS,GRAGRA,GRA
      COMMON /SCALE/ DIST(10,10,20),BIAS(10,20),GRAGRA(10,10,20),
     1    GRA(10,20),NGRA(20),LSCA,IDSCA,NX,NORD
      DIMENSION X(N)
      DIMENSION DISTT(10,10),BIAST(10),COR(10,10)
      DATA ALPHA /0.3D0/
C
      IF(LSCA.LE.0)RETURN
      ID = IDSCA
      IF(NGRA(ID).LT.2*NX*NX)GO TO 2
      AGRAI = 1.D0/DBLE(FLOAT(NGRA(ID)))
      AMCOR = 0.D0
      DO 3 I = 1,NX
         DO 4 J = 1,NX
         COR(I,J) = AGRAI*GRAGRA(I,J,ID)-AGRAI*GRA(I,ID)*AGRAI*GRA(J,ID)
            AMCOR = DMAX1(AMCOR,DABS(COR(I,J)))
   4        CONTINUE
   3     CONTINUE
      IF(AMCOR.LE.0.D0)GO TO 12
      DO 1 I = 1,NX
         DO 11 J = 1,NX
            COR(I,J) = COR(I,J)/AMCOR
  11        CONTINUE
   1     CONTINUE
      ALA1 = EIGSCA(COR)
      CD = ALA1*(1.D0+ALPHA)
      DO 5 I = 1,NX
         COR(I,I) = COR(I,I)-CD
         BIAST(I) = X(I)
   5     CONTINUE
      CALL VARSCA(NX,BIAST)
      SN = 0.D0
      DO 6 I = 1,NX
         DO 7 J = 1,NX
            DISTT(I,J) = 0.D0
            DO 8 K = 1,NX
               DISTT(I,J) = DISTT(I,J)-DIST(I,K,ID)*COR(K,J)
   8           CONTINUE
            SN = SN+DISTT(I,J)**2
   7        CONTINUE
   6     CONTINUE
      SN = 1.D0/DSQRT(SN/DBLE(FLOAT(NX)))
      DO 9 I = 1,NX
         BIAS(I,ID) = BIAST(I)
         DO 10 J = 1,N
            DIST(I,J,ID) = SN*DISTT(I,J)
            BIAS(I,ID) = BIAS(I,ID)-DIST(I,J,ID)*X(J)
            GRAGRA(I,J,ID) = 0.D0
  10        CONTINUE
         GRA(I,ID) = 0.D0
   9     CONTINUE
      NGRA(ID) = 0
   2  CONTINUE
  12  CONTINUE
C
      RETURN
      END
      DOUBLE PRECISION FUNCTION EIGSCA(COR)
C
C  EIGSCA COMPUTES THE LARGEST EIGENVALUE OF A MATRIX USED FOR RESCA-
C  LING, STARTING FROM A RANDOMLY-CHOSEN ESTIMATE (OBTAINED BY CALLING
C  THE SUBROUTINE  UNITRV ) OF THE CORRESPONDING EIGENVECTOR
C
      DOUBLE PRECISION COR
      DOUBLE PRECISION ALA1,ALA1I,ALA1O
      DOUBLE PRECISION PREC,SWW,W,WW
      DOUBLE PRECISION DIST,BIAS,GRAGRA,GRA
      COMMON /SCALE/ DIST(10,10,20),BIAS(10,20),GRAGRA(10,10,20),
     1    GRA(10,20),NGRA(20),LSCA,IDSCA,NX,NORD
      DIMENSION COR(10,10)
      DIMENSION W(10),WW(10)
      DATA PREC /1.D-3/
      DATA NRMIN /10/
      DATA NRMAX /100/
C
      CALL UNITRV(NX,W)
      ALA1 = 0.D0
      DO 1 IR = 1,NRMAX
         ALA1O = ALA1
         SWW = 0.D0
         DO 2 IX = 1,NX
            WW(IX) = 0.D0
            DO 3 JX = 1,NX
               WW(IX) = WW(IX)+COR(IX,JX)*W(JX)
   3           CONTINUE
            SWW = SWW+WW(IX)**2
   2        CONTINUE
         ALA1 = DSQRT(SWW)
         ALA1I = 1.D0/ALA1
         IF(IR.GE.NRMIN.AND.ALA1*PREC.GT.DABS(ALA1-ALA1O))GO TO 4
         DO 5 IX = 1,NX
            W(IX) = WW(IX)*ALA1I
   5        CONTINUE
   1     CONTINUE
   4  CONTINUE
      EIGSCA = ALA1
C
      RETURN
      END
      DOUBLE PRECISION FUNCTION CHAOS(INIZ)
C
C  CHAOS  GENERATES A RANDOM SAMPLE FROM ONE OUT OF FOUR POSSIBLE
C PROBABILITY DISTRIBUTIONS USING RANDOM NUMBERS UNIFORMLY
C DISTRIBUTED IN (0,1) GENERATED BY THE FUNCTION  UNIFRD
C
C  INIZ  IS AN INPUT PARAMETER AS FOLLOWS
C
C      INIZ>0          INITIALIZATION WITH SEED  INIZ.
C      INIZ=0          STANDARD GAUSSIAN DISTRIBUTION.
C      INIZ=-1         CAUCHY DISTRIBUTION.
C      INIZ=-2         UNIFORM DISTRIBUTION IN (-1,+1).
C      OTHERWISE       UNIFORM DISTRIBUTION IN ( 0,+1).
C
      DOUBLE PRECISION UNIFRD,PAI,A,B
C
      DATA PAI/3.14159265358979324D0/
C
      IF(INIZ.LE.0) GO TO 10
C
C INITIALIZATION.
C
      CHAOS = UNIFRD(INIZ)
      RETURN
C
  10  CONTINUE
      A = UNIFRD(0)
      IF(INIZ.NE.0) GO TO 20
      B = UNIFRD(0)
C
C GAUSSIAN RANDOM NUMBER BY POLAR METHOD
C
      CHAOS = DSQRT(-2.D0*DLOG(A))*DCOS(PAI*B)
C
      RETURN
  20  CONTINUE
C
C UNIFORM RANDOM NUMBER IN (0,1)
C
      CHAOS = A
C
C CAUCHY RANDOM NUMBER BY INVERSE TRANSFORMATION
C
      IF(INIZ.EQ.(-1)) CHAOS = DSIN(PAI*A)/DCOS(PAI*A)
C
C UNIFORM RANDOM NUMBER IN (-1,+1)
C
      IF(INIZ.EQ.(-2)) CHAOS = 2.D0*A-1.D0
C
      RETURN
      END
      DOUBLE PRECISION FUNCTION UNIFRD(INIZ)
C
C UNIFRD GENERATES THE RANDOM NUMBERS UNIFORMLY DISTRIBUTED IN (0,1)
C EXPLOITING THOSE GENERATED BY  ALKNUT  WITH A FURTHER RANDOMIZATION
C IF THE INPUT PARAMETER INIZ  IS NOT 0
C THE RANDOM NUMBER GENERATOR IS INITIALIZED
C
      DOUBLE PRECISION A,B,C,X
      DOUBLE PRECISION X0,P,P0,P1,P2,R1,R2
      DOUBLE PRECISION FINV
C
      DIMENSION X(61)
C
      DATA NREM/61/,NRIP/100/
      DATA A,B,C/-1.5D0,5.5D0,-2.0D0/
      DATA FINV/3.5D-5/
      DATA IREM/0/
      DATA P0/3.D0/,P1,P2/1.D0,3.D0/,R1,R2/0.25D0,0.75D0/
C
      IF(INIZ.NE.0.OR.IREM.EQ.0) GO TO 10
C
      I0 = IREM
      X0 = X(I0)
C
C NONLINEARIZATION OF X0 TO AVOID LONG-DISTANCE LINEAR RELATIONSHIP.
C
      IF(X0.GE.FINV)X0 = DMOD(1.D0/X0,1.D0)
C
C UPDATE A COMPONENT OF THE VECTOR X ...
C
      CALL ALKNUT(NREM,X,IREM)
C
C ... AND FURTHER RANDOMIZE
C
      UNIFRD = DMOD(X0+X(I0),1.D0)
C
      RETURN
C
C INITIALIZATION OF THE RANDOM NUMBER GENERATOR
C
  10  CONTINUE
C
      P = P0-1.D0/DBLE(FLOAT(IABS(INIZ))+100.0)
      DO 20 K = 1,NREM
C
         P = C+P*(B+P*A)
C
C
         X(K) = R1+(R2-R1)*(P-P1)/(P2-P1)
  20     CONTINUE
C
      IREM = 0
C
      DO 30 K = 1,NRIP
C
         CALL ALKNUT(NREM,X,IREM)
C
  30     CONTINUE
C
      UNIFRD = X(1)
C
      RETURN
      END
      SUBROUTINE ALKNUT(NREM,X,IREM)
C
C UPDATES THE COMPONENT IREM OF THE NREM-VECTOR X WITH A RANDOM NUMBER
C UNIFORMLY DISTRIBUTED IN (0,1) BY MEANS OF THE ALGORITHM
C OF MITCHELL-MOORE, MODIFIED AS SUGGESTED BY BRENT, QUOTED IN
C D.E.KNUTH, THE ART OF COMPUTER PROGRAMMING, SECOND EDITION,
C SECOND VOLUME, SEMINUMERICAL ALGORITHMS, ADDISON-WESLEY
C PUB. CO., READING (1981), PP. 26-28.
C
      DOUBLE PRECISION X
C
      DIMENSION X(NREM)
C
      DATA N1,N2/24,55/
C
      IF(IREM.NE.0) GO TO 10
C
      IREM = NREM
      I1 = NREM-N1
      I2 = NREM-N2
C
  10  CONTINUE
C
      X(IREM) = DMOD(X(I1)+X(I2),1.D0)
C
      IREM = 1+MOD(IREM,NREM)
      I1 = 1+MOD(I1,NREM)
      I2 = 1+MOD(I2,NREM)
C
      RETURN
      END
      SUBROUTINE GAUSRV(N,W)
C
C GENERATES A RANDOM VECTOR SAMPLE FROM AN N-DIMENSIONAL
C NORMAL DISTRIBUTION
C
      DOUBLE PRECISION W,X,Y,R
      DOUBLE PRECISION CHAOS
C
      DIMENSION W(N)
C
      NN = (N+1)/2
C
      DO 20 I = 1,NN
         II = 1+N-I
C
  10     CONTINUE
         X = CHAOS(-2)
         Y = CHAOS(-2)
         R = X*X+Y*Y
C
         IF(R.GT.1.D0) GO TO 10
C
         R = DSQRT(-2.D0*DLOG(R)/R)
C
         W(I) = X*R
         W(II) = Y*R
C
  20     CONTINUE
C
      RETURN
      END
      SUBROUTINE UNITRV(N,W)
C
C GENERATES A RANDOM VECTOR UNIFORMLY DISTRIBUTED
C ON THE UNIT SPHERE.
C
      DOUBLE PRECISION W,WW
C
      DIMENSION W(N)
C
      CALL GAUSRV(N,W)
      WW = 0.D0
C
      DO 10 I = 1,N
         WW = WW+W(I)**2
  10     CONTINUE
      WW = 1.D0/DSQRT(WW)
C
      DO 20 I = 1,N
         W(I) = WW*W(I)
  20     CONTINUE
C
      RETURN
      END
C
C  MAIN PROGRAM (SAMPLE VERSION)
C  CALLS  SIGMA  VIA THE DRIVER SUBROUTINE  SIGMA1
C
      DOUBLE PRECISION X0,XMIN,FMIN
C
      DIMENSION X0(2),XMIN(2)
C
C TEST PROBLEM DATA
C
C PROBLEM DIMENSION
      N = 2
C
C INITIAL POINT
      X0(1) = 0.D0
      X0(2) = 0.D0
C
C SET INPUT PARAMETERS
      NSUC = 3
      IPRINT = 0
C
C CALL DRIVER SUBROUTINE  SIGMA1
      CALL SIGMA1(N,X0,NSUC,IPRINT,XMIN,FMIN,NFEV,IOUT)
C
      STOP
      END
      DOUBLE PRECISION FUNCTION FUNCT (N,X)
C
C COMPUTES THE VALUE AT  X  OF THE SIX-HUMP CAMEL FUNCTION
C
      DOUBLE PRECISION X,XX,YY
      DIMENSION X(N)
      XX = X(1)*X(1)
      YY = X(2)*X(2)
      FUNCT = ((XX/3.D0-2.1D0)*XX+4.D0)*XX+X(1)*X(2)
     1    +4.D0*(YY-1.D0)*YY
      RETURN
      END
      SUBROUTINE SIGMA1(N,X0,NSUC,IPRINT,XMIN,FMIN,NFEV,IOUT)
C
C  SIGMA1  IS A 'DRIVER' SUBROUTINE WHICH SIMPLY CALLS THE PRINCIPAL
C  SUBROUTINE  SIGMA  AFTER HAVING ASSIGNED DEFAULT VALUES TO A NUMBER
C  OF INPUT PARAMETERS OF  SIGMA , AND HAS THEREFORE A CONSIDERABLY
C  LOWER NUMBER OF INPUT PARAMETERS.
C  IT CAN BE USED AS A SIMPLE EXAMPLE OF HOW TO CALL  SIGMA , BUT
C  ALSO AS AN EASY-TO-USE DRIVER FOR THE AVERAGE USER, WHICH MAY FIND
C  IT EASIER TO CALL  SIGMA1  INSTEAD OF  SIGMA , THUS AVOIDING THE
C  TROUBLE OF ASSIGNING A VALUE TO ALL THE INPUT PARAMETERS OS  SIGMA .
C  ALL THE PARAMETERS IN THE DEFINITION OF  SIGMA1  HAVE THE SAME MEA-
C  NING AS IN  SIGMA .
C
C  THE USER OF  SIGMA1  MUST ONLY GIVE VALUES TO THE INPUT PARAMETERS
C      N, X0, NSUC, IPRINT
C  AND OBTAINS ON OUTPUT THE SAME OUTPUT PARAMETERS OF  SIGMA
C      XMIN, FMIN, NFEV, IOUT
C
C  WE RECALL HERE THE MEANING OF THE ABOVE PARAMETERS
C
C  N       IS THE PROBLEM DIMENSION (NUMBER OF VARIABLES)
C  X0      IS AN  N-VECTOR CONTAINING THE INITIAL VALUES OF THE
C          X-VARIABLES
C  NSUC    IS THE REQUESTED NUMBER OF SUCCESSFUL TRIALS
C          AFTER WHICH THE COMPUTATION IS STOPPED.
C  IPRINT  IS AN INDEX USED TO CONTROL THE AMOUNT OF PRINTED OUTPUT
C          BY CONTROLLING THE CALLS TO THE USER-SUPPLIED OUTPUT SUB-
C          ROUTINES  PTSEG  (END-OF-SEGMENT OUTPUT),  PTRIAL  (END-
C          OF-TRIAL OUTPUT), AND  PTKSUC (END-OF-TRIAL OUTPUT RELATED
C          TO THE COUNT OF SUCCESSFUL TRIALS), WHICH ARE DESCRIBED
C          BELOW.
C          IPRINT.LT.0   NO CALL TO THE OUTPUT SUBROUTINES
C          IPRINT.EQ.0   CALL ONLY  PTRIAL  AND  PTKSUC
C          IPRINT.GT.0   CALL ALL OUTPUT SUBROUTINES.
C  XMIN    IS AN N-VECTOR CONTAINING THE COORDINATES OF THE POINT
C          (OR POSSIBLY ONE OF THE POINTS) WHERE THE FINAL VALUE  FMIN
C          OF  FOPT  WAS FOUND.
C  FMIN    IS THE FINAL VALUE OF THE BEST CURRENT MINIMUM FUNCTION
C          VALUE  FOPT.
C  NFEV    IS THE TOTAL NUMBER OF FUNCTION EVALUATION (INCLUDING
C          THOSE USED FOR THE COMPUTATION OF DERIVATIVES, AND FOR
C          THE REJECTED TIME-INTEGRATION STEPS).
C  IOUT    IS THE INDICATOR OF THE STOPPING CONDITIONS, AS FOLLOWS
C          IF  IOUT = -99  A FATAL ERROR WAS DETECTED WHEN PERFOR-
C             MING SOME PRELIMINARY CHECKING OF THE INPUT DATA, AND
C             THE ALGORITHM WAS NOT EVEN STARTED
C          OTHERWISE THE ALGORITHM WAS STARTED, AND THE MEANING OF
C          IOUT  IS AS FOLLOWS
C          IF  IOUT.EQ.0  NO TRIAL HAD A UNIFORM STOP.
C          IF  IOUT.NE.0  THE SIGN AND THE MAGNITUDE OF  IOUT  HAVE
C          THE FOLLOWING MEANING
C          A) THE SIGN OF  IOUT  INDICATES IF THE BEST UNIFORM STOP
C          (I.E. THE ONE IN WHICH  FTFOPT  WAS OBTAINED)
C          IS TO BE CONSIDERED SUCCESSFUL (IOUT.GT.0) OR UNSUCCESSFUL
C          B) THE MAGNITUDE OF  IOUT  INDICATES WHICH ONE OF THE
C          NUMERICAL EQUALITY CRITERIA WAS SATISFIED IN THE BEST
C          UNIFORM STOP
C          IABS(IOUT).EQ.1  RELATIVE DIFFERENCE CRITERION
C          IABS(IOUT).EQ.2  ABSOLUTE DIFFERENCE CRITERION
C          IABS(IOUT).EQ.3  BOTH CRITERIA
C          (IOUT  IS THE FINAL VALUE OF THE INTERNAL PARAMETER  ISTOPT
C          (AN OUTPUT INDICATOR OF THE USER-SUPPLIED SUBROUTINE
C          PTRIAL )).
C          SUCCESS IS CLAIMED BY THE ALGORITHM IF  IOUT .GT. 0,
C          I.E. IF AT LEAST ONE OF THE TRIALS STOPPED SUCCESSFULLY
C          (I.E. WITH A POSITIVE VALUE OF THE TRIAL STOP INDICATOR
C          ISTOP ), AND THE SUCCESSFUL TRIALS (AS COUNTED BY  KSUC )
C          ARE CURRENTLY VALID.
C
      DOUBLE PRECISION X0,XMIN,FMIN
      DOUBLE PRECISION DX,EPS,H,TOLABS,TOLREL
      DOUBLE PRECISION VRMAX,VRMIN,XRMAX,XRMIN
      DIMENSION X0(N),XMIN(N)
      DIMENSION XRMIN(100),XRMAX(100)
      DATA VRMIN,VRMAX /-1.D4,1.D4/
      DATA NTRILD/50/
C
      H = 1.D-10
      EPS = 1.D0
      DX = 1.D-9
      IRAND = 0
      NTRAJ = 0
      ISEGBR = 0
      INKPBR = 0
      KPBR0 = 0
      NPMIN = 10
      NPMAX0 = 100
      INPMAX = 50
      NTRIAL = MAX0(NTRILD,5*NSUC)
      TOLREL = 1.D-3
      TOLABS = 1.D-6
      KPASCA = 10
      IF(N.GT.5)KPASCA = 300
      INHP = 1
      DO 1 IX = 1,N
         XRMIN(IX)=VRMIN
         XRMAX(IX)=VRMAX
 1    CONTINUE
C
      CALL SIGMA ( N, X0, H, EPS, DX,
     1             NTRAJ, ISEGBR, KPBR0, INKPBR,
     2             NPMIN, NPMAX0, INPMAX,
     3             NSUC, NTRIAL, TOLREL, TOLABS, XRMIN, XRMAX,
     4             KPASCA, IRAND, INHP, IPRINT,
     5             XMIN, FMIN, NFEV, IOUT )
C
      RETURN
      END
      SUBROUTINE SIGMA ( N, X0, H, EPS, DX,
     1                   NTRAJ, ISEGBR, KPBR0, INKPBR,
     2                   NPMIN, NPMAX0, INPMAX,
     3                   NSUC, NTRIAL, TOLREL, TOLABS, XRMIN, XRMAX,
     4                   KPASCA, IRAND, INHP, IPRINT,
     5                   XMIN, FMIN, NFEV, IOUT )
C
C  THE SUBROUTINE  SIGMA  IS THE PRINCIPAL SUBROUTINE OF THE PACKAGE
C  SIGMA, WHICH ATTEMPTS TO FIND A GLOBAL MINIMIZER OF A REAL VALUED
C  FUNCTION  F(X) = F(X1,...,XN)  OF  N  REAL VARIABLES  X1,...,XN.
C  THE ALGORITHM AND THE PACKAGE ARE DESCRIBED IN DETAIL IN THE TWO
C  PAPERS PUBLISHED IN THE SAME ISSUE OF THE A.C.M. TRANSACTIONS ON
C  MATHEMATICAL SOFTWARE, BOTH BY
C     F. ALUFFI-PENTINI, V. PARISI, F. ZIRILLI.
C  (1)  A GLOBAL MINIMIZATION ALGORITHM USING STOCHASTIC DIFFERENTIAL
C       EQUATIONS
C  (2)  ALGORITHM SIGMA, A STOCHASTIC-INTEGRATION GLOBAL MINIMIZATION
C       ALGORITHM.
C  THE SOFTWARE IMPLEMENTATION AND ITS USAGE ARE DESCRIBED IN (2).
C
C  METHOD
C
C  A GLOBAL MINIMIZER OF  F(X)  IS SOUGHT BY MONITORING THE VALUES OF
C  F  ALONG TRAJECTORIES GENERATED BY A SUITABLE (STOCHASTIC) DISCRE-
C  TIZATION OF A FIRST-ORDER STOCHASTIC DIFFERENTIAL EQUATION INSPIRED
C  BY STATISTICAL MECHANICS. STARTING FROM AN INITIAL POINT  X0 ,
C  X  IS UPDATED BY THE (STOCHASTIC) DISCRETIZATION STEP
C       X = X + DX1 + DX2
C  WHERE  DX1 = - H * GAM           (FIRST HALF-STEP)
C         DX2 = EPS * SQRT(H) * U   (SECOND HALF-STEP)
C  AND  H  IS THE TIME-INTEGRATION STEPLENGTH,
C  GAM/N  IS COMPUTED AS A FINITE-DIFFERENCE APPROXIMATION TO THE
C     DIRECTIONAL DERIVATIVE OF  F  ALONG AN ISOTROPICALLY RANDOM
C     DIRECTION,
C  EPS  IS A POSITIVE 'NOISE' COEFFICIENT, AND
C  U  IS A RANDOM SAMPLE FROM AN N-DIMENSIONAL GAUSSIAN DISTRIBUTION.
C  WE CONSIDER THE SIMULTANEOUS EVOLUTION OF A GIVEN FIXED NUMBER
C  NTRAJ  OF TRAJECTORIES DURING AN OBSERVATION PERIOD IN WHICH FOR
C  EACH TRAJECTORY  EPS  IS FIXED WHILE  H  AND THE SPATIAL DISCRETI-
C  ZATION INCREMENT  DX  FOR COMPUTING  GAM  ARE AUTOMATICALLY
C  ADJUSTED BY THE ALGORITHM.
C  AFTER EVERY OBSERVATION PERIOD ONE OF THE TRAJECTORIES IS DISCARDED,
C  ALL OTHER TRAJECTORIES CONTINUE UNPERTURBED, AND ONE OF THEM IS SE-
C  LECTED FOR BRANCHING, I.E. GENERATING A SECOND PERTURBED CONTI-
C  NUATION, WITH DIFFERENT STARTING  EPS  AND  DX  (AND THE SAME
C  'PAST HISTORY' OF THE FIRST).
C  THE SET OF SIMULTANEOUS TRAJECTORIES IS CONSIDERED A SINGLE TRIAL,
C  AND THE COMPLETE ALGORITHM IS A SET OF REPEATED TRIALS.
C  A TRIAL IS STOPPED, AT THE END OF AN OBSERVATION PERIOD, AND AFTER
C  HAVING DISCARDED THE WORST TRAJECTORY, IF ALL THE FINAL VALUES OF
C  F  FOR THE REMAINING TRAJECTORIES ARE EQUAL (WITHIN NUMERICAL TO-
C  LERANCES, AND POSSIBLY AT DIFFERENT POINTS  X) TO THEIR MINIMUM
C  VALUE  FTFMIN ('UNIFORM STOP AT THE LEVEL  FTFMIN ').
C  A UNIFORM STOP IS CONSIDERED SUCCESSFUL ONLY IF THE FINAL VALUE
C  FTFMIN  IS (NUMERICALLY) EQUAL TO THE CURRENT BEST MINIMUM  FOPT
C  FOUND SO FAR FROM ALGORITHM START.
C  A TRIAL IS ALSO ANYWAY STOPPED (UNSUCCESSFULLY) IF A GIVEN MAXIMUM
C  NUMBER  NPMAX  OF OBSERVATION PERIODS HAS ELAPSED.
C  TRIALS ARE REPEATED WITH DIFFERENT OPERATING CONDITIONS (INITIAL
C  POINT, MAX TRIAL LENGTH  NPMAX , SEED OF NOISE GENERATOR, POLICY
C  FOR CHOOSING THE STARTING  EPS  FOR THE PERTURBED CONTINUATION,
C  AND TRIAL-START VALUE OF  EPS ).
C  THE OUTCOMES OF ALL THE COMPLETED TRIALS ARE SUMMARIZED BY
C  FTFOPT (THE BEST CURRENT MIMNIMUM VALUE FOUND SO FAR FOR
C  FTFMIN ) AND BY THE CURRENT COUNT  KSUC  OF SUCCESSFUL TRIALS
C  (WHICH IS ZERO AT ALGORITHM START, AND IS UPDATED AT EVERY
C  SUCCESSFULLY-STOPPING TRIALS).
C  THE ALGORITHM IS STOPPED, AT THE END OF A TRIAL, IF A REQUESTED
C  COUNT  NSUC  OF SUCCESSFUL TRIALS HAS BEEN REACHED,
C  OR ANYWAY IF A GIVEN MAXIMUM NUMBER  NTRIAL  OF TRIALS HAS BEEN
C  REACHED.
C  SUCCESS IS CLAIMED IF THE CURRENT COUNT  KSUC  OF SUCCESSFUL TRIALS
C  IS AT LEAST ONE, AND IF SUCH TRIALS ARE CURRENTLY VALID.
C
C  CALL STATEMENT
C
C  THE CALL STATEMENT IS
C     CALL SIGMA ( N, X0, H, EPS, DX,
C                  NTRAJ, ISEGBR, KPBR0, INKPBR,
C                  NPMIN, NPMAX0, INPMAX,
C                  NSUC, NTRIAL, TOLREL, TOLABS, XRMIN, XRMAX,
C                  KPASCA, IRAND, INHP, IPRINT,
C                  XMIN, FMIN, NFEV, IOUT )
C
C  CALL PARAMETERS
C
C  INPUT PARAMETERS ARE THOSE IN LINES 1,3,4,5 OF THE CALL STATEMENT,
C  INPUT-OUTPUT PARAMETERS ARE THOSE IN LINE 2,
C  OUTPUT PARAMETERS ARE THOSE IN LINE 6.
C  NOTE THAT A NUMBER OF OTHER (INTERNAL) PARAMETERS CAN BE OBTAINED
C  BY MEANS OF THE USER-SUPPLIED OUTPUT SUBROUTINES  PTSEG, PTRIAL,
C  AND  PTKSUC, WHICH ARE DESCRIBED BELOW.
C
C  DESCRIPTION OF THE CALL PARAMETERS
C
C  N        IS THE PROBLEM DIMENSION (NUMBER OF VARIABLES)
C  X0       IS AN  N-VECTOR CONTAINING THE INITIAL VALUES OF THE
C          X-VARIABLES
C  H       IS THE INITIAL VALUE OF THE TIME-INTEGRATION STEPLENGTH.
C  EPS     IS THE INITIAL VALUE OF THE NOISE COEFFICIENT.
C  DX      IS THE INITIAL VALUE OF THE MAGNITUDE OF THE DISCRETIZATION
C          INCREMENT FOR COMPUTING THE FINITE-DIFFERENCE DERIVATIVES.
C  NTRAJ   IS THE NUMBER OF SIMULTANEOUS TRAJECTORIES.
C          (NOTE HOWEVER THAT IF THE INPUT VALUE IS ZERO,  NTRAJ  IS
C          SET TO A DEFAULT VALUE (NTRAJ = 7), AND IF THE INPUT VALUE
C          IS OTHERWISE OUTSIDE THE INTERVAL (3,20) NTRAJ IS SET TO
C          THE NEAREST EXTREME VALUE).
C  ISEGBR, KPBR0, INKPBR  DETERMINE, AT THE END OF AN OBSERVATION
C          PERIOD, WHICH ONE OF THE SIMULTANEOUS TRAJECTORIES
C          IS TO BE BRANCHED, AS FOLLOWS.
C          BRANCHING IS NORMALLY PERFORMED ON THE TRAJECTORY WHICH
C          OCCUPIES THE PLACE  ISEGBR  IN THE TRAJECTORY SELECTION OR-
C          DERING, EXCEPT AT (THE END OF) EXCEPTIONAL OBSERVATION
C          PERIODS, WHERE THE FIRST TRAJECTORY IN THE ORDERING IS
C          BRANCHED. EXCEPTIONAL BRANCHING OCCURS AT THE OBSERVATION
C          PERIODS NUMBERED  KP = KPBR0 + J*INKPBR, (J = 1,2,3,...).
C          THEREFORE  ISEGBR  SELECTS THE LEVEL (IN THE ORDERING) AT
C          WHICH NORMAL BRANCHING OCCURS, WHILE  KPBR0  AND  INKPBR
C          SELECT THE FIRST OCCURRENCE AND THE REPETITION FREQUENCY
C          OF THE EXCEPTIONAL OBSERVATION PERIODS.
C          (NOTE HOWEVER THAT IF ONE OF THE INPUT VALUES IS ZERO,
C          THE CORRESPONDING VARIABLE IS SET TO A DEFAULT VALUE
C          ISEGBR = INT((1+NTRAJ)/2), INKPBR = 10, KPBR0 = 3.
C          IF THE INPUT VALUE FOR  ISEGBR  IS OTHERWISE OUTSIDE THE
C          INTERVAL  (1,NTRAJ),  ISEGBR  IS SET TO THE NEAREST
C          EXTREME VALUE, AND IF KPBR0  HAS A VALUE NOT INSIDE THE
C          INTERVAL  (1,INKPBR), IT IS ASSIGNED THE SAME VALUE
C          MODULO  INKPBR).
C  NPMIN   IS THE MINIMUM DURATION OF A TRIAL, I.E. THE MINIMUM
C          NUMBER OF OBSERVATION PERIODS THAT SHOULD ELAPSE BEFORE
C          STARTING TO CHECK THE TRIAL STOPPING CRITERIA.
C  NPMAX0  IS THE MAXIMUM DURATION OF THE FIRST TRIAL, I.E. THE
C          VALUE, FOR THE FIRST TRIAL, OF MAXIMUM ACCEPTABLE
C          NUMBER  NPMAX  OF OBSERVATION PERIODS IN A TRIAL.
C  INPMAX  IS THE INCREMENT FOR  NPMAX , WHEN  NPMAX  IS VARIED
C          FROM ONE TRIAL TO THE FOLLOWING ONE.
C  NSUC    IS THE REQUESTED NUMBER OF SUCCESSFUL TRIALS
C          AFTER WHICH THE COMPUTATION IS STOPPED.
C  TOLREL  AND  TOLABS  ARE THE RELATIVE AND ABSOLUTE TOLERANCES
C          FOR STOPPING A SINGLE TRIAL.
C  XRMIN,  XRMAX  ARE N-VECTORS DEFINING THE ADMISIBLE REGION FOR
C          THE X-VALUES, WITHIN WHICH THE FUNCTION VALUES CAN BE
C          SAFELY COMPUTED.
C  KPASCA  IS THE MINIMUM NUMBER OF TRAJECTORY SEGMENTS THAT SHOULD
C          ELAPSE BEFORE THE RESCALING PROCEDURES ARE ACTIVATED.
C  IRAND   IS A CONTROL INDEX FOR THE INITIALIZATION OF THE RANDOM
C          NUMBER GENERATOR.
C          IRAND.GT.0    THE GENERATOR IS INITIALIZED, BEFORE STAR-
C                        TING THE TRIAL  KT, WITH SEED  IRAND+KT-1
C          IRAND.LE.0    THE GENERATOR IS INITIALIZED (WITH SEED 0)
C                        ONLY AT THE FIRST CALL OF SIGMA
C  INHP    IS A CONTROL INDEX FOR SELECTING THE NUMBER  NHP  OF TIME-
C          INTEGRATION STEPS FOR OBSERVATION PERIOD  KP (DURATION OF
C          TRIAL  KP) AS FOLLOWS (LOG IS BASE 2)
C          INHP=1  NHP = 1 + INT(LOG(KP))      ('SHORT' DURATION)
C          INHP=2  NHP = INT(SQRT(KP))         ('MEDIUM' DURATION)
C          INHP=3  NHP = KP                    ('LONG' DURATION)
C  IPRINT  IS AN INDEX USED TO CONTROL THE AMOUNT OF PRINTED OUTPUT
C          BY CONTROLLING THE CALLS TO THE USER-SUPPLIED OUTPUT SUB-
C          ROUTINES  PTSEG  (END-OF-SEGMENT OUTPUT),  PTRIAL  (END-
C          OF-TRIAL OUTPUT), AND  PTKSUC (END-OF-TRIAL OUTPUT RELATED
C          TO THE COUNT OF SUCCESSFUL TRIALS), WHICH ARE DESCRIBED
C          BELOW.
C          IPRINT.LT.0   NO CALL TO THE OUTPUT SUBROUTINES
C          IPRINT.EQ.0   CALL ONLY  PTRIAL  AND  PTKSUC
C          IPRINT.GT.0   CALL ALL OUTPUT SUBROUTINES.
C  XMIN    IS AN N-VECTOR CONTAINING THE COORDINATES OF THE POINT
C          (OR POSSIBLY ONE OF THE POINTS) WHERE THE FINAL VALUE  FMIN
C          OF  FOPT  WAS FOUND.
C  FMIN    IS THE FINAL VALUE OF THE BEST CURRENT MINIMUM FUNCTION
C          VALUE  FOPT.
C  NFEV    IS THE TOTAL NUMBER OF FUNCTION EVALUATION (INCLUDING
C          THOSE USED FOR THE COMPUTATION OF DERIVATIVES, AND FOR
C          THE REJECTED TIME-INTEGRATION STEPS).
C  IOUT    IS THE INDICATOR OF THE STOPPING CONDITIONS, AS FOLLOWS
C          IF  IOUT = -99  A FATAL ERROR WAS DETECTED WHEN PERFOR-
C             MING SOME PRELIMINARY CHECKING OF THE INPUT DATA, AND
C             THE ALGORITHM WAS NOT EVEN STARTED
C          OTHERWISE THE ALGORITHM WAS STARTED, AND THE MEANING OF
C          IOUT  IS AS FOLLOWS
C          IF  IOUT.EQ.0  NO TRIAL HAD A UNIFORM STOP.
C          IF  IOUT.NE.0  THE SIGN AND THE MAGNITUDE OF  IOUT  HAVE
C          THE FOLLOWING MEANING
C          A) THE SIGN OF  IOUT  INDICATES IF THE BEST UNIFORM STOP
C          (I.E. THE ONE IN WHICH  FTFOPT  WAS OBTAINED)
C          IS TO BE CONSIDERED SUCCESSFUL (IOUT.GT.0) OR UNSUCCESSFUL
C          B) THE MAGNITUDE OF  IOUT  INDICATES WHICH ONE OF THE
C          NUMERICAL EQUALITY CRITERIA WAS SATISFIED IN THE BEST
C          UNIFORM STOP
C          IABS(IOUT).EQ.1  RELATIVE DIFFERENCE CRITERION
C          IABS(IOUT).EQ.2  ABSOLUTE DIFFERENCE CRITERION
C          IABS(IOUT).EQ.3  BOTH CRITERIA
C          (IOUT  IS THE FINAL VALUE OF THE INTERNAL PARAMETER  ISTOPT
C          (AN OUTPUT INDICATOR OF THE USER-SUPPLIED SUBROUTINE
C          PTRIAL )).
C          SUCCESS IS CLAIMED BY THE ALGORITHM IF  IOUT .GT. 0,
C          I.E. IF AT LEAST ONE OF THE TRIALS STOPPED SUCCESSFULLY
C          (I.E. WITH A POSITIVE VALUE OF THE TRIAL STOP INDICATOR
C          ISTOP ), AND THE SUCCESSFUL TRIALS (AS COUNTED BY  KSUC )
C          ARE CURRENTLY VALID.
C
C
C  USER-SUPPLIED SUPROGRAMS
C
C  THE USER MUST PROVIDE THE FUNCTION  FUNCT  TO COMPUTE  F(X),
C  AND THE THREE OUTPUT SUBROUTINE  PTSEG, PTRIAL, PTKSUC .
C  THE CALLS TO THE OUTPUT SUBROUTINES ARE CONTROLLED BY  IPRINT
C  (INPUT PARAMETER TO  SIGMA).
C  A USER NOT INTERESTED IN USING ANY ONE OF THE OUTPUT SUBROUTINES
C  CAN SIMPLY PUT  IPRINT = -1.
C  SAMPLE VERSIONS OF THE OUTPUT SUBROUTINES ARE PROVIDED
C  WITH THE PACKAGE FOR THE BENEFIT OF THE AVERAGE USER.
C  IN THE FOLLOWING DESCRIPTION ALL NON-INTEGER ARGUMENTS ARE
C  DOUBLE PRECISION (INTEGER ARGUMENTS ARE INDICATED BY MEANS OF THE
C  FORTRAN IMPLICIT TYPE DEFINITION CONVENTION).
C
C     THE FUNCTION  FUNCT
C
C     FUNCT  MUST RETURN AS ITS VALUE THE VALUE AT  X  OF THE FUNCTION
C     TO BE MINIMIZED
C     THE DEFINITION STATEMENT IS
C        DOUBLE PRECISION FUNCTION  FUNCT (N, X)
C     WHERE
C     N   IS THE (INPUT) DIMENSION OF THE PROBLEM.
C     X   IS THE (INPUT) N-VECTOR CONTAINING THE COORDINATES OF THE
C         POINT  X  WHERE THE FUNCTION IS TO BE COMPUTED.
C
C     THE SUBROUTINE  PTSEG
C
C     PTSEG  IS CALLED (IF  IPRINT.GT.0) AT THE END OF EVERY OBSER-
C     VATION PERIOD.
C     THE DEFINITION STATEMENT IS
C         SUBROUTINE  PTSEG ( N, XPFMIN, FPFMIN, FPFMAX,
C                                         KP, NFEV, IPRINT )
C     WHERE
C     N   IS THE (INPUT) DIMENSION OF THE PROBLEM
C     FPFMIN, FPFMAX  ARE RESPECTIVELY THE MINIMUM AND THE MAXIMUM
C        AMONG THE VALUES OF  F(X) OBTAINED AT THE FINAL POINTS OF
C        THE TRAJECTORY SEGMENTS OF THE (JUST ELAPSED) OBSERVATION
C        PERIOD  KP.
C     XPFMIN   IS AN N-VECTOR CONTAINING THE COORDINATES OF THE
C        (FINAL) POINT (OR POSSIBLY ONE OF THE POINTS) WHERE
C        FPFMIN WAS OBTAINED.
C     KP   IS THE TOTAL NUMBER OF ELAPSED OBSERVATION PERIODS IN
C        THE CURRENT TRIAL.
C     NFEV   IS THE TOTAL NUMBER OF FUNCTION EVALUATIONS PERFORMED
C        FROM ALGORITHM START.
C
C     THE SUBROUTINE  PTRIAL
C
C     PTRIAL  IS CALLED (IF IPRINT.GE.0) AT THE END OF EVERY TRIAL.
C     THE DEFINITION STATEMENT IS
C         SUBROUTINE PTRIAL ( N, XOPT, FOPT,
C                             FTFMIN, FTFMAX, FTFOPT,
C                             ISTOP, ISTOPT, NFEV, KP, IPRINT )
C     WHERE
C     N   IS THE (INPUT) DIMENSION OF THE PROBLEM.
C     XOPT   IS AN N-VECTOR CONTINING THE COORDINATES OF THE
C        POINT (OR POSSIBLY ONE OF THE POINTS) WHERE THE CURRENT
C        MINIMUM  FOPT  WAS OBTAINED.
C     FOPT   IS THE CURRENT BEST MINIMUM VALUE FOUND FOR  F  FROM
C        ALGORITHM START ( FOPT  IS UPDATED WHENEVER A FUNCTION
C        VALUE IS COMPUTED).
C     FTFMIN, FTFMAX   ARE RESPECTIVELY THE MINIMUM AND THE MAXIMUM
C        AMONG THE VALUES OF  F(X)  OBTAINED AT THE FINAL POINTS OF
C        THE LAST TRAJECTORY SEGMENTS OF THE CURRENT TRIAL.
C     FTFOPT   IS THE CURRENT MINIMUM VALUE OF  FTFMIN  AMONG THE
C        TRIALS WHICH DID NOT STOP FOR REACHING THE MAXIMUM ALLOWED
C        NUMBER OF SEGMENTS (STOPPING INDICATOR  ISTOP = 0, SEE
C        BELOW).  FTFOPT  IS USED BY  SIGMA  TO COMPUTE  KSUC  (INPUT
C        PARAMETER TO THE OUTPUT SUBROUTINE  PTKSUK , SEE BELOW).
C     KP   IS THE TOTAL NUMBER OF ELAPSED OBSERVATION PERIODS IN
C        THE CURRENT TRIAL.
C     NFEV   IS THE TOTAL NUMBER OF FUNCTION EVALUATIONS PERFORMED
C        FROM ALGORITHM START.
C     ISTOP   IS THE INDICATOR OF THE STOPPING CONDITION OF THE TRIAL,
C        AS FOLLOWS
C        ISTOP = 0
C           THE MAXIMUM NUMBER  NPMAX  OF OBSERVATION PERIODS HAS
C           BEEN REACHED.
C        ISTOP.NE.0
C           ALL THE END-OF-SEGMENT VALUES OF  F(X) , (EXCEPT FOR THE
C           JUST DISCARDED SEGMENT) ARE CLOSE ENOUGH TO THEIR COMMON
C           MINIMUM VALUE  FPFMIN , WITH RESPECT TO AN ABSOLUTE OR
C           RELATIVE DIFFERENCE CRITERION, TO BE CONSIDERED NUMERI-
C           CALLY EQUAL.
C           THE ABSOLUTE VALUE AND THE SIGN OF  ISTOP  HAVE THE
C           FOLLOWING MEANING.
C              THE ABSOLUTE VALUE INDICATES WHICH DIFFERENCE
C                 CRITERION WAS SATISFIED
C                 1   RELATIVE DIFFERENCE CRITERION SATISFIED
C                 2   ABSOLUTE DIFFERENCE CRITERION SATISFIED
C                 3   BOTH CRITERIA SATISFIED
C              THE SIGN OF  ISTOP  INDICATES THE RELATIONSHIP BETWEEN
C                 THE END-OF-TRIAL VALUE  FPFMIN  AND THE CURRENT
C                 BEST MINIMUM VALUE  FOPT  (WHICH IS UPDATED WHEN-
C                 EVER A FUNCTION  VALUE IS COMPUTED
C                 ISTOP.GT.0
C                    FPFMIN  IS NUMERICALLY EQUAL (W.R.T. AT LEAST
C                    ONE OF THE ABOVE  DIFFERENCE CRITERIA) TO  FOPT
C                 ISTOP.LT.0
C                    FPFMIN  IS NOT EVEN NUMERICALLY EQUAL TO  FOPT
C                    (AND THEREFORE CANNOT BE CONSIDERED AS AN
C                    ACCEPTABLE GLOBAL MINIMUM).
C     ISTOPT   IS THE VALUE OF THE TRIAL STOPPING INDICATOR  ISTOP
C        CORRESPONDING TO THE (CURRENT OR PAST) TRIAL WHERE  FTFOPT
C        WAS OBTAINED, WITH THE SIGN WHICH IS UPDATED ACCORDING TO
C        THE COMPARISON BETWEEN  FTFOPT  AND THE PRESENT VALUE OF
C        FOPT , AS DESCRIBED ABOVE.
C        THE FINAL VALUE OF  ISTOP IS RETURNED BY  SIGMA  AS THE VALUE
C        OF THE OUTPUT INDICATOR IOUT OF THE ALGORITHM STOPPING CON-
C        DITIONS (WHENEVER THE ALGORITHM WAS STARTED, IOUT.NE.-99,
C        SEE ABOVE).
C
C     THE SUBROUTINE  PTKSUC
C
C     PTKSUC  IS CALLED ONLY AT THE END OF EVERY SUCCESSFUL TRIAL
C     SUCH THAT AN INCREMENT OCCURRED IN THE VALUE OF THE
C     CURRENT MAXIMUM  MSUC  AMONG ALL THE VALUES OF  KSUC  FROM
C     ALGORITHM START. A CALL TO  PTKSUC  THEREFORE PROVIDES
C     THE USER WITH THE OPERATIONALLY INTERESTING INFORMATION THAT
C     ALGORITHM STOP WOULD HAVE TAKEN PLACE, IF  NSUC  (INPUT
C     PARAMETER TO  SIGMA ) HAD BEEN GIVEN A LOWER VALUE, EQUAL TO
C     THE CURRENT  KSUC .
C     PTKSUC  IS CALLED ONLY IF  IPRINT.GE.0  AND  KSUC.LT.NSUC  .
C     THE DEFINITION STATEMENT IS
C         SUBROUTINE  PTKSUC ( KSUC )
C     WHERE  KSUC  IS THE CURRENT COUNT OF SUCCESSFUL TRIALS
C     (1 .LE. KSUC .LE. NSUC)
C
      DOUBLE PRECISION X0,H,EPS,DX,TOLREL,TOLABS
      DOUBLE PRECISION XRMIN,XRMAX,XMIN,FMIN
      DOUBLE PRECISION EPSAG,EPSAP,EPSC
      DOUBLE PRECISION EPSMAX,EPSR,F,FOPT,FTFMAX
      DOUBLE PRECISION FTFMIN,FTFOPT
C
      DOUBLE PRECISION X,HC,DXC,VMVT,EPSCO,VMCOR,VCOR
      DOUBLE PRECISION XRMIC,XRMAC,XOPT,FOPTC
C
      DOUBLE PRECISION DIST,BIAS,GRAGRA,GRA
C
      DIMENSION X0(N),XMIN(N),XRMIN(N),XRMAX(N)
C
      COMMON /DINCOM/ X(100,20),HC(20),DXC(20),VMVT(20,19),EPSCO(20),
     1    VMCOR(20),VCOR(20),XRMIC(100),XRMAC(100),XOPT(100),FOPTC,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJC,NTRAJR,
     3    ISEGBC,INKPBC,KPBR0C,NCF,IFEPC,INHPC
C
      COMMON /SCALE/ DIST(10,10,20),BIAS(10,20),GRAGRA(10,10,20),
     1    GRA(10,20),NGRA(20),LSCA,IDSCA,NX,NORD
C
C  DATA FOR THE VARIATION OF NOISE COEFFICIENT
C
      DATA EPSR/1.D4/,EPSAP/10.D0/,EPSAG/1.D3/
      DATA EPSMAX/1.D15/
C
      IFEP = 1
C
C  INITIALIZE COMMON AREA  /DINCOM/
C
      CALL INIT(N,X0,H,EPS,DX,IRAND,F,
     1    NTRAJ,ISEGBR,INKPBR,KPBR0,INHP,IFEP,XRMIN,XRMAX,IOUT)
C
C  CHECK PARAMETER VALUES
C
      IF(NPMIN.LE.0.OR.NPMAX0.LT.0.OR.INPMAX.LE.0.OR.
     1    NSUC.LE.0.OR.NTRIAL.LE.0)IOUT = -99
      IF (IOUT.EQ.(-99))RETURN
C
C  INITIALIZE VARIABLES
C
      EPSC = EPS
      NPMAX = NPMAX0
      ISTOPT = 0
      ISTOP = 0
      ICCOM = (NTRIAL+NTRIAL+4)/5
      NFEV = 0
      NTES = NSUC
      ICTS = NSUC-1
      FTFOPT = F
C
C  START SERIES OF TRIALS
C
      DO 30 IC = 1,NTRIAL
C
C  SET INITIALIZATION INDEX FOR NOISE GENERATOR
C
         IS = 0
         IF(IRAND.GT.0)IS = IRAND+IC-1
C
C  INITIALIZE TRIAL
C
         IF(IC.GT.1.AND.IC.LE.ICCOM)CALL REINIT(N,X0,EPSC,IS,F,IFEP)
         IF(IC.GT.ICCOM)CALL REINIT(N,XMIN,EPSC,IS,FOPT,IFEP)
C
         FTFMIN = F
         FTFMAX = F
         NFEV = NFEV+1
C
C  PRINT INITIAL CONDITIONS OF TRIAL
C
         IF(IPRINT.GT.0)CALL PTSEG(N,X0,FTFMIN,FTFMAX,0,NFEV)
C
C
C  DEACTIVATE SCALING
C
         IF(KPASCA.GT.NPMAX.OR.N.LE.1)CALL NOSCA
C
C  INITIALIZE COMMON AREA  /SCALE/
C
         IF(KPASCA.LE.NPMAX.AND.N.GT.1)CALL INISCA(N,NTRAJ)
C
C  PERFORM A TRIAL
C
         CALL TRIAL(N,NPMIN,NPMAX,KPASCA,TOLREL,TOLABS,
     1       IPRINT,XMIN,FTFMIN,
     1       FTFMAX,NFEV,KP,ISTOP)
C
C
C     EVALUATE PAST TRIAL AND PREPARE NEXT TRIAL
C
C
C  SET TRIAL DURATION
C
         IF(ISTOP.EQ.0)NPMAX = NPMAX+INPMAX
C
C  RESET CURRENT NUMBER OF SUCCESSES REQUIRED BEFORE STOPPING
C  COMPUTE INDICATOR OF TRIAL STOPPING CONDITIONS
C  UPDATE BEST CURRENT VALUES OF TRIAL STOPPING INDICATOR AND
C  OF FUNCTION  F(X)  AT TRIAL STOP
C
         IF((FTFMIN.GT.FTFOPT.OR.ISTOP.EQ.0).AND.ISTOPT.NE.0)GO TO 10
         IF(ITOLCH(FTFOPT,FTFMIN,TOLREL,TOLABS).EQ.0)NTES = NSUC
C
         FTFOPT = FTFMIN
         ISTOPT = ISTOP
  10     CONTINUE
         ISTOPT = IABS(ISTOPT)
         CALL RCLOPT(N,XMIN,FOPT)
         IF(ITOLCH(FTFOPT,FOPT,TOLREL,TOLABS).EQ.0)ISTOPT = -ISTOPT
         IF(ITOLCH(FTFMIN,FOPT,TOLREL,TOLABS).EQ.0)ISTOP = -ISTOP
C
C  END-OF-TRIAL PRINT OUT
C
         IF(IPRINT.GE.0)
     1      CALL PTRIAL ( N, XOPT, FOPT,
     2                    FTFMIN, FTFMAX, FTFOPT,
     3                    ISTOP, ISTOPT, NFEV, KP, IPRINT )
C
C  UPDATE INITIAL VALUE OF NOISE COEFFICIENT FOR NEXT TRIAL
C
         IF (ISTOP.EQ.0)EPSC = EPSC/EPSR
         IF(ISTOP.GT.0)EPSC = EPSC*EPSAG
         IF(ISTOP.LT.0.AND.IC.LE.ICCOM)EPSC = EPSC*EPSAP
         IF(ISTOP.LT.0.AND.IC.GT.ICCOM)EPSC = EPSC/EPSR
C
C  UPDATE OPERATING CONDITIONS FOR SELECTING (IN THE NEXT TRIAL)
C  THE STARTING VALUE OF THE NOISE COEFFICIENT OF THE NEW TRAJECTORY
C  AFTER BRANCHING
C
         IF (ISTOP.EQ.0)IFEP = 1
         IF (ISTOP.NE.0)IFEP = 2
C
C  UPDATE, PRINT, AND CHECK TRIAL STOPPING CONDITIONS
C
         IF(ISTOP.GT.0.AND.ISTOPT.GT.0)NTES = NTES-1
         IF(NTES.LE.0.OR.ISTOPT.LE.0.OR.ISTOP.LE.0.OR.NTES.GT.ICTS.OR.
     1       IPRINT.LT.0) GO TO 20
         KSUC = NSUC-ICTS
         CALL PTKSUC(KSUC)
         ICTS = NTES-1
  20     CONTINUE
         IF(NTES.LE.0.AND.ISTOPT.GT.0.AND.ISTOP.GT.0)GO TO 40
C
C  CONSTRAIN NOISE COEFFICIENT WITHIN BOUNDS
C
         EPSC = DMIN1(EPSC,EPSMAX)
         IF(EPSC.LE.0.D0)EPSC = 1.D0
  30     CONTINUE
C  END OF SERIES OF TRIALS
C
  40  CONTINUE
C
C  INDICATOR OF STOPPING CONDITIONS
C
      IOUT = ISTOPT
      FMIN = FOPT
C
      RETURN
C
      END
      SUBROUTINE INIT(NX,X0,H0,EPS0,DX0,IRAND,F,N1,N2,N3,N4
     1    ,INH,IFE,XRI,XRA,IT)
C
C  INIT  PERFORMS THE INITIALIZATION OF THE FIRST TRIAL.
C  THE PART OF THE INITIALIZATION WHICH IS COMMON ALSO TO THE TRIALS
C  FOLLOWING THE FIRST ONE IS PERFORMED BY CALLING THE SUBROUTINE
C  REINIT.
C
      DOUBLE PRECISION X0,H0,EPS0,DX0,F,XRI,XRA
      DOUBLE PRECISION FUNCT
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
      DIMENSION X0(NX),XRI(NX),XRA(NX)
      DATA NPMAX/100/
      DATA NTRAJM/20/
      DATA NTRAJ0/7/
      DATA INKPB0/10/
      DATA KPBR00/3/
C
C CHECK PARAMETER VALUES
C
      IT = 0
      IF (NX.GT.NPMAX.OR.NX.LT.1.OR.H0.LE.0.D0.OR.EPS0.LE.0.D0
     1    .OR.DX0.LE.0.D0) IT = -99
      IF (IT.EQ.(-99)) RETURN
C
C INITIALIZE SOME VARIABLES
C
      INHP = INH
      DO 10 IX = 1,NX
         XRMIN(IX) = XRI(IX)
         XRMAX(IX) = XRA(IX)
  10     CONTINUE
      CALL NOSCA
      NTRAJ = N1
      IF(NTRAJ.EQ.0)NTRAJ = NTRAJ0
      NTRAJ = MIN0(NTRAJ,NTRAJM)
      NTRAJ = MAX0(NTRAJ,3)
      N1 = NTRAJ
      ISEGBR = N2
      IF(ISEGBR.EQ.0)ISEGBR = (1+NTRAJ)/2
      ISEGBR = MIN0(ISEGBR,NTRAJ)
      ISEGBR = MAX0(ISEGBR,1)
      N2 = ISEGBR
      INKPBR = N3
      IF(INKPBR.EQ.0)INKPBR = INKPB0
      N3 = INKPBR
      KPBR0 = N4
      IF(KPBR0.EQ.0)KPBR0 = KPBR00
      KPBR0 = MOD(KPBR0,INKPBR)
      N4 = KPBR0
      NDIM = NX
      NTRAJR = NTRAJ-1
      NCF = 1
      F = FUNCT(NX,X0)
      CALL STOOPT(NX,X0,F)
      DO 20 ID = 1,NTRAJ
         H(ID) = H0
         DX(ID) = DX0
  20     CONTINUE
C
C INITIALIZE REMAINING VARIABLES
C
      CALL REINIT(NX,X0,EPS0,IRAND,F,IFE)
C
      RETURN
      END
      SUBROUTINE REINIT(NX,X0,EPS0,IRAND,F,IFE)
C
C  REINIT  PERFORMS THE INITIALIZATION OF ALL TRIALS FOLLOWING THE
C  FIRST TRIAL, AND PART OF THE INITIALIZATION OF THE FIRST TRIAL.
C
      DOUBLE PRECISION X0,EPS0,F
      DOUBLE PRECISION EPSV,G
      DOUBLE PRECISION CHAOS
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
      DIMENSION X0(NX)
      DATA EPSV/1.D0/
C
C INITIALIZE RANDOM NOISE GENERATOR
C
      G = CHAOS(IRAND)
C
      IFEP = IFE
      KGEN = 0
      KTIM = 0
      DO 30 ID = 1,NTRAJ
         DO 10 IC = 1,NDIM
            X(IC,ID) = X0(IC)
  10        CONTINUE
         IE(ID) = 0
         DO 20 IT = 1,NTRAJR
            ISVT(ID,IT) = 1
            VMVT(ID,IT) = F
  20        CONTINUE
         EPS(ID) = EPS0*EPSV**(ISEGBR-ID)
         VMCOR(ID) = F
         VCOR(ID) = F
  30     CONTINUE
      RETURN
      END
      SUBROUTINE TRIAL(N,NPMIN,NPMAX,KPASCA,
     1    TOLREL,TOLABS,IPRINT,XMIN,FMIN,
     2    FMAX,NFEV,NR,ISTOP)
C
C  THE SUBROUTINE  TRIAL  GENERATES A TRIAL, I.E. A SET OF COMPLETE
C  SIMULTANEOUS TRAJECTORIES BY REPEATEDLY PERFORMING
C     A CALL TO THE SUBROUTINE  GENEVA  WHICH GENERATES THE SET OF
C        SIMULTANEOUS TRAJECTORY SEGMENTS CORRESPONDING TO THE CURRENT
C        OBSERVATION PERIOD, AND PERFORMS THE TRAJECTORY SELECTION
C     A (POSSIBLE) CALL TO THE SUBROUTINE  PTSEG  WHICH PERFORMS
C        END-OF-SEGMENT OUTPUT
C     A CHECK OF THE TRIAL STOPPING CRITERIA (WITH THE AID OF THE
C        FUNCTION  ITOLCH
C     A DECISION ABOUT ACTIVATING OR DEACTIVATING THE SCALING OF
C        THE VARIABLES (ACTIONS PERFORMED BY CALLING THE SUBROUTINES
C        ACTSCA  AND  NOSCA).
C
      DOUBLE PRECISION TOLREL,TOLABS,XMIN,FMIN,FMAX
      DIMENSION XMIN(N)
      DATA IRNF/7/
C
      DO 20 IR = 1,NPMAX
C
C ACTIVATE SCALING
C
         IF(IR.GE.KPASCA.AND.IR.GT.N*IRNF)CALL ACTSCA
         NR = IR
C
C GENERATE AND EVALUATE THE SIMULTANEOUS TRAJECTORY SEGMENTS
C PERIOD
C
         CALL GENEVA(N,XMIN,FMIN,FMAX,NFEV)
C
C PRINT RESULTS OF OBSERVATION PERIOD
C
         IF(IPRINT.GT.0)CALL PTSEG(N,XMIN,FMIN,FMAX,IR,NFEV)
C
C CHECK TRIAL STOPPING CONDITIONS
C
         IF(IR.LT.NPMIN)GO TO 10
         ISTOP = ITOLCH(FMAX,FMIN,TOLREL,TOLABS)
         IF(ISTOP.NE.0)GO TO 30
C
  10     CONTINUE
  20     CONTINUE
  30  CONTINUE
      CALL NOSCA
C
      RETURN
      END
      SUBROUTINE GENEVA(NX,XMIN,FMIN,FMAX,NCEF)
C
C  GENEVA  PERFORMS THE GENERATION AND THE FINAL PROCESSING AND
C  EVALUATION OF THE SET OF TRAJECTORY SEGMENTS CORRESPONDING TO
C  THE CURRENT OBSERVATION PERIOD.
C  GENEVA  UPDATES THE SCALING ARRAYS  DIST  AND  BIAS  BY CALLING
C             THE SUBROUTINES  SEGSCA  AND  UPDSCA
C          GENERATES THE TRAJECTORY SEGMENTS BY CALLING THE SUB-
C             ROUTINE  PERIOD
C          DETERMINES SOME END-OF-SEGMENT RESULTS  (FPFMIN, FPFMAX,
C             XPFMIN)  USING THE RESCALING CAPABILITIES OF THE SUB-
C             ROUTINES  SEGSCA  AND  VARSCA.
C
      DOUBLE PRECISION XMIN,FMIN,FMAX
      DOUBLE PRECISION FM
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
      DIMENSION XMIN(NX)
C
C UPDATE SCALING DATA
C
      DO 10 ID = 1,NTRAJ
         CALL SEGSCA(ID)
         CALL UPDSCA(NX,X(1,ID))
  10     CONTINUE
C
C GENERATE THE SIMULTANEOUS TRAJECTORY SEGMENTS
C
      CALL PERIOD
C
C EXTRACT AND RESCALE SOME FINAL VALUES
C
      FM = VCOR(1)
      FMAX = VCOR(1)
      IFM = 1
      DO 30 ID = 2,NTRAJ
         FMAX = DMAX1(FMAX,VCOR(ID))
         IF(VCOR(ID).GE.FM)GO TO 20
         FM = VCOR(ID)
         IFM = ID
  20     CONTINUE
  30     CONTINUE
      DO 40 IC = 1,NDIM
         XMIN(IC) = X(IC,IFM)
  40     CONTINUE
      FMIN = FM
      NCEF = NCF
      CALL SEGSCA(IFM)
      CALL VARSCA(NX,XMIN)
C
      RETURN
      END
      SUBROUTINE PERIOD
C
C  PERIOD  IS CALLED BY SUBROUTINE  GENEVA  TO PERFORM THE GENERATION
C  OF THE TRAJECTORY SEGMENTS.
C  PERIOD  - COMPUTES THE DURATION OF THE OBSERVATION PERIOD, I.E. THE
C              NUMBER  NHP  OF ACCEPTED INTEGRATION STEPS IN A PERIOD
C          - COMPUTES ALL THE SEGMENT STEPS BY REPEATEDLY CALLING THE
C              SUBROUTINE  STEP
C          - PERFORMS THE SEGMENT SELECTION BY CALLING THE SUBROUTINE
C               BRASI
C
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
C
C DETERMINE DURATION OF OBSERVATION PERIOD
C (NUMBER OF TIME INTEGRATION STEPS)
C
      KGEN = KGEN+1
      NKGEN = 1
      IF(INHP.EQ.1)NKGEN=
     1    INT(SNGL(DLOG(DBLE(FLOAT(KGEN))+.5D0)/DLOG(2.D0)))+1
      IF(INHP.EQ.2)NKGEN = INT(SNGL(DSQRT(DBLE(FLOAT(KGEN))+.5D0)))
      IF(INHP.EQ.3)NKGEN = KGEN
C
C PERFORM THE REQUIRED NUMBER OF INTEGRATION STEPS
C (FOR ALL TRAJECTORIES)
C
      DO 10 IK = 1,NKGEN
C
C PERFORM A SINGLE INTEGRATION STEP
C (FOR ALL TRAJECTORIES)
C
         CALL STEP(IK)
  10     CONTINUE
C
C MANAGE THE TRAJECTORY BRANCHING PROCESS
C
      CALL BRASI
      RETURN
      END
      SUBROUTINE BRASI
C
C  BRASI  PERFORMS THE SELECTION PROCESS FOR THE TRAJECTORIES
C  BRASI  - UPDATES THE DATA ABOUT THE PAST TRAJECTORIES
C         - ASKS FOR THE TRAJECTORY-SELECTION ORDERING BY CALLING THE
C              SUBROUTINE  ORDER
C         - DISCARDS ONE OF THE TRAJECTORIES
C         - PERFORMS BRANCHING ON ONE OF THE REMAINING TRAJECTORIES
C         - MOVES THE DATA OF THE UNPERTURBED CONTINUATION
C              TO THE POSITION OF THE PERTURBED CONTINUATION
C         - CALLS THE SUBROUTINE  COMPAS  TO EXAMINE DATA ABOUT PAST
C              HISTORY OF THE TRAJECTORIES AND DISCARD IRRILEVANT DATA
C
      DOUBLE PRECISION DFAC,DLEPMX,DLFACL
      DOUBLE PRECISION EFAC,EPSMAX,FACG
      DOUBLE PRECISION CHAOS
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
C
      DATA FACG/10.D0/
      DATA EFAC/.5D0/
      DATA DFAC/1.D3/
      DATA EPSMAX/1.D15/
      DATA DLFACL /0.301029995663981194D0/
      DATA DLEPMX /25.D0/
C
C UPDATE PAST HISTORY DATA
C
      DO 10 ID = 1,NTRAJ
         VMVT(ID,NTRAJR) = VMCOR(ID)
         ISVT(ID,NTRAJR) = ID
  10     CONTINUE
C
C OBTAIN TRAJECTORY-SELECTION ORDERING
C
      CALL ORDER(IP,IM,IU)
C
C DECIDE WHICH TRAJECTORY IS TO BE BRANCHED
C
      IF(MOD(KGEN,INKPBR).EQ.KPBR0)IM = IP
C
C PERFORM BRANCHING
C
      DO 20 IC = 1,NDIM
         X(IC,IU) = X(IC,IM)
  20     CONTINUE
      H(IU) = H(IM)
      IE(IU) = IE(IM)
      DO 30 IT = 1,NTRAJR
         ISVT(IU,IT) = ISVT(IM,IT)
         VMVT(IU,IT) = VMVT(IM,IT)
  30     CONTINUE
      EPS(IU) = EPS(IM)
      DX(IU) = DX(IM)
      VCOR(IU) = VCOR(IM)
      DO 40 ID = 1,NTRAJ
         VMCOR(ID) = VCOR(ID)
  40     CONTINUE
C
C UPDATE PAST-HISTORY-DATA MATRICES
C
      CALL COMPAS
C
C UPDATE SCALING DATA
C
      CALL MOVSCA(IU,IM)
C
C UPDATE NOISE COEFFICIENT VALUES
C
      IF (EPS(IU).LE.0.D0) GO TO 50
      IF(IFEP.EQ.2)
     1    EPS(IU) = EPS(IU)*FACG**(CHAOS(0)-EFAC)
      IF(IFEP.EQ.1)
     1    EPS(IU) = FACG**(DMIN1(DLEPMX,
     1    DLOG10(EPS(IU))+(CHAOS(-1)-EFAC)*DLFACL))
      EPS(IU) = DMIN1(EPS(IU),EPSMAX)
  50  CONTINUE
C
C UPDATE MAGNITUDE OF SPATIAL DISCRETIZATION INCREMENT
C
      DX(IU) = DX(IU)*DFAC**CHAOS(0)
      RETURN
      END
      SUBROUTINE ORDER(IP,IM,IU)
C
C  ORDER  COMPARES THE TRAJECTORIES FROM THE POINT OV VIEW OF PAST
C  HISTORY (BY CALLING THE FUNCTION  IPREC ) AND FROM THE POINT OF VIEW
C  OF THEIR CURRENT VALUE OF  EPS  (BY CALLING THE FUNCTION  IPRECE)
C  AND PROVIDES THE TRAJECTORY ORDERING NEEDED FOR SELECTING THE TRA-
C  JECTORY WHICH IS TO BE BRANCHED.
C
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
      DIMENSION IORD(20)
      DATA KP/0/
      IR = 0
C
C ASSIGN INITIAL ORDERING
C
  10  CONTINUE
      DO 20 I = 1,NTRAJ
         IORD(I) = I
  20     CONTINUE
C
C SORT TRAJECTORIES ...
C
  30  CONTINUE
      IR = IR+1
C
      DO 60 I = 1,NTRAJR
         I1 = I+1
         DO 50 J = I1,NTRAJ
            K1 = IORD(I)
            K2 = IORD(J)
C
C ... ACCORDING TO PAST HISTORY ...
C
            IF(IR.NE.2)KP = IPREC(K1,K2)
            IF(KP.EQ.0.AND.IR.EQ.1)GO TO 10
C
C ... OR ACCORDING TO NOISE LEVEL
C
            IF(IR.EQ.2)KP = IPRECE(K1,K2)
            IF(KP.EQ.0)GO TO 40
            KM = K1+K2-KP
            IORD(I) = KP
            IORD(J) = KM
  40        CONTINUE
  50        CONTINUE
  60     CONTINUE
      IF(IR.EQ.2)GO TO 30
C
C RETURN THE INDICES OF THE SEGMENTS WHICH IN THE ORDERING
C OCCUPY THE FIRST, THE LAST, AND A SUITABLE MEDIUM LEVEL POSITION
C
      IP = IORD(1)
      IU = IORD(NTRAJ)
      IM = IORD(ISEGBR)
C
      RETURN
      END
      INTEGER FUNCTION IPREC(ID1,ID2)
C
C  IPREC  DETERMINES THE PRECEDENCE RELATION BETWEEN TWO TRAJECTORIES
C  BASED ON THE PAST HISTORY DATA
C
      DOUBLE PRECISION VM1,VM2
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
C
      VM1 = VMVT(ID1,NTRAJR)
      VM2 = VMVT(ID2,NTRAJR)
      DO 10 IIT = 1,NTRAJR
         IT = 1+NTRAJR-IIT
         IF(ISVT(ID1,IT).EQ.ISVT(ID2,IT))GO TO 20
         VM1 = DMIN1(VM1,VMVT(ID1,IT))
         VM2 = DMIN1(VM2,VMVT(ID2,IT))
  10     CONTINUE
  20  CONTINUE
      IPREC = 0
      IF(VM2.LT.VM1)IPREC = ID2
      IF(VM2.GT.VM1)IPREC = ID1
C
      RETURN
      END
      INTEGER FUNCTION IPRECE(ID1,ID2)
C
C  IPRECE  DETERMINES THE PRECEDENCE RELATION BETWEEN TWO TRAJECTORIES
C  BASED ON THEIR CURRENT VALUE OF  EPS
C
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
      IPRECE = 0
      IF(KGEN.GT.ISEGBR*INKPBR)GO TO 10
      IF(EPS(ID2).LT.EPS(ID1))IPRECE = ID1
      IF(EPS(ID2).GT.EPS(ID1))IPRECE = ID2
      RETURN
C
  10  CONTINUE
      IF(EPS(ID2).LT.EPS(ID1))IPRECE = ID2
      IF(EPS(ID2).GT.EPS(ID1))IPRECE = ID1
C
      RETURN
      END
      SUBROUTINE COMPAS
C
C  COMPAS  TAKES CARE OF THE STORAGE OF PAST HISTORY DATA, DISCARDING
C  ALL DATA NOT NEEDED BY THE ONLY USER OF SUCH DATA, THE FUNCTION
C  IPREC .
C
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
C
      IT1 = 1
      DO 30 IT = 2,NTRAJR
         IT1 = IT-1
         DO 10 ID = 1,NTRAJ
            IF(ISVT(ID,IT).NE.ISVT(ID,IT1))GO TO 20
  10        CONTINUE
         GO TO 120
  20     CONTINUE
  30     CONTINUE
      IT1 = 1
      NCV = 0
      DO 50 ID = 1,NTRAJ
         DO 40 IDD = 1,NTRAJ
            IF(ISVT(ID,IT1).EQ.ISVT(IDD,IT1))NCV = NCV+1
  40        CONTINUE
  50     CONTINUE
      DO 80 IT = 2,NTRAJR
         IT1 = IT-1
         NCN = 0
         DO 70 ID = 1,NTRAJ
            DO 60 IDD = 1,NTRAJ
               IF(ISVT(ID,IT).EQ.ISVT(IDD,IT))NCN = NCN+1
  60           CONTINUE
  70        CONTINUE
         IF(NCN.EQ.NCV)GO TO 110
         NCV = NCN
  80     CONTINUE
      DO 90 ID = 1,NTRAJ
         IF(ISVT(1,1).NE.ISVT(ID,1))GO TO 100
  90     CONTINUE
      IT = 2
      GO TO 140
 100  CONTINUE
 110  CONTINUE
 120  CONTINUE
      IT = IT1+1
      DO 130 ID = 1,NTRAJ
         VMVT(ID,IT) = DMIN1(VMVT(ID,IT),VMVT(ID,IT1))
 130     CONTINUE
 140  CONTINUE
      DO 160 ITC = IT,NTRAJR
         ITM = ITC-1
         DO 150 ID = 1,NTRAJ
            VMVT(ID,ITM) = VMVT(ID,ITC)
            ISVT(ID,ITM) = ISVT(ID,ITC)
 150        CONTINUE
 160     CONTINUE
C
      RETURN
      END
      SUBROUTINE STEP(IK)
C
C  STEP  PERFORMS A SINGLE TIME-INTEGRATION STEP FOR EACH ONE OF THE
C  SIMULTANEOUS TRAJECTORIES BY REPEATEDLY CALLING THE SUBROUTINE  SSTEP
C
      DOUBLE PRECISION F
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      DOUBLE PRECISION XID,HID,EPSID,DXID
      DIMENSION XID(100)
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
C
      KTIM = KTIM+1
C
C LOOP ON THE SIMULTANEOUS TRAJECTORY SEGMENTS
      DO 30 ID = 1,NTRAJ
C
C INFORM THE SCALING SUBPROGRAMS (VIA THE COMMON AREA /SCALE/)
C THAT SCALING OPERATIONS ARE TO BE PERFORMED ON SEGMENT  ID .
         CALL SEGSCA(ID)
         F = VCOR(ID)
C
C PERFORM A TIME-INTEGRATION STEP ON SEGMENT  ID .
         KA = KTIM
         NX = NDIM
         DO 10 IX = 1,NX
            XID(IX) = X(IX,ID)
  10        CONTINUE
         HID = H(ID)
         EPSID = EPS(ID)
         DXID = DX(ID)
         IEID = IE(ID)
C
         CALL SSTEP(KA,NX,XID,HID,EPSID,DXID,IEID,F)
C
         DO 20 IX = 1,NX
            X(IX,ID) = XID(IX)
  20        CONTINUE
         H(ID) = HID
         EPS(ID) = EPSID
         DX(ID) = DXID
         IE(ID) = IEID
         VCOR(ID) = F
         VMCOR(ID) = DMIN1(VMCOR(ID),F)
         IF(IK.EQ.1)VMCOR(ID) = F
         IF(KTIM.EQ.1)IE(ID) = 0
  30     CONTINUE
C
      RETURN
      END
      SUBROUTINE SSTEP(KTIM,NDIM,X,H,EPS,DX,IE,F)
C
C  THE BASIC TIME-INTEGRATION STEP FOR A GIVEN TRAJECTORY IS PERFORMED
C  BY THE SUBROUTINE  STEP  WHICH
C   - CALLS THE FUNCTION  FUNCT0  TO COMPUTE THE VALUE OF  F
C   - CALLS THE SUBROUTINE  UNITRV  TO COMPUTE THE RANDOM DIRECTION
C        ALONG WHICH THE DIRECTIONAL DERIVATIVE  GAM/N  IS TO BE
C        COMPUTED
C   - CALLS THE SUBROUTINE  DERFOR (OR DERCEN ) TO COMPUTE THE FORWARD-
C        (OR CENTRAL-) DIFFERENCES DIRECTIONAL DERIVATIVE  GAM/N
C   - CALLS THE SUBROUTINE  NEWH  TO ACCEPT OR REJECT THE FIRST HALF-
C        STEP AND OBTAIN AN UPDATED VALUE FOR  H
C   - CALLS THE SUBROUTINE  CUMSCA  TO UPDATE THE CUMULATED SCALING DATA
C   - UPDATES THE SPATIAL DISCRETIZATION INCREMENT  DX  BASED ON THE
C        RESULTS OF CALLING THE FUNCTION  ITOLCH
C   - CALLS THE SUBROUTINE  GAUSRV  TO PERFORM THE SECOND HALF-STEP.
C
      DOUBLE PRECISION X,H,EPS,DX,F
      DOUBLE PRECISION DFDX,DFDXV,DXMAX,DXMIN
      DOUBLE PRECISION EPSR,FS,FV,FVS,HMINS,HR,HS
      DOUBLE PRECISION RCD,RDX,STF,TOLABS,TOLRA,TOLRI
      DOUBLE PRECISION W,XP
      DOUBLE PRECISION FUNCT0
      DIMENSION X(NDIM)
      DIMENSION W(100),XP(100)
      DATA RDX/1.D-4/
      DATA DXMIN/1.D-35/
      DATA DXMAX/1.D3/
      DATA HR/1.D-1/
      DATA HMINS/1.D-30/
      DATA STF /100.D0/
      DATA RCD/2.D0/
      DATA TOLRI/1.D-5/
      DATA TOLRA/1.D-11/
      DATA TOLABS/0.D0/
C
      IEC = 0
      FV = F
  10  CONTINUE
  20  CONTINUE
C
C TAKE A RANDOM DIRECTION FOR THE DIRECTIONAL DERIVATIVE
      CALL UNITRV(NDIM,W)
C
C COMPUTE FORWARD-DIFFERENCE DERIVATIVE
      CALL DERFOR(NDIM,X,FV,DX,W,DFDX)
C
C TRY THE FIRST HALF-STEP
      DO 30 IC = 1,NDIM
         XP(IC) = X(IC)-H*W(IC)*DFDX*DBLE(FLOAT(NDIM))
  30     CONTINUE
      HS = H
      F = FUNCT0(NDIM,XP)
      FVS = FV+DX*DABS(DFDX)
C
C UPDATE STEPLENGTH  H  AND ACCEPT OR REJECT THE HALF-STEP
      CALL NEWH(KTIM,FVS,F,H,IE,IEC)
      IF(IEC.LE.0)GO TO 50
      IE = IE-1
      IEC = IEC-1
      H = HS
      DFDXV = DFDX
C
C COMPUTE CENTRAL-DIFFERENCES DERIVATIVE
      CALL DERCEN(NDIM,X,FV,DX,W,DFDX)
C
C TRY AGAIN THE FIRST HALF-STEP
      DO 40 IC = 1,NDIM
         XP(IC) = X(IC)-H*W(IC)*DFDX*DBLE(FLOAT(NDIM))
  40     CONTINUE
      F = FUNCT0(NDIM,XP)
      FVS = FV+DX*DABS(DFDXV-DFDX)
C
C
C UPDATE STEPLENGTH  H  AND ACCEPT OR REJECT THE HALF-STEP
      CALL NEWH(KTIM,FVS,F,H,IE,IEC)
C
C UPDATE CUMULATED PAST SCALING DATA
      IF(IEC.GE.1)CALL CUMSCA(NDIM,W,DFDX)
      IF(IEC.GE.1)GO TO 10
      DX = DX*RDX
C
C FIRST HALF-STEP ACCEPTED
  50  CONTINUE
C
C UPDATE CUMULATED PAST SCALING DATA
      CALL CUMSCA(NDIM,W,DFDX)
      FS = FV+DX*DABS(DFDX)
      IF(ITOLCH(FS,FV,TOLRI,TOLABS).EQ.0)DX = DX/RCD
      IF(ITOLCH(FS,FV,TOLRA,TOLABS).GT.0)DX = DX*RCD
      EPSR = DSQRT(H)*EPS
C
C TAKE A SAMPLE INCREMENT OF THE WIENER PROCESS
      CALL GAUSRV(NDIM,W)
C
C TRY THE SECOND HALF-STEP
      DO 60 IC = 1,NDIM
         XP(IC) = XP(IC)+EPSR*W(IC)
  60     CONTINUE
      F = FUNCT0(NDIM,XP)
C
C ACCEPT OR REJECT THE COMPLETE STEP
      IF (F-FV.LE.EPS*EPS*STF) GO TO 70
      H = H*HR
      IE = IE+1
      IF (H.GT.HMINS) GO TO 20
C
C STEP ACCEPTED
  70  CONTINUE
      DO 80 IC = 1,NDIM
         X(IC) = XP(IC)
  80     CONTINUE
      DX = DMIN1(DX,DXMAX)
      DX = DMAX1(DX,DXMIN)
C
      RETURN
      END
      SUBROUTINE NEWH(K,FV,F,H,IE,IEC)
C
C  NEWH  IS CALLED BY THE SUBROUTINE  SSTEP  TO DECIDE WHETHER TO ACCEPT
C  OR REJECT THE FIRST HALF-STEP, AND TO PROVIDE AN UPDATED VALUE FOR  H
C
      DOUBLE PRECISION FV,F,H
      DOUBLE PRECISION FA,FR,HMAX,HMIN,R
      DIMENSION FR(3),FA(4)
      DATA FR/1.05D0,2.D0,10.D0/
      DATA FA/1.D0,1.1D0,2.D0,10.D0/
      DATA HMIN/1.D-30/
      DATA HMAX/1.D25/
      DATA IECMAX/50/
C
      IF(FV.LT.F)GO TO 20
C
C STEP ACCEPTED, POSSIBLY INCREASE THE STEPLENGTH  H
C
      R = FA(1)
      IF(IE*2.LT.K)R = FA(2)
      IF(IE*3.LT.K)R = FA(3)
      IF(IE.EQ.0.AND.K.GT.1)R = FA(4)
      H = H*R
  10  CONTINUE
      IEC = 0
      GO TO 30
C
  20  CONTINUE
      IE = IE+1
      IEC = IEC+1
      IF(IEC.GT.IECMAX)GO TO 10
C
C STEP REJECTED, DECREASE  H
C
      IC = MIN0(3,IEC)
      R = FR(IC)
      H = H/R
  30  CONTINUE
      H = DMIN1(H,HMAX)
      H = DMAX1(H,HMIN)
C
      RETURN
      END
      SUBROUTINE DERFOR(NDIM,X,F,DX,W,DFDX)
C
C  DERFOR  COMPUTED THE FORWARD FINITE-DIFFERNCES DIRECTIONAL
C  DERIVATIVES (CALLING  FUNCT0 )
C
      DOUBLE PRECISION X,F,DX,W,DFDX
      DOUBLE PRECISION DXF,DXFF,DXMAX,FN,S,XX
      DOUBLE PRECISION FUNCT0
      DIMENSION X(NDIM),W(NDIM)
      DIMENSION XX(100)
      DATA DXFF/1.D6/,DXF/1.D1/
      DATA DXMAX/1.D6/
C
  10  CONTINUE
  20  CONTINUE
      S = 0.D0
      DO 30 IC = 1,NDIM
         XX(IC) = X(IC)+W(IC)*DX
         S = S+(XX(IC)-X(IC))**2
  30     CONTINUE
      IF(S.GT.0.D0)GO TO 40
      DX = DX*DXFF
      GO TO 20
  40  CONTINUE
      FN = FUNCT0(NDIM,XX)
      DFDX = (FN-F)/DX
      IF(DX.GT.DXMAX)RETURN
      IF(DABS(DFDX).GT.1.D0)RETURN
      IF(DFDX**2.GT.0.D0)GO TO 50
      DX = DX*DXF
      GO TO 10
  50  CONTINUE
C
      RETURN
      END
      SUBROUTINE DERCEN(NDIM,X,F,DX,W,DFDX)
C
C  DERFOR  COMPUTED THE CENTRAL FINITE-DIFFERNCES DIRECTIONAL
C  DERIVATIVES (CALLING  FUNCT0 )
C
      DOUBLE PRECISION X,F,DX,W,DFDX
      DOUBLE PRECISION FN,FR,XX
      DOUBLE PRECISION FUNCT0
      DIMENSION X(NDIM),W(NDIM)
      DIMENSION XX(100)
C
      DO 10 IC = 1,NDIM
         XX(IC) = X(IC)-W(IC)*DX
  10     CONTINUE
      FR = FUNCT0(NDIM,XX)
      FN = F+DFDX*DX
      DFDX = (FN-FR)/(2.D0*DX)
C
      RETURN
      END
      SUBROUTINE RCLOPT(N,XO,FO)
C
C  RCLOPT  RECALLS THE CURRENT BEST MINIMUM VALUE  FOPT  FOUND SO FAR
C  FROM ALGORITHM START, AND THE POINT  XOPT  (OR POSSIBLY ONE OF THE
C  POINTS) WHERE  FOPT  WAS OBTAINED
C
      DOUBLE PRECISION XO,FO
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
      DIMENSION XO(N)
C
      DO 10 I = 1,N
         XO(I) = XOPT(I)
  10     CONTINUE
      FO = FOPT
C
      RETURN
      END
      SUBROUTINE STOOPT(N,XO,FO)
C
C  STOOPT  STORES THE CURRENT BEST MINIMUM VALUE  FOPT  FOUND SO FAR
C  FROM ALGORITHM START, AND THE POINT  XOPT  (OR POSSIBLY ONE OF THE
C  POINTS) WHERE  FOPT  WAS OBTAINED
C
      DOUBLE PRECISION XO,FO
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
      DIMENSION XO(N)
C
      DO 10 I = 1,N
         XOPT(I) = XO(I)
  10     CONTINUE
      FOPT = FO
C
      RETURN
      END
      DOUBLE PRECISION FUNCTION FUNCT0(N,XX)
C
C  FUNCT0  IS CALLED  WHENEVER THE VALUE OF THE FUNCLION  F  IS REQUIRED
C  IN THE NUMERICAL INTEGRATION PROCESS.
C  THE FUNCTION  FUNCT0
C   - RESCALES THE VARIABLES BY CALLING THE SUBROUTINE  VARSCA
C   - CALLS THE SUBROUTINE  RANGE  TO TAKE CARE OF THE CASES WHERE THE
C      CURRENT POINT  X  IS OUTSIDE A GIVEN ADMISSIBLE REGION
C   - CALLS THE USER-SUPPLIED FUNCTION  FUNCT  TO ACTUALLY COMPUTE THE
C      VALUE OF  F
C   - POSSIBLY CALLS THE SUBROUTINE  STOOPT  TO UPDATE THE CURRENT
C        BEST MINIMUM FUNCTION VALUE  FOPT  AND THE CORRESPONDING
C        MINIMIZER  XOPT
C
      DOUBLE PRECISION XX
      DOUBLE PRECISION F,R,XS
      DOUBLE PRECISION FUNCT
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
      DIMENSION XX(N)
      DIMENSION XS(100)
C
      DO 10 IX = 1,N
         XS(IX) = XX(IX)
  10     CONTINUE
C
C DESCALE  X-VARIABLES
      CALL VARSCA(N,XS)
C
C CONSTRAIN THE  X-VARIABLES WITHIN BOUNDS
      CALL RANGE(N,XS,XRMIN,XRMAX,R)
C
C COMPUTE THE FUNCTION VALUE...
      F = FUNCT(N,XS)+R
C
C ... AND POSSIBLY UPDATE THE BEST CURRENT MINIMUM
      IF(F.LT.FOPT)CALL STOOPT(N,XS,F)
      FUNCT0 = F
      NCF = NCF+1
C
      RETURN
      END
      SUBROUTINE RANGE (N,XS,XRMIN,XRMAX,R)
C
C  RANGE  IS CALLED BY THE FUNCTION  FUNCT0  TO TAKE CARE OF THE CASES
C  WHERE THE CURRENT POINT  X  IS OUTSIDE A GIVEN ADMISSIBLE REGION
C
      DOUBLE PRECISION XS,XRMIN,XRMAX,R
      DOUBLE PRECISION A,B,C,D,DLRMAX,RMAX,RR,XC
      DIMENSION XS(N),XRMIN(N),XRMAX(N)
      DATA RMAX /1.D35/
      DATA DLRMAX/80.5904782547915990D0/
C
      R = 0.D0
      DO 40 I = 1,N
         A = XRMAX(I)
         C = XRMIN(I)
         XC = XS(I)
         IF (XC.LE.A) GO TO 10
         B = A+A-C
         RR = RMAX
         IF (XC.LT.B) RR = DEXP((XC-A)*DLRMAX/(B-A))-1.D0
         R = R+RR
         XS(I) = XRMAX(I)
         GO TO 30
  10     CONTINUE
         IF(XC.GE.C)GO TO 20
         D = C+C-A
         RR = RMAX
         IF (XC.GT.D) RR = DEXP((C-XC)*DLRMAX/(C-D))-1.D0
         R = R+RR
         XS(I) = XRMIN(I)
  20     CONTINUE
  30     CONTINUE
  40     CONTINUE
C
      RETURN
      END
      INTEGER FUNCTION ITOLCH(FMAX,FMIN,TOLREL,TOLABS)
C
C  ITOLCH  DETERMINES  WHETHER TWO QUANTITIES ARE TO BE CONSIDERED NU-
C  MERICALLY EQUAL WITH RESPECT TO AN ABSOLUTE (OR RELATIVE) DIFFERENCE
C  CRITERION, WITHIN GIVEN TOLERANCES
C
      DOUBLE PRECISION FMAX,FMIN,TOLREL,TOLABS
C
      ISTOP = 0
C
C CHECK RELATIVE DIFFERENCE AGAINST  TOLREL
      IF(DABS(FMAX-FMIN).LE.TOLREL*(DABS(FMIN)+DABS(FMAX))/2.D0)
     1    ISTOP=ISTOP+1
C
C CHECK ABSOLUTE DIFFERENCE AGAINST  TOLABS
      IF(FMAX-FMIN.LE.TOLABS)ISTOP = ISTOP+2
      ITOLCH = ISTOP
C
      RETURN
      END
      SUBROUTINE INISCA(N,ND)
C
C  INISCA  INITIALIZES THE COOMON AREA  /SCALE/  FOR THE SCALING DATA
C
      DOUBLE PRECISION DIST,BIAS,GRAGRA,GRA
      COMMON /SCALE/ DIST(10,10,20),BIAS(10,20),GRAGRA(10,10,20),
     1    GRA(10,20),NGRA(20),LSCA,IDSCA,NX,NORD
      DATA NXMSCA/10/
C
      LSCA = -1
      IF(N.GT.NXMSCA.OR.N.EQ.1)RETURN
      LSCA = 0
      NX = N
      NORD = ND
      IDSCA = 1
      DO 1 ID = 1,NORD
         DO 2 IX = 1,NX
            DO 3 IY = 1,NX
               DIST(IX,IY,ID) = 0.D0
               GRAGRA(IX,IY,ID) = 0.D0
   3           CONTINUE
            DIST(IX,IX,ID) = 1.D0
            BIAS(IX,ID) = 0.D0
            GRA(IX,ID) = 0.D0
   2        CONTINUE
         NGRA(ID) = 0
   1     CONTINUE
C
      RETURN
      END
      SUBROUTINE NOSCA
C
C  NOSCA  DEACTIVATES THE SCALING
C
      DOUBLE PRECISION DIST,BIAS,GRAGRA,GRA
      COMMON /SCALE/ DIST(10,10,20),BIAS(10,20),GRAGRA(10,10,20),
     1    GRA(10,20),NGRA(20),LSCA,IDSCA,NX,NORD
C
      LSCA = -1
C
      RETURN
      END
      SUBROUTINE SEGSCA(ID)
C
C  SEGSCA  SELECTS THE TRAJECTORY WHICH MUST BE RESCALED
C
      DOUBLE PRECISION DIST,BIAS,GRAGRA,GRA
      COMMON /SCALE/ DIST(10,10,20),BIAS(10,20),GRAGRA(10,10,20),
     1    GRA(10,20),NGRA(20),LSCA,IDSCA,NX,NORD
C
      IDSCA = ID
C
      RETURN
      END
      SUBROUTINE VARSCA(N,X)
C
C  VARSCA  COMPUTES THE RESCALED VARIABLE  AX + B
C
      DOUBLE PRECISION X
      DOUBLE PRECISION XB
      DOUBLE PRECISION DIST,BIAS,GRAGRA,GRA
      COMMON /SCALE/ DIST(10,10,20),BIAS(10,20),GRAGRA(10,10,20),
     1    GRA(10,20),NGRA(20),LSCA,IDSCA,NX,NORD
      DIMENSION X(N),XB(10)
C
      IF(LSCA.LE.0)RETURN
      DO 1 I = 1,N
         XB(I) = BIAS(I,IDSCA)
         DO  2 J = 1,N
            XB(I) = XB(I)+DIST(I,J,IDSCA)*X(J)
   2        CONTINUE
   1     CONTINUE
      DO 3 I = 1,N
         X(I) = XB(I)
   3     CONTINUE
C
      RETURN
      END
      SUBROUTINE CUMSCA(N,W,DFDX)
C
C  CUMSCA  STORES CUMULATED STATISTICAL DATA ON THE ILL-CONDITIONING OF
C  F(AX+B) W.R.T. X
C
      DOUBLE PRECISION W,DFDX
      DOUBLE PRECISION DFDXMA
      DOUBLE PRECISION DIST,BIAS,GRAGRA,GRA
      COMMON /SCALE/ DIST(10,10,20),BIAS(10,20),GRAGRA(10,10,20),
     1    GRA(10,20),NGRA(20),LSCA,IDSCA,NX,NORD
      DIMENSION W(N)
      DATA DFDXMA/1.D8/
C
      IF(LSCA.LE.0)RETURN
      IF(DABS(DFDX).GT.DFDXMA)RETURN
      DO 1 I = 1,N
         DO 2 J = 1,N
            GRAGRA(I,J,IDSCA) = GRAGRA(I,J,IDSCA)+DFDX*W(I)*DFDX*W(J)
   2        CONTINUE
         GRA(I,IDSCA) = GRA(I,IDSCA)+DFDX*W(I)
   1     CONTINUE
      NGRA(IDSCA) = NGRA(IDSCA)+1
C
      RETURN
      END
      SUBROUTINE ACTSCA
C
C  ACTSCA  ACTIVATES THE RESCALING
C
      DOUBLE PRECISION DIST,BIAS,GRAGRA,GRA
      COMMON /SCALE/ DIST(10,10,20),BIAS(10,20),GRAGRA(10,10,20),
     1    GRA(10,20),NGRA(20),LSCA,IDSCA,NX,NORD
C
      IF(LSCA.EQ.0)LSCA = 1
C
      RETURN
      END
      SUBROUTINE MOVSCA(IU,IM)
C
C  MOVSCA  MOVES THE SCALING DATA OF THE UNPERTURBED CONTINUATION TO THE
C  POSITION OF THE PERTURBED CONTINUATION
C
      DOUBLE PRECISION DIST,BIAS,GRAGRA,GRA
      COMMON /SCALE/ DIST(10,10,20),BIAS(10,20),GRAGRA(10,10,20),
     1    GRA(10,20),NGRA(20),LSCA,IDSCA,NX,NORD
C
      IF(LSCA.LT.0)RETURN
      DO 1 I = 1,NX
         DO 2 J = 1,NX
            DIST(I,J,IU) = DIST(I,J,IM)
            GRAGRA(I,J,IU) = GRAGRA(I,J,IM)
   2        CONTINUE
         BIAS(I,IU) = BIAS(I,IM)
         GRA(I,IU) = GRA(I,IM)
   1     CONTINUE
      NGRA(IU) = NGRA(IM)
C
      RETURN
      END
      SUBROUTINE UPDSCA(N,X)
C
C  UPDSCA  UPDATES THE SCALING MATRIX  A  AND THE BIAS VECTOR  B BY
C  CALLING  EIGSCA  AND  VARSCA
C
      DOUBLE PRECISION X
      DOUBLE PRECISION AGRAI,ALA1,ALPHA,AMCOR,BIAST
      DOUBLE PRECISION CD,COR,DISTT,SN
      DOUBLE PRECISION EIGSCA
      DOUBLE PRECISION DIST,BIAS,GRAGRA,GRA
      COMMON /SCALE/ DIST(10,10,20),BIAS(10,20),GRAGRA(10,10,20),
     1    GRA(10,20),NGRA(20),LSCA,IDSCA,NX,NORD
      DIMENSION X(N)
      DIMENSION DISTT(10,10),BIAST(10),COR(10,10)
      DATA ALPHA /0.3D0/
C
      IF(LSCA.LE.0)RETURN
      ID = IDSCA
      IF(NGRA(ID).LT.2*NX*NX)GO TO 2
      AGRAI = 1.D0/DBLE(FLOAT(NGRA(ID)))
      AMCOR = 0.D0
      DO 3 I = 1,NX
         DO 4 J = 1,NX
         COR(I,J) = AGRAI*GRAGRA(I,J,ID)-AGRAI*GRA(I,ID)*AGRAI*GRA(J,ID)
            AMCOR = DMAX1(AMCOR,DABS(COR(I,J)))
   4        CONTINUE
   3     CONTINUE
      IF(AMCOR.LE.0.D0)GO TO 12
      DO 1 I = 1,NX
         DO 11 J = 1,NX
            COR(I,J) = COR(I,J)/AMCOR
  11        CONTINUE
   1     CONTINUE
      ALA1 = EIGSCA(COR)
      CD = ALA1*(1.D0+ALPHA)
      DO 5 I = 1,NX
         COR(I,I) = COR(I,I)-CD
         BIAST(I) = X(I)
   5     CONTINUE
      CALL VARSCA(NX,BIAST)
      SN = 0.D0
      DO 6 I = 1,NX
         DO 7 J = 1,NX
            DISTT(I,J) = 0.D0
            DO 8 K = 1,NX
               DISTT(I,J) = DISTT(I,J)-DIST(I,K,ID)*COR(K,J)
   8           CONTINUE
            SN = SN+DISTT(I,J)**2
   7        CONTINUE
   6     CONTINUE
      SN = 1.D0/DSQRT(SN/DBLE(FLOAT(NX)))
      DO 9 I = 1,NX
         BIAS(I,ID) = BIAST(I)
         DO 10 J = 1,N
            DIST(I,J,ID) = SN*DISTT(I,J)
            BIAS(I,ID) = BIAS(I,ID)-DIST(I,J,ID)*X(J)
            GRAGRA(I,J,ID) = 0.D0
  10        CONTINUE
         GRA(I,ID) = 0.D0
   9     CONTINUE
      NGRA(ID) = 0
   2  CONTINUE
  12  CONTINUE
C
      RETURN
      END
      DOUBLE PRECISION FUNCTION EIGSCA(COR)
C
C  EIGSCA COMPUTES THE LARGEST EIGENVALUE OF A MATRIX USED FOR RESCA-
C  LING, STARTING FROM A RANDOMLY-CHOSEN ESTIMATE (OBTAINED BY CALLING
C  THE SUBROUTINE  UNITRV ) OF THE CORRESPONDING EIGENVECTOR
C
      DOUBLE PRECISION COR
      DOUBLE PRECISION ALA1,ALA1I,ALA1O
      DOUBLE PRECISION PREC,SWW,W,WW
      DOUBLE PRECISION DIST,BIAS,GRAGRA,GRA
      COMMON /SCALE/ DIST(10,10,20),BIAS(10,20),GRAGRA(10,10,20),
     1    GRA(10,20),NGRA(20),LSCA,IDSCA,NX,NORD
      DIMENSION COR(10,10)
      DIMENSION W(10),WW(10)
      DATA PREC /1.D-3/
      DATA NRMIN /10/
      DATA NRMAX /100/
C
      CALL UNITRV(NX,W)
      ALA1 = 0.D0
      DO 1 IR = 1,NRMAX
         ALA1O = ALA1
         SWW = 0.D0
         DO 2 IX = 1,NX
            WW(IX) = 0.D0
            DO 3 JX = 1,NX
               WW(IX) = WW(IX)+COR(IX,JX)*W(JX)
   3           CONTINUE
            SWW = SWW+WW(IX)**2
   2        CONTINUE
         ALA1 = DSQRT(SWW)
         ALA1I = 1.D0/ALA1
         IF(IR.GE.NRMIN.AND.ALA1*PREC.GT.DABS(ALA1-ALA1O))GO TO 4
         DO 5 IX = 1,NX
            W(IX) = WW(IX)*ALA1I
   5        CONTINUE
   1     CONTINUE
   4  CONTINUE
      EIGSCA = ALA1
C
      RETURN
      END
      DOUBLE PRECISION FUNCTION CHAOS(INIZ)
C
C  CHAOS  GENERATES A RANDOM SAMPLE FROM ONE OUT OF FOUR POSSIBLE
C PROBABILITY DISTRIBUTIONS USING RANDOM NUMBERS UNIFORMLY
C DISTRIBUTED IN (0,1) GENERATED BY THE FUNCTION  UNIFRD
C
C  INIZ  IS AN INPUT PARAMETER AS FOLLOWS
C
C      INIZ>0          INITIALIZATION WITH SEED  INIZ.
C      INIZ=0          STANDARD GAUSSIAN DISTRIBUTION.
C      INIZ=-1         CAUCHY DISTRIBUTION.
C      INIZ=-2         UNIFORM DISTRIBUTION IN (-1,+1).
C      OTHERWISE       UNIFORM DISTRIBUTION IN ( 0,+1).
C
      DOUBLE PRECISION UNIFRD,PAI,A,B
C
      DATA PAI/3.14159265358979324D0/
C
      IF(INIZ.LE.0) GO TO 10
C
C INITIALIZATION.
C
      CHAOS = UNIFRD(INIZ)
      RETURN
C
  10  CONTINUE
      A = UNIFRD(0)
      IF(INIZ.NE.0) GO TO 20
      B = UNIFRD(0)
C
C GAUSSIAN RANDOM NUMBER BY POLAR METHOD
C
      CHAOS = DSQRT(-2.D0*DLOG(A))*DCOS(PAI*B)
C
      RETURN
  20  CONTINUE
C
C UNIFORM RANDOM NUMBER IN (0,1)
C
      CHAOS = A
C
C CAUCHY RANDOM NUMBER BY INVERSE TRANSFORMATION
C
      IF(INIZ.EQ.(-1)) CHAOS = DSIN(PAI*A)/DCOS(PAI*A)
C
C UNIFORM RANDOM NUMBER IN (-1,+1)
C
      IF(INIZ.EQ.(-2)) CHAOS = 2.D0*A-1.D0
C
      RETURN
      END
      DOUBLE PRECISION FUNCTION UNIFRD(INIZ)
C
C UNIFRD GENERATES THE RANDOM NUMBERS UNIFORMLY DISTRIBUTED IN (0,1)
C EXPLOITING THOSE GENERATED BY  ALKNUT  WITH A FURTHER RANDOMIZATION
C IF THE INPUT PARAMETER INIZ  IS NOT 0
C THE RANDOM NUMBER GENERATOR IS INITIALIZED
C
      DOUBLE PRECISION A,B,C,X
      DOUBLE PRECISION X0,P,P0,P1,P2,R1,R2
      DOUBLE PRECISION FINV
C
      DIMENSION X(61)
C
      DATA NREM/61/,NRIP/100/
      DATA A,B,C/-1.5D0,5.5D0,-2.0D0/
      DATA FINV/3.5D-5/
      DATA IREM/0/
      DATA P0/3.D0/,P1,P2/1.D0,3.D0/,R1,R2/0.25D0,0.75D0/
C
      IF(INIZ.NE.0.OR.IREM.EQ.0) GO TO 10
C
      I0 = IREM
      X0 = X(I0)
C
C NONLINEARIZATION OF X0 TO AVOID LONG-DISTANCE LINEAR RELATIONSHIP.
C
      IF(X0.GE.FINV)X0 = DMOD(1.D0/X0,1.D0)
C
C UPDATE A COMPONENT OF THE VECTOR X ...
C
      CALL ALKNUT(NREM,X,IREM)
C
C ... AND FURTHER RANDOMIZE
C
      UNIFRD = DMOD(X0+X(I0),1.D0)
C
      RETURN
C
C INITIALIZATION OF THE RANDOM NUMBER GENERATOR
C
  10  CONTINUE
C
      P = P0-1.D0/DBLE(FLOAT(IABS(INIZ))+100.0)
      DO 20 K = 1,NREM
C
         P = C+P*(B+P*A)
C
C
         X(K) = R1+(R2-R1)*(P-P1)/(P2-P1)
  20     CONTINUE
C
      IREM = 0
C
      DO 30 K = 1,NRIP
C
         CALL ALKNUT(NREM,X,IREM)
C
  30     CONTINUE
C
      UNIFRD = X(1)
C
      RETURN
      END
      SUBROUTINE ALKNUT(NREM,X,IREM)
C
C UPDATES THE COMPONENT IREM OF THE NREM-VECTOR X WITH A RANDOM NUMBER
C UNIFORMLY DISTRIBUTED IN (0,1) BY MEANS OF THE ALGORITHM
C OF MITCHELL-MOORE, MODIFIED AS SUGGESTED BY BRENT, QUOTED IN
C D.E.KNUTH, THE ART OF COMPUTER PROGRAMMING, SECOND EDITION,
C SECOND VOLUME, SEMINUMERICAL ALGORITHMS, ADDISON-WESLEY
C PUB. CO., READING (1981), PP. 26-28.
C
      DOUBLE PRECISION X
C
      DIMENSION X(NREM)
C
      DATA N1,N2/24,55/
C
      IF(IREM.NE.0) GO TO 10
C
      IREM = NREM
      I1 = NREM-N1
      I2 = NREM-N2
C
  10  CONTINUE
C
      X(IREM) = DMOD(X(I1)+X(I2),1.D0)
C
      IREM = 1+MOD(IREM,NREM)
      I1 = 1+MOD(I1,NREM)
      I2 = 1+MOD(I2,NREM)
C
      RETURN
      END
      SUBROUTINE GAUSRV(N,W)
C
C GENERATES A RANDOM VECTOR SAMPLE FROM AN N-DIMENSIONAL
C NORMAL DISTRIBUTION
C
      DOUBLE PRECISION W,X,Y,R
      DOUBLE PRECISION CHAOS
C
      DIMENSION W(N)
C
      NN = (N+1)/2
C
      DO 20 I = 1,NN
         II = 1+N-I
C
  10     CONTINUE
         X = CHAOS(-2)
         Y = CHAOS(-2)
         R = X*X+Y*Y
C
         IF(R.GT.1.D0) GO TO 10
C
         R = DSQRT(-2.D0*DLOG(R)/R)
C
         W(I) = X*R
         W(II) = Y*R
C
  20     CONTINUE
C
      RETURN
      END
      SUBROUTINE UNITRV(N,W)
C
C GENERATES A RANDOM VECTOR UNIFORMLY DISTRIBUTED
C ON THE UNIT SPHERE.
C
      DOUBLE PRECISION W,WW
C
      DIMENSION W(N)
C
      CALL GAUSRV(N,W)
      WW = 0.D0
C
      DO 10 I = 1,N
         WW = WW+W(I)**2
  10     CONTINUE
      WW = 1.D0/DSQRT(WW)
C
      DO 20 I = 1,N
         W(I) = WW*W(I)
  20     CONTINUE
C
      RETURN
      END
      SUBROUTINE PTSEG(N,XPFMIN,FPFMIN,FPFMAX,KP,NFEV)
C
C  SAMPLE VERSION OF THE OUTPUT SUBROUTINE  PTSEG
C  (PERFORMS END-OF-SEGMENT OUTPUT)
C  WHICH MUST BY SUPPLIED BY THE USER AND WHICH IS DESCRIBED IN
C  DETAIL WITHIN THE SUBROUTINE  SIGMA.
C
      DOUBLE PRECISION XPFMIN,FPFMIN,FPFMAX
      DIMENSION XPFMIN(N)
C
      WRITE(6,100)KP,NFEV,FPFMIN,FPFMAX
 100  FORMAT(1X,24HOBSERVATION PERIOD  KP= ,I4,
     1    32H,   FUNCTION EVALUATIONS  NFEV= ,I7/
     2    2X,33HFINAL BEST, WORST FUNCT. VALUES  ,
     3    8HFPFMIN= ,G13.5,11H,  FPFMAX= ,G13.5)
      WRITE(6,200)XPFMIN
 200  FORMAT(2X,24HBEST FINAL POINT  XPFMIN/(1X,6G13.5))
C
C
      RETURN
      END
      SUBROUTINE PTRIAL ( N, XOPT, FOPT,
     1                    FTFMIN, FTFMAX, FTFOPT,
     2                    ISTOP, ISTOPT, NFEV, KP, IPRINT )
C
C  SAMPLE VERSION OF THE OUTPUT SUBROUTINE  PTRIAL
C  (PERFORMS END-OF-TRIAL OUTPUT)
C  WHICH MUST BY SUPPLIED BY THE USER AND WHICH IS DESCRIBED IN
C  DETAIL WITHIN THE SUBROUTINE  SIGMA.
C
      DOUBLE PRECISION XOPT,FTFMIN,FTFMAX,FTFOPT,FOPT
      DIMENSION XOPT(N)
C
      WRITE(6,100)
 100  FORMAT(//16H END OF A TRIAL )
      IF(IPRINT.EQ.0)WRITE(6,200)KP,NFEV,FTFMIN,FTFMAX
 200  FORMAT(2X,24HOBSERVATION PERIOD  KP= ,I4,
     1    32H,   FUNCTION EVALUATIONS  NFEV= ,I7/
     2    2X,33HFINAL BEST, WORST FUNCT. VALUES  ,
     3    8HFTFMIN= ,G13.5,11H,  FTFMAX= ,G13.5)
      WRITE(6,300)ISTOP,ISTOPT,FTFOPT,FOPT
 300  FORMAT(/2X,29HTRIAL STOP INDICATOR  ISTOP= ,I2,
     1    34H,   PAST STOPS INDICATOR  ISTOPT= ,I2/
     2    2X,43HEND-OF-TRIAL BEST FUNCTION VALUE   FTFOPT= ,G14.6/
     3    2X,43HBEST CURRENT MINIMUM FUNCTION VALUE  FOPT= ,G14.6)
      WRITE(6,400)XOPT
 400  FORMAT(2X,29HBEST CURRENT MINIMIZER   XOPT/(1X,6G13.5))
C
C
      RETURN
      END
      SUBROUTINE PTKSUC(KSUC)
C
C  SAMPLE VERSION OF THE OUTPUT SUBROUTINE  PTKSUC
C  (PERFORMS END-OF-TRIAL OUTPUT RELATED TO THE COUNT OF
C    SUCCESSFUL TRIALS)
C  WHICH MUST BY SUPPLIED BY THE USER AND WHICH IS DESCRIBED IN
C  DETAIL WITHIN THE SUBROUTINE  SIGMA.
C
      WRITE(6,100)KSUC,KSUC
 100  FORMAT(///1X,
     1    50HTHE CURRENT COUNT  KSUC  OF SUCCESSFUL TRIALS HAS ,
     2    21HREACHED FOR THE FIRST/2X,15HTIME THE VALUE ,I2,
     3    53H (IF THE REQUESTED COUNT  NSUC  OF SUCCESSFUL TRIALS /
     4    2X,25HHAD BEEN GIVEN THE VALUE ,I2,21H THE ALGORITHM WOULD ,
     5    18HHAVE STOPPED HERE)///)
C
C
      RETURN
      END
C
C (ALGORITHM SIGMA)
C MAIN PROGRAM (TEST VERSION)
C (CALL  SIGMA  VIA THE DRIVER  SIGMA1 )
C
      DOUBLE PRECISION FMIN,X0,XMAXGL,XMIN,XMINGL
C
C COMMON AREA TO PASS TEST-PROBLEM NUMBER  NPROB
C TO THE FUNCTION  FUNCT  WHICH WILL COMPUTE
C THE FUNCTION VALUES OF TEST-PROBLEM  NPROB
C BY CALLING THE TEST-PROBLEM COLLECTION SUBROUTINE  GLOMTF
C
      COMMON /TUN/ NPROB
C
C  X0     INITIAL POINT
C  XMIN   FINAL ESTIMATE OF GLOBAL MINIMUM
C  XMINGL, XMAXGL  MUST BE DIMENSIONED HERE IN ORDER TO CALL
C         THE PRE-EXISTING SUBROUTINE  GLOMIP.
      DIMENSION X0(100),XMIN(100),XMINGL(100),XMAXGL(100)
C
  10  CONTINUE
C
C INPUT PROBLEM NUMBER
      WRITE(6,20)
  20  FORMAT(//////41H INPUT PROBLEM NUMBER (1 TO 37, 0 = STOP))
      READ(5,30)NPROB
  30  FORMAT(I2)
      WRITE(6,40)NPROB
  40  FORMAT(///18H PROBLEM NUMBER = ,I2//////)
C
C TERMINATE OR CONTINUE
      IF(NPROB.EQ.0)GO TO 50
C
C CALL  GLOMIP  TO GET PROBLEM DIMENSION  N  AND INITIAL POINT  X0
C NOTE THAT  GLOMIP  RETURNS ALSO THE BOUNDARIES  XMINGL ,  XMAXGL
C OF THE OBSERVATION REGION (NOT NEEDED HERE)
      CALL GLOMIP(NPROB,N,X0,XMINGL,XMAXGL)
C
C SET  NSUC  SO AS TO HAVE GOOD CHANCES, WITHOUT PROHIBITIVE
C COMPUTATIONAL EFFORT
      NSUC = 5
C
C SET  IPRINT  SO AS TO HAVE A MODERATE OUTPUT
      IPRINT = 0
C
C CALL DRIVER SUBROUTINE  SIGMA1
      CALL SIGMA1(N,X0,NSUC,IPRINT,XMIN,FMIN,NFEV,IOUT)
C
C GO TO THE NEXT PROBLEM
      GO TO 10
C
C END OF TEST PROBLEMS
  50  CONTINUE
      WRITE(6,60)
  60  FORMAT(/22H END OF TEST PROBLEMS /)
C
      STOP
C
      END
      DOUBLE PRECISION FUNCTION FUNCT(N,X)
C
C COMPUTES THE FUNCTION VALUES OF TEST-PROBLEM  NPROB
C BY CALLING THE SUBROUTINE  GLOMTF .
C
      DOUBLE PRECISION X
      DOUBLE PRECISION F
      DIMENSION X(N)
C
      COMMON /TUN/ NPROB
C
      CALL GLOMTF(NPROB,N,X,F)
      FUNCT = F
C
      RETURN
      END
      SUBROUTINE SIGMA1(N,X0,NSUC,IPRINT,XMIN,FMIN,NFEV,IOUT)
C
C  SIGMA1  IS A 'DRIVER' SUBROUTINE WHICH SIMPLY CALLS THE PRINCIPAL
C  SUBROUTINE  SIGMA  AFTER HAVING ASSIGNED DEFAULT VALUES TO A NUMBER
C  OF INPUT PARAMETERS OF  SIGMA , AND HAS THEREFORE A CONSIDERABLY
C  LOWER NUMBER OF INPUT PARAMETERS.
C  IT CAN BE USED AS A SIMPLE EXAMPLE OF HOW TO CALL  SIGMA , BUT
C  ALSO AS AN EASY-TO-USE DRIVER FOR THE AVERAGE USER, WHICH MAY FIND
C  IT EASIER TO CALL  SIGMA1  INSTEAD OF  SIGMA , THUS AVOIDING THE
C  TROUBLE OF ASSIGNING A VALUE TO ALL THE INPUT PARAMETERS OS  SIGMA .
C  ALL THE PARAMETERS IN THE DEFINITION OF  SIGMA1  HAVE THE SAME MEA-
C  NING AS IN  SIGMA .
C
C  THE USER OF  SIGMA1  MUST ONLY GIVE VALUES TO THE INPUT PARAMETERS
C      N, X0, NSUC, IPRINT
C  AND OBTAINS ON OUTPUT THE SAME OUTPUT PARAMETERS OF  SIGMA
C      XMIN, FMIN, NFEV, IOUT
C
C  WE RECALL HERE THE MEANING OF THE ABOVE PARAMETERS
C
C  N       IS THE PROBLEM DIMENSION (NUMBER OF VARIABLES)
C  X0      IS AN  N-VECTOR CONTAINING THE INITIAL VALUES OF THE
C          X-VARIABLES
C  NSUC    IS THE REQUESTED NUMBER OF SUCCESSFUL TRIALS
C          AFTER WHICH THE COMPUTATION IS STOPPED.
C  IPRINT  IS AN INDEX USED TO CONTROL THE AMOUNT OF PRINTED OUTPUT
C          BY CONTROLLING THE CALLS TO THE USER-SUPPLIED OUTPUT SUB-
C          ROUTINES  PTSEG  (END-OF-SEGMENT OUTPUT),  PTRIAL  (END-
C          OF-TRIAL OUTPUT), AND  PTKSUC (END-OF-TRIAL OUTPUT RELATED
C          TO THE COUNT OF SUCCESSFUL TRIALS), WHICH ARE DESCRIBED
C          BELOW.
C          IPRINT.LT.0   NO CALL TO THE OUTPUT SUBROUTINES
C          IPRINT.EQ.0   CALL ONLY  PTRIAL  AND  PTKSUC
C          IPRINT.GT.0   CALL ALL OUTPUT SUBROUTINES.
C  XMIN    IS AN N-VECTOR CONTAINING THE COORDINATES OF THE POINT
C          (OR POSSIBLY ONE OF THE POINTS) WHERE THE FINAL VALUE  FMIN
C          OF  FOPT  WAS FOUND.
C  FMIN    IS THE FINAL VALUE OF THE BEST CURRENT MINIMUM FUNCTION
C          VALUE  FOPT.
C  NFEV    IS THE TOTAL NUMBER OF FUNCTION EVALUATION (INCLUDING
C          THOSE USED FOR THE COMPUTATION OF DERIVATIVES, AND FOR
C          THE REJECTED TIME-INTEGRATION STEPS).
C  IOUT    IS THE INDICATOR OF THE STOPPING CONDITIONS, AS FOLLOWS
C          IF  IOUT = -99  A FATAL ERROR WAS DETECTED WHEN PERFOR-
C             MING SOME PRELIMINARY CHECKING OF THE INPUT DATA, AND
C             THE ALGORITHM WAS NOT EVEN STARTED
C          OTHERWISE THE ALGORITHM WAS STARTED, AND THE MEANING OF
C          IOUT  IS AS FOLLOWS
C          IF  IOUT.EQ.0  NO TRIAL HAD A UNIFORM STOP.
C          IF  IOUT.NE.0  THE SIGN AND THE MAGNITUDE OF  IOUT  HAVE
C          THE FOLLOWING MEANING
C          A) THE SIGN OF  IOUT  INDICATES IF THE BEST UNIFORM STOP
C          (I.E. THE ONE IN WHICH  FTFOPT  WAS OBTAINED)
C          IS TO BE CONSIDERED SUCCESSFUL (IOUT.GT.0) OR UNSUCCESSFUL
C          B) THE MAGNITUDE OF  IOUT  INDICATES WHICH ONE OF THE
C          NUMERICAL EQUALITY CRITERIA WAS SATISFIED IN THE BEST
C          UNIFORM STOP
C          IABS(IOUT).EQ.1  RELATIVE DIFFERENCE CRITERION
C          IABS(IOUT).EQ.2  ABSOLUTE DIFFERENCE CRITERION
C          IABS(IOUT).EQ.3  BOTH CRITERIA
C          (IOUT  IS THE FINAL VALUE OF THE INTERNAL PARAMETER  ISTOPT
C          (AN OUTPUT INDICATOR OF THE USER-SUPPLIED SUBROUTINE
C          PTRIAL )).
C          SUCCESS IS CLAIMED BY THE ALGORITHM IF  IOUT .GT. 0,
C          I.E. IF AT LEAST ONE OF THE TRIALS STOPPED SUCCESSFULLY
C          (I.E. WITH A POSITIVE VALUE OF THE TRIAL STOP INDICATOR
C          ISTOP ), AND THE SUCCESSFUL TRIALS (AS COUNTED BY  KSUC )
C          ARE CURRENTLY VALID.
C
      DOUBLE PRECISION X0,XMIN,FMIN
      DOUBLE PRECISION DX,EPS,H,TOLABS,TOLREL
      DOUBLE PRECISION VRMAX,VRMIN,XRMAX,XRMIN
      DIMENSION X0(N),XMIN(N)
      DIMENSION XRMIN(100),XRMAX(100)
      DATA VRMIN,VRMAX /-1.D4,1.D4/
      DATA NTRILD/50/
C
      H = 1.D-10
      EPS = 1.D0
      DX = 1.D-9
      IRAND = 0
      NTRAJ = 0
      ISEGBR = 0
      INKPBR = 0
      KPBR0 = 0
      NPMIN = 10
      NPMAX0 = 100
      INPMAX = 50
      NTRIAL = MAX0(NTRILD,5*NSUC)
      TOLREL = 1.D-3
      TOLABS = 1.D-6
      KPASCA = 10
      IF(N.GT.5)KPASCA = 300
      INHP = 1
      DO 1 IX = 1,N
         XRMIN(IX)=VRMIN
         XRMAX(IX)=VRMAX
 1    CONTINUE
C
      CALL SIGMA ( N, X0, H, EPS, DX,
     1             NTRAJ, ISEGBR, KPBR0, INKPBR,
     2             NPMIN, NPMAX0, INPMAX,
     3             NSUC, NTRIAL, TOLREL, TOLABS, XRMIN, XRMAX,
     4             KPASCA, IRAND, INHP, IPRINT,
     5             XMIN, FMIN, NFEV, IOUT )
C
      RETURN
      END
      SUBROUTINE SIGMA ( N, X0, H, EPS, DX,
     1                   NTRAJ, ISEGBR, KPBR0, INKPBR,
     2                   NPMIN, NPMAX0, INPMAX,
     3                   NSUC, NTRIAL, TOLREL, TOLABS, XRMIN, XRMAX,
     4                   KPASCA, IRAND, INHP, IPRINT,
     5                   XMIN, FMIN, NFEV, IOUT )
C
C  THE SUBROUTINE  SIGMA  IS THE PRINCIPAL SUBROUTINE OF THE PACKAGE
C  SIGMA, WHICH ATTEMPTS TO FIND A GLOBAL MINIMIZER OF A REAL VALUED
C  FUNCTION  F(X) = F(X1,...,XN)  OF  N  REAL VARIABLES  X1,...,XN.
C  THE ALGORITHM AND THE PACKAGE ARE DESCRIBED IN DETAIL IN THE TWO
C  PAPERS PUBLISHED IN THE SAME ISSUE OF THE A.C.M. TRANSACTIONS ON
C  MATHEMATICAL SOFTWARE, BOTH BY
C     F. ALUFFI-PENTINI, V. PARISI, F. ZIRILLI.
C  (1)  A GLOBAL MINIMIZATION ALGORITHM USING STOCHASTIC DIFFERENTIAL
C       EQUATIONS
C  (2)  ALGORITHM SIGMA, A STOCHASTIC-INTEGRATION GLOBAL MINIMIZATION
C       ALGORITHM.
C  THE SOFTWARE IMPLEMENTATION AND ITS USAGE ARE DESCRIBED IN (2).
C
C  METHOD
C
C  A GLOBAL MINIMIZER OF  F(X)  IS SOUGHT BY MONITORING THE VALUES OF
C  F  ALONG TRAJECTORIES GENERATED BY A SUITABLE (STOCHASTIC) DISCRE-
C  TIZATION OF A FIRST-ORDER STOCHASTIC DIFFERENTIAL EQUATION INSPIRED
C  BY STATISTICAL MECHANICS. STARTING FROM AN INITIAL POINT  X0 ,
C  X  IS UPDATED BY THE (STOCHASTIC) DISCRETIZATION STEP
C       X = X + DX1 + DX2
C  WHERE  DX1 = - H * GAM           (FIRST HALF-STEP)
C         DX2 = EPS * SQRT(H) * U   (SECOND HALF-STEP)
C  AND  H  IS THE TIME-INTEGRATION STEPLENGTH,
C  GAM/N  IS COMPUTED AS A FINITE-DIFFERENCE APPROXIMATION TO THE
C     DIRECTIONAL DERIVATIVE OF  F  ALONG AN ISOTROPICALLY RANDOM
C     DIRECTION,
C  EPS  IS A POSITIVE 'NOISE' COEFFICIENT, AND
C  U  IS A RANDOM SAMPLE FROM AN N-DIMENSIONAL GAUSSIAN DISTRIBUTION.
C  WE CONSIDER THE SIMULTANEOUS EVOLUTION OF A GIVEN FIXED NUMBER
C  NTRAJ  OF TRAJECTORIES DURING AN OBSERVATION PERIOD IN WHICH FOR
C  EACH TRAJECTORY  EPS  IS FIXED WHILE  H  AND THE SPATIAL DISCRETI-
C  ZATION INCREMENT  DX  FOR COMPUTING  GAM  ARE AUTOMATICALLY
C  ADJUSTED BY THE ALGORITHM.
C  AFTER EVERY OBSERVATION PERIOD ONE OF THE TRAJECTORIES IS DISCARDED,
C  ALL OTHER TRAJECTORIES CONTINUE UNPERTURBED, AND ONE OF THEM IS SE-
C  LECTED FOR BRANCHING, I.E. GENERATING A SECOND PERTURBED CONTI-
C  NUATION, WITH DIFFERENT STARTING  EPS  AND  DX  (AND THE SAME
C  'PAST HISTORY' OF THE FIRST).
C  THE SET OF SIMULTANEOUS TRAJECTORIES IS CONSIDERED A SINGLE TRIAL,
C  AND THE COMPLETE ALGORITHM IS A SET OF REPEATED TRIALS.
C  A TRIAL IS STOPPED, AT THE END OF AN OBSERVATION PERIOD, AND AFTER
C  HAVING DISCARDED THE WORST TRAJECTORY, IF ALL THE FINAL VALUES OF
C  F  FOR THE REMAINING TRAJECTORIES ARE EQUAL (WITHIN NUMERICAL TO-
C  LERANCES, AND POSSIBLY AT DIFFERENT POINTS  X) TO THEIR MINIMUM
C  VALUE  FTFMIN ('UNIFORM STOP AT THE LEVEL  FTFMIN ').
C  A UNIFORM STOP IS CONSIDERED SUCCESSFUL ONLY IF THE FINAL VALUE
C  FTFMIN  IS (NUMERICALLY) EQUAL TO THE CURRENT BEST MINIMUM  FOPT
C  FOUND SO FAR FROM ALGORITHM START.
C  A TRIAL IS ALSO ANYWAY STOPPED (UNSUCCESSFULLY) IF A GIVEN MAXIMUM
C  NUMBER  NPMAX  OF OBSERVATION PERIODS HAS ELAPSED.
C  TRIALS ARE REPEATED WITH DIFFERENT OPERATING CONDITIONS (INITIAL
C  POINT, MAX TRIAL LENGTH  NPMAX , SEED OF NOISE GENERATOR, POLICY
C  FOR CHOOSING THE STARTING  EPS  FOR THE PERTURBED CONTINUATION,
C  AND TRIAL-START VALUE OF  EPS ).
C  THE OUTCOMES OF ALL THE COMPLETED TRIALS ARE SUMMARIZED BY
C  FTFOPT (THE BEST CURRENT MIMNIMUM VALUE FOUND SO FAR FOR
C  FTFMIN ) AND BY THE CURRENT COUNT  KSUC  OF SUCCESSFUL TRIALS
C  (WHICH IS ZERO AT ALGORITHM START, AND IS UPDATED AT EVERY
C  SUCCESSFULLY-STOPPING TRIALS).
C  THE ALGORITHM IS STOPPED, AT THE END OF A TRIAL, IF A REQUESTED
C  COUNT  NSUC  OF SUCCESSFUL TRIALS HAS BEEN REACHED,
C  OR ANYWAY IF A GIVEN MAXIMUM NUMBER  NTRIAL  OF TRIALS HAS BEEN
C  REACHED.
C  SUCCESS IS CLAIMED IF THE CURRENT COUNT  KSUC  OF SUCCESSFUL TRIALS
C  IS AT LEAST ONE, AND IF SUCH TRIALS ARE CURRENTLY VALID.
C
C  CALL STATEMENT
C
C  THE CALL STATEMENT IS
C     CALL SIGMA ( N, X0, H, EPS, DX,
C                  NTRAJ, ISEGBR, KPBR0, INKPBR,
C                  NPMIN, NPMAX0, INPMAX,
C                  NSUC, NTRIAL, TOLREL, TOLABS, XRMIN, XRMAX,
C                  KPASCA, IRAND, INHP, IPRINT,
C                  XMIN, FMIN, NFEV, IOUT )
C
C  CALL PARAMETERS
C
C  INPUT PARAMETERS ARE THOSE IN LINES 1,3,4,5 OF THE CALL STATEMENT,
C  INPUT-OUTPUT PARAMETERS ARE THOSE IN LINE 2,
C  OUTPUT PARAMETERS ARE THOSE IN LINE 6.
C  NOTE THAT A NUMBER OF OTHER (INTERNAL) PARAMETERS CAN BE OBTAINED
C  BY MEANS OF THE USER-SUPPLIED OUTPUT SUBROUTINES  PTSEG, PTRIAL,
C  AND  PTKSUC, WHICH ARE DESCRIBED BELOW.
C
C  DESCRIPTION OF THE CALL PARAMETERS
C
C  N        IS THE PROBLEM DIMENSION (NUMBER OF VARIABLES)
C  X0       IS AN  N-VECTOR CONTAINING THE INITIAL VALUES OF THE
C          X-VARIABLES
C  H       IS THE INITIAL VALUE OF THE TIME-INTEGRATION STEPLENGTH.
C  EPS     IS THE INITIAL VALUE OF THE NOISE COEFFICIENT.
C  DX      IS THE INITIAL VALUE OF THE MAGNITUDE OF THE DISCRETIZATION
C          INCREMENT FOR COMPUTING THE FINITE-DIFFERENCE DERIVATIVES.
C  NTRAJ   IS THE NUMBER OF SIMULTANEOUS TRAJECTORIES.
C          (NOTE HOWEVER THAT IF THE INPUT VALUE IS ZERO,  NTRAJ  IS
C          SET TO A DEFAULT VALUE (NTRAJ = 7), AND IF THE INPUT VALUE
C          IS OTHERWISE OUTSIDE THE INTERVAL (3,20) NTRAJ IS SET TO
C          THE NEAREST EXTREME VALUE).
C  ISEGBR, KPBR0, INKPBR  DETERMINE, AT THE END OF AN OBSERVATION
C          PERIOD, WHICH ONE OF THE SIMULTANEOUS TRAJECTORIES
C          IS TO BE BRANCHED, AS FOLLOWS.
C          BRANCHING IS NORMALLY PERFORMED ON THE TRAJECTORY WHICH
C          OCCUPIES THE PLACE  ISEGBR  IN THE TRAJECTORY SELECTION OR-
C          DERING, EXCEPT AT (THE END OF) EXCEPTIONAL OBSERVATION
C          PERIODS, WHERE THE FIRST TRAJECTORY IN THE ORDERING IS
C          BRANCHED. EXCEPTIONAL BRANCHING OCCURS AT THE OBSERVATION
C          PERIODS NUMBERED  KP = KPBR0 + J*INKPBR, (J = 1,2,3,...).
C          THEREFORE  ISEGBR  SELECTS THE LEVEL (IN THE ORDERING) AT
C          WHICH NORMAL BRANCHING OCCURS, WHILE  KPBR0  AND  INKPBR
C          SELECT THE FIRST OCCURRENCE AND THE REPETITION FREQUENCY
C          OF THE EXCEPTIONAL OBSERVATION PERIODS.
C          (NOTE HOWEVER THAT IF ONE OF THE INPUT VALUES IS ZERO,
C          THE CORRESPONDING VARIABLE IS SET TO A DEFAULT VALUE
C          ISEGBR = INT((1+NTRAJ)/2), INKPBR = 10, KPBR0 = 3.
C          IF THE INPUT VALUE FOR  ISEGBR  IS OTHERWISE OUTSIDE THE
C          INTERVAL  (1,NTRAJ),  ISEGBR  IS SET TO THE NEAREST
C          EXTREME VALUE, AND IF KPBR0  HAS A VALUE NOT INSIDE THE
C          INTERVAL  (1,INKPBR), IT IS ASSIGNED THE SAME VALUE
C          MODULO  INKPBR).
C  NPMIN   IS THE MINIMUM DURATION OF A TRIAL, I.E. THE MINIMUM
C          NUMBER OF OBSERVATION PERIODS THAT SHOULD ELAPSE BEFORE
C          STARTING TO CHECK THE TRIAL STOPPING CRITERIA.
C  NPMAX0  IS THE MAXIMUM DURATION OF THE FIRST TRIAL, I.E. THE
C          VALUE, FOR THE FIRST TRIAL, OF MAXIMUM ACCEPTABLE
C          NUMBER  NPMAX  OF OBSERVATION PERIODS IN A TRIAL.
C  INPMAX  IS THE INCREMENT FOR  NPMAX , WHEN  NPMAX  IS VARIED
C          FROM ONE TRIAL TO THE FOLLOWING ONE.
C  NSUC    IS THE REQUESTED NUMBER OF SUCCESSFUL TRIALS
C          AFTER WHICH THE COMPUTATION IS STOPPED.
C  TOLREL  AND  TOLABS  ARE THE RELATIVE AND ABSOLUTE TOLERANCES
C          FOR STOPPING A SINGLE TRIAL.
C  XRMIN,  XRMAX  ARE N-VECTORS DEFINING THE ADMISIBLE REGION FOR
C          THE X-VALUES, WITHIN WHICH THE FUNCTION VALUES CAN BE
C          SAFELY COMPUTED.
C  KPASCA  IS THE MINIMUM NUMBER OF TRAJECTORY SEGMENTS THAT SHOULD
C          ELAPSE BEFORE THE RESCALING PROCEDURES ARE ACTIVATED.
C  IRAND   IS A CONTROL INDEX FOR THE INITIALIZATION OF THE RANDOM
C          NUMBER GENERATOR.
C          IRAND.GT.0    THE GENERATOR IS INITIALIZED, BEFORE STAR-
C                        TING THE TRIAL  KT, WITH SEED  IRAND+KT-1
C          IRAND.LE.0    THE GENERATOR IS INITIALIZED (WITH SEED 0)
C                        ONLY AT THE FIRST CALL OF SIGMA
C  INHP    IS A CONTROL INDEX FOR SELECTING THE NUMBER  NHP  OF TIME-
C          INTEGRATION STEPS FOR OBSERVATION PERIOD  KP (DURATION OF
C          TRIAL  KP) AS FOLLOWS (LOG IS BASE 2)
C          INHP=1  NHP = 1 + INT(LOG(KP))      ('SHORT' DURATION)
C          INHP=2  NHP = INT(SQRT(KP))         ('MEDIUM' DURATION)
C          INHP=3  NHP = KP                    ('LONG' DURATION)
C  IPRINT  IS AN INDEX USED TO CONTROL THE AMOUNT OF PRINTED OUTPUT
C          BY CONTROLLING THE CALLS TO THE USER-SUPPLIED OUTPUT SUB-
C          ROUTINES  PTSEG  (END-OF-SEGMENT OUTPUT),  PTRIAL  (END-
C          OF-TRIAL OUTPUT), AND  PTKSUC (END-OF-TRIAL OUTPUT RELATED
C          TO THE COUNT OF SUCCESSFUL TRIALS), WHICH ARE DESCRIBED
C          BELOW.
C          IPRINT.LT.0   NO CALL TO THE OUTPUT SUBROUTINES
C          IPRINT.EQ.0   CALL ONLY  PTRIAL  AND  PTKSUC
C          IPRINT.GT.0   CALL ALL OUTPUT SUBROUTINES.
C  XMIN    IS AN N-VECTOR CONTAINING THE COORDINATES OF THE POINT
C          (OR POSSIBLY ONE OF THE POINTS) WHERE THE FINAL VALUE  FMIN
C          OF  FOPT  WAS FOUND.
C  FMIN    IS THE FINAL VALUE OF THE BEST CURRENT MINIMUM FUNCTION
C          VALUE  FOPT.
C  NFEV    IS THE TOTAL NUMBER OF FUNCTION EVALUATION (INCLUDING
C          THOSE USED FOR THE COMPUTATION OF DERIVATIVES, AND FOR
C          THE REJECTED TIME-INTEGRATION STEPS).
C  IOUT    IS THE INDICATOR OF THE STOPPING CONDITIONS, AS FOLLOWS
C          IF  IOUT = -99  A FATAL ERROR WAS DETECTED WHEN PERFOR-
C             MING SOME PRELIMINARY CHECKING OF THE INPUT DATA, AND
C             THE ALGORITHM WAS NOT EVEN STARTED
C          OTHERWISE THE ALGORITHM WAS STARTED, AND THE MEANING OF
C          IOUT  IS AS FOLLOWS
C          IF  IOUT.EQ.0  NO TRIAL HAD A UNIFORM STOP.
C          IF  IOUT.NE.0  THE SIGN AND THE MAGNITUDE OF  IOUT  HAVE
C          THE FOLLOWING MEANING
C          A) THE SIGN OF  IOUT  INDICATES IF THE BEST UNIFORM STOP
C          (I.E. THE ONE IN WHICH  FTFOPT  WAS OBTAINED)
C          IS TO BE CONSIDERED SUCCESSFUL (IOUT.GT.0) OR UNSUCCESSFUL
C          B) THE MAGNITUDE OF  IOUT  INDICATES WHICH ONE OF THE
C          NUMERICAL EQUALITY CRITERIA WAS SATISFIED IN THE BEST
C          UNIFORM STOP
C          IABS(IOUT).EQ.1  RELATIVE DIFFERENCE CRITERION
C          IABS(IOUT).EQ.2  ABSOLUTE DIFFERENCE CRITERION
C          IABS(IOUT).EQ.3  BOTH CRITERIA
C          (IOUT  IS THE FINAL VALUE OF THE INTERNAL PARAMETER  ISTOPT
C          (AN OUTPUT INDICATOR OF THE USER-SUPPLIED SUBROUTINE
C          PTRIAL )).
C          SUCCESS IS CLAIMED BY THE ALGORITHM IF  IOUT .GT. 0,
C          I.E. IF AT LEAST ONE OF THE TRIALS STOPPED SUCCESSFULLY
C          (I.E. WITH A POSITIVE VALUE OF THE TRIAL STOP INDICATOR
C          ISTOP ), AND THE SUCCESSFUL TRIALS (AS COUNTED BY  KSUC )
C          ARE CURRENTLY VALID.
C
C
C  USER-SUPPLIED SUPROGRAMS
C
C  THE USER MUST PROVIDE THE FUNCTION  FUNCT  TO COMPUTE  F(X),
C  AND THE THREE OUTPUT SUBROUTINE  PTSEG, PTRIAL, PTKSUC .
C  THE CALLS TO THE OUTPUT SUBROUTINES ARE CONTROLLED BY  IPRINT
C  (INPUT PARAMETER TO  SIGMA).
C  A USER NOT INTERESTED IN USING ANY ONE OF THE OUTPUT SUBROUTINES
C  CAN SIMPLY PUT  IPRINT = -1.
C  SAMPLE VERSIONS OF THE OUTPUT SUBROUTINES ARE PROVIDED
C  WITH THE PACKAGE FOR THE BENEFIT OF THE AVERAGE USER.
C  IN THE FOLLOWING DESCRIPTION ALL NON-INTEGER ARGUMENTS ARE
C  DOUBLE PRECISION (INTEGER ARGUMENTS ARE INDICATED BY MEANS OF THE
C  FORTRAN IMPLICIT TYPE DEFINITION CONVENTION).
C
C     THE FUNCTION  FUNCT
C
C     FUNCT  MUST RETURN AS ITS VALUE THE VALUE AT  X  OF THE FUNCTION
C     TO BE MINIMIZED
C     THE DEFINITION STATEMENT IS
C        DOUBLE PRECISION FUNCTION  FUNCT (N, X)
C     WHERE
C     N   IS THE (INPUT) DIMENSION OF THE PROBLEM.
C     X   IS THE (INPUT) N-VECTOR CONTAINING THE COORDINATES OF THE
C         POINT  X  WHERE THE FUNCTION IS TO BE COMPUTED.
C
C     THE SUBROUTINE  PTSEG
C
C     PTSEG  IS CALLED (IF  IPRINT.GT.0) AT THE END OF EVERY OBSER-
C     VATION PERIOD.
C     THE DEFINITION STATEMENT IS
C         SUBROUTINE  PTSEG ( N, XPFMIN, FPFMIN, FPFMAX,
C                                         KP, NFEV, IPRINT )
C     WHERE
C     N   IS THE (INPUT) DIMENSION OF THE PROBLEM
C     FPFMIN, FPFMAX  ARE RESPECTIVELY THE MINIMUM AND THE MAXIMUM
C        AMONG THE VALUES OF  F(X) OBTAINED AT THE FINAL POINTS OF
C        THE TRAJECTORY SEGMENTS OF THE (JUST ELAPSED) OBSERVATION
C        PERIOD  KP.
C     XPFMIN   IS AN N-VECTOR CONTAINING THE COORDINATES OF THE
C        (FINAL) POINT (OR POSSIBLY ONE OF THE POINTS) WHERE
C        FPFMIN WAS OBTAINED.
C     KP   IS THE TOTAL NUMBER OF ELAPSED OBSERVATION PERIODS IN
C        THE CURRENT TRIAL.
C     NFEV   IS THE TOTAL NUMBER OF FUNCTION EVALUATIONS PERFORMED
C        FROM ALGORITHM START.
C
C     THE SUBROUTINE  PTRIAL
C
C     PTRIAL  IS CALLED (IF IPRINT.GE.0) AT THE END OF EVERY TRIAL.
C     THE DEFINITION STATEMENT IS
C         SUBROUTINE PTRIAL ( N, XOPT, FOPT,
C                             FTFMIN, FTFMAX, FTFOPT,
C                             ISTOP, ISTOPT, NFEV, KP, IPRINT )
C     WHERE
C     N   IS THE (INPUT) DIMENSION OF THE PROBLEM.
C     XOPT   IS AN N-VECTOR CONTINING THE COORDINATES OF THE
C        POINT (OR POSSIBLY ONE OF THE POINTS) WHERE THE CURRENT
C        MINIMUM  FOPT  WAS OBTAINED.
C     FOPT   IS THE CURRENT BEST MINIMUM VALUE FOUND FOR  F  FROM
C        ALGORITHM START ( FOPT  IS UPDATED WHENEVER A FUNCTION
C        VALUE IS COMPUTED).
C     FTFMIN, FTFMAX   ARE RESPECTIVELY THE MINIMUM AND THE MAXIMUM
C        AMONG THE VALUES OF  F(X)  OBTAINED AT THE FINAL POINTS OF
C        THE LAST TRAJECTORY SEGMENTS OF THE CURRENT TRIAL.
C     FTFOPT   IS THE CURRENT MINIMUM VALUE OF  FTFMIN  AMONG THE
C        TRIALS WHICH DID NOT STOP FOR REACHING THE MAXIMUM ALLOWED
C        NUMBER OF SEGMENTS (STOPPING INDICATOR  ISTOP = 0, SEE
C        BELOW).  FTFOPT  IS USED BY  SIGMA  TO COMPUTE  KSUC  (INPUT
C        PARAMETER TO THE OUTPUT SUBROUTINE  PTKSUK , SEE BELOW).
C     KP   IS THE TOTAL NUMBER OF ELAPSED OBSERVATION PERIODS IN
C        THE CURRENT TRIAL.
C     NFEV   IS THE TOTAL NUMBER OF FUNCTION EVALUATIONS PERFORMED
C        FROM ALGORITHM START.
C     ISTOP   IS THE INDICATOR OF THE STOPPING CONDITION OF THE TRIAL,
C        AS FOLLOWS
C        ISTOP = 0
C           THE MAXIMUM NUMBER  NPMAX  OF OBSERVATION PERIODS HAS
C           BEEN REACHED.
C        ISTOP.NE.0
C           ALL THE END-OF-SEGMENT VALUES OF  F(X) , (EXCEPT FOR THE
C           JUST DISCARDED SEGMENT) ARE CLOSE ENOUGH TO THEIR COMMON
C           MINIMUM VALUE  FPFMIN , WITH RESPECT TO AN ABSOLUTE OR
C           RELATIVE DIFFERENCE CRITERION, TO BE CONSIDERED NUMERI-
C           CALLY EQUAL.
C           THE ABSOLUTE VALUE AND THE SIGN OF  ISTOP  HAVE THE
C           FOLLOWING MEANING.
C              THE ABSOLUTE VALUE INDICATES WHICH DIFFERENCE
C                 CRITERION WAS SATISFIED
C                 1   RELATIVE DIFFERENCE CRITERION SATISFIED
C                 2   ABSOLUTE DIFFERENCE CRITERION SATISFIED
C                 3   BOTH CRITERIA SATISFIED
C              THE SIGN OF  ISTOP  INDICATES THE RELATIONSHIP BETWEEN
C                 THE END-OF-TRIAL VALUE  FPFMIN  AND THE CURRENT
C                 BEST MINIMUM VALUE  FOPT  (WHICH IS UPDATED WHEN-
C                 EVER A FUNCTION  VALUE IS COMPUTED
C                 ISTOP.GT.0
C                    FPFMIN  IS NUMERICALLY EQUAL (W.R.T. AT LEAST
C                    ONE OF THE ABOVE  DIFFERENCE CRITERIA) TO  FOPT
C                 ISTOP.LT.0
C                    FPFMIN  IS NOT EVEN NUMERICALLY EQUAL TO  FOPT
C                    (AND THEREFORE CANNOT BE CONSIDERED AS AN
C                    ACCEPTABLE GLOBAL MINIMUM).
C     ISTOPT   IS THE VALUE OF THE TRIAL STOPPING INDICATOR  ISTOP
C        CORRESPONDING TO THE (CURRENT OR PAST) TRIAL WHERE  FTFOPT
C        WAS OBTAINED, WITH THE SIGN WHICH IS UPDATED ACCORDING TO
C        THE COMPARISON BETWEEN  FTFOPT  AND THE PRESENT VALUE OF
C        FOPT , AS DESCRIBED ABOVE.
C        THE FINAL VALUE OF  ISTOP IS RETURNED BY  SIGMA  AS THE VALUE
C        OF THE OUTPUT INDICATOR IOUT OF THE ALGORITHM STOPPING CON-
C        DITIONS (WHENEVER THE ALGORITHM WAS STARTED, IOUT.NE.-99,
C        SEE ABOVE).
C
C     THE SUBROUTINE  PTKSUC
C
C     PTKSUC  IS CALLED ONLY AT THE END OF EVERY SUCCESSFUL TRIAL
C     SUCH THAT AN INCREMENT OCCURRED IN THE VALUE OF THE
C     CURRENT MAXIMUM  MSUC  AMONG ALL THE VALUES OF  KSUC  FROM
C     ALGORITHM START. A CALL TO  PTKSUC  THEREFORE PROVIDES
C     THE USER WITH THE OPERATIONALLY INTERESTING INFORMATION THAT
C     ALGORITHM STOP WOULD HAVE TAKEN PLACE, IF  NSUC  (INPUT
C     PARAMETER TO  SIGMA ) HAD BEEN GIVEN A LOWER VALUE, EQUAL TO
C     THE CURRENT  KSUC .
C     PTKSUC  IS CALLED ONLY IF  IPRINT.GE.0  AND  KSUC.LT.NSUC  .
C     THE DEFINITION STATEMENT IS
C         SUBROUTINE  PTKSUC ( KSUC )
C     WHERE  KSUC  IS THE CURRENT COUNT OF SUCCESSFUL TRIALS
C     (1 .LE. KSUC .LE. NSUC)
C
      DOUBLE PRECISION X0,H,EPS,DX,TOLREL,TOLABS
      DOUBLE PRECISION XRMIN,XRMAX,XMIN,FMIN
      DOUBLE PRECISION EPSAG,EPSAP,EPSC
      DOUBLE PRECISION EPSMAX,EPSR,F,FOPT,FTFMAX
      DOUBLE PRECISION FTFMIN,FTFOPT
C
      DOUBLE PRECISION X,HC,DXC,VMVT,EPSCO,VMCOR,VCOR
      DOUBLE PRECISION XRMIC,XRMAC,XOPT,FOPTC
C
      DOUBLE PRECISION DIST,BIAS,GRAGRA,GRA
C
      DIMENSION X0(N),XMIN(N),XRMIN(N),XRMAX(N)
C
      COMMON /DINCOM/ X(100,20),HC(20),DXC(20),VMVT(20,19),EPSCO(20),
     1    VMCOR(20),VCOR(20),XRMIC(100),XRMAC(100),XOPT(100),FOPTC,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJC,NTRAJR,
     3    ISEGBC,INKPBC,KPBR0C,NCF,IFEPC,INHPC
C
      COMMON /SCALE/ DIST(10,10,20),BIAS(10,20),GRAGRA(10,10,20),
     1    GRA(10,20),NGRA(20),LSCA,IDSCA,NX,NORD
C
C  DATA FOR THE VARIATION OF NOISE COEFFICIENT
C
      DATA EPSR/1.D4/,EPSAP/10.D0/,EPSAG/1.D3/
      DATA EPSMAX/1.D15/
C
      IFEP = 1
C
C  INITIALIZE COMMON AREA  /DINCOM/
C
      CALL INIT(N,X0,H,EPS,DX,IRAND,F,
     1    NTRAJ,ISEGBR,INKPBR,KPBR0,INHP,IFEP,XRMIN,XRMAX,IOUT)
C
C  CHECK PARAMETER VALUES
C
      IF(NPMIN.LE.0.OR.NPMAX0.LT.0.OR.INPMAX.LE.0.OR.
     1    NSUC.LE.0.OR.NTRIAL.LE.0)IOUT = -99
      IF (IOUT.EQ.(-99))RETURN
C
C  INITIALIZE VARIABLES
C
      EPSC = EPS
      NPMAX = NPMAX0
      ISTOPT = 0
      ISTOP = 0
      ICCOM = (NTRIAL+NTRIAL+4)/5
      NFEV = 0
      NTES = NSUC
      ICTS = NSUC-1
      FTFOPT = F
C
C  START SERIES OF TRIALS
C
      DO 30 IC = 1,NTRIAL
C
C  SET INITIALIZATION INDEX FOR NOISE GENERATOR
C
         IS = 0
         IF(IRAND.GT.0)IS = IRAND+IC-1
C
C  INITIALIZE TRIAL
C
         IF(IC.GT.1.AND.IC.LE.ICCOM)CALL REINIT(N,X0,EPSC,IS,F,IFEP)
         IF(IC.GT.ICCOM)CALL REINIT(N,XMIN,EPSC,IS,FOPT,IFEP)
C
         FTFMIN = F
         FTFMAX = F
         NFEV = NFEV+1
C
C  PRINT INITIAL CONDITIONS OF TRIAL
C
         IF(IPRINT.GT.0)CALL PTSEG(N,X0,FTFMIN,FTFMAX,0,NFEV)
C
C
C  DEACTIVATE SCALING
C
         IF(KPASCA.GT.NPMAX.OR.N.LE.1)CALL NOSCA
C
C  INITIALIZE COMMON AREA  /SCALE/
C
         IF(KPASCA.LE.NPMAX.AND.N.GT.1)CALL INISCA(N,NTRAJ)
C
C  PERFORM A TRIAL
C
         CALL TRIAL(N,NPMIN,NPMAX,KPASCA,TOLREL,TOLABS,
     1       IPRINT,XMIN,FTFMIN,
     1       FTFMAX,NFEV,KP,ISTOP)
C
C
C     EVALUATE PAST TRIAL AND PREPARE NEXT TRIAL
C
C
C  SET TRIAL DURATION
C
         IF(ISTOP.EQ.0)NPMAX = NPMAX+INPMAX
C
C  RESET CURRENT NUMBER OF SUCCESSES REQUIRED BEFORE STOPPING
C  COMPUTE INDICATOR OF TRIAL STOPPING CONDITIONS
C  UPDATE BEST CURRENT VALUES OF TRIAL STOPPING INDICATOR AND
C  OF FUNCTION  F(X)  AT TRIAL STOP
C
         IF((FTFMIN.GT.FTFOPT.OR.ISTOP.EQ.0).AND.ISTOPT.NE.0)GO TO 10
         IF(ITOLCH(FTFOPT,FTFMIN,TOLREL,TOLABS).EQ.0)NTES = NSUC
C
         FTFOPT = FTFMIN
         ISTOPT = ISTOP
  10     CONTINUE
         ISTOPT = IABS(ISTOPT)
         CALL RCLOPT(N,XMIN,FOPT)
         IF(ITOLCH(FTFOPT,FOPT,TOLREL,TOLABS).EQ.0)ISTOPT = -ISTOPT
         IF(ITOLCH(FTFMIN,FOPT,TOLREL,TOLABS).EQ.0)ISTOP = -ISTOP
C
C  END-OF-TRIAL PRINT OUT
C
         IF(IPRINT.GE.0)
     1      CALL PTRIAL ( N, XOPT, FOPT,
     2                    FTFMIN, FTFMAX, FTFOPT,
     3                    ISTOP, ISTOPT, NFEV, KP, IPRINT )
C
C  UPDATE INITIAL VALUE OF NOISE COEFFICIENT FOR NEXT TRIAL
C
         IF (ISTOP.EQ.0)EPSC = EPSC/EPSR
         IF(ISTOP.GT.0)EPSC = EPSC*EPSAG
         IF(ISTOP.LT.0.AND.IC.LE.ICCOM)EPSC = EPSC*EPSAP
         IF(ISTOP.LT.0.AND.IC.GT.ICCOM)EPSC = EPSC/EPSR
C
C  UPDATE OPERATING CONDITIONS FOR SELECTING (IN THE NEXT TRIAL)
C  THE STARTING VALUE OF THE NOISE COEFFICIENT OF THE NEW TRAJECTORY
C  AFTER BRANCHING
C
         IF (ISTOP.EQ.0)IFEP = 1
         IF (ISTOP.NE.0)IFEP = 2
C
C  UPDATE, PRINT, AND CHECK TRIAL STOPPING CONDITIONS
C
         IF(ISTOP.GT.0.AND.ISTOPT.GT.0)NTES = NTES-1
         IF(NTES.LE.0.OR.ISTOPT.LE.0.OR.ISTOP.LE.0.OR.NTES.GT.ICTS.OR.
     1       IPRINT.LT.0) GO TO 20
         KSUC = NSUC-ICTS
         CALL PTKSUC(KSUC)
         ICTS = NTES-1
  20     CONTINUE
         IF(NTES.LE.0.AND.ISTOPT.GT.0.AND.ISTOP.GT.0)GO TO 40
C
C  CONSTRAIN NOISE COEFFICIENT WITHIN BOUNDS
C
         EPSC = DMIN1(EPSC,EPSMAX)
         IF(EPSC.LE.0.D0)EPSC = 1.D0
  30     CONTINUE
C  END OF SERIES OF TRIALS
C
  40  CONTINUE
C
C  INDICATOR OF STOPPING CONDITIONS
C
      IOUT = ISTOPT
      FMIN = FOPT
C
      RETURN
C
      END
      SUBROUTINE INIT(NX,X0,H0,EPS0,DX0,IRAND,F,N1,N2,N3,N4
     1    ,INH,IFE,XRI,XRA,IT)
C
C  INIT  PERFORMS THE INITIALIZATION OF THE FIRST TRIAL.
C  THE PART OF THE INITIALIZATION WHICH IS COMMON ALSO TO THE TRIALS
C  FOLLOWING THE FIRST ONE IS PERFORMED BY CALLING THE SUBROUTINE
C  REINIT.
C
      DOUBLE PRECISION X0,H0,EPS0,DX0,F,XRI,XRA
      DOUBLE PRECISION FUNCT
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
      DIMENSION X0(NX),XRI(NX),XRA(NX)
      DATA NPMAX/100/
      DATA NTRAJM/20/
      DATA NTRAJ0/7/
      DATA INKPB0/10/
      DATA KPBR00/3/
C
C CHECK PARAMETER VALUES
C
      IT = 0
      IF (NX.GT.NPMAX.OR.NX.LT.1.OR.H0.LE.0.D0.OR.EPS0.LE.0.D0
     1    .OR.DX0.LE.0.D0) IT = -99
      IF (IT.EQ.(-99)) RETURN
C
C INITIALIZE SOME VARIABLES
C
      INHP = INH
      DO 10 IX = 1,NX
         XRMIN(IX) = XRI(IX)
         XRMAX(IX) = XRA(IX)
  10     CONTINUE
      CALL NOSCA
      NTRAJ = N1
      IF(NTRAJ.EQ.0)NTRAJ = NTRAJ0
      NTRAJ = MIN0(NTRAJ,NTRAJM)
      NTRAJ = MAX0(NTRAJ,3)
      N1 = NTRAJ
      ISEGBR = N2
      IF(ISEGBR.EQ.0)ISEGBR = (1+NTRAJ)/2
      ISEGBR = MIN0(ISEGBR,NTRAJ)
      ISEGBR = MAX0(ISEGBR,1)
      N2 = ISEGBR
      INKPBR = N3
      IF(INKPBR.EQ.0)INKPBR = INKPB0
      N3 = INKPBR
      KPBR0 = N4
      IF(KPBR0.EQ.0)KPBR0 = KPBR00
      KPBR0 = MOD(KPBR0,INKPBR)
      N4 = KPBR0
      NDIM = NX
      NTRAJR = NTRAJ-1
      NCF = 1
      F = FUNCT(NX,X0)
      CALL STOOPT(NX,X0,F)
      DO 20 ID = 1,NTRAJ
         H(ID) = H0
         DX(ID) = DX0
  20     CONTINUE
C
C INITIALIZE REMAINING VARIABLES
C
      CALL REINIT(NX,X0,EPS0,IRAND,F,IFE)
C
      RETURN
      END
      SUBROUTINE REINIT(NX,X0,EPS0,IRAND,F,IFE)
C
C  REINIT  PERFORMS THE INITIALIZATION OF ALL TRIALS FOLLOWING THE
C  FIRST TRIAL, AND PART OF THE INITIALIZATION OF THE FIRST TRIAL.
C
      DOUBLE PRECISION X0,EPS0,F
      DOUBLE PRECISION EPSV,G
      DOUBLE PRECISION CHAOS
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
      DIMENSION X0(NX)
      DATA EPSV/1.D0/
C
C INITIALIZE RANDOM NOISE GENERATOR
C
      G = CHAOS(IRAND)
C
      IFEP = IFE
      KGEN = 0
      KTIM = 0
      DO 30 ID = 1,NTRAJ
         DO 10 IC = 1,NDIM
            X(IC,ID) = X0(IC)
  10        CONTINUE
         IE(ID) = 0
         DO 20 IT = 1,NTRAJR
            ISVT(ID,IT) = 1
            VMVT(ID,IT) = F
  20        CONTINUE
         EPS(ID) = EPS0*EPSV**(ISEGBR-ID)
         VMCOR(ID) = F
         VCOR(ID) = F
  30     CONTINUE
      RETURN
      END
      SUBROUTINE TRIAL(N,NPMIN,NPMAX,KPASCA,
     1    TOLREL,TOLABS,IPRINT,XMIN,FMIN,
     2    FMAX,NFEV,NR,ISTOP)
C
C  THE SUBROUTINE  TRIAL  GENERATES A TRIAL, I.E. A SET OF COMPLETE
C  SIMULTANEOUS TRAJECTORIES BY REPEATEDLY PERFORMING
C     A CALL TO THE SUBROUTINE  GENEVA  WHICH GENERATES THE SET OF
C        SIMULTANEOUS TRAJECTORY SEGMENTS CORRESPONDING TO THE CURRENT
C        OBSERVATION PERIOD, AND PERFORMS THE TRAJECTORY SELECTION
C     A (POSSIBLE) CALL TO THE SUBROUTINE  PTSEG  WHICH PERFORMS
C        END-OF-SEGMENT OUTPUT
C     A CHECK OF THE TRIAL STOPPING CRITERIA (WITH THE AID OF THE
C        FUNCTION  ITOLCH
C     A DECISION ABOUT ACTIVATING OR DEACTIVATING THE SCALING OF
C        THE VARIABLES (ACTIONS PERFORMED BY CALLING THE SUBROUTINES
C        ACTSCA  AND  NOSCA).
C
      DOUBLE PRECISION TOLREL,TOLABS,XMIN,FMIN,FMAX
      DIMENSION XMIN(N)
      DATA IRNF/7/
C
      DO 20 IR = 1,NPMAX
C
C ACTIVATE SCALING
C
         IF(IR.GE.KPASCA.AND.IR.GT.N*IRNF)CALL ACTSCA
         NR = IR
C
C GENERATE AND EVALUATE THE SIMULTANEOUS TRAJECTORY SEGMENTS
C PERIOD
C
         CALL GENEVA(N,XMIN,FMIN,FMAX,NFEV)
C
C PRINT RESULTS OF OBSERVATION PERIOD
C
         IF(IPRINT.GT.0)CALL PTSEG(N,XMIN,FMIN,FMAX,IR,NFEV)
C
C CHECK TRIAL STOPPING CONDITIONS
C
         IF(IR.LT.NPMIN)GO TO 10
         ISTOP = ITOLCH(FMAX,FMIN,TOLREL,TOLABS)
         IF(ISTOP.NE.0)GO TO 30
C
  10     CONTINUE
  20     CONTINUE
  30  CONTINUE
      CALL NOSCA
C
      RETURN
      END
      SUBROUTINE GENEVA(NX,XMIN,FMIN,FMAX,NCEF)
C
C  GENEVA  PERFORMS THE GENERATION AND THE FINAL PROCESSING AND
C  EVALUATION OF THE SET OF TRAJECTORY SEGMENTS CORRESPONDING TO
C  THE CURRENT OBSERVATION PERIOD.
C  GENEVA  UPDATES THE SCALING ARRAYS  DIST  AND  BIAS  BY CALLING
C             THE SUBROUTINES  SEGSCA  AND  UPDSCA
C          GENERATES THE TRAJECTORY SEGMENTS BY CALLING THE SUB-
C             ROUTINE  PERIOD
C          DETERMINES SOME END-OF-SEGMENT RESULTS  (FPFMIN, FPFMAX,
C             XPFMIN)  USING THE RESCALING CAPABILITIES OF THE SUB-
C             ROUTINES  SEGSCA  AND  VARSCA.
C
      DOUBLE PRECISION XMIN,FMIN,FMAX
      DOUBLE PRECISION FM
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
      DIMENSION XMIN(NX)
C
C UPDATE SCALING DATA
C
      DO 10 ID = 1,NTRAJ
         CALL SEGSCA(ID)
         CALL UPDSCA(NX,X(1,ID))
  10     CONTINUE
C
C GENERATE THE SIMULTANEOUS TRAJECTORY SEGMENTS
C
      CALL PERIOD
C
C EXTRACT AND RESCALE SOME FINAL VALUES
C
      FM = VCOR(1)
      FMAX = VCOR(1)
      IFM = 1
      DO 30 ID = 2,NTRAJ
         FMAX = DMAX1(FMAX,VCOR(ID))
         IF(VCOR(ID).GE.FM)GO TO 20
         FM = VCOR(ID)
         IFM = ID
  20     CONTINUE
  30     CONTINUE
      DO 40 IC = 1,NDIM
         XMIN(IC) = X(IC,IFM)
  40     CONTINUE
      FMIN = FM
      NCEF = NCF
      CALL SEGSCA(IFM)
      CALL VARSCA(NX,XMIN)
C
      RETURN
      END
      SUBROUTINE PERIOD
C
C  PERIOD  IS CALLED BY SUBROUTINE  GENEVA  TO PERFORM THE GENERATION
C  OF THE TRAJECTORY SEGMENTS.
C  PERIOD  - COMPUTES THE DURATION OF THE OBSERVATION PERIOD, I.E. THE
C              NUMBER  NHP  OF ACCEPTED INTEGRATION STEPS IN A PERIOD
C          - COMPUTES ALL THE SEGMENT STEPS BY REPEATEDLY CALLING THE
C              SUBROUTINE  STEP
C          - PERFORMS THE SEGMENT SELECTION BY CALLING THE SUBROUTINE
C               BRASI
C
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
C
C DETERMINE DURATION OF OBSERVATION PERIOD
C (NUMBER OF TIME INTEGRATION STEPS)
C
      KGEN = KGEN+1
      NKGEN = 1
      IF(INHP.EQ.1)NKGEN=
     1    INT(SNGL(DLOG(DBLE(FLOAT(KGEN))+.5D0)/DLOG(2.D0)))+1
      IF(INHP.EQ.2)NKGEN = INT(SNGL(DSQRT(DBLE(FLOAT(KGEN))+.5D0)))
      IF(INHP.EQ.3)NKGEN = KGEN
C
C PERFORM THE REQUIRED NUMBER OF INTEGRATION STEPS
C (FOR ALL TRAJECTORIES)
C
      DO 10 IK = 1,NKGEN
C
C PERFORM A SINGLE INTEGRATION STEP
C (FOR ALL TRAJECTORIES)
C
         CALL STEP(IK)
  10     CONTINUE
C
C MANAGE THE TRAJECTORY BRANCHING PROCESS
C
      CALL BRASI
      RETURN
      END
      SUBROUTINE BRASI
C
C  BRASI  PERFORMS THE SELECTION PROCESS FOR THE TRAJECTORIES
C  BRASI  - UPDATES THE DATA ABOUT THE PAST TRAJECTORIES
C         - ASKS FOR THE TRAJECTORY-SELECTION ORDERING BY CALLING THE
C              SUBROUTINE  ORDER
C         - DISCARDS ONE OF THE TRAJECTORIES
C         - PERFORMS BRANCHING ON ONE OF THE REMAINING TRAJECTORIES
C         - MOVES THE DATA OF THE UNPERTURBED CONTINUATION
C              TO THE POSITION OF THE PERTURBED CONTINUATION
C         - CALLS THE SUBROUTINE  COMPAS  TO EXAMINE DATA ABOUT PAST
C              HISTORY OF THE TRAJECTORIES AND DISCARD IRRILEVANT DATA
C
      DOUBLE PRECISION DFAC,DLEPMX,DLFACL
      DOUBLE PRECISION EFAC,EPSMAX,FACG
      DOUBLE PRECISION CHAOS
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
C
      DATA FACG/10.D0/
      DATA EFAC/.5D0/
      DATA DFAC/1.D3/
      DATA EPSMAX/1.D15/
      DATA DLFACL /0.301029995663981194D0/
      DATA DLEPMX /25.D0/
C
C UPDATE PAST HISTORY DATA
C
      DO 10 ID = 1,NTRAJ
         VMVT(ID,NTRAJR) = VMCOR(ID)
         ISVT(ID,NTRAJR) = ID
  10     CONTINUE
C
C OBTAIN TRAJECTORY-SELECTION ORDERING
C
      CALL ORDER(IP,IM,IU)
C
C DECIDE WHICH TRAJECTORY IS TO BE BRANCHED
C
      IF(MOD(KGEN,INKPBR).EQ.KPBR0)IM = IP
C
C PERFORM BRANCHING
C
      DO 20 IC = 1,NDIM
         X(IC,IU) = X(IC,IM)
  20     CONTINUE
      H(IU) = H(IM)
      IE(IU) = IE(IM)
      DO 30 IT = 1,NTRAJR
         ISVT(IU,IT) = ISVT(IM,IT)
         VMVT(IU,IT) = VMVT(IM,IT)
  30     CONTINUE
      EPS(IU) = EPS(IM)
      DX(IU) = DX(IM)
      VCOR(IU) = VCOR(IM)
      DO 40 ID = 1,NTRAJ
         VMCOR(ID) = VCOR(ID)
  40     CONTINUE
C
C UPDATE PAST-HISTORY-DATA MATRICES
C
      CALL COMPAS
C
C UPDATE SCALING DATA
C
      CALL MOVSCA(IU,IM)
C
C UPDATE NOISE COEFFICIENT VALUES
C
      IF (EPS(IU).LE.0.D0) GO TO 50
      IF(IFEP.EQ.2)
     1    EPS(IU) = EPS(IU)*FACG**(CHAOS(0)-EFAC)
      IF(IFEP.EQ.1)
     1    EPS(IU) = FACG**(DMIN1(DLEPMX,
     1    DLOG10(EPS(IU))+(CHAOS(-1)-EFAC)*DLFACL))
      EPS(IU) = DMIN1(EPS(IU),EPSMAX)
  50  CONTINUE
C
C UPDATE MAGNITUDE OF SPATIAL DISCRETIZATION INCREMENT
C
      DX(IU) = DX(IU)*DFAC**CHAOS(0)
      RETURN
      END
      SUBROUTINE ORDER(IP,IM,IU)
C
C  ORDER  COMPARES THE TRAJECTORIES FROM THE POINT OV VIEW OF PAST
C  HISTORY (BY CALLING THE FUNCTION  IPREC ) AND FROM THE POINT OF VIEW
C  OF THEIR CURRENT VALUE OF  EPS  (BY CALLING THE FUNCTION  IPRECE)
C  AND PROVIDES THE TRAJECTORY ORDERING NEEDED FOR SELECTING THE TRA-
C  JECTORY WHICH IS TO BE BRANCHED.
C
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
      DIMENSION IORD(20)
      DATA KP/0/
      IR = 0
C
C ASSIGN INITIAL ORDERING
C
  10  CONTINUE
      DO 20 I = 1,NTRAJ
         IORD(I) = I
  20     CONTINUE
C
C SORT TRAJECTORIES ...
C
  30  CONTINUE
      IR = IR+1
C
      DO 60 I = 1,NTRAJR
         I1 = I+1
         DO 50 J = I1,NTRAJ
            K1 = IORD(I)
            K2 = IORD(J)
C
C ... ACCORDING TO PAST HISTORY ...
C
            IF(IR.NE.2)KP = IPREC(K1,K2)
            IF(KP.EQ.0.AND.IR.EQ.1)GO TO 10
C
C ... OR ACCORDING TO NOISE LEVEL
C
            IF(IR.EQ.2)KP = IPRECE(K1,K2)
            IF(KP.EQ.0)GO TO 40
            KM = K1+K2-KP
            IORD(I) = KP
            IORD(J) = KM
  40        CONTINUE
  50        CONTINUE
  60     CONTINUE
      IF(IR.EQ.2)GO TO 30
C
C RETURN THE INDICES OF THE SEGMENTS WHICH IN THE ORDERING
C OCCUPY THE FIRST, THE LAST, AND A SUITABLE MEDIUM LEVEL POSITION
C
      IP = IORD(1)
      IU = IORD(NTRAJ)
      IM = IORD(ISEGBR)
C
      RETURN
      END
      INTEGER FUNCTION IPREC(ID1,ID2)
C
C  IPREC  DETERMINES THE PRECEDENCE RELATION BETWEEN TWO TRAJECTORIES
C  BASED ON THE PAST HISTORY DATA
C
      DOUBLE PRECISION VM1,VM2
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
C
      VM1 = VMVT(ID1,NTRAJR)
      VM2 = VMVT(ID2,NTRAJR)
      DO 10 IIT = 1,NTRAJR
         IT = 1+NTRAJR-IIT
         IF(ISVT(ID1,IT).EQ.ISVT(ID2,IT))GO TO 20
         VM1 = DMIN1(VM1,VMVT(ID1,IT))
         VM2 = DMIN1(VM2,VMVT(ID2,IT))
  10     CONTINUE
  20  CONTINUE
      IPREC = 0
      IF(VM2.LT.VM1)IPREC = ID2
      IF(VM2.GT.VM1)IPREC = ID1
C
      RETURN
      END
      INTEGER FUNCTION IPRECE(ID1,ID2)
C
C  IPRECE  DETERMINES THE PRECEDENCE RELATION BETWEEN TWO TRAJECTORIES
C  BASED ON THEIR CURRENT VALUE OF  EPS
C
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
      IPRECE = 0
      IF(KGEN.GT.ISEGBR*INKPBR)GO TO 10
      IF(EPS(ID2).LT.EPS(ID1))IPRECE = ID1
      IF(EPS(ID2).GT.EPS(ID1))IPRECE = ID2
      RETURN
C
  10  CONTINUE
      IF(EPS(ID2).LT.EPS(ID1))IPRECE = ID2
      IF(EPS(ID2).GT.EPS(ID1))IPRECE = ID1
C
      RETURN
      END
      SUBROUTINE COMPAS
C
C  COMPAS  TAKES CARE OF THE STORAGE OF PAST HISTORY DATA, DISCARDING
C  ALL DATA NOT NEEDED BY THE ONLY USER OF SUCH DATA, THE FUNCTION
C  IPREC .
C
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
C
      IT1 = 1
      DO 30 IT = 2,NTRAJR
         IT1 = IT-1
         DO 10 ID = 1,NTRAJ
            IF(ISVT(ID,IT).NE.ISVT(ID,IT1))GO TO 20
  10        CONTINUE
         GO TO 120
  20     CONTINUE
  30     CONTINUE
      IT1 = 1
      NCV = 0
      DO 50 ID = 1,NTRAJ
         DO 40 IDD = 1,NTRAJ
            IF(ISVT(ID,IT1).EQ.ISVT(IDD,IT1))NCV = NCV+1
  40        CONTINUE
  50     CONTINUE
      DO 80 IT = 2,NTRAJR
         IT1 = IT-1
         NCN = 0
         DO 70 ID = 1,NTRAJ
            DO 60 IDD = 1,NTRAJ
               IF(ISVT(ID,IT).EQ.ISVT(IDD,IT))NCN = NCN+1
  60           CONTINUE
  70        CONTINUE
         IF(NCN.EQ.NCV)GO TO 110
         NCV = NCN
  80     CONTINUE
      DO 90 ID = 1,NTRAJ
         IF(ISVT(1,1).NE.ISVT(ID,1))GO TO 100
  90     CONTINUE
      IT = 2
      GO TO 140
 100  CONTINUE
 110  CONTINUE
 120  CONTINUE
      IT = IT1+1
      DO 130 ID = 1,NTRAJ
         VMVT(ID,IT) = DMIN1(VMVT(ID,IT),VMVT(ID,IT1))
 130     CONTINUE
 140  CONTINUE
      DO 160 ITC = IT,NTRAJR
         ITM = ITC-1
         DO 150 ID = 1,NTRAJ
            VMVT(ID,ITM) = VMVT(ID,ITC)
            ISVT(ID,ITM) = ISVT(ID,ITC)
 150        CONTINUE
 160     CONTINUE
C
      RETURN
      END
      SUBROUTINE STEP(IK)
C
C  STEP  PERFORMS A SINGLE TIME-INTEGRATION STEP FOR EACH ONE OF THE
C  SIMULTANEOUS TRAJECTORIES BY REPEATEDLY CALLING THE SUBROUTINE  SSTEP
C
      DOUBLE PRECISION F
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      DOUBLE PRECISION XID,HID,EPSID,DXID
      DIMENSION XID(100)
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
C
      KTIM = KTIM+1
C
C LOOP ON THE SIMULTANEOUS TRAJECTORY SEGMENTS
      DO 30 ID = 1,NTRAJ
C
C INFORM THE SCALING SUBPROGRAMS (VIA THE COMMON AREA /SCALE/)
C THAT SCALING OPERATIONS ARE TO BE PERFORMED ON SEGMENT  ID .
         CALL SEGSCA(ID)
         F = VCOR(ID)
C
C PERFORM A TIME-INTEGRATION STEP ON SEGMENT  ID .
         KA = KTIM
         NX = NDIM
         DO 10 IX = 1,NX
            XID(IX) = X(IX,ID)
  10        CONTINUE
         HID = H(ID)
         EPSID = EPS(ID)
         DXID = DX(ID)
         IEID = IE(ID)
C
         CALL SSTEP(KA,NX,XID,HID,EPSID,DXID,IEID,F)
C
         DO 20 IX = 1,NX
            X(IX,ID) = XID(IX)
  20        CONTINUE
         H(ID) = HID
         EPS(ID) = EPSID
         DX(ID) = DXID
         IE(ID) = IEID
         VCOR(ID) = F
         VMCOR(ID) = DMIN1(VMCOR(ID),F)
         IF(IK.EQ.1)VMCOR(ID) = F
         IF(KTIM.EQ.1)IE(ID) = 0
  30     CONTINUE
C
      RETURN
      END
      SUBROUTINE SSTEP(KTIM,NDIM,X,H,EPS,DX,IE,F)
C
C  THE BASIC TIME-INTEGRATION STEP FOR A GIVEN TRAJECTORY IS PERFORMED
C  BY THE SUBROUTINE  STEP  WHICH
C   - CALLS THE FUNCTION  FUNCT0  TO COMPUTE THE VALUE OF  F
C   - CALLS THE SUBROUTINE  UNITRV  TO COMPUTE THE RANDOM DIRECTION
C        ALONG WHICH THE DIRECTIONAL DERIVATIVE  GAM/N  IS TO BE
C        COMPUTED
C   - CALLS THE SUBROUTINE  DERFOR (OR DERCEN ) TO COMPUTE THE FORWARD-
C        (OR CENTRAL-) DIFFERENCES DIRECTIONAL DERIVATIVE  GAM/N
C   - CALLS THE SUBROUTINE  NEWH  TO ACCEPT OR REJECT THE FIRST HALF-
C        STEP AND OBTAIN AN UPDATED VALUE FOR  H
C   - CALLS THE SUBROUTINE  CUMSCA  TO UPDATE THE CUMULATED SCALING DATA
C   - UPDATES THE SPATIAL DISCRETIZATION INCREMENT  DX  BASED ON THE
C        RESULTS OF CALLING THE FUNCTION  ITOLCH
C   - CALLS THE SUBROUTINE  GAUSRV  TO PERFORM THE SECOND HALF-STEP.
C
      DOUBLE PRECISION X,H,EPS,DX,F
      DOUBLE PRECISION DFDX,DFDXV,DXMAX,DXMIN
      DOUBLE PRECISION EPSR,FS,FV,FVS,HMINS,HR,HS
      DOUBLE PRECISION RCD,RDX,STF,TOLABS,TOLRA,TOLRI
      DOUBLE PRECISION W,XP
      DOUBLE PRECISION FUNCT0
      DIMENSION X(NDIM)
      DIMENSION W(100),XP(100)
      DATA RDX/1.D-4/
      DATA DXMIN/1.D-35/
      DATA DXMAX/1.D3/
      DATA HR/1.D-1/
      DATA HMINS/1.D-30/
      DATA STF /100.D0/
      DATA RCD/2.D0/
      DATA TOLRI/1.D-5/
      DATA TOLRA/1.D-11/
      DATA TOLABS/0.D0/
C
      IEC = 0
      FV = F
  10  CONTINUE
  20  CONTINUE
C
C TAKE A RANDOM DIRECTION FOR THE DIRECTIONAL DERIVATIVE
      CALL UNITRV(NDIM,W)
C
C COMPUTE FORWARD-DIFFERENCE DERIVATIVE
      CALL DERFOR(NDIM,X,FV,DX,W,DFDX)
C
C TRY THE FIRST HALF-STEP
      DO 30 IC = 1,NDIM
         XP(IC) = X(IC)-H*W(IC)*DFDX*DBLE(FLOAT(NDIM))
  30     CONTINUE
      HS = H
      F = FUNCT0(NDIM,XP)
      FVS = FV+DX*DABS(DFDX)
C
C UPDATE STEPLENGTH  H  AND ACCEPT OR REJECT THE HALF-STEP
      CALL NEWH(KTIM,FVS,F,H,IE,IEC)
      IF(IEC.LE.0)GO TO 50
      IE = IE-1
      IEC = IEC-1
      H = HS
      DFDXV = DFDX
C
C COMPUTE CENTRAL-DIFFERENCES DERIVATIVE
      CALL DERCEN(NDIM,X,FV,DX,W,DFDX)
C
C TRY AGAIN THE FIRST HALF-STEP
      DO 40 IC = 1,NDIM
         XP(IC) = X(IC)-H*W(IC)*DFDX*DBLE(FLOAT(NDIM))
  40     CONTINUE
      F = FUNCT0(NDIM,XP)
      FVS = FV+DX*DABS(DFDXV-DFDX)
C
C
C UPDATE STEPLENGTH  H  AND ACCEPT OR REJECT THE HALF-STEP
      CALL NEWH(KTIM,FVS,F,H,IE,IEC)
C
C UPDATE CUMULATED PAST SCALING DATA
      IF(IEC.GE.1)CALL CUMSCA(NDIM,W,DFDX)
      IF(IEC.GE.1)GO TO 10
      DX = DX*RDX
C
C FIRST HALF-STEP ACCEPTED
  50  CONTINUE
C
C UPDATE CUMULATED PAST SCALING DATA
      CALL CUMSCA(NDIM,W,DFDX)
      FS = FV+DX*DABS(DFDX)
      IF(ITOLCH(FS,FV,TOLRI,TOLABS).EQ.0)DX = DX/RCD
      IF(ITOLCH(FS,FV,TOLRA,TOLABS).GT.0)DX = DX*RCD
      EPSR = DSQRT(H)*EPS
C
C TAKE A SAMPLE INCREMENT OF THE WIENER PROCESS
      CALL GAUSRV(NDIM,W)
C
C TRY THE SECOND HALF-STEP
      DO 60 IC = 1,NDIM
         XP(IC) = XP(IC)+EPSR*W(IC)
  60     CONTINUE
      F = FUNCT0(NDIM,XP)
C
C ACCEPT OR REJECT THE COMPLETE STEP
      IF (F-FV.LE.EPS*EPS*STF) GO TO 70
      H = H*HR
      IE = IE+1
      IF (H.GT.HMINS) GO TO 20
C
C STEP ACCEPTED
  70  CONTINUE
      DO 80 IC = 1,NDIM
         X(IC) = XP(IC)
  80     CONTINUE
      DX = DMIN1(DX,DXMAX)
      DX = DMAX1(DX,DXMIN)
C
      RETURN
      END
      SUBROUTINE NEWH(K,FV,F,H,IE,IEC)
C
C  NEWH  IS CALLED BY THE SUBROUTINE  SSTEP  TO DECIDE WHETHER TO ACCEPT
C  OR REJECT THE FIRST HALF-STEP, AND TO PROVIDE AN UPDATED VALUE FOR  H
C
      DOUBLE PRECISION FV,F,H
      DOUBLE PRECISION FA,FR,HMAX,HMIN,R
      DIMENSION FR(3),FA(4)
      DATA FR/1.05D0,2.D0,10.D0/
      DATA FA/1.D0,1.1D0,2.D0,10.D0/
      DATA HMIN/1.D-30/
      DATA HMAX/1.D25/
      DATA IECMAX/50/
C
      IF(FV.LT.F)GO TO 20
C
C STEP ACCEPTED, POSSIBLY INCREASE THE STEPLENGTH  H
C
      R = FA(1)
      IF(IE*2.LT.K)R = FA(2)
      IF(IE*3.LT.K)R = FA(3)
      IF(IE.EQ.0.AND.K.GT.1)R = FA(4)
      H = H*R
  10  CONTINUE
      IEC = 0
      GO TO 30
C
  20  CONTINUE
      IE = IE+1
      IEC = IEC+1
      IF(IEC.GT.IECMAX)GO TO 10
C
C STEP REJECTED, DECREASE  H
C
      IC = MIN0(3,IEC)
      R = FR(IC)
      H = H/R
  30  CONTINUE
      H = DMIN1(H,HMAX)
      H = DMAX1(H,HMIN)
C
      RETURN
      END
      SUBROUTINE DERFOR(NDIM,X,F,DX,W,DFDX)
C
C  DERFOR  COMPUTED THE FORWARD FINITE-DIFFERNCES DIRECTIONAL
C  DERIVATIVES (CALLING  FUNCT0 )
C
      DOUBLE PRECISION X,F,DX,W,DFDX
      DOUBLE PRECISION DXF,DXFF,DXMAX,FN,S,XX
      DOUBLE PRECISION FUNCT0
      DIMENSION X(NDIM),W(NDIM)
      DIMENSION XX(100)
      DATA DXFF/1.D6/,DXF/1.D1/
      DATA DXMAX/1.D6/
C
  10  CONTINUE
  20  CONTINUE
      S = 0.D0
      DO 30 IC = 1,NDIM
         XX(IC) = X(IC)+W(IC)*DX
         S = S+(XX(IC)-X(IC))**2
  30     CONTINUE
      IF(S.GT.0.D0)GO TO 40
      DX = DX*DXFF
      GO TO 20
  40  CONTINUE
      FN = FUNCT0(NDIM,XX)
      DFDX = (FN-F)/DX
      IF(DX.GT.DXMAX)RETURN
      IF(DABS(DFDX).GT.1.D0)RETURN
      IF(DFDX**2.GT.0.D0)GO TO 50
      DX = DX*DXF
      GO TO 10
  50  CONTINUE
C
      RETURN
      END
      SUBROUTINE DERCEN(NDIM,X,F,DX,W,DFDX)
C
C  DERFOR  COMPUTED THE CENTRAL FINITE-DIFFERNCES DIRECTIONAL
C  DERIVATIVES (CALLING  FUNCT0 )
C
      DOUBLE PRECISION X,F,DX,W,DFDX
      DOUBLE PRECISION FN,FR,XX
      DOUBLE PRECISION FUNCT0
      DIMENSION X(NDIM),W(NDIM)
      DIMENSION XX(100)
C
      DO 10 IC = 1,NDIM
         XX(IC) = X(IC)-W(IC)*DX
  10     CONTINUE
      FR = FUNCT0(NDIM,XX)
      FN = F+DFDX*DX
      DFDX = (FN-FR)/(2.D0*DX)
C
      RETURN
      END
      SUBROUTINE RCLOPT(N,XO,FO)
C
C  RCLOPT  RECALLS THE CURRENT BEST MINIMUM VALUE  FOPT  FOUND SO FAR
C  FROM ALGORITHM START, AND THE POINT  XOPT  (OR POSSIBLY ONE OF THE
C  POINTS) WHERE  FOPT  WAS OBTAINED
C
      DOUBLE PRECISION XO,FO
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
      DIMENSION XO(N)
C
      DO 10 I = 1,N
         XO(I) = XOPT(I)
  10     CONTINUE
      FO = FOPT
C
      RETURN
      END
      SUBROUTINE STOOPT(N,XO,FO)
C
C  STOOPT  STORES THE CURRENT BEST MINIMUM VALUE  FOPT  FOUND SO FAR
C  FROM ALGORITHM START, AND THE POINT  XOPT  (OR POSSIBLY ONE OF THE
C  POINTS) WHERE  FOPT  WAS OBTAINED
C
      DOUBLE PRECISION XO,FO
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
      DIMENSION XO(N)
C
      DO 10 I = 1,N
         XOPT(I) = XO(I)
  10     CONTINUE
      FOPT = FO
C
      RETURN
      END
      DOUBLE PRECISION FUNCTION FUNCT0(N,XX)
C
C  FUNCT0  IS CALLED  WHENEVER THE VALUE OF THE FUNCLION  F  IS REQUIRED
C  IN THE NUMERICAL INTEGRATION PROCESS.
C  THE FUNCTION  FUNCT0
C   - RESCALES THE VARIABLES BY CALLING THE SUBROUTINE  VARSCA
C   - CALLS THE SUBROUTINE  RANGE  TO TAKE CARE OF THE CASES WHERE THE
C      CURRENT POINT  X  IS OUTSIDE A GIVEN ADMISSIBLE REGION
C   - CALLS THE USER-SUPPLIED FUNCTION  FUNCT  TO ACTUALLY COMPUTE THE
C      VALUE OF  F
C   - POSSIBLY CALLS THE SUBROUTINE  STOOPT  TO UPDATE THE CURRENT
C        BEST MINIMUM FUNCTION VALUE  FOPT  AND THE CORRESPONDING
C        MINIMIZER  XOPT
C
      DOUBLE PRECISION XX
      DOUBLE PRECISION F,R,XS
      DOUBLE PRECISION FUNCT
      DOUBLE PRECISION X,H,DX,VMVT,EPS,VMCOR,VCOR
      DOUBLE PRECISION XRMIN,XRMAX,XOPT,FOPT
      COMMON /DINCOM/ X(100,20),H(20),DX(20),VMVT(20,19),EPS(20),
     1    VMCOR(20),VCOR(20),XRMIN(100),XRMAX(100),XOPT(100),FOPT,
     2    IE(20),ISVT(20,19),KGEN,KTIM,NDIM,NTRAJ,NTRAJR,
     3    ISEGBR,INKPBR,KPBR0,NCF,IFEP,INHP
      DIMENSION XX(N)
      DIMENSION XS(100)
C
      DO 10 IX = 1,N
         XS(IX) = XX(IX)
  10     CONTINUE
C
C DESCALE  X-VARIABLES
      CALL VARSCA(N,XS)
C
C CONSTRAIN THE  X-VARIABLES WITHIN BOUNDS
      CALL RANGE(N,XS,XRMIN,XRMAX,R)
C
C COMPUTE THE FUNCTION VALUE...
      F = FUNCT(N,XS)+R
C
C ... AND POSSIBLY UPDATE THE BEST CURRENT MINIMUM
      IF(F.LT.FOPT)CALL STOOPT(N,XS,F)
      FUNCT0 = F
      NCF = NCF+1
C
      RETURN
      END
      SUBROUTINE RANGE (N,XS,XRMIN,XRMAX,R)
C
C  RANGE  IS CALLED BY THE FUNCTION  FUNCT0  TO TAKE CARE OF THE CASES
C  WHERE THE CURRENT POINT  X  IS OUTSIDE A GIVEN ADMISSIBLE REGION
C
      DOUBLE PRECISION XS,XRMIN,XRMAX,R
      DOUBLE PRECISION A,B,C,D,DLRMAX,RMAX,RR,XC
      DIMENSION XS(N),XRMIN(N),XRMAX(N)
      DATA RMAX /1.D35/
      DATA DLRMAX/80.5904782547915990D0/
C
      R = 0.D0
      DO 40 I = 1,N
         A = XRMAX(I)
         C = XRMIN(I)
         XC = XS(I)
         IF (XC.LE.A) GO TO 10
         B = A+A-C
         RR = RMAX
         IF (XC.LT.B) RR = DEXP((XC-A)*DLRMAX/(B-A))-1.D0
         R = R+RR
         XS(I) = XRMAX(I)
         GO TO 30
  10     CONTINUE
         IF(XC.GE.C)GO TO 20
         D = C+C-A
         RR = RMAX
         IF (XC.GT.D) RR = DEXP((C-XC)*DLRMAX/(C-D))-1.D0
         R = R+RR
         XS(I) = XRMIN(I)
  20     CONTINUE
  30     CONTINUE
  40     CONTINUE
C
      RETURN
      END
      INTEGER FUNCTION ITOLCH(FMAX,FMIN,TOLREL,TOLABS)
C
C  ITOLCH  DETERMINES  WHETHER TWO QUANTITIES ARE TO BE CONSIDERED NU-
C  MERICALLY EQUAL WITH RESPECT TO AN ABSOLUTE (OR RELATIVE) DIFFERENCE
C  CRITERION, WITHIN GIVEN TOLERANCES
C
      DOUBLE PRECISION FMAX,FMIN,TOLREL,TOLABS
C
      ISTOP = 0
C
C CHECK RELATIVE DIFFERENCE AGAINST  TOLREL
      IF(DABS(FMAX-FMIN).LE.TOLREL*(DABS(FMIN)+DABS(FMAX))/2.D0)
     1    ISTOP=ISTOP+1
C
C CHECK ABSOLUTE DIFFERENCE AGAINST  TOLABS
      IF(FMAX-FMIN.LE.TOLABS)ISTOP = ISTOP+2
      ITOLCH = ISTOP
C
      RETURN
      END
      SUBROUTINE INISCA(N,ND)
C
C  INISCA  INITIALIZES THE COOMON AREA  /SCALE/  FOR THE SCALING DATA
C
      DOUBLE PRECISION DIST,BIAS,GRAGRA,GRA
      COMMON /SCALE/ DIST(10,10,20),BIAS(10,20),GRAGRA(10,10,20),
     1    GRA(10,20),NGRA(20),LSCA,IDSCA,NX,NORD
      DATA NXMSCA/10/
C
      LSCA = -1
      IF(N.GT.NXMSCA.OR.N.EQ.1)RETURN
      LSCA = 0
      NX = N
      NORD = ND
      IDSCA = 1
      DO 1 ID = 1,NORD
         DO 2 IX = 1,NX
            DO 3 IY = 1,NX
               DIST(IX,IY,ID) = 0.D0
               GRAGRA(IX,IY,ID) = 0.D0
   3           CONTINUE
            DIST(IX,IX,ID) = 1.D0
            BIAS(IX,ID) = 0.D0
            GRA(IX,ID) = 0.D0
   2        CONTINUE
         NGRA(ID) = 0
   1     CONTINUE
C
      RETURN
      END
      SUBROUTINE NOSCA
C
C  NOSCA  DEACTIVATES THE SCALING
C
      DOUBLE PRECISION DIST,BIAS,GRAGRA,GRA
      COMMON /SCALE/ DIST(10,10,20),BIAS(10,20),GRAGRA(10,10,20),
     1    GRA(10,20),NGRA(20),LSCA,IDSCA,NX,NORD
C
      LSCA = -1
C
      RETURN
      END
      SUBROUTINE SEGSCA(ID)
C
C  SEGSCA  SELECTS THE TRAJECTORY WHICH MUST BE RESCALED
C
      DOUBLE PRECISION DIST,BIAS,GRAGRA,GRA
      COMMON /SCALE/ DIST(10,10,20),BIAS(10,20),GRAGRA(10,10,20),
     1    GRA(10,20),NGRA(20),LSCA,IDSCA,NX,NORD
C
      IDSCA = ID
C
      RETURN
      END
      SUBROUTINE VARSCA(N,X)
C
C  VARSCA  COMPUTES THE RESCALED VARIABLE  AX + B
C
      DOUBLE PRECISION X
      DOUBLE PRECISION XB
      DOUBLE PRECISION DIST,BIAS,GRAGRA,GRA
      COMMON /SCALE/ DIST(10,10,20),BIAS(10,20),GRAGRA(10,10,20),
     1    GRA(10,20),NGRA(20),LSCA,IDSCA,NX,NORD
      DIMENSION X(N),XB(10)
C
      IF(LSCA.LE.0)RETURN
      DO 1 I = 1,N
         XB(I) = BIAS(I,IDSCA)
         DO  2 J = 1,N
            XB(I) = XB(I)+DIST(I,J,IDSCA)*X(J)
   2        CONTINUE
   1     CONTINUE
      DO 3 I = 1,N
         X(I) = XB(I)
   3     CONTINUE
C
      RETURN
      END
      SUBROUTINE CUMSCA(N,W,DFDX)
C
C  CUMSCA  STORES CUMULATED STATISTICAL DATA ON THE ILL-CONDITIONING OF
C  F(AX+B) W.R.T. X
C
      DOUBLE PRECISION W,DFDX
      DOUBLE PRECISION DFDXMA
      DOUBLE PRECISION DIST,BIAS,GRAGRA,GRA
      COMMON /SCALE/ DIST(10,10,20),BIAS(10,20),GRAGRA(10,10,20),
     1    GRA(10,20),NGRA(20),LSCA,IDSCA,NX,NORD
      DIMENSION W(N)
      DATA DFDXMA/1.D8/
C
      IF(LSCA.LE.0)RETURN
      IF(DABS(DFDX).GT.DFDXMA)RETURN
      DO 1 I = 1,N
         DO 2 J = 1,N
            GRAGRA(I,J,IDSCA) = GRAGRA(I,J,IDSCA)+DFDX*W(I)*DFDX*W(J)
   2        CONTINUE
         GRA(I,IDSCA) = GRA(I,IDSCA)+DFDX*W(I)
   1     CONTINUE
      NGRA(IDSCA) = NGRA(IDSCA)+1
C
      RETURN
      END
      SUBROUTINE ACTSCA
C
C  ACTSCA  ACTIVATES THE RESCALING
C
      DOUBLE PRECISION DIST,BIAS,GRAGRA,GRA
      COMMON /SCALE/ DIST(10,10,20),BIAS(10,20),GRAGRA(10,10,20),
     1    GRA(10,20),NGRA(20),LSCA,IDSCA,NX,NORD
C
      IF(LSCA.EQ.0)LSCA = 1
C
      RETURN
      END
      SUBROUTINE MOVSCA(IU,IM)
C
C  MOVSCA  MOVES THE SCALING DATA OF THE UNPERTURBED CONTINUATION TO THE
C  POSITION OF THE PERTURBED CONTINUATION
C
      DOUBLE PRECISION DIST,BIAS,GRAGRA,GRA
      COMMON /SCALE/ DIST(10,10,20),BIAS(10,20),GRAGRA(10,10,20),
     1    GRA(10,20),NGRA(20),LSCA,IDSCA,NX,NORD
C
      IF(LSCA.LT.0)RETURN
      DO 1 I = 1,NX
         DO 2 J = 1,NX
            DIST(I,J,IU) = DIST(I,J,IM)
            GRAGRA(I,J,IU) = GRAGRA(I,J,IM)
   2        CONTINUE
         BIAS(I,IU) = BIAS(I,IM)
         GRA(I,IU) = GRA(I,IM)
   1     CONTINUE
      NGRA(IU) = NGRA(IM)
C
      RETURN
      END
      SUBROUTINE UPDSCA(N,X)
C
C  UPDSCA  UPDATES THE SCALING MATRIX  A  AND THE BIAS VECTOR  B BY
C  CALLING  EIGSCA  AND  VARSCA
C
      DOUBLE PRECISION X
      DOUBLE PRECISION AGRAI,ALA1,ALPHA,AMCOR,BIAST
      DOUBLE PRECISION CD,COR,DISTT,SN
      DOUBLE PRECISION EIGSCA
      DOUBLE PRECISION DIST,BIAS,GRAGRA,GRA
      COMMON /SCALE/ DIST(10,10,20),BIAS(10,20),GRAGRA(10,10,20),
     1    GRA(10,20),NGRA(20),LSCA,IDSCA,NX,NORD
      DIMENSION X(N)
      DIMENSION DISTT(10,10),BIAST(10),COR(10,10)
      DATA ALPHA /0.3D0/
C
      IF(LSCA.LE.0)RETURN
      ID = IDSCA
      IF(NGRA(ID).LT.2*NX*NX)GO TO 2
      AGRAI = 1.D0/DBLE(FLOAT(NGRA(ID)))
      AMCOR = 0.D0
      DO 3 I = 1,NX
         DO 4 J = 1,NX
         COR(I,J) = AGRAI*GRAGRA(I,J,ID)-AGRAI*GRA(I,ID)*AGRAI*GRA(J,ID)
            AMCOR = DMAX1(AMCOR,DABS(COR(I,J)))
   4        CONTINUE
   3     CONTINUE
      IF(AMCOR.LE.0.D0)GO TO 12
      DO 1 I = 1,NX
         DO 11 J = 1,NX
            COR(I,J) = COR(I,J)/AMCOR
  11        CONTINUE
   1     CONTINUE
      ALA1 = EIGSCA(COR)
      CD = ALA1*(1.D0+ALPHA)
      DO 5 I = 1,NX
         COR(I,I) = COR(I,I)-CD
         BIAST(I) = X(I)
   5     CONTINUE
      CALL VARSCA(NX,BIAST)
      SN = 0.D0
      DO 6 I = 1,NX
         DO 7 J = 1,NX
            DISTT(I,J) = 0.D0
            DO 8 K = 1,NX
               DISTT(I,J) = DISTT(I,J)-DIST(I,K,ID)*COR(K,J)
   8           CONTINUE
            SN = SN+DISTT(I,J)**2
   7        CONTINUE
   6     CONTINUE
      SN = 1.D0/DSQRT(SN/DBLE(FLOAT(NX)))
      DO 9 I = 1,NX
         BIAS(I,ID) = BIAST(I)
         DO 10 J = 1,N
            DIST(I,J,ID) = SN*DISTT(I,J)
            BIAS(I,ID) = BIAS(I,ID)-DIST(I,J,ID)*X(J)
            GRAGRA(I,J,ID) = 0.D0
  10        CONTINUE
         GRA(I,ID) = 0.D0
   9     CONTINUE
      NGRA(ID) = 0
   2  CONTINUE
  12  CONTINUE
C
      RETURN
      END
      DOUBLE PRECISION FUNCTION EIGSCA(COR)
C
C  EIGSCA COMPUTES THE LARGEST EIGENVALUE OF A MATRIX USED FOR RESCA-
C  LING, STARTING FROM A RANDOMLY-CHOSEN ESTIMATE (OBTAINED BY CALLING
C  THE SUBROUTINE  UNITRV ) OF THE CORRESPONDING EIGENVECTOR
C
      DOUBLE PRECISION COR
      DOUBLE PRECISION ALA1,ALA1I,ALA1O
      DOUBLE PRECISION PREC,SWW,W,WW
      DOUBLE PRECISION DIST,BIAS,GRAGRA,GRA
      COMMON /SCALE/ DIST(10,10,20),BIAS(10,20),GRAGRA(10,10,20),
     1    GRA(10,20),NGRA(20),LSCA,IDSCA,NX,NORD
      DIMENSION COR(10,10)
      DIMENSION W(10),WW(10)
      DATA PREC /1.D-3/
      DATA NRMIN /10/
      DATA NRMAX /100/
C
      CALL UNITRV(NX,W)
      ALA1 = 0.D0
      DO 1 IR = 1,NRMAX
         ALA1O = ALA1
         SWW = 0.D0
         DO 2 IX = 1,NX
            WW(IX) = 0.D0
            DO 3 JX = 1,NX
               WW(IX) = WW(IX)+COR(IX,JX)*W(JX)
   3           CONTINUE
            SWW = SWW+WW(IX)**2
   2        CONTINUE
         ALA1 = DSQRT(SWW)
         ALA1I = 1.D0/ALA1
         IF(IR.GE.NRMIN.AND.ALA1*PREC.GT.DABS(ALA1-ALA1O))GO TO 4
         DO 5 IX = 1,NX
            W(IX) = WW(IX)*ALA1I
   5        CONTINUE
   1     CONTINUE
   4  CONTINUE
      EIGSCA = ALA1
C
      RETURN
      END
      DOUBLE PRECISION FUNCTION CHAOS(INIZ)
C
C  CHAOS  GENERATES A RANDOM SAMPLE FROM ONE OUT OF FOUR POSSIBLE
C PROBABILITY DISTRIBUTIONS USING RANDOM NUMBERS UNIFORMLY
C DISTRIBUTED IN (0,1) GENERATED BY THE FUNCTION  UNIFRD
C
C  INIZ  IS AN INPUT PARAMETER AS FOLLOWS
C
C      INIZ>0          INITIALIZATION WITH SEED  INIZ.
C      INIZ=0          STANDARD GAUSSIAN DISTRIBUTION.
C      INIZ=-1         CAUCHY DISTRIBUTION.
C      INIZ=-2         UNIFORM DISTRIBUTION IN (-1,+1).
C      OTHERWISE       UNIFORM DISTRIBUTION IN ( 0,+1).
C
      DOUBLE PRECISION UNIFRD,PAI,A,B
C
      DATA PAI/3.14159265358979324D0/
C
      IF(INIZ.LE.0) GO TO 10
C
C INITIALIZATION.
C
      CHAOS = UNIFRD(INIZ)
      RETURN
C
  10  CONTINUE
      A = UNIFRD(0)
      IF(INIZ.NE.0) GO TO 20
      B = UNIFRD(0)
C
C GAUSSIAN RANDOM NUMBER BY POLAR METHOD
C
      CHAOS = DSQRT(-2.D0*DLOG(A))*DCOS(PAI*B)
C
      RETURN
  20  CONTINUE
C
C UNIFORM RANDOM NUMBER IN (0,1)
C
      CHAOS = A
C
C CAUCHY RANDOM NUMBER BY INVERSE TRANSFORMATION
C
      IF(INIZ.EQ.(-1)) CHAOS = DSIN(PAI*A)/DCOS(PAI*A)
C
C UNIFORM RANDOM NUMBER IN (-1,+1)
C
      IF(INIZ.EQ.(-2)) CHAOS = 2.D0*A-1.D0
C
      RETURN
      END
      DOUBLE PRECISION FUNCTION UNIFRD(INIZ)
C
C UNIFRD GENERATES THE RANDOM NUMBERS UNIFORMLY DISTRIBUTED IN (0,1)
C EXPLOITING THOSE GENERATED BY  ALKNUT  WITH A FURTHER RANDOMIZATION
C IF THE INPUT PARAMETER INIZ  IS NOT 0
C THE RANDOM NUMBER GENERATOR IS INITIALIZED
C
      DOUBLE PRECISION A,B,C,X
      DOUBLE PRECISION X0,P,P0,P1,P2,R1,R2
      DOUBLE PRECISION FINV
C
      DIMENSION X(61)
C
      DATA NREM/61/,NRIP/100/
      DATA A,B,C/-1.5D0,5.5D0,-2.0D0/
      DATA FINV/3.5D-5/
      DATA IREM/0/
      DATA P0/3.D0/,P1,P2/1.D0,3.D0/,R1,R2/0.25D0,0.75D0/
C
      IF(INIZ.NE.0.OR.IREM.EQ.0) GO TO 10
C
      I0 = IREM
      X0 = X(I0)
C
C NONLINEARIZATION OF X0 TO AVOID LONG-DISTANCE LINEAR RELATIONSHIP.
C
      IF(X0.GE.FINV)X0 = DMOD(1.D0/X0,1.D0)
C
C UPDATE A COMPONENT OF THE VECTOR X ...
C
      CALL ALKNUT(NREM,X,IREM)
C
C ... AND FURTHER RANDOMIZE
C
      UNIFRD = DMOD(X0+X(I0),1.D0)
C
      RETURN
C
C INITIALIZATION OF THE RANDOM NUMBER GENERATOR
C
  10  CONTINUE
C
      P = P0-1.D0/DBLE(FLOAT(IABS(INIZ))+100.0)
      DO 20 K = 1,NREM
C
         P = C+P*(B+P*A)
C
C
         X(K) = R1+(R2-R1)*(P-P1)/(P2-P1)
  20     CONTINUE
C
      IREM = 0
C
      DO 30 K = 1,NRIP
C
         CALL ALKNUT(NREM,X,IREM)
C
  30     CONTINUE
C
      UNIFRD = X(1)
C
      RETURN
      END
      SUBROUTINE ALKNUT(NREM,X,IREM)
C
C UPDATES THE COMPONENT IREM OF THE NREM-VECTOR X WITH A RANDOM NUMBER
C UNIFORMLY DISTRIBUTED IN (0,1) BY MEANS OF THE ALGORITHM
C OF MITCHELL-MOORE, MODIFIED AS SUGGESTED BY BRENT, QUOTED IN
C D.E.KNUTH, THE ART OF COMPUTER PROGRAMMING, SECOND EDITION,
C SECOND VOLUME, SEMINUMERICAL ALGORITHMS, ADDISON-WESLEY
C PUB. CO., READING (1981), PP. 26-28.
C
      DOUBLE PRECISION X
C
      DIMENSION X(NREM)
C
      DATA N1,N2/24,55/
C
      IF(IREM.NE.0) GO TO 10
C
      IREM = NREM
      I1 = NREM-N1
      I2 = NREM-N2
C
  10  CONTINUE
C
      X(IREM) = DMOD(X(I1)+X(I2),1.D0)
C
      IREM = 1+MOD(IREM,NREM)
      I1 = 1+MOD(I1,NREM)
      I2 = 1+MOD(I2,NREM)
C
      RETURN
      END
      SUBROUTINE GAUSRV(N,W)
C
C GENERATES A RANDOM VECTOR SAMPLE FROM AN N-DIMENSIONAL
C NORMAL DISTRIBUTION
C
      DOUBLE PRECISION W,X,Y,R
      DOUBLE PRECISION CHAOS
C
      DIMENSION W(N)
C
      NN = (N+1)/2
C
      DO 20 I = 1,NN
         II = 1+N-I
C
  10     CONTINUE
         X = CHAOS(-2)
         Y = CHAOS(-2)
         R = X*X+Y*Y
C
         IF(R.GT.1.D0) GO TO 10
C
         R = DSQRT(-2.D0*DLOG(R)/R)
C
         W(I) = X*R
         W(II) = Y*R
C
  20     CONTINUE
C
      RETURN
      END
      SUBROUTINE UNITRV(N,W)
C
C GENERATES A RANDOM VECTOR UNIFORMLY DISTRIBUTED
C ON THE UNIT SPHERE.
C
      DOUBLE PRECISION W,WW
C
      DIMENSION W(N)
C
      CALL GAUSRV(N,W)
      WW = 0.D0
C
      DO 10 I = 1,N
         WW = WW+W(I)**2
  10     CONTINUE
      WW = 1.D0/DSQRT(WW)
C
      DO 20 I = 1,N
         W(I) = WW*W(I)
  20     CONTINUE
C
      RETURN
      END
      SUBROUTINE GLOMTF (NPROB, N, X, FUNZ)
C
C     THE SUBROUTINE  GLOMTF  PROVIDES THE CODING OF 37 REAL-VALUED
C     FUNCTIONS OF  N  REAL VARIABLES, TO BE USED, TOGETHER WITH THE
C     SUBROUTINE  GLOMIP , TO DEFINE 37 TEST PROBLEMS FOR GLOBAL
C     MINIMIZATION SOFTWARE.
C
C     THE SUBROUTINE  GLOMTF  RETURNS IN  FUNZ  THE FUNCTION VALUE
C     AT THE POINT  X = (X1,X2,...,XN)  FOR THE FUNCTION DEFINED BY
C     PROBLEM NUMBER  NPROB .
C
C     CALLING STATEMENT
C
C        CALL GLOMTF (NPROB, N, X, FUNZ)
C
C     DESCRIPTION OF THE CALL PARAMETERS
C        (THE FORTRAN IMPLICIT TYPE DEFINITION FOR INTEGERS IS USED.
C        ALL NON-INTEGER PARAMETERS ARE DOUBLE-PRECISION).
C
C     NPROB   IS THE (INPUT) TEST-PROBLEM NUMBER
C
C     N   IS THE (INPUT) DIMENSION OF THE PROBLEM
C
C     X   IS AN (INPUT) N-VECTOR CONTAINING THE INDEPENDENT VARIABLES
C
C     FUNZ   IS THE (OUTPUT) VALUE AT  X  OF THE FUNCTION DEFINED BY
C        PROBLEM NUMBER  NPROB .
C
C
C
      DOUBLE PRECISION X
      DOUBLE PRECISION FUNZ
C
      DOUBLE PRECISION PI
      DOUBLE PRECISION P1A
      DOUBLE PRECISION P4A
      DOUBLE PRECISION P5A
      DOUBLE PRECISION P6A
      DOUBLE PRECISION P9A,P9B
      DOUBLE PRECISION P17A
      DOUBLE PRECISION P20A,P20B
      DOUBLE PRECISION P21A,P21B,P21C,P21D
      DOUBLE PRECISION P22A,P22B,P22C,P22D
      DOUBLE PRECISION P36A,P36B,P36C,P36D
      DOUBLE PRECISION P37A,P37B,P37C,P37D
      DOUBLE PRECISION Y
      DOUBLE PRECISION XX,DI,YY,BETA,S1,S2,A,B,R2,R4,R8,U,V,UU,VV,S
      DOUBLE PRECISION RG,RP,H,PUND,RANGE
      DOUBLE PRECISION FACT,VAR,PENFUN,RAN
C
      DIMENSION X(N)
C
      DIMENSION P20A(10,4),P20B(10)
      DIMENSION P21A(4,3),P21B(4,3),P21C(4)
      DIMENSION P22A(4,6),P22B(4,6),P22C(4)
      DIMENSION Y(10)
C
      DATA PI /3.14159265358979323846D0/
      DATA P1A /0.1D0/
      DATA P4A /0.1D0/
      DATA P5A /0.1D0/
      DATA P6A /0.1D0/
      DATA P9A,P9B /-1.4251284283197609708D0,-0.80032110047197312466D0/
      DATA P17A /1.275D0/
      DATA P20A /4.D0,1.D0,8.D0,6.D0,3.D0,2.D0,5.D0,8.D0,6.D0,7.D0,
     1           4.D0,1.D0,8.D0,6.D0,7.D0,9.D0,5.D0,1.D0,2.D0,3.6D0,
     2           4.D0,1.D0,8.D0,6.D0,3.D0,2.D0,3.D0,8.D0,6.D0,7.D0,
     3           4.D0,1.D0,8.D0,6.D0,7.D0,9.D0,3.D0,1.D0,2.D0,3.6D0/
      DATA P20B /0.1D0,0.2D0,0.2D0,0.4D0,0.4D0,0.6D0,0.3D0,0.7D0,
     1    0.5D0,0.5D0/
      DATA P21A /3.D0,0.1D0,3.D0,0.1D0,
     1          10.D0,10.D0,10.D0,10.D0,
     2          30.D0,35.D0,30.D0,35.D0/
      DATA P21B /0.3689D0,0.4699D0,0.1091D0,0.03815D0,
     1           0.1170D0,0.4387D0,0.8732D0,0.5743D0,
     2           0.2673D0,0.7470D0,0.5547D0,0.8828D0/
      DATA P21C /1.D0,1.2D0,3.D0,3.2D0/
      DATA P21D /-69.D0/
      DATA P22A /10.D0,0.05D0,3.D0,17.D0,3.D0,10.D0,3.5D0,8.D0,
     1           17.D0,17.D0,1.7D0,0.05D0,3.5D0,0.1D0,10.D0,10.D0,
     2           1.7D0,8.D0,17.D0,0.1D0,8.D0,14.D0,8.D0,14.D0/
      DATA P22B /0.1312D0,0.2329D0,0.2348D0,0.4047D0,
     1           0.1696D0,0.4135D0,0.1451D0,0.8828D0,
     2           0.5569D0,0.8307D0,0.3522D0,0.8732D0,
     3           0.0124D0,0.3736D0,0.2883D0,0.5743D0,
     4           0.8283D0,0.1004D0,0.3047D0,0.1091D0,
     5           0.5886D0,0.9991D0,0.6650D0,0.0381D0/
      DATA P22C /1.D0,1.2D0,3.D0,3.2D0/
      DATA P22D /-69.D0/
      DATA P36A,P36B,P36C,P36D /10.D1,1.D0,10.D0,0.98D0/
      DATA P37A,P37B,P37C,P37D /10.D0,1.D0,10.D0,0.98D0/
C
C     PENALIZATION FUNCTION
C
      PENFUN (VAR,RAN,FACT,IEXP) = FACT*(DABS(VAR)-RAN)**IEXP
C
      GO TO (10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,
     1       160,170,180,190,200,210,220,230,240,250,260,270,280,
     2       290,300,310,320,330,340,350,360,370), NPROB
C
C    1  A FOURTH ORDER POLYNOMIAL  (N = 1)
C
   10 CONTINUE
      FUNZ = ((0.25D0*X(1)*X(1)-0.5D0)*X(1)+P1A)*X(1)
      RETURN
C
C    2  GOLDSTEIN SIXTH ORDER POLYNOMIAL  (N = 1)
C
   20 CONTINUE
      XX = X(1)*X(1)
      FUNZ = ((XX-15.D0)*XX+27.D0)*XX+250.D0
      RETURN
C
C    3  ONE-DIMENSIONAL PENALIZED SHUBERT FUNCTION  (N = 1)
C
   30 CONTINUE
      FUNZ = 0.D0
      DO 35 I = 1,5
         DI = DBLE(FLOAT(I))
         FUNZ = FUNZ+DI*DCOS((DI+1.D0)*X(1)+DI)
   35 CONTINUE
      IF (DABS(X(1)).GT.10.D0) FUNZ = FUNZ+PENFUN(X(1),10.D0,100.D0,2)
      RETURN
C
C    4  A FOURTH ORDER POLYNOMIAL IN TWO VARIABLES  (N = 2)
C
   40 CONTINUE
      XX = X(1)*X(1)
      YY = X(2)*X(2)
      FUNZ = 0.25D0*XX*XX-0.5D0*XX+P4A*X(1)+0.5D0*YY
      RETURN
C
C    5  A FUNCTION WITH A SINGLE ROW OF LOCAL MINIMA  (N = 2)
C
   50 CONTINUE
      FUNZ = 0.5D0*(P5A*X(1)*X(1)+1.D0-DCOS(2.D0*X(1)))+X(2)*X(2)
      RETURN
C
C    6  SIX-HUMP CAMEL FUNCTION  (N = 2)
C
   60 CONTINUE
      XX = X(1)*X(1)
      YY = X(2)*X(2)
      FUNZ = ((XX/3.D0-(2.D0+P6A))*XX+4.D0)*XX+X(1)*X(2)
     1    +4.D0*(YY-1.D0)*YY
      RETURN
C
C    7  TWO-DIMENSIONAL PENALIZED SHUBERT FUNCTION, BETA = 0  (N = 2)
C
   70 CONTINUE
      BETA = 0.D0
      GO TO 93
C
C    8  TWO-DIMENSIONAL PENALIZED SHUBERT FUNCTION, BETA = 1/2  (N = 2)
C
   80 CONTINUE
      BETA = 0.5D0
      GO TO 93
C
C    9  TWO-DIMENSIONAL PENALIZED SHUBERT FUNCTION, BETA = 1  (N = 2)
C
   90 CONTINUE
      BETA = 1.D0
C
   93 CONTINUE
      FUNZ = ((X(1)-P9A)**2+(X(2)-P9B)**2)*BETA
      S1 = 0.D0
      S2 = 0.D0
      DO 95 I = 1,5
         DI = DBLE(FLOAT(I))
         S1 = S1+DI*DCOS((DI+1.D0)*X(1)+DI)
         S2 = S2+DI*DCOS((DI+1.D0)*X(2)+DI)
   95 CONTINUE
      FUNZ = FUNZ+S1*S2
      IF (DABS(X(1)).GT.10.D0) FUNZ = FUNZ+PENFUN(X(1),10.D0,100.D0,2)
      IF (DABS(X(2)).GT.10.D0) FUNZ = FUNZ+PENFUN(X(2),10.D0,100.D0,2)
      RETURN
C
C   10  A FUNCTION WITH THREE ILL-CONDITIONED MINIMA, A=10  (N = 2)
C
  100 CONTINUE
      A = 1.D1
      B = 1.D-1
      GO TO 155
C
C   11  A FUNCTION WITH THREE ILL-CONDITIONED MINIMA, A=10**2  (N = 2)
C
  110 CONTINUE
      A = 1.D2
      B = 1.D-2
      GO TO 155
C
C   12  A FUNCTION WITH THREE ILL-CONDITIONED MINIMA, A=10**3  (N = 2)
C
  120 CONTINUE
      A = 1.D3
      B = 1.D-3
      GO TO 155
C
C   13  A FUNCTION WITH THREE ILL-CONDITIONED MINIMA, A=10**4  (N = 2)
C
  130 CONTINUE
      A = 1.D4
      B = 1.D-4
      GO TO 155
C
C   14  A FUNCTION WITH THREE ILL-CONDITIONED MINIMA, A=10**5  (N = 2)
C
  140 CONTINUE
      A = 1.D5
      B = 1.D-5
      GO TO 155
C
C   15  A FUNCTION WITH THREE ILL-CONDITIONED MINIMA, A=10**6  (N = 2)
C
  150 CONTINUE
      A = 1.D6
      B = 1.D-6
C
  155 CONTINUE
      XX = X(1)*X(1)
      YY = X(2)*X(2)
      R2 = XX+YY
      R4 = R2*R2
      R8 = R4*R4
      FUNZ = A*XX+YY-R4+B*R8
      RETURN
C
C   16  GOLDSTEIN-PRICE FUNCTION  (N = 2)
C
  160 CONTINUE
      U = X(1)+X(2)+1.D0
      V = 2.D0*X(1)-3.D0*X(2)
      UU = U*U
      VV = V*V
      FUNZ = (1.D0+UU*(36.D0-20.D0*U+3.D0*UU))
     1    * (30.D0+VV*(18.D0-16.D0*V+3.D0*VV))
      RETURN
C
C   17  PENALIZED BRANIN FUNCTION  (N = 2)
C
  170 CONTINUE
      FUNZ = (X(2)-P17A*(X(1)/PI)**2+(5.D0/PI)*X(1)-6.D0)**2
     1    +10.D0*(1.D0-1.D0/(8.D0*PI))*DCOS(X(1))+10.D0
      IF (DABS(X(1)-2.5D0).GT.7.5D0)
     1   FUNZ = FUNZ+PENFUN(X(1)-2.5D0,7.5D0,100.D0,2)
      IF (DABS(X(2)-7.5D0).GT.7.5D0)
     1   FUNZ = FUNZ+PENFUN(X(2)-7.5D0,7.5D0,100.D0,2)
      RETURN
C
C   18  PENALIZED SHEKEL FUNCTION, M = 5  (N = 4)
C
  180 CONTINUE
      M = 5
      GO TO 203
C
C   19  PENALIZED SHEKEL FUNCTION, M = 7  (N = 4)
C
  190 CONTINUE
      M = 7
      GO TO 203
C
C   20  PENALIZED SHEKEL FUNCTION, M = 10  (N = 4)
C
  200 CONTINUE
      M = 10
C
  203 CONTINUE
      FUNZ = 0.D0
      DO 207 I = 1,M
         S = P20B(I)
         DO 205 J = 1,N
            S = S+(X(J)-P20A(I,J))**2
  205    CONTINUE
         FUNZ = FUNZ - 1.D0/S
  207 CONTINUE
      DO 209 I = 1,N
         IF (DABS(X(I)-5.D0).GT.5.D0)
     1      FUNZ = FUNZ+PENFUN(X(I)-5.D0,5.D0,100.D0,2)
  209 CONTINUE
      RETURN
C
C   21  PENALIZED THREE-DIMENSIONAL HARTMAN FUNCTION  (N = 3)
C
  210 CONTINUE
      M = 4
      FUNZ = 0.D0
      DO 217 I = 1,M
         S = 0.D0
         DO 213 J = 1,N
            S = S-P21A(I,J)*(X(J)-P21B(I,J))**2
  213    CONTINUE
         IF (S.GE.P21D) FUNZ = FUNZ-P21C(I)*DEXP(S)
  217 CONTINUE
      GO TO 227
C
C   22  PENALIZED SIX-DIMENSIONAL HARTMAN FUNCTION  (N = 6)
C
  220 CONTINUE
      M = 4
      FUNZ = 0.D0
      DO 225 I = 1,M
         S = 0.D0
         DO 223 J = 1,N
            S = S-P22A(I,J)*(X(J)-P22B(I,J))**2
  223    CONTINUE
         IF (S.GE.P22D) FUNZ = FUNZ-P22C(I)*DEXP(S)
  225 CONTINUE
  227 CONTINUE
         DO 229 I = 1,N
         IF (DABS(X(I)-0.5D0).GT.0.5D0)
     1      FUNZ = FUNZ+PENFUN(X(I)-0.5D0,0.5D0,100.D0,2)
  229 CONTINUE
      RETURN
C
C   23  PENALIZED LEVY-MONTALVO FUNCTION, TYPE 1  (N = 2)
C
  230 CONTINUE
C
C   24  PENALIZED LEVY-MONTALVO FUNCTION, TYPE 1  (N = 3)
C
  240 CONTINUE
C
C   25  PENALIZED LEVY-MONTALVO FUNCTION, TYPE 1  (N = 4)
C
  250 CONTINUE
      DO 255 I = 1,N
         Y(I) = 1.D0+0.25D0*(X(I)-1.D0)
  255 CONTINUE
      GO TO 285
C
C   26  PENALIZED LEVY-MONTALVO FUNCTION, TYPE 2  (N = 5)
C
  260 CONTINUE
C
C   27  PENALIZED LEVY-MONTALVO FUNCTION, TYPE 2  (N = 8)
C
  270 CONTINUE
C
C   28  PENALIZED LEVY-MONTALVO FUNCTION, TYPE 2  (N = 10)
C
  280 CONTINUE
      DO 283 I = 1,N
         Y(I) = X(I)
  283 CONTINUE
C
  285 CONTINUE
      FUNZ = 10.D0*DSIN(PI*Y(1))**2+(Y(N)-1.D0)**2
      DO 287 I=2,N
         FUNZ = FUNZ+(Y(I-1)-1.D0)**2*(1.D0+10.D0*DSIN(PI*Y(I))**2)
  287 CONTINUE
      FUNZ = FUNZ*PI/DBLE(FLOAT(N))
      RANGE = 10.D0
      GO TO 347
C
C   29  PENALIZED LEVY-MONTALVO FUNCTION, TYPE 3, RANGE = 10   (N = 2)
C
  290 CONTINUE
C
C   30  PENALIZED LEVY-MONTALVO FUNCTION, TYPE 3, RANGE = 10   (N = 3)
C
  300 CONTINUE
C
C   31  PENALIZED LEVY-MONTALVO FUNCTION, TYPE 3, RANGE = 10   (N = 4)
C
  310 CONTINUE
      RANGE = 10.D0
      GO TO 342
C
C   32  PENALIZED LEVY-MONTALVO FUNCTION, TYPE 3, RANGE = 5   (N = 5)
C
  320 CONTINUE
C
C   33  PENALIZED LEVY-MONTALVO FUNCTION, TYPE 3, RANGE = 5   (N = 6)
C
  330 CONTINUE
C
C   34  PENALIZED LEVY-MONTALVO FUNCTION, TYPE 3, RANGE = 5  (N = 7)
C
  340 CONTINUE
      RANGE = 5.D0
  342 CONTINUE
      FUNZ = DSIN(3.D0*PI*X(1))**2
     1   +(X(N)-1.D0)**2*(1.D0+DSIN(2.D0*PI*X(N))**2)
      DO 345 I=2,N
         FUNZ = FUNZ+(X(I-1)-1.D0)**2*(1.D0+DSIN(3.D0*PI*X(I))**2)
  345 CONTINUE
      FUNZ = FUNZ*0.1D0
  347 CONTINUE
      DO 349 I = 1,N
         IF (DABS(X(I)).GT.RANGE)
     1      FUNZ = FUNZ+PENFUN(X(I),RANGE,100.D0,4)
  349 CONTINUE
      RETURN
C
C   35  A FUNCTION WITH A SINGLE CUSP-SHAPED MINIMUM  (N = 5)
C
  350 CONTINUE
      FUNZ = 0.D0
      DO 355 I = 1,N
         FUNZ = FUNZ+DBLE(FLOAT(I))*X(I)*X(I)
  355 CONTINUE
      FUNZ = DSQRT(DSQRT(FUNZ))
      RETURN
C
C   36  A FUNCTION WITH A SMALL-ATTRACTION-REGION GLOBAL MINIMUM (N = 2)
C
  360 CONTINUE
      RG = P36A
      RP = P36B
      H = P36C
      PUND = P36D
      GOTO 373
C
C   37  A FUNCTION WITH A SMALL-ATTRACTION-REGION GLOBAL MINIMUM (N = 5)
C
  370 CONTINUE
      RG = P37A
      RP = P37B
      H = P37C
      PUND = P37D
  373 CONTINUE
      S = 0.D0
      DO 377 I = 2,N
         S = S+X(I)*X(I)
  377 CONTINUE
      FUNZ = S+X(1)*X(1)
      S = S+(X(1)-RG)**2
      IF (S.LT.RP*RP*PUND) FUNZ = FUNZ-(RG*RG+H)*DEXP(-S/(RP*RP-S))
      RETURN
C
      END
      SUBROUTINE GLOMIP (NPROB, N, X0, XMIN, XMAX)
C
C     THE SUBROUTINE  GLOMIP  PROVIDES THE CODING FOR THE NUMBER
C     OF VARIABLES, THE INITIAL POINT, AND THE OBSERVATION REGION
C     TO BE USED, TOGETHER WITH THE 37 TEST FUNCTIONS GIVEN BY
C     SUBROUTINE  GLOMTF , TO DEFINE 37 TEST PROBLEMS FOR GLOBAL
C     MINIMIZATION SOFTWARE.
C
C     THE SUBROUTINE  GLOMIP  RETURNS IN  N , X0 , AND  XMIN ,
C     XMAX  THE NUMBER OF VARIABLES, THE INITIAL POINT, AND THE
C     BOUNDARIES OF THE OBSERVATION REGION.
C
C     CALLING STATMENT
C        CALL GLOMIP (NPROB, N, X0, XMIN, XMAX)
C
C     DESCRIPTION OF THE CALL PARAMETERS
C        (THE FORTRAN IMPLICIT TYPE DEFINITION FOR INTEGERS IS USED.
C        ALL NON-INTEGER PARAMETERS ARE DOUBLE-PRECISION).
C
C     NPROB   IS THE (INPUT) NUMBER OF THE TEST PROBLEM TO BE
C             CONSIDERED
C     N       IS THE (OUTPUT) NUMBER OF VARIABLES (DIMENSION) OF
C             THE PROBLEM
C     XMIN , XMAX   ARE THE (OUTPUT) N-VECTORS CONTAINING THE LEFT
C             AND RIGHT BOUNDARIES OF THE OBSERVATION REGION
C             DEFINED BY THE POINTS  X = (X1,...,XN)  SUCH THAT
C                XMIN(I) .LE. X(I) .LE. XMAX(I),  I = 1,...,N
C
      DOUBLE PRECISION X0,XMIN,XMAX
      DOUBLE PRECISION V0,VMIN,VMAX
C
      DIMENSION X0(1),XMIN(1),XMAX(1)
C
      GO TO (10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,
     1       160,170,180,190,200,210,220,230,240,250,260,270,280,
     2       290,300,310,320,330,340,350,360,370),NPROB
C
C    1  A FOURTH-ORDER POLYNOMIAL  (N = 1)
C
   10 CONTINUE
      N = 1
      V0 = 1.0D0
      VMIN = -10.D0
      VMAX = 10.D0
      GO TO 800
C
C    2  GOLDSTEIN SIXTH ORDER POLYNOMIAL  (N = 1)
C
   20 CONTINUE
      N = 1
      V0 = 0.D0
      VMIN = -4.D0
      VMAX = 4.D0
      GOTO 800
C
C    3  ONE-DIMENSIONAL PENALIZED SHUBERT FUNCTION  (N = 1)
C
   30 CONTINUE
      N = 1
      V0 = 0.D0
      VMIN = -10.D0
      VMAX = 10.D0
      GOTO 800
C
C    4  A FOURTH ORDER POLYNOMIAL IN THO VARIABLES  (N = 2)
C
   40 CONTINUE
      N = 2
      X0(1) = 1.D0
      X0(2) = 0.D0
      VMIN = -10.D0
      VMAX = 10.D0
      GO TO 700
C
C    5  A FUNCTION WITH A SINGLE ROW OF LOCAL MINIMA  (N = 2)
C
   50 CONTINUE
      N = 2
      X0(1) = -3.D0
      X0(2) = 0.D0
      XMIN(1) = -15.D0
      XMAX(1) = 25.D0
      XMIN(2) = -5.D0
      XMAX(2) = 15.D0
      RETURN
C
C    6  SIX-HUMP CAMEL FUNCTION  (N = 2)
C
   60 CONTINUE
      N = 2
      V0 = 0.D0
      XMIN(1) = -3.D0
      XMAX(1) = 3.D0
      XMIN(2) = -2.D0
      XMAX(2) = 2.D0
      GO TO 900
C
C    7  TWO-DIMENSIONAL PENALIZED SHUBERT FUNCTION, BETA = 0  (N = 2)
C
   70 CONTINUE
C
C    8  TWO-DIMENSIONAL PENALIZED SHUBERT FUNCTION, BETA = 1/2  (N = 2)
C
   80 CONTINUE
C
C    9  TWO-DIMENSIONAL PENALIZED SHUBERT FUNCTION, BETA = 1  (N = 2)
C
   90 CONTINUE
      N = 2
      V0 = 0.D0
      VMIN = -10.D0
      VMAX = 10.D0
      GO TO 800
C
C   10  A FUNCTION WITH THREE ILL-CONDITIONED MINIMA, A=10  (N = 2)
C
  100 CONTINUE
C
C   11  A FUNCTION WITH THREE ILL-CONDITIONED MINIMA, A=10**2  (N = 2)
C
  110 CONTINUE
C
C   12  A FUNCTION WITH THREE ILL-CONDITIONED MINIMA, A=10**3  (N = 2)
C
  120 CONTINUE
C
C   13  A FUNCTION WITH THREE ILL-CONDITIONED MINIMA, A=10**4  (N = 2)
C
  130 CONTINUE
C
C   14  A FUNCTION WITH THREE ILL-CONDITIONED MINIMA, A=10**5  (N = 2)
C
  140 CONTINUE
C
C   15  A FUNCTION WITH THREE ILL-CONDITIONED MINIMA, A=10**6  (N = 2)
C
  150 CONTINUE
      N = 2
      X0(1) = 0.D0
      X0(2) = 0.D0
      XMIN(1) = -10.D0
      XMAX(1) = 10.D0
      XMIN(2) = -100.D0
      XMAX(2) = 100.D0
      RETURN
C
C   16  GOLDSTEIN-PRICE FUNCTION  (N = 2)
C
  160 CONTINUE
      N = 2
      V0 = 1.D0
      VMIN = -2.D0
      VMAX = 2.D0
      GO TO 800
C
C   17  PENALIZED BRANIN FUNCTION  (N = 2)
C
  170 CONTINUE
      N = 2
      X0(1) = 2.5D0
      X0(2) = 7.5D0
      XMIN(1) = -5.D0
      XMAX(1) = 10.D0
      XMIN(2) = 0.D0
      XMAX(2) = 15.D0
      RETURN
C
C   18  PENALIZED SHEKEL FUNCTION, M = 5  (N = 4)
C
  180 CONTINUE
C
C   19  PENALIZED SHEKEL FUNCTION, M = 7  (N = 4)
C
  190 CONTINUE
C
C   20  PENALIZED SHEKEL FUNCTION, M = 10  (N = 4)
C
  200 CONTINUE
      N = 4
      V0 = 9.D0
      VMIN = 0.D0
      VMAX = 10.D0
      GO TO 800
C
C   21  PENALIZED THREE-DIMENSIONAL HARTMAN FUNCTION  (N = 3)
C
  210 CONTINUE
      N = 3
      GO TO 225
C
C   22  PENALIZED SIX-DIMENSIONAL HARTMAN FUNCTION  (N = 6)
C
  220 CONTINUE
      N = 6
  225 CONTINUE
      V0 = 0.5D0
      VMIN = 0.D0
      VMAX = 1.D0
      GO TO 800
C
C   23  PENALIZED LEVY-MONTALVO FUNCTION, TYPE 1  (N = 2)
C
  230 CONTINUE
      N = 2
      GO TO 315
C
C   24  PENALIZED LEVY-MONTALVO FUNCTION, TYPE 1  (N = 3)
C
  240 CONTINUE
      N = 3
      GO TO 315
C
C   25  PENALIZED LEVY-MONTALVO FUNCTION, TYPE 1  (N = 4)
C
  250 CONTINUE
      N = 4
      GO TO 315
C
C   26  PENALIZED LEVY-MONTALVO FUNCTION, TYPE 2  (N = 5)
C
  260 CONTINUE
      N = 5
      GO TO 315
C
C   27  PENALIZED LEVY-MONTALVO FUNCTION, TYPE 2  (N = 8)
C
  270 CONTINUE
      N = 8
      GO TO 315
C
C   28  PENALIZED LEVY-MONTALVO FUNCTION, TYPE 2  (N = 10)
C
  280 CONTINUE
      N = 10
      GO TO 315
C
C   29  PENALIZED LEVY-MONTALVO FUNCTION, TYPE 3, RANGE = 10   (N = 2)
C
  290 CONTINUE
      N = 2
      GO TO 315
C
C   30  PENALIZED LEVY-MONTALVO FUNCTION, TYPE 3, RANGE = 10   (N = 3)
C
  300 CONTINUE
      N = 3
      GO TO 315
C
C   31  PENALIZED LEVY-MONTALVO FUNCTION, TYPE 3, RANGE = 10   (N = 4)
C
  310 CONTINUE
      N = 4
C
  315 CONTINUE
      V0 = 0.D0
      VMIN = -10.D0
      VMAX = 10.D0
      GO TO 800
C
C   32  PENALIZED LEVY-MONTALVO FUNCTION, TYPE 3, RANGE = 5   (N = 5)
C
  320 CONTINUE
      N = 5
      GO TO 345
C
C   33  PENALIZED LEVY-MONTALVO FUNCTION, TYPE 3, RANGE = 5   (N = 6)
C
  330 CONTINUE
      N = 6
      GO TO 345
C
C   34  PENALIZED LEVY-MONTALVO FUNCTION, TYPE 3, RANGE = 5  (N = 7)
C
  340 CONTINUE
      N = 7
C
  345 CONTINUE
      V0 = 0.D0
      VMIN = -5.D0
      VMAX = 5.D0
      GO TO 800
C
C   35  A FUNCTION WITH A SINGLE CUSP-SHAPED MINIMUM  (N = 5)
C
  350 CONTINUE
      N = 5
      V0 = 1000.D0
      VMIN = -20000.D0
      VMAX = 10000.D0
      GO TO 800
C
C   36  A FUNCTION WITH A SMALL-ATTRACTION-REGION GLOBAL MINIMUM (N = 2)
C
  360 CONTINUE
      N = 2
      X0(1) = 0.D0
      X0(2) = 100.D0
      VMIN = -1000.D0
      VMAX = 1000.D0
      GO TO 700
C
C   37  A FUNCTION WITH A SMALL-ATTRACTION-REGION GLOBAL MINIMUM (N = 5)
C
  370 CONTINUE
      N = 5
      X0(1) = 0.D0
      X0(2) = 0.D0
      X0(3) = 0.D0
      X0(4) = 0.D0
      X0(5) = 10.D0
      VMIN = -100.D0
      VMAX = 100.D0
      GO TO 700
C
  700 CONTINUE
      DO 710 I = 1,N
         XMIN(I) = VMIN
         XMAX(I) = VMAX
  710 CONTINUE
      RETURN
C
  800 CONTINUE
      DO 810 I = 1,N
         XMIN(I) = VMIN
         XMAX(I) = VMAX
  810 CONTINUE
C
  900 CONTINUE
      DO 910 I = 1,N
         X0(I) = V0
  910 CONTINUE
      RETURN
      END
      SUBROUTINE PTSEG(N,XPFMIN,FPFMIN,FPFMAX,KP,NFEV)
C
C  SAMPLE VERSION OF THE OUTPUT SUBROUTINE  PTSEG
C  (PERFORMS END-OF-SEGMENT OUTPUT)
C  WHICH MUST BY SUPPLIED BY THE USER AND WHICH IS DESCRIBED IN
C  DETAIL WITHIN THE SUBROUTINE  SIGMA.
C
      DOUBLE PRECISION XPFMIN,FPFMIN,FPFMAX
      DIMENSION XPFMIN(N)
C
      WRITE(6,100)KP,NFEV,FPFMIN,FPFMAX
 100  FORMAT(1X,24HOBSERVATION PERIOD  KP= ,I4,
     1    32H,   FUNCTION EVALUATIONS  NFEV= ,I7/
     2    2X,33HFINAL BEST, WORST FUNCT. VALUES  ,
     3    8HFPFMIN= ,G13.5,11H,  FPFMAX= ,G13.5)
      WRITE(6,200)XPFMIN
 200  FORMAT(2X,24HBEST FINAL POINT  XPFMIN/(1X,6G13.5))
C
C
      RETURN
      END
      SUBROUTINE PTRIAL ( N, XOPT, FOPT,
     1                    FTFMIN, FTFMAX, FTFOPT,
     2                    ISTOP, ISTOPT, NFEV, KP, IPRINT )
C
C  SAMPLE VERSION OF THE OUTPUT SUBROUTINE  PTRIAL
C  (PERFORMS END-OF-TRIAL OUTPUT)
C  WHICH MUST BY SUPPLIED BY THE USER AND WHICH IS DESCRIBED IN
C  DETAIL WITHIN THE SUBROUTINE  SIGMA.
C
      DOUBLE PRECISION XOPT,FTFMIN,FTFMAX,FTFOPT,FOPT
      DIMENSION XOPT(N)
C
      WRITE(6,100)
 100  FORMAT(//16H END OF A TRIAL )
      IF(IPRINT.EQ.0)WRITE(6,200)KP,NFEV,FTFMIN,FTFMAX
 200  FORMAT(2X,24HOBSERVATION PERIOD  KP= ,I4,
     1    32H,   FUNCTION EVALUATIONS  NFEV= ,I7/
     2    2X,33HFINAL BEST, WORST FUNCT. VALUES  ,
     3    8HFTFMIN= ,G13.5,11H,  FTFMAX= ,G13.5)
      WRITE(6,300)ISTOP,ISTOPT,FTFOPT,FOPT
 300  FORMAT(/2X,29HTRIAL STOP INDICATOR  ISTOP= ,I2,
     1    34H,   PAST STOPS INDICATOR  ISTOPT= ,I2/
     2    2X,43HEND-OF-TRIAL BEST FUNCTION VALUE   FTFOPT= ,G14.6/
     3    2X,43HBEST CURRENT MINIMUM FUNCTION VALUE  FOPT= ,G14.6)
      WRITE(6,400)XOPT
 400  FORMAT(2X,29HBEST CURRENT MINIMIZER   XOPT/(1X,6G13.5))
C
C
      RETURN
      END
      SUBROUTINE PTKSUC(KSUC)
C
C  SAMPLE VERSION OF THE OUTPUT SUBROUTINE  PTKSUC
C  (PERFORMS END-OF-TRIAL OUTPUT RELATED TO THE COUNT OF
C    SUCCESSFUL TRIALS)
C  WHICH MUST BY SUPPLIED BY THE USER AND WHICH IS DESCRIBED IN
C  DETAIL WITHIN THE SUBROUTINE  SIGMA.
C
      WRITE(6,100)KSUC,KSUC
 100  FORMAT(///1X,
     1    50HTHE CURRENT COUNT  KSUC  OF SUCCESSFUL TRIALS HAS ,
     2    21HREACHED FOR THE FIRST/2X,15HTIME THE VALUE ,I2,
     3    53H (IF THE REQUESTED COUNT  NSUC  OF SUCCESSFUL TRIALS /
     4    2X,25HHAD BEEN GIVEN THE VALUE ,I2,21H THE ALGORITHM WOULD ,
     5    18HHAVE STOPPED HERE)///)
C
C
      RETURN
      END
