*IF DEF,CONTROL,OR,DEF,UTILIO,OR,DEF,RECON,OR,DEF,FLDOP                    UIE3F404.13     
C ******************************COPYRIGHT******************************    GTS2F400.12395  
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.12396  
C                                                                          GTS2F400.12397  
C Use, duplication or disclosure of this code is subject to the            GTS2F400.12398  
C restrictions as set forth in the contract.                               GTS2F400.12399  
C                                                                          GTS2F400.12400  
C                Meteorological Office                                     GTS2F400.12401  
C                London Road                                               GTS2F400.12402  
C                BRACKNELL                                                 GTS2F400.12403  
C                Berkshire UK                                              GTS2F400.12404  
C                RG12 2SZ                                                  GTS2F400.12405  
C                                                                          GTS2F400.12406  
C If no contract has been raised with this copy of the code, the use,      GTS2F400.12407  
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.12408  
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.12409  
C Modelling at the above address.                                          GTS2F400.12410  
C                                                                          GTS2F400.12411  
!+ Reads PPXREF file into "look-up" arrays                                 GETPPX1.3      
!                                                                          GETPPX1.4      
!  Subroutine Interface:                                                   GETPPX1.5      
                                                                           GETPPX1.6      

      SUBROUTINE GETPPX(NFTPPXREF,NFTSTMSTU,StmsrNam,RowNumber,             56,8GSS2F401.110    
*CALL ARGPPX                                                               GETPPX1.8      
     &                       ErrorStatus,CMESSAGE)                         GSS1F400.23     
      IMPLICIT NONE                                                        GETPPX1.10     
!                                                                          GETPPX1.11     
!  Description:                                                            GETPPX1.12     
!    Reads records from PPXREF file into arrays PPXI (for integer data)    GETPPX1.13     
!    and PPXC (for character data, i.e. name of diagnostic/prognostic).    GETPPX1.14     
!    The entire PPXREF file is read in (non-null records only).            GETPPX1.15     
!                                                                          GETPPX1.16     
!  Method:                                                                 GETPPX1.17     
!    Uses routines SETPOS and BUFFIN - these employ Cray-specific code     GETPPX1.18     
!                                                                          GETPPX1.19     
!  Current code owner: S.J.Swarbrick                                       GETPPX1.20     
!                                                                          GETPPX1.21     
!  History:                                                                GETPPX1.22     
!  Version   Date       Comment                                            GETPPX1.23     
!  =======   ====       =======                                            GETPPX1.24     
!    3.5     Mar 95     Original code.  S.J.Swarbrick                      GETPPX1.25     
!    4.0     Oct. 95                    S.J.Swarbrick                      GSS1F400.24     
!     4.0   15/12/95 Changed interface to READSTM so that                  GSS1F400.25     
!                    Internal_Model_Number is specified directly           GSS1F400.26     
!                    rather than using CODES(1).  P.Burton                 GSS1F400.27     
!    4.0     Dec. 95   Check for ppxRecs LE (NDIAGP or NUM_DIAG_MAX)       ANF4F400.1      
!                                       (N Farnon)                         ANF4F400.2      
!    4.1     Apr. 96 Correct OOB error when reading user STASH &           GSS1F401.3      
!                    changes associated with new STASHmaster format        GSS1F401.4      
!                                      S.J.Swarbrick                       GSS1F401.5      
!    4.1    18/06/96 Changes to cope with changes in STASH addressing      GDG0F401.632    
!                    Author D.M. Goddard.                                  GDG0F401.633    
!    4.2     Jan. 97 Correct record-counting bug in PPX arrays             GSS1F403.26     
!                                   S.J.Swarbrick                          GSS1F403.27     
!    4.4    04/11/97 Changed -RECON def line to allow for other small      UIE3F404.14     
!                    execs which had used the RECON def. K Rogers          UIE3F404.15     
!    4.5    30/10/97 Read stash data on PE 0 for the T3E                   GBCVF405.323    
!                    and distribute it.                                    GBCVF405.324    
!                      Author: Bob Carruthers, Cray Research               GBCVF405.325    
!                                                                          GETPPX1.26     
!  Code description:                                                       GETPPX1.27     
!    FORTRAN 77 + common Fortran 90 extensions.                            GETPPX1.28     
!    Written to UM programming standards version 7.                        GETPPX1.29     
!                                                                          GETPPX1.30     
!  System component covered:                                               GETPPX1.31     
!  System task:               Sub-Models Project                           GETPPX1.32     
!                                                                          GETPPX1.33     
!  Global Variables:                                                       GETPPX1.34     
                                                                           GETPPX1.35     
*CALL CSUBMODL                                                             GETPPX1.36     
*CALL CPPXREF                                                              GETPPX1.37     
*CALL PPXLOOK                                                              GETPPX1.39     
*CALL C_MDI                                                                GETPPX1.40     
*CALL CSTASH                                                               GRB0F401.22     
                                                                           GETPPX1.42     
!  Subroutine arguments                                                    GETPPX1.43     
                                                                           GETPPX1.44     
!    Scalar arguments with intent(in):                                     GETPPX1.45     
      INTEGER        NFTPPXREF   ! Unit no. for PPXREF file                GETPPX1.46     
      INTEGER        NFTSTMSTU   ! Unit no. for user ppxref files          GSS1F400.28     
      CHARACTER*13    StmsrNam    ! Names of stash master files            GSS2F401.111    
                                                                           GETPPX1.48     
!    Array arguments with intent(out):                                     GETPPX1.49     
      CHARACTER*80 CMESSAGE    ! Error return message                      GETPPX1.50     
                                                                           GETPPX1.51     
!    Error status:                                                         GETPPX1.52     
      INTEGER      ErrorStatus ! Error return code                         GSS1F400.29     
                                                                           GETPPX1.54     
!  Local scalars:                                                          GETPPX1.55     
      INTEGER      I,J,IE,ID,II  ! Loop counters                           GSS1F400.30     
      INTEGER      hashcount                                               GSS2F401.112    
      INTEGER      IFIL,IREC     ! Do.                                     GSS1F400.31     
      INTEGER      LEN_IO        ! No. words read on each CALL BUFFIN      GETPPX1.59     
      REAL         STATUS        ! Error return code from BUFFIN           GETPPX1.60     
      INTEGER      IOSTATUS                                                GSS1F400.32     
      CHARACTER*80 UpsmFile      ! Full pathname for user psm files        GSS1F400.33     
      CHARACTER*80 STASH_MSTR    ! Do. STASH master files                  GSS2F401.113    
      CHARACTER*1  CHAR1                                                   GSS2F401.114    
      INTEGER      Im_index      !                                         GSS1F400.34     
      INTEGER      Im_ident      !                                         GSS1F400.35     
      INTEGER      Section       !                                         GSS1F400.36     
      INTEGER      Item          !                                         GSS1F400.37     
      INTEGER      LModel  ,DM                                             GSS1F400.38     
      INTEGER      LSection,DS                                             GSS1F400.39     
      INTEGER      LItem   ,DI                                             GSS1F400.40     
      INTEGER      USTrow                                                  GSS1F400.41     
      INTEGER      RowNumber     ! Row no. counter for PPXI, PPXC arrays   GETPPX1.65     
      INTEGER      FirstBlank    ! Used to append Upsm file name to dir    GSS1F400.42     
      INTEGER      RI            ! Row index                               GSS1F400.44     
      INTEGER      NU_recs       ! No. of records in a user psm file       GSS1F400.45     
      LOGICAL      OVERWRITE ! Set T if a system stash master record       GSS1F403.28     
                             !  is being overwritten by a user rec.        GSS1F403.29     
!  Local arrays:                                                           GETPPX1.67     
!  WARNING: must have PPXREF_CHARLEN=4*PPX_CHARWORD                        GETPPX1.68     
!           to avoid overwriting                                           GETPPX1.69     
      CHARACTER DNAM (PPXREF_CHARLEN) ! For character part of ppx rec      GETPPX1.70     
      INTEGER   CODES(PPXREF_CODELEN) ! For integer part of ppx record     GETPPX1.71     
      INTEGER   IMASK(20)             ! For ver mask in user psm           GSS1F400.46     
*IF DEF,MPP,AND,DEF,T3E                                                    GBCVF405.326    
                                                                           GBCVF405.327    
      common/shmem_getppx_c1/ dnam                                         GBCVF405.328    
cdir$ cache_align /shmem_getppx_c1/                                        GBCVF405.329    
      common/shmem_getppx_c2/ char1                                        GBCVF405.330    
cdir$ cache_align /shmem_getppx_c2/                                        GBCVF405.331    
      common/shmem_getppx/ codes, iostatus, nu_recs                        GBCVF405.332    
cdir$ cache_align /shmem_getppx/                                           GBCVF405.333    
c                                                                          GBCVF405.334    
      integer shmem_n_pes, msg, info, nproc, shmem_my_pe, mype             GBCVF405.335    
c                                                                          GBCVF405.336    
*ENDIF                                                                     GBCVF405.337    
                                                                           GETPPX1.72     
!  Function and subroutine calls:                                          GETPPX1.73     
      EXTERNAL  READSTM                                                    GSS2F401.116    
!                                                                          GETPPX1.75     
!- End of header -------------------------------------------------------   GETPPX1.76     
!                                                                          GETPPX1.77     
      ErrorStatus = 0                                                      GSS1F400.48     
      NU_recs     = 0                                                      GSS1F400.49     
      IOStatus   =0                                                        GSS2F401.115    
!----------------------------------------------------------------------    GSS2F401.117    
! Check that the no. of requested diagnostics does not exceed max          GSS2F401.118    
! defined in comdecks VERSION and PPXLOOK.                                 GSS2F401.119    
!                                                                          GSS2F401.120    
      IF ( (ppxRecs .GT. NDIAGP) .OR. (ppxRecs .GT. NUM_DIAG_MAX) )        ANF4F400.7      
     &THEN                                                                 ANF4F400.8      
        WRITE(6,*) 'ERROR: no. of diags. requested exceeds max'            GSS2F401.121    
        WRITE(6,*) 'ppxRecs=',ppxRecs,' NDIAGP=',NDIAGP,                   ANF4F400.10     
     &             ' NUM_DIAG_MAX=',NUM_DIAG_MAX                           ANF4F400.11     
        Errorstatus=104                                                    ANF4F400.12     
        CMESSAGE= 'GETPPX: ppxRecs GT (NDIAGP or NUM_DIAG_MAX)'            GSS2F401.122    
        GO TO 9999                                                         ANF4F400.14     
      END IF                                                               ANF4F400.15     
!----------------------------------------------------------------------    GSS2F401.123    
                                                                           GSS2F401.124    
*IF DEF,MPP,AND,DEF,T3E                                                    GBCVF405.338    
      mype=shmem_my_pe()                                                   GBCVF405.339    
      nproc=shmem_n_pes()                                                  GBCVF405.340    
*ENDIF                                                                     GBCVF405.341    
      IF (NFTPPXREF.EQ.22) THEN                                            GSS2F401.125    
!----------------------------------------------------------------------    GSS2F401.126    
!Read in records from STASHmaster for current internal model               GSS2F401.127    
!----------------------------------------------------------------------    GSS2F401.128    
!Open STASHmaster file for current internal model                          GSS2F401.129    
!  Get directory name for STASHmaster & append rest of filename            GSS2F401.130    
*IF DEF,MPP,AND,DEF,T3E                                                    GBCVF405.342    
        stash_mstr='empty '                                                GBCVF405.343    
        if(mype.eq.0) CALL GET_FILE(NFTPPXREF,STASH_MSTR,80,               GBCVF405.344    
     2   ErrorStatus)                                                      GBCVF405.345    
*ELSE                                                                      GBCVF405.346    
        CALL GET_FILE(NFTPPXREF,STASH_MSTR,80,ErrorStatus)                 GSS2F401.131    
*ENDIF                                                                     GBCVF405.347    
        FirstBlank = 0                                                     GSS2F401.132    
        DO I = 1,80                                                        GSS2F401.133    
          IF (STASH_MSTR(I:I).EQ.' '.AND.FirstBlank.EQ.0)                  GSS2F401.134    
     &                                   FirstBlank=I                      GSS2F401.135    
        END DO                                                             GSS2F401.136    
        STASH_MSTR(FirstBlank:FirstBlank)='/'                              GSS2F401.137    
        STASH_MSTR(FirstBlank+1:FirstBlank+13)=StmsrNam                    GSS2F401.138    
*IF DEF,MPP,AND,DEF,T3E                                                    GBCVF405.348    
        if(mype.eq.0) OPEN(UNIT=NFTPPXREF,FILE=STASH_MSTR,                 GBCVF405.349    
     2   IOSTAT=IOStatus)                                                  GBCVF405.350    
                                                                           GBCVF405.351    
        msg=7030                                                           GBCVF405.352    
        info=0                                                             GBCVF405.353    
        call gc_ibcast(msg, 1, 0, nproc, info, IOStatus)                   GBCVF405.354    
                                                                           GBCVF405.355    
*ELSE                                                                      GBCVF405.356    
        OPEN(UNIT=NFTPPXREF,FILE=STASH_MSTR,IOSTAT=IOStatus)               GSS2F401.139    
*ENDIF                                                                     GBCVF405.357    
        IF(IOStatus.NE.0) THEN                                             GSS2F401.140    
          WRITE(6,*) 'ERROR in routine GETPPX'                             GSS2F401.141    
          WRITE(6,*)                                                       GSS2F401.142    
     &   'CANNOT OPEN STASHmaster FILE, IOSTATUS=',IOStatus                GSS2F401.143    
          WRITE(6,*) 'UNIT=',NFTPPXREF,' FILE=',STASH_MSTR                 GSS2F401.144    
          ErrorStatus=100                                                  GSS2F401.145    
          CMESSAGE=' GETPPX: ERROR OPENING STASHmaster'                    GSS2F401.146    
          GOTO 9999                                                        GSS2F401.147    
        END IF                                                             GSS2F401.148    
                                                                           GETPPX1.94     
                                                                           GETPPX1.98     
*IF DEF,MPP,AND,DEF,T3E                                                    GBCVF405.358    
 100    continue                                                           GBCVF405.359    
        if(mype.eq.0) READ(NFTPPXREF,'(A1)') CHAR1                         GBCVF405.360    
c                                                                          GBCVF405.361    
        msg=7033                                                           GBCVF405.362    
        info=0                                                             GBCVF405.363    
        call gc_cbcast(msg, 1, 0, nproc, info, char1)                      GBCVF405.364    
c                                                                          GBCVF405.365    
*ELSE                                                                      GBCVF405.366    
 100    READ(NFTPPXREF,'(A1)') CHAR1                                       GSS2F401.149    
*ENDIF                                                                     GBCVF405.367    
        IF (CHAR1.EQ.'1') THEN                                             GSS2F401.150    
!Read block of records                                                     GSS2F401.151    
*IF DEF,MPP,AND,DEF,T3E                                                    GBCVF405.368    
          if(mype.eq.0) then                                               GBCVF405.369    
            BACKSPACE NFTPPXREF                                            GBCVF405.370    
            CALL READSTM(IMASK,DNAM,CODES,NFTPPXREF,                       GBCVF405.371    
     2       ErrorStatus,CMESSAGE)                                         GBCVF405.372    
          endif                                                            GBCVF405.373    
                                                                           GBCVF405.374    
          msg=7031                                                         GBCVF405.375    
          info=0                                                           GBCVF405.376    
          call gc_ibcast(msg, ppxref_codelen, 0, nproc, info, codes)       GBCVF405.377    
          msg=7032                                                         GBCVF405.378    
          info=0                                                           GBCVF405.379    
          call gc_cbcast(msg, ppxref_charlen, 0, nproc, info, dnam)        GBCVF405.380    
*ELSE                                                                      GBCVF405.381    
          BACKSPACE NFTPPXREF                                              GSS2F401.152    
          CALL READSTM(IMASK,DNAM,CODES,NFTPPXREF,ErrorStatus,CMESSAGE)    GSS2F401.153    
*ENDIF                                                                     GBCVF405.382    
          Im_ident = CODES(ppx_model_number)                               GSS2F401.154    
          Section  = CODES(ppx_section_number)                             GSS2F401.155    
          Item     = CODES(ppx_item_number)                                GSS2F401.156    
          IF (Im_ident.EQ.-1) THEN                                         GSS2F401.157    
!End of file reached                                                       GSS2F401.158    
*IF DEF,MPP,AND,DEF,T3E                                                    GBCVF405.383    
            if(mype.eq.0) CLOSE(UNIT=NFTPPXREF)                            GBCVF405.384    
*ELSE                                                                      GBCVF405.385    
            CLOSE(UNIT=NFTPPXREF)                                          GSS2F401.159    
*ENDIF                                                                     GBCVF405.386    
            GO TO 9999                                                     GSS1F400.65     
          END IF                                                           GSS1F400.66     
          Im_index= INTERNAL_MODEL_INDEX(Im_ident)                         GSS2F401.160    
!   Increment row number                                                   GSS2F401.161    
          RowNumber = RowNumber + 1                                        GSS2F401.162    
! Assign value to PPXPTR element corresponding to this record              GETPPX1.117    
*IF DEF,RECON                                                              GSS1F400.67     
          PPXPTR(Im_ident,Section,Item) = RowNumber                        GSS2F401.163    
*ELSE                                                                      GSS1F400.69     
          PPXPTR(Im_index,Section,Item) = RowNumber                        GSS2F401.164    
*ENDIF                                                                     GSS1F400.71     
!   Transfer data from ppx record to look-up arrays                        GSS2F401.165    
          DO I=1,PPXREF_CHARLEN                                            GSS2F401.166    
            PPXC(RowNumber,I)=DNAM(I)                                      GSS2F401.167    
          END DO                                                           GSS2F401.168    
          DO I=1,PPXREF_CODELEN                                            GSS2F401.169    
            PPXI(RowNumber,I)=CODES(I)                                     GSS2F401.170    
          END DO                                                           GSS2F401.171    
!   Set row index - indicates values of model,sec,item for this row        GSS2F401.172    
          RowIndex  (RowNumber)=  Im_ident*100000                          GSS2F401.173    
     &                          + Section *1000                            GSS2F401.174    
     &                          + Item                                     GSS2F401.175    
!   Set flag to indicate record originated from ppxref file                GSS2F401.176    
          OriginFlag(RowNumber)='P'                                        GSS2F401.177    
          IF (RowNumber .GT. ppxRecs) THEN                                 GSS2F401.178    
            WRITE(6,*) 'Error in GETPPX:'                                  GSS2F401.179    
            WRITE(6,*)                                                     GSS1F400.78     
     &    ' PPXI row number exceeds total no. of ppx records ',            GSS2F401.180    
     &      RowNumber                                                      GSS2F401.181    
            GO TO 9999                                                     GSS2F401.182    
          END IF                                                           GETPPX1.125    
          GO TO 100  ! Back to READ                                        GSS2F401.183    
        ELSE                                                               GSS2F401.184    
! Skip to next line                                                        GSS2F401.185    
          GO TO 100                                                        GSS2F401.186    
        END IF                                                             GSS2F401.187    
      ELSE         ! NFTPPXREF.NE.1                                        GSS2F401.188    
! ----------------------------------------------------------               GSS1F400.109    
! Insert user-defined diagnostics into ppxref look-up arrays               GSS1F400.110    
! ----------------------------------------------------------               GSS1F400.111    
                                                                           GSS1F400.112    
*IF DEF,PUMF,OR,DEF,CUMF,OR,DEF,CONVIEEE,OR,DEF,MERGE,OR,DEF,CONVPP        GSS2F401.189    
      IF (NRECS_USTASH(1).GT.0) THEN                                       GSS2F401.190    
*ELSEIF DEF,FLDOP                                                          GSS2F401.191    
      IF (NRECS_USTASH(1).GT.0) THEN                                       GSS2F401.192    
*ELSE                                                                      GSS2F401.193    
      IF (NRECS_USTASH.GT.0) THEN                                          GSS2F401.194    
*ENDIF                                                                     GSS2F401.195    
! There are user diagnostic records                                        GSS2F401.196    
      ErrorStatus=0                                                        GSS1F400.114    
      IOStatus   =0                                                        GSS1F400.115    
*IF DEF,PUMF,OR,DEF,CUMF,OR,DEF,CONVIEEE,OR,DEF,MERGE,OR,DEF,CONVPP        GDG0F401.634    
*ELSEIF DEF,FLDOP                                                          GDG0F401.635    
*ELSE                                                                      GDG0F401.636    
! Get directory name for Upsm files                                        GSS1F400.116    
*IF DEF,MPP,AND,DEF,T3E                                                    GBCVF405.387    
      upsmfile='empty '                                                    GBCVF405.388    
      if(mype.eq.0) CALL GET_FILE(NFTSTMSTU,UpsmFile,80,                   GBCVF405.389    
     2 ErrorStatus)                                                        GBCVF405.390    
*ELSE                                                                      GBCVF405.391    
      CALL GET_FILE(NFTSTMSTU,UpsmFile,80,ErrorStatus)                     GSS1F400.117    
*ENDIF                                                                     GBCVF405.392    
      FirstBlank = 0                                                       GSS1F400.118    
      DO I = 1,80                                                          GSS1F400.119    
        IF (UpsmFile(I:I).EQ.' '.AND.FirstBlank.EQ.0) FirstBlank=I         GSS1F400.120    
      END DO                                                               GSS1F400.121    
*ENDIF                                                                     GDG0F401.637    
                                                                           GSS1F400.122    
! Loop over user pre-stash master files                                    GSS1F400.123    
      DO IFIL = 1,N_USTASH                                                 GSS1F400.124    
*IF DEF,PUMF,OR,DEF,CUMF,OR,DEF,CONVIEEE,OR,DEF,MERGE,OR,DEF,CONVPP        GDG0F401.638    
      UpsmFile=USTSFILS(IFIL)                                              GDG0F401.639    
*ELSEIF DEF,FLDOP                                                          GDG0F401.640    
      UpsmFile=USTSFILS(IFIL)                                              GDG0F401.641    
*ELSE                                                                      GDG0F401.642    
        UpsmFile(FirstBlank  :FirstBlank  )='.'                            GSS1F400.125    
        UpsmFile(FirstBlank+1:FirstBlank+8)=USTSFILS(IFIL)                 GSS1F400.126    
                                                                           GSS2F401.197    
*ENDIF                                                                     GDG0F401.643    
!   Open user stash master file                                            GSS1F400.127    
*IF DEF,MPP,AND,DEF,T3E                                                    GBCVF405.393    
        if(mype.eq.0) OPEN(UNIT=NFTSTMSTU,FILE=UpsmFile,                   GBCVF405.394    
     2   IOSTAT=IOStatus)                                                  GBCVF405.395    
                                                                           GBCVF405.396    
        msg=7040                                                           GBCVF405.397    
        info=0                                                             GBCVF405.398    
        call gc_ibcast(msg, 1, 0, nproc, info, IOStatus)                   GBCVF405.399    
                                                                           GBCVF405.400    
*ELSE                                                                      GBCVF405.401    
        OPEN(NFTSTMSTU,FILE=UpsmFile,IOSTAT=IOStatus)                      GSS1F400.128    
*ENDIF                                                                     GBCVF405.402    
        IF(IOStatus.NE.0) THEN                                             GSS1F400.129    
          WRITE(6,*) 'CANNOT OPEN USER PPXREF FILE.IOSTATUS=',             GSS1F400.130    
     &                                             IOStatus                GSS1F400.131    
          WRITE(6,*) 'UNIT=',NFTSTMSTU,' FILE=',UpsmFile                   GSS1F400.132    
          ErrorStatus=100                                                  GSS1F400.133    
          CMESSAGE=' GETPPX: ERROR OPENING USER PPXREF'                    GSS2F401.198    
          GOTO 9999                                                        GSS1F400.135    
        END IF                                                             GSS1F400.136    
                                                                           GSS2F401.199    
*IF DEF,PUMF,OR,DEF,CUMF,OR,DEF,CONVIEEE,OR,DEF,MERGE,OR,DEF,CONVPP        GDG0F401.644    
        NU_recs = NRECS_USTASH(IFIL)                                       GDG0F401.645    
*ELSEIF DEF,FLDOP                                                          GDG0F401.646    
        NU_recs = NRECS_USTASH(IFIL)                                       GDG0F401.647    
*ELSE                                                                      GDG0F401.648    
!   Read number of records in this file                                    GDG0F401.649    
*IF DEF,MPP,AND,DEF,T3E                                                    GBCVF405.403    
        if(mype.eq.0) READ(NFTSTMSTU,'(I3)') NU_recs                       GBCVF405.404    
                                                                           GBCVF405.405    
        msg=7050                                                           GBCVF405.406    
        info=0                                                             GBCVF405.407    
        call gc_ibcast(msg, 1, 0, nproc, info, nu_recs)                    GBCVF405.408    
                                                                           GBCVF405.409    
*ELSE                                                                      GBCVF405.410    
        READ(NFTSTMSTU,'(I3)') NU_recs                                     GDG0F401.650    
*ENDIF                                                                     GBCVF405.411    
*ENDIF                                                                     GDG0F401.651    
                                                                           GDG0F401.652    
!   Read in records from user pre-stash master file                        GSS1F400.139    
        DO IREC = 1,NU_recs                                                GSS1F400.140    
!   Initialise OVERWRITE switch                                            GSS1F403.30     
        OVERWRITE=.FALSE.                                                  GSS1F403.31     
        hashcount=0                                                        GSS2F401.200    
*IF DEF,MPP,AND,DEF,T3E                                                    GBCVF405.412    
 200    continue                                                           GBCVF405.413    
        if(mype.eq.0) READ(NFTSTMSTU,'(A1)') CHAR1                         GBCVF405.414    
c                                                                          GBCVF405.415    
        msg=7043                                                           GBCVF405.416    
        info=0                                                             GBCVF405.417    
        call gc_cbcast(msg, 1, 0, nproc, info, char1)                      GBCVF405.418    
c                                                                          GBCVF405.419    
*ELSE                                                                      GBCVF405.420    
 200    READ(NFTSTMSTU,'(A1)') CHAR1                                       GSS2F401.201    
*ENDIF                                                                     GBCVF405.421    
        IF (CHAR1.NE.'1') THEN                                             GSS2F401.202    
          hashcount=hashcount+1                                            GSS2F401.203    
          IF (hashcount.GT.20) THEN                                        GSS2F401.204    
            Errorstatus=100                                                GSS2F401.205    
            CMESSAGE='INCORRECT FORMAT IN USER STASHmaster FILE'           GSS2F401.206    
            WRITE(6,*) 'INCORRECT FORMAT IN USER STASHmaster FILE'         GSS2F401.207    
            WRITE(6,*) 'GAP BETWEEN RECORDS TOO LARGE?'                    GSS2F401.208    
            GO TO 9999                                                     GSS2F401.209    
          ELSE                                                             GSS2F401.210    
            GO TO 200                                                      GSS2F401.211    
          END IF                                                           GSS2F401.212    
        ELSE                                                               GSS2F401.213    
!Read block of records                                                     GSS2F401.214    
*IF DEF,MPP,AND,DEF,T3E                                                    GBCVF405.422    
          if(mype.eq.0) then                                               GBCVF405.423    
            BACKSPACE NFTSTMSTU                                            GBCVF405.424    
            CALL READSTM                                                   GBCVF405.425    
     &       (IMASK,DNAM,CODES,NFTSTMSTU,ErrorStatus,CMESSAGE)             GBCVF405.426    
          endif                                                            GBCVF405.427    
                                                                           GBCVF405.428    
          msg=7041                                                         GBCVF405.429    
          info=0                                                           GBCVF405.430    
          call gc_ibcast(msg, ppxref_codelen, 0, nproc, info, codes)       GBCVF405.431    
          msg=7042                                                         GBCVF405.432    
          info=0                                                           GBCVF405.433    
          call gc_cbcast(msg, ppxref_charlen, 0, nproc, info, dnam)        GBCVF405.434    
*ELSE                                                                      GBCVF405.435    
          BACKSPACE NFTSTMSTU                                              GSS2F401.215    
          CALL READSTM                                                     GSS1F400.141    
     &   (IMASK,DNAM,CODES,NFTSTMSTU,ErrorStatus,CMESSAGE)                 GSS2F401.216    
*ENDIF                                                                     GBCVF405.436    
          Im_ident = CODES(ppx_model_number)                               GSS2F401.217    
          Section  = CODES(ppx_section_number)                             GSS2F401.218    
          Item     = CODES(ppx_item_number)                                GSS2F401.219    
                                                                           GSS1F400.170    
!   Transfer data from ppx record to look-up arrays                        GSS1F400.171    
!   No. of records extracted from STASHmaster file(s)= RowNumber.          GSS2F401.220    
          USTrow    =   0                                                  GSS1F400.172    
          DO I=1,RowNumber                                                 GSS2F401.221    
            RI      =   RowIndex(I)                                        GSS1F400.174    
!     Determine values of model,section,item for this row                  GSS1F400.175    
            IF (RI.GT.0.AND.USTrow.EQ.0) THEN                              GSS1F400.176    
              LModel  =     RI/100000                                      GSS1F400.177    
              LSection=(RI-(RI/100000)*100000)/1000                        GSS1F400.178    
              LItem   =(RI-(RI/1000  )*1000  )                             GSS1F400.179    
!     Check whether previous item is being overwritten                     GSS1F400.180    
              IF (Im_ident.EQ.LModel  .AND.                                GSS1F400.181    
     &            Section .EQ.LSection.AND.                                GSS1F400.182    
     &            Item    .EQ.LItem        ) THEN                          GSS1F400.183    
                IF      (OriginFlag(I).EQ.'P') THEN                        GSS1F400.184    
                  OVERWRITE=.TRUE.                                         GSS1F403.32     
                  WRITE(6,*) 'MESSAGE FROM ROUTINE GETPPX:'                GSS2F401.222    
                  WRITE(6,*)                                               GSS1F400.186    
     &           'The following PPXREF record has been overwritten by'     GSS1F400.187    
                  WRITE(6,*)                                               GSS1F400.188    
     &           'a record read from a user-STASH master file: '           GSS1F400.189    
                  WRITE(6,*) 'Internal Model ',Im_ident,                   GSS1F400.190    
     &           ' Section ',Section,' Item ',Item                         GSS1F400.191    
                ELSE IF (OriginFlag(I).EQ.'U') THEN                        GSS1F400.206    
                  WRITE(6,*) 'ERROR, GETPPX: '                             GSS1F400.207    
                  WRITE(6,*) 'User diagnostic duplicated'                  GSS1F400.208    
                  WRITE(6,*) 'Model,Section,Item ',                        GSS1F400.209    
     &                        Im_ident,Section,Item                        GSS1F400.210    
                  ErrorStatus=100                                          GSS1F400.211    
                  CMESSAGE='ERROR,GETPPX:user diag duplicated'             GSS1F400.212    
                  GO TO 9999                                               GSS1F400.213    
                END IF                                                     GSS1F400.214    
              END IF                                                       GSS1F400.215    
!     Determine appropriate row number                                     GSS1F400.216    
              IF (LModel  .EQ.Im_ident.AND.                                GSS1F400.217    
     &            LSection.EQ.Section .AND.                                GSS1F400.218    
     &            LItem   .EQ.Item    .AND.USTrow.EQ.0) THEN               GSS1F400.219    
                USTrow=I    ! Row number found                             GSS1F400.220    
!     This record will overwrite a pre-existing record                     GSS1F400.221    
!     Insert new record                                                    GSS1F400.222    
                DO IE=1,PPXREF_CHARLEN                                     GSS1F400.223    
                  PPXC(USTrow,IE)=DNAM(IE)                                 GSS1F400.224    
                END DO                                                     GSS1F400.225    
                DO IE=1,PPXREF_CODELEN                                     GSS1F400.226    
                  PPXI(USTRow,IE)=CODES(IE)                                GSS1F400.227    
                END DO                                                     GSS1F400.228    
!     Set flag to indicate record originated from user psm file            GSS1F400.232    
                OriginFlag(USTrow)='U'                                     GSS1F400.233    
              ELSE IF((LModel  .GT.Im_ident.AND.USTrow.EQ.0) .OR.          GSS1F400.234    
     &                (LModel  .EQ.Im_ident.AND.                           GSS1F400.235    
     &                 LSection.GT.Section .AND.USTrow.EQ.0) .OR.          GSS1F400.236    
     &                (LModel  .EQ.Im_ident.AND.                           GSS1F400.237    
     &                 LSection.EQ.Section .AND.                           GSS1F400.238    
     &                 LItem   .GT.Item    .AND.USTrow.EQ.0)) THEN         GSS1F400.239    
                USTrow=I    ! Row number found                             GSS1F400.240    
!     This record will be inserted between two pre-existing records        GSS1F400.241    
!     Create spare row - move all subsequent records up by one row         GSS1F400.242    
                DO ID = RowNumber+1,USTrow+1,-1                            GSS2F401.223    
                  DO IE=1,PPXREF_CHARLEN                                   GSS1F400.244    
                    PPXC(ID,IE)=PPXC(ID-1,IE)                              GSS1F400.245    
                  END DO                                                   GSS1F400.246    
                  DO IE=1,PPXREF_CODELEN                                   GSS1F400.247    
                    PPXI(ID,IE)=PPXI(ID-1,IE)                              GSS1F400.248    
                  END DO                                                   GSS1F400.249    
                  RI            =RowIndex  (ID-1)                          GSS1F400.250    
                  RowIndex  (ID)=RowIndex  (ID-1)                          GSS1F400.251    
                  OriginFlag(ID)=OriginFlag(ID-1)                          GSS1F400.252    
!     Determine values of model,section,item for this row                  GSS1F400.253    
                  DM=     RI/100000                                        GSS1F400.254    
                  DS=(RI-(RI/100000)*100000)/1000                          GSS1F400.255    
                  DI=(RI-(RI/1000  )*1000  )                               GSS1F400.256    
!     Increment PPXPTR for record moved up                                 GSS1F400.257    
*IF DEF,RECON                                                              GSS1F400.258    
                  PPXPTR(DM,DS,DI)=PPXPTR(DM,DS,DI)+1                      GSS1F400.259    
*ELSE                                                                      GSS1F400.260    
                  Im_index=INTERNAL_MODEL_INDEX(DM)                        GSS1F400.261    
                  PPXPTR(Im_index,DS,DI)=PPXPTR(Im_index,DS,DI)+1          GSS1F400.262    
*ENDIF                                                                     GSS1F400.263    
                END DO                                                     GSS1F400.264    
!     Insert new record                                                    GSS1F400.265    
                DO IE=1,PPXREF_CHARLEN                                     GSS1F400.266    
                  PPXC(USTrow,IE)=DNAM(IE)                                 GSS1F400.267    
                END DO                                                     GSS1F400.268    
                DO IE=1,PPXREF_CODELEN                                     GSS1F400.269    
                  PPXI(USTRow,IE)=CODES(IE)                                GSS1F400.270    
                END DO                                                     GSS1F400.271    
!     Set row index - indicates model,sec,item for this row                GSS1F400.275    
                RowIndex  (USTrow)=  Im_ident*100000                       GSS1F400.276    
     &                             + Section *1000                         GSS1F400.277    
     &                             + Item                                  GSS1F400.278    
!     Set flag to indicate record originated from user psm file            GSS1F400.279    
                OriginFlag(USTrow)='U'                                     GSS1F400.280    
!     Set PPXPTR for the new record                                        GSS1F400.281    
*IF DEF,RECON                                                              GSS1F400.282    
                PPXPTR(Im_ident,Section,Item)=USTrow                       GSS1F400.283    
*ELSE                                                                      GSS1F400.284    
                Im_index=INTERNAL_MODEL_INDEX(Im_ident)                    GSS1F400.285    
                PPXPTR(Im_index,Section,Item)=USTrow                       GSS1F400.286    
*ENDIF                                                                     GSS1F400.287    
                                                                           GSS1F400.288    
              END IF                                                       GSS1F400.289    
            ELSE IF (RI.EQ.0 .AND. USTrow.EQ.0) THEN                       GSS1F400.290    
!     This record will be added after all pre-existing records             GSS1F400.291    
              USTrow = I                                                   GSS1F400.292    
!     Add new record                                                       GSS1F400.293    
              DO IE=1,PPXREF_CHARLEN                                       GSS1F400.294    
                PPXC(USTrow,IE)=DNAM(IE)                                   GSS1F400.295    
              END DO                                                       GSS1F400.296    
              DO IE=1,PPXREF_CODELEN                                       GSS1F400.297    
                PPXI(USTrow,IE)=CODES(IE)                                  GSS1F400.298    
              END DO                                                       GSS1F400.299    
!     Set row index - indicates model,sec,item for this row                GSS1F400.303    
              RowIndex  (USTrow)=  Im_ident*100000                         GSS1F400.304    
     &                           + Section *1000                           GSS1F400.305    
     &                           + Item                                    GSS1F400.306    
!     Set flag to indicate record originated from user psm file            GSS1F400.307    
              OriginFlag(USTrow)='U'                                       GSS1F400.308    
!     Set PPXPTR for the new record                                        GSS1F400.309    
*IF DEF,RECON                                                              GSS1F400.310    
              PPXPTR(Im_ident,Section,Item)=USTrow                         GSS1F400.311    
*ELSE                                                                      GSS1F400.312    
              Im_index=INTERNAL_MODEL_INDEX(Im_ident)                      GSS1F400.313    
              PPXPTR(Im_index,Section,Item)=USTrow                         GSS1F400.314    
*ENDIF                                                                     GSS1F400.315    
            END IF                                                         GSS1F400.316    
          END DO                                                           GSS1F400.317    
!     Increment RowNumber as UserSTASH record has been added.              GSS2F401.224    
!     don't increment it if a standard record has been overwritten.        GSS1F403.33     
        IF (.NOT.OVERWRITE) THEN                                           GSS1F403.34     
        RowNumber = RowNumber + 1                                          GSS2F401.225    
        END IF                                                             GSS1F403.35     
        END IF        ! hashcount                                          GSS2F401.226    
        END DO        ! Loop over IREC recs in upsm file                   GSS1F400.318    
      END DO          ! Loop over user psm files                           GSS1F400.319    
      END IF          ! NRECS_USTASH.GT.0                                  GSS1F400.320    
*IF -DEF,RECON,AND,-DEF,UTILIO,AND,-DEF,FLDOP                              UIE3F404.16     
! Copy user pre-stash master records to storage arrays -                   GSS1F400.322    
!   for passing into to U_MODEL                                            GSS1F400.323    
! Note: OriginFlag will be compressed to requested items only              GSS1F400.324    
!  at the end of routine STASH_PROC (before used in GETPPX_PART)           GSS1F400.325    
      IF (NRECS_USTASH.GT.0) THEN                                          GSS1F400.326    
      RowNumber = 1                                                        GSS1F400.327    
      DO I = 1,ppxRecs                                                     GSS1F400.328    
        IF (OriginFlag(I).EQ.'U') THEN                                     GSS1F400.329    
          DO IE=1,PPXREF_CHARLEN                                           GSS1F400.330    
            PPXC_U(RowNumber,IE)=PPXC(I,IE)                                GSS1F400.331    
          END DO                                                           GSS1F400.332    
          DO IE=1,PPXREF_CODELEN                                           GSS1F400.333    
            PPXI_U(RowNumber,IE)=PPXI(I,IE)                                GSS1F400.334    
          END DO                                                           GSS1F400.335    
          RowNumber=RowNumber+1                                            GSS1F400.336    
        END IF                                                             GSS1F400.337    
      END DO                                                               GSS1F400.338    
      END IF                                                               GSS1F400.339    
*ENDIF                                                                     GSS1F400.340    
                                                                           GSS2F401.227    
      END IF  !NFT.eq.22 (Standard STASHmstr or user STASHmstr)            GSS2F401.228    
                                                                           GSS2F401.229    
 9999 CONTINUE                                                             GETPPX1.206    
      RETURN                                                               GETPPX1.207    
      END                                                                  GETPPX1.208    
*ENDIF                                                                     GETPPX1.209