*IF DEF,OCEAN                                                              @DYALLOC.4147   
C ******************************COPYRIGHT******************************    GTS3F400.30     
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS3F400.31     
C                                                                          GTS3F400.32     
C Use, duplication or disclosure of this code is subject to the            GTS3F400.33     
C restrictions as set forth in the contract.                               GTS3F400.34     
C                                                                          GTS3F400.35     
C                Meteorological Office                                     GTS3F400.36     
C                London Road                                               GTS3F400.37     
C                BRACKNELL                                                 GTS3F400.38     
C                Berkshire UK                                              GTS3F400.39     
C                RG12 2SZ                                                  GTS3F400.40     
C                                                                          GTS3F400.41     
C If no contract has been raised with this copy of the code, the use,      GTS3F400.42     
C duplication or disclosure of it is strictly prohibited.  Permission      GTS3F400.43     
C to do so must first be obtained in writing from the Head of Numerical    GTS3F400.44     
C Modelling at the above address.                                          GTS3F400.45     
C ******************************COPYRIGHT******************************    GTS3F400.46     
C ****************************ACKNOWLEDGMENT***************************    GTS3F400.47     
C This code is derived from Public Domain code (the Cox 1984 Ocean         GTS3F400.48     
C Model) distributed by the Geophysical Fluid Dynamics Laboratory.         GTS3F400.49     
C               NOAA                                                       GTS3F400.50     
C               PO Box 308                                                 GTS3F400.51     
C               Princeton                                                  GTS3F400.52     
C               New Jersey USA                                             GTS3F400.53     
C If you wish to obtain a copy of the original code that does not have     GTS3F400.54     
C Crown Copyright use, duplication or disclosure restrictions, please      GTS3F400.55     
C contact them at the above address.                                       GTS3F400.56     
C ****************************ACKNOWLEDGMENT***************************    GTS3F400.57     
C                                                                          GTS3F400.58     

      SUBROUTINE MATRIX(ARRAY,IRDIM,ISTRT,IM,JM,KK,SCALE,                   27,2ORH4F404.95     
     &                  OFF1,OFF2)                                         ORH4F404.96     
C                                                                          MATRIX.3      
C=======================================================================   MATRIX.4      
C                                                                    ===   MATRIX.5      
C  MATRIX IS A GENERAL TWO-DIMENSIONAL ARRAY PRINTING ROUTINE,       ===   MATRIX.6      
C      WHERE:                                                        ===   MATRIX.7      
C      ARRAY=THE ARRAY TO BE PRINTED (!!!!! FULL PRECISION !!!!!)    ===   MATRIX.8      
C      IRDIM=THE 1ST DIMENSION OF ARRAY                              ===   MATRIX.9      
C      ISTRT=THE 1ST ELEMENT OF THE 1ST DIMENSION TO BE PRINTED      ===   MATRIX.10     
C      IM   =THE LAST ELEMENT OF THE 1ST DIMENSION TO BE PRINTED     ===   MATRIX.11     
C      JM   =THE LAST ELEMENT OF THE 2ND DIMENSION TO BE PRINTED     ===   MATRIX.12     
C            --THE ROWS ARE PRINTED IN DESCENDING ORDER--            ===   MATRIX.13     
C            (IF THIS IS 0, KK IS USED)                              ===   MATRIX.14     
C      KK   =THE LAST ELEMENT OF THE 2ND DIMENSION TO BE PRINTED     ===   MATRIX.15     
C            --THE ROWS ARE PRINTED IN ASCENDING ORDER--             ===   MATRIX.16     
C            (IF THIS IS 0, JM IS USED)                              ===   MATRIX.17     
C      SCALE=A SCALING FACTOR BY WHICH ARRAY IS DIVIDED BEFORE       ===   MATRIX.18     
C            PRINTING.  (IF THIS IS ZERO, NO SCALING IS DONE.)       ===   MATRIX.19     
C            IF SCALE=0, 10 COLUMNS ARE PRINTED ACROSS IN E FORMAT   ===   MATRIX.20     
C            IF SCALE>0, 20 COLUMNS ARE PRINTED ACROSS IN F FORMAT   ===   MATRIX.21     
!     3.5    16.01.95   Remove *IF dependency. R.Hill                      ORH1F305.4879   
C                                                                    ===   MATRIX.22     
C=======================================================================   MATRIX.23     
C                                                                          MATRIX.24     
!    MODIFICATION HISTORY                                                  ORH4F404.88     
!    --------------------                                                  ORH4F404.89     
!                                                                          ORH4F404.90     
!    Version  Date      Description                                        ORH4F404.91     
!    -------  --------  ---------------------------------------------      ORH4F404.92     
!    4.4      05/08/97  Change PRINTS to WRITES to make output             ORH4F404.93     
!                       consistent in mpp version. R. Hill                 ORH4F404.94     
!LL   4.5     17/09/98 Update calls to timer, required because of          GPB8F405.96     
!LL                    new barrier inside timer.         P.Burton          GPB8F405.97     
C---------------------------------------------------------------------     MATRIX.25     
C  DEFINE GLOBAL DATA                                                      MATRIX.26     
C---------------------------------------------------------------------     MATRIX.27     
!     IMPLICIT NONE                                                        ORH1F305.4880   
                                                                           ORH1F305.4881   
*CALL OTIMER                                                               ORH1F305.4882   
C                                                                          MATRIX.28     
C                                                                          MATRIX.30     
C---------------------------------------------------------------------     MATRIX.31     
C  DEFINE LOCAL DATA                                                       MATRIX.32     
C---------------------------------------------------------------------     MATRIX.33     
C                                                                          MATRIX.34     
      DIMENSION ARRAY(IRDIM,*),NUM(20),PLINE(20)                           @DYALLOC.4148   
      REAL ARRAY                                                           MATRIX.36     
      INTEGER OFF1  ! Offset for 1st dimension indices                     ORH4F404.97     
     &       ,OFF2  ! Offset for 2nd dimension indices                     ORH4F404.98     
C---------------------------------------------------------------------     MATRIX.38     
C  BEGIN EXECUTABLE CODE                                                   MATRIX.39     
C---------------------------------------------------------------------     MATRIX.40     
C                                                                          MATRIX.41     
      IF(L_OTIMER) THEN                                                    ORH1F305.4883   
         CALL TIMER('MATRIX  ',103)                                        GPB8F405.98     
      ENDIF                                                                ORH1F305.4885   
      IF(SCALE.NE.0) GO TO 500                                             MATRIX.45     
      DO 251 IS=ISTRT,IM,10                                                MATRIX.46     
      IE=IS+9                                                              MATRIX.47     
      IF(IE.GT.IM) IE=IM                                                   MATRIX.48     
      IDIF=IE-IS+1                                                         MATRIX.49     
      DO 100 I=1,IDIF                                                      MATRIX.50     
 100  NUM(I)=IS+I-1+OFF1                                                   ORH4F404.99     
      WRITE(6,9990) (NUM(I),I=1,IDIF)                                      ORH4F404.100    
 9990 FORMAT(10I13,/)                                                      MATRIX.53     
      JMORKM=JM+KK                                                         MATRIX.54     
      DO 252 JORK=1,JMORKM                                                 MATRIX.55     
      IF(JM.NE.0) L=JMORKM+1-JORK                                          MATRIX.56     
      IF(KK.NE.0) L=JORK                                                   MATRIX.57     
      WRITE(6,9966) L+OFF2, (ARRAY(I,L),I=IS,IE)                           ORH4F404.101    
 252  CONTINUE                                                             MATRIX.59     
      WRITE(6,9984)                                                        ORH4F404.102    
 251  CONTINUE                                                             MATRIX.61     
 9966 FORMAT(1X,I2,10(1PE13.5))                                            MATRIX.62     
 9984 FORMAT(//)                                                           MATRIX.63     
      RETURN                                                               MATRIX.64     
 500  CONTINUE                                                             MATRIX.65     
      SCALER=1.0/SCALE                                                     MATRIX.66     
      DO 751 IS=ISTRT,IM,20                                                MATRIX.67     
      IE=IS+19                                                             MATRIX.68     
      IF(IE.GT.IM) IE=IM                                                   MATRIX.69     
      IDIF=IE-IS+1                                                         MATRIX.70     
      DO 600 I=1,IDIF                                                      MATRIX.71     
 600  NUM(I)=IS+I-1+OFF1                                                   ORH4F404.103    
      WRITE(6,9991) (NUM(I),I=1,IDIF)                                      ORH4F404.104    
 9991 FORMAT(3X,20I6,/)                                                    MATRIX.74     
      JMORKM=JM+KK                                                         MATRIX.75     
      DO 752 JORK=1,JMORKM                                                 MATRIX.76     
      IF(JM.NE.0) L=JMORKM+1-JORK                                          MATRIX.77     
      IF(KK.NE.0) L=JORK                                                   MATRIX.78     
      DO 753 I=1,IDIF                                                      MATRIX.79     
      PLINE(I)=ARRAY(IS+I-1,L)*SCALER                                      MATRIX.80     
 753  CONTINUE                                                             MATRIX.81     
      WRITE(6,9967) L+OFF2,(PLINE(I),I=1,IDIF)                             ORH4F404.105    
 752  CONTINUE                                                             MATRIX.83     
      WRITE(6,9984)                                                        ORH4F404.106    
 751  CONTINUE                                                             MATRIX.85     
 9967 FORMAT(1X,I3,1X,20F6.2)                                              MATRIX.86     
      IF(L_OTIMER) THEN                                                    ORH1F305.4886   
         CALL TIMER('MATRIX  ',104)                                        GPB8F405.99     
      ENDIF                                                                ORH1F305.4888   
      RETURN                                                               MATRIX.90     
      END                                                                  MATRIX.91     
*ENDIF                                                                     @DYALLOC.4149