c $Log: matinv.f,v $ c Revision 1.2 1992/12/09 14:43:52 ldr c Replaced all n's with nl's for compatibility with ogcm. c c Revision 1.1 92/04/23 11:32:01 ldr c Initial revision c SUBROUTINE MATINV(A,IDIM,Nl,B,L,D,IRROR,IPIV,IND) DIMENSION A(IDIM,Nl),B(IDIM,Nl),IPIV(IDIM),IND(IDIM,2) C PROGRAM MODIFIED MAY 1978 BY MC AVANEY TO ALLOW FOR C GENERAL MATRIX DIMENSIONS C A IS AN NXN MATRIX TO BE INVERTED,OR CONTAINING EQUATION COEFFS C IDIM IS THE DIMENSION OF FIRST ELEMENT OF MATRIX IN CALLING C PROGRAM C B IS AN NXM RHS MATRIX FOR EQUATIONS C IF L=0,INVERSE ONLY GIVEN.L POSITIVE,SOLUTIONS ONLY.L NEGATIVE C BOTH. M=ABS(L). C D CONTAINS THE DETERMINANT OF THE A MATRIX ON EXIT C A IS REPLACED BY THE INVERSE ,B BY THE SOLUTIONS. C IPIV IS TEMPOSRAY STORAGE REQUIRED BY MATINV C IND ALSO TEMPOARARY STORAGE C METHOD OF GAUSS-JORDON PIVOTAL ELIMINATION M=IABS(L) D=1.0 DO 10 I=1,Nl 10 IPIV(I)=0 DO 220 I=1,Nl AMAX=0.0 C SEARCH SUB-MATRIX FOR LARGEST ELEMENT AS PIVOT DO 70 J=1,Nl IF(IPIV(J)) 80,30,70 30 DO 60 K=1,Nl IF(IPIV(K)-1) 40,60,80 C THIS ROW COLUMN HAS NOT BEEN A PIVOT 40 IF( ABS (A(J,K))-AMAX) 60,60,50 50 IROW=J ICOL=K AMAX= ABS (A(J,K)) 60 CONTINUE 70 CONTINUE C PIVOT FOUND IPIV(ICOL)=IPIV(ICOL)+1 IF(AMAX-1.0E-20)80,80,90 C MATRIX SINGULAR,ERROR RETURN 80 IRROR=1 RETURN 90 IF(IROW-ICOL) 95,130,95 C MAKE PIVOT A DIAGONAL ELEMENT BY ROW INTERCHANGE. 95 D=-D DO 100 K=1,Nl AMAX=A(IROW,K) A(IROW,K)=A(ICOL,K) 100 A(ICOL,K)=AMAX IF(M) 130,130,110 110 DO 120 K=1,M AMAX=B(IROW,K) B(IROW,K)=B(ICOL,K) 120 B(ICOL,K)=AMAX 130 IND(I,1)=IROW IND(I,2)=ICOL AMAX=A(ICOL,ICOL) D=D*AMAX A(ICOL,ICOL)=1.0 C DIVIDE PIVOT ROW BY PIVOT DO 140 K=1,Nl 140 A(ICOL,K)=A(ICOL,K)/AMAX IF(M) 170,170,150 150 DO 160 K=1,M 160 B(ICOL,K)=B(ICOL,K)/AMAX C REDUCE NON-PIVOT ROWS 170 DO 220 J=1,Nl IF(J-ICOL) 180,220,180 180 AMAX=A(J,ICOL) A(J,ICOL)=0.0 DO 190 K=1,Nl 190 A(J,K)=A(J,K)-A(ICOL,K)*AMAX IF(M) 220,220,200 200 DO 210 K=1,M 210 B(J,K)=B(J,K)-B(ICOL,K)*AMAX 220 CONTINUE C AFTER Nl PIVOTAL CONDENSATIONS,SOLUTIONS LIE IN B MATRIX IF(L) 230,230,270 C FOR INVERSE OF A, INTERCHANGE COLUMNS 230 DO 260 I=1,Nl J=Nl+1-I IF(IND(J,1)-IND(J,2)) 240,260,240 240 IROW=IND(J,1) ICOL=IND(J,2) DO 250 K=1,Nl AMAX=A(K,IROW) A(K,IROW)=A(K,ICOL) 250 A(K,ICOL)=AMAX 260 CONTINUE 270 IRROR=0 RETURN C** THIS PROGRAM VALID ON FTN4 AND FTN5 ** END