*IF DEF,CONTROL                                                            INPUTL1.2      
C ******************************COPYRIGHT******************************    GTS2F400.12463  
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.12464  
C                                                                          GTS2F400.12465  
C Use, duplication or disclosure of this code is subject to the            GTS2F400.12466  
C restrictions as set forth in the contract.                               GTS2F400.12467  
C                                                                          GTS2F400.12468  
C                Meteorological Office                                     GTS2F400.12469  
C                London Road                                               GTS2F400.12470  
C                BRACKNELL                                                 GTS2F400.12471  
C                Berkshire UK                                              GTS2F400.12472  
C                RG12 2SZ                                                  GTS2F400.12473  
C                                                                          GTS2F400.12474  
C If no contract has been raised with this copy of the code, the use,      GTS2F400.12475  
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.12476  
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.12477  
C Modelling at the above address.                                          GTS2F400.12478  
C                                                                          GTS2F400.12479  
!+                                                                         INPUTL1.3      
! Subroutine Interface:                                                    INPUTL1.4      
                                                                           INPUTL1.5      

      SUBROUTINE INPUTL(NRECS,                                              1,19INPUTL1.6      
*CALL ARGPPX                                                               INPUTL1.7      
     &                   NLEVELS,ErrorStatus,CMESSAGE)                     GSS3F401.507    
      IMPLICIT NONE                                                        INPUTL1.9      
! Description:                                                             INPUTL1.10     
!                                                                          INPUTL1.11     
! Method:                                                                  INPUTL1.12     
!                                                                          INPUTL1.13     
! Current code owner:  S.J.Swarbrick                                       INPUTL1.14     
!                                                                          INPUTL1.15     
! History:                                                                 INPUTL1.16     
! Version   Date       Comment                                             INPUTL1.17     
! =======   ====       =======                                             INPUTL1.18     
!   3.5     Apr. 95    Original code.  S.J.Swarbrick                       INPUTL1.19     
!   4.1     Apr. 96      Allow for prognostics with pseudo-levels:         GSS3F401.502    
!                        LevFlag=0 now implies input on all available      GSS3F401.503    
!                        levels and pseudo-levels. Also other additions    GSS3F401.504    
!                        for wave-model grid.                              GSS3F401.505    
!                                                          S.J.Swarbrick   GSS3F401.506    
!   4.2     06/09/96   MPP code : Use local size for calculating           GPB1F402.342    
!                      horizontal dimension.    P.Burton                   GPB1F402.343    
!                                                                          INPUTL1.20     
!   4.3     30/01/97   Ensure that domain decomposition is consistent      GRR0F403.271    
!                      with submodel. R.Rawlins                            GRR0F403.272    
!  Code description:                                                       INPUTL1.21     
!    FORTRAN 77 + common Fortran 90 extensions.                            INPUTL1.22     
!    Written to UM programming standards version 7.                        INPUTL1.23     
!                                                                          INPUTL1.24     
!  System component covered:                                               INPUTL1.25     
!  System task:               Sub-Models Project                           INPUTL1.26     
!                                                                          INPUTL1.27     
! Global variables:                                                        INPUTL1.28     
                                                                           INPUTL1.29     
*CALL CSUBMODL                                                             INPUTL1.30     
*CALL CPPXREF                                                              GSS3F401.508    
*CALL PPXLOOK                                                              GSS3F401.509    
*CALL TYPSIZE                                                              GSS3F401.510    
*CALL CSTASH                                                               GRB0F401.10     
*CALL STEXTEND                                                             INPUTL1.33     
*CALL MODEL                                                                INPUTL1.34     
*CALL STPARAM                                                              INPUTL1.35     
*IF DEF,MPP                                                                GPB1F402.344    
*CALL PARVARS                                                              GPB1F402.345    
*CALL DECOMPTP                                                             GRR0F403.273    
*ENDIF                                                                     GPB1F402.346    
                                                                           INPUTL1.38     
! Subroutine arguments:                                                    INPUTL1.39     
!   Scalar arguments with intent(in):                                      GSS3F401.511    
      INTEGER NRECS                                                        INPUTL1.43     
                                                                           INPUTL1.44     
!   Scalar arguments with intent(out):                                     INPUTL1.45     
      INTEGER NLEVELS   ! total no. of sets of stash levels                GSS3F401.512    
                                                                           INPUTL1.49     
!   Scalar arguments with intent(out):                                     INPUTL1.50     
                                                                           INPUTL1.51     
! ErrorStatus:                                                             INPUTL1.52     
      INTEGER ErrorStatus                                                  INPUTL1.53     
                                                                           INPUTL1.54     
! Local scalars:                                                           INPUTL1.55     
      LOGICAL MODEL_LEV                                                    GSS3F401.513    
      CHARACTER*80 CMESSAGE                                                GSS9F402.171    
      LOGICAL LADD                                                         INPUTL1.58     
      LOGICAL LDUPLL                                                       INPUTL1.59     
      INTEGER I,IL,ILIN                                                    GSS3F401.514    
      INTEGER ISTART,IEND                                                  GSS3F401.515    
      INTEGER MODL                                                         INPUTL1.63     
      INTEGER ISEC                                                         INPUTL1.64     
      INTEGER IITM                                                         INPUTL1.65     
      INTEGER IP_IN                                                        INPUTL1.68     
      INTEGER IX1,IX2                                                      GSS3F401.516    
      INTEGER IY1,IY2                                                      GSS3F401.517    
      INTEGER IZ_IN                                                        INPUTL1.73     
      INTEGER LEN_IN                                                       INPUTL1.74     
      INTEGER LEN_PRIMIN                                                   INPUTL1.75     
      INTEGER NDUPLL                                                       INPUTL1.76     
      INTEGER NLEVIN                                                       INPUTL1.77     
      INTEGER LENO                                                         INPUTL1.78     
      INTEGER IPF,IPL                                                      GSS3F401.518    
*IF DEF,MPP                                                                GPB1F402.347    
! local versions of the global subdomain limits                            GPB1F402.348    
      INTEGER local_IX1,local_IX2,local_IY1,local_IY2                      GPB1F402.349    
      INTEGER                                                              GRR0F403.274    
     &        orig_decomp      ! MPP decomposition before start            GRR0F403.275    
     &       ,decomp_type      ! decomposition type                        GRR0F403.276    
     &       ,sm_ident         ! submodel identifier                       GRR0F403.277    
*ENDIF                                                                     GPB1F402.350    
                                                                           INPUTL1.79     
! Function and subroutine calls:                                           INPUTL1.80     
      LOGICAL  DISCT_LEV                                                   GSS3F401.519    
      INTEGER  EXPPXI                                                      INPUTL1.82     
      EXTERNAL EXPPXI,LEVSRT,LLTORC,ADDRLN,OCNVOL                          GSS3F401.520    
*IF DEF,MPP                                                                GRR0F403.278    
      External CHANGE_DECOMPOSITION,GLOBAL_TO_LOCAL_SUBDOMAIN              GRR0F403.279    
*ENDIF                                                                     GRR0F403.280    
                                                                           INPUTL1.84     
!- End of Header ----------------------------------------------------      INPUTL1.85     
                                                                           INPUTL1.87     
*IF DEF,MPP                                                                GRR0F403.281    
      orig_decomp = current_decomp_type                                    GRR0F403.282    
*ENDIF                                                                     GRR0F403.283    
                                                                           GRR0F403.284    
      DO MODL=1,N_INTERNAL_MODEL_MAX                                       INPUTL1.88     
*IF DEF,MPP                                                                GRR0F403.285    
!                                                                          GRR0F403.286    
!    Ensure that domain decomposition is consistent with submodel          GRR0F403.287    
!                                                                          GRR0F403.288    
      sm_ident = SUBMODEL_PARTITION_INDEX(MODL)                            GRR0F403.289    
      IF(sm_ident.EQ.atmos_sm) THEN                                        GRR0F403.290    
         decomp_type = decomp_standard_atmos                               GRR0F403.291    
      ELSEIF(sm_ident.EQ.ocean_sm) THEN                                    GRR0F403.292    
         decomp_type = decomp_standard_ocean                               GRR0F403.293    
      ELSE                            ! No decomposition defined:          GRR0F403.294    
         decomp_type = orig_decomp    !  return to original                GRR0F403.295    
      ENDIF                                                                GRR0F403.296    
                                                                           GRR0F403.297    
      CALL CHANGE_DECOMPOSITION(decomp_type,ErrorStatus)                   GRR0F403.298    
                                                                           GRR0F403.299    
      IF(ErrorStatus.GT.0) THEN                                            GRR0F403.300    
         CMESSAGE='INPUTL: ERROR in changing MPP decomposition'            GRR0F403.301    
         write(6,*) CMESSAGE                                               GRR0F403.302    
         GOTO 999                                                          GRR0F403.303    
      ENDIF                                                                GRR0F403.304    
*ENDIF                                                                     GRR0F403.305    
      DO ISEC=0,PPXREF_SECTIONS                                            INPUTL1.89     
      DO IITM=1,PPXREF_ITEMS                                               INPUTL1.90     
        IF(INDX_S(2,MODL,ISEC,IITM).GE.1) THEN                             INPUTL1.92     
! At least one stash rec                                                   INPUTL1.93     
        IGP     = EXPPXI(MODL,ISEC,IITM,ppx_grid_type     ,                GSS3F401.521    
*CALL ARGPPX                                                               INPUTL1.98     
     &                                         ErrorStatus,CMESSAGE)       INPUTL1.99     
        ILEV    = EXPPXI(MODL,ISEC,IITM,ppx_lv_code       ,                GSS3F401.522    
*CALL ARGPPX                                                               INPUTL1.101    
     &                                         ErrorStatus,CMESSAGE)       INPUTL1.102    
        IFLAG   = EXPPXI(MODL,ISEC,IITM,ppx_lev_flag      ,                GSS3F401.523    
*CALL ARGPPX                                                               INPUTL1.104    
     &                                         ErrorStatus,CMESSAGE)       INPUTL1.105    
        IPSEUDO = EXPPXI(MODL,ISEC,IITM,ppx_pt_code       ,                GSS3F401.524    
*CALL ARGPPX                                                               ORH5F400.19     
     &                                         ErrorStatus,CMESSAGE)       GSS3F401.525    
        IPFIRST = EXPPXI(MODL,ISEC,IITM,ppx_pf_code       ,                GSS3F401.526    
*CALL ARGPPX                                                               GSS3F401.527    
     &                                         ErrorStatus,CMESSAGE)       GSS3F401.528    
        IPLAST  = EXPPXI(MODL,ISEC,IITM,ppx_pl_code       ,                GSS3F401.529    
*CALL ARGPPX                                                               GSS3F401.530    
     &                                         ErrorStatus,CMESSAGE)       GSS3F401.531    
                                                                           INPUTL1.106    
          ISTART=       INDX_S(1,MODL,ISEC,IITM)   ! Pos of 1st rec        INPUTL1.107    
          IEND  =ISTART+INDX_S(2,MODL,ISEC,IITM)-1 ! Pos of last rec       INPUTL1.108    
! Diagnostics with input on levels list (IFLAG=1),                         GSS3F401.532    
!  rather than on all possible levels                                      GSS3F401.533    
          IF((IFLAG .EQ.1   ).AND.                  !Input on lev list     GSS3F401.534    
     &       (ISTART.EQ.IEND).AND.                  !Only 1 stash rec      GSS3F401.535    
     &       (LIST_S(st_output_bottom,ISTART).LT.0))!Output on lev list    GSS3F401.536    
     &        THEN                                                         GSS3F401.537    
! Only one stash record for this m,s,i - output levels list is             GSS3F401.538    
!  the same as the input levels list                                       GSS3F401.539    
            LIST_S(st_input_bottom ,ISTART)=                               INPUTL1.116    
     &      LIST_S(st_output_bottom,ISTART)                                INPUTL1.117    
          ELSE IF (IFLAG.EQ.1.AND.ILEV.NE.5) THEN                          GSS3F401.540    
! Input on levels list & more than one stash request -                     GSS3F401.541    
!  construct input levels list                                             GSS3F401.542    
            NLEVELS=NLEVELS+1                                              GSS3F401.543    
            IF (NLEVELS.GT.NLEVLSTSP) THEN                                 INPUTL1.123    
              WRITE(6,*) 'ERROR IN ROUTINE INPUTL:'                        GSS3F401.544    
              WRITE(6,*) 'TOO MANY STASH LEVELS LISTS REQUESTED ',         GSS3F401.545    
     &                   'ARRAYS WILL BE OVERWRITTEN'                      GSS3F401.546    
              WRITE(6,*) 'REDUCE NUMBER OF LEVELS LISTS'                   GSS3F401.547    
              ErrorStatus=1                                                GSS3F401.548    
              GO TO 999                                                    GSS3F401.549    
            END IF                                                         INPUTL1.127    
! Construct input levels list: this is the combined list of all            GSS3F401.550    
!  the output levels for all the stash requests for this m,s,i             GSS3F401.551    
            NLEVIN=1                                                       INPUTL1.129    
! Set levels list type - real or integer                                   GSS3F401.552    
            MODEL_LEV=DISCT_LEV(ILEV,ErrorStatus,CMESSAGE)                 GSS3F401.553    
            IF (.NOT.MODEL_LEV) THEN                                       GSS3F401.554    
! Non-model levels - real                                                  GSS3F401.555    
              LLISTTY(NLEVELS)='R'                                         GSS3F401.556    
! Model levels - integer                                                   GSS3F401.557    
            ELSE                                                           INPUTL1.137    
              LLISTTY(NLEVELS)='I'                                         GSS3F401.558    
            END IF                                                         INPUTL1.140    
! Loop over stash recs for this m,s,i                                      GSS3F401.559    
            DO I=ISTART,IEND                                               GSS3F401.560    
! Pointer for input level list                                             GSS3F401.561    
              LIST_S(st_input_bottom,I)=-NLEVELS                           GSS3F401.562    
              IF (LIST_S(st_output_bottom,I).LT.0) THEN                    GSS3F401.563    
! There is an output levels list:                                          GSS3F401.564    
!  For each of the levels in the output levels lists for the stash         GSS3F401.565    
!   record I, find out whether this level is already present in the        GSS3F401.566    
!   input levels list NLEVELS constructed so far.                          GSS3F401.567    
!   If it is, set LADD=F. Otherwise, LADD=T.                               INPUTL1.152    
! Loop over output levels and check each one                               GSS3F401.568    
                DO IL=2,LEVLST_S(1,-LIST_S(st_output_bottom,I))+1          INPUTL1.155    
                  LADD=.TRUE.                                              GSS3F401.569    
                  IF(NLEVIN.GT.1) THEN                                     INPUTL1.159    
                    DO ILIN=2,NLEVIN                                       INPUTL1.160    
                      IF(LIST_S(st_output_top,I).NE.1) THEN                INPUTL1.161    
! Non-model levels: real                                                   GSS3F401.570    
                        IF(RLEVLST_S(IL,-LIST_S(st_output_bottom,I))       INPUTL1.163    
     &                  .EQ.                                               INPUTL1.164    
     &                     RLEVLST_S(ILIN,NLEVELS)) LADD=.FALSE.           INPUTL1.165    
                      ELSE                                                 GSS3F401.571    
! Model levels: integer                                                    GSS3F401.572    
                        IF( LEVLST_S(IL,-LIST_S(st_output_bottom,I))       INPUTL1.167    
     &                  .EQ.                                               INPUTL1.168    
     &                      LEVLST_S(ILIN,NLEVELS)) LADD=.FALSE.           INPUTL1.169    
                      END IF                                               INPUTL1.170    
                    END DO                                                 INPUTL1.171    
                  END IF                                                   INPUTL1.172    
                                                                           INPUTL1.173    
! If LADD=T, add level 'IL' from stash record 'I' output levels list       INPUTL1.174    
!  to input levels list NLEVELS                                            GSS3F401.573    
                  IF (LADD) THEN                                           INPUTL1.177    
                    NLEVIN=NLEVIN+1                                        INPUTL1.178    
                    IF(LIST_S(st_output_top,I).NE.1) THEN                  INPUTL1.179    
                      RLEVLST_S(NLEVIN,NLEVELS)=                           INPUTL1.181    
     &                RLEVLST_S(IL,-LIST_S(st_output_bottom,I))            INPUTL1.182    
                    ELSE                                                   GSS3F401.574    
                      LEVLST_S(NLEVIN,NLEVELS)=                            INPUTL1.184    
     &                LEVLST_S(IL,-LIST_S(st_output_bottom,I))             INPUTL1.185    
                    END IF                                                 INPUTL1.186    
                  END IF                                                   INPUTL1.187    
                END DO     ! Loop over levels                              INPUTL1.189    
                                                                           INPUTL1.190    
              ELSE                                                         GSS3F401.575    
! Contiguous range of model levels for output, rather than list            GSS3F401.576    
!  Compare output levels range for stash record I with input levs          GSS3F401.577    
!   range NLEVELS. Any of the output levels not already present            GSS3F401.578    
!   in the input range is added to the input list.                         GSS3F401.579    
                DO IL=LIST_S(st_output_bottom,I),                          INPUTL1.197    
     &                LIST_S(st_output_top   ,I)                           INPUTL1.198    
                  LADD=.TRUE.                                              INPUTL1.199    
                  DO ILIN=2,NLEVIN                                         INPUTL1.200    
                    IF(IL.EQ.LEVLST_S(ILIN,NLEVELS)) LADD=.FALSE.          INPUTL1.201    
                  END DO                                                   INPUTL1.202    
                  IF(LADD) THEN                                            INPUTL1.203    
                    NLEVIN=NLEVIN+1                                        INPUTL1.204    
                    LEVLST_S(NLEVIN,NLEVELS)=IL                            INPUTL1.205    
                  END IF                                                   INPUTL1.206    
                END DO                                                     INPUTL1.207    
              END IF   !  Levels list/range                                GSS3F401.580    
            END DO     !  Loop over stash recs                             INPUTL1.211    
                                                                           INPUTL1.212    
! Record no. of levels in input list just constructed                      GSS3F401.581    
            LEVLST_S(1,NLEVELS)=NLEVIN-1                                   GSS3F401.582    
                                                                           INPUTL1.214    
            IF(NLEVIN-1.EQ.0) THEN                                         GSS3F401.583    
              WRITE(6,*) 'ORDINARY LEVEL'                                  INPUTL1.217    
              WRITE(6,*) 'ISEC=',ISEC                                      INPUTL1.218    
              WRITE(6,*) 'IITM=',IITM                                      INPUTL1.219    
              WRITE(6,*) 'NLEVELS=',NLEVELS                                INPUTL1.220    
              DO I=ISTART,IEND                                             GSS3F401.584    
                WRITE(6,*) 'I=',I                                          GSS3F401.585    
                WRITE(6,*) 'LIST_S(st_output_bottom)=',                    INPUTL1.224    
     &                      LIST_S(st_output_bottom,I)                     INPUTL1.225    
                IF (LIST_S(st_output_bottom,I).LT.0) THEN                  INPUTL1.226    
                  DO IL=2,LEVLST_S(1,-LIST_S(st_output_bottom,I))+1        INPUTL1.227    
                    WRITE(6,*) 'IL=',IL                                    INPUTL1.228    
                    WRITE(6,*)                                             INPUTL1.229    
     &              'LEVLST',LEVLST_S(IL,-LIST_S(st_output_bottom,I))      INPUTL1.230    
                  END DO                                                   INPUTL1.231    
                ELSE                                                       INPUTL1.232    
                  WRITE(6,*)                                               INPUTL1.233    
     &            'LIST_S(st_output_top=',LIST_S(st_output_top,I)          INPUTL1.234    
                END IF                                                     INPUTL1.235    
              END DO                                                       INPUTL1.236    
            END IF                                                         INPUTL1.238    
! Sort levels list                                                         INPUTL1.239    
            CALL LEVSRT(LLISTTY(  NLEVELS), LEVLST_S(1,NLEVELS),           INPUTL1.240    
     &                 LEVLST_S(2,NLEVELS),RLEVLST_S(2,NLEVELS))           INPUTL1.241    
                                                                           INPUTL1.242    
! Determine whether this levels list is a duplicate of another list        INPUTL1.243    
            CALL DUPLEVL(NLEVELS,LDUPLL,NDUPLL)                            INPUTL1.245    
            IF (LDUPLL) THEN                                               GSS3F401.586    
! Duplicate list at NDUPLL - reset pointer and reduce NLEVELS by 1         GSS3F401.587    
              NLEVELS=NLEVELS-1                                            INPUTL1.248    
              DO I=ISTART,IEND                                             INPUTL1.249    
                LIST_S(st_input_bottom,I)=-NDUPLL                          INPUTL1.250    
              END DO                                                       INPUTL1.251    
            END IF                                                         INPUTL1.252    
          END IF   !Levels lists                                           GSS3F401.588    
                                                                           INPUTL1.255    
! Pseudo levels lists                                                      INPUTL1.256    
          IF((IFLAG .EQ.1   ).AND.                                         GSS3F401.589    
     &      ((ISTART.EQ.IEND).OR.(IPSEUDO.EQ.0)) ) THEN                    GSS3F401.590    
! Either no pseudo levels or only one request:                             GSS3F401.591    
! Input pseudo levels list equals output list                              GSS3F401.592    
            LIST_S(st_pseudo_in,ISTART)=LIST_S(st_pseudo_out,ISTART)       INPUTL1.260    
          ELSE IF (IFLAG.EQ.1) THEN                                        GSS3F401.593    
! Input pseudo levels list with more than one request                      GSS3F401.594    
            NPSLISTS=NPSLISTS+1                                            INPUTL1.264    
            IF(NPSLISTS.GT.NPSLISTP) THEN                                  INPUTL1.266    
              WRITE(6,*) 'ERROR IN ROUTINE INPUTL:'                        GSS3F401.595    
              WRITE(6,*)                                                   GSS3F401.596    
     &       'TOO MANY STASH PSEUDO LEVELS LISTS REQUESTED ',              GSS3F401.597    
     &       'ARRAYS WILL BE OVERWRITTEN'                                  GSS3F401.598    
              WRITE(6,*) 'REDUCE NUMBER OF PSEUDO LISTS'                   GSS3F401.599    
              ErrorStatus=1                                                GSS3F401.600    
              GO TO 999                                                    GSS3F401.601    
            END IF                                                         INPUTL1.269    
! Construct input pseudo list: combined list of all output                 GSS3F401.602    
!  pseudo levels for all stash requests for this m,s,i                     GSS3F401.603    
            NLEVIN=0                                                       INPUTL1.271    
            DO I=ISTART,IEND                                               INPUTL1.273    
              LIST_S(st_pseudo_in,I)=NPSLISTS                              INPUTL1.274    
              DO IL=1,LENPLST(LIST_S(st_pseudo_out,I))                     INPUTL1.275    
                LADD=.TRUE.                                                INPUTL1.276    
                IF(NLEVIN.GT.0) THEN                                       INPUTL1.277    
                  DO ILIN=1,NLEVIN                                         INPUTL1.278    
                    IF( PSLIST_D(IL,LIST_S(st_pseudo_out,I)).EQ.           INPUTL1.279    
     &                  PSLIST_D(ILIN,NPSLISTS)) LADD=.FALSE.              INPUTL1.280    
                  END DO                                                   INPUTL1.281    
                END IF                                                     INPUTL1.282    
                IF(LADD) THEN                                              INPUTL1.283    
                  NLEVIN=NLEVIN+1                                          INPUTL1.284    
                  PSLIST_D(NLEVIN,NPSLISTS)=                               INPUTL1.285    
     &            PSLIST_D(IL,LIST_S(st_pseudo_out,I))                     INPUTL1.286    
                END IF                                                     INPUTL1.287    
              END DO                                                       INPUTL1.288    
            END DO                                                         INPUTL1.289    
            LENPLST(NPSLISTS)=NLEVIN                                       INPUTL1.291    
                                                                           INPUTL1.292    
            IF(NLEVIN.EQ.0) THEN                                           INPUTL1.293    
              WRITE(6,*) 'PSEUDO LEVEL'                                    INPUTL1.295    
              WRITE(6,*) 'ISEC=',ISEC                                      INPUTL1.296    
              WRITE(6,*) 'IITM=',IITM                                      INPUTL1.297    
              WRITE(6,*) 'NPSLISTS=',NPSLISTS                              INPUTL1.298    
              DO I=ISTART,IEND                                             INPUTL1.300    
                WRITE(6,*) 'I=',I                                          INPUTL1.301    
                WRITE(6,*) 'LENPLST=',LENPLST(LIST_S(st_pseudo_out,I))     INPUTL1.302    
                DO IL=1,LENPLST(LIST_S(st_pseudo_out,I))                   INPUTL1.303    
                  WRITE(6,*) 'IL=',IL                                      INPUTL1.304    
                  WRITE(6,*)                                               INPUTL1.305    
     &            'PSLIST_D',PSLIST_D(IL,LIST_S(st_pseudo_out,I))          INPUTL1.306    
                END DO                                                     INPUTL1.307    
              END DO                                                       INPUTL1.308    
            END IF                                                         INPUTL1.310    
! Sort input pseudo levels list                                            GSS3F401.604    
            CALL LEVSRT('I',LENPLST(NPSLISTS),PSLIST_D(1,NPSLISTS),        INPUTL1.312    
     &                                        PSLIST_D(1,NPSLISTS))        INPUTL1.313    
! Find out if duplicate                                                    GSS3F401.605    
            CALL DUPPSLL(LDUPLL,NDUPLL)                                    INPUTL1.315    
            IF(LDUPLL) THEN                                                GSS3F401.606    
! Duplicate pseudo list at NDUPLL                                          GSS3F401.607    
              NPSLISTS=NPSLISTS-1                                          INPUTL1.318    
              DO I=ISTART,IEND                                             INPUTL1.319    
                LIST_S(st_pseudo_in,I)=NDUPLL                              INPUTL1.320    
              END DO                                                       INPUTL1.321    
            END IF                                                         INPUTL1.322    
          ELSE IF (IFLAG.EQ.0.AND.IPSEUDO.NE.0) THEN                       GSS3F401.608    
! Input pseudo levels list contains all possible pseudo levels for         GSS3F401.609    
!  this diagnostic                                                         GSS3F401.610    
            NPSLISTS=NPSLISTS+1                                            GSS3F401.611    
            DO I=ISTART,IEND                                               GSS3F401.612    
              LIST_S(st_pseudo_in,I)=NPSLISTS                              GSS3F401.613    
! Decode first & last pseudo level codes from stash master                 GSS3F401.614    
              CALL PSLEVCOD(IPFIRST,IPF,'F',ErrorStatus,CMESSAGE)          GSS3F401.615    
              CALL PSLEVCOD(IPLAST ,IPL,'L',ErrorStatus,CMESSAGE)          GSS3F401.616    
! Construct list                                                           GSS3F401.617    
              DO NLEVIN = IPF,IPL                                          GSS3F401.618    
                PSLIST_D(NLEVIN,NPSLISTS)=NLEVIN                           GSS3F401.619    
              END DO                                                       GSS3F401.620    
            END DO                                                         GSS3F401.621    
            LENPLST(NPSLISTS)=IPL-IPF+1                                    GSS3F401.622    
          END IF   ! Pseudo levels                                         INPUTL1.324    
                                                                           INPUTL1.325    
! Calculate horizontal factor for input length                             INPUTL1.326    
          CALL LLTORC(IGP,90,-90,0,360,IY1,IY2,IX1,IX2)                    GSS3F401.623    
                                                                           GPB1F402.351    
*IF DEF,MPP                                                                GPB1F402.352    
! Convert from global to local subdomain limits                            GPB1F402.353    
        CALL GLOBAL_TO_LOCAL_SUBDOMAIN( .TRUE., .TRUE.,                    GPB1F402.354    
     &                                  IGP,mype,                          GPB1F402.355    
     &                                  IY1,IX2,IY2,IX1,                   GPB1F402.356    
     &                                  local_IY1,local_IX2,               GPB1F402.357    
     &                                  local_IY2,local_IX1)               GPB1F402.358    
        IX1=local_IX1                                                      GPB1F402.359    
        IX2=local_IX2                                                      GPB1F402.360    
        IY1=local_IY1                                                      GPB1F402.361    
        IY2=local_IY2                                                      GPB1F402.362    
*ENDIF                                                                     GPB1F402.363    
        IF (IGP.GE.60.AND.IGP.LT.70) THEN                                  GSS3F401.624    
!Wave model grid - first lat is southern most                              GSS3F401.625    
          LEN_IN=(IX2-IX1+1)*(IY1-IY2+1)                                   GSS3F401.626    
        ELSE                                                               GSS3F401.627    
!Atmos grid - first lat is northern most                                   GSS3F401.628    
          LEN_IN=(IX2-IX1+1)*(IY2-IY1+1)                                   GSS3F401.629    
        END IF                                                             GSS3F401.630    
                                                                           INPUTL1.331    
! Calculate vertical levels factor for input length                        INPUTL1.332    
          IF(ILEV.NE.5) THEN                                               GSS3F401.631    
! More than one level                                                      GSS3F401.632    
            IF(LIST_S(st_input_bottom,ISTART).LT.0) THEN                   GSS3F401.633    
! Level list                                                               GSS3F401.634    
              IZ_IN=LEVLST_S(1,-LIST_S(st_input_bottom,ISTART))            GSS3F401.635    
            ELSE                                                           GSS3F401.636    
! Range of model levs                                                      GSS3F401.637    
              IZ_IN=LIST_S(st_input_top   ,ISTART)-                        GSS3F401.638    
     &              LIST_S(st_input_bottom,ISTART)+1                       GSS3F401.639    
            END IF                                                         INPUTL1.340    
          ELSE                                                             GSS3F401.640    
! Single level input                                                       GSS3F401.641    
            IZ_IN=1                                                        INPUTL1.342    
          END IF                                                           INPUTL1.343    
                                                                           INPUTL1.344    
! Calculate pseudo levels factor for input length                          INPUTL1.345    
          IF(IPSEUDO.NE.0) THEN                                            INPUTL1.347    
            IP_IN=LENPLST(LIST_S(st_pseudo_in,ISTART))                     INPUTL1.348    
          ELSE                                                             INPUTL1.349    
            IP_IN=1                                                        INPUTL1.350    
          END IF                                                           INPUTL1.351    
                                                                           INPUTL1.352    
! Calculate input length for this diag. and store in LIST_S                INPUTL1.353    
! Input_code.lt.0 means that a diag already processed into D1 is being     INPUTL1.354    
!   reprocessed, so input length of child diag equals output length of     INPUTL1.355    
!   parent.                                                                INPUTL1.356    
! Otherwise, the input len is given by the product of the appropriate      INPUTL1.357    
!   x-,y-,z-, and p-dimensions.                                            INPUTL1.358    
          DO I=ISTART,IEND                                                 INPUTL1.360    
            IF(LIST_S(st_input_code  ,I).GE.0) THEN                        INPUTL1.361    
               LIST_S(st_input_length,I)=LEN_IN*IZ_IN*IP_IN                INPUTL1.362    
            ELSE                                                           INPUTL1.363    
               LIST_S(st_input_length ,I)=                                 INPUTL1.364    
     &         LIST_S(st_output_length,-LIST_S(st_input_code,I))           INPUTL1.365    
            END IF                                                         INPUTL1.366    
 ! Store model no. in last element of LIST_S - for ADDRES                  GSS3F401.642    
            LIST_S(NELEMP+1,I)=MODL                                        GSS3F401.643    
          END DO                                                           GSS3F401.644    
                                                                           INPUTL1.369    
! Recalculate input length for non-primary (length unchanged for           INPUTL1.370    
! most cases) and store in IN_S array.                                     INPUTL1.371    
          IF (ISEC.NE.0) THEN                                              INPUTL1.373    
            IF ((IGP.NE.31).AND.(IGP.NE.32))THEN                           INPUTL1.374    
              CALL ADDRLN(IGP,LEN_PRIMIN,                                  GPB1F402.364    
*IF DEF,MPP                                                                GPB1F402.365    
     &                    local_data,                                      GPB1F402.366    
*ENDIF                                                                     GPB1F402.367    
     &                    ErrorStatus)                                     GPB1F402.368    
              IN_S(2,MODL,ISEC,IITM)=LEN_PRIMIN*IZ_IN*IP_IN                INPUTL1.376    
            ELSE                                                           INPUTL1.377    
              CALL OCNVOL(LENO,LIST_S(st_input_bottom,ISTART),             INPUTL1.378    
     &                         LIST_S(st_input_top   ,ISTART))             INPUTL1.379    
              IN_S(2,MODL,ISEC,IITM)=LENO                                  INPUTL1.380    
            END IF                                                         INPUTL1.381    
          END IF                                                           INPUTL1.382    
                                                                           INPUTL1.383    
        END IF ! At least one stash record for m,s,i                       INPUTL1.384    
                                                                           INPUTL1.385    
      END DO   ! Items                                                     INPUTL1.386    
      END DO   ! Sections                                                  INPUTL1.387    
      END DO   ! Models                                                    INPUTL1.388    
*IF DEF,MPP                                                                GRR0F403.306    
!                                                                          GRR0F403.307    
      CALL CHANGE_DECOMPOSITION(orig_decomp,ErrorStatus)                   GRR0F403.308    
                                                                           GRR0F403.309    
      IF(ErrorStatus.GT.0) THEN                                            GRR0F403.310    
         CMESSAGE='INPUTL: ERROR in original MPP decomposition'            GRR0F403.311    
         write(6,*) CMESSAGE                                               GRR0F403.312    
         GOTO 999                                                          GRR0F403.313    
      ENDIF                                                                GRR0F403.314    
*ENDIF                                                                     GRR0F403.315    
                                                                           INPUTL1.389    
 999  CONTINUE                                                             GSS3F401.645    
                                                                           GSS3F401.646    
      RETURN                                                               INPUTL1.390    
      END                                                                  INPUTL1.391    
                                                                           INPUTL1.392    
!- End of subroutine code -------------------------------------------      INPUTL1.393    
                                                                           INPUTL1.394    
                                                                           INPUTL1.395    
!+Determine whether a levels list is a duplicate of another levels list    INPUTL1.396    
! Subroutine Interface:                                                    INPUTL1.397    
                                                                           INPUTL1.398    

      SUBROUTINE DUPLEVL(NLEVELS,LDUPLL,NDUPLL)                             1INPUTL1.399    
      IMPLICIT NONE                                                        INPUTL1.400    
! Description:                                                             INPUTL1.401    
!                                                                          INPUTL1.402    
! Method:                                                                  INPUTL1.403    
!                                                                          INPUTL1.404    
! Current code owner:  S.J.Swarbrick                                       INPUTL1.405    
!                                                                          INPUTL1.406    
! History:                                                                 INPUTL1.407    
! Version   Date       Comment                                             INPUTL1.408    
! =======   ====       =======                                             INPUTL1.409    
!   3.5     Apr. 95    Original code.  S.J.Swarbrick                       INPUTL1.410    
!                                                                          INPUTL1.411    
!  Code description:                                                       INPUTL1.412    
!    FORTRAN 77 + common Fortran 90 extensions.                            INPUTL1.413    
!    Written to UM programming standards version 7.                        INPUTL1.414    
!                                                                          INPUTL1.415    
!  System component covered:                                               INPUTL1.416    
!  System task:               Sub-Models Project                           INPUTL1.417    
!                                                                          INPUTL1.418    
! Global variables:                                                        INPUTL1.419    
                                                                           INPUTL1.420    
*CALL CSUBMODL                                                             INPUTL1.421    
*CALL VERSION                                                              INPUTL1.422    
*CALL CSTASH                                                               GRB0F401.11     
*CALL STEXTEND                                                             INPUTL1.424    
                                                                           INPUTL1.425    
! Subroutine arguments:                                                    INPUTL1.426    
                                                                           INPUTL1.427    
!   Scalar arguments with intent(in):                                      INPUTL1.428    
                                                                           INPUTL1.429    
      INTEGER NLEVELS                                                      INPUTL1.430    
                                                                           INPUTL1.431    
!   Scalar arguments with intent(out):                                     INPUTL1.432    
                                                                           INPUTL1.433    
      LOGICAL LDUPLL                                                       INPUTL1.434    
      LOGICAL LLOCAL                                                       INPUTL1.435    
      INTEGER NDUPLL                                                       INPUTL1.436    
                                                                           INPUTL1.437    
! Local scalars:                                                           INPUTL1.438    
                                                                           INPUTL1.439    
      INTEGER I                                                            INPUTL1.440    
      INTEGER J                                                            INPUTL1.441    
                                                                           INPUTL1.442    
!- End of Header -----------------------------------------------------     INPUTL1.443    
                                                                           INPUTL1.444    
      LDUPLL=.FALSE.                                                       INPUTL1.445    
      NDUPLL=0                                                             INPUTL1.446    
      DO 100 I=1,NLEVELS-1                                                 INPUTL1.447    
        IF((LEVLST_S(1,I).EQ.LEVLST_S(1,NLEVELS)).AND.                     INPUTL1.448    
     &  (LLISTTY(I).EQ.LLISTTY(NLEVELS))) THEN                             INPUTL1.449    
          LLOCAL=.TRUE.                                                    INPUTL1.450    
          DO 200 J=2,LEVLST_S(1,NLEVELS)+1                                 INPUTL1.451    
            IF(LLISTTY(NLEVELS).EQ.'I') THEN                               INPUTL1.452    
              IF(LEVLST_S(J,I).NE.LEVLST_S(J,NLEVELS)) THEN                INPUTL1.453    
                LLOCAL=.FALSE.                                             INPUTL1.454    
                GOTO 210                                                   INPUTL1.455    
              END IF                                                       INPUTL1.456    
            ELSE                                                           INPUTL1.457    
              IF(RLEVLST_S(J,I).NE.RLEVLST_S(J,NLEVELS)) THEN              INPUTL1.458    
                LLOCAL=.FALSE.                                             INPUTL1.459    
                GOTO 210                                                   INPUTL1.460    
              END IF                                                       INPUTL1.461    
            END IF                                                         INPUTL1.462    
 200      CONTINUE                                                         INPUTL1.463    
 210      CONTINUE                                                         INPUTL1.464    
          IF(LLOCAL) THEN                                                  INPUTL1.465    
            LDUPLL=.TRUE.                                                  INPUTL1.466    
            NDUPLL=I                                                       INPUTL1.467    
            RETURN                                                         INPUTL1.468    
          END IF                                                           INPUTL1.469    
        END IF                                                             INPUTL1.470    
 100  CONTINUE                                                             INPUTL1.471    
      RETURN                                                               INPUTL1.472    
      END                                                                  INPUTL1.473    
                                                                           INPUTL1.474    
!- End of subroutine code ----------------------------------------         INPUTL1.475    
                                                                           INPUTL1.476    
                                                                           INPUTL1.477    
!+Determine whether a pseudo lev list is a duplicate of another one        INPUTL1.478    
! Subroutine Interface:                                                    INPUTL1.479    
                                                                           INPUTL1.480    

      SUBROUTINE DUPPSLL(LDUPLL,NDUPLL)                                     1INPUTL1.481    
      IMPLICIT NONE                                                        INPUTL1.482    
! Description:                                                             INPUTL1.483    
!                                                                          INPUTL1.484    
! Method:                                                                  INPUTL1.485    
!                                                                          INPUTL1.486    
! Current code owner:  S.J.Swarbrick                                       INPUTL1.487    
!                                                                          INPUTL1.488    
! History:                                                                 INPUTL1.489    
! Version   Date       Comment                                             INPUTL1.490    
! =======   ====       =======                                             INPUTL1.491    
!   3.5     Apr. 95    Original code.  S.J.Swarbrick                       INPUTL1.492    
!                                                                          INPUTL1.493    
!  Code description:                                                       INPUTL1.494    
!    FORTRAN 77 + common Fortran 90 extensions.                            INPUTL1.495    
!    Written to UM programming standards version 7.                        INPUTL1.496    
!                                                                          INPUTL1.497    
!  System component covered:                                               INPUTL1.498    
!  System task:               Sub-Models Project                           INPUTL1.499    
!                                                                          INPUTL1.500    
! Global variables:                                                        INPUTL1.501    
                                                                           INPUTL1.502    
*CALL CSUBMODL                                                             INPUTL1.503    
*CALL VERSION                                                              INPUTL1.504    
*CALL CSTASH                                                               GRB0F401.12     
*CALL STEXTEND                                                             INPUTL1.506    
                                                                           INPUTL1.507    
! Subroutine arguments:                                                    INPUTL1.508    
                                                                           INPUTL1.509    
!   Scalar arguments with intent(out):                                     INPUTL1.510    
                                                                           INPUTL1.511    
      LOGICAL LDUPLL                                                       INPUTL1.512    
      LOGICAL LLOCAL                                                       INPUTL1.513    
      INTEGER NDUPLL                                                       INPUTL1.514    
                                                                           INPUTL1.515    
! Local scalars:                                                           INPUTL1.516    
                                                                           INPUTL1.517    
      INTEGER I                                                            INPUTL1.518    
      INTEGER J                                                            INPUTL1.519    
                                                                           INPUTL1.520    
!- End of Header -------------------------------------------------         INPUTL1.521    
                                                                           INPUTL1.522    
                                                                           INPUTL1.523    
      LDUPLL=.FALSE.                                                       INPUTL1.524    
      NDUPLL=0                                                             INPUTL1.525    
      DO 100 I=1,NPSLISTS-1                                                INPUTL1.526    
        IF(LENPLST(I).EQ.LENPLST(NPSLISTS)) THEN                           INPUTL1.527    
          LLOCAL=.TRUE.                                                    INPUTL1.528    
        DO 200 J=1,LENPLST(NPSLISTS)                                       INPUTL1.529    
            IF(PSLIST_D(J,I).NE.PSLIST_D(J,NPSLISTS)) THEN                 INPUTL1.530    
              LLOCAL=.FALSE.                                               INPUTL1.531    
              GOTO 210                                                     INPUTL1.532    
            END IF                                                         INPUTL1.533    
 200      CONTINUE                                                         INPUTL1.534    
 210      CONTINUE                                                         INPUTL1.535    
          IF(LLOCAL) THEN                                                  INPUTL1.536    
            LDUPLL=.TRUE.                                                  INPUTL1.537    
            NDUPLL=I                                                       INPUTL1.538    
            RETURN                                                         INPUTL1.539    
          END IF                                                           INPUTL1.540    
        END IF                                                             INPUTL1.541    
 100  CONTINUE                                                             INPUTL1.542    
                                                                           INPUTL1.543    
                                                                           INPUTL1.544    
      RETURN                                                               INPUTL1.545    
      END                                                                  INPUTL1.546    
                                                                           INPUTL1.547    
!- End of subroutine code ---------------------------------------          INPUTL1.548    
*ENDIF                                                                     INPUTL1.549