*IF DEF,CONTROL                                                            MEANPS1.2      
C ******************************COPYRIGHT******************************    GTS2F400.5887   
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.5888   
C                                                                          GTS2F400.5889   
C Use, duplication or disclosure of this code is subject to the            GTS2F400.5890   
C restrictions as set forth in the contract.                               GTS2F400.5891   
C                                                                          GTS2F400.5892   
C                Meteorological Office                                     GTS2F400.5893   
C                London Road                                               GTS2F400.5894   
C                BRACKNELL                                                 GTS2F400.5895   
C                Berkshire UK                                              GTS2F400.5896   
C                RG12 2SZ                                                  GTS2F400.5897   
C                                                                          GTS2F400.5898   
C If no contract has been raised with this copy of the code, the use,      GTS2F400.5899   
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.5900   
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.5901   
C Modelling at the above address.                                          GTS2F400.5902   
C ******************************COPYRIGHT******************************    GTS2F400.5903   
C                                                                          GTS2F400.5904   
CLL                                                                        MEANPS1.3      
CLL    Subroutine:                                                         MEANPS1.4      
CLL    MEANPS                                                              MEANPS1.5      
CLL                                                                        MEANPS1.6      
CLL    Purpose:                                                            MEANPS1.7      
CLL    To mean partial sums and create dumps                               MEANPS1.8      
CLL                                                                        MEANPS1.9      
CLL    Tested under compiler cft77                                         MEANPS1.10     
CLL    Tested under OS version:                                            MEANPS1.11     
CLL    UNICOS 5.1                                                          MEANPS1.12     
CLL                                                                        MEANPS1.13     
CLL T.J., D.R.  <- programmer of some or all of previous code or changes   MEANPS1.14     
CLL                                                                        MEANPS1.15     
CLL  Model            Modification history from model version 3.0:         MEANPS1.16     
CLL version  Date                                                          MEANPS1.17     
CLL   3.1  19/02/93  Use FIXHD(12) not FIXHD(1) as Version no in P21BITS   TJ190293.4      
CLL   3.1   25/01/93 : Corrected LBPACK after change to definition.        RS250193.6      
CLL 3.4  16/6/94 : Change CHARACTER*(*) to CHARACTER*(80) N.Farnon         ANF0F304.30     
!     4.1  18/06/96  Changes to cope with changes in STASH addressing      GDG0F401.870    
!                    Author D.M. Goddard.                                  GDG0F401.871    
!LL   4.2  27/11/96  MPP changes for T3E.  Using READDUMP to               GKR1F402.289    
!LL                  read in partial mean files. K Rogers                  GKR1F402.290    
CLL   4.3  23/01/97  Use MPP_LOOKUP adresses when on MPP                   GSM1F403.213    
CLL        17/04/97  And pass D1_ADDR to UM_READDUMP                       GSM1F403.214    
CLL                  S.D.Mullerworth                                       GSM1F403.215    
!LL   4.3  10/04/97  Add READHDR argument to READDUMP. K Rogers            GKR3F403.23     
CLL                                                                        MEANPS1.18     
CLL    Programming standard:                                               MEANPS1.19     
CLL    UM Doc Paper 3                                                      MEANPS1.20     
CLL                                                                        MEANPS1.21     
CLL    Logical system components covered:                                  MEANPS1.22     
CLL    C5                                                                  MEANPS1.23     
CLL                                                                        MEANPS1.24     
CLL    Project tasks:                                                      MEANPS1.25     
CLL    C5,C51,C52                                                          MEANPS1.26     
CLL                                                                        MEANPS1.27     
CLL    External documentation:                                             MEANPS1.28     
CLL    On-line UM document C5 - Control of means calculations              MEANPS1.29     
CLL                                                                        MEANPS1.30     
C*L    Interface and arguments:                                            MEANPS1.31     

      SUBROUTINE MEANPS( FIXHD,LEN_FIXHD                                    4,1GKR1F402.291    
     & ,INTHD,LEN_INTHD                                                    GKR1F402.292    
     & ,REALHD,LEN_REALHD                                                  GKR1F402.293    
     & ,LEVDEPC,LEN1_LEVDEPC,LEN2_LEVDEPC                                  GKR1F402.294    
     & ,ROWDEPC,LEN1_ROWDEPC,LEN2_ROWDEPC                                  GKR1F402.295    
     & ,COLDEPC,LEN1_COLDEPC,LEN2_COLDEPC                                  GKR1F402.296    
     & ,FLDDEPC,LEN1_FLDDEPC,LEN2_FLDDEPC                                  GKR1F402.297    
     & ,EXTCNST,LEN_EXTCNST                                                GKR1F402.298    
     & ,DUMPHIST,LEN_DUMPHIST                                              GKR1F402.299    
     & ,CFI1,LEN_CFI1                                                      GKR1F402.300    
     & ,CFI2,LEN_CFI2                                                      GKR1F402.301    
     & ,CFI3,LEN_CFI3                                                      GKR1F402.302    
     & ,LOOKUP,LEN1_LOOKUP,LEN2_LOOKUP                                     GKR1F402.304    
     & ,SUBM,N_OBJS_D1,D1_ADDR                                             GSM1F403.216    
*IF DEF,MPP                                                                GSM1F403.217    
     & ,MPP_LOOKUP,MPP_LEN1_LOOKUP                                         GSM1F403.218    
*ENDIF                                                                     GKR1F402.307    
     & ,LEN_DATA,D1,LD1,ID1,IBUFLEN,                                       GKR1F402.308    
     &                  NFTIN,MEANING_PERIOD,                              GDG0F401.874    
*CALL ARGPPX                                                               GDG0F401.875    
     &                  ICODE,CMESSAGE)                                    GDG0F401.876    
C                                                                          MEANPS1.37     
      IMPLICIT NONE                                                        MEANPS1.38     
*CALL D1_ADDR                                                              GSM1F403.219    
C                                                                          MEANPS1.39     
      INTEGER                                                              GKR1F402.309    
     * LEN_FIXHD     !IN Length of fixed length header                     GKR1F402.310    
     *,LEN_INTHD     !IN Length of integer header                          GKR1F402.311    
     *,LEN_REALHD    !IN Length of real header                             GKR1F402.312    
     *,LEN1_LEVDEPC  !IN 1st dim of level dep consts                       GKR1F402.313    
     *,LEN2_LEVDEPC  !IN 2nd dim of level dep consts                       GKR1F402.314    
     *,LEN1_ROWDEPC  !IN 1st dim of row dep consts                         GKR1F402.315    
     *,LEN2_ROWDEPC  !IN 2nd dim of row dep consts                         GKR1F402.316    
     &,LEN1_COLDEPC  !IN 1st dim of column dep consts                      GKR1F402.317    
     &,LEN2_COLDEPC  !IN 2nd dim of column dep consts                      GKR1F402.318    
     &,LEN1_FLDDEPC  !IN 1st dim of field dep consts                       GKR1F402.319    
     &,LEN2_FLDDEPC  !IN 2nd dim of field dep consts                       GKR1F402.320    
     &,LEN_EXTCNST   !IN Length of extra constants                         GKR1F402.321    
     &,LEN_DUMPHIST  !IN Length of history block                           GKR1F402.322    
     &,LEN_CFI1      !IN Length of comp field index 1                      GKR1F402.323    
     &,LEN_CFI2      !IN Length of comp field index 2                      GKR1F402.324    
     &,LEN_CFI3      !IN Length of comp field index 3                      GKR1F402.325    
     &,LEN1_LOOKUP   !IN 1st dim of lookup                                 GKR1F402.326    
     &,LEN2_LOOKUP   !IN 2nd dim of lookup                                 GKR1F402.327    
     &,N_OBJS_D1                                                           GSM1F403.220    
     &,SUBM                                                                GSM1F403.221    
*IF DEF,MPP                                                                GSM1F403.222    
     &,MPP_LEN1_LOOKUP !IN 1st dim of MPP lookup                           GSM1F403.223    
*ENDIF                                                                     GSM1F403.224    
                                                                           GKR1F402.328    
      INTEGER                                                              GKR1F402.329    
     * FIXHD(LEN_FIXHD) !IN Fixed length header                            GKR1F402.330    
     *,INTHD(LEN_INTHD) !IN Integer header                                 GKR1F402.331    
     *,LOOKUP(LEN1_LOOKUP,LEN2_LOOKUP) !IN PP lookup tables                GKR1F402.332    
     &,D1_ADDR(D1_LIST_LEN,N_OBJS_D1)                                      GSM1F403.225    
*IF DEF,MPP                                                                GKR1F402.333    
C     Local addressing of D1                                               GSM1F403.226    
     *,MPP_LOOKUP(MPP_LEN1_LOOKUP,LEN2_LOOKUP) ! OUT                       GSM1F403.227    
*ENDIF                                                                     GKR1F402.338    
     *,CFI1(LEN_CFI1+1) !IN Compressed field index no 1                    GKR1F402.339    
     *,CFI2(LEN_CFI2+1) !IN Compressed field index no 2                    GKR1F402.340    
     *,CFI3(LEN_CFI3+1) !IN Compressed field index no 3                    GKR1F402.341    
                                                                           GKR1F402.342    
      REAL                                                                 GKR1F402.343    
     & REALHD(LEN_REALHD) !IN Real header                                  GKR1F402.344    
     &,LEVDEPC(1+LEN1_LEVDEPC*LEN2_LEVDEPC) !IN Lev dep consts             GKR1F402.345    
     &,ROWDEPC(1+LEN1_ROWDEPC*LEN2_ROWDEPC) !IN Row dep consts             GKR1F402.346    
     &,COLDEPC(1+LEN1_COLDEPC*LEN2_COLDEPC) !IN Col dep consts             GKR1F402.347    
     &,FLDDEPC(1+LEN1_FLDDEPC*LEN2_FLDDEPC) !IN Field dep consts           GKR1F402.348    
     &,EXTCNST(LEN_EXTCNST+1)   !IN Extra constants                        GKR1F402.349    
     &,DUMPHIST(LEN_DUMPHIST+1) !IN History block                          GKR1F402.350    
      INTEGER                                                              MEANPS1.40     
     &       IBUFLEN,             ! IN dimension of largest data field     MEANPS1.44     
     &       LEN_DATA,            ! IN Length of model data                MEANPS1.45     
     &       NFTIN,               ! IN Unit no for partial sum read        MEANPS1.46     
     &       MEANING_PERIOD,      ! IN Meaning period (in multiples        MEANPS1.47     
     *                            !             of restart frequency)      MEANPS1.48     
     &       ICODE                ! OUT Return code; successful=0          MEANPS1.49     
     *                            !                  error>0               MEANPS1.50     
C                                                                          MEANPS1.51     
      CHARACTER*(80)                                                       ANF0F304.31     
     &       CMESSAGE             ! OUT Error message if ICODE>0           MEANPS1.53     
C                                                                          MEANPS1.54     
      INTEGER                                                              MEANPS1.55     
     &       ID1(LEN_DATA)        ! IN Integer equivalence of data block   MEANPS1.58     
C                                                                          MEANPS1.59     
      REAL                                                                 MEANPS1.60     
     &       D1(LEN_DATA)         ! IN Real equivalence of data block      MEANPS1.61     
C                                                                          MEANPS1.62     
      LOGICAL                                                              MEANPS1.63     
     &       LD1(LEN_DATA)        ! IN Logical equivalence of data block   MEANPS1.64     
C                                                                          MEANPS1.65     
C      Common blocks                                                       MEANPS1.66     
C                                                                          MEANPS1.67     
*CALL CLOOKADD                                                             MEANPS1.68     
*CALL C_MDI                                                                MEANPS1.69     
*CALL CSUBMODL                                                             GDG0F401.877    
*CALL CPPXREF                                                              GDG0F401.878    
*CALL PPXLOOK                                                              GDG0F401.879    
*IF DEF,MPP                                                                GKR1F402.351    
*CALL PARVARS                                                              GKR1F402.352    
*ENDIF                                                                     GKR1F402.353    
C                                                                          MEANPS1.70     
C*L                                                                        MEANPS1.71     
C*L    External subroutines called:                                        MEANPS1.72     
      EXTERNAL IOERROR,PR_LOOK,EXPAND21,BUFFIN,P21BITS,UM_READDUMP         GSM1F403.228    
      INTEGER  P21BITS                                                     MEANPS1.74     
C                                                                          MEANPS1.75     
C      Cray specific functions  UNIT,LENGTH                                MEANPS1.76     
                                                                           MEANPS1.77     
C                                                                          MEANPS1.78     
C      Local variables                                                     MEANPS1.79     
C                                                                          MEANPS1.80     
      INTEGER                                                              MEANPS1.81     
     &       LEN_IO,              ! No of 64-bit words buffered in/out     MEANPS1.82     
     &       IP1,IP2,             ! I/O buffer indices (=1 or 2)           MEANPS1.83     
     &       IPTS_IN,IPTS_OUT,    ! No of 64-bit words requested to        MEANPS1.84     
     *                            ! be buffered in/out                     MEANPS1.85     
     &       I,K,                 ! Loop indices                           MEANPS1.86     
     &       extraw               ! no of extra wors                       MEANPS1.87     
     &,      info                                                          GKR1F402.355    
     &,      LREC,ADDR            ! Address and record length of field     GSM1F403.229    
C                                                                          MEANPS1.88     
      REAL                                                                 MEANPS1.89     
     &       FACTOR,              ! Meaning period (real)                  MEANPS1.90     
     &       RFACTOR,             ! Reciprocal of FACTOR                   MEANPS1.91     
     &       A                    ! Error code from UNIT                   MEANPS1.92     
     &,      D1_DATA(IBUFLEN)     !                                        GKR1F402.356    
                                                                           GKR1F402.357    
C                                                                          MEANPS1.93     
C      Local arrays                                                        MEANPS1.94     
C                                                                          MEANPS1.95     
      REAL                                                                 MEANPS1.96     
     &       BUF(IBUFLEN,2),                  ! I/O buffer space (real)    MEANPS1.97     
     &       FIELD_DATA(IBUFLEN)              ! Work area for fields       MEANPS1.98     
     *                                        ! of real data               MEANPS1.99     
C                                                                          MEANPS1.100    
C      Constants                                                           MEANPS1.101    
C                                                                          MEANPS1.102    
      REAL                                                                 MEANPS1.103    
     &       ONE                  ! 1.0                                    MEANPS1.104    
C                                                                          MEANPS1.105    
      IF(ICODE.NE.0)GOTO 999                                               MEANPS1.106    
C                                                                          MEANPS1.107    
      ONE=1.0                                                              MEANPS1.108    
      FACTOR=MEANING_PERIOD                                                MEANPS1.109    
      RFACTOR=ONE/FACTOR                                                   MEANPS1.110    
C                                                                          MEANPS1.111    
C      Initialise pointers used for I/O buffers                            MEANPS1.112    
C                                                                          MEANPS1.113    
      IP1=1                                                                MEANPS1.114    
      IP2=2                                                                MEANPS1.115    
CL                                                                         MEANPS1.116    
CL**********************************************************************   MEANPS1.117    
CL     Start of loop over number of fields in data blocks                  MEANPS1.118    
CL**********************************************************************   MEANPS1.119    
                                                                           GKR1F402.358    
        CALL UM_READDUMP(NFTIN, FIXHD, LEN_FIXHD,                          GSM1F403.230    
     &      INTHD, LEN_INTHD,                                              GKR1F402.360    
     &      REALHD, LEN_REALHD,                                            GKR1F402.361    
     &      LEVDEPC, LEN1_LEVDEPC, LEN2_LEVDEPC,                           GKR1F402.362    
     &      ROWDEPC, LEN1_ROWDEPC, LEN2_ROWDEPC,                           GKR1F402.363    
     &      COLDEPC, LEN1_COLDEPC, LEN2_COLDEPC,                           GKR1F402.364    
     &      FLDDEPC, LEN1_FLDDEPC, LEN2_FLDDEPC,                           GKR1F402.365    
     &      EXTCNST, LEN_EXTCNST,                                          GKR1F402.366    
     &      DUMPHIST, LEN_DUMPHIST,                                        GKR1F402.367    
     &      CFI1, LEN_CFI1,                                                GKR1F402.368    
     &      CFI2, LEN_CFI2,                                                GKR1F402.369    
     &      CFI3, LEN_CFI3,                                                GKR1F402.370    
     &      LOOKUP,LEN1_LOOKUP,LEN2_LOOKUP,                                GSM1F403.231    
*IF DEF,MPP                                                                GSM1F403.232    
     &      MPP_LOOKUP,MPP_LEN1_LOOKUP,                                    GSM1F403.233    
*ENDIF                                                                     GKR1F402.376    
     &      SUBM,N_OBJS_D1,D1_ADDR,                                        GSM1F403.234    
     &      LEN_DATA,D1,                                                   GKR1F402.377    
*CALL ARGPPX                                                               GKR1F402.378    
     &      .false.,ICODE,CMESSAGE)                                        GKR3F403.24     
                                                                           GKR1F402.380    
*IF DEF,MPP                                                                GKR1F402.381    
! Broadcast return code to all processors.                                 GKR1F402.382    
        CALL GC_IBCAST(679,1,0,nproc,info,icode)                           GKR1F402.383    
*ENDIF                                                                     GKR1F402.384    
                                                                           GKR1F402.385    
CL----------------------------------------------------------------------   MEANPS1.157    
CL     Process data (real only)                                            MEANPS1.158    
CL----------------------------------------------------------------------   MEANPS1.159    
CL                                                                         MEANPS1.160    
      DO 200 K=1,FIXHD(152)+1                                              GKR1F402.386    
                                                                           GKR1F402.387    
        IF(K.NE.1)THEN                                                     MEANPS1.161    
CL                                                                         MEANPS1.179    
CL     Create required time-mean data and copy                             MEANPS1.180    
CL     to main COMMON area for diagnostics to be performed                 MEANPS1.181    
CL                                                                         MEANPS1.182    
          IF(LOOKUP(DATA_TYPE,K-1).EQ.1.OR.                                MEANPS1.183    
     &   LOOKUP(DATA_TYPE,K-1).EQ.-1.OR.LOOKUP(DATA_TYPE,K-1).EQ.4) THEN   MEANPS1.184    
CL                                                                         MEANPS1.185    
CL     Time-mean data and copy to main data block, leaving missing data    MEANPS1.186    
CL     untouched                                                           MEANPS1.187    
CL                                                                         MEANPS1.188    
*IF DEF,MPP                                                                GSM1F403.235    
            LREC = MPP_LOOKUP(P_LBLREC,K-1)                                GSM1F403.236    
            ADDR = MPP_LOOKUP(P_NADDR,K-1)                                 GSM1F403.237    
*ELSE                                                                      GSM1F403.238    
            LREC = LOOKUP(LBLREC,K-1)                                      GSM1F403.239    
            ADDR = LOOKUP(NADDR,K-1)                                       GSM1F403.240    
*ENDIF                                                                     GSM1F403.241    
            IF (lookup(lbext,k-1).eq.imdi) THEN                            MEANPS1.189    
              extraw=0                                                     MEANPS1.190    
            ELSE                                                           MEANPS1.191    
              extraw=lookup(lbext,k-1)                                     MEANPS1.192    
            ENDIF                                                          MEANPS1.193    
            DO 220 I=1,LREC-extraw                                         GSM1F403.242    
CL don't process extra data.                                               MEANPS1.195    
              D1_DATA(I) = D1(ADDR+I-1)                                    GSM1F403.243    
      IF (D1_DATA(I).NE.RMDI) THEN                                         GJC0F405.32     
                D1_DATA(I)=D1_DATA(I)*RFACTOR                              GKR1F402.390    
              ENDIF                                                        MEANPS1.198    
  220       CONTINUE                                                       MEANPS1.199    
            DO 230 i=1,lrec                                                GSM1F403.244    
CL we do want to copy the extra data though                                MEANPS1.201    
              D1(ADDR+I-1)=D1_DATA(I)                                      GSM1F403.245    
 230        CONTINUE                                                       MEANPS1.203    
C                                                                          MEANPS1.204    
          ENDIF                                                            MEANPS1.205    
C                                                                          MEANPS1.206    
        ENDIF                                                              MEANPS1.207    
CL                                                                         MEANPS1.208    
CL----------------------------------------------------------------------   MEANPS1.209    
CL     Check for errors in data transfer from disk                         MEANPS1.210    
CL----------------------------------------------------------------------   MEANPS1.211    
CL                                                                         MEANPS1.212    
C                                                                          MEANPS1.222    
C      Toggle pointers used for I/O buffers on next pass of loop           MEANPS1.223    
C                                                                          MEANPS1.224    
        IP1=3-IP1                                                          MEANPS1.225    
        IP2=3-IP2                                                          MEANPS1.226    
C                                                                          MEANPS1.227    
  200 CONTINUE                                                             MEANPS1.228    
CL                                                                         MEANPS1.229    
CL**********************************************************************   MEANPS1.230    
CL     End of loop over number of fields                                   MEANPS1.231    
CL**********************************************************************   MEANPS1.232    
CL                                                                         MEANPS1.233    
 999  CONTINUE                                                             MEANPS1.234    
      RETURN                                                               MEANPS1.235    
      END                                                                  MEANPS1.236    
*ENDIF                                                                     MEANPS1.237