      SUBROUTINE MATINV (M,A,ISIZE)
      IMPLICIT DOUBLE PRECISION (A-H,O-Z)
C----------------------------------------------------------
C     INVERSE AND DETERMINANT OF A BY THE GAUSS-JORDAN METHOD.
C     M IS THE ORDER OF THE SQUARE MATRIX, A.
C     A-INVERSE REPLACES A.
C     DETERMINANT OF A IS PLACED IN DET.
C     COOLEY AND LOHNES (1971:63)
C-----------------------------------------------------------
      PARAMETER (IDIM=50)
      DIMENSION A(ISIZE,ISIZE),IPVT(IDIM+2),PVT(IDIM+2),IND(IDIM+2,2)
      DET=.1D1
      DO 10 J=1,M
   10 IPVT(J)=0
      DO 100 I=1,M
C        SEARCH FOR THE PIVOT ELEMENT
         AMAX=.0D0
           DO 40 J=1,M
              IF(IPVT(J).EQ.1)GO TO 40
           DO 30 K=1,M
              IF(IPVT(K)-1)20,30,130
   20         IF(DABS(AMAX).GE.DABS(A(J,K)))GO TO 30
                     IROW=J
              ICOL=K
              AMAX=A(J,K)
   30      CONTINUE
   40   CONTINUE
         IPVT(ICOL)=IPVT(ICOL)+1
C        INTERCHANGE THE ROWS TO PUT THE PIVOT ELEMENT ON THE DIAGONAL
         IF(IROW.EQ.ICOL)GO TO 60
         DET=-DET
           DO 50 L=1,M
              SWAP=A(IROW,L)
              A(IROW,L)=A(ICOL,L)
   50      A(ICOL,L)=SWAP
   60    IND(I,1)=IROW
         IND(I,2)=ICOL
         PVT(I)=A(ICOL,ICOL)
C        DIVIDE THE PIVOT ROW BY THE PIVOT ELEMENT
         A(ICOL,ICOL)=.1D1
           DO 70 L=1,M
             A(ICOL,L)=A(ICOL,L)/PVT(I)
   70      CONTINUE
C       REDUCE THE NON-PIVOT ROWS
      DO 100 L1=1,M
          IF(L1.EQ.ICOL)GO TO 90
         SWAP=A(L1,ICOL)
         A(L1,ICOL)=.0D0
         IF(SWAP.LT..1D-30.AND.SWAP.GT.-.1D-30)SWAP=.0D0
           DO 80 L=1,M
              A(L1,L)=A(L1,L)-A(ICOL,L)*SWAP
   80      CONTINUE
   90  CONTINUE
  100 CONTINUE
C     INTERCHANGE THE COLUMNS
           DO 120 I=1,M
              L=M+1-I
              IF(IND(L,1).EQ.IND(L,2))GO TO 120
              IROW=IND(L,1)
              ICOL=IND(L,2)
                DO 110 K=1,M
                   SWAP=A(K,IROW)
                   A(K,IROW)=A(K,ICOL)
                   A(K,ICOL)=SWAP
  110           CONTINUE
  120      CONTINUE
  130 CONTINUE
      RETURN
      END
