*IF DEF,FLDMOD                                                             FLDMOD1.2      
C *****************************COPYRIGHT******************************     FLDMOD1.3      
C (c) CROWN COPYRIGHT 1996, METEOROLOGICAL OFFICE, All Rights Reserved.    FLDMOD1.4      
C                                                                          FLDMOD1.5      
C Use, duplication or disclosure of this code is subject to the            FLDMOD1.6      
C restrictions as set forth in the contract.                               FLDMOD1.7      
C                                                                          FLDMOD1.8      
C                Meteorological Office                                     FLDMOD1.9      
C                London Road                                               FLDMOD1.10     
C                BRACKNELL                                                 FLDMOD1.11     
C                Berkshire UK                                              FLDMOD1.12     
C                RG12 2SZ                                                  FLDMOD1.13     
C                                                                          FLDMOD1.14     
C If no contract has been raised with this copy of the code, the use,      FLDMOD1.15     
C duplication or disclosure of it is strictly prohibited.  Permission      FLDMOD1.16     
C to do so must first be obtained in writing from the Head of Numerical    FLDMOD1.17     
C Modelling at the above address.                                          FLDMOD1.18     
C ******************************COPYRIGHT******************************    FLDMOD1.19     
C                                                                          FLDMOD1.20     
CLL  Routine: FLDMOD --------------------------------------------------    FLDMOD1.21     
CLL                                                                        FLDMOD1.22     
CLL  Purpose: To read a   direct access PP file  and convert it to a       FLDMOD1.23     
CLL  sequential file read to be passed across to the IBM                   FLDMOD1.24     
CLL                                                                        FLDMOD1.25     
CLL  Modification History:                                                 FLDMOD1.26     
CLL  Copy of FIELDMOD taken, named UMTHIN1 and code for thinning           FLDMOD1.27     
CLL  fields added. I/O routines from portable model included so that       FLDMOD1.28     
CLL  file names are passed through environmental variables instead         FLDMOD1.29     
CLL  of assigns. Vic Blackman January-March 1995                           FLDMOD1.30     
CLL                                                                        FLDMOD1.31     
CLL  Calls to OPEN replaced by FILE_OPEN due to change in UM v3.5          FLDMOD1.32     
CLL  4.2   29/11/96 (1)Corrections to code to enable qxumthin1 to          FLDMOD1.33     
CLL         produce a bit comparable dump to that produced by qxfieldmod   FLDMOD1.34     
CLL                 (as used in operational suite) using the namelist      FLDMOD1.35     
CLL                 /u/opfc/op/perm/in/qifieldmod as input.                FLDMOD1.36     
CLL                 (2)Renamed FLDMOD                                      FLDMOD1.37     
CLL                 Author I.Edmond                                        FLDMOD1.38     
CLL  4.3   15/4/97 Get the current sector size for disk I/O from           UIE1F403.18     
CLL                environment variable UM_SECTOR_SIZE in calling          UIE1F403.19     
CLL                script, otherwise, use UM_SECTOR_SIZE=512.              UIE1F403.20     
CLL                Required by INITPP to make sure the data starts         UIE1F403.21     
CLL                on a sector bndry. IEdmond                              UIE1F403.22     
!    4.5   05/06/98 Prevent failure if lookup table starts on a            UDG1F405.1534   
!                   sector boundary                                        UDG1F405.1535   
!                   Author D.M. Goddard                                    UDG1F405.1536   
CLL                                                                        FLDMOD1.39     
CLL  Programming standard: UM Doc Paper 3, version 1 (15/1/90)             FLDMOD1.40     
CLL                                                                        FLDMOD1.41     
CLL  Project task: ...                                                     FLDMOD1.42     
CLL                                                                        FLDMOD1.43     
CLL  External documentation: On-line UM document ??? - ??????????          FLDMOD1.44     
CLL                                                                        FLDMOD1.45     
CLL  -------------------------------------------------------------------   FLDMOD1.46     
C*L  Interface and arguments: ------------------------------------------   FLDMOD1.47     
C                                                                          FLDMOD1.48     

      PROGRAM FLDMOD                                                       ,7FLDMOD1.49     
      IMPLICIT NONE                                                        FLDMOD1.50     
      EXTERNAL DIMENS1                                                     FLDMOD1.51     
      CHARACTER CMESSAGE*80                                                FLDMOD1.52     
      CHARACTER DIAGFILE*80                                                FLDMOD1.53     
      CHARACTER INFILE*80                                                  FLDMOD1.54     
      CHARACTER*8 c_nproc            ! to get nproc_x and nproc_y from     UIE1F403.23     
!                                    ! environment variables.              UIE1F403.24     
C                         up to an EVEN no for conversion to IBM format    FLDMOD1.55     
      INTEGER                                                              FLDMOD1.56     
     &     LEN_FIXHD              !    Length of fixed length header       FLDMOD1.57     
     &    ,LEN_INTHD                                                       FLDMOD1.58     
     &    ,LEN_REALHD                                                      FLDMOD1.59     
     &    ,LEN1_LEVDPC                                                     FLDMOD1.60     
     &    ,LEN2_LEVDPC                                                     FLDMOD1.61     
     &    ,LEN1_LOOKUP                                                     FLDMOD1.62     
     &    ,LEN2_LOOKUP                                                     FLDMOD1.63     
     &    ,PPUNIT1                !OUT unit no of required fieldsfile 1    FLDMOD1.64     
     &    ,PPUNIT2                !OUT unit no of required fieldsfile 2    FLDMOD1.65     
     &    ,DIAG_UNIT              !unit number for diagnostics             FLDMOD1.66     
     &    ,ICODE                  !IN  return code                         FLDMOD1.67     
     &    ,ERR                                                             UIE1F403.25     
C    LOCAL VARIABLES                                                       FLDMOD1.68     
      PARAMETER(LEN_FIXHD=256)                                             FLDMOD1.69     
      INTEGER                                                              FLDMOD1.70     
     &     I                      ! local counter                          FLDMOD1.71     
     &    ,PP_FIXHD(LEN_FIXHD)    !IN  Fixed length header                 FLDMOD1.72     
     &    ,IWA                    !                                        FLDMOD1.73     
     &    ,IX                     !                                        FLDMOD1.74     
     &    ,LEN_IO                 !                                        FLDMOD1.75     
      REAL                                                                 FLDMOD1.76     
     &     A_IO                   !                                        FLDMOD1.77     
c                                                                          FLDMOD1.78     
*CALL CNTL_IO                                                              UIE1F403.26     
                                                                           UIE1F403.27     
CL                                                                         UIE1F403.28     
CL Get the current sector size for disk I/O                                UIE1F403.29     
CL                                                                         UIE1F403.30     
                                                                           UIE1F403.31     
      CALL FORT_GET_ENV('UM_SECTOR_SIZE',14,c_nproc,8,err)                 UIE1F403.32     
      IF (err .NE. 0) THEN                                                 UIE1F403.33     
        WRITE(6,*) 'Warning: Environment variable UM_SECTOR_SIZE has ',    UIE1F403.34     
     &             'not been set.'                                         UIE1F403.35     
        WRITE(6,*) 'Setting um_sector_size to 512'                         UIE1F403.36     
        um_sector_size=512                                                 UIE1F403.37     
      ELSE                                                                 UIE1F403.38     
        READ(c_nproc,'(I4)') um_sector_size                                UIE1F403.39     
      ENDIF                                                                UIE1F403.40     
C    OPEN DIAGNOSTIC FILE                                                  FLDMOD1.79     
      DIAG_UNIT = 7                                                        FLDMOD1.80     
      CALL GET_FILE(DIAG_UNIT,DIAGFILE,80,ICODE)                           FLDMOD1.81     
      OPEN(UNIT=DIAG_UNIT,FILE=DIAGFILE)                                   FLDMOD1.82     
                                                                           FLDMOD1.83     
C*****************************************************************         FLDMOD1.84     
C    REMEMBER THAT BUFFER OUT STARTS AT ADDRESS 0 THUS LOOKUP GOES         FLDMOD1.85     
C    FROM 0 to 262143 ie THE NEXT ADDRESS SHOULD BE IWA=262144 to          FLDMOD1.86     
C    IWA=325119 then IWA=325120 to 388095 then 388096 etc                  FLDMOD1.87     
C                                                                          FLDMOD1.88     
      icode = 0                                                            FLDMOD1.89     
      cmessage= '                                         '                FLDMOD1.90     
C                                                                          FLDMOD1.91     
C     READ IN LOOKUP TABLE  IF FIRST TIME THRO                             FLDMOD1.92     
C*****************************************************************         FLDMOD1.93     
      PPUNIT1=10                                                           FLDMOD1.94     
      PPUNIT2=11                                                           FLDMOD1.95     
c     IX=UNIT(PPUNIT1)                                                     FLDMOD1.96     
C*****************************************************************         FLDMOD1.97     
C     Buffer in the Fixed Length Header and obtain lengths                 FLDMOD1.98     
C*****************************************************************         FLDMOD1.99     
      CALL GET_FILE(PPUNIT1,INFILE,80,ICODE)                               FLDMOD1.100    
      CALL FILE_OPEN(PPUNIT1,INFILE,80,0,1,ICODE)                          FLDMOD1.101    
c     call getpos(ppunit1,iwa)                                             FLDMOD1.102    
c     WRITE(6,*)' fixhd iwa=',iwa                                          GIE0F403.199    
      CALL BUFFIN(PPUNIT1,PP_FIXHD,LEN_FIXHD,LEN_IO,A_IO)                  FLDMOD1.104    
        IF(A_IO.NE.-1.0.OR.LEN_IO.NE.LEN_FIXHD) THEN                       FLDMOD1.105    
          CALL IOERROR('Buffer in fixed length header',A_IO,LEN_IO,        FLDMOD1.106    
     &                  LEN_FIXHD)                                         FLDMOD1.107    
          CMESSAGE='FFREAD : I/O error reading FIXED LENGTH HEADER'        FLDMOD1.108    
          ICODE=2                                                          FLDMOD1.109    
          WRITE(6,*)'umthin1 - I/O error reading FIXED LENGTH HEADER'      GIE0F403.200    
          STOP                                                             FLDMOD1.111    
        ENDIF                                                              FLDMOD1.112    
c     WRITE(6,*)'fixed length header'                                      GIE0F403.201    
c     WRITE(6,*)pp_fixhd                                                   GIE0F403.202    
      LEN_INTHD=PP_FIXHD(101)                                              FLDMOD1.115    
      LEN_REALHD=PP_FIXHD(106)                                             FLDMOD1.116    
      LEN1_LEVDPC=PP_FIXHD(111)                                            FLDMOD1.117    
      LEN2_LEVDPC=PP_FIXHD(112)                                            FLDMOD1.118    
      LEN1_LOOKUP=PP_FIXHD(151)                                            FLDMOD1.119    
      LEN2_LOOKUP=PP_FIXHD(152)                                            FLDMOD1.120    
      CALL DIMENS1(LEN_INTHD,LEN_REALHD,LEN1_LEVDPC,LEN2_LEVDPC,           FLDMOD1.121    
     &   LEN1_LOOKUP,LEN2_LOOKUP,LEN_FIXHD,PP_FIXHD,PPUNIT1,PPUNIT2,       FLDMOD1.122    
     &   ICODE,CMESSAGE)                                                   FLDMOD1.123    
      IF(ICODE.NE.0) THEN                                                  FLDMOD1.124    
        WRITE(7,100) ICODE                                                 FLDMOD1.125    
        WRITE(7,110) CMESSAGE                                              FLDMOD1.126    
      ENDIF                                                                FLDMOD1.127    
      STOP                                                                 FLDMOD1.128    
 100  FORMAT(' ICODE EQUAL TO ',I2)                                        FLDMOD1.129    
 110  FORMAT(A80)                                                          FLDMOD1.130    
      STOP                                                                 FLDMOD1.131    
      END                                                                  FLDMOD1.132    
CLL  Routine: CONTROL----------------------------------------------        FLDMOD1.133    
CLL                                                                        FLDMOD1.134    
CLL  Purpose: To control the calculation of the derived diagnostics        FLDMOD1.135    
CLL  and output of the new LOOKUP table (called LOOKNEW)                   FLDMOD1.136    
CLL                                                                        FLDMOD1.137    
CLL  Tested under compiler:   cft77                                        FLDMOD1.138    
CLL  Tested under OS version: UNICOS 5.1                                   FLDMOD1.139    
CLL                                                                        FLDMOD1.140    
CLL  Modification History:                                                 FLDMOD1.141    
CLL                                                                        FLDMOD1.142    
CLL  Programming standard: UM Doc Paper 3, version 1 (15/1/90)             FLDMOD1.143    
CLL                                                                        FLDMOD1.144    
CLL  Project task: ...                                                     FLDMOD1.145    
CLL                                                                        FLDMOD1.146    
CLL  External documentation: On-line UM document ??? - ??????????          FLDMOD1.147    
CLL                                                                        FLDMOD1.148    
CLL  ---------                                                             FLDMOD1.149    
C*L  Interface and arguments: ------------------------------------------   FLDMOD1.150    
C                                                                          FLDMOD1.151    

      SUBROUTINE CONTROL(PPUNIT1,PPUNIT2,LEN1_LOOKUP,LEN2_LOOKUP,           2,308FLDMOD1.152    
     &                   LOOKUP,PP_INTHD,LEN_INTHD,                        FLDMOD1.153    
     &                   PP_FIXHD,LEN_FIXHD,ICODE,CMESSAGE,NENT)           FLDMOD1.154    
      IMPLICIT NONE                                                        FLDMOD1.155    
      INTEGER                                                              FLDMOD1.156    
     &     LEN_FIXHD                                                       FLDMOD1.157    
     &    ,LEN_INTHD                                                       FLDMOD1.158    
     &    ,LEN_LOOKUP                                                      FLDMOD1.159    
     &    ,LEN1_LOOKUP                                                     FLDMOD1.160    
     &    ,LEN2_LOOKUP                                                     FLDMOD1.161    
     &    ,LOOKUP(LEN1_LOOKUP,LEN2_LOOKUP)                                 FLDMOD1.162    
     &    ,LOOKNEW(LEN1_LOOKUP,LEN2_LOOKUP)                                FLDMOD1.163    
     &    ,PP_FIXHD(LEN_FIXHD)                                             FLDMOD1.164    
     &    ,PP_INTHD(LEN_INTHD)                                             FLDMOD1.165    
     &    ,LEN_IO                                                          FLDMOD1.166    
     &    ,ICODE                                                           FLDMOD1.167    
     &    ,PPUNIT1                                                         FLDMOD1.168    
     &    ,PPUNIT2                                                         FLDMOD1.169    
     &    ,NENT                                                            FLDMOD1.170    
      INTEGER                                                              FLDMOD1.171    
     &     ROW_LENGTH                                                      FLDMOD1.172    
     &    ,P_ROWS                                                          FLDMOD1.173    
     &    ,P_FIELD                                                         FLDMOD1.174    
     &    ,LENBUF                                                          FLDMOD1.175    
     &    ,I                                                               FLDMOD1.176    
     &    ,J                                                               FLDMOD1.177    
      REAL                                                                 FLDMOD1.178    
     &     A_IO                                                            FLDMOD1.179    
                                                                           FLDMOD1.180    
      INTEGER                                                              FLDMOD1.181    
     &    STIME_MOD                                                        FLDMOD1.182    
     &,   ETIME_MOD                                                        FLDMOD1.183    
     &,   NFIELDS_MOD                                                      FLDMOD1.184    
     &,   MTYPE_MOD(500)                                                   FLDMOD1.185    
     &,   MLEVS_MOD(500)                                                   FLDMOD1.186    
     &,   STIME_SEL                                                        FLDMOD1.187    
     &,   ETIME_SEL                                                        FLDMOD1.188    
     &,   NFIELDS_SEL                                                      FLDMOD1.189    
     &,   MTYPE_SEL(500)                                                   FLDMOD1.190    
     &,   MLEVS_SEL(500)                                                   FLDMOD1.191    
     &,   STIME_REJ                                                        FLDMOD1.192    
     &,   ETIME_REJ                                                        FLDMOD1.193    
     &,   NFIELDS_REJ                                                      FLDMOD1.194    
     &,   MTYPE_REJ(500)                                                   FLDMOD1.195    
     &,   MLEVS_REJ(500)                                                   FLDMOD1.196    
     &,   PPUNIT_OROG                                                      FLDMOD1.197    
     &,   STIME_THI                                                        FLDMOD1.198    
     &,   ETIME_THI                                                        FLDMOD1.199    
     &,   NFIELDS_THI                                                      FLDMOD1.200    
     &,   MTYPE_THI(500)                                                   FLDMOD1.201    
     &,   MLEVS_THI(500)                                                   FLDMOD1.202    
     $,   IXXSTEP_THI(500)                                                 FLDMOD1.203    
     $,   IYYSTEP_THI(500)                                                 FLDMOD1.204    
                                                                           FLDMOD1.205    
      CHARACTER                                                            FLDMOD1.206    
     &    OUTPUT_PACK_TYPE*6                                               FLDMOD1.207    
                                                                           FLDMOD1.208    
      REAL                                                                 FLDMOD1.209    
     &    AMULT(500)                                                       FLDMOD1.210    
     &,   WIND_10M_OROG          !  LEVEL ABOVE WHICH 10M WIND FIXED       FLDMOD1.211    
     &,   WIND_10M_SCALE         !  SCALE APPLIED TO LEVEL 1 WINDS         FLDMOD1.212    
                                                                           FLDMOD1.213    
      LOGICAL                                                              FLDMOD1.214    
     &    MODIFY                                                           FLDMOD1.215    
     &,   REJECT                                                           FLDMOD1.216    
     &,   SELECT                                                           FLDMOD1.217    
     &,   WIND_10M                                                         FLDMOD1.218    
     &,   THIN                                                             FLDMOD1.219    
                                                                           FLDMOD1.220    
      NAMELIST /MODS/                                                      FLDMOD1.221    
     &  MODIFY,STIME_MOD,ETIME_MOD,NFIELDS_MOD,                            FLDMOD1.222    
     &                                      MTYPE_MOD,MLEVS_MOD,AMULT,     FLDMOD1.223    
     &  SELECT,STIME_SEL,ETIME_SEL,NFIELDS_SEL,MTYPE_SEL,MLEVS_SEL,        FLDMOD1.224    
     &  REJECT,STIME_REJ,ETIME_REJ,NFIELDS_REJ,MTYPE_REJ,MLEVS_REJ,        FLDMOD1.225    
     &  WIND_10M,WIND_10M_SCALE,WIND_10M_OROG,PPUNIT_OROG,                 FLDMOD1.226    
     &  THIN,STIME_THI,ETIME_THI,NFIELDS_THI,MTYPE_THI,MLEVS_THI,          FLDMOD1.227    
     &                                        IXXSTEP_THI,IYYSTEP_THI,     FLDMOD1.228    
     &  OUTPUT_PACK_TYPE                                                   FLDMOD1.229    
                                                                           FLDMOD1.230    
C-----------------------------------------------------------------------   FLDMOD1.231    
      CHARACTER CMESSAGE*(*)                                               FLDMOD1.232    
      EXTERNAL FIELDS                                                      FLDMOD1.233    
C                                                                          FLDMOD1.234    
CL---------------------------------------------------------------          FLDMOD1.235    
CL     init namelist                                                       FLDMOD1.236    
CL---------------------------------------------------------------          FLDMOD1.237    
      MODIFY   = .FALSE.                                                   FLDMOD1.238    
      REJECT   = .FALSE.                                                   FLDMOD1.239    
      SELECT   = .FALSE.                                                   FLDMOD1.240    
      WIND_10M = .FALSE.                                                   FLDMOD1.241    
      THIN=.FALSE.                                                         FLDMOD1.242    
      STIME_MOD = -99                                                      FLDMOD1.243    
      ETIME_MOD = -99                                                      FLDMOD1.244    
      NFIELDS_MOD=0                                                        FLDMOD1.245    
      STIME_SEL = -99                                                      FLDMOD1.246    
      ETIME_SEL = -99                                                      FLDMOD1.247    
      NFIELDS_SEL=0                                                        FLDMOD1.248    
      STIME_REJ = -99                                                      FLDMOD1.249    
      ETIME_REJ = -99                                                      FLDMOD1.250    
      NFIELDS_REJ=0                                                        FLDMOD1.251    
      STIME_THI = -99                                                      FLDMOD1.252    
      ETIME_THI = -99                                                      FLDMOD1.253    
      NFIELDS_THI=0                                                        FLDMOD1.254    
      DO I=1,500                                                           FLDMOD1.255    
        MTYPE_MOD(I)=0                                                     FLDMOD1.256    
        MLEVS_MOD(I)=0                                                     FLDMOD1.257    
        AMULT(I)=1.0                                                       FLDMOD1.258    
        MTYPE_SEL(I)=0                                                     FLDMOD1.259    
        MLEVS_SEL(I)=0                                                     FLDMOD1.260    
        MTYPE_REJ(I)=0                                                     FLDMOD1.261    
        MLEVS_REJ(I)=0                                                     FLDMOD1.262    
        MTYPE_THI(I)=0                                                     FLDMOD1.263    
        MLEVS_THI(I)=0                                                     FLDMOD1.264    
        IXXSTEP_THI(I)=2                                                   FLDMOD1.265    
        IYYSTEP_THI(I)=2                                                   FLDMOD1.266    
      ENDDO                                                                FLDMOD1.267    
      WIND_10M_OROG  = -9999.                                              FLDMOD1.268    
      WIND_10M_SCALE = .7                                                  FLDMOD1.269    
      PPUNIT_OROG    = 12                                                  FLDMOD1.270    
      OUTPUT_PACK_TYPE='WGDOS '                                            FLDMOD1.271    
C                                                                          FLDMOD1.272    
CL---------------------------------------------------------------          FLDMOD1.273    
CL     read namelist                                                       FLDMOD1.274    
CL---------------------------------------------------------------          FLDMOD1.275    
      READ(5,MODS)                                                         FLDMOD1.276    
      WRITE(7,MODS)                                                        FLDMOD1.277    
                                                                           FLDMOD1.278    
CL---------------------------------------------------------------          FLDMOD1.279    
CL     Set up constants                                                    FLDMOD1.280    
CL---------------------------------------------------------------          FLDMOD1.281    
      ROW_LENGTH=PP_INTHD(6)                                               FLDMOD1.282    
      P_ROWS=PP_INTHD(7)                                                   FLDMOD1.283    
      P_FIELD=ROW_LENGTH*P_ROWS                                            FLDMOD1.284    
      LENBUF=P_FIELD + 512                                                 FLDMOD1.285    
                                                                           FLDMOD1.286    
C     WRITE(6,*)'call fields'                                              GIE0F403.203    
      CALL FIELDS(PP_FIXHD,LEN_FIXHD,LENBUF,P_FIELD,                       FLDMOD1.288    
     &             LOOKUP,LOOKUP,LEN1_LOOKUP,LEN2_LOOKUP,NENT,             FLDMOD1.289    
     &             STIME_MOD,ETIME_MOD,NFIELDS_MOD,                        FLDMOD1.290    
     &                                       MTYPE_MOD,MLEVS_MOD,AMULT,    FLDMOD1.291    
     &             STIME_SEL,ETIME_SEL,NFIELDS_SEL,MTYPE_SEL,MLEVS_SEL,    FLDMOD1.292    
     &             STIME_REJ,ETIME_REJ,NFIELDS_REJ,MTYPE_REJ,MLEVS_REJ,    FLDMOD1.293    
     &             STIME_THI,ETIME_THI,NFIELDS_THI,MTYPE_THI,MLEVS_THI,    FLDMOD1.294    
     &                                         IXXSTEP_THI,IYYSTEP_THI,    FLDMOD1.295    
     &             MODIFY,SELECT,REJECT,THIN,OUTPUT_PACK_TYPE,             FLDMOD1.296    
     &             WIND_10M,WIND_10M_OROG,WIND_10M_SCALE,PPUNIT_OROG,      FLDMOD1.297    
     &             PPUNIT1,PPUNIT2,ICODE,CMESSAGE)                         FLDMOD1.298    
 9999 CONTINUE                                                             FLDMOD1.299    
      RETURN                                                               FLDMOD1.300    
      END                                                                  FLDMOD1.301    
                                                                           FLDMOD1.302    

      SUBROUTINE CONV_PACK(ILABEL,RLABEL,PACK_CODE,                         1,3FLDMOD1.303    
     1                     INPUT_PACK_TYPE,OUTPUT_PACK_TYPE,               FLDMOD1.304    
     2                     FIELD,IDIM,LEN_FIELD,                           FLDMOD1.305    
     3                     PP_FIXHD,ICODE,CMESSAGE)                        FLDMOD1.306    
                                                                           FLDMOD1.307    
      INTEGER                                                              FLDMOD1.308    
     &     ILABEL(50)                                                      FLDMOD1.309    
     &    ,PACK_CODE                                                       FLDMOD1.310    
     &    ,IDIM                                                            FLDMOD1.311    
     &    ,PP_FIXHD(*)                                                     FLDMOD1.312    
     &    ,LEN_FIELD                                                       FLDMOD1.313    
     &    ,ICODE                                                           FLDMOD1.314    
      REAL                                                                 FLDMOD1.315    
     &     RLABEL(19)                                                      FLDMOD1.316    
     &    ,FIELD(IDIM)                                                     FLDMOD1.317    
      CHARACTER                                                            FLDMOD1.318    
     &     INPUT_PACK_TYPE*6                                               FLDMOD1.319    
     &    ,OUTPUT_PACK_TYPE*6                                              FLDMOD1.320    
     &    ,CMESSAGE*(*)                                                    FLDMOD1.321    
      REAL                                                                 FLDMOD1.322    
     &     AMDI                                                            FLDMOD1.323    
*CALL CLOOKADD                                                             FLDMOD1.324    
                                                                           FLDMOD1.325    
      AMDI=RLABEL(18)                                                      FLDMOD1.326    
                                                                           FLDMOD1.327    
c     WRITE(6,*)'len_field=',len_field                                     GIE0F403.204    
      CALL UN_PACK(PACK_CODE,IDIM,FIELD,LEN_FIELD,                         FLDMOD1.329    
     1             ILABEL,AMDI,PP_FIXHD,ICODE,CMESSAGE)                    FLDMOD1.330    
                                                                           FLDMOD1.331    
      LEN_FIELD = ILABEL(LBROW) * ILABEL(LBNPT)                            FLDMOD1.332    
      WRITE(6,*) INPUT_PACK_TYPE,' NOW UNPACKED'                           GIE0F403.205    
c     WRITE(6,*)'len_field=',len_field                                     GIE0F403.206    
                                                                           FLDMOD1.335    
      IF(OUTPUT_PACK_TYPE.EQ.'NONE  ') THEN                                FLDMOD1.336    
        pack_code=0   ! no repacking needed                                FLDMOD1.337    
      ELSEIF(OUTPUT_PACK_TYPE.EQ.'WGDOS ') THEN                            FLDMOD1.338    
        pack_code=1   ! repack using coex                                  FLDMOD1.339    
        CALL RE_PACK(PACK_CODE,IDIM,FIELD,LEN_FIELD,                       FLDMOD1.340    
     1             ILABEL,RLABEL,PP_FIXHD,ICODE,CMESSAGE)                  FLDMOD1.341    
      ELSEIF(OUTPUT_PACK_TYPE.EQ.'CRAY32') THEN                            FLDMOD1.342    
        pack_code=3   ! repack using cray 32                               FLDMOD1.343    
        WRITE(6,*) 'packing not supported'                                 GIE0F403.207    
                                                                           FLDMOD1.345    
      ELSEIF(OUTPUT_PACK_TYPE.EQ.'GRIB  ') THEN                            FLDMOD1.346    
        pack_code=3   ! repack using grib                                  FLDMOD1.347    
        CALL RE_PACK(PACK_CODE,IDIM,FIELD,LEN_FIELD,                       FLDMOD1.348    
     1             ILABEL,RLABEL,PP_FIXHD,ICODE,CMESSAGE)                  FLDMOD1.349    
      ENDIF                                                                FLDMOD1.350    
                                                                           FLDMOD1.351    
      ILABEL(LBLREC) = LEN_FIELD                                           FLDMOD1.352    
                                                                           FLDMOD1.353    
      WRITE(6,*) 'NOW PACKED INTO ',OUTPUT_PACK_TYPE                       GIE0F403.208    
c     WRITE(6,*)'len_field=',len_field                                     GIE0F403.209    
                                                                           FLDMOD1.356    
      RETURN                                                               FLDMOD1.357    
      END                                                                  FLDMOD1.358    
CLL  Routine: DIMENS1--------------------------------------------          FLDMOD1.359    
CLL                                                                        FLDMOD1.360    
CLL  Purpose: To read a   direct access PP file  and convert it to a       FLDMOD1.361    
CLL  sequential file read to be passed across to the IBM                   FLDMOD1.362    
CLL                                                                        FLDMOD1.363    
CLL  Modification History:                                                 FLDMOD1.364    
CLL                                                                        FLDMOD1.365    
CLL  Programming standard: UM Doc Paper 3, version 1 (15/1/90)             FLDMOD1.366    
CLL                                                                        FLDMOD1.367    
CLL  -------------------------------------------------------------------   FLDMOD1.368    
C*L  Interface and arguments: ------------------------------------------   FLDMOD1.369    
C                                                                          FLDMOD1.370    

      SUBROUTINE DIMENS1(LEN_INTHD,LEN_REALHD,LEN1_LEVDPC,LEN2_LEVDPC,      1,1FLDMOD1.371    
     &   LEN1_LOOKUP,LEN2_LOOKUP,LEN_FIXHD,PP_FIXHD,PPUNIT1,PPUNIT2,       FLDMOD1.372    
     &   ICODE,CMESSAGE)                                                   FLDMOD1.373    
      IMPLICIT NONE                                                        FLDMOD1.374    
      EXTERNAL READPP                                                      FLDMOD1.375    
      CHARACTER CMESSAGE*(*)                                               FLDMOD1.376    
      INTEGER                                                              FLDMOD1.377    
     &     LEN_INTHD                                                       FLDMOD1.378    
     &    ,LEN_FIXHD                                                       FLDMOD1.379    
     &    ,LEN_REALHD                                                      FLDMOD1.380    
     &    ,LEN1_LEVDPC                                                     FLDMOD1.381    
     &    ,LEN2_LEVDPC                                                     FLDMOD1.382    
     &    ,LEN1_LOOKUP                                                     FLDMOD1.383    
     &    ,LEN2_LOOKUP                                                     FLDMOD1.384    
     &    ,LOOKUP(LEN1_LOOKUP,LEN2_LOOKUP)                                 FLDMOD1.385    
     &    ,PP_FIXHD(LEN_FIXHD)                                             FLDMOD1.386    
     &    ,ICODE                                                           FLDMOD1.387    
     &    ,PPUNIT1                                                         FLDMOD1.388    
     &    ,PPUNIT2                                                         FLDMOD1.389    
C                                                                          FLDMOD1.390    
C    REMEMBER THAT BUFFER OUT STARTS AT ADDRESS 0 THUS LOOKUP GOES         FLDMOD1.391    
C    FROM 0 to 262143 ie THE NEXT ADDRESS SHOULD BE IWA=262144 to          FLDMOD1.392    
C    IWA=325119 then IWA=325120 to 388095 then 388096 etc                  FLDMOD1.393    
C                                                                          FLDMOD1.394    
C                                                                          FLDMOD1.395    
cd    WRITE(6,*)' call readpp'                                             GIE0F403.210    
      CALL READPP(LEN_INTHD,LEN_REALHD,LEN1_LEVDPC,LEN2_LEVDPC,            FLDMOD1.397    
     &LEN1_LOOKUP,LEN2_LOOKUP,LEN_FIXHD,PP_FIXHD,LOOKUP,LOOKUP,PPUNIT1,    FLDMOD1.398    
     &     PPUNIT2,ICODE,CMESSAGE)                                         FLDMOD1.399    
 9999 CONTINUE                                                             FLDMOD1.400    
      IF(ICODE.NE.0) RETURN                                                FLDMOD1.401    
      RETURN                                                               FLDMOD1.402    
      END                                                                  FLDMOD1.403    
                                                                           FLDMOD1.404    
CLL  Routine: FIELDS ----------------------------------------------        FLDMOD1.405    
CLL                                                                        FLDMOD1.406    
CLL  Purpose: To calculate fields from the Fields File such as those       FLDMOD1.407    
CLL  normaly derived in the Derived Printfile Program                      FLDMOD1.408    
CLL                                                                        FLDMOD1.409    
CLL  Tested under compiler:   cft77                                        FLDMOD1.410    
CLL  Tested under OS version: UNICOS 5.190                                 FLDMOD1.411    
CLL                                                                        FLDMOD1.412    
CLL  Modification History:                                                 FLDMOD1.413    
CLL                                                                        FLDMOD1.414    
CLL  Programming standard: UM Doc Paper 3, version 1 (15/1/90)             FLDMOD1.415    
CLL                                                                        FLDMOD1.416    
CLL  Project task: ...                                                     FLDMOD1.417    
CLL                                                                        FLDMOD1.418    
CLL  External documentation: On-line UM document ??? - ??????????          FLDMOD1.419    
CLL                                                                        FLDMOD1.420    
CLL  -------------------------------------------------------------------   FLDMOD1.421    
C*L  Interface and arguments: ------------------------------------------   FLDMOD1.422    
C                                                                          FLDMOD1.423    

      SUBROUTINE FIELDS(PP_FIXHD,LEN_FIXHD,LENBUF,LEN_FIELD,                1,18FLDMOD1.424    
     &                  LOOKUP,ROOKUP,LEN1_LOOKUP,LEN2_LOOKUP,NENT,        FLDMOD1.425    
     &                  STIME_MOD,ETIME_MOD,NFIELDS_MOD,                   FLDMOD1.426    
     &                                        MTYP_MOD,MLEVS_MOD,AMULT,    FLDMOD1.427    
     &                  STIME_SEL,ETIME_SEL,NFIELDS_SEL,                   FLDMOD1.428    
     &                                        MTYP_SEL,MLEVS_SEL,          FLDMOD1.429    
     &                  STIME_REJ,ETIME_REJ,NFIELDS_REJ,                   FLDMOD1.430    
     &                                        MTYP_REJ,MLEVS_REJ,          FLDMOD1.431    
     &                  STIME_THI,ETIME_THI,NFIELDS_THI,                   FLDMOD1.432    
     &                      MTYP_THI,MLEVS_THI,IXXSTEP_THI,IYYSTEP_THI,    FLDMOD1.433    
     &                  MODIFY,SELECT,REJECT,THIN,OUTPUT_PACK_TYPE,        FLDMOD1.434    
     &                  WIND_10M,WIND_10M_OROG,WIND_10M_SCALE,             FLDMOD1.435    
     &                                                   PPUNIT_OROG,      FLDMOD1.436    
     &                  PPUNIT1,PPUNIT2,ICODE,CMESSAGE)                    FLDMOD1.437    
      IMPLICIT NONE                                                        FLDMOD1.438    
      EXTERNAL FFREAD,IOERROR,SETPOS,FLDOUT,getpos                         FLDMOD1.439    
CLL  Stash variables                                                       FLDMOD1.440    
      INTEGER                                                              FLDMOD1.441    
     &      LEN1_LOOKUP                                                    FLDMOD1.442    
     &,     LEN2_LOOKUP                                                    FLDMOD1.443    
     &,     LENBUF                                                         FLDMOD1.444    
     &,     LEN_FIELD                                                      FLDMOD1.445    
     &,     STIME_MOD                                                      FLDMOD1.446    
     &,     ETIME_MOD                                                      FLDMOD1.447    
     &,     NFIELDS_MOD                                                    FLDMOD1.448    
     &,     MTYP_MOD(NFIELDS_mod)                                          FLDMOD1.449    
     &,     MLEVS_MOD(NFIELDS_mod)                                         FLDMOD1.450    
     &,     STIME_SEL                                                      FLDMOD1.451    
     &,     ETIME_SEL                                                      FLDMOD1.452    
     &,     NFIELDS_SEL                                                    FLDMOD1.453    
     &,     MTYP_SEL(NFIELDS_sel)                                          FLDMOD1.454    
     &,     MLEVS_SEL(NFIELDS_sel)                                         FLDMOD1.455    
     &,     STIME_REJ                                                      FLDMOD1.456    
     &,     ETIME_REJ                                                      FLDMOD1.457    
     &,     NFIELDS_REJ                                                    FLDMOD1.458    
     &,     MTYP_REJ(NFIELDS_rej)                                          FLDMOD1.459    
     &,     MLEVS_REJ(NFIELDS_rej)                                         FLDMOD1.460    
     &,     PPUNIT_OROG                                                    FLDMOD1.461    
     &,     STIME_THI                                                      FLDMOD1.462    
     &,     ETIME_THI                                                      FLDMOD1.463    
     &,     NFIELDS_THI                                                    FLDMOD1.464    
     &,     MTYP_THI(NFIELDS_THI)                                          FLDMOD1.465    
     &,     MLEVS_THI(NFIELDS_THI)                                         FLDMOD1.466    
     &,     IXXSTEP_THI(NFIELDS_THI)                                       FLDMOD1.467    
     &,     IYYSTEP_THI(NFIELDS_THI)                                       FLDMOD1.468    
                                                                           FLDMOD1.469    
      REAL                                                                 FLDMOD1.470    
     &      AMULT(NFIELDS_mod)                                             FLDMOD1.471    
     &,     WIND_10M_OROG                                                  FLDMOD1.472    
     &,     WIND_10M_SCALE                                                 FLDMOD1.473    
                                                                           FLDMOD1.474    
      INTEGER                                                              FLDMOD1.475    
     &      LOOKUP(LEN1_LOOKUP,LEN2_LOOKUP),                               FLDMOD1.476    
     &      LOOKNEW(LEN1_LOOKUP,LEN2_LOOKUP),                              FLDMOD1.477    
     &      BUFOUT(LENBUF)                                                 FLDMOD1.478    
                                                                           FLDMOD1.479    
      CHARACTER CMESSAGE*(*)                                               FLDMOD1.480    
      CHARACTER OROGFILE*80                                                FLDMOD1.481    
      CHARACTER OUTPUT_PACK_TYPE*6                                         FLDMOD1.482    
      LOGICAL LAST                !IN   indicates last record process      FLDMOD1.483    
      LOGICAL                                                              FLDMOD1.484    
     &      MODIFY                                                         FLDMOD1.485    
     &,     REJECT                                                         FLDMOD1.486    
     &,     SELECT                                                         FLDMOD1.487    
     &,     WIND_10M                                                       FLDMOD1.488    
     &,     THIN                                                           FLDMOD1.489    
     &,     THIN_ALL                                                       FLDMOD1.490    
                                                                           FLDMOD1.491    
      INTEGER                                                              FLDMOD1.492    
     &     LEN_FIXHD                                                       FLDMOD1.493    
     &    ,PP_FIXHD(LEN_FIXHD)                                             FLDMOD1.494    
     &    ,ICODE                                                           FLDMOD1.495    
     &    ,PPUNIT1                                                         FLDMOD1.496    
     &    ,PPUNIT2                                                         FLDMOD1.497    
     &    ,DATA_ADDR              !    start address of data               FLDMOD1.498    
     &    ,IEXTRA(10)             !IN  Used within FFREAD                  FLDMOD1.499    
     &    ,IER                    !IN  error RETURN CODE from conversion   FLDMOD1.500    
     &    ,ILABEL(45)             !IOUT  holds integet part of lookup      FLDMOD1.501    
     &    ,NENT                   !IN  NO. ENTRIES IN OLD LOOKUP           FLDMOD1.502    
     &    ,ILABEL_OROG(45)                                                 FLDMOD1.503    
      REAL                                                                 FLDMOD1.504    
     &     ROOKUP(LEN1_LOOKUP,LEN2_LOOKUP)                                 FLDMOD1.505    
     &    ,ROOKNEW(LEN1_LOOKUP,LEN2_LOOKUP)                                FLDMOD1.506    
     &    ,RLABEL(19)             !OUT holds real part of LOOKUP           FLDMOD1.507    
     &    ,FIELD(LEN_FIELD)                                                FLDMOD1.508    
     &    ,RLABEL_OROG(19)                                                 FLDMOD1.509    
     &    ,MODEL_OROG(LENBUF)                                              FLDMOD1.510    
C                                                                          FLDMOD1.511    
                                                                           FLDMOD1.512    
      LOGICAL                                                              FLDMOD1.513    
     &    PACKING                                                          FLDMOD1.514    
     &,   READ                                                             FLDMOD1.515    
     &,   CONVERT                                                          FLDMOD1.516    
                                                                           FLDMOD1.517    
      INTEGER                                                              FLDMOD1.518    
     &     I                      ! local counter                          FLDMOD1.519    
     &    ,J                      ! local counter                          FLDMOD1.520    
     &    ,K                      ! local counter                          FLDMOD1.521    
     &    ,IX                     !                                        FLDMOD1.522    
     &    ,IL                     !                                        FLDMOD1.523    
     &    ,BL                     !                                        FLDMOD1.524    
     &    ,TL                     !                                        FLDMOD1.525    
     &    ,IWL                    !                                        FLDMOD1.526    
     &    ,NLEV                   !                                        FLDMOD1.527    
     &    ,IWA                    !                                        FLDMOD1.528    
     &    ,IWB                    !                                        FLDMOD1.529    
     &    ,IENT                   !                                        FLDMOD1.530    
     &    ,IPROJ                  !                                        FLDMOD1.531    
     &    ,FCT                    !                                        FLDMOD1.532    
     &    ,ITYPE                  !                                        FLDMOD1.533    
     &    ,LEVEL                  !                                        FLDMOD1.534    
     &    ,IDIM                   !                                        FLDMOD1.535    
     &    ,LEN_LOOKUP             !                                        FLDMOD1.536    
     &    ,LEN_IO                 !                                        FLDMOD1.537    
     &    ,LEN_BUF_WORDS          !                                        FLDMOD1.538    
     &    ,NUM_WORDS              !                                        FLDMOD1.539    
     &    ,PACK_CODE                                                       FLDMOD1.540    
     &    ,IXX                    ! X dimension for THIN_FIELD             FLDMOD1.541    
     &    ,IYY                    ! Y dimension for THIN_FIELD             FLDMOD1.542    
     &    ,IERR                   ! Error return from SETPOS               FLDMOD1.543    
      REAL                                                                 FLDMOD1.544    
     &     A_IO                   !                                        FLDMOD1.545    
                                                                           FLDMOD1.546    
      CHARACTER                                                            FLDMOD1.547    
     &     PACK_TYPE(5)*6                                                  FLDMOD1.548    
     &    ,INPUT_PACK_TYPE*6                                               FLDMOD1.549    
                                                                           FLDMOD1.550    
*CALL CLOOKADD                                                             FLDMOD1.551    
                                                                           FLDMOD1.552    
      PACK_TYPE(1)='NONE  '                                                FLDMOD1.553    
      PACK_TYPE(2)='WGDOS '                                                FLDMOD1.554    
      PACK_TYPE(3)='CRAY32'                                                FLDMOD1.555    
      PACK_TYPE(4)='GRIB  '                                                FLDMOD1.556    
      PACK_TYPE(5)='      '                                                FLDMOD1.557    
                                                                           FLDMOD1.558    
C                                                                          FLDMOD1.559    
C    REMEMBER THAT BUFFER OUT STARTS AT ADDRESS 0 THUS LOOKUP GOES         FLDMOD1.560    
C    FROM 0 to 262143 ie THE NEXT ADDRESS SHOULD BE IWA=262144 to          FLDMOD1.561    
C    IWA=325119 then IWA=325120 to 388095 then 388096 etc                  FLDMOD1.562    
C                                                                          FLDMOD1.563    
                                                                           FLDMOD1.564    
      LEN_LOOKUP=LEN1_LOOKUP*LEN2_LOOKUP                                   FLDMOD1.565    
                                                                           FLDMOD1.566    
C----------------------- Section 4 ----------------------------------      FLDMOD1.567    
C      Write to the PP file . First read in the  LOOKUP table.             FLDMOD1.568    
C--------------------------------------------------------------------      FLDMOD1.569    
                                                                           FLDMOD1.570    
cx    IX=UNIT(PPUNIT2)                                                     FLDMOD1.571    
      IWA=0                                                                FLDMOD1.572    
      CALL SETPOS(PPUNIT2,IWA,IERR)                                        FLDMOD1.573    
cd    CALL GETPOS(PPUNIT2,IWB)                                             FLDMOD1.574    
cd    WRITE(6,*)' ppunit2 fixhd ',iwb                                      GIE0F403.211    
      CALL BUFFIN(PPUNIT2,PP_FIXHD,LEN_FIXHD,LEN_IO,A_IO)                  FLDMOD1.576    
      IF(A_IO.NE.-1.0.OR.LEN_IO.NE.LEN_FIXHD) THEN                         FLDMOD1.577    
        CALL IOERROR('Buffer in fixed length header',A_IO,LEN_IO,          FLDMOD1.578    
     &                                               LEN_FIXHD)            FLDMOD1.579    
        ICODE=1                                                            FLDMOD1.580    
        CMESSAGE='REPLACE: I/O error'                                      FLDMOD1.581    
        RETURN                                                             FLDMOD1.582    
      ENDIF                                                                FLDMOD1.583    
      IWL=PP_FIXHD(150)-1                                                  FLDMOD1.584    
      IWA=IWL                                                              FLDMOD1.585    
      DATA_ADDR = PP_FIXHD(160)                                            FLDMOD1.586    
                                                                           FLDMOD1.587    
      CALL SETPOS(PPUNIT2,IWA,IERR)                                        FLDMOD1.588    
cd    CALL GETPOS(PPUNIT2,IWB)                                             FLDMOD1.589    
cd    WRITE(6,*)' ppunit2 looknew ',iwb                                    GIE0F403.212    
      CALL BUFFIN(PPUNIT2,LOOKNEW,LEN_LOOKUP,LEN_IO,A_IO)                  FLDMOD1.591    
      IF(A_IO.NE.-1.0.OR.LEN_IO.NE.(PP_FIXHD(152)*PP_FIXHD(151)))THEN      FLDMOD1.592    
        CALL IOERROR('Buffer in Lookup table   ',A_IO,LEN_IO,              FLDMOD1.593    
     &                                    PP_FIXHD(152)*PP_FIXHD(151))     FLDMOD1.594    
        ICODE=1                                                            FLDMOD1.595    
        CMESSAGE='Derived: I/O error in reading LOOKUP'                    FLDMOD1.596    
        RETURN                                                             FLDMOD1.597    
      ENDIF                                                                FLDMOD1.598    
                                                                           FLDMOD1.599    
      DO I=1,10                                                            FLDMOD1.600    
        IEXTRA(I)=0                                                        FLDMOD1.601    
      ENDDO                                                                FLDMOD1.602    
                                                                           FLDMOD1.603    
cd    WRITE(6,*)'start of looknew',iwl                                     GIE0F403.213    
C     IF 10M WINDS TO BE FIXED GET MODEL OROGRAPHY FIELD FROM PP0          FLDMOD1.605    
      IF(WIND_10M) THEN                                                    FLDMOD1.606    
        write(6,*) 'open unit',ppunit_orog                                 FLDMOD1.607    
        CALL GET_FILE(PPUNIT_OROG,OROGFILE,80,ICODE)                       FLDMOD1.608    
        CALL FILE_OPEN(PPUNIT_OROG,OROGFILE,80,0,1,ICODE)                  FLDMOD1.609    
        IEXTRA(1) = 0                                                      FLDMOD1.610    
        IDIM  = LENBUF                                                     FLDMOD1.611    
        FCT   = 0                                                          FLDMOD1.612    
        IPROJ = LOOKUP(31,1)                                               FLDMOD1.613    
        ITYPE = 73                                                         FLDMOD1.614    
        LEVEL = 9999                                                       FLDMOD1.615    
        write(6,*) ' read orography'                                       FLDMOD1.616    
        CALL FFREAD(IPROJ,FCT,ITYPE,LEVEL,PPUNIT_OROG,MODEL_OROG,IDIM,     FLDMOD1.617    
     1               ILABEL_OROG,RLABEL_OROG,IEXTRA,ICODE,CMESSAGE)        FLDMOD1.618    
        write(6,*) 'close unit',ppunit_orog                                FLDMOD1.619    
        CLOSE(PPUNIT_OROG)                                                 FLDMOD1.620    
      ENDIF                                                                FLDMOD1.621    
c                                                                          FLDMOD1.622    
c     loop through lookup read/write all fields                            FLDMOD1.623    
      IEXTRA(1) = 1      !DO NOT UNPACK                                    FLDMOD1.624    
      DO IENT=1,NENT                                                       FLDMOD1.625    
        READ=.TRUE.                                                        FLDMOD1.626    
        CONVERT=.FALSE.                                                    FLDMOD1.627    
        IDIM=LENBUF                                                        FLDMOD1.628    
        FCT=LOOKUP(14,IENT)                                                FLDMOD1.629    
        IPROJ=LOOKUP(31,IENT)                                              FLDMOD1.630    
        ITYPE=LOOKUP(32,IENT)                                              FLDMOD1.631    
        LEVEL=LOOKUP(33,IENT)                                              FLDMOD1.632    
        PACK_CODE=MOD(LOOKUP(LBPACK,IENT),10)                              FLDMOD1.633    
        INPUT_PACK_TYPE=PACK_TYPE(PACK_CODE+1)                             FLDMOD1.634    
        IF(INPUT_PACK_TYPE.NE.OUTPUT_PACK_TYPE.AND.                        FLDMOD1.635    
     +          PACK_CODE.GT.0) THEN ! leave unpacked data unpacked        FLDMOD1.636    
          CONVERT=.TRUE.                                                   FLDMOD1.637    
        ENDIF                                                              FLDMOD1.638    
       WRITE(6,*)' pack code=',pack_code                                   GIE0F403.214    
       WRITE(6,*)input_pack_type,output_pack_type,convert                  GIE0F403.215    
        IF(SELECT) THEN                                                    FLDMOD1.641    
          READ=.FALSE.                                                     FLDMOD1.642    
          IF(FCT.GE.STIME_SEL.AND.FCT.LE.ETIME_SEL) THEN                   FLDMOD1.643    
            DO J=1,NFIELDS_SEL                                             FLDMOD1.644    
              IF(ITYPE.EQ.MTYP_SEL(J).AND.LEVEL.EQ.MLEVS_SEL(J)) THEN      FLDMOD1.645    
                READ=.TRUE.                                                FLDMOD1.646    
              ENDIF                                                        FLDMOD1.647    
            ENDDO                                                          FLDMOD1.648    
          ENDIF                                                            FLDMOD1.649    
        ENDIF                                                              FLDMOD1.650    
        IF(REJECT) THEN                                                    FLDMOD1.651    
          READ=.TRUE.                                                      FLDMOD1.652    
          IF(FCT.GE.STIME_REJ.AND.FCT.LE.ETIME_REJ) THEN                   FLDMOD1.653    
            DO J=1,NFIELDS_REJ                                             FLDMOD1.654    
              IF(ITYPE.EQ.MTYP_REJ(J).AND.LEVEL.EQ.MLEVS_REJ(J)) THEN      FLDMOD1.655    
                READ=.FALSE.                                               FLDMOD1.656    
              ENDIF                                                        FLDMOD1.657    
            ENDDO                                                          FLDMOD1.658    
          ENDIF                                                            FLDMOD1.659    
        ENDIF                                                              FLDMOD1.660    
                                                                           FLDMOD1.661    
        WRITE(7,*) ' READ=',READ,IPROJ,FCT,ITYPE,LEVEL,PPUNIT1             FLDMOD1.662    
        IF(READ) THEN                                                      FLDMOD1.663    
          CALL FFREAD(IPROJ,FCT,ITYPE,LEVEL,PPUNIT1,BUFOUT,IDIM,           FLDMOD1.664    
     1                ILABEL,RLABEL,IEXTRA,ICODE,CMESSAGE)                 FLDMOD1.665    
          NUM_WORDS = ILABEL(15)                                           FLDMOD1.666    
          LEN_BUF_WORDS = ILABEL(30)                                       FLDMOD1.667    
                                                                           FLDMOD1.668    
          IF(STIME_THI.EQ.-9999) THEN                                      FLDMOD1.669    
            THIN_ALL=.TRUE.                                                FLDMOD1.670    
          ELSE                                                             FLDMOD1.671    
            THIN_ALL=.FALSE.                                               FLDMOD1.672    
          ENDIF                                                            FLDMOD1.673    
          IF(THIN.OR.THIN_ALL) THEN                                        FLDMOD1.674    
            IF((FCT.GE.STIME_THI.AND.FCT.LE.ETIME_THI)                     FLDMOD1.675    
     &          .OR.THIN_ALL) THEN                                         FLDMOD1.676    
              DO J=1,NFIELDS_THI                                           FLDMOD1.677    
                IF((ITYPE.EQ.MTYP_THI(J).AND.LEVEL.EQ.MLEVS_THI(J))        FLDMOD1.678    
     &              .OR.THIN_ALL) THEN                                     FLDMOD1.679    
                  IYY = ILABEL(18)                                         FLDMOD1.680    
                  IXX = ILABEL(19)                                         FLDMOD1.681    
                  WRITE(7,*) ' THINNING FIELD,',ITYPE,LEVEL,FCT,           FLDMOD1.682    
     1                                     IXXSTEP_THI(J),IYYSTEP_THI(J)   FLDMOD1.683    
                  WRITE(6,*) ' THINNING FIELD,',ITYPE,LEVEL,FCT,           FLDMOD1.684    
     1                                     IXXSTEP_THI(J),IYYSTEP_THI(J)   FLDMOD1.685    
                  CALL THIN_FIELD(BUFOUT,BUFOUT,NUM_WORDS,IXX,IYY,         FLDMOD1.686    
     1                             IXXSTEP_THI(J),IYYSTEP_THI(J),          FLDMOD1.687    
     2                             IDIM,PACK_CODE,RLABEL(18))              FLDMOD1.688    
                  LEN_BUF_WORDS =((NUM_WORDS+511)/512)*512                 FLDMOD1.689    
                  ILABEL(15) = NUM_WORDS                                   FLDMOD1.690    
                  ILABEL(30) = LEN_BUF_WORDS                               FLDMOD1.691    
                  ILABEL(18) = IYY                                         FLDMOD1.692    
                  ILABEL(19) = IXX                                         FLDMOD1.693    
                  rlabel(15) = rlabel(15) * IYYSTEP_THI(J)                 FLDMOD1.694    
                  rlabel(17) = rlabel(17) * IXXSTEP_THI(J)                 FLDMOD1.695    
                ENDIF                                                      FLDMOD1.696    
              ENDDO                                                        FLDMOD1.697    
            ENDIF                                                          FLDMOD1.698    
          ENDIF                                                            FLDMOD1.699    
                                                                           FLDMOD1.700    
          IF(MODIFY) THEN                                                  FLDMOD1.701    
            IF(FCT.GE.STIME_MOD.AND.FCT.LE.ETIME_MOD) THEN                 FLDMOD1.702    
              DO J=1,NFIELDS_MOD                                           FLDMOD1.703    
                IF(ITYPE.EQ.MTYP_MOD(J).AND.LEVEL.EQ.MLEVS_MOD(J)) THEN    FLDMOD1.704    
                  WRITE(7,*) ' SCALING FIELD,',ITYPE,LEVEL,FCT,AMULT(J)    FLDMOD1.705    
                  WRITE(6,*) ' SCALING FIELD,',ITYPE,LEVEL,FCT,AMULT(J)    FLDMOD1.706    
                  CALL SCALE_FIELD(BUFOUT,BUFOUT,LEN_FIELD,AMULT(J),       FLDMOD1.707    
     1                             IDIM,PACK_CODE,RLABEL(18))              FLDMOD1.708    
                  NUM_WORDS = (IDIM+1)/2                                   FLDMOD1.709    
                  LEN_BUF_WORDS =((NUM_WORDS+511)/512)*512                 FLDMOD1.710    
                  ILABEL(15) = NUM_WORDS                                   FLDMOD1.711    
                  ILABEL(30) = LEN_BUF_WORDS                               FLDMOD1.712    
                ENDIF                                                      FLDMOD1.713    
              ENDDO                                                        FLDMOD1.714    
            ENDIF                                                          FLDMOD1.715    
          ENDIF                                                            FLDMOD1.716    
          IF(WIND_10M) THEN                                                FLDMOD1.717    
            IF(ITYPE.EQ.75.OR.ITYPE.EQ.76) THEN                            FLDMOD1.718    
              write(6,*) 'call wind fix'                                   FLDMOD1.719    
              CALL WIND_10M_FIX(BUFOUT,BUFOUT,NUM_WORDS,                   FLDMOD1.720    
     1                          FCT,ITYPE,LEVEL,IPROJ,PPUNIT1,             FLDMOD1.721    
     2                          WIND_10M_SCALE,WIND_10M_OROG,              FLDMOD1.722    
     3                          MODEL_OROG,ILABEL_OROG,RLABEL_OROG,        FLDMOD1.723    
     4                          IDIM,PACK_CODE,RLABEL(18))                 FLDMOD1.724    
              LEN_BUF_WORDS =((NUM_WORDS+511)/512)*512                     FLDMOD1.725    
              ILABEL(15) = NUM_WORDS                                       FLDMOD1.726    
              ILABEL(30) = LEN_BUF_WORDS                                   FLDMOD1.727    
            ENDIF                                                          FLDMOD1.728    
          ENDIF                                                            FLDMOD1.729    
                                                                           FLDMOD1.730    
          IF(CONVERT) THEN                                                 FLDMOD1.731    
            CALL CONV_PACK(ILABEL,RLABEL,PACK_CODE,                        FLDMOD1.732    
     1                     INPUT_PACK_TYPE,OUTPUT_PACK_TYPE,               FLDMOD1.733    
     2                     BUFOUT,IDIM,NUM_WORDS,                          FLDMOD1.734    
     3                     PP_FIXHD,ICODE,CMESSAGE)                        FLDMOD1.735    
            LEN_BUF_WORDS =((NUM_WORDS+511)/512)*512                       FLDMOD1.736    
            ILABEL(15) = NUM_WORDS                                         FLDMOD1.737    
            ILABEL(30) = LEN_BUF_WORDS                                     FLDMOD1.738    
          ENDIF                                                            FLDMOD1.739    
                                                                           FLDMOD1.740    
                                                                           FLDMOD1.741    
c         WRITE(6,*)'fldout writing num_words',num_words,data_addr         GIE0F403.216    
          CALL FLDOUT(ICODE,CMESSAGE,BUFOUT,LENBUF,                        FLDMOD1.743    
     1      LEN_BUF_WORDS,NUM_WORDS,                                       FLDMOD1.744    
     2      PPUNIT2,LEN1_LOOKUP,LEN2_LOOKUP,LOOKNEW,LOOKNEW,               FLDMOD1.745    
     3      ILABEL,RLABEL,IWL,DATA_ADDR)                                   FLDMOD1.746    
                                                                           FLDMOD1.747    
C----------------------- Section 5 ----------------------------------      FLDMOD1.748    
C          Output lookup table                                             FLDMOD1.749    
C--------------------------------------------------------------------      FLDMOD1.750    
                                                                           FLDMOD1.751    
          IX=UNIT(PPUNIT2)                                                 FLDMOD1.752    
          IWA=IWL                                                          FLDMOD1.753    
cd        WRITE(6,*)' write looknew to ',iwa                               GIE0F403.217    
          CALL SETPOS(PPUNIT2,IWA,IERR)                                    FLDMOD1.755    
cd    CALL GETPOS(PPUNIT2,IWB)                                             FLDMOD1.756    
cd    WRITE(6,*)' ppunit2 looknew ',iwb                                    GIE0F403.218    
          CALL BUFFOUT(PPUNIT2,LOOKNEW,LEN_LOOKUP,LEN_IO,A_IO)             FLDMOD1.758    
cx        BUFFER OUT (PPUNIT2,1)(LOOKNEW(1,1),LOOKNEW(LEN1_LOOKUP,         FLDMOD1.759    
cx   *    LEN2_LOOKUP))                                                    FLDMOD1.760    
cx        A_IO=UNIT(PPUNIT2)                                               FLDMOD1.761    
cx        LEN_IO=LENGTH(PPUNIT2)                                           FLDMOD1.762    
C                                                                          FLDMOD1.763    
          IF(A_IO.NE.-1.0.OR.LEN_IO.NE.                                    FLDMOD1.764    
     *                              (PP_FIXHD(152)*PP_FIXHD(151)))THEN     FLDMOD1.765    
            CALL IOERROR('Buffer in fixed length header',A_IO,LEN_IO,      FLDMOD1.766    
     &                    PP_FIXHD(151)*PP_FIXHD(152))                     FLDMOD1.767    
            ICODE=1                                                        FLDMOD1.768    
            CMESSAGE='Derived: I/O error in writing LOOKUP'                FLDMOD1.769    
            RETURN                                                         FLDMOD1.770    
          ENDIF                                                            FLDMOD1.771    
        ENDIF                                                              FLDMOD1.772    
      ENDDO                                                                FLDMOD1.773    
                                                                           FLDMOD1.774    
c     DO I=1,NENT+1                                                        FLDMOD1.775    
c     ENDDO                                                                FLDMOD1.776    
                                                                           FLDMOD1.777    
 9999 CONTINUE                                                             FLDMOD1.778    
      RETURN                                                               FLDMOD1.779    
      END                                                                  FLDMOD1.780    
                                                                           FLDMOD1.781    

      SUBROUTINE THIN_FIELD(PDATA,RDATA,PDATA_LEN,IXX,IYY,                  1,2FLDMOD1.782    
     &                      IXXSTEP,IYYSTEP,IDIM,PACK_CODE,AMDI)           FLDMOD1.783    
!                                                                          FLDMOD1.784    
!    Subroutine to unpack a field, thin, then repack data.                 FLDMOD1.785    
!                                                                          FLDMOD1.786    
!    Author V Blackman      Date; 12 JAN 95                                FLDMOD1.787    
!                                                                          FLDMOD1.788    
!                                                                          FLDMOD1.789    
      IMPLICIT NONE                                                        FLDMOD1.790    
      INTEGER IDIM,PDATA_LEN,PACK_CODE,IXXSTEP,IYYSTEP                     FLDMOD1.791    
      INTEGER PDATA(IDIM),IXX,IYY,ISC,LWORD                                FLDMOD1.792    
      INTEGER i,j,k,kk,ix1,iy1                                             FLDMOD1.793    
      integer countx,county                                                FLDMOD1.794    
      REAL RDATA(IDIM),FIELD(IDIM),AMDI                                    FLDMOD1.795    
      LOGICAL OPACK                                                        FLDMOD1.796    
      DATA LWORD/64/                                                       FLDMOD1.797    
                                                                           FLDMOD1.798    
      IF(PACK_CODE.EQ.1) THEN                                              FLDMOD1.799    
        OPACK=.FALSE.                                                      FLDMOD1.800    
        CALL COEX(FIELD,IDIM,PDATA,IDIM,IXX,IYY,PDATA_LEN,                 FLDMOD1.801    
     &            ISC,OPACK,AMDI,LWORD)                                    FLDMOD1.802    
                                                                           FLDMOD1.803    
! If IXX and IYY are not decreased by 1 then GRDSET ( a PP routine)        FLDMOD1.804    
! will fail and give the message 'BAD GRID DEFINITION'.                    FLDMOD1.805    
! Unfortunately the same failure occurs if IXX and IYY are decreased       FLDMOD1.806    
! when a step size of 1 is specified so IXX and IYY will only be           FLDMOD1.807    
! decreased for step sizes > 1 (in case anyone uses a step size of 1       FLDMOD1.808    
! instead of using SELECT in the namelist)                                 FLDMOD1.809    
                                                                           FLDMOD1.810    
        if(ixxstep.gt.1) then                                              FLDMOD1.811    
          IX1 = IXX - 1                                                    FLDMOD1.812    
        else                                                               FLDMOD1.813    
          IX1 = IXX                                                        FLDMOD1.814    
        endif                                                              FLDMOD1.815    
        if(iyystep.gt.1) then                                              FLDMOD1.816    
          IY1 = IYY - 1                                                    FLDMOD1.817    
        else                                                               FLDMOD1.818    
          IY1 = IYY                                                        FLDMOD1.819    
        endif                                                              FLDMOD1.820    
                                                                           FLDMOD1.821    
        county = 0                                                         FLDMOD1.822    
                                                                           FLDMOD1.823    
        K = 1                                                              FLDMOD1.824    
        DO J=1,IY1,IYYSTEP                                                 FLDMOD1.825    
          countx = 0                                                       FLDMOD1.826    
          DO I=1,IX1,IXXSTEP                                               FLDMOD1.827    
            kk = (j-1) * ixx + i                                           FLDMOD1.828    
            FIELD(K) = FIELD(KK)                                           FLDMOD1.829    
            K = K + 1                                                      FLDMOD1.830    
            countx = countx + 1                                            FLDMOD1.831    
          END DO                                                           FLDMOD1.832    
          county = county + 1                                              FLDMOD1.833    
        END DO                                                             FLDMOD1.834    
                                                                           FLDMOD1.835    
        IXX = (IX1 + IXXSTEP - 1) / IXXSTEP                                FLDMOD1.836    
        IYY = (IY1 + IYYSTEP - 1) / IYYSTEP                                FLDMOD1.837    
                                                                           FLDMOD1.838    
        OPACK=.TRUE.                                                       FLDMOD1.839    
        CALL COEX(FIELD,IDIM,PDATA,IDIM,IXX,IYY,PDATA_LEN,                 FLDMOD1.840    
     &            ISC,OPACK,AMDI,LWORD)                                    FLDMOD1.841    
                                                                           FLDMOD1.842    
      ELSE IF(PACK_CODE.EQ.0) THEN                                         FLDMOD1.843    
                                                                           FLDMOD1.844    
        if(ixxstep.gt.1) then                                              FLDMOD1.845    
          IX1 = IXX - 1                                                    FLDMOD1.846    
        else                                                               FLDMOD1.847    
          IX1 = IXX                                                        FLDMOD1.848    
        endif                                                              FLDMOD1.849    
        if(iyystep.gt.1) then                                              FLDMOD1.850    
          IY1 = IYY - 1                                                    FLDMOD1.851    
        else                                                               FLDMOD1.852    
          IY1 = IYY                                                        FLDMOD1.853    
        endif                                                              FLDMOD1.854    
                                                                           FLDMOD1.855    
        county = 0                                                         FLDMOD1.856    
                                                                           FLDMOD1.857    
        K = 1                                                              FLDMOD1.858    
        DO J=1,IY1,IYYSTEP                                                 FLDMOD1.859    
          countx = 0                                                       FLDMOD1.860    
          DO I=1,IX1,IXXSTEP                                               FLDMOD1.861    
            kk = (j-1) * ixx + i                                           FLDMOD1.862    
            RDATA(K) = RDATA(kk)                                           FLDMOD1.863    
            K = K + 1                                                      FLDMOD1.864    
            countx = countx + 1                                            FLDMOD1.865    
          END DO                                                           FLDMOD1.866    
          county = county + 1                                              FLDMOD1.867    
        END DO                                                             FLDMOD1.868    
                                                                           FLDMOD1.869    
        IXX = (IX1 + IXXSTEP - 1) / IXXSTEP                                FLDMOD1.870    
        IYY = (IY1 + IYYSTEP - 1) / IYYSTEP                                FLDMOD1.871    
        PDATA_LEN = IXX * IYY                                              FLDMOD1.872    
                                                                           FLDMOD1.873    
      ELSE                                                                 FLDMOD1.874    
        WRITE(6,*)pack_code,' not yet coded'                               GIE0F403.219    
      END IF                                                               FLDMOD1.876    
                                                                           FLDMOD1.877    
      RETURN                                                               FLDMOD1.878    
      END                                                                  FLDMOD1.879    
                                                                           FLDMOD1.880    
CLL  SUBROUTINE FLDOUT-------------------------------------------          FLDMOD1.881    
CLL                                                                        FLDMOD1.882    
CLL  REPLACES THE OUTPUT FROM STASH EITHER ON TO A PP FILE OR              FLDMOD1.883    
CLL  BACK TO THE MAIN ARRAY D1                                             FLDMOD1.884    
CLL                                                                        FLDMOD1.885    
CLL  PROGRAMMING STANDARD: UNIFIED MODEL DOCUMENTATION PAPER NO. 4,        FLDMOD1.886    
CLL  VERSION 1, DATED 12/09/89                                             FLDMOD1.887    
CLL                                                                        FLDMOD1.888    
CLL  SYSTEM TASK: CONTROL PART OF C4                                       FLDMOD1.889    
CLL                                                                        FLDMOD1.890    
CLL  PURPOSE:   TO PROCESS DIAGNOSTICS CONTROLLED BY STASH                 FLDMOD1.891    
CLL  DOCUMENTATION:        ???                                             FLDMOD1.892    
CLL                                                                        FLDMOD1.893    
CLL                                                                        FLDMOD1.894    
CLLEND-------------------------------------------------------------        FLDMOD1.895    
                                                                           FLDMOD1.896    
C                                                                          FLDMOD1.897    
C*L  ARGUMENTS:---------------------------------------------------         FLDMOD1.898    

      SUBROUTINE FLDOUT                                                     1,3FLDMOD1.899    
     *          (ICODE,CMESSAGE,BUFOUT,LENBUF,LEN_BUF_WORDS,NUM_WORDS,     FLDMOD1.900    
     1           UNITPP,LEN1_LOOKUP,PP_LEN2_LOOKUP,IPPLOOK,RPPLOOK,        FLDMOD1.901    
     2           ILABEL,RLABEL,IWL,DATA_ADDR)                              FLDMOD1.902    
      IMPLICIT NONE                                                        FLDMOD1.903    
                                                                           FLDMOD1.904    
      CHARACTER*(*) CMESSAGE !OUT OUT MESSAGE FROM ROUTINE                 FLDMOD1.905    
C                                                                          FLDMOD1.906    
                                                                           FLDMOD1.907    
      INTEGER                                                              FLDMOD1.908    
     *  ICODE              !IN    RETURN CODE FROM ROUTINE                 FLDMOD1.909    
     *, LEN1_LOOKUP        !IN    FIRST DIMENSION OF LOOKUP TABLE          FLDMOD1.910    
     *, PP_LEN2_LOOKUP     !IN    SECND DIMENSION OF LOOKUP TABLE          FLDMOD1.911    
     *, LENBUF             !IN     LENGTH OFF PP BUFFER                    FLDMOD1.912    
     *, UNITPP             !IN     OUTPUT PP UNIT NUMBER                   FLDMOD1.913    
     *, LEN_BUF_WORDS      !IN                                             FLDMOD1.914    
     *, NUM_WORDS          !IN                                             FLDMOD1.915    
C                                                                          FLDMOD1.916    
      INTEGER                                                              FLDMOD1.917    
     *  JJ            !IN    ITEM NUMBER                                   FLDMOD1.918    
      INTEGER                                                              FLDMOD1.919    
     *  IPPLOOK(LEN1_LOOKUP,PP_LEN2_LOOKUP) !IN INTEGER LOOKUP TABLE       FLDMOD1.920    
     *, ILABEL(45)    ! INTEGER PART OF LOOKUP                             FLDMOD1.921    
     *, IWL           !IN    Address of the PP LOOKUP Table                FLDMOD1.922    
     *, DATA_ADDR     !IN    Address of start of data                      FLDMOD1.923    
C                                                                          FLDMOD1.924    
      REAL                                                                 FLDMOD1.925    
     *  BUFOUT(LENBUF)         !OUTPUT PP BUFFER (ROUNDED UP)              FLDMOD1.926    
     *, RPPLOOK(LEN1_LOOKUP,PP_LEN2_LOOKUP) !IN REAL LOOKUP TABLE          FLDMOD1.927    
     *, RLABEL(19)    ! REAL PART OF LOOKUP                                FLDMOD1.928    
                                                                           FLDMOD1.929    
C*---------------------------------------------------------------------    FLDMOD1.930    
                                                                           FLDMOD1.931    
C*L  WORKSPACE USAGE:-------------------------------------------------     FLDMOD1.932    
C   DEFINE LOCAL WORKSPACE ARRAYS: 1 REAL ARRAY                            FLDMOD1.933    
C   AT FULL FIELD LENGTH                                                   FLDMOD1.934    
C                                                                          FLDMOD1.935    
C*---------------------------------------------------------------------    FLDMOD1.936    
C     EQUIVALENCE(IPPLOOK,RPPLOOK)                                         FLDMOD1.937    
C                                                                          FLDMOD1.938    
C*L EXTERNAL SUBROUTINES CALLED---------------------------------------     FLDMOD1.939    
      EXTERNAL SETPOS                                                      FLDMOD1.940    
C*------------------------------------------------------------------       FLDMOD1.941    
CL  MAXIMUM VECTOR LENGTH ASSUMED IS (ROWS-1) * ROWLENGTH                  FLDMOD1.942    
CL---------------------------------------------------------------------    FLDMOD1.943    
C----------------------------------------------------------------------    FLDMOD1.944    
C    DEFINE LOCAL VARIABLES                                                FLDMOD1.945    
      INTEGER                                                              FLDMOD1.946    
     *  ADDR          !                                                    FLDMOD1.947    
     *, IWA           !     RECORD NUMBER                                  FLDMOD1.948    
     *, IX            !     RETURN VALUE FROM UNIT COMMAND                 FLDMOD1.949    
     &, LEN_IO        !                                                    FLDMOD1.950    
     *, II            !     COUNTER                                        FLDMOD1.951    
     *, I             !     COUNTER                                        FLDMOD1.952    
     &,IERR           ! Error return from SETPOS                           FLDMOD1.953    
                                                                           FLDMOD1.954    
      real                                                                 FLDMOD1.955    
     &  A_IO          !                                                    FLDMOD1.956    
                                                                           FLDMOD1.957    
      INTEGER                                                              FLDMOD1.958    
     *  LRESID        !                                                    FLDMOD1.959    
     *, ICURRLL       !                                                    FLDMOD1.960    
     *, IPAST         !                                                    FLDMOD1.961    
     *, IPROJ         !     M08 PROJECTION NUMBER                          FLDMOD1.962    
                                                                           FLDMOD1.963    
      LOGICAL                                                              FLDMOD1.964    
     *  FIRST              !                                               FLDMOD1.965    
      DATA FIRST/.TRUE./                                                   FLDMOD1.966    
C                                                                          FLDMOD1.967    
C                                                                          FLDMOD1.968    
C    REMEMBER THAT BUFFER OUT STARTS AT ADDRESS 0 THUS IPPLOOK GOES        FLDMOD1.969    
C    FROM 0 to 262143 ie THE NEXT ADDRESS SHOULD BE IWA=262144 to          FLDMOD1.970    
C    IWA=325119 then IWA=325120 to 388095 then 388096 etc                  FLDMOD1.971    
C                                                                          FLDMOD1.972    
      FIRST=.TRUE.                                                         FLDMOD1.973    
                                                                           FLDMOD1.974    
C     WRITE(6,103)  (BUFOUT(II),II=9999,10100)                             FLDMOD1.975    
  103 FORMAT(//,32X,' ARRAY FROM START OF PPOUT  ',//,32(10F8.0/))         FLDMOD1.976    
      LRESID=LEN_BUF_WORDS-NUM_WORDS                                       FLDMOD1.977    
c     WRITE(6,104)  LRESID                                                 FLDMOD1.978    
c 104 FORMAT(' IN PPOUT      LRESID=',I8)                                  FLDMOD1.979    
      DO 2 JJ=NUM_WORDS+1,LRESID                                           FLDMOD1.980    
      BUFOUT(JJ)= 0.0                                                      FLDMOD1.981    
    2 CONTINUE                                                             FLDMOD1.982    
C                                                                          FLDMOD1.983    
      IF(FIRST) THEN                                                       FLDMOD1.984    
        DO 3 JJ=1,PP_LEN2_LOOKUP                                           FLDMOD1.985    
           IF(IPPLOOK(1,JJ).LT.0) THEN  ! Search for last entry            FLDMOD1.986    
             ICURRLL=JJ                                                    FLDMOD1.987    
               IF(JJ.EQ.1) THEN                                            FLDMOD1.988    
                 IWA=((IWL+511)/512)*512+PP_LEN2_LOOKUP*LEN1_LOOKUP        FLDMOD1.989    
                 write(6,*) 'Start data',iwa,data_addr,iwa-1               FLDMOD1.990    
                 IWA=DATA_ADDR                                             FLDMOD1.991    
                 IWA=IWA-1                                                 FLDMOD1.992    
               ELSE                                                        FLDMOD1.993    
C               IWA= IPPLOOK(29,JJ-1)*512+IPPLOOK(30,JJ-1) !ADDR+LGTH      FLDMOD1.994    
                IWA= IPPLOOK(29,JJ-1)+IPPLOOK(30,JJ-1) !ADDR+LGTH          FLDMOD1.995    
               ENDIF                                                       FLDMOD1.996    
             GOTO 4                                                        FLDMOD1.997    
           ENDIF                                                           FLDMOD1.998    
    3   CONTINUE                                                           FLDMOD1.999    
          ICODE=1                                                          FLDMOD1.1000   
          CMESSAGE="FROM PPOUT CANNOT FIND SUITABLE ENTRY IN LOOKUP"       FLDMOD1.1001   
          GOTO 999                                                         FLDMOD1.1002   
    4     CONTINUE                                                         FLDMOD1.1003   
      ELSE                                                                 FLDMOD1.1004   
          IPAST=ICURRLL-1                                                  FLDMOD1.1005   
        WRITE(7,105) IPAST                                                 FLDMOD1.1006   
 105    FORMAT('  FROM PPOUT AND FIRST IS FALSE IPAST=',I8)                FLDMOD1.1007   
C         IWA=IPPLOOK(29,IPAST)*512 + IPPLOOK(30,IPAST) ! ADDR + LENGTH    FLDMOD1.1008   
          IWA=IPPLOOK(29,IPAST) + IPPLOOK(30,IPAST) ! ADDR + LENGTH        FLDMOD1.1009   
        WRITE(7,106) IWA                                                   FLDMOD1.1010   
 106    FORMAT('  FROM PPOUT AND FIRST IS FALSE IWA=',I8)                  FLDMOD1.1011   
      ENDIF                                                                FLDMOD1.1012   
C                                                                          FLDMOD1.1013   
C     update lookup for this field                                         FLDMOD1.1014   
      DO I=1,45                                                            FLDMOD1.1015   
        IPPLOOK(I,ICURRLL) = ILABEL(I)                                     FLDMOD1.1016   
      ENDDO                                                                FLDMOD1.1017   
      DO I=1,19                                                            FLDMOD1.1018   
        RPPLOOK(I+45,ICURRLL) = RLABEL(I)                                  FLDMOD1.1019   
      ENDDO                                                                FLDMOD1.1020   
      IPPLOOK(29,ICURRLL)=IWA                                              FLDMOD1.1021   
      IPPLOOK(30,ICURRLL)=LEN_BUF_WORDS                                    FLDMOD1.1022   
      IPPLOOK(40,ICURRLL)=IWA                                              FLDMOD1.1023   
C                                                                          FLDMOD1.1024   
c     WRITE(6,*)'fldout... len_buf_words,iwa',len_buf_words,iwa            GIE0F403.220    
                                                                           FLDMOD1.1026   
      IX=UNIT(UNITPP)                                                      FLDMOD1.1027   
      CALL SETPOS(UNITPP,IWA,IERR)                                         FLDMOD1.1028   
      CALL BUFFOUT(unitpp,bufout,LEN_buf_words,LEN_IO,A_IO)                FLDMOD1.1029   
cx    BUFFER OUT (UNITPP,1) (BUFOUT(1),BUFOUT(LEN_BUF_WORDS))              FLDMOD1.1030   
      IX=UNIT(UNITPP)                                                      FLDMOD1.1031   
C     WRITE(6,100)  (BUFOUT(II),II=9999,10100)                             FLDMOD1.1032   
C     WRITE(6,101) ((IPPLOOK(II,JJ),II=20,35),JJ=1,50)                     FLDMOD1.1033   
C   3 CONTINUE                                                             FLDMOD1.1034   
  100 FORMAT(//,32X,'   ARRAY BUFOUT AT END OF PPOUT ',//,32(10F8.0/))     FLDMOD1.1035   
  101 FORMAT(//,32X,'   IPPLOOK AT END OF  PPOUT   ',//,32(16I5/))         FLDMOD1.1036   
  102 FORMAT('     IWA  LEN_BUF_WORDS ',2I12)                              FLDMOD1.1037   
  999 CONTINUE                                                             FLDMOD1.1038   
      RETURN                                                               FLDMOD1.1039   
      END                                                                  FLDMOD1.1040   
CLL  Routine: READPP--------------------------------------------           FLDMOD1.1041   
CLL                                                                        FLDMOD1.1042   
CLL  Purpose: To read a   direct access PP file  and convert it to a       FLDMOD1.1043   
CLL  sequential file read to be passed across to the IBM                   FLDMOD1.1044   
CLL                                                                        FLDMOD1.1045   
CLL  Modification History:                                                 FLDMOD1.1046   
CLL                                                                        FLDMOD1.1047   
CLL  Programming standard: UM Doc Paper 3, version 1 (15/1/90)             FLDMOD1.1048   
CLL                                                                        FLDMOD1.1049   
CLL  -------------------------------------------------------------------   FLDMOD1.1050   
C*L  Interface and arguments: ------------------------------------------   FLDMOD1.1051   
C                                                                          FLDMOD1.1052   

      SUBROUTINE READPP(LEN_INTHD,LEN_REALHD,LEN1_LEVDPC,LEN2_LEVDPC,       1,16FLDMOD1.1053   
     &   LEN1_LOOKUP,LEN2_LOOKUP,LEN_FIXHD,PP_FIXHD,LOOKUP,ROOKUP,         FLDMOD1.1054   
     &   PPUNIT1,PPUNIT2,ICODE,CMESSAGE)                                   FLDMOD1.1055   
      IMPLICIT NONE                                                        FLDMOD1.1056   
      EXTERNAL READPP,POSERROR,IOERROR,GETPOS,SETPOS                       UDG1F405.1538   
      INTEGER                                                              FLDMOD1.1058   
     &     LEN_FIXHD                                                       FLDMOD1.1059   
     &    ,LEN_INTHD                                                       FLDMOD1.1060   
     &    ,LEN_REALHD                                                      FLDMOD1.1061   
     &    ,LEN_LEVDPC                                                      FLDMOD1.1062   
     &    ,LEN1_LEVDPC                                                     FLDMOD1.1063   
     &    ,LEN2_LEVDPC                                                     FLDMOD1.1064   
     &    ,LEN_LOOKUP                                                      FLDMOD1.1065   
     &    ,LEN1_LOOKUP                                                     FLDMOD1.1066   
     &    ,LEN2_LOOKUP                                                     FLDMOD1.1067   
     &    ,LEN1_LOOKNEW                                                    FLDMOD1.1068   
     &    ,LEN2_LOOKNEW                                                    FLDMOD1.1069   
     &    ,LOOKUP(LEN1_LOOKUP,LEN2_LOOKUP)                                 FLDMOD1.1070   
     &    ,PP_INTHD(LEN_INTHD)                                             FLDMOD1.1071   
     &    ,PP_FIXHD(LEN_FIXHD)                                             FLDMOD1.1072   
     &    ,LEN_IO                                                          FLDMOD1.1073   
     &    ,ICODE                                                           FLDMOD1.1074   
     &    ,PPUNIT1                                                         FLDMOD1.1075   
     &    ,PPUNIT2                                                         FLDMOD1.1076   
      REAL                                                                 FLDMOD1.1077   
     &     ROOKUP(LEN1_LOOKUP,LEN2_LOOKUP)                                 FLDMOD1.1078   
     &    ,PP_REALHD(LEN_REALHD)                                           FLDMOD1.1079   
     &    ,PP_LEVDPC(LEN1_LEVDPC*LEN2_LEVDPC+1)                            FLDMOD1.1080   
     &    ,A_IO                                                            FLDMOD1.1081   
      CHARACTER CMESSAGE*(*)                                               FLDMOD1.1082   
      CHARACTER OUTFILE*80                                                 FLDMOD1.1083   
C Local variables                                                          FLDMOD1.1084   
      INTEGER                                                              FLDMOD1.1085   
     &     START_BLOCK                                                     FLDMOD1.1086   
     &    ,NENT                                                            FLDMOD1.1087   
     &    ,K                                                               FLDMOD1.1088   
     &    ,Kk                                                              FLDMOD1.1089   
     &    ,iwa                                                             FLDMOD1.1090   
     &    ,RECL                                                            FLDMOD1.1091   
     &    ,IERR                                                            UDG1F405.1537   
C---------------------------------------------------------------------     FLDMOD1.1092   
      LEN_LEVDPC=LEN1_LEVDPC*LEN2_LEVDPC                                   FLDMOD1.1093   
      LEN_LOOKUP=LEN1_LOOKUP*LEN2_LOOKUP                                   FLDMOD1.1094   
C The calculation of LEN_LEVDPC has PLUS 1 which is only true              FLDMOD1.1095   
C for PP headers and not model headers, hopefully the PLUS one will        FLDMOD1.1096   
C be removed as it is inconsistent)                                        FLDMOD1.1097   
      START_BLOCK=LEN_FIXHD+1                                              FLDMOD1.1098   
CL---------------------------------------------------------------          FLDMOD1.1099   
CL  Read in the integer constants                                          FLDMOD1.1100   
CL---------------------------------------------------------------          FLDMOD1.1101   
      IF(LEN_INTHD.GT.0) THEN  ! Integer constants to be read in           FLDMOD1.1102   
        IF(PP_FIXHD(100).NE.START_BLOCK) THEN   ! Address incorrect        FLDMOD1.1103   
          CALL POSERROR('integer constants',START_BLOCK,100,               FLDMOD1.1104   
     &    PP_FIXHD(100))                                                   FLDMOD1.1105   
          CMESSAGE=' READPP :  Adressing Conflict'                         FLDMOD1.1106   
          ICODE=2                                                          FLDMOD1.1107   
          RETURN                                                           FLDMOD1.1108   
        ENDIF                                                              FLDMOD1.1109   
cd      WRITE(6,*)' inthd from ',start_block                               GIE0F403.221    
cd      call getpos(ppunit1,iwa)                                           FLDMOD1.1111   
cd      WRITE(6,*)'  inthd iwa=',iwa                                       GIE0F403.222    
        CALL BUFFIN(PPUNIT1,PP_INTHD,LEN_INTHD,LEN_IO,A_IO)                FLDMOD1.1113   
      WRITE(6,*)pp_inthd                                                   UDG1F405.1549   
cx      BUFFER IN (PPUNIT1,1) (PP_INTHD(1),PP_INTHD(LEN_INTHD))            FLDMOD1.1115   
cx      A_IO=UNIT(PPUNIT1)                                                 FLDMOD1.1116   
cx      LEN_IO=LENGTH(PPUNIT1)                                             FLDMOD1.1117   
        IF(A_IO.NE.-1.0.OR.LEN_IO.NE.LEN_INTHD) THEN                       FLDMOD1.1118   
          CALL IOERROR(' Buffer in of Integer constants',A_IO,LEN_IO       FLDMOD1.1119   
     &  ,  LEN_INTHD)                                                      FLDMOD1.1120   
          CMESSAGE='READPP : I/O error'                                    FLDMOD1.1121   
          ICODE=3                                                          FLDMOD1.1122   
          RETURN                                                           FLDMOD1.1123   
        ENDIF                                                              FLDMOD1.1124   
        START_BLOCK=START_BLOCK+LEN_INTHD                                  FLDMOD1.1125   
      ENDIF                                                                FLDMOD1.1126   
CL---------------------------------------------------------------          FLDMOD1.1127   
CL  Read in the real constants                                             FLDMOD1.1128   
CL---------------------------------------------------------------          FLDMOD1.1129   
      IF(LEN_REALHD.GT.0) THEN  ! Real constants to be read in             FLDMOD1.1130   
        IF(PP_FIXHD(105).NE.START_BLOCK) THEN   ! Address incorrect        FLDMOD1.1131   
          CALL POSERROR('Real constants',START_BLOCK,100,                  FLDMOD1.1132   
     &    PP_FIXHD(105))                                                   FLDMOD1.1133   
          CMESSAGE=' READPP :  Adressing Conflict'                         FLDMOD1.1134   
          ICODE=4                                                          FLDMOD1.1135   
          RETURN                                                           FLDMOD1.1136   
        ENDIF                                                              FLDMOD1.1137   
cd      WRITE(6,*)'realhd from ',start_block                               GIE0F403.224    
cd      call getpos(ppunit1,iwa                                            FLDMOD1.1139   
cd      WRITE(6,*)' realhd iwa=',iwa                                       GIE0F403.225    
        CALL BUFFIN(PPUNIT1,PP_REALHD,LEN_REALHD,LEN_IO,A_IO)              FLDMOD1.1141   
cd      WRITE(6,*)pp_realhd                                                GIE0F403.226    
cx      BUFFER IN (PPUNIT1,1) (PP_REALHD(1),PP_REALHD(LEN_REALHD))         FLDMOD1.1143   
cx      A_IO=UNIT(PPUNIT1)                                                 FLDMOD1.1144   
cx      LEN_IO=LENGTH(PPUNIT1)                                             FLDMOD1.1145   
        IF(A_IO.NE.-1.0.OR.LEN_IO.NE.LEN_REALHD) THEN                      FLDMOD1.1146   
          CALL IOERROR(' Buffer in of Real constants',A_IO,LEN_IO          FLDMOD1.1147   
     &    ,LEN_REALHD)                                                     FLDMOD1.1148   
          CMESSAGE='READPP : I/O error'                                    FLDMOD1.1149   
          ICODE=5                                                          FLDMOD1.1150   
          RETURN                                                           FLDMOD1.1151   
        ENDIF                                                              FLDMOD1.1152   
        START_BLOCK=START_BLOCK+LEN_REALHD                                 FLDMOD1.1153   
      ENDIF                                                                FLDMOD1.1154   
CL---------------------------------------------------------------          FLDMOD1.1155   
CL  Read in the level dependant constants                                  FLDMOD1.1156   
CL---------------------------------------------------------------          FLDMOD1.1157   
      IF(LEN_LEVDPC.GT.0) THEN  ! Level dep constants to be read in        FLDMOD1.1158   
        IF(PP_FIXHD(110).NE.START_BLOCK) THEN   ! Address incorrect        FLDMOD1.1159   
          CALL POSERROR('Level depndt constants',START_BLOCK,100,          FLDMOD1.1160   
     &    PP_FIXHD(110))                                                   FLDMOD1.1161   
          CMESSAGE=' READPP :  Adressing Conflict'                         FLDMOD1.1162   
          ICODE=6                                                          FLDMOD1.1163   
          RETURN                                                           FLDMOD1.1164   
        ENDIF                                                              FLDMOD1.1165   
cd      WRITE(6,*)'levdep from ',start_block                               GIE0F403.227    
cd      call getpos(ppunit1,iwa)                                           FLDMOD1.1167   
cd      WRITE(6,*)' levdep iwa=',iwa                                       GIE0F403.228    
        CALL BUFFIN(PPUNIT1,PP_LEVDPC,LEN_LEVDPC,LEN_IO,A_IO)              FLDMOD1.1169   
cd      WRITE(6,*)pp_levdpc                                                GIE0F403.229    
cx      BUFFER IN (PPUNIT1,1) (PP_LEVDPC(1),PP_LEVDPC(LEN_LEVDPC))         FLDMOD1.1171   
cx      A_IO=UNIT(PPUNIT1)                                                 FLDMOD1.1172   
cx      LEN_IO=LENGTH(PPUNIT1)                                             FLDMOD1.1173   
        IF(A_IO.NE.-1.0.OR.LEN_IO.NE.LEN_LEVDPC) THEN                      FLDMOD1.1174   
          CALL IOERROR(' Buffer in of Level constants',A_IO,LEN_IO         FLDMOD1.1175   
     &    ,LEN_LEVDPC)                                                     FLDMOD1.1176   
          CMESSAGE='READPP : I/O error'                                    FLDMOD1.1177   
          ICODE=7                                                          FLDMOD1.1178   
          RETURN                                                           FLDMOD1.1179   
        ENDIF                                                              FLDMOD1.1180   
        START_BLOCK=START_BLOCK+LEN_LEVDPC                                 FLDMOD1.1181   
      ENDIF                                                                FLDMOD1.1182   
CL---------------------------------------------------------------          FLDMOD1.1183   
CL  Read in the LOOKUP TABLE                                               FLDMOD1.1184   
CL---------------------------------------------------------------          FLDMOD1.1185   
      IF(LEN_LOOKUP.GT.0) THEN  ! Lookup Table to be read in               FLDMOD1.1186   
cd      WRITE(6,*) 'startblock,pp_fixhd(150)',start_block,pp_fixhd(150)    GIE0F403.230    
        IF(PP_FIXHD(150).NE.START_BLOCK) THEN   ! Address incorrect        UDG1F405.1539   
          WRITE(6,*) 'READPP : WARNING'                                    UDG1F405.1540   
          WRITE(6,*) 'Conflict between start position of Lookup table'     UDG1F405.1541   
          WRITE(6,*) 'block and pointer in fixed length header: ',         UDG1F405.1542   
     &               'FIXHD(150) = ',PP_FIXHD(150)                         UDG1F405.1543   
          WRITE(6,*) 'Current position in file = ',START_BLOCK,            UDG1F405.1544   
     &               ' words in'                                           UDG1F405.1545   
          WRITE(6,*) 'Pointer moved to ',PP_FIXHD(150),' words in'         UDG1F405.1546   
          CALL SETPOS(PPUNIT1,PP_FIXHD(150)-1,IERR)                        UDG1F405.1547   
        END IF                                                             UDG1F405.1548   
cd      WRITE(6,*)'lookup from ',start_block                               GIE0F403.231    
cd      call getpos(ppunit1,iwa)                                           FLDMOD1.1196   
cd      WRITE(6,*)' lookup iwa=',iwa                                       GIE0F403.232    
        CALL BUFFIN(PPUNIT1,LOOKUP,LEN_LOOKUP,LEN_IO,A_IO)                 FLDMOD1.1198   
cx      WRITE(6,*)lookup                                                   GIE0F403.233    
cx      BUFFER IN (PPUNIT1,1)                                              FLDMOD1.1200   
cx   &  (LOOKUP(1,1),LOOKUP(LEN1_LOOKUP,LEN2_LOOKUP))                      FLDMOD1.1201   
cx      A_IO=UNIT(PPUNIT1)                                                 FLDMOD1.1202   
cx      LEN_IO=LENGTH(PPUNIT1)                                             FLDMOD1.1203   
        IF(A_IO.NE.-1.0.OR.LEN_IO.NE.LEN_LOOKUP) THEN                      FLDMOD1.1204   
          CALL IOERROR(' Buffer in of Lookup table   ',A_IO,LEN_IO         FLDMOD1.1205   
     &    ,LEN_LOOKUP)                                                     FLDMOD1.1206   
          CMESSAGE='READPP : I/O error'                                    FLDMOD1.1207   
          ICODE=9                                                          FLDMOD1.1208   
          RETURN                                                           FLDMOD1.1209   
        ENDIF                                                              FLDMOD1.1210   
        START_BLOCK=START_BLOCK+LEN_LOOKUP                                 FLDMOD1.1211   
      ENDIF                                                                FLDMOD1.1212   
      WRITE(6,*)' ARRIVED HERE  ',START_BLOCK                              GIE0F403.234    
      NENT=0                                                               FLDMOD1.1214   
      DO 1 K=1,LEN2_LOOKUP                                                 FLDMOD1.1215   
        IF(LOOKUP(1,K).GT.0) THEN                                          FLDMOD1.1216   
          NENT=NENT+1                                                      FLDMOD1.1217   
        ELSE                                                               FLDMOD1.1218   
          GOTO 2                                                           FLDMOD1.1219   
        ENDIF                                                              FLDMOD1.1220   
    1 CONTINUE                                                             FLDMOD1.1221   
    2 CONTINUE                                                             FLDMOD1.1222   
      WRITE(6,*)' VALUE OF NENT   ',NENT                                   GIE0F403.235    
      do k=nent-2,nent+1                                                   FLDMOD1.1224   
        WRITE(6,*)'k=',k                                                   GIE0F403.236    
        WRITE(6,*) (lookup(kk,k),kk=1,44)                                  GIE0F403.237    
      enddo                                                                FLDMOD1.1227   
c     DO 3 K=1,NENT+1                                                      FLDMOD1.1228   
c   3 CONTINUE                                                             FLDMOD1.1229   
C-----------------------------------------------------------------         FLDMOD1.1230   
C    OPEN NEW TARGET FIELDSFILE INITIALISING BY CALLING INITPP             FLDMOD1.1231   
C-----------------------------------------------------------------         FLDMOD1.1232   
CL                                                                         FLDMOD1.1233   
CL        Open named file on unit 60                                       FLDMOD1.1234   
CL                                                                         FLDMOD1.1235   
        WRITE(6,*)"*** Opening new file on unit ",pPUNIT2                  GIE0F403.238    
        CALL GET_FILE(PPUNIT2,OUTFILE,80,ICODE)                            FLDMOD1.1237   
        CALL FILE_OPEN(PPUNIT2,OUTFILE,80,1,1,ICODE)                       FLDMOD1.1238   
C                                                                          FLDMOD1.1239   
C      WRITE(6,*)'call init_pp '                                           GIE0F403.239    
      CALL INIT_PP(PPUNIT2,'p',LEN1_LOOKUP,LEN2_LOOKUP,PP_FIXHD,           FLDMOD1.1241   
     *             PP_INTHD,PP_REALHD,PP_LEVDPC,LEN_FIXHD,LEN_INTHD,       FLDMOD1.1242   
     *             LEN_REALHD,LEN1_LEVDPC,LEN2_LEVDPC,                     FLDMOD1.1243   
     *             ICODE,CMESSAGE)                                         FLDMOD1.1244   
                                                                           FLDMOD1.1245   
      IF(ICODE.NE.0) THEN                                                  FLDMOD1.1246   
        WRITE(7,100) ICODE                                                 FLDMOD1.1247   
        WRITE(7,110) CMESSAGE                                              FLDMOD1.1248   
        RETURN                                                             FLDMOD1.1249   
 100  FORMAT(' ICODE EQUAL TO ',I2)                                        FLDMOD1.1250   
 110  FORMAT(A80)                                                          FLDMOD1.1251   
      ENDIF                                                                FLDMOD1.1252   
      LEN1_LOOKNEW=LEN1_LOOKUP                                             FLDMOD1.1253   
      LEN2_LOOKNEW=LEN2_LOOKUP                                             FLDMOD1.1254   
C     WRITE(6,*) 'call control'                                            GIE0F403.240    
      CALL CONTROL(PPUNIT1,PPUNIT2,LEN1_LOOKNEW,LEN2_LOOKNEW,              FLDMOD1.1256   
     &             LOOKUP,PP_INTHD,LEN_INTHD,                              FLDMOD1.1257   
     &             PP_FIXHD,LEN_FIXHD,ICODE,CMESSAGE,NENT)                 FLDMOD1.1258   
      IF(ICODE.NE.0) THEN                                                  FLDMOD1.1259   
        WRITE(7,120) ICODE                                                 FLDMOD1.1260   
        WRITE(7,130) CMESSAGE                                              FLDMOD1.1261   
        RETURN                                                             FLDMOD1.1262   
 120  FORMAT(' ICODE EQUAL TO ',I2)                                        FLDMOD1.1263   
 130  FORMAT(A80)                                                          FLDMOD1.1264   
      ENDIF                                                                FLDMOD1.1265   
      GOTO 901                                                             FLDMOD1.1266   
  900 CONTINUE                                                             FLDMOD1.1267   
      WRITE(6,*)' ERROR IN READPP OPENING THE PPUNIT2 FIELDS FILE'         GIE0F403.241    
  901 CONTINUE                                                             FLDMOD1.1269   
 9999 CONTINUE                                                             FLDMOD1.1270   
      RETURN                                                               FLDMOD1.1271   
      END                                                                  FLDMOD1.1272   

      SUBROUTINE SCALE_FIELD(PDATA,RDATA,NPOINTS,SCALE_FACTOR,              1,2FLDMOD1.1273   
     &                       PDATA_LEN,PACK_CODE,AMDI)                     FLDMOD1.1274   
CLL                                                                        FLDMOD1.1275   
CLL    subroutine to unpack a field, multiply by a scale factor,           FLDMOD1.1276   
CLL    then repack data.                                                   FLDMOD1.1277   
CLL                                                                        FLDMOD1.1278   
CLL    Author P J Smith      Date; 21 FEB 92                               FLDMOD1.1279   
CLL                                                                        FLDMOD1.1280   
CLL                                                                        FLDMOD1.1281   
      INTEGER NPOINTS,PDATA_LEN,PACK_CODE                                  FLDMOD1.1282   
      REAL FIELD(NPOINTS),RDATA(NPOINTS),SCALE_FACTOR,AMDI                 FLDMOD1.1283   
      INTEGER PDATA(NPOINTS),NROW,NCOL,ISC,LWORD                           FLDMOD1.1284   
      LOGICAL OPACK                                                        FLDMOD1.1285   
      DATA LWORD/64/                                                       FLDMOD1.1286   
                                                                           FLDMOD1.1287   
      IF(PACK_CODE.EQ.1) THEN                                              FLDMOD1.1288   
        OPACK=.FALSE.                                                      FLDMOD1.1289   
        CALL COEX(FIELD,NPOINTS,PDATA,NPOINTS,NROW,NCOL,PDATA_LEN,         FLDMOD1.1290   
     -            ISC,OPACK,AMDI,LWORD)                                    FLDMOD1.1291   
                                                                           FLDMOD1.1292   
        DO I=1,NCOL*NROW                                                   FLDMOD1.1293   
          IF(FIELD(I).NE.AMDI) THEN                                        FLDMOD1.1294   
            FIELD(I) = FIELD(I) * SCALE_FACTOR                             FLDMOD1.1295   
          ENDIF                                                            FLDMOD1.1296   
        ENDDO                                                              FLDMOD1.1297   
                                                                           FLDMOD1.1298   
        OPACK=.TRUE.                                                       FLDMOD1.1299   
        CALL COEX(FIELD,NPOINTS,PDATA,NPOINTS,NROW,NCOL,PDATA_LEN,         FLDMOD1.1300   
     -            ISC,OPACK,AMDI,LWORD)                                    FLDMOD1.1301   
                                                                           FLDMOD1.1302   
      ELSEIF(PACK_CODE.EQ.0) THEN                                          FLDMOD1.1303   
        DO I=1,PDATA_LEN                                                   FLDMOD1.1304   
          IF(RDATA(I).NE.AMDI) THEN                                        FLDMOD1.1305   
            RDATA(I) = RDATA(I) * SCALE_FACTOR                             FLDMOD1.1306   
          ENDIF                                                            FLDMOD1.1307   
        ENDDO                                                              FLDMOD1.1308   
      ELSE                                                                 FLDMOD1.1309   
        WRITE(6,*)pack_code,' not yet coded'                               GIE0F403.242    
      ENDIF                                                                FLDMOD1.1311   
                                                                           FLDMOD1.1312   
      RETURN                                                               FLDMOD1.1313   
      END                                                                  FLDMOD1.1314   

      SUBROUTINE WIND_10M_FIX(PDATA,RDATA,PDATA_LEN,                        1,3FLDMOD1.1315   
     1                        FCT,ITYPE,LEVEL,IPROJ,PPUNIT1,               FLDMOD1.1316   
     2                        WIND_10M_SCALE,WIND_10M_OROG,                FLDMOD1.1317   
     3                        MODEL_OROG,ILABEL_OROG,RLABEL_OROG,          FLDMOD1.1318   
     4                        IDIM,PACK_CODE,AMDI)                         FLDMOD1.1319   
CLL                                                                        FLDMOD1.1320   
CLL    subroutine to unpack a 10m winds and replace if posible by          FLDMOD1.1321   
CLL    the level 1 wind scaled using wind_10m_scale                        FLDMOD1.1322   
CLL                                                                        FLDMOD1.1323   
CLL    Author P J Smith      Date; 06 jan 95                               FLDMOD1.1324   
CLL                                                                        FLDMOD1.1325   
CLL                                                                        FLDMOD1.1326   
      INTEGER IDIM,PDATA_LEN,PACK_CODE                                     FLDMOD1.1327   
      REAL RDATA(IDIM),FIELD(IDIM),FIELD1(IDIM),AMDI                       FLDMOD1.1328   
      REAL MODEL_OROG(IDIM),RLABEL_OROG(19),RLABEL(19)                     FLDMOD1.1329   
      REAL WIND_10M_OROG,WIND_10M_SCALE                                    FLDMOD1.1330   
      INTEGER PDATA(IDIM),NROW,NCOL,ISC,LWORD                              FLDMOD1.1331   
      INTEGER ILABEL_OROG(45),ILABEL(45)                                   FLDMOD1.1332   
      INTEGER FCT,ITYPE,ITYPE1,LEVEL,LEVEL1,IPROJ,PPUNIT1                  FLDMOD1.1333   
      INTEGER IEXTRA(10)                                                   FLDMOD1.1334   
      LOGICAL OPACK                                                        FLDMOD1.1335   
      DATA LWORD/64/                                                       FLDMOD1.1336   
                                                                           FLDMOD1.1337   
      DO I=1,10                                                            FLDMOD1.1338   
        IEXTRA(I)=0                                                        FLDMOD1.1339   
      ENDDO                                                                FLDMOD1.1340   
                                                                           FLDMOD1.1341   
      write(6,*) ' read level1 winds'                                      FLDMOD1.1342   
      ITYPE1 = 6                                                           FLDMOD1.1343   
      IF(ITYPE.EQ.75) ITYPE1 = 5                                           FLDMOD1.1344   
      LEVEL1 = 1                                                           FLDMOD1.1345   
      CALL FFREAD(IPROJ,FCT,ITYPE1,LEVEL1,PPUNIT1,FIELD1,IDIM,             FLDMOD1.1346   
     1                ILABEL,RLABEL,IEXTRA,ICODE,CMESSAGE)                 FLDMOD1.1347   
                                                                           FLDMOD1.1348   
      write(6,*) 'icode=',icode                                            FLDMOD1.1349   
      IF(ICODE.EQ.0) THEN                                                  FLDMOD1.1350   
        IF(PACK_CODE.EQ.1) THEN                                            FLDMOD1.1351   
          OPACK=.FALSE.                                                    FLDMOD1.1352   
          WRITE(6,*)'call coex'                                            GIE0F403.243    
          CALL COEX(FIELD,IDIM,PDATA,IDIM,NROW,NCOL,PDATA_LEN,             FLDMOD1.1354   
     1              ISC,OPACK,AMDI,LWORD)                                  FLDMOD1.1355   
                                                                           FLDMOD1.1356   
          WRITE(6,*)'loop field'                                           GIE0F403.244    
          DO I=1,NCOL*NROW                                                 FLDMOD1.1358   
            IF(FIELD(I).NE.AMDI) THEN                                      FLDMOD1.1359   
              IF(MODEL_OROG(I).GE.WIND_10M_OROG) THEN                      FLDMOD1.1360   
           WRITE(6,*)i,model_orog(i),field(i),field1(i),field1(i)*.8       GIE0F403.245    
                FIELD(I) = FIELD1(I) * WIND_10M_SCALE                      FLDMOD1.1362   
              ENDIF                                                        FLDMOD1.1363   
            ENDIF                                                          FLDMOD1.1364   
          ENDDO                                                            FLDMOD1.1365   
                                                                           FLDMOD1.1366   
          OPACK=.TRUE.                                                     FLDMOD1.1367   
          CALL COEX(FIELD,IDIM,PDATA,IDIM,NROW,NCOL,PDATA_LEN,             FLDMOD1.1368   
     1              ISC,OPACK,AMDI,LWORD)                                  FLDMOD1.1369   
        ELSEIF(PACK_CODE.EQ.0) THEN                                        FLDMOD1.1370   
          DO I=1,PDATA_LEN                                                 FLDMOD1.1371   
            IF(RDATA(I).NE.AMDI) THEN                                      FLDMOD1.1372   
              IF(MODEL_OROG(I).GE.WIND_10M_OROG) THEN                      FLDMOD1.1373   
                RDATA(I) = FIELD1(I) * WIND_10M_SCALE                      FLDMOD1.1374   
              ENDIF                                                        FLDMOD1.1375   
            ENDIF                                                          FLDMOD1.1376   
          ENDDO                                                            FLDMOD1.1377   
        ELSE                                                               FLDMOD1.1378   
          WRITE(6,*)pack_code,' not yet coded'                             GIE0F403.246    
        ENDIF                                                              FLDMOD1.1380   
      ENDIF                                                                FLDMOD1.1381   
                                                                           FLDMOD1.1382   
      RETURN                                                               FLDMOD1.1383   
      END                                                                  FLDMOD1.1384   
CLL  Routine: RE_PACK  -------------------------------------------------   FLDMOD1.1385   
CLL                                                                        FLDMOD1.1386   
CLL  Purpose: To repack data from the input array FIELD and return         FLDMOD1.1387   
CLL                                                                        FLDMOD1.1388   
CLL  Model            Modification history:                                FLDMOD1.1389   
CLL version  Date                                                          FLDMOD1.1390   
CLL                                                                        FLDMOD1.1391   
CLL                                                                        FLDMOD1.1392   
CLL  Programming standard: UM Doc Paper 3, version 1 (15/1/90)             FLDMOD1.1393   
CLL                                                                        FLDMOD1.1394   
CLL  External documentation:                                               FLDMOD1.1395   
CLL                                                                        FLDMOD1.1396   
CLL  -------------------------------------------------------------------   FLDMOD1.1397   
C*L  Interface and arguments: ------------------------------------------   FLDMOD1.1398   

      SUBROUTINE RE_PACK(PACK_TYPE,IDIM,FIELD,NUM_CRAY_WORDS,               2,2FLDMOD1.1399   
     &                   ILABEL,RLABEL,PP_FIXHD,ICODE,CMESSAGE)            FLDMOD1.1400   
      INTEGER                                                              FLDMOD1.1401   
     &     PACK_TYPE            !IN  The type of packing used              FLDMOD1.1402   
     &    ,IDIM                 !IN  The full unpacked size of a field     FLDMOD1.1403   
     &    ,ILABEL(45)           !OUT holds integer part of LOOKUP          FLDMOD1.1404   
     &    ,ICODE                !OUT Non zero for any error                FLDMOD1.1405   
     &    ,PP_FIXHD(*)          !IN  PPfile fixed length header            FLDMOD1.1406   
      REAL                                                                 FLDMOD1.1407   
     &     FIELD(IDIM)          !INOUT On Input contains data.On output    FLDMOD1.1408   
     &    ,RLABEL(19)           !    holds real part of LOOKUP             FLDMOD1.1409   
      CHARACTER CMESSAGE*(*)    !OUT Will contain any error mesages.       FLDMOD1.1410   
C*                                                                         FLDMOD1.1411   
C EXTERNAL SUBROUTINES CALLED                                              FLDMOD1.1412   
C                                                                          FLDMOD1.1413   
      EXTERNAL COEX,P21BITS                                                FLDMOD1.1414   
      INTEGER  P21BITS                                                     FLDMOD1.1415   
C                                                                          FLDMOD1.1416   
C     LOCAL  VARIABLES                                                     FLDMOD1.1417   
      REAL                                                                 FLDMOD1.1418   
     &     WORK_ARRAY(IDIM)       ! WORK array used for packing            FLDMOD1.1419   
     &    ,AMDI                   ! Missing data indicator.                FLDMOD1.1420   
      INTEGER                                                              FLDMOD1.1421   
     &     LEN_FULL_WORD          ! The length of a FULL_WORD              FLDMOD1.1422   
     &    ,IXX                    ! X dimension for COEX                   FLDMOD1.1423   
     &    ,IYY                    ! Y dimension for COEX                   FLDMOD1.1424   
     &    ,ISC                    ! Accuracy required for COEX             FLDMOD1.1425   
     &    ,IDUM                   ! Dummy variable                         FLDMOD1.1426   
     &    ,NUM_CRAY_WORDS         ! IN no of values in an input field      FLDMOD1.1427   
     &    ,NUM_UNPACK_VALUES      ! Number of numbers originally packed    FLDMOD1.1428   
     &    ,GRIB_PACKING           ! OUT - profile for packing              FLDMOD1.1429   
C                                                                          FLDMOD1.1430   
*CALL CLOOKADD                                                             FLDMOD1.1431   
C                                                                          FLDMOD1.1432   
      DATA LEN_FULL_WORD/64/                                               FLDMOD1.1433   
C                                                                          FLDMOD1.1434   
      AMDI=RLABEL(18)                                                      FLDMOD1.1435   
                                                                           FLDMOD1.1436   
      IF(PACK_TYPE.EQ.1) THEN     ! WGDOS packing                          FLDMOD1.1437   
        IXX=ILABEL(LBNPT)                                                  FLDMOD1.1438   
        IYY=ILABEL(LBROW)                                                  FLDMOD1.1439   
        ISC=NINT(RLABEL(6))                                                FLDMOD1.1440   
        CALL COEX(FIELD,IDIM,WORK_ARRAY,IDIM,IXX,IYY,                      FLDMOD1.1441   
     &  NUM_CRAY_WORDS,ISC,.TRUE.,AMDI,LEN_FULL_WORD)                      FLDMOD1.1442   
      ELSEIF(PACK_TYPE.EQ.2) THEN !  32 Bit CRAY packing                   FLDMOD1.1443   
                                                                           FLDMOD1.1444   
      ELSEIF(PACK_TYPE.EQ.3) THEN !  GRIB PACKING                          FLDMOD1.1445   
        GRIB_PACKING=1                                                     FLDMOD1.1446   
!  RLABEL is returned from FFREAD and contains LOOKUP elements 45-64.      FLDMOD1.1447   
!  PP2GRIB requires this array to contain elements 46-64 from LOOKUP.      FLDMOD1.1448   
!  As a temporary measure the call to PP2GRIB has been amended to pass     FLDMOD1.1449   
!  the values from RLABEL(2). FFREAD will probably be altered at UM4.1     FLDMOD1.1450   
!  to return the correct values in RLABEL.                                 FLDMOD1.1451   
!       CALL PP2GRIB(FIELD,WORK_ARRAY,IDIM,NUM_CRAY_WORDS,GRIB_PACKING,    FLDMOD1.1452   
!    &               ILABEL,RLABEL,ICODE,CMESSAGE)                         FLDMOD1.1453   
        CALL PP2GRIB(FIELD,WORK_ARRAY,IDIM,NUM_CRAY_WORDS,GRIB_PACKING,    FLDMOD1.1454   
     &               ILABEL,RLABEL(1),ICODE,CMESSAGE)                      FLDMOD1.1455   
                                                                           FLDMOD1.1456   
      ELSE                                                                 FLDMOD1.1457   
        ICODE=6                                                            FLDMOD1.1458   
        CMESSAGE=' UNPACK - packing type not yet supported'                FLDMOD1.1459   
      ENDIF                                                                FLDMOD1.1460   
      DO 8 I=1,NUM_cray_words                                              FLDMOD1.1461   
      FIELD(I)=WORK_ARRAY(I)                                               FLDMOD1.1462   
   8  CONTINUE                                                             FLDMOD1.1463   
      ILABEL(DATA_TYPE)=1  ! The data type must now be real                FLDMOD1.1464   
      ILABEL(LBPACK)=ILABEL(LBPACK)+PACK_TYPE ! data now packed            FLDMOD1.1465   
      RETURN                                                               FLDMOD1.1466   
      END                                                                  FLDMOD1.1467   
*ENDIF                                                                     FLDMOD1.1468