*IF DEF,CONVPP                                                             AD311093.1      
C ******************************COPYRIGHT******************************    GTS2F400.1333   
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.1334   
C                                                                          GTS2F400.1335   
C Use, duplication or disclosure of this code is subject to the            GTS2F400.1336   
C restrictions as set forth in the contract.                               GTS2F400.1337   
C                                                                          GTS2F400.1338   
C                Meteorological Office                                     GTS2F400.1339   
C                London Road                                               GTS2F400.1340   
C                BRACKNELL                                                 GTS2F400.1341   
C                Berkshire UK                                              GTS2F400.1342   
C                RG12 2SZ                                                  GTS2F400.1343   
C                                                                          GTS2F400.1344   
C If no contract has been raised with this copy of the code, the use,      GTS2F400.1345   
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.1346   
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.1347   
C Modelling at the above address.                                          GTS2F400.1348   
C ******************************COPYRIGHT******************************    GTS2F400.1349   
C                                                                          GTS2F400.1350   
CLL  PROGRAM MAIN_CONVPP --------------------------------------------      CONVPP1.2      
CLL                                                                        CONVPP1.3      
CLL  Purpose: Converts a UM file into PP format.                           CONVPP1.4      
CLL                                                                        CONVPP1.5      
CLL  Written by A. Dickinson 05/07/93                                      CONVPP1.6      
CLL                                                                        CONVPP1.7      
CLL  Model            Modification history:                                CONVPP1.8      
CLL version  Date                                                          CONVPP1.9      
CLL                                                                        AD311093.17     
CLL  3.3   31/10/93   Dimension of data array set to maximum value         AD311093.18     
CLL                   Author: A. Dickinson      Reviewer: P.Burton         AD311093.19     
CLL                                                                        CONVPP1.10     
CLL   3.3   15/12/93  Rename subroutine PRINTDUMP to CONVPP. D Robinson    DR151293.1      
CLL                                                                        DR151293.2      
CLL   3.3   08/12/93  Extra argument for READFLDS. D. Robinson             DR081293.71     
CLL                                                                        DR081293.72     
CLL   3.4   23/09/94  Extended to process ocean dumps. Alternative         UDG2F304.1      
CLL                   subroutine introduced                                UDG2F304.2      
CLL                   Author D.M.Goddard                                   UDG2F304.3      
CLL   3.5  24/03/95    Changed OPEN to FILE_OPEN  P.Burton                 GPB1F305.23     
CLL   4.4  24/10/96   Ocean data is written out without wrap points.       UDG5F404.48     
CLL                   Catherine Jones                                      UDG5F404.49     
CLL   4.4  23/04/97   Compressed fields are uncompressed using the         UDG5F404.50     
CLL                   subroutine UNPACK                                    UDG5F404.51     
CLL                   Catherine Jones                                      UDG5F404.52     
                                                                           UDG5F404.53     
                                                                           UDG5F404.54     
CLL   4.2  Oct. 96    DEF CRAY replaced by DEF T3E                         GSS9F402.72     
CLL                             S.J.Swarbrick                              GSS9F402.73     
CLL  4.4   Oct. 1997 Changed error handling from routine HDPPXRF           GDW1F404.155    
CLL                  so only fatal (+ve) errors are handled.               GDW1F404.156    
CLL                                             Shaun de Witt              GDW1F404.157    
!   4.4  23/04/97   Corrections to processing of Land-sea mask and         UDG5F404.1      
!                   Land compressed fields                                 UDG5F404.2      
!                   D.M. Goddard                                           UDG5F404.3      
!   4.4  24/10/97   Initialise ICODE as it is no longer                    UDG9F404.42     
!                   initialised in HDPPXRF                                 UDG9F404.43     
!                   Author D.M. Goddard                                    UDG9F404.44     
!     4.5  14/10/97   Sets most significant number in packing indicator    UDG1F405.32     
!                     to zero (Native format) to enable PP package to be   UDG1F405.33     
!                     used on fieldsfile output                            UDG1F405.34     
!                     Author D.M. Goddard                                  UDG1F405.35     
CLL                                                                        UDG2F304.4      
CLL  Programming standards:                                                CONVPP1.11     
CLL                                                                        CONVPP1.12     
CLL  Logical components covered:                                           CONVPP1.13     
CLL                                                                        CONVPP1.14     
CLL  System Tasks: F3,F4,F6                                                CONVPP1.15     
CLL                                                                        CONVPP1.16     
CLL  Documentation: UM Doc Paper F5                                        CONVPP1.17     
CLL                                                                        CONVPP1.18     
CLL  -----------------------------------------------------------------     CONVPP1.19     

      PROGRAM MAIN_CONVPP                                                  ,12CONVPP1.21     
                                                                           CONVPP1.25     
      IMPLICIT NONE                                                        CONVPP1.26     
                                                                           CONVPP1.27     
                                                                           CONVPP1.28     
      CHARACTER*80 ARG1,ARG2  ! Filenames                                  CONVPP1.29     
                                                                           CONVPP1.30     
                                                                           CONVPP1.31     
      INTEGER                                                              CONVPP1.32     
     & FIXHD(256)        !Space for fixed length header                    CONVPP1.33     
     &,INTHD(100)        !Space for integer header                         CONVPP1.34     
                                                                           CONVPP1.35     
      INTEGER                                                              CONVPP1.36     
     & LEN_FIXHD      !Length of fixed length header on input file         CONVPP1.37     
     &,LEN_INTHD      !Length of integer header on input file              CONVPP1.38     
     &,JOC_NO_SEAPTS  !Number of points in compressed array                UDG2F304.5      
     &,LEN_OCFLD      !Length of uncompressed ocean field                  UDG2F304.6      
     &,LEN_REALHD     !Length of real header on input file                 CONVPP1.39     
     &,LEN1_LEVDEPC   !1st dim of lev dependent consts on input file       CONVPP1.40     
     &,LEN2_LEVDEPC   !2nd dim of lev dependent consts on input file       CONVPP1.41     
     &,LEN1_ROWDEPC   !1st dim of row dependent consts on input file       CONVPP1.42     
     &,LEN2_ROWDEPC   !2nd dim of row dependent consts on input file       CONVPP1.43     
     &,LEN1_COLDEPC   !1st dim of col dependent consts on input file       CONVPP1.44     
     &,LEN2_COLDEPC   !2nd dim of col dependent consts on input file       CONVPP1.45     
     &,LEN1_FLDDEPC   !1st dim of field dependent consts on input file     CONVPP1.46     
     &,LEN2_FLDDEPC   !2nd dim of field dependent consts on input file     CONVPP1.47     
     &,LEN_EXTCNST    !Length of extra consts on input file                CONVPP1.48     
     &,LEN_DUMPHIST   !Length of history header on input file              CONVPP1.49     
     &,LEN_CFI1       !Length of index1 on input file                      CONVPP1.50     
     &,LEN_CFI2       !Length of index2 on input file                      CONVPP1.51     
     &,LEN_CFI3       !Length of index3 on input file                      CONVPP1.52     
     &,LEN1_LOOKUP    !1st dim of LOOKUP on input file                     CONVPP1.53     
     &,LEN2_LOOKUP    !2nd dim of LOOKUP on input file                     CONVPP1.54     
     &,LEN_DATA       !Length of data on input file                        CONVPP1.55     
     &,ROW_LENGTH     !No of points E-W on input file                      CONVPP1.56     
     &,P_ROWS         !No of p-rows on input file                          CONVPP1.57     
     &,P_FIELD        !No of p-points per level on input file              CONVPP1.58     
     &,MAX_FIELD_SIZE !Maximum field size on file                          AD311093.20     
                                                                           CONVPP1.59     
      INTEGER                                                              CONVPP1.60     
     & LEN_IO   !Length of I/O returned by BUFFER IN                       CONVPP1.61     
     &,I        !Loop index                                                CONVPP1.62     
     &,NFTIN    !Unit number of input UM dump 1                            CONVPP1.63     
     &,ERR      !Return code from OPEN                                     CONVPP1.64     
                                                                           CONVPP1.65     
     &,ICODE    !Return code from setpos                                   GTD0F400.52     
      REAL A    !BUFFER IN UNIT function                                   CONVPP1.66     
                                                                           CONVPP1.67     
                                                                           CONVPP1.68     
C External subroutines called:------------------------------------------   CONVPP1.69     
      EXTERNAL IOERROR,ABORT_IO,BUFFIN,FILE_OPEN,SETPOS,ABORT,             GPB1F305.24     
     &         ATMOS_CONVPP,OCEAN_CONVPP                                   UDG2F304.8      
C*----------------------------------------------------------------------   CONVPP1.71     
                                                                           CONVPP1.72     
                                                                           CONVPP1.73     
CL 1. Assign unit numbers                                                  CONVPP1.74     
                                                                           CONVPP1.75     
      NFTIN=20                                                             CONVPP1.76     
                                                                           CONVPP1.77     
      WRITE(6,'(20x,''FILE STATUS'')')                                     CONVPP1.78     
      WRITE(6,'(20x,''==========='')')                                     CONVPP1.79     
                                                                           CONVPP1.80     
      CALL FILE_OPEN(20,'FILE1',5,0,0,ERR)                                 GPB1F305.26     
      CALL GET_FILE(10,ARG2,80,ICODE)                                      GTD0F400.151    
      OPEN(10,FILE=ARG2,FORM='UNFORMATTED')                                CONVPP1.85     
                                                                           CONVPP1.90     
CL 2. Buffer in fixed length header record                                 CONVPP1.91     
                                                                           CONVPP1.92     
      CALL BUFFIN(NFTIN,FIXHD,256,LEN_IO,A)                                CONVPP1.93     
                                                                           CONVPP1.94     
C Check for I/O errors                                                     CONVPP1.95     
      IF(A.NE.-1.0.OR.LEN_IO.NE.256)THEN                                   CONVPP1.96     
        CALL IOERROR('buffer in of fixed length header of input dump',     CONVPP1.97     
     *  A,LEN_IO,256)                                                      CONVPP1.98     
      CALL ABORT                                                           CONVPP1.99     
      ENDIF                                                                CONVPP1.100    
                                                                           CONVPP1.101    
C Set missing data indicator to zero                                       CONVPP1.102    
      DO  I=1,256                                                          CONVPP1.103    
        IF(FIXHD(I).LT.0)FIXHD(I)=0                                        CONVPP1.104    
      ENDDO                                                                CONVPP1.105    
                                                                           CONVPP1.106    
C Input file dimensions                                                    CONVPP1.107    
      LEN_FIXHD=256                                                        CONVPP1.108    
      LEN_INTHD=FIXHD(101)                                                 CONVPP1.109    
      LEN_REALHD=FIXHD(106)                                                CONVPP1.110    
      LEN1_LEVDEPC=FIXHD(111)                                              CONVPP1.111    
      LEN2_LEVDEPC=FIXHD(112)                                              CONVPP1.112    
      LEN1_ROWDEPC=FIXHD(116)                                              CONVPP1.113    
      LEN2_ROWDEPC=FIXHD(117)                                              CONVPP1.114    
      LEN1_COLDEPC=FIXHD(121)                                              CONVPP1.115    
      LEN2_COLDEPC=FIXHD(122)                                              CONVPP1.116    
      LEN1_FLDDEPC=FIXHD(126)                                              CONVPP1.117    
      LEN2_FLDDEPC=FIXHD(127)                                              CONVPP1.118    
      LEN_EXTCNST=FIXHD(131)                                               CONVPP1.119    
      LEN_DUMPHIST=FIXHD(136)                                              CONVPP1.120    
      LEN_CFI1=FIXHD(141)                                                  CONVPP1.121    
      LEN_CFI2=FIXHD(143)                                                  CONVPP1.122    
      LEN_CFI3=FIXHD(145)                                                  CONVPP1.123    
      LEN1_LOOKUP=FIXHD(151)                                               CONVPP1.124    
      LEN2_LOOKUP=FIXHD(152)                                               CONVPP1.125    
      LEN_DATA=FIXHD(161)                                                  CONVPP1.126    
                                                                           CONVPP1.127    
                                                                           CONVPP1.128    
CL 3. Buffer in integer constants from dump                                CONVPP1.129    
                                                                           CONVPP1.130    
       CALL BUFFIN(NFTIN,INTHD,FIXHD(101),LEN_IO,A)                        CONVPP1.131    
                                                                           CONVPP1.132    
C Check for I/O errors                                                     CONVPP1.133    
      IF(A.NE.-1.0.OR.LEN_IO.NE.FIXHD(101))THEN                            CONVPP1.134    
        CALL IOERROR('buffer in of integer constants in input dump',       CONVPP1.135    
     *  A,LEN_IO,FIXHD(101))                                               CONVPP1.136    
      CALL ABORT                                                           CONVPP1.137    
      ENDIF                                                                CONVPP1.138    
                                                                           CONVPP1.139    
C Set missing data indicator to zero                                       CONVPP1.140    
      DO  I=1,FIXHD(101)                                                   CONVPP1.141    
        IF(INTHD(I).LT.0)INTHD(I)=0                                        CONVPP1.142    
      ENDDO                                                                CONVPP1.143    
                                                                           CONVPP1.144    
       ROW_LENGTH=INTHD(6)                                                 CONVPP1.145    
       P_ROWS=INTHD(7)                                                     CONVPP1.146    
       P_FIELD=ROW_LENGTH*P_ROWS                                           CONVPP1.147    
                                                                           AD311093.21     
CL Extract maximum field size from LOOKUP header                           AD311093.22     
      CALL FIND_MAX_FIELD_SIZE                                             AD311093.23     
     &     (NFTIN,FIXHD(151),FIXHD(152),FIXHD,MAX_FIELD_SIZE)              AD311093.24     
                                                                           CONVPP1.148    
C Calculate sizes of compressed and uncompressed ocean fields              UDG2F304.9      
      JOC_NO_SEAPTS=INTHD(11)                                              UDG2F304.10     
      IF(FIXHD(2).EQ.2)THEN                                                UDG2F304.11     
        LEN_OCFLD=INTHD(6)*INTHD(7)*INTHD(8)                               UDG2F304.12     
      ELSE                                                                 UDG2F304.13     
        LEN_OCFLD=0                                                        UDG2F304.14     
      ENDIF                                                                UDG2F304.15     
C Rewind file                                                              CONVPP1.149    
      CALL SETPOS(NFTIN,0,ICODE)                                           GTD0F400.53     
                                                                           CONVPP1.151    
      IF(FIXHD(2).EQ.1)THEN                                                UDG2F304.16     
                                                                           UDG2F304.17     
C Atmospheric dump                                                         UDG2F304.18     
      CALL ATMOS_CONVPP (LEN_FIXHD,LEN_INTHD,LEN_REALHD,                   UDG2F304.19     
                                                                           UDG2F304.20     
     &  LEN1_LEVDEPC,LEN2_LEVDEPC,LEN1_ROWDEPC,                            CONVPP1.155    
     &  LEN2_ROWDEPC,LEN1_COLDEPC,LEN2_COLDEPC,                            CONVPP1.156    
     &  LEN1_FLDDEPC,LEN2_FLDDEPC,LEN_EXTCNST,                             CONVPP1.157    
     &  LEN_DUMPHIST,LEN_CFI1,LEN_CFI2,LEN_CFI3,                           CONVPP1.158    
     &  LEN1_LOOKUP,LEN2_LOOKUP,LEN_DATA,P_FIELD,                          CONVPP1.159    
     &  NFTIN,MAX_FIELD_SIZE)                                              AD311093.25     
                                                                           UDG2F304.21     
      ELSEIF (FIXHD(2).EQ.2)THEN                                           UDG2F304.22     
                                                                           UDG2F304.23     
C Oceanic dump                                                             UDG2F304.24     
      CALL OCEAN_CONVPP (LEN_FIXHD,LEN_INTHD,LEN_REALHD,                   UDG2F304.25     
     &  LEN1_LEVDEPC,LEN2_LEVDEPC,LEN1_ROWDEPC,                            UDG2F304.26     
     &  LEN2_ROWDEPC,LEN1_COLDEPC,LEN2_COLDEPC,                            UDG2F304.27     
     &  LEN1_FLDDEPC,LEN2_FLDDEPC,LEN_EXTCNST,                             UDG2F304.28     
     &  LEN_DUMPHIST,LEN_CFI1,LEN_CFI2,LEN_CFI3,                           UDG2F304.29     
     &  LEN1_LOOKUP,LEN2_LOOKUP,LEN_DATA,P_FIELD,                          UDG2F304.30     
     &  NFTIN,MAX_FIELD_SIZE,JOC_NO_SEAPTS,LEN_OCFLD)                      UDG2F304.31     
      ENDIF                                                                UDG2F304.32     
                                                                           CONVPP1.161    
      STOP                                                                 CONVPP1.162    
      END                                                                  CONVPP1.163    
CLL  SUBROUTINE ATMOS_CONVPP -----------------------------------------     UDG2F304.33     
CLL                                                                        CONVPP1.165    
CLL Purpose: Converts UM file to PP format.                                CONVPP1.166    
CLL                                                                        CONVPP1.167    
CLL  Written by A. Dickinson                                               CONVPP1.168    
CLL                                                                        CONVPP1.169    
CLL  Model            Modification history from model version 3.0:         CONVPP1.170    
CLL version  Date                                                          CONVPP1.171    
CLL                                                                        CONVPP1.172    
CLL   3.4   23/09/94  New output lookup table array introduced because     UDG2F304.35     
CLL                   element 21 set to  0 for output file would need      UDG2F304.36     
CLL                   to be reset before attempting to read next record    UDG2F304.37     
CLL                   Routine renamed because separate routine for         UDG2F304.38     
CLL                   ocean dump introduced.                               UDG2F304.39     
CLL                   Author D.M.Goddard                                   UDG2F304.40     
!     4.1  18/06/96  Changes to cope with changes in STASH addressing      GDG0F401.467    
!                    Author D.M. Goddard.                                  GDG0F401.468    
CLL                                                                        UDG2F304.41     
CLL  Documentation: UM Doc Paper F5                                        CONVPP1.173    
CLL                                                                        CONVPP1.174    
CLL  System Tasks: F3,F4,F6                                                CONVPP1.175    
CLL                                                                        CONVPP1.176    
CLL  -----------------------------------------------------------------     CONVPP1.177    
C*L  Arguments:-------------------------------------------------------     CONVPP1.178    

       SUBROUTINE ATMOS_CONVPP                                              1,21UDG2F304.34     
     &  (LEN_FIXHD,LEN_INTHD,LEN_REALHD,                                   CONVPP1.180    
     &  LEN1_LEVDEPC,LEN2_LEVDEPC,LEN1_ROWDEPC,                            CONVPP1.181    
     &  LEN2_ROWDEPC,LEN1_COLDEPC,LEN2_COLDEPC,                            CONVPP1.182    
     &  LEN1_FLDDEPC,LEN2_FLDDEPC,LEN_EXTCNST,                             CONVPP1.183    
     &  LEN_DUMPHIST,LEN_CFI1,LEN_CFI2,LEN_CFI3,                           CONVPP1.184    
     &  LEN1_LOOKUP,LEN2_LOOKUP,LEN_DATA,P_FIELD,                          CONVPP1.185    
     &  NFTIN,MAX_FIELD_SIZE)                                              AD311093.26     
CL                                                                         CONVPP1.187    
CL                                                                         CONVPP1.188    
                                                                           CONVPP1.189    
      IMPLICIT NONE                                                        CONVPP1.190    
                                                                           CONVPP1.191    
      INTEGER                                                              CONVPP1.192    
                                                                           CONVPP1.193    
     & LEN_FIXHD    !IN Length of fixed length header on input file        CONVPP1.194    
     &,LEN_INTHD    !IN Length of integer header on input file             CONVPP1.195    
     &,LEN_REALHD   !IN Length of real header on input file                CONVPP1.196    
     &,LEN1_LEVDEPC !IN 1st dim of lev dependent consts on input file      CONVPP1.197    
     &,LEN2_LEVDEPC !IN 2nd dim of lev dependent consts on input file      CONVPP1.198    
     &,LEN1_ROWDEPC !IN 1st dim of row dependent consts on input file      CONVPP1.199    
     &,LEN2_ROWDEPC !IN 2nd dim of row dependent consts on input file      CONVPP1.200    
     &,LEN1_COLDEPC !IN 1st dim of col dependent consts on input file      CONVPP1.201    
     &,LEN2_COLDEPC !IN 2nd dim of col dependent consts on input file      CONVPP1.202    
     &,LEN1_FLDDEPC !IN 1st dim of field dependent consts on input fi      CONVPP1.203    
     &,LEN2_FLDDEPC !IN 2nd dim of field dependent consts on input fi      CONVPP1.204    
     &,LEN_EXTCNST  !IN Length of extra consts on input file               CONVPP1.205    
     &,LEN_DUMPHIST !IN Length of history header on input file             CONVPP1.206    
     &,LEN_CFI1     !IN Length of index1 on input file                     CONVPP1.207    
     &,LEN_CFI2     !IN Length of index2 on input file                     CONVPP1.208    
     &,LEN_CFI3     !IN Length of index3 on input file                     CONVPP1.209    
     &,LEN1_LOOKUP  !IN 1st dim of LOOKUP on input file                    CONVPP1.210    
     &,LEN2_LOOKUP  !IN 2nd dim of LOOKUP on input file                    CONVPP1.211    
     &,LEN_DATA     !IN Length of data on input file                       CONVPP1.212    
     &,P_FIELD      !IN No of p-points per level on input file             CONVPP1.213    
     &,MAX_FIELD_SIZE !Maximum field size on file                          AD311093.27     
                                                                           CONVPP1.214    
      INTEGER                                                              CONVPP1.215    
     & NFTIN                                                               CONVPP1.216    
                                                                           CONVPP1.217    
                                                                           CONVPP1.218    
C Local arrays:---------------------------------------------------------   CONVPP1.219    
      INTEGER                                                              CONVPP1.220    
     & FIXHD(LEN_FIXHD),                         !                         CONVPP1.221    
     & INTHD(LEN_INTHD),                         !\  integer               CONVPP1.222    
     & CFI1(LEN_CFI1+1),CFI2(LEN_CFI2+1),        ! > file headers          CONVPP1.223    
     & CFI3(LEN_CFI3+1),                         !/                        CONVPP1.224    
     & LOOKUP(LEN1_LOOKUP,LEN2_LOOKUP)           !                         CONVPP1.225    
     &,LOOKUP_OUT(LEN1_LOOKUP) ! Output lookup table                       UDG2F304.42     
                                                                           CONVPP1.226    
      REAL                                                                 CONVPP1.227    
     & REALHD(LEN_REALHD),                                                 CONVPP1.228    
     & LEVDEPC(1+LEN1_LEVDEPC*LEN2_LEVDEPC),     !                         CONVPP1.229    
     & ROWDEPC(1+LEN1_ROWDEPC*LEN2_ROWDEPC),     !                         CONVPP1.230    
     & COLDEPC(1+LEN1_COLDEPC*LEN2_COLDEPC),     !\  real                  CONVPP1.231    
     & FLDDEPC(1+LEN1_FLDDEPC*LEN2_FLDDEPC),     ! > file headers          CONVPP1.232    
     & EXTCNST(LEN_EXTCNST+1),                   !/                        CONVPP1.233    
     & DUMPHIST(LEN_DUMPHIST+1),                 !                         CONVPP1.234    
     & D1(MAX_FIELD_SIZE)  ! Data array used to read in each field         AD311093.28     
      REAL     D1_TMP(MAX_FIELD_SIZE)                                      UDG5F404.4      
                                                                           UDG5F404.5      
      LOGICAL  LAND_SEA_MASK(MAX_FIELD_SIZE)                               UDG5F404.6      
                                                                           CONVPP1.236    
C External subroutines called:------------------------------------------   CONVPP1.237    
      EXTERNAL ABORT,ABORT_IO,READHEAD,READFLDS,HDPPXRF,GETPPX,            UDG5F404.7      
     &         FROM_LAND_POINTS                                            UDG5F404.8      
C*----------------------------------------------------------------------   CONVPP1.239    
*CALL CSUBMODL                                                             GDG0F401.471    
*CALL CPPXREF                                                              GDG0F401.472    
*CALL PPXLOOK                                                              GDG0F401.473    
*CALL CSTASH                                                               GDG0F401.474    
C*----------------------------------------------------------------------   GDG0F401.475    
C*L  Local variables:---------------------------------------------------   CONVPP1.240    
                                                                           CONVPP1.241    
      INTEGER                                                              CONVPP1.242    
     & ICODE        ! Error return code from subroutines                   CONVPP1.243    
     &,START_BLOCK  ! READHEAD argument (not used)                         CONVPP1.244    
     &,I,J,K,L      ! Loop indices                                         CONVPP1.245    
      INTEGER  ROWNUMBER     ! Row number                                  UDG5F404.9      
      REAL     NROWS         ! Number of points north-south                UDG5F404.10     
      REAL     NCOLS         ! Number of points east-west                  UDG5F404.11     
      REAL     RMDI          ! Real missing data indicator                 UDG5F404.12     
                                                                           UDG5F404.13     
                                                                           CONVPP1.246    
      CHARACTER                                                            CONVPP1.247    
     & CMESSAGE*100 ! Character string returned if ICODE .ne. 0            CONVPP1.248    
     &,STRING*20    ! Format control for header printout                   CONVPP1.249    
      INTEGER NFT1,NFT2                                                    GDG0F401.476    
      PARAMETER (NFT1=22, NFT2=2)                                          GDG0F401.477    
C*----------------------------------------------------------------------   CONVPP1.250    
                                                                           CONVPP1.251    
CL 0. Read in PPXREF                                                       GDG0F401.478    
                                                                           GDG0F401.479    
      ppxRecs=1                                                            GDG0F401.480    
      RowNumber=0                                                          GDG0F401.481    
      cmessage = ' '                                                       GDW1F404.158    
      ICODE=0                                                              UDG9F404.45     
      CALL HDPPXRF(NFT1,'STASHmaster_A',ppxRecs,ICODE,CMESSAGE)            GDG0F401.482    
      IF(ICODE.GT.0)THEN                                                   UDG9F404.46     
        WRITE(6,*) 'Error reading STASHmaster_A'                           UDG9F404.47     
        WRITE(6,*) CMESSAGE                                                UDG9F404.48     
        CALL ABORT                                                         UDG9F404.49     
      END IF                                                               UDG9F404.50     
      CALL HDPPXRF(NFT1,'STASHmaster_O',ppxRecs,ICODE,CMESSAGE)            GDG0F401.483    
      IF(ICODE.GT.0)THEN                                                   UDG9F404.51     
        WRITE(6,*) 'Error reading STASHmaster_O'                           UDG9F404.52     
        WRITE(6,*) CMESSAGE                                                UDG9F404.53     
        CALL ABORT                                                         UDG9F404.54     
      END IF                                                               UDG9F404.55     
      CALL HDPPXRF(NFT1,'STASHmaster_S',ppxRecs,ICODE,CMESSAGE)            GDG0F401.484    
      IF(ICODE.GT.0)THEN                                                   UDG9F404.56     
        WRITE(6,*) 'Error reading STASHmaster_S'                           UDG9F404.57     
        WRITE(6,*) CMESSAGE                                                UDG9F404.58     
        CALL ABORT                                                         UDG9F404.59     
      END IF                                                               UDG9F404.60     
      CALL HDPPXRF(NFT1,'STASHmaster_W',ppxRecs,ICODE,CMESSAGE)            GDG0F401.485    
      IF(ICODE.GT.0)THEN                                                   GDW1F404.159    
        WRITE(6,*) 'Error reading STASHmaster_W'                           UDG9F404.61     
        WRITE(6,*) CMESSAGE                                                GDG0F401.487    
        CALL ABORT                                                         GDG0F401.488    
      ENDIF                                                                GDG0F401.489    
                                                                           GDG0F401.490    
      CALL GETPPX(NFT1,NFT2,'STASHmaster_A',RowNumber,                     GDG0F401.491    
*CALL ARGPPX                                                               GDG0F401.492    
     &           ICODE,CMESSAGE)                                           GDG0F401.493    
      CALL GETPPX(NFT1,NFT2,'STASHmaster_O',RowNumber,                     GDG0F401.494    
*CALL ARGPPX                                                               GDG0F401.495    
     &           ICODE,CMESSAGE)                                           GDG0F401.496    
      CALL GETPPX(NFT1,NFT2,'STASHmaster_S',RowNumber,                     GDG0F401.497    
*CALL ARGPPX                                                               GDG0F401.498    
     &           ICODE,CMESSAGE)                                           GDG0F401.499    
      IF(ICODE.NE.0)THEN                                                   GDG0F401.500    
        WRITE(6,*) CMESSAGE                                                GDG0F401.501    
        CALL ABORT                                                         GDG0F401.502    
      ENDIF                                                                GDG0F401.503    
                                                                           GDG0F401.504    
!User STASHmaster                                                          GDG0F401.505    
      CALL HDPPXRF(0,' ',ppxRecs,ICODE,CMESSAGE)                           GDG0F401.506    
      IF(ICODE.NE.0)THEN                                                   GDG0F401.507    
        WRITE(6,*) CMESSAGE                                                GDG0F401.508    
        CALL ABORT                                                         GDG0F401.509    
      ENDIF                                                                GDG0F401.510    
                                                                           GDG0F401.511    
      CALL GETPPX(0,NFT2,' ',RowNumber,                                    GDG0F401.512    
*CALL ARGPPX                                                               GDG0F401.513    
     &            ICODE,CMESSAGE)                                          GDG0F401.514    
      IF(ICODE.NE.0)THEN                                                   GDG0F401.515    
        WRITE(6,*) CMESSAGE                                                GDG0F401.516    
        CALL ABORT                                                         GDG0F401.517    
      ENDIF                                                                GDG0F401.518    
                                                                           GDG0F401.519    
CL 1. Read in file header                                                  CONVPP1.252    
                                                                           CONVPP1.253    
      CALL READHEAD(NFTIN,FIXHD,LEN_FIXHD,                                 CONVPP1.254    
     &                INTHD,LEN_INTHD,                                     CONVPP1.255    
     &                REALHD,LEN_REALHD,                                   CONVPP1.256    
     &                LEVDEPC,LEN1_LEVDEPC,LEN2_LEVDEPC,                   CONVPP1.257    
     &                ROWDEPC,LEN1_ROWDEPC,LEN2_ROWDEPC,                   CONVPP1.258    
     &                COLDEPC,LEN1_COLDEPC,LEN2_COLDEPC,                   CONVPP1.259    
     &                FLDDEPC,LEN1_FLDDEPC,LEN2_FLDDEPC,                   CONVPP1.260    
     &                EXTCNST,LEN_EXTCNST,                                 CONVPP1.261    
     &                DUMPHIST,LEN_DUMPHIST,                               CONVPP1.262    
     &                CFI1,LEN_CFI1,                                       CONVPP1.263    
     &                CFI2,LEN_CFI2,                                       CONVPP1.264    
     &                CFI3,LEN_CFI3,                                       CONVPP1.265    
     &                LOOKUP,LEN1_LOOKUP,LEN2_LOOKUP,                      CONVPP1.266    
     &                LEN_DATA,                                            CONVPP1.267    
*CALL ARGPPX                                                               GDG0F401.520    
     &                START_BLOCK,ICODE,CMESSAGE)                          CONVPP1.268    
                                                                           CONVPP1.269    
      IF(ICODE.NE.0)THEN                                                   CONVPP1.270    
        WRITE(6,*)CMESSAGE,ICODE                                           CONVPP1.271    
        CALL ABORT                                                         CONVPP1.272    
      ENDIF                                                                CONVPP1.273    
                                                                           CONVPP1.274    
      NROWS        = INTHD(7)                                              UDG5F404.14     
      NCOLS        = INTHD(6)                                              UDG5F404.15     
      RMDI         = REALHD(29)                                            UDG5F404.16     
                                                                           UDG5F404.17     
      DO I=1,LEN2_LOOKUP                                                   UDG5F404.18     
        IF(LOOKUP(42,I).EQ.30)THEN                                         UDG5F404.19     
          CALL READFLDS(NFTIN,1,I,LOOKUP,LEN1_LOOKUP,                      UDG5F404.20     
     &                  LAND_SEA_MASK,MAX_FIELD_SIZE,FIXHD,                UDG5F404.21     
*CALL ARGPPX                                                               UDG5F404.22     
     &                  ICODE,CMESSAGE)                                    UDG5F404.23     
          IF(ICODE.NE.0)CALL ABORT_IO('CONVPP',CMESSAGE,ICODE,NFTIN)       UDG5F404.24     
        END IF                                                             UDG5F404.25     
      END DO                                                               UDG5F404.26     
                                                                           CONVPP1.276    
CL  Print out individual fields                                            CONVPP1.277    
      DO I=1,LEN2_LOOKUP                                                   CONVPP1.278    
        IF(LOOKUP(1,I).EQ.-99)GOTO 100                                     CONVPP1.279    
                                                                           CONVPP1.280    
C Fill output lookup table                                                 UDG2F304.43     
        DO K=1,LEN1_LOOKUP                                                 UDG2F304.44     
          LOOKUP_OUT(K)=LOOKUP(K,I)                                        UDG2F304.45     
        ENDDO                                                              UDG2F304.46     
                                                                           UDG2F304.47     
        CALL READFLDS(NFTIN,1,I,LOOKUP,LEN1_LOOKUP,                        GDG0F401.521    
     &                D1,MAX_FIELD_SIZE,FIXHD,                             GDG0F401.522    
*CALL ARGPPX                                                               GDG0F401.523    
     &                ICODE,CMESSAGE)                                      GDG0F401.524    
                                                                           CONVPP1.284    
         LOOKUP_OUT(21)=MOD(LOOKUP_OUT(21),1000)                           UDG1F405.36     
      LOOKUP_OUT(21)=MOD(LOOKUP_OUT(21),1000)                              UDG5F404.27     
      IF((LOOKUP_OUT(21)/10)*10.EQ.120)THEN                                UDG5F404.28     
!Data compressed on to land points.                                        UDG5F404.29     
!Copy data to temporary array                                              UDG5F404.30     
         DO K=1,LOOKUP_OUT(15)                                             UDG5F404.31     
           D1_TMP(K)=D1(K)                                                 UDG5F404.32     
        END DO                                                             UDG5F404.33     
!Set unpacked array to RMDI                                                UDG5F404.34     
         DO K=1,NROWS*NCOLS                                                UDG5F404.35     
           D1(K)=RMDI                                                      UDG5F404.36     
         END DO                                                            UDG5F404.37     
                                                                           UDG5F404.38     
!Uncompress data                                                           UDG5F404.39     
         CALL FROM_LAND_POINTS(D1,D1_TMP,LAND_SEA_MASK,                    UDG5F404.40     
     &                         MAX_FIELD_SIZE,LOOKUP_OUT(15))              UDG5F404.41     
         LOOKUP_OUT(15)=NROWS*NCOLS                                        UDG5F404.42     
         LOOKUP_OUT(18)=NROWS                                              UDG5F404.43     
         LOOKUP_OUT(19)=NCOLS                                              UDG5F404.44     
         LOOKUP_OUT(21)=0                                                  UDG5F404.45     
       END IF                                                              UDG5F404.46     
        WRITE(10)(LOOKUP_OUT(K),K=1,64)                                    UDG2F304.49     
        WRITE(10) (D1(K),K=1,LOOKUP_OUT(15))                               UDG2F304.50     
      ENDDO                                                                CONVPP1.288    
                                                                           CONVPP1.289    
 100  CONTINUE                                                             CONVPP1.290    
      WRITE(6,*)I-1,' pp fields written out'                               CONVPP1.291    
                                                                           CONVPP1.292    
      RETURN                                                               CONVPP1.293    
      END                                                                  CONVPP1.294    
CLL  SUBROUTINE OCEAN_CONVPP-----------------------------------------      UDG2F304.51     
CLL                                                                        UDG2F304.52     
CLL Purpose: Converts UM ocean file to PP format.                          UDG2F304.53     
CLL                                                                        UDG2F304.54     
CLL  Written by D.M. Goddard                                               UDG2F304.55     
CLL                                                                        UDG2F304.56     
CLL  Model            Modification history from model version 3.4:         UDG2F304.57     
CLL version  Date                                                          UDG2F304.58     
CLL                                                                        UDG2F304.59     
CLL   3.4   23/09/94  New routine at version 3.4                           UDG2F304.60     
CLL                                                                        UDG2F304.61     
CLL  Documentation: UM Doc Paper F5                                        UDG2F304.62     
CLL                                                                        UDG2F304.63     
CLL  System Tasks: F3,F4,F6                                                UDG2F304.64     
CLL                                                                        UDG2F304.65     
CLL  -----------------------------------------------------------------     UDG2F304.66     
C*L  Arguments:-------------------------------------------------------     UDG2F304.67     

      SUBROUTINE OCEAN_CONVPP                                               1,22UDG2F304.68     
     &  (LEN_FIXHD,LEN_INTHD,LEN_REALHD,                                   UDG2F304.69     
     &  LEN1_LEVDEPC,LEN2_LEVDEPC,LEN1_ROWDEPC,                            UDG2F304.70     
     &  LEN2_ROWDEPC,LEN1_COLDEPC,LEN2_COLDEPC,                            UDG2F304.71     
     &  LEN1_FLDDEPC,LEN2_FLDDEPC,LEN_EXTCNST,                             UDG2F304.72     
     &  LEN_DUMPHIST,LEN_CFI1,LEN_CFI2,LEN_CFI3,                           UDG2F304.73     
     &  LEN1_LOOKUP,LEN2_LOOKUP,LEN_DATA,P_FIELD,                          UDG2F304.74     
     &  NFTIN,MAX_FIELD_SIZE,JOC_NO_SEAPTS,LEN_OCFLD)                      UDG2F304.75     
CL                                                                         UDG2F304.76     
CL                                                                         UDG2F304.77     
                                                                           UDG2F304.78     
      IMPLICIT NONE                                                        UDG2F304.79     
                                                                           UDG2F304.80     
      INTEGER                                                              UDG2F304.81     
                                                                           UDG2F304.82     
     & LEN_FIXHD    !IN Length of fixed length header on input file        UDG2F304.83     
     &,LEN_INTHD    !IN Length of integer header on input file             UDG2F304.84     
     &,LEN_REALHD   !IN Length of real header on input file                UDG2F304.85     
     &,LEN1_LEVDEPC !IN 1st dim of lev dependent consts on input file      UDG2F304.86     
     &,LEN2_LEVDEPC !IN 2nd dim of lev dependent consts on input file      UDG2F304.87     
     &,LEN1_ROWDEPC !IN 1st dim of row dependent consts on input file      UDG2F304.88     
     &,LEN2_ROWDEPC !IN 2nd dim of row dependent consts on input file      UDG2F304.89     
     &,LEN1_COLDEPC !IN 1st dim of col dependent consts on input file      UDG2F304.90     
     &,LEN2_COLDEPC !IN 2nd dim of col dependent consts on input file      UDG2F304.91     
     &,LEN1_FLDDEPC !IN 1st dim of field dependent consts on input fi      UDG2F304.92     
     &,LEN2_FLDDEPC !IN 2nd dim of field dependent consts on input fi      UDG2F304.93     
     &,LEN_EXTCNST    !IN Length of extra consts on input file             UDG2F304.94     
     &,LEN_DUMPHIST   !IN Length of history header on input file           UDG2F304.95     
     &,LEN_CFI1       !IN Length of index1 on input file                   UDG2F304.96     
     &,LEN_CFI2       !IN Length of index2 on input file                   UDG2F304.97     
     &,LEN_CFI3       !IN Length of index3 on input file                   UDG2F304.98     
     &,LEN1_LOOKUP    !IN 1st dim of LOOKUP on input file                  UDG2F304.99     
     &,LEN2_LOOKUP    !IN 2nd dim of LOOKUP on input file                  UDG2F304.100    
     &,LEN_DATA       !IN Length of data on input file                     UDG2F304.101    
     &,P_FIELD        !IN No of p-points per level on input file           UDG2F304.102    
     &,MAX_FIELD_SIZE !IN Maximum field size on file                       UDG2F304.103    
     &,JOC_NO_SEAPTS  !IN Number of points in compressed array             UDG2F304.104    
     &,LEN_OCFLD      !IN Length of uncompressed ocean field               UDG2F304.105    
                                                                           UDG2F304.106    
      INTEGER                                                              UDG2F304.107    
     & NFTIN                                                               UDG2F304.108    
                                                                           UDG2F304.109    
                                                                           UDG2F304.110    
C Local arrays:---------------------------------------------------------   UDG2F304.111    
      INTEGER                                                              UDG2F304.112    
     & FIXHD(LEN_FIXHD),                         !                         UDG2F304.113    
     & INTHD(LEN_INTHD),                         !\  integer               UDG2F304.114    
     & CFI1(LEN_CFI1+1),CFI2(LEN_CFI2+1),        ! > file headers          UDG2F304.115    
     & CFI3(LEN_CFI3+1),                         !/                        UDG2F304.116    
     & LOOKUP(LEN1_LOOKUP,LEN2_LOOKUP)           !                         UDG2F304.117    
     &,LOOKUP_OUT(LEN1_LOOKUP) ! Output lookup table                       UDG2F304.118    
                                                                           UDG2F304.119    
      REAL                                                                 UDG2F304.120    
     & REALHD(LEN_REALHD),                                                 UDG2F304.121    
     & LEVDEPC(1+LEN1_LEVDEPC*LEN2_LEVDEPC),     !                         UDG2F304.122    
     & ROWDEPC(1+LEN1_ROWDEPC*LEN2_ROWDEPC),     !                         UDG2F304.123    
     & COLDEPC(1+LEN1_COLDEPC*LEN2_COLDEPC),     !\  real                  UDG2F304.124    
     & FLDDEPC(1+LEN1_FLDDEPC*LEN2_FLDDEPC),     ! > file headers          UDG2F304.125    
     & EXTCNST(LEN_EXTCNST+1),                   !/                        UDG2F304.126    
     & DUMPHIST(LEN_DUMPHIST+1),                 !                         UDG2F304.127    
     & D1(MAX_FIELD_SIZE), ! Array used to read in non-compressed fields   UDG2F304.128    
     & E1(MAX_FIELD_SIZE), ! Array used to read in non-compressed fields   UDG5F404.55     
                           ! without wrap points                           UDG5F404.56     
     & C1(JOC_NO_SEAPTS),  ! Array used to read in compressed fields       UDG2F304.129    
     & U1(LEN_OCFLD)       ! Array used to hold  uncompressed fields       UDG2F304.130    
                                                                           UDG2F304.131    
                                                                           UDG2F304.132    
C External subroutines called:------------------------------------------   UDG2F304.133    
       EXTERNAL ABORT,ABORT_IO,READHEAD,READFLDS,HDPPXRF,GETPPX,UNPACK     GDG0F401.525    
C*----------------------------------------------------------------------   UDG2F304.135    
*CALL CSUBMODL                                                             GDG0F401.526    
*CALL CPPXREF                                                              GDG0F401.527    
*CALL PPXLOOK                                                              GDG0F401.528    
*CALL CSTASH                                                               GDG0F401.529    
C*----------------------------------------------------------------------   GDG0F401.530    
C*L  Local variables:---------------------------------------------------   UDG2F304.136    
                                                                           UDG2F304.137    
      INTEGER                                                              UDG2F304.138    
     & ICODE         ! Error return code from subroutines                  UDG2F304.139    
     &,START_BLOCK   ! READHEAD argument (not used)                        UDG2F304.140    
     &,I,J,K,L       ! Loop indices                                        UDG2F304.141    
     &,IJ_IN,IJ_OUT  ! More loop indices                                   UDG5F404.57     
     &,NROWS         ! Number of points north-south                        UDG2F304.142    
     &,NROWS_FIELD   ! Number of rows in a field                           UDG5F404.58     
     &,NCOLS_IN      ! Number of points east-west                          UDG5F404.59     
     &,NCOLS_OUT     ! Number of points east-west for pp fields            UDG5F404.60     
     &,NLEVS         ! Number of points in vertical                        UDG2F304.144    
     &,NT            ! Number of tracers                                   UDG2F304.145    
     &,NCOMP         ! Number of compressed fields                         UDG2F304.147    
     &,RECNUM        ! Record number of field in lookup table              UDG2F304.148    
     &,POSIN         ! Start position of field within C1                   UDG2F304.149    
     &,POSU1         ! Start position of field within U1                   UDG5F404.61     
     &,FIELD_CODE    ! field code for this field                           UDG5F404.62     
     &,LBPACK        ! packing indicator from lookup table                 UDG5F404.63     
                                                                           UDG2F304.151    
      CHARACTER                                                            UDG2F304.152    
     & CMESSAGE*100 ! Character string returned if ICODE .ne. 0            UDG2F304.153    
     &,STRING*20    ! Format control for header printout                   UDG2F304.154    
                                                                           UDG2F304.155    
      REAL                                                                 UDG2F304.156    
     & RMDI         ! Real missing data indicator                          UDG2F304.157    
                                                                           UDG2F304.158    
      LOGICAL                                                              UDG5F404.64     
     & LL_CYCLIC_IN    ! T => cyclic ; F => not cyclic                     UDG5F404.65     
                                                                           UDG5F404.66     
      INTEGER RowNumber                                                    GDG0F401.531    
                                                                           GDG0F401.532    
      INTEGER NFT1,NFT2                                                    GDG0F401.533    
      PARAMETER (NFT1=22, NFT2=2)                                          GDG0F401.534    
                                                                           GDG0F401.535    
C*----------------------------------------------------------------------   UDG2F304.159    
                                                                           UDG2F304.160    
CL 0. Read in PPXREF                                                       GDG0F401.536    
                                                                           GDG0F401.537    
      ppxRecs=1                                                            GDG0F401.538    
      RowNumber=0                                                          GDG0F401.539    
      CMESSAGE=''                                                          UDG9F404.62     
      ICODE=0                                                              UDG9F404.63     
      CALL HDPPXRF(NFT1,'STASHmaster_A',ppxRecs,ICODE,CMESSAGE)            GDG0F401.540    
      IF(ICODE.GT.0)THEN                                                   UDG9F404.64     
        WRITE(6,*) 'Error reading STASHmaster_A'                           UDG9F404.65     
        WRITE(6,*) CMESSAGE                                                UDG9F404.66     
        CALL ABORT                                                         UDG9F404.67     
      END IF                                                               UDG9F404.68     
      CALL HDPPXRF(NFT1,'STASHmaster_O',ppxRecs,ICODE,CMESSAGE)            GDG0F401.541    
      IF(ICODE.GT.0)THEN                                                   UDG9F404.69     
        WRITE(6,*) 'Error reading STASHmaster_O'                           UDG9F404.70     
        WRITE(6,*) CMESSAGE                                                UDG9F404.71     
        CALL ABORT                                                         UDG9F404.72     
      END IF                                                               UDG9F404.73     
      CALL HDPPXRF(NFT1,'STASHmaster_S',ppxRecs,ICODE,CMESSAGE)            GDG0F401.542    
      IF(ICODE.GT.0)THEN                                                   UDG9F404.74     
        WRITE(6,*) 'Error reading STASHmaster_S'                           UDG9F404.75     
        WRITE(6,*) CMESSAGE                                                UDG9F404.76     
        CALL ABORT                                                         UDG9F404.77     
      END IF                                                               UDG9F404.78     
      CALL HDPPXRF(NFT1,'STASHmaster_W',ppxRecs,ICODE,CMESSAGE)            GDG0F401.543    
      IF(ICODE.NE.0)THEN                                                   GDG0F401.544    
        WRITE(6,*) 'Error reading STASHmaster_W'                           UDG9F404.79     
        WRITE(6,*) CMESSAGE                                                GDG0F401.545    
        CALL ABORT                                                         GDG0F401.546    
      ENDIF                                                                GDG0F401.547    
                                                                           GDG0F401.548    
      CALL GETPPX(NFT1,NFT2,'STASHmaster_A',RowNumber,                     GDG0F401.549    
*CALL ARGPPX                                                               GDG0F401.550    
     &            ICODE,CMESSAGE)                                          GDG0F401.551    
      CALL GETPPX(NFT1,NFT2,'STASHmaster_O',RowNumber,                     GDG0F401.552    
*CALL ARGPPX                                                               GDG0F401.553    
     &            ICODE,CMESSAGE)                                          GDG0F401.554    
      CALL GETPPX(NFT1,NFT2,'STASHmaster_S',RowNumber,                     GDG0F401.555    
*CALL ARGPPX                                                               GDG0F401.556    
     &            ICODE,CMESSAGE)                                          GDG0F401.557    
      CALL GETPPX(NFT1,NFT2,'STASHmaster_W',RowNumber,                     GDG0F401.558    
*CALL ARGPPX                                                               GDG0F401.559    
     &            ICODE,CMESSAGE)                                          GDG0F401.560    
      IF(ICODE.NE.0)THEN                                                   GDG0F401.561    
        WRITE(6,*) CMESSAGE                                                GDG0F401.562    
        CALL ABORT                                                         GDG0F401.563    
      ENDIF                                                                GDG0F401.564    
                                                                           GDG0F401.565    
!User STASHmaster                                                          GDG0F401.566    
      CALL HDPPXRF(0,' ',ppxRecs,ICODE,CMESSAGE)                           GDG0F401.567    
      IF(ICODE.NE.0)THEN                                                   GDG0F401.568    
        WRITE(6,*) CMESSAGE                                                GDG0F401.569    
        CALL ABORT                                                         GDG0F401.570    
      ENDIF                                                                GDG0F401.571    
                                                                           GDG0F401.572    
      CALL GETPPX(0,NFT2,' ',RowNumber,                                    GDG0F401.573    
*CALL ARGPPX                                                               GDG0F401.574    
     &            ICODE,CMESSAGE)                                          GDG0F401.575    
      IF(ICODE.NE.0)THEN                                                   GDG0F401.576    
        WRITE(6,*) CMESSAGE                                                GDG0F401.577    
        CALL ABORT                                                         GDG0F401.578    
      ENDIF                                                                GDG0F401.579    
                                                                           GDG0F401.580    
CL 1. Read in file header                                                  UDG2F304.161    
                                                                           UDG2F304.162    
      CALL READHEAD(NFTIN,FIXHD,LEN_FIXHD,                                 UDG2F304.163    
     &                INTHD,LEN_INTHD,                                     UDG2F304.164    
     &                REALHD,LEN_REALHD,                                   UDG2F304.165    
     &                LEVDEPC,LEN1_LEVDEPC,LEN2_LEVDEPC,                   UDG2F304.166    
     &                ROWDEPC,LEN1_ROWDEPC,LEN2_ROWDEPC,                   UDG2F304.167    
     &                COLDEPC,LEN1_COLDEPC,LEN2_COLDEPC,                   UDG2F304.168    
     &                FLDDEPC,LEN1_FLDDEPC,LEN2_FLDDEPC,                   UDG2F304.169    
     &                EXTCNST,LEN_EXTCNST,                                 UDG2F304.170    
     &                DUMPHIST,LEN_DUMPHIST,                               UDG2F304.171    
     &                CFI1,LEN_CFI1,                                       UDG2F304.172    
     &                CFI2,LEN_CFI2,                                       UDG2F304.173    
     &                CFI3,LEN_CFI3,                                       UDG2F304.174    
     &                LOOKUP,LEN1_LOOKUP,LEN2_LOOKUP,                      UDG2F304.175    
     &                LEN_DATA,                                            UDG2F304.176    
*CALL ARGPPX                                                               UDG5F404.47     
     &                START_BLOCK,ICODE,CMESSAGE)                          UDG2F304.177    
                                                                           UDG2F304.178    
      IF(ICODE.NE.0)THEN                                                   UDG2F304.179    
        WRITE(6,*)CMESSAGE,ICODE                                           UDG2F304.180    
        CALL ABORT                                                         UDG2F304.181    
      ENDIF                                                                UDG2F304.182    
                                                                           UDG2F304.183    
                                                                           UDG5F404.67     
      NROWS        = INTHD(7)                                              UDG2F304.185    
      NCOLS_IN     = INTHD(6)                                              UDG5F404.68     
      LBPACK       = 21                                                    UDG5F404.69     
      NLEVS        = INTHD(8)                                              UDG2F304.187    
      RMDI         = REALHD(29)                                            UDG2F304.188    
      NT           = INTHD(14)                                             UDG2F304.189    
                                                                           UDG2F304.191    
! Determine whether input data is cyclic and number of columns to output   UDG5F404.70     
                                                                           UDG5F404.71     
      IF ( MOD ( FIXHD(4), 100 ) .NE. 3 ) THEN                             UDG5F404.72     
        LL_CYCLIC_IN = .TRUE.                                              UDG5F404.73     
      ELSE                                                                 UDG5F404.74     
        LL_CYCLIC_IN = .FALSE.                                             UDG5F404.75     
      ENDIF                                                                UDG5F404.76     
                                                                           UDG5F404.77     
CL 2. Read in compressed data                                              UDG2F304.192    
                                                                           UDG5F404.78     
      RECNUM=1                                                             UDG2F304.193    
                                                                           UDG5F404.79     
C Decide whether there are any compressed fields and on number of          UDG5F404.80     
C compressed fields. Use LBPACK to work out whether the first field        UDG5F404.81     
C contains sea points only.                                                UDG5F404.82     
                                                                           UDG5F404.83     
      IF ( MOD(LOOKUP(LBPACK,1)/10,10) .EQ. 0) THEN                        UDG5F404.84     
                                                                           UDG5F404.85     
       NCOMP = 0                                                           UDG5F404.86     
                                                                           UDG5F404.87     
      ELSE                                                                 UDG5F404.88     
                                                                           UDG5F404.89     
       NCOMP = NT + 2                                                      UDG5F404.90     
                                                                           UDG5F404.91     
      DO L=1,NCOMP                                                         UDG2F304.194    
                                                                           UDG2F304.195    
C Loop over levels storing all levels in one 1-D array                     UDG2F304.196    
        POSIN=1                                                            UDG2F304.197    
        DO K=1,NLEVS                                                       UDG2F304.198    
                                                                           UDG2F304.199    
          CALL READFLDS(NFTIN,1,RECNUM,LOOKUP,LEN1_LOOKUP,C1(POSIN),       UDG2F304.200    
     &                  MAX_FIELD_SIZE,FIXHD,                              GDG0F401.581    
*CALL ARGPPX                                                               GDG0F401.582    
     &                  ICODE,CMESSAGE)                                    GDG0F401.583    
          IF(ICODE.NE.0)CALL ABORT_IO('CONVPP',CMESSAGE,ICODE,NFTIN)       UDG2F304.202    
          POSIN=POSIN+LOOKUP(15,K+(L-1)*NLEVS)                             UDG2F304.203    
          RECNUM=RECNUM+1                                                  UDG2F304.204    
                                                                           UDG2F304.205    
        ENDDO                                                              UDG2F304.206    
                                                                           UDG2F304.207    
CL 3. Uncompress 3-D field                                                 UDG2F304.208    
        CALL UNPACK(1,NROWS,1,NLEVS,NROWS,NLEVS,NCOLS_IN,NROWS,NLEVS,      UDG5F404.92     
     &          CFI1,CFI2,LEN_CFI1,CFI3,JOC_NO_SEAPTS,                     UDG2F304.210    
     &          C1,U1,RMDI,LL_CYCLIC_IN)                                   UDG5F404.93     
                                                                           UDG2F304.212    
CL 4. Output data level by level                                           UDG2F304.213    
        DO K=1,NLEVS                                                       UDG5F404.94     
                                                                           UDG2F304.215    
C Fill output lookup table                                                 UDG2F304.216    
          DO I=1,LEN1_LOOKUP                                               UDG5F404.95     
            LOOKUP_OUT(I)=LOOKUP(I,K+(L-1)*NLEVS)                          UDG5F404.96     
          ENDDO                                                            UDG2F304.220    
                                                                           UDG5F404.97     
          FIELD_CODE = LOOKUP_OUT(23)                                      UDG5F404.98     
                                                                           UDG5F404.99     
          IF (  FIELD_CODE .GT. 600 .AND. FIELD_CODE .LT. 700) THEN        UDG5F404.100    
            NROWS_FIELD = NROWS                                            UDG5F404.101    
          ELSE IF ( FIELD_CODE .GT. 699 .AND. FIELD_CODE .LT. 800 ) THEN   UDG5F404.102    
            NROWS_FIELD = NROWS - 1                                        UDG5F404.103    
          ELSE                                                             UDG5F404.104    
            write(6,*) ' unknown field code : exiting '                    UDG5F404.105    
            go to 9999                                                     UDG5F404.106    
          END IF                                                           UDG5F404.107    
                                                                           UDG5F404.108    
! Determine number of columns to output                                    UDG5F404.109    
                                                                           UDG5F404.110    
          IF ( LL_CYCLIC_IN ) THEN                                         UDG5F404.111    
            NCOLS_OUT = NCOLS_IN - 2                                       UDG5F404.112    
          ELSE                                                             UDG5F404.113    
            NCOLS_OUT = NCOLS_IN                                           UDG5F404.114    
          ENDIF                                                            UDG5F404.115    
                                                                           UDG5F404.116    
          LOOKUP_OUT(15)=NROWS_FIELD*NCOLS_OUT                             UDG5F404.117    
          LOOKUP_OUT(18)=NROWS_FIELD                                       UDG5F404.118    
          LOOKUP_OUT(19)=NCOLS_OUT                                         UDG5F404.119    
          LOOKUP_OUT(21)=0                                                 UDG2F304.224    
          WRITE(10)(LOOKUP_OUT(I),I=1,64)                                  UDG5F404.120    
                                                                           UDG2F304.227    
          POSU1=(K-1)*NROWS*NCOLS_IN                                       UDG5F404.121    
          DO J=1,NROWS_FIELD                                               UDG5F404.122    
            DO I=1,NCOLS_OUT                                               UDG5F404.123    
              IJ_IN = I + (J-1) * NCOLS_IN                                 UDG5F404.124    
              IJ_OUT   = I + (J-1) * NCOLS_OUT                             UDG5F404.125    
              E1(IJ_OUT) = U1(IJ_IN+POSU1)                                 UDG5F404.126    
        ENDDO                                                              UDG2F304.228    
          ENDDO                                                            UDG5F404.127    
                                                                           UDG2F304.229    
                                                                           UDG5F404.128    
          WRITE(10) (E1(I),I=1,NROWS_FIELD*NCOLS_OUT)                      UDG5F404.129    
                                                                           UDG5F404.130    
      ENDDO                                                                UDG2F304.230    
                                                                           UDG2F304.231    
      ENDDO                                                                UDG5F404.131    
                                                                           UDG5F404.132    
      END IF  ! LBPACK                                                     UDG5F404.133    
                                                                           UDG5F404.134    
                                                                           UDG5F404.135    
CL 5.  Now processing non compressed fields                                UDG2F304.232    
C  Print out individual fields                                             UDG2F304.233    
      DO L=RECNUM,LEN2_LOOKUP                                              UDG5F404.136    
                                                                           UDG2F304.235    
        IF(LOOKUP(1,L).EQ.-99)GOTO 100                                     UDG5F404.137    
        CALL READFLDS(NFTIN,1,L,LOOKUP,LEN1_LOOKUP,                        UDG5F404.138    
     &                D1,MAX_FIELD_SIZE,FIXHD,                             GDG0F401.584    
*CALL ARGPPX                                                               GDG0F401.585    
     &                ICODE,CMESSAGE)                                      GDG0F401.586    
        IF(ICODE.NE.0)CALL ABORT_IO('CONVPP',CMESSAGE,ICODE,NFTIN)         UDG2F304.239    
        IF(FIXHD(3).NE.3)THEN                                              UDG5F404.139    
                                                                           UDG5F404.140    
! Take off the extra columns if the dump is cyclic using the E1 array      UDG5F404.141    
                                                                           UDG5F404.142    
          IF ( LL_CYCLIC_IN ) THEN                                         UDG5F404.143    
            NCOLS_OUT = NCOLS_IN - 2                                       UDG5F404.144    
          ELSE                                                             UDG5F404.145    
            NCOLS_OUT = NCOLS_IN                                           UDG5F404.146    
          ENDIF                                                            UDG5F404.147    
                                                                           UDG5F404.148    
          DO J=1,NROWS                                                     UDG5F404.149    
            DO I=1,NCOLS_OUT                                               UDG5F404.150    
              IJ_IN = I + (J-1) * NCOLS_IN                                 UDG5F404.151    
              IJ_OUT   = I + (J-1) * NCOLS_OUT                             UDG5F404.152    
              E1(IJ_OUT) = D1(IJ_IN)                                       UDG5F404.153    
            ENDDO                                                          UDG5F404.154    
          ENDDO                                                            UDG5F404.155    
                                                                           UDG5F404.156    
        ELSE                                                               UDG5F404.157    
                                                                           UDG5F404.158    
! Fieldsfile. NO cyclic columns                                            UDG5F404.159    
                                                                           UDG5F404.160    
          DO I=1,LOOKUP(15,L)                                              UDG5F404.161    
            E1(I) = D1(I)                                                  UDG5F404.162    
          ENDDO                                                            UDG5F404.163    
                                                                           UDG5F404.164    
        ENDIF                                                              UDG5F404.165    
        DO K=1,LEN1_LOOKUP                                                 UDG2F304.240    
          LOOKUP_OUT(K)=LOOKUP(K,L)                                        UDG5F404.166    
        ENDDO                                                              UDG2F304.242    
                                                                           UDG5F404.167    
        IF(FIXHD(3).NE.3)THEN                                              UDG5F404.168    
          LOOKUP_OUT(15)=NROWS*NCOLS_OUT                                   UDG5F404.169    
          LOOKUP_OUT(19)=NCOLS_OUT                                         UDG5F404.170    
        ENDIF                                                              UDG5F404.171    
        LOOKUP_OUT(21)=MOD(LOOKUP_OUT(21),1000)                            UDG5F404.172    
        WRITE(10)(LOOKUP_OUT(K),K=1,64)                                    UDG2F304.244    
        WRITE(10) (E1(K),K=1,LOOKUP_OUT(15))                               UDG5F404.173    
                                                                           UDG2F304.246    
      ENDDO                                                                UDG2F304.247    
                                                                           UDG2F304.248    
 100  CONTINUE                                                             UDG2F304.249    
      WRITE(6,*)L-1,' pp fields written out'                               UDG5F404.174    
                                                                           UDG5F404.175    
9999  continue                                                             UDG5F404.176    
                                                                           UDG2F304.251    
      RETURN                                                               UDG2F304.252    
      END                                                                  UDG2F304.253    
                                                                           UDG2F304.254    
*ENDIF                                                                     AD311093.2