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