| 1 | *
 | 
|---|
| 2 | * $Id: mnhes1.F,v 1.1.1.1 2003-06-11 14:18:28 cmv Exp $
 | 
|---|
| 3 | *
 | 
|---|
| 4 | * $Log: not supported by cvs2svn $
 | 
|---|
| 5 | * Revision 1.1.1.1  1996/03/07 14:31:30  mclareni
 | 
|---|
| 6 | * Minuit
 | 
|---|
| 7 | *
 | 
|---|
| 8 | *
 | 
|---|
| 9 | #include "minuit/pilot.h"
 | 
|---|
| 10 |       SUBROUTINE MNHES1(FCN,FUTIL)
 | 
|---|
| 11 | #include "minuit/d506dp.inc"
 | 
|---|
| 12 | CC      Called from MNHESS and MNGRAD
 | 
|---|
| 13 | CC      Calculate first derivatives (GRD) and uncertainties (DGRD)
 | 
|---|
| 14 | CC         and appropriate step sizes GSTEP
 | 
|---|
| 15 | #include "minuit/d506cm.inc"
 | 
|---|
| 16 |       EXTERNAL FCN,FUTIL
 | 
|---|
| 17 |       LOGICAL LDEBUG
 | 
|---|
| 18 |       CHARACTER CBF1*22
 | 
|---|
| 19 |       LDEBUG = (IDBG(5) .GE. 1)
 | 
|---|
| 20 |       IF (ISTRAT .LE. 0) NCYC = 1
 | 
|---|
| 21 |       IF (ISTRAT .EQ. 1) NCYC = 2
 | 
|---|
| 22 |       IF (ISTRAT .GT. 1) NCYC = 6
 | 
|---|
| 23 |       IDRV = 1
 | 
|---|
| 24 |       NPARX = NPAR
 | 
|---|
| 25 |       DFMIN = 4.*EPSMA2*(ABS(AMIN)+UP)
 | 
|---|
| 26 | C                                     main loop over parameters
 | 
|---|
| 27 |       DO 100 I= 1, NPAR
 | 
|---|
| 28 |       XTF = X(I)
 | 
|---|
| 29 |       DMIN = 4.*EPSMA2*ABS(XTF)
 | 
|---|
| 30 |       EPSPRI = EPSMA2 + ABS(GRD(I)*EPSMA2)
 | 
|---|
| 31 |       OPTSTP = SQRT(DFMIN/(ABS(G2(I))+EPSPRI))
 | 
|---|
| 32 |       D = 0.2 * ABS(GSTEP(I))
 | 
|---|
| 33 |       IF (D .GT. OPTSTP)  D = OPTSTP
 | 
|---|
| 34 |       IF (D .LT. DMIN)  D = DMIN
 | 
|---|
| 35 |       CHGOLD = 10000.
 | 
|---|
| 36 | C                                       iterate reducing step size
 | 
|---|
| 37 |       DO 50 ICYC= 1, NCYC
 | 
|---|
| 38 |       X(I) = XTF + D
 | 
|---|
| 39 |       CALL MNINEX(X)
 | 
|---|
| 40 |       CALL FCN(NPARX,GIN,FS1,U,4,FUTIL)
 | 
|---|
| 41 |       NFCN = NFCN + 1
 | 
|---|
| 42 |       X(I) = XTF - D
 | 
|---|
| 43 |       CALL MNINEX(X)
 | 
|---|
| 44 |       CALL FCN(NPARX,GIN,FS2,U,4,FUTIL)
 | 
|---|
| 45 |       NFCN = NFCN + 1
 | 
|---|
| 46 |       X(I) = XTF
 | 
|---|
| 47 | C                                       check if step sizes appropriate
 | 
|---|
| 48 |       SAG = 0.5*(FS1+FS2-2.0*AMIN)
 | 
|---|
| 49 |       GRDOLD = GRD(I)
 | 
|---|
| 50 |       GRDNEW = (FS1-FS2)/(2.0*D)
 | 
|---|
| 51 |       DGMIN = EPSMAC*(ABS(FS1)+ABS(FS2))/D
 | 
|---|
| 52 |       IF (LDEBUG) WRITE (ISYSWR,11) I,IDRV,GSTEP(I),D,G2(I),GRDNEW,SAG
 | 
|---|
| 53 |    11 FORMAT (I4,I2,6G12.5)
 | 
|---|
| 54 |       IF (GRDNEW .EQ. ZERO)  GO TO 60
 | 
|---|
| 55 |       CHANGE = ABS((GRDOLD-GRDNEW)/GRDNEW)
 | 
|---|
| 56 |       IF (CHANGE.GT.CHGOLD .AND. ICYC.GT.1)  GO TO 60
 | 
|---|
| 57 |       CHGOLD = CHANGE
 | 
|---|
| 58 |       GRD(I) = GRDNEW
 | 
|---|
| 59 |       GSTEP(I) = SIGN(D,GSTEP(I))
 | 
|---|
| 60 | C                  decrease step until first derivative changes by <5%
 | 
|---|
| 61 |       IF (CHANGE .LT. 0.05) GO TO 60
 | 
|---|
| 62 |       IF (ABS(GRDOLD-GRDNEW) .LT. DGMIN)  GO TO 60
 | 
|---|
| 63 |       IF (D .LT. DMIN)  THEN
 | 
|---|
| 64 |          CALL MNWARN('D','MNHES1','Step size too small for 1st drv.')
 | 
|---|
| 65 |          GO TO 60
 | 
|---|
| 66 |       ENDIF
 | 
|---|
| 67 |       D = 0.2*D
 | 
|---|
| 68 |    50 CONTINUE
 | 
|---|
| 69 | C                                       loop satisfied = too many iter
 | 
|---|
| 70 |       WRITE (CBF1,'(2G11.3)') GRDOLD,GRDNEW
 | 
|---|
| 71 |       CALL MNWARN('D','MNHES1','Too many iterations on D1.'//CBF1)
 | 
|---|
| 72 |    60 CONTINUE
 | 
|---|
| 73 |       DGRD(I) = MAX(DGMIN,ABS(GRDOLD-GRDNEW))
 | 
|---|
| 74 |   100 CONTINUE
 | 
|---|
| 75 | C                                        end of first deriv. loop
 | 
|---|
| 76 |       CALL MNINEX(X)
 | 
|---|
| 77 |       RETURN
 | 
|---|
| 78 |       END
 | 
|---|