source: Sophya/trunk/SophyaExt/CodeMinuit/code/mnpsdf.F@ 3586

Last change on this file since 3586 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.