source: Sophya/trunk/SophyaExt/CodeMinuit/code/mnhes1.F

Last change on this file was 2403, checked in by cmv, 22 years ago

Creation du module de code source de MINUIT (CERNLIB) extrait par CMV

cmv 11/06/2003

File size: 2.5 KB
Line 
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"
12CC Called from MNHESS and MNGRAD
13CC Calculate first derivatives (GRD) and uncertainties (DGRD)
14CC 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)
26C 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.
36C 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
47C 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))
60C 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
69C 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
75C end of first deriv. loop
76 CALL MNINEX(X)
77 RETURN
78 END
Note: See TracBrowser for help on using the repository browser.