*IF DEF,C93_1A,OR,DEF,C93_2A                                               GNF0F402.16     
C ******************************COPYRIGHT******************************    GTS2F400.5815   
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.5816   
C                                                                          GTS2F400.5817   
C Use, duplication or disclosure of this code is subject to the            GTS2F400.5818   
C restrictions as set forth in the contract.                               GTS2F400.5819   
C                                                                          GTS2F400.5820   
C                Meteorological Office                                     GTS2F400.5821   
C                London Road                                               GTS2F400.5822   
C                BRACKNELL                                                 GTS2F400.5823   
C                Berkshire UK                                              GTS2F400.5824   
C                RG12 2SZ                                                  GTS2F400.5825   
C                                                                          GTS2F400.5826   
C If no contract has been raised with this copy of the code, the use,      GTS2F400.5827   
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.5828   
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.5829   
C Modelling at the above address.                                          GTS2F400.5830   
C ******************************COPYRIGHT******************************    GTS2F400.5831   
C                                                                          GTS2F400.5832   
CLL  SUBROUTINE MATINV--------------------------------------------         MATINV1A.3      
CLL                                                                        MATINV1A.4      
CLL  MODEL            MODIFICATION HISTORY FROM MODEL VERSION 3.0:         MATINV1A.5      
CLL VERSION  DATE                                                          MATINV1A.6      
CLL vn4.2  07/11/96:Allow this routine to be used in C93_2A (Farnon)       GNF0F402.15     
CLL                                                                        MATINV1A.7      
CLL  PROGRAMMING STANDARD: UNIFIED MODEL DOCUMENTATION PAPER NO. 4,        MATINV1A.8      
CLL  VERSION 2, DATED 18/01/90                                             MATINV1A.9      
CLL                                                                        MATINV1A.10     
CLL  SYSTEM TASK: ????                                                     MATINV1A.11     
CLL                                                                        MATINV1A.12     
CLL  PURPOSE: INVERTS AN N BY N MATRIX BY ROW REDUCTION                    MATINV1A.13     
CLL                                                                        MATINV1A.14     
CLL  DOCUMENTATION:  ???                                                   MATINV1A.15     
CLL                                                                        MATINV1A.16     
CLLEND-------------------------------------------------------------        MATINV1A.17     
C                                                                          MATINV1A.18     
C*L ARGUMENTS:-----------------------------------------------------        MATINV1A.19     

      SUBROUTINE MATINV                                                     1MATINV1A.20     
     & (C,B,N)                                                             MATINV1A.21     
C                                                                          MATINV1A.22     
      IMPLICIT NONE                                                        MATINV1A.23     
C                                                                          MATINV1A.24     
      INTEGER                                                              MATINV1A.25     
     *  N         ! IN  SIZE OF MATRIX TO BE INVERTED                      MATINV1A.26     
C                                                                          MATINV1A.27     
      REAL                                                                 MATINV1A.28     
     *  C(N,N)    ! IN  MATRIX TO BE INVERTED                              MATINV1A.29     
     *, B(N,N)    ! OUT INVERTED MATRIX                                    MATINV1A.30     
C*-----------------------------------------------------------------        MATINV1A.31     
C                                                                          MATINV1A.32     
C*L WORKSPACE USAGE------------------------------------------------        MATINV1A.33     
      REAL                                                                 MATINV1A.34     
     *  A(N,N)                                                             MATINV1A.35     
C*-----------------------------------------------------------------        MATINV1A.36     
C                                                                          MATINV1A.37     
C*L EXTERNAL SUBROUTINES CALLED------------------------------------        MATINV1A.38     
C     NONE                                                                 MATINV1A.39     
C*-----------------------------------------------------------------        MATINV1A.40     
C                                                                          MATINV1A.41     
C------------------------------------------------------------------        MATINV1A.42     
C DEFINE LOCAL VARIABLES                                                   MATINV1A.43     
C------------------------------------------------------------------        MATINV1A.44     
      INTEGER                                                              MATINV1A.45     
     *  M1,M2,J,M  ! LOOP COUNTERS                                         MATINV1A.46     
     *, L                                                                  MATINV1A.47     
C                                                                          MATINV1A.48     
      REAL                                                                 MH050593.1      
     *  AMM   !  = A(M,M)                                                  MATINV1A.50     
     *, AMJ   !  = A(M,J)                                                  MATINV1A.51     
C                                                                          MATINV1A.52     
C                                                                          MATINV1A.53     
C------------------------------------------------------------------        MATINV1A.54     
CL  1. SET UP EXTENDED MATRIX (A|B)=(C|I) TO ROW REDUCE                    MATINV1A.55     
C------------------------------------------------------------------        MATINV1A.56     
      DO 400 M1=1,N                                                        MATINV1A.57     
        DO 401 M2=1,N                                                      MATINV1A.58     
          IF (M1.EQ.M2) THEN                                               MATINV1A.59     
            B(M1,M2)=1                                                     MATINV1A.60     
          ELSE                                                             MATINV1A.61     
            B(M1,M2)=0                                                     MATINV1A.62     
          ENDIF                                                            MATINV1A.63     
          A(M1,M2)=C(M1,M2)                                                MATINV1A.64     
  401   CONTINUE                                                           MATINV1A.65     
  400 CONTINUE                                                             MATINV1A.66     
C                                                                          MATINV1A.67     
C------------------------------------------------------------------        MATINV1A.68     
CL 2. FOR EACH COLUMN M FIND THE FIRST NON-ZERO ENTRY.                     MATINV1A.69     
CL    ADD ROW WITH NON-ZERO ENTRY TO ROW M SO THAT A(M,M) IS NOT 0.        MATINV1A.70     
CL    IF COLUMN M CONSISTS OF ZEROS THEN MATRIX CANNOT BE INVERTED,        MATINV1A.71     
CL    SO STOP.                                                             MATINV1A.72     
C------------------------------------------------------------------        MATINV1A.73     
      DO 2 M=1,N                                                           MATINV1A.74     
        L=M                                                                MATINV1A.75     
  200   CONTINUE                                                           MATINV1A.76     
        IF (A(M,M).EQ.0.) THEN                                             MATINV1A.77     
          IF (L.EQ.N) STOP 5                                               MATINV1A.78     
          L=L+1                                                            MATINV1A.79     
          DO 402 M1=1,N                                                    MATINV1A.80     
            A(M1,M)=A(M1,M)+A(M1,L)                                        MATINV1A.81     
            B(M1,M)=B(M1,M)+B(M1,L)                                        MATINV1A.82     
  402     CONTINUE                                                         MATINV1A.83     
        ENDIF                                                              MATINV1A.84     
        IF (A(M,M).EQ.0.) GOTO 200                                         MATINV1A.85     
C                                                                          MATINV1A.86     
C------------------------------------------------------------------        MATINV1A.87     
CL 3. DIVIDE ROW BY A(M,M) IN ORDER TO OBTAIN A(M,M)=1                     MATINV1A.88     
C------------------------------------------------------------------        MATINV1A.89     
        AMM=A(M,M)                                                         MATINV1A.90     
        DO 403 M1=1,N                                                      MATINV1A.91     
          A(M1,M)=A(M1,M)/AMM                                              MATINV1A.92     
          B(M1,M)=B(M1,M)/AMM                                              MATINV1A.93     
  403   CONTINUE                                                           MATINV1A.94     
C                                                                          MATINV1A.95     
C------------------------------------------------------------------        MATINV1A.96     
CL 4. IN COLUMN M MAKE EVERY VALUE 0 (EXCEPT A(M,M)) BY SUBTRACTING        MATINV1A.97     
CL    ROW M*THE APPROPRIATE VALUE.                                         MATINV1A.98     
C------------------------------------------------------------------        MATINV1A.99     
        DO 3 J=1,N                                                         MATINV1A.100    
          IF (J.NE.M) THEN                                                 MATINV1A.101    
            AMJ=A(M,J)                                                     MATINV1A.102    
            DO 404 M1=1,N                                                  MATINV1A.103    
              A(M1,J)=A(M1,J)-AMJ*A(M1,M)                                  MATINV1A.104    
              B(M1,J)=B(M1,J)-AMJ*B(M1,M)                                  MATINV1A.105    
  404       CONTINUE                                                       MATINV1A.106    
          ENDIF                                                            MATINV1A.107    
 3      CONTINUE                                                           MATINV1A.108    
 2    CONTINUE                                                             MATINV1A.109    
C                                                                          MATINV1A.110    
CL  EXTENDED MATRIX (A|B)=(I|C**(-1)) WHERE C**(-1)=INVERSE OF C           MATINV1A.111    
      RETURN                                                               MATINV1A.112    
      END                                                                  MATINV1A.113    
*ENDIF                                                                     MATINV1A.114