*IF DEF,RECON                                                              CONVLOO1.2      
C ******************************COPYRIGHT******************************    GTS2F400.1315   
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.1316   
C                                                                          GTS2F400.1317   
C Use, duplication or disclosure of this code is subject to the            GTS2F400.1318   
C restrictions as set forth in the contract.                               GTS2F400.1319   
C                                                                          GTS2F400.1320   
C                Meteorological Office                                     GTS2F400.1321   
C                London Road                                               GTS2F400.1322   
C                BRACKNELL                                                 GTS2F400.1323   
C                Berkshire UK                                              GTS2F400.1324   
C                RG12 2SZ                                                  GTS2F400.1325   
C                                                                          GTS2F400.1326   
C If no contract has been raised with this copy of the code, the use,      GTS2F400.1327   
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.1328   
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.1329   
C Modelling at the above address.                                          GTS2F400.1330   
C ******************************COPYRIGHT******************************    GTS2F400.1331   
C                                                                          GTS2F400.1332   
CLL  SUBROUTINE CONVLOOK----------------------------------------           CONVLOO1.3      
CLL                                                                        CONVLOO1.4      
CLL  Written by A. Dickinson                                               CONVLOO1.5      
CLL                                                                        CONVLOO1.6      
CLL  Model            Modification history from model version 3.0:         CONVLOO1.7      
CLL version  Date                                                          CONVLOO1.8      
CLL   3.2  19/04/93  Code for new real missing data indicator.             TJ050593.58     
CLL                  Author: T.Johns      Reviewer: A.Dickinson            TJ050593.59     
CLL   3.2  06/05/93    Set LOOKUP(30) (=LBNREC) to zero explicitly to      AD060593.1      
CLL                    be consistent with diagnostic lookups. R. Rawlins   AD060593.2      
CLL   3.3  29/10/93    Resets lookup entries so that dump files can be     GO291093.2      
CLL                    processed as PP-files.                              GO291093.3      
CLL                    Author: D.M.Goddard                                 GO291093.4      
CLL   3.4  14/04/94    Corrections to atmosphere and ocean lookup          GDG5F304.8      
CLL                    records to allow PP processing                      GDG5F304.9      
CLL                    Author: D.M.Goddard                                 GDG5F304.10     
CLL                                                                        UDG4F304.139    
CLL  3.4  19/07/94  Extra inputs added to namelist LOOK in order to        UDG4F304.140    
CLL                 allow user to define how the user prognostics are      UDG4F304.141    
CLL                 initialised.                                           UDG4F304.142    
CLL                 Author D.M.Goddard                                     UDG4F304.143    
!     3.5  24/04/95  Use subroutine STASH_PROC to set up addressing        UDG2F305.124    
!                    field lengths and number of levels  rather than       UDG2F305.125    
!                    namelist LOOK.                                        UDG2F305.126    
!                    Author D.M.Goddard                                    UDG2F305.127    
!    3.5  13/03/95  Correct lookup(17) for rotated grids and set           UDG1F305.151    
!                   rlookup(58) to allow correct PP processing of dumps.   UDG1F305.152    
!                   on rotated grids                                       UDG1F305.153    
!                   Author D.M.Goddard                                     UDG1F305.154    
!    4.0  11/09/95  Pass grid type information up to CONTROL via           UDG1F400.285    
!                   argument GRID_TYPE.                                    UDG1F400.286    
!                   Author D.M. Goddard.                                   UDG1F400.287    
!    4.0  11/10/95  Update code for user prognostics for                   UDG7F400.219    
!                   submodels project.                                     UDG7F400.220    
!                   Author D.M. Goddard.                                   UDG7F400.221    
!    4.1  03/04/96  New argument DUMP_PACK ; Use to set up LOOKUP(21)      GDR2F401.19     
!                   D. Robinson                                            GDR2F401.20     
CLL  4.1   31/05/96     Code to calc. zeroth lat and lat. spacing for      UIE2F401.298    
CLL                     data on a c grid.                                  UIE2F401.299    
CLL                     Author I.Edmond       Reviewer D. Goddard          UIE2F401.300    
CLL  4.2  12/11/96  Logical L_OCOMP (CNTLOCN): allow both compressed       USI0F402.1      
CLL                 and uncompressed ocean dumps. SI                       USI0F402.2      
CLL  4.3   19/5/97      Allow for pseudo-levels.     W.Ingram              AWI1F403.105    
!    4.3  12/03/97  Corrects indexing of arrays used to hold               UDG3F403.1      
!                   information about user prognostic                      UDG3F403.2      
!                   initialisation in reconfiguration.                     UDG3F403.3      
!                   Author D.M.Goddard                                     UDG3F403.4      
CLL                                                                        CONVLOO1.9      
CLL  Logical component number: S1                                          CONVLOO1.10     
CLL                                                                        CONVLOO1.11     
CLL  Purpose:                                                              CONVLOO1.12     
CLL           Sets up LOOKUP records for target file.                      CONVLOO1.13     
CLL           Extra info inserted into LOOKUP records from                 CONVLOO1.17     
CLL           PP_XREF file on unit 1 or user's STASH master file           CONVLOO1.18     
CLL           on unit 2.                                                   CONVLOO1.19     
CLL                                                                        CONVLOO1.20     
CLL  Documentation:                                                        CONVLOO1.21     
CLL           UM Documentation papers S1 and F3                            CONVLOO1.22     
CLL------------------------------------------------------------            CONVLOO1.23     
C*L Arguments:-------------------------------------------------            CONVLOO1.24     

      SUBROUTINE CONVLOOK(VERT_ARG,N_TYPES_IN,PP_NUM_IN,                    1,8UDG7F400.222    
     &                    LEN_FIXHD_OUT,FIXHD_OUT,HORIZ_GRID_TYPE,IPROJ,   UDG7F400.223    
     &                    LEN_REALHD_OUT,REALHD_OUT,PP_ITEMC_IN,           UDG7F400.224    
     &                    OZONE_LEVELS_IN,                                 UDG7F400.225    
     &                    LEN2_LEVDEPC_OUT,LEN1_LEVDEPC_OUT,LEVDEPC_OUT,   UDG7F400.226    
     &                    LEN1_LOOKUP_OUT,LEN2_LOOKUP_OUT,                 UDG7F400.227    
     &                    LOOKUP_OUT,RLOOKUP_OUT,                          UDG7F400.228    
     &                    LEN1_LOOKUP_IN,LEN2_LOOKUP_IN,                   UDG7F400.229    
     &                    LOOKUP_IN,RLOOKUP_IN,                            UDG7F400.230    
     &                    ROW_LENGTH_OUT,P_ROWS_OUT,                       UDG7F400.231    
     &                    P_LEVELS_OUT,Q_LEVELS_OUT,                       UDG7F400.232    
     &                    ST_LEVELS_OUT,SM_LEVELS_OUT,                     UJS1F401.270    
     &                    BL_LEVELS_OUT,OZONE_LEVELS_OUT,                  UJS1F401.271    
     &                    U_ROWS_OUT,U_FIELD_OUT,P_FIELD_OUT,AREA_OUT,     UDG7F400.234    
     &                    P_LEVELS_IN,Q_LEVELS_IN,                         UJS1F401.272    
     &                    ST_LEVELS_IN,SM_LEVELS_IN,SRCE_OUT,              UJS1F401.273    
     &                    UPRC_OUT,UPAF_OUT,UPAA_OUT,                      UDG7F400.236    
     &                    POINTS_PER_OCEAN_LEVEL,GRID_TYPE,DUMP_PACK,      GDR2F401.21     
*CALL ARGPPX                                                               UDG7F400.238    
     &                    LAND_POINTS_OUT,LEN_DATA_OUT,OCEAN,LCAL360,      UDG7F400.239    
     &                    C_GRID_IN,C_GRID_OUT,                            UIE2F401.301    
     &                    LOZONE_ZONAL)                                    UDG7F400.240    
! Subroutine arguments                                                     UDG2F305.134    
!   Scalar arguments with intent(in):                                      UDG2F305.135    
                                                                           CONVLOO1.37     
      IMPLICIT NONE                                                        CONVLOO1.38     
                                                                           CONVLOO1.39     
       INTEGER                                                             CONVLOO1.40     
     * LEN_FIXHD_OUT,    !IN Length of fixed length header (output)        CONVLOO1.41     
     * LEN_REALHD_OUT,   !IN Length of Real header (output)                CONVLOO1.42     
     * LEN2_LEVDEPC_OUT  !IN 2nd dim of lev dep constants (output)         CONVLOO1.43     
     *,LEN1_LEVDEPC_OUT, !IN 1st dim of lev dep constants (output)         CONVLOO1.44     
     * LEN1_LOOKUP_OUT   !IN 1st dim of lookup headers (output)            CONVLOO1.45     
     *,LEN2_LOOKUP_OUT,  !IN 2nd dim of lookup headers (output)            CONVLOO1.46     
     * LEN1_LOOKUP_IN    !IN 1st dim of lookup headers (input)             CONVLOO1.47     
     *,LEN2_LOOKUP_IN,   !IN 2nd dim of lookup headers (input)             CONVLOO1.48     
     * ROW_LENGTH_OUT    !IN No of points E-W (output)                     CONVLOO1.49     
     *,P_ROWS_OUT        !IN No of p-points N-S (output)                   CONVLOO1.50     
     *,P_LEVELS_OUT      !IN No of levels (output)                         CONVLOO1.51     
     *,Q_LEVELS_OUT,     !IN No of wet levels (output)                     CONVLOO1.52     
     & ST_LEVELS_OUT,    !IN No of soil temperature levels (output)        UJS1F401.274    
     & SM_LEVELS_OUT    !IN No of soil moisture levels (output)            UJS1F401.275    
     *,BL_LEVELS_OUT,    !IN No of b.l. levels (output)                    CONVLOO1.54     
     * OZONE_LEVELS_OUT, !IN No of ozone levels (output)                   CONVLOO1.55     
     * OZONE_LEVELS_IN,  !IN No of ozone levels (input)                    CONVLOO1.56     
     * U_ROWS_OUT        !IN No of uv-points N-S (output)                  CONVLOO1.57     
     *,U_FIELD_OUT       !IN No of uv-points along a level (output)        CONVLOO1.58     
     *,P_FIELD_OUT,      !IN No of p-points along a level (output)         CONVLOO1.59     
     * P_LEVELS_IN       !IN No of levels (input)                          CONVLOO1.60     
     *,Q_LEVELS_IN       !IN No of wet levels (input)                      CONVLOO1.61     
     &,ST_LEVELS_IN      !IN No of soil temperature levels (input)         UJS1F401.276    
     &,SM_LEVELS_IN      !IN No of soil moisture levels (input)            UJS1F401.277    
     *,LAND_POINTS_OUT   !IN No of land points (output)                    CONVLOO1.63     
     *,LEN_DATA_OUT      !OUT Length of data (output)                      UDG2F305.136    
     *,IPROJ             !IN Projection number                             CONVLOO1.65     
     *,HORIZ_GRID_TYPE   !IN Horizontal grid type                          CONVLOO1.66     
     *,N_TYPES_IN        !IN No of different field types                   CONVLOO1.67     
     *,PP_NUM_IN(*)      !IN No of fields per type                         CONVLOO1.68     
     *,PP_ITEMC_IN(*)    !IN Item code of each type                        CONVLOO1.69     
                                                                           CONVLOO1.70     
      INTEGER      FIXHD_OUT(LEN_FIXHD_OUT)                                UDG2F305.137    
      INTEGER      LOOKUP_OUT(LEN1_LOOKUP_OUT,LEN2_LOOKUP_OUT)             UDG2F305.138    
      INTEGER      LOOKUP_IN(LEN1_LOOKUP_in,LEN2_LOOKUP_IN)                UDG2F305.139    
      INTEGER      SRCE_OUT(LEN2_LOOKUP_OUT)                               UDG2F305.140    
                            !OUT S from NAMELIST ITEM                      UDG2F305.141    
      INTEGER      AREA_OUT(LEN2_LOOKUP_OUT)                               UDG2F305.142    
                            !OUT A from NAMELIST ITEM                      UDG2F305.143    
      REAL         UPRC_OUT(LEN2_LOOKUP_OUT)                               UDG7F400.241    
                            !OUT  USER_PROG_RCONST from N'LIST ITEM        UDG7F400.242    
      CHARACTER*80 UPAF_OUT(LEN2_LOOKUP_OUT)                               UDG7F400.243    
                            !OUT  USER_PROG_ANCIL_FILE                     UDG7F400.244    
      INTEGER      UPAA_OUT(LEN2_LOOKUP_OUT)                               UDG7F400.245    
                            !OUT  USER_PROG_ANCIL_ITEMC ""  ""             UDG7F400.246    
      INTEGER      START_ADDRESS                                           UDG2F305.144    
                            !OUT Address calculated using STASH_PROC       UDG2F305.145    
      INTEGER      LENGTH   !OUT Length calculated using STASH_PROC        UDG2F305.146    
      INTEGER      N_LEVELS !OUT Number of levels calc  STASH_PROC         UDG2F305.147    
      INTEGER     N_PLEVELS !  & of pseudo-levels                          AWI1F403.106    
      INTEGER      POINTS_PER_OCEAN_LEVEL(99)                              UDG2F305.148    
                                  !Number of pointe per ocean level        UDG2F305.149    
      INTEGER      GRID_TYPE(LEN2_LOOKUP_OUT)                              UDG1F400.288    
                                 !Grid type:- 1=p-grid,                    UDG1F400.289    
                                 !            2=u-grid,                    UDG1F400.290    
                                 !            3=ocean velocity points      UDG1F400.291    
                                 !            4=zonal mean.                UDG1F400.292    
      INTEGER      DUMP_PACK     ! Packing indicator for dumps             GDR2F401.22     
                                 ! 1 : Get from PPXREF file                GDR2F401.23     
                                 ! 2 : Prognostics - Do not pack           GDR2F401.24     
                                 !   : Diagnostics - Get from PPXREF       GDR2F401.25     
                                 ! 3 : Do not pack any fields              GDR2F401.26     
                                                                           UDG2F305.150    
      LOGICAL      VERT_ARG       !Vertical interpolation switch           UDG2F305.151    
            LOGICAL      C_GRID_IN  !IN=T, Arakawa 'C' grid input          UIE2F401.302    
            LOGICAL      C_GRID_OUT !IN=T, Arakawa 'C' grid output         UIE2F401.303    
      LOGICAL      OCEAN          !Ocean processing switch T=on            UDG2F305.152    
      LOGICAL      LCAL360        !T= 360 day calender:                    UDG2F305.153    
                                  !F= Gregorian calender                   UDG2F305.154    
      LOGICAL      LOZONE_ZONAL   !T= Zonal ozone field                    UDG2F305.155    
                                  !F= Full  ozone field                    UDG2F305.156    
                                                                           UDG2F305.157    
      REAL         REALHD_OUT(LEN_REALHD_OUT)                              UDG2F305.158    
      REAL         LEVDEPC_OUT(LEN1_LEVDEPC_OUT,LEN2_LEVDEPC_OUT)          UDG2F305.159    
      REAL         RLOOKUP_OUT(LEN1_LOOKUP_OUT,LEN2_LOOKUP_OUT)            UDG2F305.160    
      REAL         RLOOKUP_IN(LEN1_LOOKUP_IN,LEN2_LOOKUP_IN)               UDG2F305.161    
                                                                           UDG2F305.162    
                                                                           CONVLOO1.93     
C Comdecks: ------------------------------------------------------------   CONVLOO1.94     
*CALL CSUBMODL                                                             UDG2F305.174    
*CALL CPPXREF                                                              UDG2F305.176    
*CALL PPXLOOK                                                              UDG2F305.177    
*CALL NRECON                                                               UDG2F305.178    
*CALL C_ITEMS                                                              UDG2F305.179    
*CALL CNTLOCN                                                              USI0F402.3      
*CALL C_MDI                                                                CONVLOO1.96     
                                                                           CONVLOO1.97     
C Local arrays:---------------------------------------------------------   CONVLOO1.98     
      INTEGER                                                              CONVLOO1.99     
     * LOOKUP(64)                                                          CONVLOO1.100    
     *,AREA(LEN2_LOOKUP_OUT)                                               CONVLOO1.101    
     *,PP_XREF(PPXREF_CODELEN)  !PPXREF codes for a given section/item     CONVLOO1.102    
     *,LEN_OCEAN(LEN2_LOOKUP_OUT)                                          CONVLOO1.103    
     &,WHOLE      !   Whole value of LOOKUP(21)                            GDR2F401.27     
                  !   LOOKUP(21) = N5N4N3N2N1 : See UMDP F3                GDR2F401.28     
     &,N1         !   Packing Indicator in LOOKUP(21)                      GDR2F401.29     
     &,N2         !   Compression Indicator in LOOKUP(21)                  GDR2F401.30     
     &,N3         !   Compression Method in LOOKUP(21)                     GDR2F401.31     
                                                                           GDR2F401.32     
      REAL                                                                 CONVLOO1.106    
     * RLOOKUP(64)                                                         CONVLOO1.107    
     &,LEVEL(LEN1_LEVDEPC_OUT)                                             GDG5F304.11     
     &,DEPTH                                                               GDG5F304.12     
                                                                           CONVLOO1.108    
C External subroutines called:------------------------------------------   CONVLOO1.109    
      EXTERNAL EXPPXC,EXPPXI,ABORT_IO                                      UDG2F305.180    
C*----------------------------------------------------------------------   CONVLOO1.111    
C*L  Local variables:---------------------------------------------------   CONVLOO1.112    
      INTEGER                                                              CONVLOO1.113    
     * SECTION     !STASH section code                                     CONVLOO1.114    
     *,ITEM_CODE   !STASH item code                                        CONVLOO1.115    
      INTEGER      MODEL          !Internal model number                   UDG2F305.181    
      INTEGER      AREA_TEMP      !Stores AREA_OUT(K) as scalar in loop    UDG2F305.182    
      INTEGER      SRCE_TEMP      !Stores SRCE_OUT(K) as scalar in loop    UDG2F305.183    
      REAL          UPRC_TEMP                                              UDG3F403.5      
      CHARACTER*80  UPAF_TEMP                                              UDG3F403.6      
      INTEGER       UPAA_TEMP                                              UDG3F403.7      
      INTEGER      K_IN           !Stores SRCE_OUT(K) as scalar in loop    UDG2F305.184    
      INTEGER      K_OUT          !Stores SRCE_OUT(K) as scalar in loop    UDG2F305.185    
      INTEGER      I,J,K,JJ       !DO loop indices                         UDG2F305.186    
      INTEGER      ICOUNT         !Counter used to compute LOOKUP(40)      UDG2F305.187    
      INTEGER      ICT            !Counter used to calculate ocean lvls    UDG2F305.188    
      INTEGER      PPXREF_GRID_TYPE                                        UDG1F400.293    
                                 !Holds grid type extracted from PPXREF    UDG1F400.294    
      INTEGER      JCOUNT         !Counter used to fill array IPROGPSN     UDG7F400.247    
      INTEGER      ICODE          !Error code                              UDG2F305.190    
      CHARACTER*80 CMESSAGE       !Error message                           UDG2F305.191    
                                                                           UDG2F305.192    
      INTEGER      ITEM_NAMELIST(LEN2_LOOKUP_OUT)                          UDG7F400.251    
      INTEGER      SRCE_NAMELIST(LEN2_LOOKUP_OUT)                          UDG7F400.252    
      INTEGER      AREA_NAMELIST(LEN2_LOOKUP_OUT)                          UDG7F400.253    
      REAL         UPRC_NAMELIST(LEN2_LOOKUP_OUT)                          UDG7F400.254    
      CHARACTER*80 UPAF_NAMELIST(MAX_LEN2_LOOKUP_OUT)                      UDG7F400.255    
      INTEGER      UPAA_NAMELIST(LEN2_LOOKUP_OUT)                          UDG7F400.256    
      INTEGER      EXPPXI         !Function to extract integer             UDG2F305.193    
                                  ! from ppxref file                       UDG2F305.194    
      CHARACTER*36 EXPPXC         !Function to extract character string    UDG2F305.195    
                                  ! from ppxref file                       UDG2F305.196    
      INTEGER      IPROGPSN(LEN2_LOOKUP_OUT)                               UDG7F400.248    
                            !Position in prognostic list of field          UDG7F400.249    
                                                                           UDG7F400.250    
                                                                           UDG2F305.197    
! 1: Initialise arrays holding NAMELIST info                               UDG2F305.198    
      DO K=1,LEN2_LOOKUP_OUT                                               UDG2F305.199    
        ITEM_NAMELIST(K)=IMDI                                              UDG2F305.200    
        AREA_NAMELIST(K)=1                                                 UDG2F305.201    
        SRCE_NAMELIST(K)=1                                                 UDG2F305.202    
        UPRC_NAMELIST(K)=RMDI                                              UDG2F305.204    
        UPAF_NAMELIST(K)=' '                                               UDG2F305.205    
        UPAA_NAMELIST(K)=IMDI                                              UDG2F305.206    
      END DO                                                               UDG2F305.207    
                                                                           UDG2F305.208    
! 2: Loop through NAMELIST input updating variables                        UDG2F305.209    
      DO J=1,LEN2_LOOKUP_OUT                                               UDG2F305.210    
        READ(5,ITEMS,END=953,ERR=954)                                      UDG3F402.777    
        ITEM_NAMELIST(J)=ITEM                                              UDG2F305.212    
        AREA_NAMELIST(J)=DOMAIN                                            GDG0F401.465    
        SRCE_NAMELIST(J)=SOURCE                                            GDG0F401.466    
        UPRC_NAMELIST(J)=USER_PROG_RCONST                                  UDG2F305.216    
        UPAF_NAMELIST(J)=USER_PROG_ANCIL_FILE                              UDG2F305.217    
        UPAA_NAMELIST(J)=USER_PROG_ANCIL_ITEMC                             UDG2F305.218    
      END DO                                                               UDG2F305.219    
 953  CONTINUE                                                             UDG2F305.220    
 954    CONTINUE                                                           UDG3F402.778    
                                                                           UDG3F402.779    
                                                                           UDG2F305.221    
! 3: Initialise LOOKUP array                                               UDG2F305.222    
                                                                           UDG2F305.223    
  ! 3.1: Initialise time information                                       UDG2F305.224    
      DO I=1,12                                                            UDG2F305.225    
        LOOKUP(I)=LOOKUP_IN(I,1)                                           UDG2F305.226    
      END DO                                                               UDG2F305.227    
                                                                           UDG2F305.228    
  ! 3.2 Initialise integer elements                                        UDG2F305.229    
      DO I=13,45                                                           UDG2F305.230    
        LOOKUP(I)=IMDI                                                     UDG2F305.231    
      ENDDO                                                                UDG2F305.232    
                                                                           UDG2F305.233    
  ! 3.3 Initialise real elements                                           UDG2F305.234    
      DO I=46,64                                                           UDG2F305.235    
        RLOOKUP(I)=RMDI                                                    UDG2F305.236    
      ENDDO                                                                UDG2F305.237    
                                                                           UDG2F305.238    
      K_OUT=1                                                              UDG2F305.239    
                                                                           UDG2F305.240    
! 4: Calculate ocean levels from level dependent constants                 UDG2F305.241    
                                                                           UDG2F305.242    
      IF(OCEAN)THEN                                                        UDG2F305.243    
        DEPTH=0                                                            UDG2F305.244    
        DO J=1,LEN1_LEVDEPC_OUT                                            UDG2F305.245    
          DEPTH=DEPTH+LEVDEPC_OUT(J,1)/2                                   UDG2F305.246    
          LEVEL(J)=DEPTH                                                   UDG2F305.247    
          DEPTH=DEPTH+LEVDEPC_OUT(J,1)/2                                   UDG2F305.248    
        END DO                                                             UDG2F305.249    
      END IF                                                               UDG2F305.250    
                                                                           UDG2F305.251    
! 5: Loop through prognostic items and initialise LOOKUP_OUT               UDG2F305.252    
!                                                                          UDG2F305.253    
      JCOUNT = 0                                                           UDG7F400.257    
      DO J=1,N_INTERNAL_MODEL                                              UDG2F305.254    
        DO JJ=1,NProgItems(J)                                              UDG2F305.255    
          JCOUNT = JCOUNT + 1                                              UDG7F400.258    
                                                                           UDG2F305.256    
  ! 5.1: Extract addressing and number of levels from COMMON block         UDG2F305.257    
          ITEM_CODE     = ProgItems(J,JJ)                                  UDG2F305.258    
          N_LEVELS      = Recondat(J,ITEM_CODE,1)                          UDG2F305.259    
          LENGTH        = Recondat(J,ITEM_CODE,2)                          UDG2F305.260    
          START_ADDRESS = Recondat(J,ITEM_CODE,3)                          UDG2F305.261    
          N_PLEVELS     = Recondat(J,ITEM_CODE,4)                          AWI1F403.107    
                                                                           UDG2F305.262    
  ! 5.2: Check NAMELIST for additional input                               UDG2F305.263    
          AREA_TEMP = 1                                                    UDG2F305.264    
          SRCE_TEMP = 1                                                    UDG2F305.265    
          DO K=1,LEN2_LOOKUP_OUT                                           UDG2F305.266    
            IF(ITEM_CODE.EQ.ITEM_NAMELIST(K))THEN                          UDG2F305.267    
              AREA_TEMP = AREA_NAMELIST(K)                                 UDG2F305.268    
              SRCE_TEMP = SRCE_NAMELIST(K)                                 UDG2F305.269    
             UPRC_TEMP = UPRC_NAMELIST(K)                                  UDG3F403.8      
             UPAF_TEMP = UPAF_NAMELIST(K)                                  UDG3F403.9      
             UPAA_TEMP = UPAA_NAMELIST(K)                                  UDG3F403.10     
            ENDIF                                                          UDG2F305.270    
          END DO                                                           UDG2F305.271    
                                                                           UDG2F305.272    
  ! 5.3: Expand over number of levels                                      UDG2F305.273    
          ICOUNT=0                                                         UDG2F305.274    
          DO  K=K_OUT,K_OUT+N_LEVELS*N_PLEVELS-1                           AWI1F403.108    
            LEN_OCEAN(K)  = LENGTH/(N_LEVELS*N_PLEVELS)                    AWI1F403.109    
            AREA_OUT(K)   = AREA_TEMP                                      UDG2F305.277    
            SRCE_OUT(K)   = SRCE_TEMP                                      UDG2F305.278    
              UPRC_OUT(K) = UPRC_TEMP                                      UDG3F403.11     
              UPAF_OUT(K) = UPAF_TEMP                                      UDG3F403.12     
              UPAA_OUT(K) = UPAA_TEMP                                      UDG3F403.13     
            IPROGPSN(K) = JCOUNT                                           UDG7F400.262    
                                                                           UDG2F305.279    
    ! 5.3.1: Initialise LOOKUP_OUT                                         UDG2F305.280    
            DO I=1,45                                                      UDG2F305.281    
              LOOKUP_OUT(I,K)=LOOKUP(I)                                    UDG2F305.282    
            END DO                                                         UDG2F305.283    
            DO I=46,64                                                     UDG2F305.284    
              RLOOKUP_OUT(I,K)=RLOOKUP(I)                                  UDG2F305.285    
            END DO                                                         UDG2F305.286    
            LOOKUP_OUT(42,K)=ITEM_CODE                                     UDG2F305.287    
            LOOKUP_OUT(45,K)=INTERNAL_MODEL_LIST(J)                        UDG2F305.288    
                                                                           UDG2F305.289    
    ! 5.3.2: Set addressing information                                    UDG2F305.290    
            IF(OCEAN.AND.N_LEVELS.GT.1) THEN                               USI0F402.4      
              IF (L_OCOMP) THEN                                            USI0F402.5      
              LOOKUP_OUT(15,K)=POINTS_PER_OCEAN_LEVEL(K-K_OUT+1)           UDG2F305.292    
              ELSE                                                         USI0F402.6      
                LOOKUP_OUT(15,K)=LENGTH/(N_LEVELS*N_PLEVELS)               AWI1F403.110    
              ENDIF                                                        USI0F402.8      
                                                                           USI0F402.9      
                                                                           USI0F402.10     
                                                                           USI0F402.11     
                                                                           USI0F402.12     
                                                                           USI0F402.13     
            ELSE                                                           UDG2F305.293    
              LOOKUP_OUT(15,K)=LENGTH/(N_LEVELS*N_PLEVELS)                 AWI1F403.111    
            END IF                                                         UDG2F305.295    
            LOOKUP_OUT(40,K)=START_ADDRESS+ICOUNT                          UDG2F305.296    
            ICOUNT=ICOUNT+LOOKUP_OUT(15,K)                                 UDG2F305.297    
                                                                           UDG2F305.298    
    ! 5.3.3: Calculate levels from level dependent constants               UDG2F305.299    
    !        Set levels for multi-level fields only                        UDG2F305.300    
    !        Levels not set for single level fields                        UDG2F305.301    
            IF(N_LEVELS.GT.1)THEN                                          UDG2F305.302    
              IF(.NOT.OCEAN)THEN                                           UDG2F305.303    
                LOOKUP_OUT(33,K)=MOD(K-K_OUT,N_LEVELS)+1                   AWI1F403.112    
                RLOOKUP_OUT(52,K)=LEVDEPC_OUT(LOOKUP_OUT(33,K),2)          AWI1F403.113    
                RLOOKUP_OUT(54,K)=LEVDEPC_OUT(LOOKUP_OUT(33,K),1)          AWI1F403.114    
              ELSE                                                         UDG2F305.307    
                ICT=0                                                      UDG2F305.308    
                DO I=2,LEN2_LOOKUP_OUT                                     UDG2F305.309    
                  IF(LOOKUP_OUT(42,ICT+1).EQ.LOOKUP_OUT(42,I))THEN         UDG2F305.310    
                    IF(I-ICT.EQ.2)RLOOKUP_OUT(52,ICT+1)=LEVEL(1)           UDG2F305.311    
                    RLOOKUP_OUT(52,I)=LEVEL(I-ICT)                         UDG2F305.312    
                  ELSE                                                     UDG2F305.313    
                    ICT=I-1                                                UDG2F305.314    
                  END IF                                                   UDG2F305.315    
                END DO                                                     UDG2F305.316    
              END IF                                                       UDG2F305.317    
            END IF                                                         UDG2F305.318    
          END DO                                                           UDG2F305.319    
          K_OUT=K_OUT+(N_LEVELS*N_PLEVELS)                                 AWI1F403.115    
                                                                           AWI1F403.116    
                                                                           UDG1F400.295    
  ! 5.4: Extract grid code from ppxref file                                UDG1F400.296    
         SECTION = 0             !Prognostics all in section 0             UDG1F400.297    
         MODEL   = INTERNAL_MODEL_LIST(J)                                  UDG1F400.298    
         PPXREF_GRID_TYPE=EXPPXI(MODEL,SECTION,ITEM_CODE,ppx_grid_type,    UDG1F400.299    
*CALL ARGPPX                                                               UDG1F400.300    
     &                           ICODE,CMESSAGE)                           UDG1F400.301    
          IF(PPXREF_GRID_TYPE.GT.10.AND.PPXREF_GRID_TYPE.LT.14)THEN        UDG1F400.302    
            GRID_TYPE(JCOUNT) = 2                                          UDG1F400.303    
      ELSE IF((PPXREF_GRID_TYPE.EQ.18).OR.                                 UIE2F401.304    
     &                    (PPXREF_GRID_TYPE.EQ.19))THEN                    UIE2F401.305    
        GRID_TYPE(JCOUNT) = 2                                              UIE2F401.306    
          ELSE IF(PPXREF_GRID_TYPE.EQ.37)THEN                              UDG1F400.304    
            GRID_TYPE(JCOUNT) = 3                                          UDG1F400.305    
          ELSE IF(LOZONE_ZONAL.AND.ITEM_CODE.EQ.60)THEN                    UDG1F400.306    
            GRID_TYPE(JCOUNT) = 4                                          UDG1F400.307    
          ELSE                                                             UDG1F400.308    
            GRID_TYPE(JCOUNT) = 1                                          UDG1F400.309    
          END IF                                                           UDG1F400.310    
        END DO                                                             UDG2F305.321    
      END DO                                                               UDG2F305.322    
                                                                           UDG2F305.323    
C-------------------------------------------------------------------       CONVLOO1.369    
C Initialise LOOKUP fields from PPXREF                                     CONVLOO1.370    
C-------------------------------------------------------------------       CONVLOO1.371    
                                                                           CONVLOO1.372    
      DO K=1,LEN2_LOOKUP_OUT                                               CONVLOO1.373    
        ITEM_CODE=MOD(LOOKUP_OUT(42,K),1000)                               CONVLOO1.374    
        SECTION=(LOOKUP_OUT(42,K)-ITEM_CODE)/1000                          CONVLOO1.375    
         MODEL=LOOKUP_OUT(45,K)                                            UDG2F305.324    
        IF(FIXHD_OUT(4).LT.100) THEN                                       GDG5F304.37     
          LOOKUP_OUT(16,K)=1                                               GDG5F304.38     
          LOOKUP_OUT(17,K)=HORIZ_GRID_TYPE                                 UDG1F305.155    
        ELSE                                                               GDG5F304.39     
          LOOKUP_OUT(16,K)=101 !100 added for non-standard polar axis      GDG5F304.40     
          LOOKUP_OUT(17,K)=HORIZ_GRID_TYPE-100                             UDG1F305.156    
        ENDIF                                                              GDG5F304.41     
         LOOKUP_OUT(20,K)=0 ! No extra data                                GO291093.11     
         LOOKUP_OUT(22,K)=2 ! Header release number currently 2            GO291093.12     
         LOOKUP_OUT(23,K)=EXPPXI(MODEL,SECTION,ITEM_CODE,ppx_field_code,   UDG2F305.325    
*CALL ARGPPX                                                               UDG2F305.326    
     &                           ICODE,CMESSAGE)                           UDG2F305.327    
         LOOKUP_OUT(26,K)=EXPPXI(MODEL,SECTION,ITEM_CODE,ppx_lbvc_code,    UDG2F305.328    
*CALL ARGPPX                                                               UDG2F305.329    
     &                           ICODE,CMESSAGE)                           UDG2F305.330    
         LOOKUP_OUT(29,K)=0                                                UDG2F305.331    
        LOOKUP_OUT(30,K)=0                                                 AD060593.3      
        LOOKUP_OUT(31,K)=IPROJ                                             CONVLOO1.386    
         LOOKUP_OUT(32,K)=EXPPXI(MODEL,SECTION,ITEM_CODE,                  UDG2F305.332    
     &                           ppx_meto8_fieldcode,                      UDG2F305.333    
*CALL ARGPPX                                                               UDG2F305.334    
     &                           ICODE,CMESSAGE)                           UDG2F305.335    
      IF(LOOKUP_OUT(33,K).EQ.IMDI)THEN                                     CONVLOO1.388    
         LOOKUP_OUT(33,K)=EXPPXI(MODEL,SECTION,ITEM_CODE,                  UDG2F305.336    
     &                           ppx_meto8_levelcode,                      UDG2F305.337    
*CALL ARGPPX                                                               UDG2F305.338    
     &                           ICODE,CMESSAGE)                           UDG2F305.339    
      ENDIF                                                                CONVLOO1.390    
                                                                           CONVLOO1.391    
        LOOKUP_OUT(38,K)=1111                                              CONVLOO1.392    
      IF(LOOKUP_OUT(39,K).EQ.IMDI)                                         CONVLOO1.393    
     &LOOKUP_OUT(39,K)=EXPPXI(MODEL,SECTION,ITEM_CODE,ppx_data_type,       UDG2F305.340    
*CALL ARGPPX                                                               UDG2F305.341    
     &                           ICODE,CMESSAGE)                           UDG2F305.342    
      IF(LOOKUP_OUT(21,K).EQ.IMDI)THEN                                     CONVLOO1.395    
       LOOKUP_OUT(21,K)=EXPPXI(MODEL,SECTION,ITEM_CODE,ppx_dump_packing,   UDG2F305.343    
*CALL ARGPPX                                                               UDG2F305.344    
     &                           ICODE,CMESSAGE)                           UDG2F305.345    
       IF (DUMP_PACK.eq.2 .or. DUMP_PACK.eq.3 ) THEN                       GDR2F401.33     
!        Do not pack data ; Override packing indicator from PPXREF         GDR2F401.34     
         N1 = 0   !   No packing                                           GDR2F401.35     
         LOOKUP_OUT(21,K) = (LOOKUP_OUT(21,K)/10)*10 + N1                  GDR2F401.36     
       ENDIF                                                               GDR2F401.37     
      ENDIF                                                                CONVLOO1.397    
        RLOOKUP_OUT(64,K)=1.0                                              GDG5F304.43     
      ENDDO                                                                CONVLOO1.398    
                                                                           CONVLOO1.399    
C-------------------------------------------------------------------       CONVLOO1.400    
C Change LOOKUP to allow for change in horizontal dimensions               CONVLOO1.401    
C-------------------------------------------------------------------       CONVLOO1.402    
                                                                           CONVLOO1.403    
      DO K=1,LEN2_LOOKUP_OUT                                               CONVLOO1.405    
                                                                           CONVLOO1.406    
        ITEM_CODE=MOD(LOOKUP_OUT(42,K),1000)                               CONVLOO1.407    
        SECTION=(LOOKUP_OUT(42,K)-ITEM_CODE)/1000                          CONVLOO1.408    
         MODEL=LOOKUP_OUT(45,K)                                            UDG2F305.346    
                                                                           UDG2F305.347    
        IF(AREA_OUT(K).EQ.1)THEN                                           UDG2F305.348    
                                                                           UDG2F305.349    
C Get N2 and N3 from whole value of LBPACK                                 UDG2F305.350    
        WHOLE=LOOKUP_OUT(21,K)                                             UDG2F305.351    
        N2=MOD(INT(WHOLE/10),10)                                           UDG2F305.352    
        N3=MOD(INT(WHOLE/100),10)                                          UDG2F305.353    
                                                                           UDG2F305.354    
        IF(N2.EQ.2.AND.N3.EQ.1) THEN                                       UDG2F305.355    
                                                                           UDG2F305.356    
          LOOKUP_OUT(18,K)=0                                               UDG2F305.357    
          LOOKUP_OUT(19,K)=0                                               UDG2F305.358    
                                                                           UDG2F305.359    
        ELSEIF(N2.EQ.1.AND.N3.EQ.1) THEN                                   UDG2F305.360    
                                                                           UDG2F305.361    
          LOOKUP_OUT(18,K)=0                                               UDG2F305.362    
          LOOKUP_OUT(19,K)=0                                               UDG2F305.363    
                                                                           UDG2F305.364    
        ELSE                                                               UDG2F305.365    
                                                                           UDG2F305.366    
         PPXREF_GRID_TYPE=EXPPXI(MODEL,SECTION,ITEM_CODE,ppx_grid_type,    UDG1F400.311    
*CALL ARGPPX                                                               UDG2F305.368    
     &                   ICODE,CMESSAGE)                                   UDG2F305.369    
          IF(GRID_TYPE(IPROGPSN(K)).EQ.2.OR.                               UDG1F400.312    
     &       GRID_TYPE(IPROGPSN(K)).EQ.3)THEN                              UDG1F400.313    
                                                                           UDG2F305.371    
          IF(PPXREF_GRID_TYPE.EQ.18)THEN                                   UIE2F401.307    
            ! u_rows_out is the same size as p_rows_out on the c grid.     UIE2F401.308    
            LOOKUP_OUT(18,K)=U_ROWS_OUT                                    UIE2F401.309    
          ELSE                                                             UIE2F401.310    
            ! u has one less row on B grid.                                UIE2F401.311    
            LOOKUP_OUT(18,K)=P_ROWS_OUT-1                                  UIE2F401.312    
          ENDIF                                                            UIE2F401.313    
            LOOKUP_OUT(19,K)=ROW_LENGTH_OUT                                UDG2F305.373    
                                                                           UDG2F305.374    
          ELSE                                                             UDG2F305.375    
                                                                           UDG2F305.376    
            LOOKUP_OUT(18,K)=P_ROWS_OUT                                    UDG2F305.377    
            IF(LOZONE_ZONAL.AND.ITEM_CODE.EQ.60)THEN                       UDG2F305.378    
              LOOKUP_OUT(19,K)=1                                           UDG2F305.379    
            ELSE                                                           UDG2F305.380    
              LOOKUP_OUT(19,K)=ROW_LENGTH_OUT                              UDG2F305.381    
            ENDIF                                                          UDG2F305.382    
                                                                           UDG2F305.383    
          ENDIF                                                            UDG2F305.384    
                                                                           UDG2F305.385    
        ENDIF                                                              UDG2F305.386    
                                                                           CONVLOO1.459    
        RLOOKUP_OUT(56,K)=REALHD_OUT(5)                                    CONVLOO1.460    
        RLOOKUP_OUT(57,K)=REALHD_OUT(6)                                    CONVLOO1.461    
        RLOOKUP_OUT(58,K)=0.                                               UDG1F305.157    
        IF(OCEAN)THEN                                                      GDG5F304.50     
          RLOOKUP_OUT(60,K)=REALHD_OUT(2)                                  GDG5F304.51     
          RLOOKUP_OUT(59,K)=REALHD_OUT(3)-REALHD_OUT(2)                    GDG5F304.52     
        ELSE                                                               GDG5F304.53     
      IF(FIXHD_OUT(3).EQ.5) THEN                                           UIE2F401.341    
         ! Reverse rows (data on p points) for new dynamics grid/VAR       UIE2F401.342    
         ! when fixhd_out indicates a radial grid.                         UIE2F401.343    
        RLOOKUP_OUT(60,K)=REALHD_OUT(2)                                    UIE2F401.344    
        RLOOKUP_OUT(59,K)=REALHD_OUT(3)-(REALHD_OUT(2)*P_ROWS_OUT)         UIE2F401.345    
      ELSE                                                                 UIE2F401.346    
          RLOOKUP_OUT(60,K)=-REALHD_OUT(2)                                 GDG5F304.54     
          RLOOKUP_OUT(59,K)=REALHD_OUT(3)+REALHD_OUT(2)                    GDG5F304.55     
      END IF                                                               UIE2F401.347    
        ENDIF                                                              GDG5F304.56     
        RLOOKUP_OUT(61,K)=REALHD_OUT(4)-REALHD_OUT(1)                      CONVLOO1.464    
      IF(LOOKUP_OUT(19,K).EQ.1)THEN                                        CONVLOO1.465    
        RLOOKUP_OUT(62,K)=360.                                             CONVLOO1.466    
      ELSE                                                                 CONVLOO1.467    
        RLOOKUP_OUT(62,K)=REALHD_OUT(1)                                    CONVLOO1.468    
      ENDIF                                                                CONVLOO1.469    
        IF(GRID_TYPE(IPROGPSN(K)).EQ.2)THEN                                UDG1F400.314    
          RLOOKUP_OUT(59,K)=REALHD_OUT(3)+REALHD_OUT(2)*.5                 CONVLOO1.472    
          RLOOKUP_OUT(61,K)=REALHD_OUT(4)-REALHD_OUT(1)*.5                 CONVLOO1.473    
      IF(PPXREF_GRID_TYPE.EQ.18) THEN                                      UIE2F401.314    
       ! If data on u points on a c grid calc. zeroth lat and lat. spaci   UIE2F401.315    
       IF(FIXHD_OUT(3).EQ.5) THEN                                          UIE2F401.316    
         ! Reverse u rows for new dynamics grid/VAR when fixhd_out         UIE2F401.317    
         ! indicates a radial grid.                                        UIE2F401.318    
         RLOOKUP_OUT(59,K)=REALHD_OUT(3)-(REALHD_OUT(2)*U_ROWS_OUT)        UIE2F401.319    
         RLOOKUP_OUT(61,K)=REALHD_OUT(4)-REALHD_OUT(1)*.5                  UIE2F401.320    
       ELSE                                                                UIE2F401.321    
         ! Otherwise calc. zeroth lat and lat. spacing for UM c grid.      UIE2F401.322    
         RLOOKUP_OUT(59,K)=REALHD_OUT(3)+REALHD_OUT(2)                     UIE2F401.323    
         RLOOKUP_OUT(61,K)=REALHD_OUT(4)-REALHD_OUT(1)*.5                  UIE2F401.324    
       END IF                                                              UIE2F401.325    
      ELSE IF(PPXREF_GRID_TYPE.EQ.19) THEN                                 UIE2F401.326    
       ! If data on v points on a c grid calc. zeroth lat and lat. spaci   UIE2F401.327    
       IF(FIXHD_OUT(3).EQ.5) THEN                                          UIE2F401.328    
         ! Reverse v rows for new dynamics grid/VAR when fixhd_out         UIE2F401.329    
         ! indicates a radial grid.                                        UIE2F401.330    
         RLOOKUP_OUT(59,K)=REALHD_OUT(3) - (REALHD_OUT(2) *                UIE2F401.331    
     &                     P_ROWS_OUT) + REALHD_OUT(2)* 0.5                UIE2F401.332    
         RLOOKUP_OUT(61,K)=REALHD_OUT(4)-REALHD_OUT(1)                     UIE2F401.333    
       ELSE                                                                UIE2F401.334    
         ! Otherwise calc. zeroth lat and lat. spacing for UM c grid.      UIE2F401.335    
         RLOOKUP_OUT(59,K)=REALHD_OUT(3)+REALHD_OUT(2)*.5                  UIE2F401.336    
         RLOOKUP_OUT(61,K)=REALHD_OUT(4)-REALHD_OUT(1)                     UIE2F401.337    
       END IF                                                              UIE2F401.338    
                                                                           UIE2F401.339    
      END IF                                                               UIE2F401.340    
        ELSE IF(GRID_TYPE(IPROGPSN(K)).EQ.3)THEN                           UDG1F400.315    
          RLOOKUP_OUT(59,K)=REALHD_OUT(3)-REALHD_OUT(2)*.5                 GDG5F304.58     
          RLOOKUP_OUT(61,K)=REALHD_OUT(4)-REALHD_OUT(1)*.5                 GDG5F304.59     
        ENDIF                                                              CONVLOO1.474    
                                                                           CONVLOO1.475    
        ENDIF                                                              CONVLOO1.476    
                                                                           CONVLOO1.477    
! Set lookup 13 from LCAL360. prefromed in UI prior to vn 3.5              UDG2F305.389    
      IF(LCAL360)THEN                                                      UDG2F305.390    
        LOOKUP_OUT(13,K)=2                                                 UDG2F305.391    
      ELSE                                                                 UDG2F305.392    
        LOOKUP_OUT(13,K)=1                                                 UDG2F305.393    
      ENDIF                                                                UDG2F305.394    
                                                                           UDG2F305.395    
                                                                           CONVLOO1.485    
      ENDDO                                                                CONVLOO1.486    
                                                                           CONVLOO1.494    
      RETURN                                                               CONVLOO1.495    
      END                                                                  CONVLOO1.496    
*ENDIF                                                                     CONVLOO1.497