*IF DEF,CONTROL,OR,DEF,RECON,OR,DEF,CAMDUMP,OR,DEF,FLDOP                   GAV0F405.88     
C ******************************COPYRIGHT******************************    GTS2F400.12293  
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.12294  
C                                                                          GTS2F400.12295  
C Use, duplication or disclosure of this code is subject to the            GTS2F400.12296  
C restrictions as set forth in the contract.                               GTS2F400.12297  
C                                                                          GTS2F400.12298  
C                Meteorological Office                                     GTS2F400.12299  
C                London Road                                               GTS2F400.12300  
C                BRACKNELL                                                 GTS2F400.12301  
C                Berkshire UK                                              GTS2F400.12302  
C                RG12 2SZ                                                  GTS2F400.12303  
C                                                                          GTS2F400.12304  
C If no contract has been raised with this copy of the code, the use,      GTS2F400.12305  
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.12306  
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.12307  
C Modelling at the above address.                                          GTS2F400.12308  
C                                                                          GTS2F400.12309  
!+Determine STASH input length per vertical level for prog var             ADDRLN1.3      
! Subroutine Interface:                                                    ADDRLN1.4      
                                                                           ADDRLN1.5      

      SUBROUTINE ADDRLN(IGPL,LEN,                                           4,8GPB1F402.270    
*IF DEF,MPP                                                                GPB1F402.271    
     &                  size_type,                                         GPB1F402.272    
*ENDIF                                                                     GPB1F402.273    
     &                  ErrorStatus)                                       GPB1F402.274    
      IMPLICIT NONE                                                        ADDRLN1.7      
! Description:                                                             ADDRLN1.8      
!                                                                          ADDRLN1.9      
! Method:                                                                  ADDRLN1.10     
!                                                                          ADDRLN1.11     
! Current code owner:  S.J.Swarbrick                                       ADDRLN1.12     
!                                                                          ADDRLN1.13     
! History:                                                                 ADDRLN1.14     
! Version   Date       Comment                                             ADDRLN1.15     
! =======   ====       =======                                             ADDRLN1.16     
!   3.5     Apr. 95    Original code.  S.J.Swarbrick                       ADDRLN1.17     
!   4.0     05/12/95   Cater for ozone zonal/full fields. D. Robinson      GDR4F400.13     
!   4.1     June 96    Enhanced for wave model etc. S.J.Swarbrick          GSS3F401.49     
!   4.1     20/03/96   Modify lengths of some types of fields for          GPB0F401.104    
!                      MPP code.   P.Burton                                GPB0F401.105    
!   4.1     20/03/95   Allow a rimwidth for ocean LAM. S.Ineson            GOK0F401.1      
!   4.2     03/09/96   Tidy up MPP addressing and                          GPB1F402.275    
!                      add extra argument for MPP version                  GPB1F402.276    
!                      which allows local or global data size to           GPB1F402.277    
!                      be calculated.   P.Burton                           GPB1F402.278    
!   4.3     13/03/97   Further MPP changes          P.Burton               GPB0F403.3022   
!  4.4  05/09/97  Modify LENRIMDATA_A for nonMPP case to use L_LSPICE      ARB1F404.8      
!                 as this is also used in reconfiguration which does       ARB1F404.9      
!                 not call DERVSIZE.                      RTHBarnes.       ARB1F404.10     
!  4.5  12/09/97  New ocean LAM code. C.G.Jones/S.Ineson/M.Bell            GSI1F405.1      
!   4.5     18/08/98   Added DEF,FLDOP   (A Van der Wal)                   GAV0F405.89     
!  4.5  15/04/98  Use new variables global/local_land_field                GDR5F405.26     
!                 for fields on land points. D. Robinson.                  GDR5F405.27     
!                                                                          ADDRLN1.18     
!  Code description:                                                       ADDRLN1.19     
!    FORTRAN 77 + common Fortran 90 extensions.                            ADDRLN1.20     
!    Written to UM programming standards version 7.                        ADDRLN1.21     
!                                                                          ADDRLN1.22     
!  System component covered:                                               ADDRLN1.23     
!  System task:               Sub-Models Project                           ADDRLN1.24     
!                                                                          ADDRLN1.25     
! Global variables:                                                        ADDRLN1.26     
*CALL CSUBMODL                                                             ADDRLN1.28     
*CALL VERSION                                                              ADDRLN1.29     
*CALL TYPSIZE                                                              GSS3F401.50     
*CALL CNTLATM                                                              ARB1F404.11     
*CALL CNTLOCN                                                              GSI1F405.2      
*CALL MODEL                                                                GSS3F401.51     
*IF DEF,MPP                                                                GPB1F402.279    
*CALL PARVARS                                                              GPB1F402.280    
*ENDIF                                                                     GPB1F402.281    
                                                                           ADDRLN1.32     
! Subroutine arguments:                                                    ADDRLN1.33     
!   Scalar arguments with intent(in):                                      ADDRLN1.34     
      INTEGER IGPL                                                         ADDRLN1.35     
                                                                           ADDRLN1.36     
!   Scalar arguments with intent(out):                                     ADDRLN1.37     
      INTEGER LEN                                                          ADDRLN1.38     
*IF DEF,MPP                                                                GPB1F402.282    
      INTEGER size_type ! IN : indicates whether local or global           GPB1F402.283    
!                       !      data size is required                       GPB1F402.284    
*ENDIF                                                                     GPB1F402.285    
                                                                           GPB1F402.286    
      CHARACTER*80 CMESSAGE                                                GSS3F401.52     
                                                                           ADDRLN1.39     
! Local scalars:                                                           ADDRLN1.40     
      INTEGER I                                                            ADDRLN1.41     
      INTEGER IP                                                           ADDRLN1.42     
      INTEGER IQ                                                           ADDRLN1.43     
      INTEGER IT                                                           ADDRLN1.44     
      INTEGER IX1                                                          ADDRLN1.45     
      INTEGER IX2                                                          ADDRLN1.46     
      INTEGER IY1                                                          ADDRLN1.47     
      INTEGER IY2                                                          ADDRLN1.48     
*IF DEF,MPP                                                                GPB1F402.287    
      INTEGER                                                              GPB0F403.3023   
     &  local_IX1,local_IX2,local_IY1,local_IY2                            GPB0F403.3024   
     &, fld_type ! indicates if field on u or p grid                       GPB0F403.3025   
                                                                           GPB0F403.3026   
      INTEGER                                                              GPB0F403.3027   
     &  GET_FLD_TYPE  ! function for finding the field typr                GPB0F403.3028   
*ENDIF                                                                     GPB1F402.289    
      INTEGER                                                              GPB0F403.3029   
     &  ocean_extra_pts ! extra points added to ocean row length           GPB0F403.3030   
!                       ! to allow for the wrap around pts at the          GPB0F403.3031   
!                       ! start and end of each global row                 GPB0F403.3032   
*IF -DEF,MPP                                                               GSI1F405.3      
C  Local variables for calculation of ocean LAM dimensions                 GSI1F405.4      
       integer n_obdy_t_grd  ! # of ocean bdy fields  } on T grid          GSI1F405.5      
       integer n_obdy_u_grd  !   stored in dump       } on u/v grid        GSI1F405.6      
       integer numside_rowso  ! # of rows in each ocean bdy field          GSI1F405.7      
       integer numside_colso  ! # of columns in each ocean bdy field       GSI1F405.8      
       integer count ! loop counter                                        GSI1F405.9      
       integer num_o_tracers   ! # of ocean tracer fields - used because   GSI1F405.10     
                               ! nt is not initialised in reconfig code    GSI1F405.11     
*ENDIF                                                                     GSI1F405.12     
                                                                           ADDRLN1.49     
! ErrorStatus:                                                             ADDRLN1.50     
      INTEGER ErrorStatus                                                  ADDRLN1.51     
                                                                           ADDRLN1.52     
! Function and subroutine calls:                                           ADDRLN1.53     
      EXTERNAL LLTORC,LEVCOD                                               ADDRLN1.54     
                                                                           ADDRLN1.55     
!- End of Header ---------------------------------------------------       ADDRLN1.56     
                                                                           ADDRLN1.57     
! Determine row/column nos. for global domain                              ADDRLN1.58     
      CALL LLTORC(IGPL,90,-90,0,360,IY1,IY2,IX1,IX2)                       ADDRLN1.59     
                                                                           GPB1F402.290    
*IF DEF,MPP                                                                GPB1F402.291    
      IF ((size_type .EQ. local_data) .AND.                                GPB0F403.3033   
     &    ((IGPL .NE. 21) .AND. (IGPL .NE. 25) .AND.                       GPB0F403.3034   
     &     (IGPL .NE. 31) .AND. (IGPL .NE. 32) .AND.                       GPB0F403.3035   
     &     (IGPL .NE. 51))) THEN                                           GPB0F403.3036   
                                                                           GPB0F403.3037   
! Convert the global subdomain limits to local subdomain limits            GPB1F402.293    
        CALL GLOBAL_TO_LOCAL_SUBDOMAIN( .TRUE.,.TRUE.,                     GPB1F402.294    
     &                                  IGPL,mype,                         GPB1F402.295    
     &                                  IY1,IX2,IY2,IX1,                   GPB1F402.296    
     &                                  local_IY1,local_IX2,               GPB1F402.297    
     &                                  local_IY2,local_IX1)               GPB1F402.298    
                                                                           GPB1F402.299    
                                                                           GPB0F403.3038   
        IX1=local_IX1                                                      GPB1F402.300    
        IX2=local_IX2                                                      GPB1F402.301    
        IY1=local_IY1                                                      GPB1F402.302    
        IY2=local_IY2                                                      GPB1F402.303    
                                                                           GPB0F403.3039   
        ocean_extra_pts=0                                                  GPB0F403.3040   
        IF (atleft) ocean_extra_pts=ocean_extra_pts+1                      GPB0F403.3041   
        IF (atright) ocean_extra_pts=ocean_extra_pts+1                     GPB0F403.3042   
      ELSE                                                                 GPB0F403.3043   
        ocean_extra_pts=2 ! extra pt at start and end of row for           GPB0F403.3044   
!                         ! wrap around                                    GPB0F403.3045   
      ENDIF                                                                GPB1F402.304    
*ELSE                                                                      GPB0F403.3046   
      ocean_extra_pts=2 ! extra pt at start and end of row for             GPB0F403.3047   
!                       ! wrap around                                      GPB0F403.3048   
*ENDIF                                                                     GPB1F402.305    
                                                                           ADDRLN1.60     
      IF(IGPL.EQ.21) THEN                                                  ADDRLN1.61     
*IF DEF,ATMOS,AND,DEF,MPP                                                  GPB1F402.306    
        IF (size_type .EQ. local_data) THEN                                GPB1F402.307    
          len = local_land_field                                           GDR5F405.28     
        ELSE                                                               GPB1F402.309    
          LEN=LAND_FIELD                                                   GPB1F402.310    
          len = global_land_field                                          GDR5F405.29     
        ENDIF                                                              GPB1F402.311    
*ELSE                                                                      GPB0F401.112    
        LEN=LAND_FIELD                                                     ADDRLN1.62     
*ENDIF                                                                     GPB0F401.113    
      ELSE IF(IGPL.EQ.22) THEN                                             ADDRLN1.63     
        IF (ZonAvOzone) THEN   !  Zonal                                    GDR4F400.14     
*IF -DEF,MPP                                                               GPB0F403.3049   
          LEN = IY2-IY1+1                                                  GDR4F400.15     
*ELSE                                                                      GPB0F403.3050   
          IF (size_type .EQ. local_data) THEN                              GPB0F403.3051   
            LEN = IY2-IY1+1+2*Offy  ! include halos                        GPB0F403.3052   
          ELSE                                                             GPB0F403.3053   
            LEN = IY2-IY1+1                                                GPB0F403.3054   
          ENDIF                                                            GPB0F403.3055   
*ENDIF                                                                     GPB0F403.3056   
        ELSE                   !  Full fields                              GDR4F400.16     
          LEN = (IX2-IX1+1)*(IY2-IY1+1)                                    GDR4F400.17     
        ENDIF                                                              GDR4F400.18     
      ELSE IF(IGPL.EQ.25) THEN                                             ADDRLN1.65     
*IF DEF,MPP                                                                GPB1F402.312    
        IF (size_type .EQ. local_data) THEN                                GPB1F402.313    
          LEN=LENRIMDATA_A  ! this value calculated in DERVSIZE            GPB1F402.314    
        ELSE                                                               GPB1F402.315    
          LEN=global_LENRIMDATA_A                                          GPB1F402.316    
        ENDIF                                                              GPB1F402.317    
*ELSE                                                                      GPB0F401.116    
! Could use LEN = LENRIMDATA_A from DERVSIZE in nonMPP model, but          ARB1F404.12     
! this value is also needed in reconfiguration which does not call         ARB1F404.13     
! DERVSIZE, so recalculated here using L_LSPICE_BDY from CNTLATM.          ARB1F404.14     
        CALL LEVCOD( 2,IP,ErrorStatus,CMESSAGE)   ! pressure levels        ARB1F404.15     
        CALL LEVCOD( 3,IQ,ErrorStatus,CMESSAGE)   ! wet levels             ARB1F404.16     
        CALL LEVCOD(11,IT,ErrorStatus,CMESSAGE)   ! tracer levels          ARB1F404.17     
        IF (L_LSPICE_BDY) THEN                                             ARB1F404.18     
          IQ = 2*IQ   ! for mixed phase precip LBCs contain QT & QCF       ARB1F404.19     
        END IF                                                             ARB1F404.20     
        LEN=(P_ROWS+ROW_LENGTH-2*RIMWIDTHA)*2*RIMWIDTHA*                   ADDRLN1.69     
     *  (1+3*IP+IQ+TR_VARS*IT)-2*IP*4*RIMWIDTHA                            ADDRLN1.70     
*ENDIF                                                                     GPB0F401.117    
      ELSE IF((IGPL.EQ.31).OR.(IGPL.EQ.32)) THEN                           ADDRLN1.71     
        LEN = -1  ! SET FLAG AT THIS STAGE AS A MULTI-LEVEL COMPRESS       ADDRLN1.72     
      ELSE IF (COX_O .AND. ((IGPL .GE. 36) .AND. (IGPL .LE.39))) THEN      GPB0F403.3057   
*IF -DEF,MPP                                                               GPB0F403.3058   
        LEN=(IX2-IX1+1+ocean_extra_pts)*(IY2-IY1+1)                        GPB0F403.3059   
*ELSE                                                                      GPB0F403.3060   
        IF (size_type .EQ. local_data) THEN                                GPB0F403.3061   
! Primary fields on the wind grid are overdimensioned by one               GPB0F403.3062   
! row to make them the same size as the mass grid                          GPB0F403.3063   
          fld_type=GET_FLD_TYPE(IGPL)                                      GPB0F403.3064   
                                                                           GPB0F403.3065   
          IF (atbase .AND. (fld_type .EQ. fld_type_u)) THEN                GPB0F403.3066   
            LEN=(IX2-IX1+1+ocean_extra_pts)*(IY2-IY1+2+2*Offy)             GPB0F403.3067   
          ELSE                                                             GPB0F403.3068   
            LEN=(IX2-IX1+1+ocean_extra_pts)*(IY2-IY1+1+2*Offy)             GPB0F403.3069   
          ENDIF                                                            GPB0F403.3070   
        ELSE                                                               GPB0F403.3071   
          LEN=(IX2-IX1+1+ocean_extra_pts)*(IY2-IY1+1)                      GPB0F403.3072   
        ENDIF                                                              GPB0F403.3073   
*ENDIF                                                                     GPB0F403.3074   
*IF DEF,MPP                                                                ORH5F403.295    
      ELSE IF (IGPL.EQ.41) THEN                                            ORH5F403.296    
           ! This is without cyclic points so we dont include              ORH5F403.297    
           !  ocean_extra_pts in the calculation.                          ORH5F403.298    
           LEN =(IX2-IX1+1+2*Offx)*(IY2-IY1+1+2*Offy)                      ORH5F403.299    
      ELSE IF (IGPL.EQ.42) THEN                                            ORH5F403.300    
          ! This is without cyclic points so we dont include               ORH0F404.8      
          ! ocean_extra_pts in the calculation.                            ORH0F404.9      
          fld_type=GET_FLD_TYPE(IGPL)                                      ORH0F404.10     
          IF (atbase .AND. (fld_type .EQ. fld_type_u)) THEN                ORH0F404.11     
             LEN =(IX2-IX1+1+2*Offx)*(IY2-IY1+2+2*Offy)                    ORH0F404.12     
          ELSE                                                             ORH0F404.13     
             LEN =(IX2-IX1+1+2*Offx)*(IY2-IY1+1+2*Offy)                    ORH0F404.14     
          ENDIF                                                            ORH0F404.15     
*ENDIF                                                                     ORH5F403.304    
      ELSE IF(IGPL.EQ.51) THEN                                             ADDRLN1.81     
*IF DEF,MPP                                                                GSI1F405.13     
        IF (size_type .EQ. local_data) THEN                                GSI1F405.14     
           LEN = LENRIMDATA_O                                              GSI1F405.15     
        ELSE                                                               GSI1F405.16     
           LEN = global_LENRIMDATA_O                                       GSI1F405.17     
        ENDIF                                                              GSI1F405.18     
*ELSE                                                                      GSI1F405.19     
                                                                           GSI1F405.20     
CL Calculate the number of ocean tracers then the length                   GSI1F405.21     
CL of boundary data. NT is not available from reconfig code.               GSI1F405.22     
                                                                           GSI1F405.23     
      num_o_tracers =2                                                     GSI1F405.24     
      do count = 1, 18     ! extra tracers                                 GSI1F405.25     
        if (TRACER_O(count)) num_o_tracers = num_o_tracers + 1             GSI1F405.26     
      end do                                                               GSI1F405.27     
                                                                           GSI1F405.28     
      call  o_lbc_sizes( NLEVSO, num_o_tracers, rimwidtho,                 GSI1F405.29     
     #       numside_rowso, numside_colso,                                 GSI1F405.30     
     #       RIM_LOOKUPSO, n_obdy_t_grd, n_obdy_u_grd )                    GSI1F405.31     
                                                                           GSI1F405.32     
C LEN is the length on the local processor so usually velocity data        GSI1F405.33     
C will have same number of rows as tracer data                             GSI1F405.34     
                                                                           GSI1F405.35     
       LEN = (ncolso*numside_rowso+nrowso*numside_colso)*n_obdy_t_grd      GSI1F405.36     
     &     + ((ncolso-1)*numside_rowso+(nrowso)*numside_colso)             GSI1F405.37     
     &                                           *n_obdy_u_grd             GSI1F405.38     
                                                                           GSI1F405.39     
*ENDIF                                                                     GSI1F405.40     
      ELSE IF(IGPL.EQ.62) THEN                                             GSS3F401.56     
!Wave model - sea points only                                              GSS3F401.57     
        LEN=W_SEA_POINTS                                                   GSS3F401.58     
      ELSE                                                                 ADDRLN1.89     
        IF (IGPL.GE.60.AND.IGPL.LT.70) THEN                                GSS3F401.59     
!Wave model grid - first lat is southern most                              GSS3F401.60     
          LEN =(IX2-IX1+1)*(IY1-IY2+1)                                     GSS3F401.61     
        ELSE                                                               GSS3F401.62     
!Atmos grid - first lat is northern most                                   GSS3F401.63     
          LEN =(IX2-IX1+1)*(IY2-IY1+1)                                     GSS3F401.64     
        END IF                                                             GSS3F401.65     
      END IF                                                               ADDRLN1.91     
                                                                           ADDRLN1.92     
      RETURN                                                               ADDRLN1.93     
      END                                                                  ADDRLN1.94     
                                                                           ADDRLN1.95     
!- End of subroutine code ------------------------------------------       ADDRLN1.96     
*ENDIF                                                                     ADDRLN1.97