source: Sophya/trunk/SophyaExt/CodeMinuit/code/mnpsdf.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: 3.0 KB
Line 
1*
2* $Id: mnpsdf.F,v 1.1.1.1 2003-06-11 14:18:29 cmv Exp $
3*
4* $Log: not supported by cvs2svn $
5* Revision 1.2 1996/03/15 18:02:50 james
6* Modified Files:
7* mnderi.F eliminate possible division by zero
8* mnexcm.F suppress print on STOP when print flag=-1
9* set FVAL3 to flag if FCN already called with IFLAG=3
10* mninit.F set version 96.03
11* mnlims.F remove arguments, not needed
12* mnmigr.F VLEN -> LENV in debug print statement
13* mnparm.F move call to MNRSET to after NPAR redefined, to zero all
14* mnpsdf.F eliminate possible division by zero
15* mnscan.F suppress printout when print flag =-1
16* mnset.F remove arguments in call to MNLIMS
17* mnsimp.F fix CSTATU so status is PROGRESS only if new minimum
18* mnvert.F eliminate possible division by zero
19*
20* Revision 1.1.1.1 1996/03/07 14:31:31 mclareni
21* Minuit
22*
23*
24#include "minuit/pilot.h"
25 SUBROUTINE MNPSDF
26#include "minuit/d506dp.inc"
27CC calculates the eigenvalues of v to see if positive-def.
28CC if not, adds constant along diagonal to make positive.
29#include "minuit/d506cm.inc"
30 CHARACTER CHBUFF*12
31 DIMENSION S(MNI)
32 EPSMIN = 1.0E-6
33 EPSPDF = MAX(EPSMIN, EPSMA2)
34 DGMIN = VHMAT(1)
35C Check if negative or zero on diagonal
36 DO 200 I= 1, NPAR
37 NDEX = I*(I+1)/2
38 IF (VHMAT(NDEX) .LE. ZERO) THEN
39 WRITE (CHBUFF(1:3),'(I3)') I
40 CALL MNWARN('W',CFROM,
41 +'Negative diagonal element'//CHBUFF(1:3)//' in Error Matrix')
42 ENDIF
43 IF (VHMAT(NDEX) .LT. DGMIN) DGMIN = VHMAT(NDEX)
44 200 CONTINUE
45 IF (DGMIN .LE. ZERO) THEN
46 DG = (ONE+EPSPDF) - DGMIN
47 WRITE (CHBUFF,'(E12.2)') DG
48 CALL MNWARN('W',CFROM,
49 + CHBUFF//' added to diagonal of error matrix')
50 ELSE
51 DG = ZERO
52 ENDIF
53C Store VHMAT in P, make sure diagonal pos.
54 DO 213 I= 1, NPAR
55 NDEX = I*(I-1)/2
56 NDEXD = NDEX + I
57 VHMAT(NDEXD) = VHMAT(NDEXD) + DG
58 IF (VHMAT(NDEXD) .LE. ZERO) VHMAT(NDEXD) = 1.0
59 S(I) = 1.0/SQRT(VHMAT(NDEXD))
60 DO 213 J= 1, I
61 NDEX = NDEX + 1
62 213 P(I,J) = VHMAT(NDEX) * S(I)*S(J)
63C call eigen (p,p,maxint,npar,pstar,-npar)
64 CALL MNEIG(P,MAXINT,NPAR,MAXINT,PSTAR,EPSPDF,IFAULT)
65 PMIN = PSTAR(1)
66 PMAX = PSTAR(1)
67 DO 215 IP= 2, NPAR
68 IF (PSTAR(IP) .LT. PMIN) PMIN = PSTAR(IP)
69 IF (PSTAR(IP) .GT. PMAX) PMAX = PSTAR(IP)
70 215 CONTINUE
71 PMAX = MAX(ABS(PMAX), ONE)
72 IF ((PMIN .LE. ZERO .AND. LWARN) .OR. ISW(5) .GE. 2) THEN
73 WRITE (ISYSWR,550)
74 WRITE (ISYSWR,551) (PSTAR(IP),IP=1,NPAR)
75 ENDIF
76 IF (PMIN .GT. EPSPDF*PMAX) GO TO 217
77 IF (ISW(2) .EQ. 3) ISW(2)=2
78 PADD = 1.0E-3*PMAX - PMIN
79 DO 216 IP= 1, NPAR
80 NDEX = IP*(IP+1)/2
81 216 VHMAT(NDEX) = VHMAT(NDEX) *(1.0 + PADD)
82 CSTATU= 'NOT POSDEF'
83 WRITE (CHBUFF,'(G12.5)') PADD
84 CALL MNWARN('W',CFROM,
85 + 'MATRIX FORCED POS-DEF BY ADDING '//CHBUFF//' TO DIAGONAL.')
86 217 CONTINUE
87C
88 550 FORMAT (' EIGENVALUES OF SECOND-DERIVATIVE MATRIX:' )
89 551 FORMAT (7X,6E12.4)
90 RETURN
91 END
Note: See TracBrowser for help on using the repository browser.