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