[2403] | 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
|
---|