* * $Id: matin1.F,v 1.1.1.1 1996/02/15 17:49:52 mclareni Exp $ * * $Log: matin1.F,v $ * Revision 1.1.1.1 1996/02/15 17:49:52 mclareni * Kernlib * * #include "kerngen/pilot.h" #if !defined(CERNLIB_TCGEN) SUBROUTINE MATIN1 (A,IDIM1,N1,IDIM2,N2,INDEX,NERROR,DETERM) C C CERN PROGLIB# F100 MATIN1 .VERSION KERNFOR 3.15 820113 C ORIG. 03/05/72 H.V.EIKEN C C MATRIX INVERSION WITH ACCOMPANYING SOLUTION OF LINEAR EQUATIONS DIMENSION A(IDIM1),INDEX(IDIM1) DETER=1.0 N=N1 IEMAT=N+N2 IDIM=IDIM1 NMIN1=N-1 C THE ROUTINE DOES ITS OWN EVALUATION FOR DOUBLE SUBSCRIPTING OF C ARRAY A. IPIVC=1-IDIM C MAIN LOOP TO INVERT THE MATRIX DO 11 MAIN=1,N PIVOT=0.0 IPIVC=IPIVC+IDIM C SEARCH FOR NEXT PIVOT IN COLUMN MAIN. IPIVC1=IPIVC+MAIN-1 IPIVC2=IPIVC +NMIN1 DO 2 I=IPIVC1,IPIVC2 IF(ABS(A(I))-ABS(PIVOT)) 2,2,1 1 PIVOT=A(I) LPIV=I 2 CONTINUE C IS PIVOT DIFFERENT FROM ZERO IF(PIVOT) 3,15,3 C GET THE PIVOT-LINE INDICATOR AND SWAP LINES IF NECESSARY 3 ICOL=LPIV-IPIVC+1 INDEX(MAIN)=ICOL IF(ICOL-MAIN) 6,6,4 C COMPLEMENT THE DETERMINANT 4 DETER=-DETER C POINTER TO LINE PIVOT FOUND ICOL=ICOL-IDIM C POINTER TO EXACT PIVOT LINE I3=MAIN-IDIM DO 5 I=1,IEMAT ICOL=ICOL+IDIM I3=I3+IDIM SWAP=A(I3) A(I3)=A(ICOL) 5 A(ICOL)=SWAP C COMPUTE DETERMINANT 6 DETER=DETER*PIVOT PIVOT=1./PIVOT C TRANSFORM PIVOT COLUMN I3=IPIVC+NMIN1 DO 7 I=IPIVC,I3 7 A(I)=-A(I)*PIVOT A(IPIVC1)=PIVOT C PIVOT ELEMENT TRANSFORMED C C NOW CONVERT REST OF THE MATRIX I1=MAIN-IDIM C POINTER TO PIVOT LINE ELEMENTS ICOL=1-IDIM C GENERAL COLUMN POINTER DO 10 I=1,IEMAT ICOL=ICOL+IDIM I1=I1+IDIM C POINTERS MOVED IF(I-MAIN) 8,10,8 C PIVOT COLUMN EXCLUDED 8 JCOL=ICOL+NMIN1 SWAP=A(I1) I3=IPIVC-1 DO 9 I2=ICOL,JCOL I3=I3+1 9 A(I2)=A(I2)+SWAP*A(I3) A(I1)=SWAP*PIVOT 10 CONTINUE 11 CONTINUE C NOW REARRANGE THE MATRIX TO GET RIGHT INVERS DO 14 I1=1,N MAIN=N+1-I1 LPIV=INDEX(MAIN) IF(LPIV-MAIN) 12,14,12 12 ICOL=(LPIV-1)*IDIM+1 JCOL=ICOL+NMIN1 IPIVC=(MAIN-1)*IDIM+1-ICOL DO 13 I2=ICOL,JCOL I3=I2+IPIVC SWAP=A(I2) A(I2)=A(I3) 13 A(I3)=SWAP 14 CONTINUE DETERM=DETER NERROR=0 RETURN 15 NERROR=MAIN DETERM=DETER RETURN END #endif