| [2403] | 1 | *
 | 
|---|
 | 2 | * $Id: mngrad.F,v 1.1.1.1 2003-06-11 14:18:27 cmv Exp $
 | 
|---|
 | 3 | *
 | 
|---|
 | 4 | * $Log: not supported by cvs2svn $
 | 
|---|
 | 5 | * Revision 1.1.1.1  1996/03/07 14:31:29  mclareni
 | 
|---|
 | 6 | * Minuit
 | 
|---|
 | 7 | *
 | 
|---|
 | 8 | *
 | 
|---|
 | 9 | #include "minuit/pilot.h"
 | 
|---|
 | 10 |       SUBROUTINE MNGRAD(FCN,FUTIL)
 | 
|---|
 | 11 | #include "minuit/d506dp.inc"
 | 
|---|
 | 12 | CC       Called from MNSET
 | 
|---|
 | 13 | CC       Interprets the SET GRAD command, which informs MINUIT whether
 | 
|---|
 | 14 | CC       the first derivatives of FCN will be calculated by the user
 | 
|---|
 | 15 | CC       inside FCN.  It can check the user's derivative calculation
 | 
|---|
 | 16 | CC       by comparing it with a finite difference approximation.
 | 
|---|
 | 17 | CC
 | 
|---|
 | 18 | #include "minuit/d506cm.inc"
 | 
|---|
 | 19 | C
 | 
|---|
 | 20 |       EXTERNAL FCN,FUTIL
 | 
|---|
 | 21 |       CHARACTER*4 CGOOD,CBAD,CNONE,CWD
 | 
|---|
 | 22 |       LOGICAL LNONE
 | 
|---|
 | 23 |       DIMENSION GF(MNI)
 | 
|---|
 | 24 |       PARAMETER (CGOOD='GOOD',CBAD=' BAD',CNONE='NONE')
 | 
|---|
 | 25 | C
 | 
|---|
 | 26 |       ISW(3) = 1
 | 
|---|
 | 27 |       NPARX = NPAR
 | 
|---|
 | 28 |       IF (WORD7(1) .GT. ZERO)  GO TO 2000
 | 
|---|
 | 29 | C                  get user-calculated first derivatives from FCN
 | 
|---|
 | 30 |       DO 30 I= 1, NU
 | 
|---|
 | 31 |    30 GIN(I) = UNDEFI
 | 
|---|
 | 32 |       CALL MNINEX(X)
 | 
|---|
 | 33 |       CALL FCN(NPARX,GIN,FZERO,U,2,FUTIL)
 | 
|---|
 | 34 |       NFCN = NFCN + 1
 | 
|---|
 | 35 |       CALL MNDERI(FCN,FUTIL)
 | 
|---|
 | 36 |       DO 40 I= 1, NPAR
 | 
|---|
 | 37 |    40 GF(I) = GRD(I)
 | 
|---|
 | 38 | C                    get MINUIT-calculated first derivatives
 | 
|---|
 | 39 |       ISW(3) = 0
 | 
|---|
 | 40 |       ISTSAV = ISTRAT
 | 
|---|
 | 41 |       ISTRAT = 2
 | 
|---|
 | 42 |       CALL MNHES1(FCN,FUTIL)
 | 
|---|
 | 43 |       ISTRAT = ISTSAV
 | 
|---|
 | 44 |       WRITE (ISYSWR,51)
 | 
|---|
 | 45 |    51 FORMAT(/' CHECK OF GRADIENT CALCULATION IN FCN'/12X,'PARAMETER',
 | 
|---|
 | 46 |      + 6X,9HG(IN FCN) ,3X,9HG(MINUIT) ,2X,'DG(MINUIT)',3X,9HAGREEMENT)
 | 
|---|
 | 47 |       ISW(3) = 1
 | 
|---|
 | 48 |       LNONE = .FALSE.
 | 
|---|
 | 49 |       DO 100 LC = 1, NPAR
 | 
|---|
 | 50 |       I = NEXOFI(LC)
 | 
|---|
 | 51 |       CWD = CGOOD
 | 
|---|
 | 52 |       ERR = DGRD(LC)
 | 
|---|
 | 53 |       IF (ABS(GF(LC)-GRD(LC)) .GT. ERR)  CWD = CBAD
 | 
|---|
 | 54 |       IF (GIN(I) .EQ. UNDEFI)  THEN
 | 
|---|
 | 55 |           CWD = CNONE
 | 
|---|
 | 56 |           LNONE = .TRUE.
 | 
|---|
 | 57 |           GF(LC) = 0.
 | 
|---|
 | 58 |           ENDIF
 | 
|---|
 | 59 |       IF (CWD .NE. CGOOD)  ISW(3) = 0
 | 
|---|
 | 60 |       WRITE (ISYSWR,99) I,CPNAM(I),GF(LC),GRD(LC),ERR,CWD
 | 
|---|
 | 61 |    99 FORMAT (7X,I5,2X ,A10,3E12.4,4X ,A4)
 | 
|---|
 | 62 |   100 CONTINUE
 | 
|---|
 | 63 |       IF (LNONE) WRITE (ISYSWR,'(A)')
 | 
|---|
 | 64 |      +  '  AGREEMENT=NONE  MEANS FCN DID NOT CALCULATE THE DERIVATIVE'
 | 
|---|
 | 65 |       IF (ISW(3) .EQ. 0)  WRITE (ISYSWR,1003)
 | 
|---|
 | 66 |  1003 FORMAT(/' MINUIT DOES NOT ACCEPT DERIVATIVE CALCULATIONS BY FCN'/
 | 
|---|
 | 67 |      + ' TO FORCE ACCEPTANCE, ENTER "SET GRAD    1"'/)
 | 
|---|
 | 68 | C
 | 
|---|
 | 69 |  2000 CONTINUE
 | 
|---|
 | 70 |       RETURN
 | 
|---|
 | 71 |       END
 | 
|---|