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
|
---|