1 | *
|
---|
2 | * $Id: mnvert.F,v 1.1.1.1 2003-06-11 14:18:30 cmv Exp $
|
---|
3 | *
|
---|
4 | * $Log: not supported by cvs2svn $
|
---|
5 | * Revision 1.2 1996/03/15 18:02:54 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:32 mclareni
|
---|
21 | * Minuit
|
---|
22 | *
|
---|
23 | *
|
---|
24 | #include "minuit/pilot.h"
|
---|
25 | SUBROUTINE MNVERT(A,L,M,N,IFAIL)
|
---|
26 | #include "minuit/d506dp.inc"
|
---|
27 | CC inverts a symmetric matrix. matrix is first scaled to
|
---|
28 | CC have all ones on the diagonal (equivalent to change of units)
|
---|
29 | CC but no pivoting is done since matrix is positive-definite.
|
---|
30 | CC
|
---|
31 | #include "minuit/d506cm.inc"
|
---|
32 | DIMENSION A(L,M) ,PP(MNI), Q(MNI), S(MNI)
|
---|
33 | IFAIL=0
|
---|
34 | IF (N .LT. 1) GO TO 100
|
---|
35 | IF (N .GT. MAXINT) GO TO 100
|
---|
36 | C scale matrix by sqrt of diag elements
|
---|
37 | DO 8 I=1,N
|
---|
38 | SI = A(I,I)
|
---|
39 | IF (SI) 100,100,8
|
---|
40 | 8 S(I) = 1.0/SQRT(SI)
|
---|
41 | DO 20 I= 1, N
|
---|
42 | DO 20 J= 1, N
|
---|
43 | 20 A(I,J) = A(I,J) *S(I)*S(J)
|
---|
44 | C . . . start main loop . . . .
|
---|
45 | DO 65 I=1,N
|
---|
46 | K = I
|
---|
47 | C preparation for elimination step1
|
---|
48 | IF (A(K,K) .EQ. ZERO) GO TO 100
|
---|
49 | Q(K)=1./A(K,K)
|
---|
50 | PP(K) = 1.0
|
---|
51 | A(K,K)=0.0
|
---|
52 | KP1=K+1
|
---|
53 | KM1=K-1
|
---|
54 | IF(KM1)100,50,40
|
---|
55 | 40 DO 49 J=1,KM1
|
---|
56 | PP(J)=A(J,K)
|
---|
57 | Q(J)=A(J,K)*Q(K)
|
---|
58 | 49 A(J,K)=0.
|
---|
59 | 50 IF(K-N)51,60,100
|
---|
60 | 51 DO 59 J=KP1,N
|
---|
61 | PP(J)=A(K,J)
|
---|
62 | Q(J)=-A(K,J)*Q(K)
|
---|
63 | 59 A(K,J)=0.0
|
---|
64 | C elimination proper
|
---|
65 | 60 DO 65 J=1,N
|
---|
66 | DO 65 K=J,N
|
---|
67 | 65 A(J,K)=A(J,K)+PP(J)*Q(K)
|
---|
68 | C elements of left diagonal and unscaling
|
---|
69 | DO 70 J= 1, N
|
---|
70 | DO 70 K= 1, J
|
---|
71 | A(K,J) = A(K,J) *S(K)*S(J)
|
---|
72 | 70 A(J,K) = A(K,J)
|
---|
73 | RETURN
|
---|
74 | C failure return
|
---|
75 | 100 IFAIL=1
|
---|
76 | RETURN
|
---|
77 | END
|
---|