*IF DEF,FLDC                                                               FIELDCOS.2      
C ******************************COPYRIGHT******************************    GTS2F400.2809   
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.2810   
C                                                                          GTS2F400.2811   
C Use, duplication or disclosure of this code is subject to the            GTS2F400.2812   
C restrictions as set forth in the contract.                               GTS2F400.2813   
C                                                                          GTS2F400.2814   
C                Meteorological Office                                     GTS2F400.2815   
C                London Road                                               GTS2F400.2816   
C                BRACKNELL                                                 GTS2F400.2817   
C                Berkshire UK                                              GTS2F400.2818   
C                RG12 2SZ                                                  GTS2F400.2819   
C                                                                          GTS2F400.2820   
C If no contract has been raised with this copy of the code, the use,      GTS2F400.2821   
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.2822   
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.2823   
C Modelling at the above address.                                          GTS2F400.2824   
C ******************************COPYRIGHT******************************    GTS2F400.2825   
C                                                                          GTS2F400.2826   
CLL  Routine: FIELDCOS -------------------------------------------------   FIELDCOS.3      
CLL                                                                        FIELDCOS.4      
CLL  Purpose:                                                              PS050793.1      
CLL  To read a model dump or direct access fieldsfile and convert it to    PS050793.2      
CLL  a sequential PP file ready for transfer to a different platform.      PS050793.3      
CLL                                                                        FIELDCOS.7      
CLL   A general note on fieldcos -- When doing a bit compare on            FIELDCOS.8      
CLL   the output of fieldcos half words may disagree. This is caused       FIELDCOS.9      
CLL   by the extra half word after an odd number of words in a field       FIELDCOS.10     
CLL   and is nothing to worry about. (Simon Tett 13/5/92)                  FIELDCOS.11     
CLL                                                                        FIELDCOS.12     
CLL       16/10/92 Added routines for conversion to VAX or IEEE            FIELDCOS.13     
CLL  data formats, changes to LBPACK/LBUSER1 codes.                        FIELDCOS.14     
CLL                                                                        FIELDCOS.15     
CLL  Tested under compiler:   cft77                                        FIELDCOS.16     
CLL  Tested under OS version: UNICOS 5.1                                   FIELDCOS.17     
CLL                                                                        FIELDCOS.18     
CLL  Model            Modification history from model version 3.0:         FIELDCOS.19     
CLL version  Date                                                          FIELDCOS.20     
CLL  3.1   19/02/93 Use FIXHD(12) not FIXHD(1) as Version no in P21BITS    PS050793.4      
CLL  3.1   29/01/93 Reset LBLREC when unpacking data                       PS050793.5      
CLL  3.2   25/03/93 use COMDECK CHSUNITS for size of FLAG_IO               PS050793.6      
CLL  3.2   31/03/93 check dumps indicator in fixed header,                 PS050793.7      
CLL                 correct data lengths for model dump conversions        PS050793.8      
CLL                 correct INTENT comments for subroutine arguments       PS050793.9      
CLL                 add fix to put correct m08 code on max/min temps       PS050793.10     
CLL                 Correct OPEN statement for UNICOS 7.0     PJS          PS050793.11     
CLL                 Code for real missing data indicator from PPHEADER     PS050793.12     
CLL  3.3   08/02/94 Modify calls to TIME2SEC/SEC2TIME to output/input      TJ080294.51     
CLL                 elapsed times in days & secs, for portability, TCJ     TJ080294.52     
CLL                 and correct day number when oper=.true.        RR      TJ080294.53     
CLL  3.3   19/04/94 Check and correct invalid LBREL                        PS190494.1      
CLL                 correct error in END_SECOND usage. P.Smith             PS190494.2      
CLL  3.4   18/05/94 Add processing of Logical data                         APS2F304.5      
CLL                 with fix for Land/Sea mask         P.Smith             APS2F304.6      
CLL  3.4   09/09/94 Add GRIB decoder                   P.Smith             APS2F304.7      
CLL  3.4   17/06/94 *CALL CCONTROL inserted (declares logical switches     GSS1F304.287    
CLL                  which replace *DEFs - LCAL360 replaces CAL360)        GSS1F304.288    
CLL                 Argument LCAL360 passed to S/R's READ_WRITE,           GSS1F304.289    
CLL                  CRAY_IBM, CRAY_VAX, CRAY_IBM and passed on to         GSS1F304.290    
CLL                  S/R's SEC2TIM, TIME2SEC                               GSS1F304.291    
CLL                                               S.J.Swarbrick            GSS1F304.292    
!    4.0   30/03/95 Add new format option - GRIB to strip grib output      URS4F400.1      
!                   from the model of its pp headers and output as         URS4F400.2      
!                   pure binary grib. Also allow conversion of stash       URS4F400.3      
!                   codes to standard grib code table 2 values or          URS4F400.4      
!                   a user set of codes. R A Stratton                      URS4F400.5      
CLL  3.5  13/06/95  Remove comdeck CCONTROL and replace with locally       GDR3F305.73     
CLL                 declared LCAL360.                  RTHBarnes.          GDR3F305.74     
!    4.2   25/02/97  In order to remove the need for "assign" in the       UIE1F403.2      
!    calling script the C I/O routines GET_FILE and FILE_OPEN are used     UIE1F403.3      
!    in place of the FORTRAN OPEN statement. This results in a calling     UIE1F403.4      
!    script with unit declarations i.e.                                    UIE1F403.5      
!    export UNIT07="Diagnostic filename"                                   UIE1F403.6      
!    export UNIT10="Input filename"                                        UIE1F403.7      
!    export UNIT11="Output filename"                                       UIE1F403.8      
!    Also data conversion routines CRAY2IBM and CRAY2IEG changed to        UIE1F403.9      
!    Cray IEEE CRI2IBM and CRI2IEG conversion routines.    Ian Edmond      UIE1F403.10     
!    4.3 17/4/97 Cray 32 unpacking functionality added again  IEdmond      UIE1F403.11     
!    4.4 17/7/97 Fix to subroutine READFF to read wfio dumpfiles. IE       UIE0F404.1      
!LL   4.5    18/09/98  Corrected non-standard FORMAT statments             GPB0F405.143    
!LL                                                  P.Burton              GPB0F405.144    
CLL                                                                        FIELDCOS.21     
CLL                                                                        APS2F304.8      
CLL  Programming standard: UM Doc Paper 3, version 1 (15/1/90)             FIELDCOS.22     
CLL                                                                        FIELDCOS.23     
CLL  Logical components covered: C41                                       FIELDCOS.24     
CLL                                                                        FIELDCOS.25     
CLL  Project task: C4                                                      FIELDCOS.26     
CLL                                                                        FIELDCOS.27     
CLL  External documentation: UM documentation paper Y8                     FIELDCOS.28     
CLL                                                                        FIELDCOS.29     
CLL  -------------------------------------------------------------------   FIELDCOS.30     
C*L  Interface and arguments: ------------------------------------------   FIELDCOS.31     
C                                                                          FIELDCOS.32     

      PROGRAM FIELDCOS                                                     ,11FIELDCOS.33     
      IMPLICIT NONE                                                        FIELDCOS.34     
C*---------------------------------------------------------------------    PS050793.13     
C     Called routines                                                      PS050793.14     
      EXTERNAL READFF,SETPOS,IOERROR,READ_WRITE                            FIELDCOS.35     
C*---------------------------------------------------------------------    PS050793.15     
C     arguments for called routines                                        PS050793.16     
      CHARACTER                                                            PS050793.17     
     &     CMESSAGE*80      ! Error message from lower routines            URS4F400.6      
     &    ,INFILE*80        ! Pathname of input file.                      UIE1F402.36     
     &    ,FORMAT_OUT*6     ! IBM/IEEE/VAX for output format               URS4F400.7      
                            ! GRIB - pure binary grib stash codes          URS4F400.8      
                            ! GRIB1 - pure binary grib - standard codes    URS4F400.9      
                            ! GRIB2 - pure binary grib - Other table 2     URS4F400.10     
      LOGICAL                                                              PS050793.20     
     &     UNPACK                   ! indicates whether to unpack          PS050793.21     
     &    ,OPER                     ! indicates whether operational        PS050793.22     
      NAMELIST /PACK/ UNPACK,FORMAT_OUT                                    FIELDCOS.40     
      NAMELIST /TYPE/ OPER                                                 PS050793.23     
      INTEGER                                                              PS050793.24     
     &     LEN1_LOOKUP              ! First dimension of the lookup        PS050793.25     
     &    ,PP_LEN2_LOOKUP           ! Size of the LOOKUP on the file       PS050793.26     
     &    ,PPUNIT                   ! unit no of required fieldsfile       PS050793.27     
     &    ,COS_PPUNIT               ! unit no of COS output file           PS050793.28     
     &    ,IEXTRA(10)               ! spare for future use                 PS050793.29     
     &    ,ICODE                    ! return code                          PS050793.30     
     &    ,DATA_ADD                 ! The word address of the data.        PS050793.31     
     &    ,IWA                      ! Word address in call SETPOS          PS050793.32     
     &    ,LEN_IO                   ! Length of IO done                    PS050793.33     
     &    ,LEN_FIXHD                ! Length of fixed length header        PS050793.34     
      PARAMETER(LEN_FIXHD=256)                                             PS050793.35     
      INTEGER                                                              PS050793.36     
     &     PP_FIXHD(LEN_FIXHD)      !  Fixed length header                 PS050793.37     
      REAL                                                                 PS050793.38     
     &     A_IO                     ! status returned by BUFFIN            PS050793.39     
      PARAMETER(LEN1_LOOKUP=64)                                            PS050793.40     
      DATA UNPACK/.FALSE./                                                 FIELDCOS.41     
      DATA FORMAT_OUT/'IBM   '/                                            FIELDCOS.42     
      DATA OPER/.FALSE./                                                   FIELDCOS.44     
*CALL CHSUNITS                      ! defines NUNITS                       PS050793.41     
*CALL CGRIBTAB                                                             URS4F400.11     
      LOGICAL FLAG                  ! =T/F file exists/not                 PS050793.42     
      COMMON /FLAG_IO/FLAG(NUNITS)  ! needed for BUFFIN check              PS050793.43     
C*---------------------------------------------------------------------    FIELDCOS.54     
C    LOCAL VARIABLES                                                       FIELDCOS.55     
      INTEGER                                                              FIELDCOS.56     
     &     I                      ! local counter                          FIELDCOS.57     
     &    ,IX                     ! used as a dummy variable in UNIT       FIELDCOS.58     
     &    ,ERR                                                             UIE1F402.34     
     &    ,DIAG_UNIT                                                       UIE1F402.35     
      LOGICAL LCAL360   ! 360 day calendar switch                          GDR3F305.75     
C  Initialise LCAL360                                                      GDR3F305.76     
      DATA LCAL360 /.FALSE./                                               GDR3F305.77     
      CHARACTER*80 DIAGFILE                                                UIE1F402.70     
C=====================================================================     FIELDCOS.69     
C    REMEMBER THAT BUFFER OUT STARTS AT ADDRESS 0 THUS LOOKUP GOES         FIELDCOS.70     
C    FROM 0 to 262143 ie THE NEXT ADDRESS SHOULD BE IWA=262144 to          FIELDCOS.71     
C    IWA=325119 then IWA=325120 to 388095 then 388096 etc                  FIELDCOS.72     
C=====================================================================     FIELDCOS.73     
      READ(5,PACK)                                                         FIELDCOS.74     
      READ(5,TYPE)                                                         FIELDCOS.75     
      WRITE(6,*)'  UNPACK  ',UNPACK                                        GIE0F403.151    
      WRITE(6,*)'  FORMAT  ',FORMAT_OUT                                    GIE0F403.152    
      WRITE(6,*)'  OPER    ',OPER                                          GIE0F403.153    
      DO I=1,10                                                            PS050793.44     
        IEXTRA(I)=0                                                        FIELDCOS.85     
      ENDDO                                                                FIELDCOS.86     
                                                                           UIE1F402.65     
      DIAG_UNIT = 7                                                        UIE1F402.66     
      CALL GET_FILE(DIAG_UNIT,DIAGFILE,80,ICODE)                           UIE1F402.67     
      OPEN(UNIT=DIAG_UNIT,FILE=DIAGFILE)                                   UIE1F402.68     
                                                                           UIE1F402.69     
      PPUNIT=10                                                            FIELDCOS.87     
      COS_PPUNIT=11                                                        FIELDCOS.88     
! -------------------------------------------------------------------      URS4F400.12     
! If FORMAT_OUT is GRIB1 or GRIB2 initialise grib field code               URS4F400.13     
! conversion table                                                         URS4F400.14     
      IF (FORMAT_OUT.EQ.'GRIB1') THEN                                      URS4F400.15     
        CALL GRIB_TABLE_INIT1                                              URS4F400.16     
      ELSE IF (FORMAT_OUT.EQ.'GRIB2') THEN                                 URS4F400.17     
        CALL GRIB_TABLE_INIT2                                              URS4F400.18     
      ENDIF                                                                URS4F400.19     
CL-------------Read in the FIXED length header------------------------     FIELDCOS.90     
      CALL GET_FILE(PPUNIT,INFILE,80,ICODE)                                UIE1F402.37     
      CALL FILE_OPEN(PPUNIT,INFILE,80,0,1,ERR)                             UIE1F402.38     
      FLAG(PPUNIT)=.TRUE.          ! needed for BUFFIN check               FIELDCOS.92     
      CALL BUFFIN(PPUNIT,PP_FIXHD,LEN_FIXHD,LEN_IO,A_IO)                   FIELDCOS.93     
      IF(A_IO.NE.-1.0.OR.LEN_IO.NE.LEN_FIXHD) THEN                         FIELDCOS.94     
          CALL IOERROR('Buffer in fixed length header',A_IO,LEN_IO,        FIELDCOS.95     
     &                  LEN_FIXHD)                                         FIELDCOS.96     
          CMESSAGE='FIELDCOS : I/O error reading FIXED LENGTH HEADER'      FIELDCOS.97     
          ICODE=2                                                          FIELDCOS.98     
          WRITE(6,*)' I/O error reading FIXED LENGTH HEADER'               GIE0F403.154    
          CALL ABORT(" FAILED IN FIELDCOS ")                               FIELDCOS.100    
      ENDIF                                                                FIELDCOS.101    
      DATA_ADD=PP_FIXHD(160)-1 ! Start address for the data.               FIELDCOS.102    
      IWA= PP_FIXHD(150)-1     ! Start address for the lookup table.       FIELDCOS.103    
      PP_LEN2_LOOKUP=PP_FIXHD(152)                                         FIELDCOS.104    
      WRITE(6,*)' PP_LEN2_LOOKUP  ',PP_LEN2_LOOKUP                         GIE0F403.155    
      WRITE(6,*)' dump type=',pp_fixhd(5),                                 GIE0F403.156    
     *       ' 3=fieldsfile,1=dump,2=time mean dump,4=ancil,5=bound'       PS050793.47     
      CALL READ_WRITE(PP_LEN2_LOOKUP,LEN1_LOOKUP,DATA_ADD,                 FIELDCOS.106    
     &                PP_FIXHD,                                            FIELDCOS.107    
     &                IWA,UNPACK,FORMAT_OUT,PPUNIT,COS_PPUNIT,             FIELDCOS.108    
     &                IEXTRA,OPER,ICODE,CMESSAGE,LCAL360)                  GSS1F304.294    
      IF(ICODE.NE.0) THEN                                                  FIELDCOS.110    
        CALL EREPORT(ICODE,CMESSAGE)                                       FIELDCOS.111    
        CALL ABORT(" FAILED IN FIELDCOS ")                                 FIELDCOS.112    
      ENDIF                                                                FIELDCOS.113    
      STOP                                                                 FIELDCOS.114    
      END                                                                  FIELDCOS.115    
CLL  Routine: READ_WRITE -----------------------------------------------   FIELDCOS.116    
CLL                                                                        FIELDCOS.117    
CLL  Purpose: To read a   direct access PP file  and convert it to a       FIELDCOS.118    
CLL  sequential file read to be passed across to the IBM                   FIELDCOS.119    
CLL                                                                        FIELDCOS.120    
CLL  Tested under compiler:   cft77                                        FIELDCOS.121    
CLL  Tested under OS version: UNICOS 5.1                                   FIELDCOS.122    
CLL                                                                        FIELDCOS.123    
CLL  Model            Modification history from model version 3.0:         FIELDCOS.124    
CLL version  Date                                                          FIELDCOS.125    
CLL                                                                        FIELDCOS.126    
CLL  Programming standard: UM Doc Paper 3, version 1 (15/1/90)             FIELDCOS.127    
CLL                                                                        FIELDCOS.128    
CLL  Logical components covered: C41                                       FIELDCOS.129    
CLL                                                                        FIELDCOS.130    
CLL  Project task: C4                                                      FIELDCOS.131    
CLL                                                                        FIELDCOS.132    
CLL  External documentation: UM Documentation paper C4                     FIELDCOS.133    
CLL                                                                        FIELDCOS.134    
CLL  -------------------------------------------------------------------   FIELDCOS.135    
C*L  Interface and arguments: ------------------------------------------   FIELDCOS.136    
C                                                                          FIELDCOS.137    

      SUBROUTINE READ_WRITE(PP_LEN2_LOOKUP,LEN1_LOOKUP,DATA_ADD,            2,12FIELDCOS.138    
     &                      PP_FIXHD,                                      FIELDCOS.139    
     &                      IWA,UNPACK,FORMAT_OUT,PPUNIT,COS_PPUNIT,       FIELDCOS.140    
     &                      IEXTRA,OPER,ICODE,CMESSAGE,LCAL360)            GSS1F304.295    
      IMPLICIT NONE                                                        FIELDCOS.142    
C     Arguments                                                            PS050793.48     
      CHARACTER                                                            PS050793.49     
     &     FORMAT_OUT*6         ! IN    IBM/IEEE/VAX format for output     PS050793.50     
     &    ,CMESSAGE*80          ! OUT   error messages                     PS050793.51     
     &    ,OUTFILE*80           ! OUT   pathname of output file            UIE1F402.64     
      LOGICAL                                                              PS050793.52     
     &     UNPACK               ! IN    indicates whether to unpack        PS050793.53     
     &    ,OPER                 ! IN    indicates whether operational      PS050793.54     
     &    ,LCAL360                                                         GSS1F304.296    
      INTEGER                                                              PS050793.55     
     &     LEN1_LOOKUP          ! IN    1st dimension of LOOKUP            PS050793.56     
     &    ,PP_LEN2_LOOKUP       ! IN    2nd dimension of LOOKUP            PS050793.57     
     &    ,PPUNIT               ! IN    unit no of required fieldsfile     PS050793.58     
     &    ,COS_PPUNIT           ! IN    unit no of COS output file         PS050793.59     
     &    ,DATA_ADD             ! IN    word address of the data.          PS050793.60     
     &    ,IEXTRA(10)           ! IN    Controls READFF                    PS050793.61     
     &    ,IWA                  ! IN    Word address in call SETPOS        PS050793.62     
     &    ,PP_FIXHD(*)          ! IN    PPfile fixed header                PS050793.63     
     &    ,ICODE                ! OUT   error code                         PS050793.64     
                                                                           PS050793.65     
C*---------------------------------------------------------------------    PS050793.66     
C     Called routines                                                      PS050793.67     
      EXTERNAL READFF,SETPOS,CRAY_IBM,CRAY_VAX,CRAY_IEEE,IOERROR           FIELDCOS.143    
C*---------------------------------------------------------------------    PS050793.68     
C     arguments for called routines                                        PS050793.69     
      LOGICAL                                                              FIELDCOS.149    
     &     MODEL_FLAG           ! flag - set to true if model dump         PS050793.70     
     &    ,LAST                 ! indicates last record process            PS050793.71     
      INTEGER                                                              FIELDCOS.151    
     &     LOOKUP(LEN1_LOOKUP,PP_LEN2_LOOKUP)  ! integer lookup            PS050793.72     
     &    ,NUM_VALUES           ! No of data points in a field             PS050793.73     
     &    ,IDIM                 ! NUM_VALUES rounded to an even no         PS050793.74     
C                               !  used to dimension the output array      PS050793.75     
     &    ,IEXTRAW              ! The number of words of "extra" data.     PS050793.76     
     &    ,ENTRY_NO             ! lookkup entry no of the Field.           PS050793.77     
     &    ,LEN_IO               ! actual no of words transferred by IO.    PS050793.78     
     &    ,LEN_IO_EXPECTED      ! expected no of words transferred by IO   PS050793.79     
      REAL                                                                 PS050793.80     
     &     A_IO                 ! status returned by BUFFIN                PS050793.81     
*CALL CLOOKADD                                                             PS050793.82     
C*---------------------------------------------------------------------    FIELDCOS.166    
C    LOCAL VARIABLES                                                       FIELDCOS.167    
      INTEGER                                                              FIELDCOS.168    
     &     I                    ! local counter                            PS050793.83     
     &    ,J                    ! local counter                            PS050793.84     
     &    ,IX                   ! used as a dummy variable in UNIT         PS050793.85     
     &    ,ICOUNT               ! Counter                                  PS050793.86     
     &    ,NENT                 ! No of entries in the printfile           PS050793.87     
     &    ,TOTAL_WORDS          ! Total number of words output GRIB        URS4F400.20     
                                ! option only                              URS4F400.21     
                                                                           PS050793.88     
CL -----------Read in the LOOKUP table if first time thro------------      FIELDCOS.182    
      CALL SETPOS(PPUNIT,IWA,ICODE)                                        GTD0F400.72     
      LEN_IO_EXPECTED=PP_LEN2_LOOKUP*LEN1_LOOKUP                           FIELDCOS.184    
      CALL BUFFIN(PPUNIT,LOOKUP,LEN_IO_EXPECTED,LEN_IO,A_IO)               FIELDCOS.185    
      IF(A_IO.NE.-1.0.OR.LEN_IO.NE.LEN_IO_EXPECTED) THEN                   FIELDCOS.186    
        CALL IOERROR('Buffer in lookup table   ',A_IO,LEN_IO,              FIELDCOS.187    
     &            LEN_IO_EXPECTED )                                        FIELDCOS.188    
        CMESSAGE='READ_W : I/O error reading LOOKUP TABLE  '               FIELDCOS.189    
        ICODE=3                                                            FIELDCOS.190    
          WRITE(6,*)' I/O error reading LOOKUP TABLE'                      GIE0F403.157    
          RETURN                                                           FIELDCOS.192    
      ENDIF                                                                FIELDCOS.193    
                                                                           PS050793.89     
CL -----Having read the LOOKUP table Open the output COS File--------      FIELDCOS.194    
      CALL GET_FILE(COS_PPUNIT,OUTFILE,80,ICODE)                           UIE1F402.62     
      OPEN(UNIT=COS_PPUNIT,FILE=OUTFILE,FORM='UNFORMATTED')                UIE1F402.63     
      NENT=0                                                               FIELDCOS.196    
                                                                           PS050793.90     
CL -----Calculate the number of fields in the File-------------------      FIELDCOS.197    
      DO I=1,PP_LEN2_LOOKUP                                                PS050793.91     
        IF(LOOKUP(LBROW,I).NE.-99) THEN                                    FIELDCOS.199    
          NENT=NENT+1                                                      FIELDCOS.200    
        ELSE                                                               FIELDCOS.201    
          GOTO 2                                                           FIELDCOS.202    
        ENDIF                                                              FIELDCOS.203    
      ENDDO                                                                PS050793.92     
    2 CONTINUE                                                             FIELDCOS.205    
      WRITE(6,*)' THE NUMBER OF FIELDS IN THE INPUT FILE IS ', NENT        GIE0F403.158    
      LAST=.FALSE.                                                         FIELDCOS.207    
C--------------------------------------------------------------------      FIELDCOS.208    
C Note LBROW=18,LBNPT=19                                                   FIELDCOS.209    
C For a DUMP LBLREC will hold original no of data points.                  FIELDCOS.210    
C LBNREC will be set to zero.                                              FIELDCOS.211    
C                                                                          FIELDCOS.212    
C For a PP_file LBLREC will hold the no of CRAY words needed to hold       FIELDCOS.213    
C the data. The original field size will be rows*columns.                  FIELDCOS.214    
C If the data is not packed then LBLREC=LBROW*LBNPT+LBEXT, where           FIELDCOS.215    
C LBEXT will be greater than 0 for timeseries (which are never packed).    FIELDCOS.216    
C  !! WARNING LBEXT - may be -32768 MISSING VALUE !!                       PS050793.94     
C---------------------------------------------------------------------     FIELDCOS.217    
C                                                                          FIELDCOS.218    
CL -----Set MODEL_FLAG and reset UNPACK if DUMP ---------------------      PS050793.95     
      IF(PP_FIXHD(5).NE.3) THEN                                            PS050793.96     
        MODEL_FLAG=.TRUE.       ! Model dump                               PS050793.97     
        UNPACK= .TRUE.          ! cray 32 bit packed data unpacked         PS050793.98     
        WRITE(6,*)'Model dump - UNPACK set TRUE '                          GIE0F403.159    
      ELSE                                                                 PS050793.100    
        MODEL_FLAG=.FALSE.      ! Fieldsfile                               PS050793.101    
      ENDIF                                                                PS050793.102    
      IF(.NOT.UNPACK) IEXTRA(1)=1  ! DATA LEFT PACKED                      PS050793.103    
                                                                           PS050793.104    
CL -----Loop thro all the entries within the field ------------------      FIELDCOS.219    
      DO I=1,NENT                                                          PS050793.105    
        IF(I.EQ.NENT) LAST=.TRUE.                                          PS050793.106    
        IF(MODEL_FLAG) THEN                                                FIELDCOS.225    
          NUM_VALUES=LOOKUP(LBLREC,I)    ! NCOLS*NROWS                     FIELDCOS.226    
        ELSE                                                               FIELDCOS.227    
          NUM_VALUES=LOOKUP(LBROW,I)*LOOKUP(LBNPT,I)+LOOKUP(LBEXT,I)       FIELDCOS.228    
        ENDIF                                                              FIELDCOS.229    
        IEXTRAW=0                                                          PS050793.107    
        IF(LOOKUP(LBEXT,I).GT.0) THEN ! got some extra data                PS050793.108    
          IEXTRAW=LOOKUP(LBEXT,I)                                          PS050793.109    
C check to see that we don't have packing if we have extra data....        FIELDCOS.232    
          IF(LOOKUP(LBROW,I)*LOOKUP(LBNPT,I)+LOOKUP(LBEXT,I) .NE.          PS050793.110    
     &      LOOKUP(LBLREC,I)) THEN                                         PS050793.111    
            CMESSAGE='READ_WRT : Packing of extra data not supported'      PS050793.112    
            ICODE=1                                                        PS050793.113    
            RETURN                                                         FIELDCOS.237    
          ENDIF                                                            FIELDCOS.238    
        ENDIF                                                              FIELDCOS.239    
        IDIM=((NUM_VALUES+1)/2)*2 ! Round to ensur an integer for IBM      PS050793.114    
                                                                           FIELDCOS.241    
CL---------------------------------------------------------------------    FIELDCOS.242    
CL If packed simply read in the field ie LBLREC words for PP_type          FIELDCOS.243    
CL files  & for Dump type read LBLREC/2 if packed and LBLREC if not.       FIELDCOS.244    
CL All packed data is assumed real. If the data is to be un-packed         FIELDCOS.245    
CL then it is un-packed into an array size IDIM. IDIM is NROWS*NCOLS+ext   FIELDCOS.246    
CL rounded up to ensure it is even. If the data is not packed then it      FIELDCOS.247    
CL could be REAL,LOGICAL or INTEGER .                                      FIELDCOS.248    
CL--------------------------------------------------------------------     FIELDCOS.249    
                                                                           FIELDCOS.250    
        ICODE=0                                                            FIELDCOS.251    
        ENTRY_NO=I                                                         FIELDCOS.252    
        IF(FORMAT_OUT.EQ.'IBM') THEN                                       FIELDCOS.253    
          CALL CRAY_IBM(IDIM,NUM_VALUES,PPUNIT,                            FIELDCOS.254    
     &                  LEN1_LOOKUP,PP_LEN2_LOOKUP,PP_FIXHD,LOOKUP,        FIELDCOS.255    
     &                  LOOKUP,ENTRY_NO,DATA_ADD,MODEL_FLAG,               PS050793.115    
     &                  COS_PPUNIT,IEXTRA,IEXTRAW,LAST,OPER,               FIELDCOS.257    
     &                  ICODE,CMESSAGE,LCAL360)                            GSS1F304.297    
        ELSEIF(FORMAT_OUT.EQ.'VAX') THEN                                   FIELDCOS.259    
          CALL CRAY_VAX(IDIM,NUM_VALUES,PPUNIT,                            FIELDCOS.260    
     &                  LEN1_LOOKUP,PP_LEN2_LOOKUP,PP_FIXHD,LOOKUP,        FIELDCOS.261    
     &                  LOOKUP,ENTRY_NO,DATA_ADD,MODEL_FLAG,               PS050793.116    
     &                  COS_PPUNIT,IEXTRA,IEXTRAW,LAST,OPER,               FIELDCOS.263    
     &                  ICODE,CMESSAGE,LCAL360)                            GSS1F304.298    
        ELSEIF(FORMAT_OUT.EQ.'IEEE') THEN                                  FIELDCOS.265    
          CALL CRAY_IEEE(IDIM,NUM_VALUES,PPUNIT,                           FIELDCOS.266    
     &                   LEN1_LOOKUP,PP_LEN2_LOOKUP,PP_FIXHD,LOOKUP,       PS050793.117    
     &                   LOOKUP,ENTRY_NO,DATA_ADD,MODEL_FLAG,              PS050793.118    
     &                   COS_PPUNIT,IEXTRA,IEXTRAW,LAST,OPER,              PS050793.119    
     &                   ICODE,CMESSAGE,LCAL360)                           GSS1F304.299    
        ELSEIF(FORMAT_OUT.EQ.'GRIB'.OR.FORMAT_OUT.EQ.'GRIB1'.OR.           URS4F400.22     
     &             FORMAT_OUT.EQ.'GRIB2') THEN                             URS4F400.23     
          TOTAL_WORDS=0                                                    URS4F400.24     
          CALL CRAY_GRIB(IDIM,PPUNIT,TOTAL_WORDS,FORMAT_OUT,               URS4F400.25     
     &                   LEN1_LOOKUP,PP_LEN2_LOOKUP,PP_FIXHD,LOOKUP,       URS4F400.26     
     &                   LOOKUP,ENTRY_NO,DATA_ADD,MODEL_FLAG,              URS4F400.27     
     &                   COS_PPUNIT,IEXTRA,ICODE,CMESSAGE)                 URS4F400.28     
        ELSE                                                               FIELDCOS.271    
          ICODE=1                                                          FIELDCOS.272    
          CMESSAGE= ' OUTPUT FORMAT NOT YET AVAILABLE '                    FIELDCOS.273    
        ENDIF                                                              FIELDCOS.274    
        IF(ICODE.NE.0) THEN                                                FIELDCOS.275    
          RETURN                                                           FIELDCOS.276    
        ENDIF                                                              FIELDCOS.277    
      ENDDO                                                                PS050793.121    
      RETURN                                                               FIELDCOS.280    
      END                                                                  FIELDCOS.281    
CLL  Routine: CRAY_IBM-------------------------------------------------    FIELDCOS.283    
CLL                                                                        FIELDCOS.284    
CLL  Purpose: To read a   direct access PP file  and convert it to a       FIELDCOS.285    
CLL  sequential file read to be passed across to the IBM                   FIELDCOS.286    
CLL                                                                        FIELDCOS.287    
CLL  Tested under compiler:   cft77                                        FIELDCOS.288    
CLL  Tested under OS version: UNICOS 5.1                                   FIELDCOS.289    
CLL                                                                        FIELDCOS.290    
CLL  Model            Modification history from model version 3.0:         FIELDCOS.291    
CLL version  Date                                                          FIELDCOS.292    
CLL  4.5 24/7/98 Change to output land sea mask as a real field (as a      URR2F405.1      
CLL              special case). Rick Rawlins                               URR2F405.2      
CLL                                                                        FIELDCOS.293    
CLL  Programming standard: UM Doc Paper 3, version 1 (15/1/90)             FIELDCOS.294    
CLL                                                                        FIELDCOS.295    
CLL  Logical components covered: C41                                       FIELDCOS.296    
CLL                                                                        FIELDCOS.297    
CLL  Project task: C4                                                      FIELDCOS.298    
CLL                                                                        FIELDCOS.299    
CLL  External documentation:                                               FIELDCOS.300    
CLL                                                                        FIELDCOS.301    
CLL  -------------------------------------------------------------------   FIELDCOS.302    
C*L  Interface and arguments: ------------------------------------------   FIELDCOS.303    
C                                                                          FIELDCOS.304    

      SUBROUTINE CRAY_IBM(IDIM,NUM_VALUES,PPUNIT,                           1,7FIELDCOS.305    
     &             LEN1_LOOKUP,PP_LEN2_LOOKUP,PP_FIXHD,LOOKUP,             FIELDCOS.306    
     &             ROOKUP,ENTRY_NO,DATA_ADD,MODEL_FLAG,                    PS050793.122    
     &             COS_PPUNIT,IEXTRA,IEXTRAW,LAST,OPER,                    PS050793.123    
     &             ICODE,CMESSAGE,LCAL360)                                 GSS1F304.300    
      IMPLICIT NONE                                                        FIELDCOS.309    
C     Arguments                                                            PS050793.125    
      CHARACTER                                                            PS050793.126    
     &     CMESSAGE*(*)           !OUT error messages                      PS050793.127    
      LOGICAL                                                              PS050793.128    
     &     LAST                   !IN indicates last record process        PS050793.129    
     &    ,OPER                   !IN indicates whether operational        PS050793.130    
     &    ,MODEL_FLAG             !IN True => dumps, False => fieldsfile   PS050793.131    
     &    ,LCAL360                                                         GSS1F304.301    
      INTEGER                                                              PS050793.132    
     &     PPUNIT                 !IN unit no of required fieldsfile       PS050793.133    
     &    ,COS_PPUNIT             !IN unit no of COS output file           PS050793.134    
     &    ,NUM_VALUES             !IN No of data points NROWS*NCOLS        PS050793.135    
     &    ,IDIM                   !IN NUM_VALUES rounded to an even no     PS050793.136    
C                                 !  used to dimension The output array    PS050793.137    
     &    ,DATA_ADD               !IN The word address of the data.        PS050793.138    
     &    ,LEN1_LOOKUP            !IN First dimension of the lookup        PS050793.139    
     &    ,PP_LEN2_LOOKUP         !IN Size of the LOOKUP on the file       PS050793.140    
     &    ,IEXTRA(10)             !IN Used within READFF                   PS050793.141    
     &    ,IEXTRAW                !IN no of words of extra data.           PS050793.142    
     &    ,ENTRY_NO               !IN Lookup entry no of the Field.        PS050793.143    
     &    ,PP_FIXHD(*)            !IN PPfile fixed header                  PS050793.144    
     &    ,LOOKUP(LEN1_LOOKUP,PP_LEN2_LOOKUP)  !IN integer lookup          PS050793.145    
     &    ,ICODE                  !OUT error code                          PS050793.146    
      REAL                                                                 PS050793.147    
     &     ROOKUP(LEN1_LOOKUP,PP_LEN2_LOOKUP)    !IN Real lookup           PS050793.148    
C*---------------------------------------------------------------------    PS050793.149    
C     Called routines                                                      PS050793.150    
      EXTERNAL READFF,INT_FROM_REAL,CRI2IBM,TIME2SEC,SEC2TIME              UIE1F402.1      
      INTEGER INT_FROM_REAL,CRI2IBM                                        UIE1F402.2      
C*---------------------------------------------------------------------    PS050793.152    
C     arguments for called routines                                        PS050793.153    
      INTEGER                                                              FIELDCOS.315    
     &     MAX_LEN_ILABEL    ! maximum length of INT part of pp header     PS050793.154    
     &    ,MAX_LEN_RLABEL    ! maximum length of REAL part of pp header    PS050793.155    
      PARAMETER (MAX_LEN_ILABEL=45,MAX_LEN_RLABEL=32)                      PS050793.156    
      INTEGER                                                              FIELDCOS.331    
     &     END_YEAR        ! )                                             PS050793.157    
     &    ,END_MONTH       ! )                                             PS050793.158    
     &    ,END_DAY         ! )  arguments                                  PS050793.159    
     &    ,END_HOUR        ! )                                             PS050793.160    
     &    ,END_MINUTE      ! )     for                                     PS050793.161    
     &    ,END_SECOND      ! )                                             PS050793.162    
     &    ,END_DAY_NUMBER  ! )                                             TJ080294.54     
     &    ,END_TIME_DAYS   ! )                                             TJ080294.55     
     &    ,END_TIME_SECS   ! )  date/time                                  PS050793.163    
     &    ,START_TIME_SECS ! )                                             PS050793.164    
     &    ,START_TIME_DAYS ! )                                             TJ080294.56     
     &    ,DATA_YEAR       ! )  conversion                                 PS050793.165    
     &    ,DATA_MONTH      ! )                                             PS050793.166    
     &    ,DATA_DAY        ! )     when                                    PS050793.167    
     &    ,DATA_HOUR       ! )                                             PS050793.168    
     &    ,DATA_MINUTE     ! )  OPER is TRUE                               PS050793.169    
     &    ,DATA_SECOND     ! )                                             PS050793.170    
     &    ,DATA_DAY_NUMBER ! )                                             PS050793.171    
     &    ,ADDR            ! address in fld, used to process extra data    PS050793.172    
     &    ,IBM_ADDR        ! address in ibm fld where extra data going.    PS050793.173    
     &    ,BIT_OFF         ! what bit offset are we using                  PS050793.174    
C                            (32 for odd, 0 for even values of addr)       PS050793.175    
     &    ,IER             ! error RETURN CODE from conversion             PS050793.176    
     &    ,IV              ! value of integer code for vectors             PS050793.177    
     &    ,LEN_ILABEL      ! number of values in ILABEL                    PS050793.178    
     &    ,LEN_RLABEL      ! number of values in RLABEL                    PS050793.179    
     &    ,DATA_VALUES     ! number of values in real extra data           PS050793.180    
     &    ,ILABEL(MAX_LEN_ILABEL)       ! holds integer part of LOOKUP     PS050793.181    
     &    ,IBM_LABEL((LEN1_LOOKUP+1)/2) ! holds IBM conversion of LABEL    PS050793.182    
                                                                           PS050793.183    
      REAL                                                                 FIELDCOS.334    
     &     FIELD(IDIM)            ! array holding data                     PS050793.184    
     &    ,IBM_FIELD(IDIM/2)      ! array holding IBM data                 PS050793.185    
     &    ,RLABEL(MAX_LEN_RLABEL) ! holds real part of LOOKUP              PS050793.186    
                                                                           PS050793.187    
*CALL CLOOKADD                                                             PS050793.188    
C*---------------------------------------------------------------------    FIELDCOS.340    
C    LOCAL VARIABLES                                                       FIELDCOS.341    
      INTEGER                                                              FIELDCOS.342    
     &     I              ! local counter                                  PS050793.189    
     &    ,PACK_TYPE      ! packing type N1 of LBPACK                      PS050793.190    
     &    ,DATA_COMP      ! data compression code                          FIELDCOS.371    
     &    ,DATA_COMP_DEF  ! data compression definition                    FIELDCOS.372    
     &    ,NUMBER_FORMAT  ! number format                                  FIELDCOS.373    
     &    ,FCST_PRD                                                        PS050793.191    
                                                                           FIELDCOS.374    
      LOGICAL PACKED      ! indicates whether the data is packed           PS050793.192    
                                                                           FIELDCOS.376    
                                                                           PS050793.193    
                                                                           FIELDCOS.378    
      DO 1 I=1,IDIM      ! make sure FIELD is initialised. An odd          FIELDCOS.379    
      FIELD(I)=0.0       ! number of points might upset conversion         FIELDCOS.380    
    1 CONTINUE                                                             FIELDCOS.381    
      PACKED=.FALSE.                                                       FIELDCOS.382    
                                                                           FIELDCOS.383    
CL access the Fields File.                                                 FIELDCOS.384    
      CALL READFF(PPUNIT,FIELD,IDIM,ENTRY_NO,                              FIELDCOS.385    
     *ILABEL,RLABEL,IEXTRA,PP_LEN2_LOOKUP,LEN1_LOOKUP,                     FIELDCOS.386    
     *PP_FIXHD,LOOKUP,ROOKUP,DATA_ADD,                                     PS050793.194    
     *MODEL_FLAG,MAX_LEN_ILABEL,MAX_LEN_RLABEL,                            PS050793.195    
     *LEN_ILABEL,LEN_RLABEL,                                               PS050793.196    
     *ICODE,CMESSAGE)                                                      PS050793.197    
C                                                                          FIELDCOS.388    
      IF(ICODE.NE.0) RETURN                                                FIELDCOS.389    
                                                                           FIELDCOS.390    
C-----------------------------------------------------------------         FIELDCOS.391    
                                                                           FIELDCOS.392    
C The data has now been read in and has 1) Been read in packed             FIELDCOS.393    
C and left packed or 2) read in as packed and then un-packed or            FIELDCOS.394    
C 3) The data was never packed at all.  If packed FIELD will have          FIELDCOS.395    
C LBLREC/2 values if a DUMP and LBLREC values if a PP_FILE. If             FIELDCOS.396    
C the data is not packed FIELD will have the no of data points             FIELDCOS.397    
C length LBROW*LBNPT+LBEXT if a pp_file and LBLREC if a dump file.         FIELDCOS.398    
C                                                                          FIELDCOS.399    
C For a dump LBLREC will hold origonal no of data points.  For a           FIELDCOS.400    
C pp_file LBLREC will hold the no of CRAY words needed to hold             FIELDCOS.401    
C the data (if un-packed also no of data points)                           FIELDCOS.402    
C                                                                          FIELDCOS.403    
C The value returned in ILABEL(LBLREC) may have to change because          FIELDCOS.404    
C the IBM only has a 32 bit word length compared to the CRAY's 64          FIELDCOS.405    
C bit word length. On the IBM ILABEL(LBLREC) will be no of IBM             FIELDCOS.406    
C words needed to hold the data . If the data is not packed (or            FIELDCOS.407    
C it has been un-packed) then this will be the no of data points.          FIELDCOS.408    
C If the data is left packed the value of ILABEL(LBLREC) on the            FIELDCOS.409    
C IBM will have to be doubled as the no of IBM words needed to             FIELDCOS.410    
C hold the data will twice that on the CRAY.                               FIELDCOS.411    
                                                                           FIELDCOS.412    
C On output the data will either have been converted to IBM                FIELDCOS.413    
C numbers and stored in IBM_FIELD or left packed in FIELD.  If packed      FIELDCOS.414    
C then LBLREC/2  words of FIELD are written as LBLREC is now               FIELDCOS.415    
C the no of IBM words. If un-packed IBM_FIELD which has size               FIELDCOS.416    
C IDIM/2 (or NUM_VALUES/2) is written as it is.                            FIELDCOS.417    
                                                                           FIELDCOS.418    
C-----------------------------------------------------------------         FIELDCOS.419    
c     decode LBPACK                                                        FIELDCOS.420    
      PACK_TYPE = MOD(ILABEL(LBPACK),10)                                   FIELDCOS.421    
      DATA_COMP = MOD(ILABEL(LBPACK),100) - PACK_TYPE                      FIELDCOS.422    
      DATA_COMP_DEF = MOD(ILABEL(LBPACK),1000) -DATA_COMP -PACK_TYPE       FIELDCOS.423    
      NUMBER_FORMAT = ILABEL(LBPACK)/1000                                  FIELDCOS.424    
                                                                           FIELDCOS.425    
      IF(PACK_TYPE.GT.0) PACKED=.TRUE.                                     FIELDCOS.426    
      IF(PACKED) THEN              ! Data left in packed form. Number of   PS290193.2      
        ILABEL(LBLREC)=ILABEL(LBLREC)*2 ! IBM words needed is 2*CRAY       PS290193.3      
      ENDIF                                                                FIELDCOS.437    
C verify that don't have extra data and packing at once                    FIELDCOS.438    
      IF (IEXTRAW.GT.0.AND.PACKED) THEN                                    FIELDCOS.439    
        CMESSAGE='FIELDCOS: Extra data with packing not supported'         FIELDCOS.440    
        ICODE=1                                                            FIELDCOS.441    
        RETURN                                                             FIELDCOS.442    
      ENDIF                                                                FIELDCOS.443    
                                                                           FIELDCOS.444    
CL Convert ILABEL to IBM(Hitachi) integers.                                FIELDCOS.445    
C For either an accumulation or time mean (ie LBTIM.ne.0) the start &      FIELDCOS.446    
C end time are in a different order to the data and veri time for a        FIELDCOS.447    
C snap shot type field. This anomaly has to be catered for operational     FIELDCOS.448    
C use. Thus the PP package will not work properly on accum/time mn field   FIELDCOS.449    
C for operational Fields files.                                            FIELDCOS.450    
      IF(ILABEL(LBTIM).NE.11.AND.OPER) THEN                                PS050793.198    
C       re -calculate the data time from the end time  and fcst period     FIELDCOS.452    
C     First calculate the no of seconds from day 0                         FIELDCOS.453    
        END_YEAR=ILABEL(LBYRD)                                             FIELDCOS.454    
        END_MONTH=ILABEL(LBMOND)                                           FIELDCOS.455    
        END_DAY=ILABEL(LBDATD)                                             FIELDCOS.456    
        END_HOUR=ILABEL(LBHRD)                                             FIELDCOS.457    
        END_MINUTE=ILABEL(LBMIND)                                          FIELDCOS.458    
        END_DAY_NUMBER=ILABEL(LBDAYD)                                      TJ080294.75     
        END_SECOND=0                                                       PS190494.3      
        FCST_PRD=ILABEL(LBFT)                                              FIELDCOS.460    
C       WRITE(6,*)' START YR/MO/DA/HR/MIN BEFORE ',ILABEL(1),ILABEL(2),    GIE0F403.160    
C    *  ILABEL(3),ILABEL(4),ILABEL(5)                                      FIELDCOS.462    
C       WRITE(6,*)' END   YR/MO/DA/HR/MIN BEFORE ',ILABEL(7),ILABEL(8),    GIE0F403.161    
C    *  ILABEL(9),ILABEL(10),ILABEL(11)                                    FIELDCOS.464    
C       WRITE(6,*)' FCST_PRD BEFORE  ',FCST_PRD                            GIE0F403.162    
        CALL TIME2SEC (END_YEAR,END_MONTH,END_DAY,END_HOUR,                FIELDCOS.466    
     *               END_MINUTE,END_SECOND,0,0,                            TJ080294.57     
     *               END_TIME_DAYS,END_TIME_SECS,LCAL360)                  GSS1F304.302    
                                                                           FIELDCOS.468    
C   Subtract forecast hours from end time in (days,seconds)                TJ080294.84     
                                                                           TJ080294.85     
       CALL TIME_DF(END_TIME_DAYS,END_TIME_SECS,0,-FCST_PRD*3600,          TJ080294.86     
     *              START_TIME_DAYS,START_TIME_SECS)                       TJ080294.87     
                                                                           FIELDCOS.470    
C     Go back and re-calculate Year/Month/Day/Hour/Sec.                    FIELDCOS.471    
       CALL SEC2TIME(0,0,START_TIME_DAYS,START_TIME_SECS,                  TJ080294.59     
     *             DATA_YEAR,DATA_MONTH,DATA_DAY,                          TJ080294.60     
     *             DATA_HOUR,DATA_MINUTE,DATA_SECOND,DATA_DAY_NUMBER,      GSS1F304.303    
     *             LCAL360)                                                GSS1F304.304    
        ILABEL(LBYRD)=DATA_YEAR                                            FIELDCOS.475    
        ILABEL(LBMOND)=DATA_MONTH                                          FIELDCOS.476    
        ILABEL(LBDATD)=DATA_DAY                                            FIELDCOS.477    
        ILABEL(LBHRD)=DATA_HOUR                                            FIELDCOS.478    
        ILABEL(LBMIND)=DATA_MINUTE                                         FIELDCOS.479    
        ILABEL(LBDAYD)=DATA_DAY_NUMBER                                     TJ080294.76     
        ILABEL(LBYR)=END_YEAR                                              FIELDCOS.480    
        ILABEL(LBMON)=END_MONTH                                            FIELDCOS.481    
        ILABEL(LBDAT)=END_DAY                                              FIELDCOS.482    
        ILABEL(LBHR)=END_HOUR                                              FIELDCOS.483    
        ILABEL(LBMIN)=END_MINUTE                                           FIELDCOS.484    
        ILABEL(LBDAY)=END_DAY_NUMBER                                       TJ080294.77     
C       WRITE(6,*)' -----------------------------------------------'       GIE0F403.163    
C       WRITE(6,*)' Veri  YR/MO/DA/HR/MIN AFTER ',ILABEL(1),ILABEL(2),     GIE0F403.164    
C    *  ILABEL(3),ILABEL(4),ILABEL(5)                                      FIELDCOS.487    
C       WRITE(6,*)' Data  YR/MO/DA/HR/MIN AFTER ',ILABEL(7),ILABEL(8),     GIE0F403.165    
C    *  ILABEL(9),ILABEL(10),ILABEL(11)                                    FIELDCOS.489    
C       WRITE(6,*)' FCST_PRD AFTER   ',FCST_PRD                            GIE0F403.166    
C       WRITE(6,*)' -----------------------------------------------'       GIE0F403.167    
C       WRITE(6,*)' -----------------------------------------------'       GIE0F403.168    
      ENDIF                                                                FIELDCOS.493    
      if(oper) then                                                        PS050793.199    
C       new fix added 3.2 to correct max/min temp M08 codes                PS050793.200    
        IF(ILABEL(LBTYP).EQ.58) THEN                                       PS050793.201    
         WRITE(6,*)'fix to type=',ilabel(lbtyp),' proc=',ilabel(lbproc)    GIE0F403.169    
C         check lbproc for max or min                                      PS050793.203    
          IF(ILABEL(LBPROC).EQ.4096) ILABEL(LBTYP)=157  ! MIN              PS050793.204    
          IF(ILABEL(LBPROC).EQ.8192) ILABEL(LBTYP)=156  ! MAX              PS050793.205    
         WRITE(6,*)' type=',ilabel(lbtyp)                                  GIE0F403.170    
        ENDIF                                                              PS050793.207    
      ENDIF                                                                PS050793.208    
                                                                           FIELDCOS.494    
C     now native format for front-end                                      FIELDCOS.495    
      ILABEL(LBPACK) = ILABEL(LBPACK) -NUMBER_FORMAT*1000                  FIELDCOS.496    
C                                                                          FIELDCOS.497    
C     should really be ibm format but access not ready on front-end        PS050793.209    
C     ILABEL(LBPACK) = ILABEL(LBPACK) -NUMBER_FORMAT*1000 + 1000           FIELDCOS.499    
                                                                           FIELDCOS.500    
CL Convert ILABEL to IBM(Hitachi) Integers                                 PS050793.210    
      BIT_OFF = 0                                                          FIELDCOS.501    
      IBM_ADDR=1                                                           PS050793.211    
      IER = CRI2IBM(2,LEN_ILABEL,IBM_LABEL(IBM_ADDR),BIT_OFF,ILABEL,       UIE1F402.3      
     &              1,64,32)                                               UIE1F402.4      
        IF(IER.NE.0) THEN                                                  FIELDCOS.503    
          ICODE=1                                                          FIELDCOS.504    
          CMESSAGE=' CRAY_IBM error converting INT for IBM_LABEL'          PS050793.213    
          RETURN                                                           FIELDCOS.506    
        ENDIF                                                              FIELDCOS.507    
CL Convert RLABEL to IBM(Hitachi) Real.                                    FIELDCOS.508    
      IBM_ADDR=LEN_ILABEL/2                                                PS050793.214    
      IF(IBM_ADDR*2.NE.LEN_ILABEL) BIT_OFF=32                              PS050793.215    
      IBM_ADDR=IBM_ADDR+1                                                  PS050793.216    
      IER = CRI2IBM(3,LEN_RLABEL,IBM_LABEL(IBM_ADDR),BIT_OFF,RLABEL,       UIE1F402.5      
     &              1,64,32)                                               UIE1F402.6      
        IF(IER.NE.0) THEN                                                  FIELDCOS.511    
          ICODE=1                                                          FIELDCOS.512    
          CMESSAGE=' CRAY_IBM error converting REAL for IBM_LABEL'         PS050793.218    
          RETURN                                                           FIELDCOS.514    
        ENDIF                                                              FIELDCOS.515    
      BIT_OFF = 0                                                          PS050793.219    
      IF(.NOT.PACKED) THEN                                                 FIELDCOS.516    
CL Convert Real DATA to IBM(Hitachi) Real if not packed.                   FIELDCOS.517    
        IF(ILABEL(DATA_TYPE).EQ.1) THEN        !Data Type Real             FIELDCOS.518    
        if(ilabel(32).eq.74) then                                          APS2F304.9      
! Output land sea mask as a real field. This is defined as a logical in    URR2F405.3      
! the model, but STASH cannot currently handle logical fields on output    URR2F405.4      
! and it is output unconverted by STASH, but with the datatype             URR2F405.5      
! hardwired to 1 to indicate real.                                         URR2F405.6      
         WRITE(6,*) 'Convert type 74 (=landsea mask) from logical',        URR2F405.7      
     &              ' to real. Datatype already labelled as real.'         URR2F405.8      
         CALL LOGICAL_TO_REAL(IDIM,FIELD,FIELD,NUM_VALUES,                 URR2F405.9      
     &                         ILABEL,ICODE,CMESSAGE)                      URR2F405.10     
        endif                                                              URR2F405.11     
          IER = CRI2IBM(3,NUM_VALUES-IEXTRAW,IBM_FIELD,BIT_OFF,FIELD,      UIE1F402.9      
     &              1,64,32)                                               UIE1F402.10     
          IF(IER.NE.0) THEN                                                FIELDCOS.520    
            ICODE=1                                                        FIELDCOS.521    
            CMESSAGE='CRAY_IBM error converting real for IBM_FIELD'        FIELDCOS.522    
            RETURN                                                         FIELDCOS.523    
          ENDIF                                                            FIELDCOS.524    
CL Convert Integer data to IBM(Hitachi) Integer.                           FIELDCOS.525    
        ELSEIF(ILABEL(DATA_TYPE).EQ.2) THEN      !Data Type Integer        PS050793.220    
          IER = CRI2IBM(2,NUM_VALUES-IEXTRAW,IBM_FIELD,BIT_OFF,FIELD,      UIE1F402.11     
     &              1,64,32)                                               UIE1F402.12     
          IF(IER.NE.0) THEN                                                FIELDCOS.528    
            ICODE=1                                                        FIELDCOS.529    
            CMESSAGE='CRAY_IBM error converting int for IBM_FIELD'         FIELDCOS.530    
            RETURN                                                         FIELDCOS.531    
          ENDIF                                                            FIELDCOS.532    
        ELSEIF(ILABEL(DATA_TYPE).EQ.3) THEN      !Data Type Logical        PS050793.221    
          IER = CRI2IBM(5,NUM_VALUES-IEXTRAW,IBM_FIELD,BIT_OFF,FIELD,      UIE1F402.13     
     &              1,64,32)                                               UIE1F402.14     
          IF(IER.NE.0) THEN                                                APS2F304.16     
            ICODE=1                                                        FIELDCOS.534    
            CMESSAGE='CRAY_IBM error converting logical for IBM_FIELD'     APS2F304.17     
            RETURN                                                         FIELDCOS.536    
          ENDIF                                                            APS2F304.18     
        ENDIF                                                              FIELDCOS.537    
      ENDIF                                                                FIELDCOS.538    
                                                                           FIELDCOS.539    
CL process extra data                                                      FIELDCOS.540    
      IF (IEXTRAW.GT.0) THEN ! process extra data as got some              FIELDCOS.541    
CL init values for while loop                                              FIELDCOS.542    
        ADDR=NUM_VALUES-IEXTRAW+1 ! start address in field for extra dat   FIELDCOS.543    
        IBM_ADDR=(ADDR+1)/2                                                FIELDCOS.544    
        IF (IBM_ADDR*2.EQ.ADDR) THEN                                       FIELDCOS.545    
          BIT_OFF=32                                                       FIELDCOS.546    
        ELSE                                                               FIELDCOS.547    
          BIT_OFF=0                                                        FIELDCOS.548    
        ENDIF                                                              FIELDCOS.549    
                                                                           FIELDCOS.550    
        DO WHILE (ADDR.LT.NUM_VALUES)                                      FIELDCOS.551    
CL main while loop that works out code and then checks that code is        FIELDCOS.552    
CL ok.                                                                     FIELDCOS.553    
CL if code is ok then data_values will contain the number of REALs         PS050793.222    
CL in the vector.                                                          PS050793.223    
          IV=INT_FROM_REAL(FIELD(ADDR))                                    FIELDCOS.556    
          CALL CHECK_EXTRA(IV,DATA_VALUES,ICODE,CMESSAGE)                  FIELDCOS.557    
          IF (ICODE.NE.0) THEN                                             FIELDCOS.558    
            RETURN                                                         FIELDCOS.559    
          ENDIF                                                            FIELDCOS.560    
          IER=CRI2IBM(2,1,IBM_FIELD(IBM_ADDR),BIT_OFF,FIELD(ADDR),         UIE1F402.15     
     &              1,64,32)                                               UIE1F402.16     
C         convert the integer from cray format to ibm format               FIELDCOS.562    
          IF (IER.NE.0) THEN                                               FIELDCOS.563    
            ICODE=1                                                        FIELDCOS.564    
            CMESSAGE='CRAY_IBM: failed in integer conv of extra data'      FIELDCOS.565    
            RETURN                                                         FIELDCOS.566    
          ENDIF                                                            FIELDCOS.567    
                                                                           FIELDCOS.568    
CL         update bit_off, addr and ibm_addr                               FIELDCOS.569    
          IF (BIT_OFF.EQ.0) THEN                                           FIELDCOS.570    
            BIT_OFF=32                                                     FIELDCOS.571    
          ELSE                                                             FIELDCOS.572    
            BIT_OFF=0                                                      FIELDCOS.573    
            IBM_ADDR=IBM_ADDR+1 ! GONE ON ANOTHER WORD..                   FIELDCOS.574    
          ENDIF                                                            FIELDCOS.575    
          ADDR=ADDR+1           ! INCREMENT ADDRESS                        FIELDCOS.576    
CL now to convert REAL vector to IBM format.                               FIELDCOS.577    
          IER=CRI2IBM(3,DATA_VALUES,IBM_FIELD(IBM_ADDR),                   UIE1F402.17     
     &      BIT_OFF,FIELD(ADDR),1,64,32)                                   UIE1F402.18     
C         convert the real data values                                     FIELDCOS.580    
          IF (IER.NE.0) THEN                                               FIELDCOS.581    
            ICODE=1                                                        FIELDCOS.582    
            CMESSAGE='CRAY_IBM: FAILED IN REAL CONV OF EXTRA DATA'         FIELDCOS.583    
            RETURN                                                         FIELDCOS.584    
          ENDIF                                                            FIELDCOS.585    
CL update loop variables.                                                  FIELDCOS.586    
          ADDR=ADDR+DATA_VALUES                                            FIELDCOS.587    
          IBM_ADDR=IBM_ADDR+DATA_VALUES/2                                  FIELDCOS.588    
          IF ((DATA_VALUES/2)*2.NE.DATA_VALUES) THEN ! ODD NO. OF VALUES   FIELDCOS.589    
            IF (BIT_OFF.EQ.0) THEN                                         FIELDCOS.590    
              BIT_OFF=32                                                   FIELDCOS.591    
            ELSE                                                           FIELDCOS.592    
              BIT_OFF=0                                                    FIELDCOS.593    
              IBM_ADDR=IBM_ADDR+1 ! GONE ON ANOTHER WORD..                 FIELDCOS.594    
            ENDIF                                                          FIELDCOS.595    
          ENDIF                                                            FIELDCOS.596    
        ENDDO                   ! continue unitil run out of data....      FIELDCOS.597    
CL Verify addr and ibm_addr have correct values at end of whileloop        FIELDCOS.598    
CL first check that addr is ok                                             FIELDCOS.599    
        IF (ADDR.NE.NUM_VALUES+1) THEN                                     FIELDCOS.600    
          WRITE(CMESSAGE,109)ADDR,NUM_VALUES+1                             FIELDCOS.601    
 109      FORMAT('CRAY_IBM: addr',i5,1x,'<> num_values+1',i5)              GPB0F405.145    
          ICODE=1                                                          FIELDCOS.603    
          RETURN                                                           FIELDCOS.604    
        ENDIF                                                              FIELDCOS.605    
CL and so is ibm_addr                                                      FIELDCOS.606    
        IF (BIT_OFF.EQ.0) IBM_ADDR=IBM_ADDR-1                              FIELDCOS.607    
        IF (IBM_ADDR.NE.(NUM_VALUES+1)/2) THEN                             FIELDCOS.608    
          WRITE(CMESSAGE,110)IBM_ADDR,(NUM_VALUES+1)/2                     FIELDCOS.609    
 110      FORMAt('CRAY_IBM: ibm_addr ',i5,1x,' <> (num_values+1)/2',i5)    GPB0F405.146    
          ICODE=1                                                          FIELDCOS.611    
          RETURN                                                           FIELDCOS.612    
        ENDIF                                                              FIELDCOS.613    
      ENDIF ! end processing of extra data                                 FIELDCOS.614    
                                                                           FIELDCOS.615    
      WRITE(COS_PPUNIT) IBM_LABEL                                          PS050793.224    
      IF(PACKED) THEN                                                      FIELDCOS.617    
        WRITE(COS_PPUNIT) (FIELD(I),I=1,ILABEL(LBLREC)/2)                  PS050793.225    
      ELSE                                                                 FIELDCOS.619    
        WRITE(COS_PPUNIT) IBM_FIELD                                        FIELDCOS.620    
      ENDIF                                                                FIELDCOS.621    
C                                                                          FIELDCOS.622    
  100 FORMAT('  WRITING COS FILE for IPROJ ITYPE FCT LEVEL',4I6)           FIELDCOS.623    
CL  The last field has been processed. An extra field is now written       FIELDCOS.624    
CL  to act as a delimeter for the M08 software. This extra fields is       FIELDCOS.625    
CL  a duplicate,but with a PP field code of -99 .                          FIELDCOS.626    
      IF(LAST) THEN                                                        FIELDCOS.627    
        WRITE(6,101)                                                       FIELDCOS.629    
  101   FORMAT('  WRITING LAST RECORD IN THE COS FILE ')                   FIELDCOS.630    
        ILABEL(LBFC)=-99                                                   PS050793.226    
CL Convert ILABEL to IBM(Hitachi) Integers                                 PS050793.227    
        BIT_OFF = 0                                                        PS050793.228    
        IBM_ADDR=1                                                         PS050793.229    
        IER = CRI2IBM(2,LEN_ILABEL,IBM_LABEL(IBM_ADDR),BIT_OFF,ILABEL,     UIE1F402.19     
     &              1,64,32)                                               UIE1F402.20     
        IF(IER.NE.0) THEN                                                  PS050793.231    
          ICODE=1                                                          PS050793.232    
          CMESSAGE=' CRAY_IBM error converting INT for IBM_LABEL'          PS050793.233    
          RETURN                                                           PS050793.234    
        ENDIF                                                              PS050793.235    
CL Convert RLABEL to IBM(Hitachi) Real.                                    PS050793.236    
        IBM_ADDR=LEN_ILABEL/2                                              PS050793.237    
        IF(IBM_ADDR*2.NE.LEN_ILABEL) BIT_OFF=32                            PS050793.238    
        IBM_ADDR=IBM_ADDR+1                                                PS050793.239    
        IER = CRI2IBM(3,LEN_RLABEL,IBM_LABEL(IBM_ADDR),BIT_OFF,RLABEL,     UIE1F402.21     
     &              1,64,32)                                               UIE1F402.22     
        IF(IER.NE.0) THEN                                                  PS050793.241    
          ICODE=1                                                          PS050793.242    
          CMESSAGE=' CRAY_IBM error converting REAL for IBM_LABEL'         PS050793.243    
          RETURN                                                           PS050793.244    
        ENDIF                                                              PS050793.245    
        WRITE(COS_PPUNIT) IBM_LABEL                                        PS050793.246    
      IF(PACKED) THEN                                                      FIELDCOS.639    
        WRITE(COS_PPUNIT) (FIELD(I),I=1,ILABEL(LBLREC)/2)                  PS050793.247    
      ELSE                                                                 FIELDCOS.641    
        WRITE(COS_PPUNIT) IBM_FIELD                                        FIELDCOS.642    
      ENDIF                                                                FIELDCOS.643    
      ENDIF                                                                FIELDCOS.644    
 9999 CONTINUE                                                             FIELDCOS.645    
      RETURN                                                               FIELDCOS.646    
      END                                                                  FIELDCOS.647    
                                                                           FIELDCOS.648    
CLL  Routine: CRAY_VAX-------------------------------------------------    FIELDCOS.649    
CLL                                                                        FIELDCOS.650    
CLL  Purpose: To read a   direct access PP file  and convert it to a       FIELDCOS.651    
CLL  sequential file read to be passed in VAX format                       FIELDCOS.652    
CLL                                                                        FIELDCOS.653    
CLL  Tested under compiler:   cft77                                        FIELDCOS.654    
CLL  Tested under OS version:                                              FIELDCOS.655    
CLL                                                                        FIELDCOS.656    
CLL  Author:   P.J .Smith         Date: 26 June  1992                      FIELDCOS.657    
CLL                                                                        FIELDCOS.658    
CLL  Model            Modification history from model version 3.0:         FIELDCOS.659    
CLL version  Date                                                          FIELDCOS.660    
CLL                                                                        FIELDCOS.661    
CLL  Programming standard: UM Doc Paper 3, version 1 (15/1/90)             FIELDCOS.662    
CLL                                                                        FIELDCOS.663    
CLL  Logical components covered: C41                                       FIELDCOS.664    
CLL                                                                        FIELDCOS.665    
CLL  Project task: C4                                                      FIELDCOS.666    
CLL                                                                        FIELDCOS.667    
CLL  External documentation:                                               FIELDCOS.668    
CLL                                                                        FIELDCOS.669    
CLL  -------------------------------------------------------------------   FIELDCOS.670    
C*L  Interface and arguments: ------------------------------------------   FIELDCOS.671    
C                                                                          FIELDCOS.672    

      SUBROUTINE CRAY_VAX(IDIM,NUM_VALUES,PPUNIT,                           1,16FIELDCOS.673    
     &             LEN1_LOOKUP,PP_LEN2_LOOKUP,PP_FIXHD,LOOKUP,             FIELDCOS.674    
     &             ROOKUP,ENTRY_NO,DATA_ADD,MODEL_FLAG,                    PS050793.248    
     &             COS_PPUNIT,IEXTRA,IEXTRAW,LAST,OPER,                    PS050793.249    
     &             ICODE,CMESSAGE,LCAL360)                                 GSS1F304.305    
      IMPLICIT NONE                                                        FIELDCOS.677    
C     Arguments                                                            PS050793.251    
      CHARACTER                                                            PS050793.252    
     &     CMESSAGE*(*)           !OUT error messages                      PS050793.253    
      LOGICAL                                                              PS050793.254    
     &     LAST                   !IN indicates last record process        PS050793.255    
     &    ,OPER                   !IN indicates whether operational        PS050793.256    
     &    ,MODEL_FLAG             !IN True => dumps, False => fieldsfile   PS050793.257    
     &    ,LCAL360                                                         GSS1F304.306    
      INTEGER                                                              PS050793.258    
     &     PPUNIT                 !IN unit no of required fieldsfile       PS050793.259    
     &    ,COS_PPUNIT             !IN unit no of COS output file           PS050793.260    
     &    ,NUM_VALUES             !IN No of data points NROWS*NCOLS        PS050793.261    
     &    ,IDIM                   !IN NUM_VALUES rounded to an even no     PS050793.262    
C                                 !  used to dimension The output array    PS050793.263    
     &    ,DATA_ADD               !IN The word address of the data.        PS050793.264    
     &    ,LEN1_LOOKUP            !IN First dimension of the lookup        PS050793.265    
     &    ,PP_LEN2_LOOKUP         !IN Size of the LOOKUP on the file       PS050793.266    
     &    ,IEXTRA(10)             !IN Used within READFF                   PS050793.267    
     &    ,IEXTRAW                !IN no of words of extra data.           PS050793.268    
     &    ,ENTRY_NO               !IN Lookup entry no of the Field.        PS050793.269    
     &    ,PP_FIXHD(*)            !IN PPfile fixed header                  PS050793.270    
     &    ,LOOKUP(LEN1_LOOKUP,PP_LEN2_LOOKUP)  !IN integer lookup          PS050793.271    
     &    ,ICODE                  !OUT error code                          PS050793.272    
      REAL                                                                 PS050793.273    
     &     ROOKUP(LEN1_LOOKUP,PP_LEN2_LOOKUP)  !IN Real lookup             PS050793.274    
C*---------------------------------------------------------------------    PS050793.275    
C     Called routines                                                      PS050793.276    
      EXTERNAL READFF,INT_FROM_REAL,CRAY2VAX,TIME2SEC,SEC2TIME             PS050793.277    
      INTEGER INT_FROM_REAL,CRAY2VAX                                       FIELDCOS.679    
C*---------------------------------------------------------------------    PS050793.278    
C     arguments for called routines                                        PS050793.279    
      INTEGER                                                              FIELDCOS.683    
     &     MAX_LEN_ILABEL                                                  PS050793.280    
     &    ,MAX_LEN_RLABEL                                                  PS050793.281    
      PARAMETER (MAX_LEN_ILABEL=45,MAX_LEN_RLABEL=32)                      PS050793.282    
      INTEGER                                                              FIELDCOS.699    
     &     END_YEAR        ! )                                             PS050793.283    
     &    ,END_MONTH       ! )                                             PS050793.284    
     &    ,END_DAY         ! )  arguments                                  PS050793.285    
     &    ,END_HOUR        ! )                                             PS050793.286    
     &    ,END_MINUTE      ! )     for                                     PS050793.287    
     &    ,END_SECOND      ! )                                             PS050793.288    
     &    ,END_DAY_NUMBER  ! )                                             TJ080294.61     
     &    ,END_TIME_DAYS   ! )                                             TJ080294.62     
     &    ,END_TIME_SECS   ! )  date/time                                  PS050793.289    
     &    ,START_TIME_SECS ! )                                             PS050793.290    
     &    ,START_TIME_DAYS ! )                                             TJ080294.63     
     &    ,DATA_YEAR       ! )  conversion                                 PS050793.291    
     &    ,DATA_MONTH      ! )                                             PS050793.292    
     &    ,DATA_DAY        ! )     when                                    PS050793.293    
     &    ,DATA_HOUR       ! )                                             PS050793.294    
     &    ,DATA_MINUTE     ! )  OPER is TRUE                               PS050793.295    
     &    ,DATA_SECOND     ! )                                             PS050793.296    
     &    ,DATA_DAY_NUMBER ! )                                             PS050793.297    
     &    ,ADDR            ! address in fld, used to process extra data    PS050793.298    
     &    ,VAX_ADDR        ! address in VAX fld where extra data going.    PS050793.299    
     &    ,BIT_OFF         ! what bit offset are we using                  PS050793.300    
C                            (32 for odd, 0 for even values of addr)       PS050793.301    
     &    ,IER             ! error RETURN CODE from conversion             PS050793.302    
     &    ,IV              ! value of integer code for vectors             PS050793.303    
     &    ,LEN_ILABEL      ! number of values in ILABEL                    PS050793.304    
     &    ,LEN_RLABEL      ! number of values in RLABEL                    PS050793.305    
     &    ,DATA_VALUES     ! number of values in real extra data           PS050793.306    
     &    ,ILABEL(MAX_LEN_ILABEL)       ! holds integer part of LOOKUP     PS050793.307    
     &    ,VAX_LABEL((LEN1_LOOKUP+1)/2) ! holds VAX conversion of LABEL    PS050793.308    
                                                                           PS050793.309    
      REAL                                                                 FIELDCOS.702    
     &     FIELD(IDIM)            ! array holding data                     PS050793.310    
     &    ,VAX_FIELD(IDIM/2)      ! array holding VAX data                 PS050793.311    
     &    ,RLABEL(MAX_LEN_RLABEL) ! holds real part of LOOKUP              PS050793.312    
                                                                           PS050793.313    
*CALL CLOOKADD                                                             PS050793.314    
C*---------------------------------------------------------------------    FIELDCOS.708    
C    LOCAL VARIABLES                                                       FIELDCOS.709    
      INTEGER                                                              FIELDCOS.710    
     &     I              ! local counter                                  PS050793.315    
     &    ,PACK_TYPE      ! packing type N1 of LBPACK                      PS050793.316    
     &    ,DATA_COMP      ! data compression code                          FIELDCOS.739    
     &    ,DATA_COMP_DEF  ! data compression definition                    FIELDCOS.740    
     &    ,NUMBER_FORMAT  ! number format                                  FIELDCOS.741    
     &    ,FCST_PRD                                                        PS050793.317    
                                                                           FIELDCOS.742    
      LOGICAL PACKED      ! indicates whether the data is packed           PS050793.318    
                                                                           FIELDCOS.744    
C                                                                          PS050793.319    
                                                                           FIELDCOS.746    
      DO 1 I=1,IDIM      ! make sure FIELD is initialised. An odd          FIELDCOS.747    
      FIELD(I)=0.0       ! number of points might upset conversion         FIELDCOS.748    
    1 CONTINUE                                                             FIELDCOS.749    
      PACKED=.FALSE.                                                       FIELDCOS.750    
C                                                                          PS050793.320    
CL access the Fields File.                                                 FIELDCOS.752    
      CALL READFF(PPUNIT,FIELD,IDIM,ENTRY_NO,                              FIELDCOS.753    
     *ILABEL,RLABEL,IEXTRA,PP_LEN2_LOOKUP,LEN1_LOOKUP,                     FIELDCOS.754    
     *PP_FIXHD,LOOKUP,ROOKUP,DATA_ADD,                                     PS050793.321    
     *MODEL_FLAG,MAX_LEN_ILABEL,MAX_LEN_RLABEL,                            PS050793.322    
     *LEN_ILABEL,LEN_RLABEL,                                               PS050793.323    
     *ICODE,CMESSAGE)                                                      PS050793.324    
C                                                                          FIELDCOS.756    
      IF(ICODE.NE.0) RETURN                                                FIELDCOS.757    
                                                                           FIELDCOS.758    
C-----------------------------------------------------------------         FIELDCOS.759    
                                                                           FIELDCOS.760    
C The data has now been read in and has 1) Been read in packed             FIELDCOS.761    
C and left packed or 2) read in as packed and then un-packed or            FIELDCOS.762    
C 3) The data was never packed at all.  If packed FIELD will have          FIELDCOS.763    
C LBLREC/2 values if a DUMP and LBLREC values if a PP_FILE. If             FIELDCOS.764    
C the data is not packed FIELD will have the no of data points             FIELDCOS.765    
C length LBROW*LBNPT+LBEXT if a pp_file and LBLREC if a dump file.         FIELDCOS.766    
C                                                                          FIELDCOS.767    
C For a dump LBLREC will hold origonal no of data points.  For a           FIELDCOS.768    
C pp_file LBLREC will hold the no of CRAY words needed to hold             FIELDCOS.769    
C the data (if un-packed also no of data points)                           FIELDCOS.770    
C                                                                          FIELDCOS.771    
C The value returned in ILABEL(LBLREC) may have to change because          FIELDCOS.772    
C VAX only has a 32 bit word length compared to the CRAY's 64              FIELDCOS.773    
C bit word length. In VAX ILABEL(LBLREC) will be no of 32 bit              FIELDCOS.774    
C words needed to hold the data . If the data is not packed (or            FIELDCOS.775    
C it has been un-packed) then this will be the no of data points.          FIELDCOS.776    
C If the data is left packed the value of ILABEL(LBLREC)                   FIELDCOS.777    
C will have to be doubled as the no of 32bit words needed to               FIELDCOS.778    
C hold the data will twice that on the CRAY.                               FIELDCOS.779    
                                                                           FIELDCOS.780    
C On output the data will either have been converted to VAX                FIELDCOS.781    
C numbers and stored in VAX_FIELD or left packed in FIELD,but with         FIELDCOS.782    
C 32 bit VAX numbers substituted into minimum values.                      FIELDCOS.783    
C If packed then LBLREC/2  words of FIELD are written as LBLREC is         FIELDCOS.784    
C now the no of 32 bit words. If un-packed VAX_FIELD which has size        FIELDCOS.785    
C IDIM/2 (or NUM_VALUES/2) is written as it is.                            FIELDCOS.786    
                                                                           FIELDCOS.787    
C-----------------------------------------------------------------         FIELDCOS.788    
c     decode LBPACK                                                        FIELDCOS.789    
      PACK_TYPE = MOD(ILABEL(LBPACK),10)                                   FIELDCOS.790    
      DATA_COMP = MOD(ILABEL(LBPACK),100) - PACK_TYPE                      FIELDCOS.791    
      DATA_COMP_DEF = MOD(ILABEL(LBPACK),1000) -DATA_COMP -PACK_TYPE       FIELDCOS.792    
      NUMBER_FORMAT = ILABEL(LBPACK)/1000                                  FIELDCOS.793    
                                                                           FIELDCOS.794    
      IF(PACK_TYPE.GT.0) PACKED=.TRUE.                                     FIELDCOS.795    
      IF(PACKED) THEN              ! Data left in packed form. Number of   PS290193.4      
        ILABEL(LBLREC)=ILABEL(LBLREC)*2  ! VAX words needed is 2*CRAY      PS290193.5      
      ENDIF                                                                FIELDCOS.806    
C verify that don't have extra data and packing at once                    FIELDCOS.807    
      IF (IEXTRAW.GT.0.AND.PACKED) THEN                                    FIELDCOS.808    
        CMESSAGE='FIELDCOS: Extra data with packing not supported'         FIELDCOS.809    
        ICODE=1                                                            FIELDCOS.810    
        RETURN                                                             FIELDCOS.811    
      ENDIF                                                                FIELDCOS.812    
                                                                           FIELDCOS.813    
CL Convert ILABEL to VAX integers.                                         PS050793.325    
C For either an accumulation or time mean (ie LBTIM.ne.0) the start &      FIELDCOS.815    
C end time are in a different order to the data and veri time for a        FIELDCOS.816    
C snap shot type field. This anomaly has to be catered for operational     FIELDCOS.817    
C use. Thus the PP package will not work properly on accum/time mn field   FIELDCOS.818    
C for operational Fields files.                                            FIELDCOS.819    
      IF(ILABEL(LBTIM).NE.11.AND.OPER) THEN                                PS050793.326    
C       re -calculate the data time from the end time  and fcst period     FIELDCOS.821    
C     First calculate the no of seconds from day 0                         FIELDCOS.822    
        END_YEAR=ILABEL(LBYRD)                                             FIELDCOS.823    
        END_MONTH=ILABEL(LBMOND)                                           FIELDCOS.824    
        END_DAY=ILABEL(LBDATD)                                             FIELDCOS.825    
        END_HOUR=ILABEL(LBHRD)                                             FIELDCOS.826    
        END_MINUTE=ILABEL(LBMIND)                                          FIELDCOS.827    
        END_DAY_NUMBER=ILABEL(LBDAYD)                                      TJ080294.78     
        END_SECOND=0                                                       PS190494.4      
        FCST_PRD=ILABEL(LBFT)                                              FIELDCOS.829    
C       WRITE(6,*)' START YR/MO/DA/HR/MIN BEFORE ',ILABEL(1),ILABEL(2),    GIE0F403.172    
C    *  ILABEL(3),ILABEL(4),ILABEL(5)                                      FIELDCOS.831    
C       WRITE(6,*)' END   YR/MO/DA/HR/MIN BEFORE ',ILABEL(7),ILABEL(8),    GIE0F403.173    
C    *  ILABEL(9),ILABEL(10),ILABEL(11)                                    FIELDCOS.833    
C       WRITE(6,*)' FCST_PRD BEFORE  ',FCST_PRD                            GIE0F403.174    
        CALL TIME2SEC (END_YEAR,END_MONTH,END_DAY,END_HOUR,                FIELDCOS.835    
     *               END_MINUTE,END_SECOND,0,0,                            TJ080294.64     
     *               END_TIME_DAYS,END_TIME_SECS,LCAL360)                  GSS1F304.307    
                                                                           FIELDCOS.837    
C   Subtract forecast hours from end time in (days,seconds)                TJ080294.88     
                                                                           TJ080294.89     
       CALL TIME_DF(END_TIME_DAYS,END_TIME_SECS,0,-FCST_PRD*3600,          TJ080294.90     
     *              START_TIME_DAYS,START_TIME_SECS)                       TJ080294.91     
                                                                           FIELDCOS.839    
C     Go back and re-calculate Year/Month/Day/Hour/Sec.                    FIELDCOS.840    
       CALL SEC2TIME(0,0,START_TIME_DAYS,START_TIME_SECS,                  TJ080294.66     
     *             DATA_YEAR,DATA_MONTH,DATA_DAY,                          TJ080294.67     
     *             DATA_HOUR,DATA_MINUTE,DATA_SECOND,DATA_DAY_NUMBER,      GSS1F304.308    
     *             LCAL360)                                                GSS1F304.309    
        ILABEL(LBYRD)=DATA_YEAR                                            FIELDCOS.844    
        ILABEL(LBMOND)=DATA_MONTH                                          FIELDCOS.845    
        ILABEL(LBDATD)=DATA_DAY                                            FIELDCOS.846    
        ILABEL(LBHRD)=DATA_HOUR                                            FIELDCOS.847    
        ILABEL(LBMIND)=DATA_MINUTE                                         FIELDCOS.848    
        ILABEL(LBDAYD)=DATA_DAY_NUMBER                                     TJ080294.79     
        ILABEL(LBYR)=END_YEAR                                              FIELDCOS.849    
        ILABEL(LBMON)=END_MONTH                                            FIELDCOS.850    
        ILABEL(LBDAT)=END_DAY                                              FIELDCOS.851    
        ILABEL(LBHR)=END_HOUR                                              FIELDCOS.852    
        ILABEL(LBMIN)=END_MINUTE                                           FIELDCOS.853    
        ILABEL(LBDAY)=END_DAY_NUMBER                                       TJ080294.80     
C       WRITE(6,*)' -----------------------------------------------'       GIE0F403.175    
C       WRITE(6,*)' Veri  YR/MO/DA/HR/MIN AFTER ',ILABEL(1),ILABEL(2),     GIE0F403.176    
C    *  ILABEL(3),ILABEL(4),ILABEL(5)                                      FIELDCOS.856    
C       WRITE(6,*)' Data  YR/MO/DA/HR/MIN AFTER ',ILABEL(7),ILABEL(8),     GIE0F403.177    
C    *  ILABEL(9),ILABEL(10),ILABEL(11)                                    FIELDCOS.858    
C       WRITE(6,*)' FCST_PRD AFTER   ',FCST_PRD                            GIE0F403.178    
C       WRITE(6,*)' -----------------------------------------------'       GIE0F403.179    
C       WRITE(6,*)' -----------------------------------------------'       GIE0F403.180    
      ENDIF                                                                FIELDCOS.862    
                                                                           FIELDCOS.863    
C     data now in vax format                                               FIELDCOS.864    
      ILABEL(LBPACK) = ILABEL(LBPACK) - NUMBER_FORMAT*1000 + 5000          FIELDCOS.865    
                                                                           FIELDCOS.866    
CL Convert ILABEL to VAX Integer                                           PS050793.327    
      BIT_OFF=0                                                            FIELDCOS.867    
      VAX_ADDR = 1                                                         PS050793.328    
      IER=CRAY2VAX(1,LEN_ILABEL,VAX_LABEL(VAX_ADDR),BIT_OFF,ILABEL)        PS050793.329    
        IF(IER.NE.0) THEN                                                  FIELDCOS.869    
          ICODE=1                                                          FIELDCOS.870    
          CMESSAGE=' FUNCTION CRAY2VAX not supported on T3E'               UIE1F402.30     
          RETURN                                                           FIELDCOS.872    
        ENDIF                                                              FIELDCOS.873    
CL Convert RLABEL to VAX   Real.                                           FIELDCOS.874    
      VAX_ADDR=LEN_ILABEL/2                                                PS050793.330    
      IF(VAX_ADDR*2.NE.LEN_ILABEL) BIT_OFF=32                              PS050793.331    
      VAX_ADDR=VAX_ADDR+1                                                  PS050793.332    
      IER=CRAY2VAX(2,LEN_RLABEL,VAX_LABEL(VAX_ADDR),BIT_OFF,RLABEL)        PS050793.333    
        IF(IER.NE.0) THEN                                                  FIELDCOS.877    
          ICODE=1                                                          FIELDCOS.878    
          CMESSAGE=' FUNCTION CRAY2VAX not supported on T3E'               UIE1F402.31     
          RETURN                                                           FIELDCOS.880    
        ENDIF                                                              FIELDCOS.881    
      BIT_OFF=0                                                            PS050793.334    
      IF(.NOT.PACKED) THEN                                                 FIELDCOS.882    
CL Convert Real DATA to VAX Real if not packed.                            FIELDCOS.883    
        IF(ILABEL(DATA_TYPE).EQ.1) THEN         ! Data Type Real           FIELDCOS.884    
        if(ilabel(32).eq.74) then                                          APS2F304.19     
          WRITE(6,*)'convert type 74 as logical and reset datatype'        GIE0F403.181    
          IER = CRAY2VAX(5,NUM_VALUES-IEXTRAW,VAX_FIELD,BIT_OFF,FIELD)     APS2F304.21     
          ILABEL(DATA_TYPE) = 3                                            APS2F304.22     
        else                                                               APS2F304.23     
          IER=CRAY2VAX(2,NUM_VALUES-IEXTRAW,VAX_FIELD,BIT_OFF,FIELD)       FIELDCOS.885    
          IF(IER.NE.0) THEN                                                FIELDCOS.886    
            ICODE=1                                                        FIELDCOS.887    
            CMESSAGE='CRAY_VAX error converting REAL for VAX_FIELD'        FIELDCOS.888    
            RETURN                                                         FIELDCOS.889    
          ENDIF                                                            FIELDCOS.890    
        endif                                                              APS2F304.24     
CL Convert Integer data to VAX Integer.                                    FIELDCOS.891    
        ELSEIF(ILABEL(DATA_TYPE).EQ.2) THEN     ! Data Type Integer        FIELDCOS.892    
          IER=CRAY2VAX(1,NUM_VALUES-IEXTRAW,VAX_FIELD,BIT_OFF,FIELD)       FIELDCOS.893    
          IF(IER.NE.0) THEN                                                FIELDCOS.894    
            ICODE=1                                                        FIELDCOS.895    
            CMESSAGE='CRAY_VAX error calling USICTI for VAX_FIELD'         FIELDCOS.896    
            RETURN                                                         FIELDCOS.897    
          ENDIF                                                            FIELDCOS.898    
        ELSEIF(ILABEL(DATA_TYPE).EQ.3) THEN     ! Data Type Logical        FIELDCOS.899    
          IER = CRAY2VAX(5,NUM_VALUES-IEXTRAW,VAX_FIELD,BIT_OFF,FIELD)     APS2F304.25     
          IF(IER.NE.0) THEN                                                APS2F304.26     
            ICODE=1                                                        FIELDCOS.900    
            CMESSAGE='CRAY_VAX error converting logical for VAX_FIELD'     APS2F304.27     
            RETURN                                                         FIELDCOS.902    
          ENDIF                                                            APS2F304.28     
        ENDIF                                                              FIELDCOS.903    
      ELSE                                                                 FIELDCOS.904    
        WRITE(6,*)'WARNING ! WGDOS packed data contains IBM reals'         GIE0F403.182    
                                                                           FIELDCOS.906    
c       code to be added here to convert ibm reals in packed data          FIELDCOS.907    
c       to VAX reals                                                       FIELDCOS.908    
                                                                           FIELDCOS.909    
      ENDIF                                                                FIELDCOS.910    
CL process extra data                                                      FIELDCOS.911    
      IF (IEXTRAW.GT.0) THEN ! process extra data as got some              FIELDCOS.912    
CL init values for while loop                                              FIELDCOS.913    
        ADDR=NUM_VALUES-IEXTRAW+1 ! start address in field for extra dat   FIELDCOS.914    
        VAX_ADDR=(ADDR+1)/2                                                FIELDCOS.915    
        IF (VAX_ADDR*2.EQ.ADDR) THEN                                       FIELDCOS.916    
          BIT_OFF=32                                                       FIELDCOS.917    
        ELSE                                                               FIELDCOS.918    
          BIT_OFF=0                                                        FIELDCOS.919    
        ENDIF                                                              FIELDCOS.920    
                                                                           FIELDCOS.921    
        DO WHILE (ADDR.LT.NUM_VALUES)                                      FIELDCOS.922    
CL main while loop that works out code and then checks that code is        FIELDCOS.923    
CL ok.                                                                     FIELDCOS.924    
CL if code is ok then data_values weill contain the number of REAL entri   FIELDCOS.925    
CL the vector.                                                             FIELDCOS.926    
          IV=INT_FROM_REAL(FIELD(ADDR))                                    FIELDCOS.927    
          CALL CHECK_EXTRA(IV,DATA_VALUES,ICODE,CMESSAGE)                  FIELDCOS.928    
          IF (ICODE.NE.0) THEN                                             FIELDCOS.929    
            RETURN                                                         FIELDCOS.930    
          ENDIF                                                            FIELDCOS.931    
          IER=CRAY2VAX(1,1,VAX_FIELD(VAX_ADDR),BIT_OFF,FIELD(ADDR))        FIELDCOS.932    
C         convert the integer from cray format to VAX format               FIELDCOS.933    
          IF (IER.NE.0) THEN                                               FIELDCOS.934    
            ICODE=1                                                        FIELDCOS.935    
            CMESSAGE='CRAY_VAX: FAILED IN INTEGER CONV OF EXTRA DATA'      FIELDCOS.936    
            RETURN                                                         FIELDCOS.937    
          ENDIF                                                            FIELDCOS.938    
                                                                           FIELDCOS.939    
CL         update bit_off, addr and VAX_addr                               FIELDCOS.940    
          IF (BIT_OFF.EQ.0) THEN                                           FIELDCOS.941    
            BIT_OFF=32                                                     FIELDCOS.942    
          ELSE                                                             FIELDCOS.943    
            BIT_OFF=0                                                      FIELDCOS.944    
            VAX_ADDR=VAX_ADDR+1 ! gone on another word..                   FIELDCOS.945    
          ENDIF                                                            FIELDCOS.946    
          ADDR=ADDR+1             ! increment address                      FIELDCOS.947    
CL now to convert REAL vector to VAX format.                               FIELDCOS.948    
          IER=CRAY2VAX(2,DATA_VALUES,VAX_FIELD(VAX_ADDR),                  FIELDCOS.949    
     &      BIT_OFF,FIELD(ADDR))                                           FIELDCOS.950    
C         convert the real data values                                     FIELDCOS.951    
          IF (IER.NE.0) THEN                                               FIELDCOS.952    
            ICODE=1                                                        FIELDCOS.953    
            CMESSAGE='CRAY_VAX: FAILED IN REAL CONV OF EXTRA DATA'         FIELDCOS.954    
            RETURN                                                         FIELDCOS.955    
          ENDIF                                                            FIELDCOS.956    
CL update loop variables.                                                  FIELDCOS.957    
          ADDR=ADDR+DATA_VALUES                                            FIELDCOS.958    
          VAX_ADDR=VAX_ADDR+DATA_VALUES/2                                  FIELDCOS.959    
          IF ((DATA_VALUES/2)*2.NE.DATA_VALUES) THEN ! odd no. of values   FIELDCOS.960    
            IF (BIT_OFF.EQ.0) THEN                                         FIELDCOS.961    
              BIT_OFF=32                                                   FIELDCOS.962    
            ELSE                                                           FIELDCOS.963    
              BIT_OFF=0                                                    FIELDCOS.964    
              VAX_ADDR=VAX_ADDR+1 ! gone on another word..                 FIELDCOS.965    
            ENDIF                                                          FIELDCOS.966    
          ENDIF                                                            FIELDCOS.967    
        ENDDO                   ! continue unitil run out of data....      FIELDCOS.968    
CL Verify addr and VAX_addr have correct values at end of whileloop        FIELDCOS.969    
CL first check that addr is ok                                             FIELDCOS.970    
        IF (ADDR.NE.NUM_VALUES+1) THEN                                     FIELDCOS.971    
          WRITE(CMESSAGE,109)ADDR,NUM_VALUES+1                             FIELDCOS.972    
 109      FORMAT('CRAY_VAX: ADDR',I5,1X,'<> NUM_VALUES+1',I5)              GPB0F405.147    
          ICODE=1                                                          FIELDCOS.974    
          RETURN                                                           FIELDCOS.975    
        ENDIF                                                              FIELDCOS.976    
CL and so is VAX_addr                                                      FIELDCOS.977    
        IF (BIT_OFF.EQ.0) VAX_ADDR=VAX_ADDR-1                              FIELDCOS.978    
        IF (VAX_ADDR.NE.(NUM_VALUES+1)/2) THEN                             FIELDCOS.979    
          WRITE(CMESSAGE,110)VAX_ADDR,(NUM_VALUES+1)/2                     FIELDCOS.980    
 110      FORMAT('CRAY_VAX: VAX_ADDR ',I5,1X,' <> (NUM_VALUES+1)/2',I5)    GPB0F405.148    
          ICODE=1                                                          FIELDCOS.982    
          RETURN                                                           FIELDCOS.983    
        ENDIF                                                              FIELDCOS.984    
      ENDIF ! end processing of extra data                                 FIELDCOS.985    
                                                                           FIELDCOS.986    
      IF(PACKED) THEN                                                      FIELDCOS.987    
        WRITE(COS_PPUNIT) VAX_LABEL                                        PS050793.336    
        WRITE(COS_PPUNIT) (FIELD(I),I=1,ILABEL(LBLREC)/2)                  PS050793.337    
c       WRITE(6,111) VAX_LABEL                                             PS050793.338    
c       WRITE(6,111) (FIELD(I),I=1,50)                                     PS050793.339    
      ELSE                                                                 FIELDCOS.991    
        WRITE(COS_PPUNIT) VAX_LABEL                                        PS050793.340    
        WRITE(COS_PPUNIT) VAX_FIELD                                        FIELDCOS.993    
c       WRITE(6,111) VAX_LABEL                                             PS050793.341    
c       WRITE(6,111) (VAX_FIELD(I),I=1,50)                                 PS050793.342    
      ENDIF                                                                FIELDCOS.994    
  111 FORMAT(1X,5Z16)                                                      PS050793.343    
C                                                                          FIELDCOS.995    
  100 FORMAT('  WRITING COS FILE for IPROJ ITYPE FCT LEVEL',4I6)           FIELDCOS.996    
CL  The last field has been processed. An extra field is now written       FIELDCOS.997    
CL  to act as a delimeter for the M08 software. This extra fields is       FIELDCOS.998    
CL  a duplicate,but with a PP field code of -99 .                          FIELDCOS.999    
      IF(LAST) THEN                                                        FIELDCOS.1000   
        BIT_OFF = 0                                                        FIELDCOS.1001   
        WRITE(6,101)                                                       FIELDCOS.1002   
  101   FORMAT('  WRITING LAST RECORD IN THE COS FILE ')                   FIELDCOS.1003   
        ILABEL(23)=-99                                                     FIELDCOS.1004   
CL Convert ILABEL to VAX Integer                                           PS050793.344    
        BIT_OFF=0                                                          PS050793.345    
        VAX_ADDR = 1                                                       PS050793.346    
        IER=CRAY2VAX(1,LEN_ILABEL,VAX_LABEL(VAX_ADDR),BIT_OFF,ILABEL)      PS050793.347    
          IF(IER.NE.0) THEN                                                FIELDCOS.1006   
            ICODE=1                                                        FIELDCOS.1007   
            CMESSAGE=' FUNCTION CRAY2VAX not supported on T3E'             UIE1F402.32     
            RETURN                                                         FIELDCOS.1009   
          ENDIF                                                            FIELDCOS.1010   
CL Convert RLABEL to VAX   Real.                                           PS050793.348    
        VAX_ADDR=LEN_ILABEL/2                                              PS050793.349    
        IF(VAX_ADDR*2.NE.LEN_ILABEL) BIT_OFF=32                            PS050793.350    
        VAX_ADDR=VAX_ADDR+1                                                PS050793.351    
        IER=CRAY2VAX(2,LEN_RLABEL,VAX_LABEL(VAX_ADDR),BIT_OFF,RLABEL)      PS050793.352    
          IF(IER.NE.0) THEN                                                PS050793.353    
            ICODE=1                                                        PS050793.354    
            CMESSAGE=' FUNCTION CRAY2VAX not supported on T3E'             UIE1F402.33     
            RETURN                                                         PS050793.356    
          ENDIF                                                            PS050793.357    
      IF(PACKED) THEN                                                      FIELDCOS.1011   
        WRITE(COS_PPUNIT) VAX_LABEL                                        PS050793.358    
        WRITE(COS_PPUNIT) (FIELD(I),I=1,ILABEL(LBLREC)/2)                  PS050793.359    
      ELSE                                                                 FIELDCOS.1014   
        WRITE(COS_PPUNIT) VAX_LABEL                                        PS050793.360    
        WRITE(COS_PPUNIT) VAX_FIELD                                        FIELDCOS.1016   
      ENDIF                                                                FIELDCOS.1017   
      ENDIF                                                                FIELDCOS.1018   
 9999 CONTINUE                                                             FIELDCOS.1019   
      RETURN                                                               FIELDCOS.1020   
      END                                                                  FIELDCOS.1021   
                                                                           FIELDCOS.1022   
CLL  Routine: CRAY_IEEE-------------------------------------------------   FIELDCOS.1023   
CLL                                                                        FIELDCOS.1024   
CLL  Purpose: To read a   direct access PP file  and convert it to a       FIELDCOS.1025   
CLL  sequential file read to be passed in IEEE format                      FIELDCOS.1026   
CLL                                                                        FIELDCOS.1027   
CLL  Author:   P.J .Smith         Date: 26 June  1992                      FIELDCOS.1028   
CLL                                                                        FIELDCOS.1029   
CLL  Tested under compiler:   cft77                                        FIELDCOS.1030   
CLL  Tested under OS version:                                              FIELDCOS.1031   
CLL                                                                        FIELDCOS.1032   
CLL  Model            Modification history from model version 3.0:         FIELDCOS.1033   
CLL version  Date                                                          FIELDCOS.1034   
CLL                                                                        FIELDCOS.1035   
CLL  Programming standard: UM Doc Paper 3, version 1 (15/1/90)             FIELDCOS.1036   
CLL                                                                        FIELDCOS.1037   
CLL  Logical components covered: C41                                       FIELDCOS.1038   
CLL                                                                        FIELDCOS.1039   
CLL  Project task: C4                                                      FIELDCOS.1040   
CLL                                                                        FIELDCOS.1041   
CLL  External documentation:                                               FIELDCOS.1042   
CLL                                                                        FIELDCOS.1043   
CLL  -------------------------------------------------------------------   FIELDCOS.1044   
C*L  Interface and arguments: ------------------------------------------   FIELDCOS.1045   
C                                                                          FIELDCOS.1046   

      SUBROUTINE CRAY_IEEE(IDIM,NUM_VALUES,PPUNIT,                          1,6FIELDCOS.1047   
     &             LEN1_LOOKUP,PP_LEN2_LOOKUP,PP_FIXHD,LOOKUP,             FIELDCOS.1048   
     &             ROOKUP,ENTRY_NO,DATA_ADD,MODEL_FLAG,                    PS050793.361    
     &             COS_PPUNIT,IEXTRA,IEXTRAW,LAST,OPER,                    PS050793.362    
     &             ICODE,CMESSAGE,LCAL360)                                 GSS1F304.310    
      IMPLICIT NONE                                                        FIELDCOS.1051   
C     Arguments                                                            PS050793.364    
      CHARACTER                                                            PS050793.365    
     &     CMESSAGE*(*)           !OUT error messages                      PS050793.366    
      LOGICAL                                                              PS050793.367    
     &     LAST                   !IN indicates last record process        PS050793.368    
     &    ,OPER                   !IN indicates whether operational        PS050793.369    
     &    ,MODEL_FLAG             !IN True => dumps, False => fieldsfile   PS050793.370    
     &    ,LCAL360                                                         GSS1F304.311    
      INTEGER                                                              PS050793.371    
     &     PPUNIT                 !IN unit no of required fieldsfile       PS050793.372    
     &    ,COS_PPUNIT             !IN unit no of COS output file           PS050793.373    
     &    ,NUM_VALUES             !IN No of data points NROWS*NCOLS        PS050793.374    
     &    ,IDIM                   !IN NUM_VALUES rounded to an even no     PS050793.375    
C                                 !  used to dimension The output array    PS050793.376    
     &    ,DATA_ADD               !IN The word address of the data.        PS050793.377    
     &    ,LEN1_LOOKUP            !IN First dimension of the lookup        PS050793.378    
     &    ,PP_LEN2_LOOKUP         !IN Size of the LOOKUP on the file       PS050793.379    
     &    ,IEXTRA(10)             !IN Used within READFF                   PS050793.380    
     &    ,IEXTRAW                !IN no of words of extra data.           PS050793.381    
     &    ,ENTRY_NO               !IN Lookup entry no of the Field.        PS050793.382    
     &    ,PP_FIXHD(*)            !IN PPfile fixed header                  PS050793.383    
     &    ,LOOKUP(LEN1_LOOKUP,PP_LEN2_LOOKUP)  !IN integer lookup          PS050793.384    
     &    ,ICODE                  !OUT error code                          PS050793.385    
      REAL                                                                 PS050793.386    
     &     ROOKUP(LEN1_LOOKUP,PP_LEN2_LOOKUP)  !IN Real lookup             PS050793.387    
C*---------------------------------------------------------------------    PS050793.388    
C     Called routines                                                      PS050793.389    
      EXTERNAL READFF,INT_FROM_REAL,CRI2IEG,TIME2SEC,SEC2TIME              UIE1F402.39     
      INTEGER INT_FROM_REAL,CRI2IEG                                        UIE1F402.40     
C*---------------------------------------------------------------------    PS050793.391    
C     arguments for called routines                                        PS050793.392    
      INTEGER                                                              FIELDCOS.1057   
     &     MAX_LEN_ILABEL                                                  PS050793.393    
     &    ,MAX_LEN_RLABEL                                                  PS050793.394    
      PARAMETER (MAX_LEN_ILABEL=45,MAX_LEN_RLABEL=32)                      PS050793.395    
      INTEGER                                                              FIELDCOS.1073   
     &     END_YEAR        ! )                                             PS050793.396    
     &    ,END_MONTH       ! )                                             PS050793.397    
     &    ,END_DAY         ! )  arguments                                  PS050793.398    
     &    ,END_HOUR        ! )                                             PS050793.399    
     &    ,END_MINUTE      ! )     for                                     PS050793.400    
     &    ,END_SECOND      ! )                                             PS050793.401    
     &    ,END_DAY_NUMBER  ! )                                             TJ080294.68     
     &    ,END_TIME_DAYS   ! )                                             TJ080294.69     
     &    ,END_TIME_SECS   ! )  date/time                                  PS050793.402    
     &    ,START_TIME_SECS ! )                                             PS050793.403    
     &    ,START_TIME_DAYS ! )                                             TJ080294.70     
     &    ,DATA_YEAR       ! )  conversion                                 PS050793.404    
     &    ,DATA_MONTH      ! )                                             PS050793.405    
     &    ,DATA_DAY        ! )     when                                    PS050793.406    
     &    ,DATA_HOUR       ! )                                             PS050793.407    
     &    ,DATA_MINUTE     ! )  OPER is TRUE                               PS050793.408    
     &    ,DATA_SECOND     ! )                                             PS050793.409    
     &    ,DATA_DAY_NUMBER ! )                                             PS050793.410    
     &    ,ADDR            ! address in fld, used to process extra data    PS050793.411    
     &    ,IEEE_ADDR       ! address in ibm fld where extra data going.    PS050793.412    
     &    ,BIT_OFF         ! what bit offset are we using                  PS050793.413    
C                            (32 for odd, 0 for even values of addr)       PS050793.414    
     &    ,IER             ! error RETURN CODE from conversion             PS050793.415    
     &    ,IV              ! value of integer code for vectors             PS050793.416    
     &    ,LEN_ILABEL      ! number of values in ILABEL                    PS050793.417    
     &    ,LEN_RLABEL      ! number of values in RLABEL                    PS050793.418    
     &    ,DATA_VALUES     ! number of values in real extra data           PS050793.419    
     &    ,ILABEL(MAX_LEN_ILABEL)       ! holds integer part of LOOKUP     PS050793.420    
     &    ,IEEE_LABEL((LEN1_LOOKUP+1)/2)! holds IEEEconversion of LABEL    PS050793.421    
                                                                           PS050793.422    
      REAL                                                                 FIELDCOS.1076   
     &     FIELD(IDIM)            ! array holding data                     PS050793.423    
     &    ,IEEE_FIELD(IDIM/2)     ! array holding IEEE data                PS050793.424    
     &    ,RLABEL(MAX_LEN_RLABEL) ! holds real part of LOOKUP              PS050793.425    
                                                                           PS050793.426    
*CALL CLOOKADD                                                             PS050793.427    
C*---------------------------------------------------------------------    FIELDCOS.1082   
C    LOCAL VARIABLES                                                       FIELDCOS.1083   
      INTEGER                                                              FIELDCOS.1084   
     &     I              ! local counter                                  PS050793.428    
     &    ,PACK_TYPE      ! packing type N1 of LBPACK                      PS050793.429    
     &    ,DATA_COMP      ! data compression code                          FIELDCOS.1113   
     &    ,DATA_COMP_DEF  ! data compression definition                    FIELDCOS.1114   
     &    ,NUMBER_FORMAT  ! number format                                  FIELDCOS.1115   
     &    ,FCST_PRD                                                        PS050793.430    
                                                                           FIELDCOS.1116   
      LOGICAL PACKED      ! indicates whether the data is packed           PS050793.431    
                                                                           FIELDCOS.1118   
                                                                           PS050793.432    
                                                                           FIELDCOS.1120   
      DO 1 I=1,IDIM      ! make sure FIELD is initialised. An odd          FIELDCOS.1121   
      FIELD(I)=0.0       ! number of points might upset conversion         FIELDCOS.1122   
    1 CONTINUE                                                             FIELDCOS.1123   
      PACKED=.FALSE.                                                       FIELDCOS.1124   
                                                                           FIELDCOS.1125   
CL access the Fields File.                                                 FIELDCOS.1126   
      CALL READFF(PPUNIT,FIELD,IDIM,ENTRY_NO,                              FIELDCOS.1127   
     *ILABEL,RLABEL,IEXTRA,PP_LEN2_LOOKUP,LEN1_LOOKUP,                     FIELDCOS.1128   
     *PP_FIXHD,LOOKUP,ROOKUP,DATA_ADD,                                     PS050793.433    
     *MODEL_FLAG,MAX_LEN_ILABEL,MAX_LEN_RLABEL,                            PS050793.434    
     *LEN_ILABEL,LEN_RLABEL,                                               PS050793.435    
     *ICODE,CMESSAGE)                                                      PS050793.436    
C                                                                          FIELDCOS.1130   
      IF(ICODE.NE.0) RETURN                                                FIELDCOS.1131   
                                                                           FIELDCOS.1132   
C-----------------------------------------------------------------         FIELDCOS.1133   
                                                                           FIELDCOS.1134   
C The data has now been read in and has 1) Been read in packed             FIELDCOS.1135   
C and left packed or 2) read in as packed and then un-packed or            FIELDCOS.1136   
C 3) The data was never packed at all.  If packed FIELD will have          FIELDCOS.1137   
C LBLREC/2 values if a DUMP and LBLREC values if a PP_FILE. If             FIELDCOS.1138   
C the data is not packed FIELD will have the no of data points             FIELDCOS.1139   
C length LBROW*LBNPT+LBEXT if a pp_file and LBLREC if a dump file.         FIELDCOS.1140   
C                                                                          FIELDCOS.1141   
C For a dump LBLREC will hold origonal no of data points.  For a           FIELDCOS.1142   
C pp_file LBLREC will hold the no of CRAY words needed to hold             FIELDCOS.1143   
C the data (if un-packed also no of data points)                           FIELDCOS.1144   
C                                                                          FIELDCOS.1145   
C The value returned in ILABEL(LBLREC) may have to change because          FIELDCOS.1146   
C IEEE only has a 32 bit word length compared to the CRAY's 64             FIELDCOS.1147   
C bit word length. In IEEE ILABEL(LBLREC) will be no of 32 bit             FIELDCOS.1148   
C words needed to hold the data . If the data is not packed (or            FIELDCOS.1149   
C it has been un-packed) then this will be the no of data points.          FIELDCOS.1150   
C If the data is left packed the value of ILABEL(LBLREC)                   FIELDCOS.1151   
C will have to be doubled as the no of 32bit words needed to               FIELDCOS.1152   
C hold the data will twice that on the CRAY.                               FIELDCOS.1153   
                                                                           FIELDCOS.1154   
C On output the data will either have been converted to IEEE               FIELDCOS.1155   
C numbers and stored in IEEE_FIELD or left packed in FIELD,but with        FIELDCOS.1156   
C 32 bit ieee numbers substituted into minimum values.                     FIELDCOS.1157   
C If packed then LBLREC/2  words of FIELD are written as LBLREC is         FIELDCOS.1158   
C now the no of 32 bit words. If un-packed IEEE_FIELD which has size       FIELDCOS.1159   
C IDIM/2 (or NUM_VALUES/2) is written as it is.                            FIELDCOS.1160   
                                                                           FIELDCOS.1161   
C-----------------------------------------------------------------         FIELDCOS.1162   
c     decode LBPACK                                                        FIELDCOS.1163   
      PACK_TYPE = MOD(ILABEL(LBPACK),10)                                   FIELDCOS.1164   
      DATA_COMP = MOD(ILABEL(LBPACK),100) - PACK_TYPE                      FIELDCOS.1165   
      DATA_COMP_DEF = MOD(ILABEL(LBPACK),1000) -DATA_COMP -PACK_TYPE       FIELDCOS.1166   
      NUMBER_FORMAT = ILABEL(LBPACK)/1000                                  FIELDCOS.1167   
                                                                           FIELDCOS.1168   
      IF(PACK_TYPE.GT.0) PACKED=.TRUE.                                     FIELDCOS.1169   
      IF(PACKED) THEN              ! Data left in packed form. Number of   PS290193.6      
        ILABEL(LBLREC)=ILABEL(LBLREC)*2 ! IEEE words needed is 2*CRAY      PS290193.7      
      ENDIF                                                                FIELDCOS.1180   
C verify that don't have extra data and packing at once                    FIELDCOS.1181   
      IF (IEXTRAW.GT.0.AND.PACKED) THEN                                    FIELDCOS.1182   
        CMESSAGE='FIELDCOS: Extra data with packing not supported'         FIELDCOS.1183   
        ICODE=1                                                            FIELDCOS.1184   
        RETURN                                                             FIELDCOS.1185   
      ENDIF                                                                FIELDCOS.1186   
                                                                           FIELDCOS.1187   
CL Convert ILABEL to IBM(Hitachi) integers.                                FIELDCOS.1188   
C For either an accumulation or time mean (ie LBTIM.ne.0) the start &      FIELDCOS.1189   
C end time are in a different order to the data and veri time for a        FIELDCOS.1190   
C snap shot type field. This anomaly has to be catered for operational     FIELDCOS.1191   
C use. Thus the PP package will not work properly on accum/time mn field   FIELDCOS.1192   
C for operational Fields files.                                            FIELDCOS.1193   
      IF(ILABEL(lbtim).NE.11.AND.OPER) THEN                                PS050793.437    
C       re -calculate the data time from the end time  and fcst period     FIELDCOS.1195   
C     First calculate the no of seconds from day 0                         FIELDCOS.1196   
        END_YEAR=ILABEL(LBYRD)                                             FIELDCOS.1197   
        END_MONTH=ILABEL(LBMOND)                                           FIELDCOS.1198   
        END_DAY=ILABEL(LBDATD)                                             FIELDCOS.1199   
        END_HOUR=ILABEL(LBHRD)                                             FIELDCOS.1200   
        END_MINUTE=ILABEL(LBMIND)                                          FIELDCOS.1201   
        END_DAY_NUMBER=ILABEL(LBDAYD)                                      TJ080294.81     
        END_SECOND=0                                                       PS190494.5      
        FCST_PRD=ILABEL(LBFT)                                              FIELDCOS.1203   
C       WRITE(6,*)' START YR/MO/DA/HR/MIN BEFORE ',ILABEL(1),ILABEL(2),    GIE0F403.183    
C    *  ILABEL(3),ILABEL(4),ILABEL(5)                                      FIELDCOS.1205   
C       WRITE(6,*)' END   YR/MO/DA/HR/MIN BEFORE ',ILABEL(7),ILABEL(8),    GIE0F403.184    
C    *  ILABEL(9),ILABEL(10),ILABEL(11)                                    FIELDCOS.1207   
C       WRITE(6,*)' FCST_PRD BEFORE  ',FCST_PRD                            GIE0F403.185    
        CALL TIME2SEC (END_YEAR,END_MONTH,END_DAY,END_HOUR,                FIELDCOS.1209   
     *               END_MINUTE,END_SECOND,0,0,                            TJ080294.71     
     *               END_TIME_DAYS,END_TIME_SECS,LCAL360)                  GSS1F304.312    
                                                                           FIELDCOS.1211   
C   Subtract forecast hours from end time in (days,seconds)                TJ080294.92     
                                                                           TJ080294.93     
       CALL TIME_DF(END_TIME_DAYS,END_TIME_SECS,0,-FCST_PRD*3600,          TJ080294.94     
     *              START_TIME_DAYS,START_TIME_SECS)                       TJ080294.95     
                                                                           FIELDCOS.1213   
C     Go back and re-calculate Year/Month/Day/Hour/Sec.                    FIELDCOS.1214   
       CALL SEC2TIME(0,0,START_TIME_DAYS,START_TIME_SECS,                  TJ080294.73     
     *             DATA_YEAR,DATA_MONTH,DATA_DAY,                          TJ080294.74     
     *             DATA_HOUR,DATA_MINUTE,DATA_SECOND,DATA_DAY_NUMBER,      GSS1F304.313    
     *             LCAL360)                                                GSS1F304.314    
        ILABEL(LBYRD)=DATA_YEAR                                            FIELDCOS.1218   
        ILABEL(LBMOND)=DATA_MONTH                                          FIELDCOS.1219   
        ILABEL(LBDATD)=DATA_DAY                                            FIELDCOS.1220   
        ILABEL(LBHRD)=DATA_HOUR                                            FIELDCOS.1221   
        ILABEL(LBMIND)=DATA_MINUTE                                         FIELDCOS.1222   
        ILABEL(LBDAYD)=DATA_DAY_NUMBER                                     TJ080294.82     
        ILABEL(LBYR)=END_YEAR                                              FIELDCOS.1223   
        ILABEL(LBMON)=END_MONTH                                            FIELDCOS.1224   
        ILABEL(LBDAT)=END_DAY                                              FIELDCOS.1225   
        ILABEL(LBHR)=END_HOUR                                              FIELDCOS.1226   
        ILABEL(LBMIN)=END_MINUTE                                           FIELDCOS.1227   
        ILABEL(LBDAY)=END_DAY_NUMBER                                       TJ080294.83     
C       WRITE(6,*)' -----------------------------------------------'       GIE0F403.186    
C       WRITE(6,*)' Veri  YR/MO/DA/HR/MIN AFTER ',ILABEL(1),ILABEL(2),     GIE0F403.187    
C    *  ILABEL(3),ILABEL(4),ILABEL(5)                                      FIELDCOS.1230   
C       WRITE(6,*)' Data  YR/MO/DA/HR/MIN AFTER ',ILABEL(7),ILABEL(8),     GIE0F403.188    
C    *  ILABEL(9),ILABEL(10),ILABEL(11)                                    FIELDCOS.1232   
C       WRITE(6,*)' FCST_PRD AFTER   ',FCST_PRD                            GIE0F403.189    
C       WRITE(6,*)' -----------------------------------------------'       GIE0F403.190    
C       WRITE(6,*)' -----------------------------------------------'       GIE0F403.191    
      ENDIF                                                                FIELDCOS.1236   
                                                                           FIELDCOS.1237   
C     data now in IEEE format                                              FIELDCOS.1238   
      ILABEL(LBPACK) = ILABEL(LBPACK) - NUMBER_FORMAT*1000 + 3000          FIELDCOS.1239   
                                                                           FIELDCOS.1240   
CL Convert ILABEL to IEEE  Integer                                         PS050793.438    
      BIT_OFF=0                                                            FIELDCOS.1241   
      IEEE_ADDR = 1                                                        PS050793.439    
      IER=CRI2IEG(2,LEN_ILABEL,IEEE_LABEL(IEEE_ADDR),BIT_OFF,ILABEL,       UIE1F402.41     
     &            1,64,32)                                                 UIE1F402.42     
        IF(IER.NE.0) THEN                                                  FIELDCOS.1243   
          ICODE=1                                                          FIELDCOS.1244   
          CMESSAGE=' CRAY_IEEE error converting INT for IEEE_LABEL'        PS050793.441    
          RETURN                                                           FIELDCOS.1246   
        ENDIF                                                              FIELDCOS.1247   
CL Convert RLABEL to IEEE  Real.                                           FIELDCOS.1248   
      IEEE_ADDR=LEN_ILABEL/2                                               PS050793.442    
      IF(IEEE_ADDR*2.NE.LEN_ILABEL) BIT_OFF=32                             PS050793.443    
      IEEE_ADDR=IEEE_ADDR+1                                                PS050793.444    
      IER=CRI2IEG(3,LEN_RLABEL,IEEE_LABEL(IEEE_ADDR),BIT_OFF,RLABEL,       UIE1F402.43     
     &            1,64,32)                                                 UIE1F402.44     
        IF(IER.NE.0) THEN                                                  FIELDCOS.1251   
          ICODE=1                                                          FIELDCOS.1252   
          CMESSAGE=' CRAY_IEEE error converting REAL for IEEE_LABEL'       PS050793.446    
          RETURN                                                           FIELDCOS.1254   
        ENDIF                                                              FIELDCOS.1255   
      BIT_OFF=0                                                            PS050793.447    
      IF(.NOT.PACKED) THEN                                                 FIELDCOS.1256   
CL Convert Real DATA to IEEE Real if not packed.                           FIELDCOS.1257   
        IF(ILABEL(DATA_TYPE).EQ.1) THEN          !Data Type Real           FIELDCOS.1258   
        if(ilabel(32).eq.74) then                                          APS2F304.29     
          WRITE(6,*)'convert type 74 as logical and reset datatype'        GIE0F403.192    
          IER = CRI2IEG(5,NUM_VALUES-IEXTRAW,IEEE_FIELD,BIT_OFF,FIELD,     UIE1F402.45     
     &            1,64,32)                                                 UIE1F402.46     
          ILABEL(DATA_TYPE) = 3                                            APS2F304.32     
        else                                                               APS2F304.33     
          IER=CRI2IEG(3,NUM_VALUES-IEXTRAW,IEEE_FIELD,BIT_OFF,FIELD,       UIE1F402.47     
     &            1,64,32)                                                 UIE1F402.48     
          IF(IER.NE.0) THEN                                                FIELDCOS.1260   
            ICODE=1                                                        FIELDCOS.1261   
            CMESSAGE='CRAY_IEEE error converting REAL for IEEE_FIELD'      FIELDCOS.1262   
            RETURN                                                         FIELDCOS.1263   
          ENDIF                                                            FIELDCOS.1264   
        endif                                                              APS2F304.34     
CL Convert Integer data to IEEE Integer.                                   FIELDCOS.1265   
        ELSEIF(ILABEL(DATA_TYPE).EQ.2) THEN      !Data Type Integer        FIELDCOS.1266   
          IER=CRI2IEG(2,NUM_VALUES-IEXTRAW,IEEE_FIELD,BIT_OFF,FIELD,       UIE1F402.49     
     &            1,64,32)                                                 UIE1F402.50     
          IF(IER.NE.0) THEN                                                FIELDCOS.1268   
            ICODE=1                                                        FIELDCOS.1269   
            CMESSAGE='CRAY_IEEE error calling USICTI for IEEE_FIELD'       FIELDCOS.1270   
            RETURN                                                         FIELDCOS.1271   
          ENDIF                                                            FIELDCOS.1272   
        ELSEIF(ILABEL(DATA_TYPE).EQ.3) THEN      !Data Type Logical        FIELDCOS.1273   
          IER = CRI2IEG(5,NUM_VALUES-IEXTRAW,IEEE_FIELD,BIT_OFF,FIELD,     UIE1F402.51     
     &            1,64,32)                                                 UIE1F402.52     
          IF(IER.NE.0) THEN                                                APS2F304.36     
            ICODE=1                                                        FIELDCOS.1274   
            CMESSAGE='CRAY_IEEE error converting logical forIEEE_FIELD'    APS2F304.37     
            RETURN                                                         FIELDCOS.1276   
          ENDIF                                                            APS2F304.38     
        ENDIF                                                              FIELDCOS.1277   
      ELSE                                                                 FIELDCOS.1278   
        WRITE(6,*)'WARNING ! WGDOS packed data - contains IBM reals'       GIE0F403.193    
                                                                           FIELDCOS.1280   
c       code to be added here to convert ibm reals in packed data          FIELDCOS.1281   
c       to ieee reals                                                      FIELDCOS.1282   
                                                                           FIELDCOS.1283   
      ENDIF                                                                FIELDCOS.1284   
                                                                           FIELDCOS.1285   
CL process extra data                                                      FIELDCOS.1286   
      IF (IEXTRAW.GT.0) THEN ! process extra data as got some              FIELDCOS.1287   
CL init values for while loop                                              FIELDCOS.1288   
        ADDR=NUM_VALUES-IEXTRAW+1 ! start address in field for extra dat   FIELDCOS.1289   
        IEEE_ADDR=(ADDR+1)/2                                               FIELDCOS.1290   
        IF (IEEE_ADDR*2.EQ.ADDR) THEN                                      FIELDCOS.1291   
          BIT_OFF=32                                                       FIELDCOS.1292   
        ELSE                                                               FIELDCOS.1293   
          BIT_OFF=0                                                        FIELDCOS.1294   
        ENDIF                                                              FIELDCOS.1295   
                                                                           FIELDCOS.1296   
        DO WHILE (ADDR.LT.NUM_VALUES)                                      FIELDCOS.1297   
CL main while loop that works out code and then checks that code is        FIELDCOS.1298   
CL ok.                                                                     FIELDCOS.1299   
CL if code is ok then data_values weill contain the number of REAL entri   FIELDCOS.1300   
CL the vector.                                                             FIELDCOS.1301   
          IV=INT_FROM_REAL(FIELD(ADDR))                                    FIELDCOS.1302   
          CALL CHECK_EXTRA(IV,DATA_VALUES,ICODE,CMESSAGE)                  FIELDCOS.1303   
          IF (ICODE.NE.0) THEN                                             FIELDCOS.1304   
            RETURN                                                         FIELDCOS.1305   
          ENDIF                                                            FIELDCOS.1306   
          IER=CRI2IEG(2,1,IEEE_FIELD(IEEE_ADDR),BIT_OFF,FIELD(ADDR),       UIE1F402.53     
     &            1,64,32)                                                 UIE1F402.54     
C         convert the integer from cray format to IEEE format              FIELDCOS.1308   
          IF (IER.NE.0) THEN                                               FIELDCOS.1309   
            ICODE=1                                                        FIELDCOS.1310   
            CMESSAGE='CRAY_IEEE: FAILED IN INTEGER CONV OF EXTRA DATA'     FIELDCOS.1311   
            RETURN                                                         FIELDCOS.1312   
          ENDIF                                                            FIELDCOS.1313   
                                                                           FIELDCOS.1314   
CL         update bit_off, addr and IEEE_addr                              FIELDCOS.1315   
          IF (BIT_OFF.EQ.0) THEN                                           FIELDCOS.1316   
            BIT_OFF=32                                                     FIELDCOS.1317   
          ELSE                                                             FIELDCOS.1318   
            BIT_OFF=0                                                      FIELDCOS.1319   
            IEEE_ADDR=IEEE_ADDR+1 ! gone on another word..                 FIELDCOS.1320   
          ENDIF                                                            FIELDCOS.1321   
          ADDR=ADDR+1             ! increment address                      FIELDCOS.1322   
CL now to convert REAL vector to IEEE format.                              FIELDCOS.1323   
          IER=CRI2IEG(3,DATA_VALUES,IEEE_FIELD(IEEE_ADDR),                 UIE1F402.55     
     &      BIT_OFF,FIELD(ADDR),1,64,32)                                   UIE1F402.56     
C         convert the real data values                                     FIELDCOS.1326   
          IF (IER.NE.0) THEN                                               FIELDCOS.1327   
            ICODE=1                                                        FIELDCOS.1328   
            CMESSAGE='CRAY_IEEE: FAILED IN REAL CONV OF EXTRA DATA'        FIELDCOS.1329   
            RETURN                                                         FIELDCOS.1330   
          ENDIF                                                            FIELDCOS.1331   
CL update loop variables.                                                  FIELDCOS.1332   
          ADDR=ADDR+DATA_VALUES                                            FIELDCOS.1333   
          IEEE_ADDR=IEEE_ADDR+DATA_VALUES/2                                FIELDCOS.1334   
          IF ((DATA_VALUES/2)*2.NE.DATA_VALUES) THEN ! odd no. of values   FIELDCOS.1335   
            IF (BIT_OFF.EQ.0) THEN                                         FIELDCOS.1336   
              BIT_OFF=32                                                   FIELDCOS.1337   
            ELSE                                                           FIELDCOS.1338   
              BIT_OFF=0                                                    FIELDCOS.1339   
              IEEE_ADDR=IEEE_ADDR+1 ! gone on another word..               FIELDCOS.1340   
            ENDIF                                                          FIELDCOS.1341   
          ENDIF                                                            FIELDCOS.1342   
        ENDDO                   ! continue unitil run out of data....      FIELDCOS.1343   
CL Verify addr and IEEE_addr have correct values at end of whileloop       FIELDCOS.1344   
CL first check that addr is ok                                             FIELDCOS.1345   
        IF (ADDR.NE.NUM_VALUES+1) THEN                                     FIELDCOS.1346   
          WRITE(CMESSAGE,109)ADDR,NUM_VALUES+1                             FIELDCOS.1347   
 109      FORMAT('CRAY_IEEE: ADDR',I5,1X,'<> NUM_VALUES+1',I5)             GPB0F405.149    
          ICODE=1                                                          FIELDCOS.1349   
          RETURN                                                           FIELDCOS.1350   
        ENDIF                                                              FIELDCOS.1351   
CL and so is IEEE_addr                                                     FIELDCOS.1352   
        IF (BIT_OFF.EQ.0) IEEE_ADDR=IEEE_ADDR-1                            FIELDCOS.1353   
        IF (IEEE_ADDR.NE.(NUM_VALUES+1)/2) THEN                            FIELDCOS.1354   
          WRITE(CMESSAGE,110)IEEE_ADDR,(NUM_VALUES+1)/2                    FIELDCOS.1355   
 110      FORMAT('CRAY_IEEE: IEEE_ADDR ',I5,1X,                            GPB0F405.150    
     &           ' <> (NUM_VALUES+1)/2',I5)                                GPB0F405.151    
          ICODE=1                                                          FIELDCOS.1357   
          RETURN                                                           FIELDCOS.1358   
        ENDIF                                                              FIELDCOS.1359   
      ENDIF ! end processing of extra data                                 FIELDCOS.1360   
                                                                           FIELDCOS.1361   
      IF(PACKED) THEN                                                      FIELDCOS.1362   
        WRITE(COS_PPUNIT) IEEE_LABEL                                       PS050793.449    
        WRITE(COS_PPUNIT) (FIELD(I),I=1,ILABEL(LBLREC)/2)                  PS050793.450    
      ELSE                                                                 FIELDCOS.1366   
        WRITE(COS_PPUNIT) IEEE_LABEL                                       PS050793.451    
        WRITE(COS_PPUNIT) IEEE_FIELD                                       FIELDCOS.1368   
      ENDIF                                                                FIELDCOS.1369   
C                                                                          FIELDCOS.1370   
  100 FORMAT('  WRITING COS FILE for IPROJ ITYPE FCT LEVEL',4I6)           FIELDCOS.1371   
CL  The last field has been processed. An extra field is now written       FIELDCOS.1372   
CL  to act as a delimeter for the M08 software. This extra fields is       FIELDCOS.1373   
CL  a duplicate,but with a PP field code of -99 .                          FIELDCOS.1374   
      IF(LAST) THEN                                                        FIELDCOS.1375   
        WRITE(6,101)                                                       FIELDCOS.1377   
  101   FORMAT('  WRITING LAST RECORD IN THE COS FILE ')                   FIELDCOS.1378   
        ILABEL(23)=-99                                                     FIELDCOS.1379   
CL Convert ILABEL to IEEE  Integer                                         PS050793.452    
        BIT_OFF=0                                                          PS050793.453    
        IEEE_ADDR = 1                                                      PS050793.454    
        IER=CRI2IEG(2,LEN_ILABEL,IEEE_LABEL(IEEE_ADDR),BIT_OFF,ILABEL,     UIE1F402.57     
     &            1,64,32)                                                 UIE1F402.58     
          IF(IER.NE.0) THEN                                                FIELDCOS.1381   
            ICODE=1                                                        FIELDCOS.1382   
            CMESSAGE=' CRAY_IEEE error converting INT for IEEE_LABEL'      PS050793.456    
            RETURN                                                         PS050793.457    
          ENDIF                                                            PS050793.458    
CL Convert RLABEL to IEEE  Real.                                           PS050793.459    
        IEEE_ADDR=LEN_ILABEL/2                                             PS050793.460    
        IF(IEEE_ADDR*2.NE.LEN_ILABEL) BIT_OFF=32                           PS050793.461    
        IEEE_ADDR=IEEE_ADDR+1                                              PS050793.462    
        IER=CRI2IEG(3,LEN_RLABEL,IEEE_LABEL(IEEE_ADDR),BIT_OFF,RLABEL,     UIE1F402.59     
     &            1,64,32)                                                 UIE1F402.60     
          IF(IER.NE.0) THEN                                                PS050793.464    
            ICODE=1                                                        PS050793.465    
            CMESSAGE=' CRAY_IEEE error converting REAL for IEEE_LABEL'     PS050793.466    
            RETURN                                                         FIELDCOS.1384   
          ENDIF                                                            FIELDCOS.1385   
      IF(PACKED) THEN                                                      FIELDCOS.1386   
        WRITE(COS_PPUNIT) IEEE_LABEL                                       PS050793.467    
        WRITE(COS_PPUNIT) (FIELD(I),I=1,ILABEL(LBLREC)/2)                  PS050793.468    
      ELSE                                                                 FIELDCOS.1389   
        WRITE(COS_PPUNIT) IEEE_LABEL                                       PS050793.469    
        WRITE(COS_PPUNIT) IEEE_FIELD                                       FIELDCOS.1391   
      ENDIF                                                                FIELDCOS.1392   
      ENDIF                                                                FIELDCOS.1393   
 9999 CONTINUE                                                             FIELDCOS.1394   
      RETURN                                                               FIELDCOS.1395   
      END                                                                  FIELDCOS.1396   
                                                                           FIELDCOS.1397   
!=======================================================================   URS4F400.29     
!    Routine: CRAY_GRIB                                                    URS4F400.30     
!                                                                          URS4F400.31     
!    Purpose: To read a   direct access PP file  and convert it to a       URS4F400.32     
!    pure grib file ready to be passed to HDS or workstation.              URS4F400.33     
!                                                                          URS4F400.34     
!    Tested under compiler:   cft77                                        URS4F400.35     
!    Tested under OS version: UNICOS 7 & 8                                 URS4F400.36     
!                                                                          URS4F400.37     
!    Model            Modification history from model version 3.3:         URS4F400.38     
!   version  Date                                                          URS4F400.39     
!    4.0    31/03/95  : Added to FIELDCOS                                  URS4F400.40     
!                                                                          URS4F400.41     
!    Programming standard: UM Doc Paper 3, version 1 (15/1/90)             URS4F400.42     
!                                                                          URS4F400.43     
!    Logical components covered: C41                                       URS4F400.44     
!                                                                          URS4F400.45     
!    Project task: C4                                                      URS4F400.46     
!                                                                          URS4F400.47     
!    External documentation:                                               URS4F400.48     
!                                                                          URS4F400.49     
!-----------------------------------------------------------------------   URS4F400.50     
!    Interface and arguments: ------------------------------------------   URS4F400.51     
!                                                                          URS4F400.52     

      SUBROUTINE CRAY_GRIB(IDIM,PPUNIT,TOTAL_WORDS,FORMAT_OUT,              1,1URS4F400.53     
     &             LEN1_LOOKUP,PP_LEN2_LOOKUP,PP_FIXHD,LOOKUP,             URS4F400.54     
     &             ROOKUP,ENTRY_NO,DATA_ADD,MODEL_FLAG,                    URS4F400.55     
     &             COS_PPUNIT,IEXTRA,ICODE,CMESSAGE)                       URS4F400.56     
                                                                           URS4F400.57     
      IMPLICIT NONE                                                        URS4F400.58     
!     Arguments                                                            URS4F400.59     
      CHARACTER                                                            URS4F400.60     
     &     CMESSAGE*(*)           !OUT error messages                      URS4F400.61     
     &    ,FORMAT_OUT*6           !IN format required                      URS4F400.62     
      LOGICAL                                                              URS4F400.63     
     &     MODEL_FLAG             !IN True => dumps, False => fieldsfile   URS4F400.64     
      INTEGER                                                              URS4F400.65     
     &     PPUNIT                 !IN unit no of required fieldsfile       URS4F400.66     
     &    ,TOTAL_WORDS            !IN total number of words written        URS4F400.67     
     &    ,COS_PPUNIT             !IN unit no of COS output file           URS4F400.68     
     &    ,IDIM                   !IN NUM_VALUES rounded to an even no     URS4F400.69     
!                                 !  used to dimension The output array    URS4F400.70     
     &    ,DATA_ADD               !IN The word address of the data.        URS4F400.71     
     &    ,LEN1_LOOKUP            !IN First dimension of the lookup        URS4F400.72     
     &    ,PP_LEN2_LOOKUP         !IN Size of the LOOKUP on the file       URS4F400.73     
     &    ,IEXTRA(10)             !IN Used within READFF                   URS4F400.74     
     &    ,ENTRY_NO               !IN Lookup entry no of the Field.        URS4F400.75     
     &    ,PP_FIXHD(*)            !IN PPfile fixed header                  URS4F400.76     
     &    ,LOOKUP(LEN1_LOOKUP,PP_LEN2_LOOKUP)  !IN integer lookup          URS4F400.77     
     &    ,ICODE                  !OUT error code                          URS4F400.78     
      REAL                                                                 URS4F400.79     
     &     ROOKUP(LEN1_LOOKUP,PP_LEN2_LOOKUP)    !IN Real lookup           URS4F400.80     
!----------------------------------------------------------------------    URS4F400.81     
!     Called routines                                                      URS4F400.82     
      EXTERNAL READFF,GBYTES,SBYTES                                        URS4F400.83     
!----------------------------------------------------------------------    URS4F400.84     
!    LOCAL VARIABLES                                                       URS4F400.85     
      INTEGER                                                              URS4F400.86     
     &     MAX_LEN_ILABEL    ! maximum length of INT part of pp header     URS4F400.87     
     &    ,MAX_LEN_RLABEL    ! maximum length of REAL part of pp header    URS4F400.88     
      PARAMETER (MAX_LEN_ILABEL=45,MAX_LEN_RLABEL=32)                      URS4F400.89     
      INTEGER                                                              URS4F400.90     
     &     LEN_ILABEL      ! number of values in ILABEL                    URS4F400.91     
     &    ,LEN_RLABEL      ! number of values in RLABEL                    URS4F400.92     
     &    ,ILABEL(MAX_LEN_ILABEL)       ! holds integer part of LOOKUP     URS4F400.93     
     &    ,I              ! local counter                                  URS4F400.94     
     &    ,CARRY          ! local counter                                  URS4F400.95     
     &    ,NEW_CODE       ! new field code                                 URS4F400.96     
     &    ,ITEM            ! item code                                     URS4F400.97     
     &    ,SECTION         ! section code                                  URS4F400.98     
     &    ,SECTION1(16)    ! UM octet 9 value                              URS4F400.99     
                                                                           URS4F400.100    
      REAL                                                                 URS4F400.101    
     &     FIELD(IDIM)            ! array holding data                     URS4F400.102    
     &    ,RLABEL(MAX_LEN_RLABEL) ! holds real part of LOOKUP              URS4F400.103    
                                                                           URS4F400.104    
*CALL CLOOKADD                                                             URS4F400.105    
*CALL CGRIBTAB                                                             URS4F400.106    
!----------------------------------------------------------------------    URS4F400.107    
                                                                           URS4F400.108    
!  access the Fields File.                                                 URS4F400.109    
      CALL READFF(PPUNIT,FIELD,IDIM,ENTRY_NO,ILABEL,RLABEL,IEXTRA,         URS4F400.110    
     &            PP_LEN2_LOOKUP,LEN1_LOOKUP,PP_FIXHD,LOOKUP,ROOKUP,       URS4F400.111    
     &            DATA_ADD,MODEL_FLAG,MAX_LEN_ILABEL,MAX_LEN_RLABEL,       URS4F400.112    
     &            LEN_ILABEL,LEN_RLABEL,ICODE,CMESSAGE)                    URS4F400.113    
                                                                           URS4F400.114    
      IF(ICODE.NE.0) RETURN                                                URS4F400.115    
                                                                           URS4F400.116    
!-----------------------------------------------------------------         URS4F400.117    
!  Alter field codes if required                                           URS4F400.118    
!  FORMAT_OUT                                                              URS4F400.119    
!  GRIB  - UM stash codes - no change                                      URS4F400.120    
!  GRIB1 - attempt to alter codes to standard table 2 values               URS4F400.121    
!  GRIB2 - attempt to alter codes to other user table 2                    URS4F400.122    
!                                                                          URS4F400.123    
      IF (FORMAT_OUT.EQ.'GRIB1'.OR.FORMAT_OUT.EQ.'GRIB2') THEN             URS4F400.124    
        SECTION=ILABEL(42)/1000                                            URS4F400.125    
        ITEM=ILABEL(42) - SECTION*1000                                     URS4F400.126    
        NEW_CODE=GRIB_TABLE(SECTION,ITEM)                                  URS4F400.127    
        IF (NEW_CODE.EQ.-99) THEN                                          URS4F400.128    
      WRITE(6,*)' No standard grib code for field ',ilabel(42),' field     GIE0F403.194    
     & will not be output'                                                 URS4F400.130    
          RETURN                                                           URS4F400.131    
        ELSE                                                               URS4F400.132    
!  Assumes running on a 64 bit word machine                                URS4F400.133    
!  Therefore section 0 is field (1) & section 1 starts at field(2)         URS4F400.134    
! Need to alter octets 4 and 9 in section 1                                URS4F400.135    
! decode first 16 octets of grib message                                   URS4F400.136    
          CALL GBYTES(field(2),section1(1),0,8,0,16)                       URS4F400.137    
          SECTION1(4)=1                                                    URS4F400.138    
          SECTION1(9)=new_code                                             URS4F400.139    
! recode first 16 octets of grib message                                   URS4F400.140    
          CALL SBYTES(field(2),section1(1),0,8,0,16)                       URS4F400.141    
        ENDIF                                                              URS4F400.142    
      ENDIF                                                                URS4F400.143    
!-----------------------------------------------------------------         URS4F400.144    
! write out pure grib code                                                 URS4F400.145    
                                                                           URS4F400.146    
        WRITE(COS_PPUNIT) (FIELD(I),I=1,ILABEL(LBLREC))                    URS4F400.147    
        WRITE(6,100) ILABEL(42),ILABEL(LBLREC)                             URS4F400.148    
        TOTAL_WORDS=TOTAL_WORDS+ilabel(lblrec)                             URS4F400.149    
 100  FORMAT(1x,' written out grib for ',i6,' length of data',i8)          URS4F400.150    
                                                                           URS4F400.151    
      RETURN                                                               URS4F400.152    
      END                                                                  URS4F400.153    
! =====================================================================    URS4F400.154    
CLL  Routine: READFF---------------------------------------------------    FIELDCOS.1398   
CLL                                                                        FIELDCOS.1399   
CLL  Purpose: To read a   direct access PP file.                           FIELDCOS.1400   
CLL                                                                        FIELDCOS.1401   
CLL  Author:   P.Trevelyan                                                 FIELDCOS.1402   
CLL                                                                        FIELDCOS.1403   
CLL  Tested under compiler:   cft77                                        FIELDCOS.1404   
CLL  Tested under OS version: UNICOS 5.1                                   FIELDCOS.1405   
CLL                                                                        FIELDCOS.1406   
CLL  Model            Modification history from model version 3.0:         FIELDCOS.1407   
CLL version  Date                                                          FIELDCOS.1408   
CLL                                                                        FIELDCOS.1409   
CLL  3.4   29/06/94 Correct unpacking of 32 bit data. Error affected       UDR3F304.1      
CLL                 odd-length fields. PP and Stash codes added to         UDR3F304.2      
CLL                 output. D. Robinson                                    UDR3F304.3      
CLL                                                                        UDR3F304.4      
CLL  Programming standard: UM Doc Paper 3, version 1 (15/1/90)             FIELDCOS.1410   
CLL                                                                        FIELDCOS.1411   
CLL  Logical components covered:                                           FIELDCOS.1412   
CLL                                                                        FIELDCOS.1413   
CLL  Project task:                                                         FIELDCOS.1414   
CLL                                                                        FIELDCOS.1415   
CLL  External documentation:                                               FIELDCOS.1416   
CLL                                                                        FIELDCOS.1417   
CLL  -------------------------------------------------------------------   FIELDCOS.1418   
C*L  Interface and arguments: ------------------------------------------   FIELDCOS.1419   

      SUBROUTINE READFF(PPUNIT,FIELD,IDIM,ENTRY_NO,                         6,7FIELDCOS.1420   
     *ILABEL,RLABEL,IEXTRA,PP_LEN2_LOOKUP,LEN1_LOOKUP,                     FIELDCOS.1421   
     *PP_FIXHD,LOOKUP,ROOKUP,DATA_ADD,                                     PS050793.470    
     *MODEL_FLAG,MAX_LEN_ILABEL,MAX_LEN_RLABEL,                            PS050793.471    
     *LEN_ILABEL,LEN_RLABEL,                                               PS050793.472    
     *ICODE,CMESSAGE)                                                      PS050793.473    
      IMPLICIT NONE                                                        FIELDCOS.1423   
C     arguments                                                            PS050793.474    
      CHARACTER                                                            PS050793.475    
     &     CMESSAGE*(*)           !OUT error message                       PS050793.476    
      LOGICAL                                                              PS050793.477    
     &     MODEL_FLAG             !IN  True => Dump False =>Fieldsfile     PS050793.478    
      INTEGER                                                              FIELDCOS.1428   
     &     LEN1_LOOKUP            !IN  first dimension of the lookup       FIELDCOS.1429   
     &    ,PP_LEN2_LOOKUP         !IN  secnd dimension of the lookup       FIELDCOS.1430   
     &    ,PPUNIT                 !IN  unit no of required fieldsfile      FIELDCOS.1431   
     &    ,IDIM                   !IN  dimension of FIELD                  FIELDCOS.1432   
     &    ,MAX_LEN_RLABEL         !IN  max sixe of RLABEL                  PS050793.479    
     &    ,MAX_LEN_ILABEL         !IN  max sixe of ILABEL                  PS050793.480    
     &    ,IEXTRA(10)             !IN  spare for future use                FIELDCOS.1434   
     &    ,DATA_ADD               !IN  The word address of the data.       FIELDCOS.1437   
     &    ,ENTRY_NO               !IN  Lookup entry no of the Field.       FIELDCOS.1438   
     &    ,PP_FIXHD(*)            !IN  PPfile fixed header                 PS050793.481    
     &    ,LOOKUP(LEN1_LOOKUP,PP_LEN2_LOOKUP) !IN integer lookup           PS050793.482    
     &    ,LEN_RLABEL             !OUT actual size of RLABEL               PS050793.483    
     &    ,LEN_ILABEL             !OUT actual size of ILABEL               PS050793.484    
     &    ,ILABEL(MAX_LEN_ILABEL) !OUT integer part of LOOKUP              PS050793.485    
     &    ,ICODE                  !OUT error code                          PS050793.486    
      REAL                                                                 FIELDCOS.1442   
     &     FIELD(IDIM)            !OUT array holding final output data.    FIELDCOS.1443   
     &    ,ROOKUP(LEN1_LOOKUP,PP_LEN2_LOOKUP) !IN real lookup              PS050793.487    
     &    ,RLABEL(MAX_LEN_RLABEL) !OUT real part of LOOKUP                 PS050793.488    
C*---------------------------------------------------------------------    PS050793.489    
C     Called routines                                                      PS050793.490    
      EXTERNAL SETPOS,READ_REC,IOERROR,COEX,                               PS050793.491    
     &         INTEGER_TO _REAL,LOGICAL_TO_REAL                            PS050793.492    
C*---------------------------------------------------------------------    PS050793.493    
C     arguments for called routines                                        PS050793.494    
      INTEGER                                                              PS050793.495    
     &     PACK_TYPE              ! packing type N1 of LBPACK              PS050793.496    
     &    ,NUM_CRAY_WORDS         ! number of words for field              PS050793.497    
     &    ,NVALS                  ! number of points in a data field       PS050793.498    
     &    ,IWA                    ! Word address in call SETPOS            PS050793.499    
C*---------------------------------------------------------------------    PS050793.500    
C     LOCAL VARIABLES                                                      FIELDCOS.1446   
      INTEGER                                                              FIELDCOS.1450   
     &     I                      ! Local counter                          FIELDCOS.1451   
     &    ,J                      ! Local counter                          FIELDCOS.1452   
     &    ,LENGTH_OF_DATA         ! Length of a particular field           FIELDCOS.1457   
     &    ,ADDR                   ! Address of a field in the data store   FIELDCOS.1458   
     &    ,IN_LBVC                ! Local copy of LBVC required to searc   FIELDCOS.1459   
     &    ,NUM_IBM_WORDS          ! No of IBM words used to hold the dat   FIELDCOS.1460   
     &    ,POS_RLABEL             ! position of first REAL in PPhdr        PS050793.501    
     &    ,PACK_TYPE_I            ! packing type N1 of LBPACK              PS050793.502    
     &    ,DATA_COMP              ! data compression code                  PS050793.503    
     &    ,DATA_COMP_DEF          ! data compression definition            PS050793.504    
     &    ,NUMBER_FORMAT          ! number format                          PS050793.505    
      REAL                                                                 PS050793.506    
     &     AMDI                   ! Missing data indicator for lookup      UIE0F404.21     
                                                                           PS050793.509    
*CALL CLOOKADD                                                             PS050793.510    
*CALL C_MDI                                                                PS050793.511    
                                                                           PS050793.512    
      AMDI=ROOKUP(BMDI,ENTRY_NO)                                           PS050793.513    
      IF (AMDI.NE.RMDI) WRITE(6,*)' NONE STANDARD MISSING DATA USED'       GIE0F403.195    
                                                                           PS050793.515    
C                                                                          FIELDCOS.1470   
c     CALL PR_LOOK(LOOKUP(1,1),ROOKUP(1,1),ENTRY_NO)                       PS050793.516    
C                                                                          FIELDCOS.1477   
c     decode LBPACK                                                        FIELDCOS.1478   
      PACK_TYPE = MOD(LOOKUP(LBPACK,ENTRY_NO),10)                          FIELDCOS.1479   
      DATA_COMP = MOD(LOOKUP(LBPACK,ENTRY_NO),100) - PACK_TYPE             FIELDCOS.1480   
      DATA_COMP_DEF = MOD(LOOKUP(LBPACK,ENTRY_NO),1000)                    FIELDCOS.1481   
     -                                      -DATA_COMP -PACK_TYPE          FIELDCOS.1482   
      NUMBER_FORMAT = LOOKUP(LBPACK,ENTRY_NO)/1000                         FIELDCOS.1483   
C----------------------------------------------------------------------    FIELDCOS.1484   
C=== Reading a model type dump =======================================     FIELDCOS.1485   
C    A model dump has no direct addressing only relative.                  FIELDCOS.1486   
C                                                                          FIELDCOS.1487   
      IF(MODEL_FLAG) THEN                                                  FIELDCOS.1491   
! Old Format dumpfiles                                                     UIE0F404.2      
        if((lookup(lbnrec,entry_no).eq.0) .or.                             UIE0F404.3      
! Prog lookups in dump before vn3.2:                                       UIE0F404.4      
     &    ((lookup(lbnrec,entry_no).eq.imdi) .and.                         UIE0F404.5      
     &                             (pp_fixhd(12).le.301))) then            UIE0F404.6      
                                                                           UIE0F404.7      
        IF(PACK_TYPE.EQ.2) THEN            ! 32 bit packing.               UDR3F304.5      
          NUM_CRAY_WORDS=(LOOKUP(LBLREC,ENTRY_NO)+1)/2                     UDR3F304.6      
        ELSEIF(PACK_TYPE.GT.0) THEN                                        UDR3F304.7      
          NUM_CRAY_WORDS=LOOKUP(LBLREC,ENTRY_NO)/2                         FIELDCOS.1493   
        ELSE                                                               FIELDCOS.1494   
          NUM_CRAY_WORDS=LOOKUP(LBLREC,ENTRY_NO)                           FIELDCOS.1495   
        ENDIF                                                              FIELDCOS.1496   
        NVALS=LOOKUP(LBLREC,ENTRY_NO) ! No of data points                  FIELDCOS.1497   
        ADDR=DATA_ADD                                                      FIELDCOS.1498   
        IF(ENTRY_NO.GT.1) THEN                                             FIELDCOS.1499   
          DO I=1,ENTRY_NO-1                                                FIELDCOS.1500   
            PACK_TYPE_I = MOD(LOOKUP(LBPACK,I),10)                         FIELDCOS.1501   
            IF(PACK_TYPE_I.EQ.2) THEN ! 32 Bit packed                      FIELDCOS.1502   
              LENGTH_OF_DATA=(LOOKUP(LBLREC,I)+1)/2                        UDR3F304.8      
            ELSE                                                           FIELDCOS.1504   
              LENGTH_OF_DATA=LOOKUP(LBLREC,I)                              FIELDCOS.1505   
            ENDIF                                                          FIELDCOS.1506   
            ADDR=ADDR+LENGTH_OF_DATA                                       FIELDCOS.1507   
          ENDDO                                                            FIELDCOS.1508   
        ELSE       !  If the first entry.                                  FIELDCOS.1509   
          ADDR=DATA_ADD  !                                                 FIELDCOS.1510   
          IF(PACK_TYPE.EQ.2) THEN ! 32 Bit packed                          FIELDCOS.1511   
            LENGTH_OF_DATA=(LOOKUP(LBLREC,1)+1)/2                          UDR3F304.9      
          ELSE                                                             FIELDCOS.1513   
            LENGTH_OF_DATA=LOOKUP(LBLREC,1)                                FIELDCOS.1514   
          ENDIF                                                            FIELDCOS.1515   
          WRITE(6,*)'  LENGTH_OF_DATA  ',LENGTH_OF_DATA                    GIE0F403.196    
        ENDIF                                                              FIELDCOS.1517   
        IWA=ADDR  ! Not -1 as this is already done in dump                 FIELDCOS.1518   
      Else                                                                 UIE0F404.8      
! New format Dumpfiles (vn4.4 onwards)                                     UIE0F404.9      
                                                                           UIE0F404.10     
        If(pack_type.eq.2) then            ! 32 bit packing.               UIE0F404.11     
          num_cray_words=(lookup(lblrec,entry_no)+1)/2                     UIE0F404.12     
        Elseif(pack_type.gt.0) then                                        UIE0F404.13     
          num_cray_words=lookup(lblrec,entry_no)/2                         UIE0F404.14     
        Else                                                               UIE0F404.15     
          num_cray_words=lookup(lblrec,entry_no)                           UIE0F404.16     
        Endif                                                              UIE0F404.17     
        iwa = lookup(lbegin,entry_no)                                      UIE0F404.18     
        nvals = lookup(lbrow,entry_no) * lookup(lbnpt,entry_no)            UIE0F404.19     
      Endif                                                                UIE0F404.20     
      ELSE                                                                 FIELDCOS.1519   
C=== Reading a PP type file.==========================================     FIELDCOS.1520   
        NUM_CRAY_WORDS=LOOKUP(LBLREC,ENTRY_NO) ! PP type file              FIELDCOS.1521   
        IWA=LOOKUP(LBEGIN,ENTRY_NO)                                        FIELDCOS.1522   
        NVALS=LOOKUP(LBROW,ENTRY_NO)*LOOKUP(LBNPT,ENTRY_NO)                FIELDCOS.1523   
     &         +LOOKUP(LBEXT,ENTRY_NO)                                     FIELDCOS.1524   
      ENDIF                                                                FIELDCOS.1525   
C==============================================================            FIELDCOS.1526   
C       WRITE(6,107) ENTRY_NO,NUM_CRAY_WORDS,NVALS                         FIELDCOS.1527   
  107 FORMAT(' ENTRY NO=',I5,'NUM_CRAY_WORDS= ',I6,'NVALS=',I6)            FIELDCOS.1528   
        IF(IDIM.LT.NUM_CRAY_WORDS) THEN                                    FIELDCOS.1529   
          ICODE=NUM_CRAY_WORDS                                             FIELDCOS.1530   
          CMESSAGE='READFF  Idim to small ICODE holds correct value'       FIELDCOS.1531   
          GOTO 9999                                                        FIELDCOS.1532   
        ENDIF                                                              FIELDCOS.1533   
      ICODE=0                                                              FIELDCOS.1534   
C     RETURN                                                               FIELDCOS.1535   
      CALL READ_REC(FIELD,NUM_CRAY_WORDS,IWA,PPUNIT,ICODE,CMESSAGE)        FIELDCOS.1536   
 2212 FORMAT('  FIELDS FILE NUMBER ',I2,'  ON UNIT',I2,2X,'BEING READ')    FIELDCOS.1537   
      NUM_IBM_WORDS=NUM_CRAY_WORDS*2                                       FIELDCOS.1538   
                                                                           UDR3F304.10     
      WRITE(7,106) ENTRY_NO,                    ! Field No                 UDR3F304.11     
     *             LOOKUP(LBTYP,ENTRY_NO),      ! M08 Type                 UDR3F304.12     
     *             LOOKUP(LBFC,ENTRY_NO),       ! PP Field Code            UDR3F304.13     
     *             LOOKUP(ITEM_CODE,ENTRY_NO),  ! Stash Code               UDR3F304.14     
     *             LOOKUP(LBLEV,ENTRY_NO),      ! M08 Level                UDR3F304.15     
     *             LOOKUP(LBFT,ENTRY_NO),       ! Forecast period          UDR3F304.16     
     *             LOOKUP(LBPROJ,ENTRY_NO),     ! M08 Projection no        UDR3F304.17     
     *             NUM_IBM_WORDS,                                          UDR3F304.18     
     *             NVALS,                                                  UDR3F304.19     
     *             PACK_TYPE                    ! Packing Code             UIE0F404.22     
                                                                           UDR3F304.22     
  106 FORMAT(' Field No ',I4,' M08/PP/Stash Code ',I3,I5,I6,               UDR3F304.23     
     &       ' Level ',I5,' Fcst ',I5,' Proj ',I3,                         UDR3F304.24     
     &       ' NWords=',I6,' NVals=',I5,' Pack Type=',I2)                  UIE0F404.23     
                                                                           UDR3F304.26     
        IF(ICODE.EQ.0) THEN                                                FIELDCOS.1548   
          POS_RLABEL=MOD(LOOKUP(LBREL,ENTRY_NO),100)                       PS050793.517    
                                                                           PS050793.518    
          ! Treat lookup(45) as an integer to preserve submodel            UIE0F402.1      
          ! identifier in PP fields transferred between Cray and IBM.      UIE0F402.2      
          POS_RLABEL=46                                                    UIE0F402.3      
                                                                           PS050793.526    
                                                                           PS050793.527    
          LEN_RLABEL=1+LEN1_LOOKUP-POS_RLABEL                              PS050793.528    
          LEN_ILABEL=LEN1_LOOKUP-LEN_RLABEL                                PS050793.529    
          DO I=1,LEN_ILABEL                                                PS050793.530    
            ILABEL(I)=LOOKUP(I,ENTRY_NO)                                   PS050793.531    
          ENDDO                                                            PS050793.532    
                                                                           PS190494.6      
C         check for valid release number                                   PS190494.7      
          if(ilabel(lbrel).lt.1) then                                      PS190494.8      
            WRITE(6,*)' resetting LBREL from',ilabel(lbrel),' to 2'        GIE0F403.197    
            ilabel(lbrel)=2                                                PS190494.10     
          endif                                                            PS190494.11     
                                                                           PS050793.533    
C  test of header with position of reals                                   PS050793.534    
                                                                           PS050793.535    
c         ilabel(lbrel)= 3*1000 + pos_rlabel                               PS050793.536    
c         ilabel(lbrel)= 3                                                 PS050793.537    
c         ilabel(lbsrce)=pos_rlabel                                        PS050793.538    
                                                                           PS050793.539    
c  end of test                                                             PS050793.540    
                                                                           PS050793.541    
          DO I=1,LEN_RLABEL                                                PS050793.542    
            RLABEL(I)=ROOKUP(I+POS_RLABEL-1,ENTRY_NO)                      PS050793.543    
          ENDDO                                                            PS050793.544    
        ENDIF                                                              FIELDCOS.1555   
C=======================================================================   FIELDCOS.1556   
C At this point FIELD holds the data either PACKED or UN-PACKED            FIELDCOS.1557   
C Is the packing indicator set and is un-packing required? If so then      FIELDCOS.1558   
C the data is temp un-packed into a work ARRAY of length IDIM              FIELDCOS.1559   
        IF(PACK_TYPE.GT.0) THEN                ! Is the field packed.      FIELDCOS.1560   
          IF(IEXTRA(1).EQ.0) THEN  ! unpacking is required                 FIELDCOS.1561   
            CALL UN_PACK(PACK_TYPE,IDIM,FIELD,NUM_CRAY_WORDS,              PS050793.545    
     &                   ILABEL,LEN_ILABEL,aMDI,PP_FIXHD,ICODE,CMESSAGE)   PS050793.546    
C           WRITE(7,*) ' NOW UNPACKED INTO ',ILABEL(LBLREC),' WORDS'       UDR3F304.27     
          ENDIF                                                            FIELDCOS.1564   
        ELSEIF(LOOKUP(DATA_TYPE,ENTRY_NO).EQ.3) THEN !Fld is logical       FIELDCOS.1565   
          CALL LOGICAL_TO_REAL(IDIM,FIELD,FIELD,NVALS,                     FIELDCOS.1566   
     &                         ILABEL,ICODE,CMESSAGE)                      FIELDCOS.1567   
        ELSEIF(LOOKUP(DATA_TYPE,ENTRY_NO).EQ.2) THEN !Fld is integer       FIELDCOS.1568   
          CALL INTEGER_TO_REAL(IDIM,FIELD,FIELD,NVALS,                     FIELDCOS.1569   
     &                         ILABEL,ICODE,CMESSAGE)                      FIELDCOS.1570   
        ENDIF                                                              FIELDCOS.1571   
C=======================================================================   FIELDCOS.1572   
 9999 CONTINUE                                                             FIELDCOS.1573   
  100 FORMAT(//,32X,'   ARRAY        ',//,32(16F5.0/))                     FIELDCOS.1574   
  101 FORMAT(//,32X,'   LOOKUP       ',//,32(16I5/))                       FIELDCOS.1575   
  103 FORMAT('   LENIN  ',I12)                                             FIELDCOS.1576   
      RETURN                                                               FIELDCOS.1577   
      END                                                                  FIELDCOS.1578   
                                                                           FIELDCOS.1579   
CLL  Routine: READ_REC--------------------------------------------------   FIELDCOS.1580   
CLL                                                                        FIELDCOS.1581   
CLL  Purpose: To read a data record from a  pp file                        FIELDCOS.1582   
CLL                                                                        FIELDCOS.1583   
CLL  Tested under compiler:   cft77                                        FIELDCOS.1584   
CLL  Tested under OS version: UNICOS 5.1                                   FIELDCOS.1585   
CLL                                                                        FIELDCOS.1586   
CLL  Model            Modification history from model version 3.0:         FIELDCOS.1587   
CLL version  Date                                                          FIELDCOS.1588   
CLL                                                                        FIELDCOS.1589   
CLL  Programming standard: UM Doc Paper 3, version 1 (15/1/90)             FIELDCOS.1590   
CLL                                                                        FIELDCOS.1591   
CLL  Logical components covered: ...                                       FIELDCOS.1592   
CLL                                                                        FIELDCOS.1593   
CLL  Project task: ...                                                     FIELDCOS.1594   
CLL                                                                        FIELDCOS.1595   
CLL  External documentation:                                               FIELDCOS.1596   
CLL                                                                        FIELDCOS.1597   
CLL  -------------------------------------------------------------------   FIELDCOS.1598   
C*L  Interface and arguments: ------------------------------------------   FIELDCOS.1599   
C                                                                          FIELDCOS.1600   

      SUBROUTINE READ_REC(FIELD,NUM_CRAY_WORDS,IWA,PPUNIT,                  3,6FIELDCOS.1601   
     &                    ICODE,CMESSAGE)                                  FIELDCOS.1602   
      IMPLICIT NONE                                                        FIELDCOS.1603   
C     arguments                                                            PS050793.547    
      CHARACTER CMESSAGE*(*)      !OUT error message                       PS050793.548    
      INTEGER                                                              FIELDCOS.1606   
     &     NUM_CRAY_WORDS         !IN  No of CRAY words holding the data   PS050793.549    
     &    ,PPUNIT                 !IN  unit no of the PP FILE              PS050793.550    
     &    ,IWA                    !IN  WORD address of field to be read    FIELDCOS.1610   
     &    ,ICODE                  !OUT error code                          PS050793.551    
      REAL                                                                 FIELDCOS.1611   
     &     FIELD(NUM_CRAY_WORDS)  !OUT array holding data                  FIELDCOS.1612   
C*---------------------------------------------------------------------    PS050793.552    
C     Called routines                                                      PS050793.553    
      EXTERNAL SETPOS,BUFFIN                                               PS050793.554    
C*---------------------------------------------------------------------    PS050793.555    
C     arguments for called routines                                        PS050793.556    
      INTEGER                                                              PS050793.557    
     &     LEN_IO                 ! length of data read by BUFFIN          PS050793.558    
      REAL                                                                 PS050793.559    
     &     A_IO                   ! return code from BUFFIN                PS050793.560    
C    LOCAL VARIABLES                                                       FIELDCOS.1613   
      INTEGER                                                              FIELDCOS.1614   
     &     I                      ! local counter                          FIELDCOS.1615   
     &    ,J                      ! local counter                          FIELDCOS.1616   
     &    ,IX                     ! used in the UNIT command               FIELDCOS.1617   
                                                                           PS050793.561    
      CALL SETPOS(PPUNIT,IWA,ICODE)                                        GTD0F400.77     
      CALL BUFFIN(PPUNIT,FIELD,NUM_CRAY_WORDS,LEN_IO,A_IO)                 FIELDCOS.1623   
                                                                           PS050793.562    
      RETURN                                                               FIELDCOS.1625   
      END                                                                  FIELDCOS.1626   
CLL  Routine: UN_PACK  -------------------------------------------------   FIELDCOS.1627   
CLL                                                                        FIELDCOS.1628   
CLL  Purpose: To unpack data from the input array FIELD and return         FIELDCOS.1629   
CLL  the data in FIELD.                                                    FIELDCOS.1630   
CLL                                                                        FIELDCOS.1631   
CLL  Tested under compiler:   cft77                                        FIELDCOS.1632   
CLL  Tested under OS version: UNICOS 5.1                                   FIELDCOS.1633   
CLL                                                                        FIELDCOS.1634   
CLL  Model            Modification history from model version 3.0:         FIELDCOS.1635   
CLL version  Date                                                          FIELDCOS.1636   
CLL                                                                        FIELDCOS.1637   
CLL  Programming standard: UM Doc Paper 3, version 1 (15/1/90)             FIELDCOS.1638   
CLL                                                                        FIELDCOS.1639   
CLL  Logical components covered:                                           FIELDCOS.1640   
CLL                                                                        FIELDCOS.1641   
CLL  Project task:                                                         FIELDCOS.1642   
CLL                                                                        FIELDCOS.1643   
CLL  External documentation:                                               FIELDCOS.1644   
CLL                                                                        FIELDCOS.1645   
CLL  -------------------------------------------------------------------   FIELDCOS.1646   
C*L  Interface and arguments: ------------------------------------------   FIELDCOS.1647   

      SUBROUTINE UN_PACK(PACK_TYPE,IDIM,FIELD,NUM_CRAY_WORDS,               4,10FIELDCOS.1648   
     &          ILABEL,LEN_ILABEL,AMDI,PP_FIXHD,ICODE,CMESSAGE)            PS050793.563    
      IMPLICIT NONE                                                        PS050793.564    
C     arguments                                                            PS050793.565    
      CHARACTER                                                            PS050793.566    
     &     CMESSAGE*(*)         !OUT error mesages.                        PS050793.567    
      INTEGER                                                              FIELDCOS.1650   
     &     PACK_TYPE            !INOUT Type of packing used                PS050793.568    
     &    ,IDIM                 !IN    full unpacked size of a field       PS050793.569    
     &    ,PP_FIXHD(*)          !IN    PPfile fixed length header          PS050793.570    
     &    ,NUM_CRAY_WORDS       !IN    length of input field               PS050793.571    
     &    ,LEN_ILABEL           !IN    length of ilabel array              PS050793.572    
     &    ,ILABEL(LEN_ILABEL)   !INOUT holds integer part of LOOKUP        PS050793.573    
     &    ,ICODE                !OUT   Non zero for any error              PS050793.574    
      REAL                                                                 FIELDCOS.1656   
     &     FIELD(IDIM)          !INOUT Input contains packed data.         PS050793.575    
C                               !      Output contains un-packed data.     PS050793.576    
     &    ,AMDI                 !IN    Missing data indicator.             PS050793.577    
C*---------------------------------------------------------------------    PS050793.578    
C     Called routines                                                      PS050793.579    
      EXTERNAL COEX,EXPAND21,P21BITS                                       UIE1F403.12     
      INTEGER  P21BITS                                                     FIELDCOS.1665   
C*---------------------------------------------------------------------    PS050793.580    
C     arguments for called routines                                        PS050793.581    
      INTEGER                                                              FIELDCOS.1670   
     &     LEN_FULL_WORD          ! The length of a FULL_WORD              FIELDCOS.1671   
     &    ,IXX                    ! Returned X dimension from COEX         FIELDCOS.1672   
     &    ,IYY                    ! Returned Y dimension from COEX         FIELDCOS.1673   
     &    ,IDUM                   ! Dummy variable                         FIELDCOS.1674   
      REAL                                                                 PS050793.582    
     &     WORK_ARRAY(IDIM)       !WORK array used for un_packing          PS050793.583    
                                                                           PS050793.584    
C     LOCAL  VARIABLES                                                     PS050793.585    
      INTEGER                                                              PS050793.586    
     &     NUM_UNPACK_VALUES      ! Number of numbers originally packed    PS050793.587    
     &    ,I                      ! loop counter                           PS050793.588    
C                                                                          FIELDCOS.1677   
*CALL CLOOKADD                                                             FIELDCOS.1678   
C                                                                          FIELDCOS.1679   
      DATA LEN_FULL_WORD/64/                                               FIELDCOS.1680   
C                                                                          FIELDCOS.1681   
      IF(PACK_TYPE.EQ.1) THEN     ! WGDOS packing                          FIELDCOS.1682   
        CALL COEX(WORK_ARRAY,IDIM,FIELD,NUM_CRAY_WORDS,IXX,IYY,            FIELDCOS.1683   
     &  IDUM,IDUM,.FALSE.,AMDI,LEN_FULL_WORD)                              FIELDCOS.1684   
        NUM_UNPACK_VALUES=IXX*IYY                                          FIELDCOS.1685   
        ILABEL(LBLREC)=ILABEL(LBROW)*ILABEL(LBNPT)+ILABEL(LBEXT)           PS050793.589    
      ELSEIF(PACK_TYPE.EQ.2) THEN !  32 Bit CRAY packing                   UIE1F403.13     
        NUM_CRAY_WORDS=NUM_CRAY_WORDS*2                                    UIE1F403.14     
        CALL EXPAND21(NUM_CRAY_WORDS,FIELD,WORK_ARRAY,                     UIE1F403.15     
     &                P21BITS(PP_FIXHD(12)))                               UIE1F403.16     
        NUM_UNPACK_VALUES=NUM_CRAY_WORDS                                   UIE1F403.17     
      ELSEIF(PACK_TYPE.EQ.3) THEN !  GRIB packing                          APS2F304.39     
        CALL DEGRIB(FIELD,WORK_ARRAY,IDIM,NUM_CRAY_WORDS,                  APS2F304.40     
     &              ILABEL,AMDI,NUM_UNPACK_VALUES,LEN_FULL_WORD)           APS2F304.41     
      ELSE                                                                 FIELDCOS.1691   
        ICODE=6                                                            FIELDCOS.1692   
        CMESSAGE=' UNPACK - packing type not yet supported'                FIELDCOS.1693   
      ENDIF                                                                FIELDCOS.1694   
      DO 8 I=1,NUM_UNPACK_VALUES                                           FIELDCOS.1695   
      FIELD(I)=WORK_ARRAY(I)                                               FIELDCOS.1696   
   8  CONTINUE                                                             FIELDCOS.1697   
      ILABEL(DATA_TYPE)=1  ! data must now be real                         PS050793.590    
      ILABEL(LBPACK)=ILABEL(LBPACK)-PACK_TYPE ! data no longer packed      FIELDCOS.1699   
      PACK_TYPE=0          ! data now not packed                           PS050793.591    
      RETURN                                                               FIELDCOS.1700   
      END                                                                  FIELDCOS.1701   
CLL  Routine: LOGICAL_TO_REAL ------------------------------------------   FIELDCOS.1702   
CLL                                                                        FIELDCOS.1754   
CLL  Purpose: To convert logical data within FIELD to real data.           FIELDCOS.1755   
CLL  the data in FIELD.                                                    FIELDCOS.1756   
CLL                                                                        FIELDCOS.1757   
CLL  Tested under compiler:   cft77                                        FIELDCOS.1758   
CLL  Tested under OS version: UNICOS 5.1                                   FIELDCOS.1759   
CLL                                                                        FIELDCOS.1760   
CLL  Model            Modification history from model version 3.0:         FIELDCOS.1761   
CLL version  Date                                                          FIELDCOS.1762   
CLL                                                                        FIELDCOS.1763   
CLL  Programming standard: UM Doc Paper 3, version 1 (15/1/90)             FIELDCOS.1764   
CLL                                                                        FIELDCOS.1765   
CLL  Logical components covered:                                           FIELDCOS.1766   
CLL                                                                        FIELDCOS.1767   
CLL  Project task:                                                         FIELDCOS.1768   
CLL                                                                        FIELDCOS.1769   
CLL  External documentation:                                               FIELDCOS.1770   
CLL                                                                        FIELDCOS.1771   
CLL  -------------------------------------------------------------------   FIELDCOS.1772   
C*L  Interface and arguments: ------------------------------------------   FIELDCOS.1773   

      SUBROUTINE LOGICAL_TO_REAL(IDIM,LOGICAL_FIELD,FIELD,NVALS,            3PS050793.592    
     &                           ILABEL,ICODE,CMESSAGE)                    FIELDCOS.1775   
      IMPLICIT NONE                                                        PS050793.593    
C     arguments                                                            PS050793.594    
      CHARACTER                                                            PS050793.595    
     &     CMESSAGE*(*)         !OUT error mesages.                        PS050793.596    
      INTEGER                                                              FIELDCOS.1776   
     &     IDIM                 !IN full unpacked size of a field          PS050793.597    
     &    ,NVALS                !IN no of values in an input field         PS050793.598    
     &    ,ILABEL(44)           !OUT integer part of LOOKUP                PS050793.599    
     &    ,ICODE                !OUT error code                            PS050793.600    
      REAL                                                                 FIELDCOS.1781   
     &     FIELD(IDIM)          !OUT contains Real data.                   PS050793.601    
      LOGICAL                                                              PS050793.602    
     &     LOGICAL_FIELD(IDIM)  !IN contains logical data.                 PS050793.603    
C                               ! contains the un-packed data.             FIELDCOS.1783   
c     Local variables                                                      PS050793.604    
      INTEGER                                                              FIELDCOS.1787   
     &     I                    ! loop counter                             PS050793.605    
C                                                                          FIELDCOS.1789   
*CALL CLOOKADD                                                             FIELDCOS.1790   
C                                                                          FIELDCOS.1791   
                                                                           PS050793.606    
      DO  I=1,NVALS                                                        PS050793.607    
        IF(LOGICAL_FIELD(I))THEN                                           PS050793.608    
          FIELD(I)=1.0                                                     PS050793.609    
        ELSE                                                               PS050793.610    
          FIELD(I)=0.0                                                     PS050793.611    
        ENDIF                                                              PS050793.612    
      ENDDO                                                                PS050793.613    
      ILABEL(DATA_TYPE)=1     ! The data type must now be real             PS050793.614    
      ICODE=0                                                              PS050793.615    
      RETURN                                                               PS050793.616    
      END                                                                  PS050793.617    
CLL  Routine: INTEGER_TO_REAL ------------------------------------------   PS050793.618    
CLL                                                                        PS050793.619    
CLL  Purpose: To convert logical data within FIELD to real data.           PS050793.620    
CLL  the data in FIELD.                                                    PS050793.621    
CLL                                                                        PS050793.622    
CLL  Tested under compiler:   cft77                                        PS050793.623    
CLL  Tested under OS version: UNICOS 5.1                                   PS050793.624    
CLL                                                                        PS050793.625    
CLL  Model            Modification history:                                PS050793.626    
CLL version  Date                                                          PS050793.627    
CLL                                                                        PS050793.628    
CLL  Programming standard: UM Doc Paper 3, version 1 (15/1/90)             PS050793.629    
CLL                                                                        PS050793.630    
CLL  Logical components covered:                                           PS050793.631    
CLL                                                                        PS050793.632    
CLL  Project task:                                                         PS050793.633    
CLL                                                                        PS050793.634    
CLL  External documentation:                                               PS050793.635    
CLL                                                                        PS050793.636    
CLL  -------------------------------------------------------------------   PS050793.637    
C*L  Interface and arguments: ------------------------------------------   PS050793.638    

      SUBROUTINE INTEGER_TO_REAL(IDIM,INTEGER_FIELD,FIELD,NVALS,            3PS050793.639    
     &                           ILABEL,ICODE,CMESSAGE)                    PS050793.640    
      IMPLICIT NONE                                                        PS050793.641    
C     arguments                                                            PS050793.642    
      CHARACTER                                                            PS050793.643    
     &     CMESSAGE*(*)         !OUT error mesages.                        PS050793.644    
      INTEGER                                                              PS050793.645    
     &     IDIM                 !IN full unpacked size of a field          PS050793.646    
     &    ,NVALS                !IN no of values in an input field         PS050793.647    
     &    ,INTEGER_FIELD(IDIM)  !IN contains integer data.                 PS050793.648    
     &    ,ILABEL(44)           !OUT integer part of LOOKUP                PS050793.649    
     &    ,ICODE                !OUT error code                            PS050793.650    
      REAL                                                                 PS050793.651    
     &     FIELD(IDIM)          !OUT contains Real data.                   PS050793.652    
c     Local variables                                                      PS050793.653    
      INTEGER                                                              PS050793.654    
     &     I                    ! loop counter                             PS050793.655    
C                                                                          PS050793.656    
*CALL CLOOKADD                                                             PS050793.657    
C                                                                          PS050793.658    
                                                                           PS050793.659    
      DO  I=1,NVALS                                                        FIELDCOS.1792   
        FIELD(I)=INTEGER_FIELD(I)                                          FIELDCOS.1793   
      ENDDO                                                                FIELDCOS.1794   
      ILABEL(DATA_TYPE)=1       ! The data type must now be real           PS050793.660    
      ICODE=0                                                              FIELDCOS.1796   
      RETURN                                                               FIELDCOS.1797   
      END                                                                  FIELDCOS.1798   
*ENDIF                                                                     FIELDCOS.1799   
                                                                           FIELDCOS.1800   

      INTEGER FUNCTION INT_FROM_REAL(number)                                3FIELDCOS.1801   
C function to return the integer EQUIVALENCE of a real number              FIELDCOS.1802   
      integer number                                                       FIELDCOS.1803   
      int_from_real=number                                                 FIELDCOS.1804   
      RETURN                                                               FIELDCOS.1805   
      END                                                                  FIELDCOS.1806   
                                                                           FIELDCOS.1807   
CLL  Routine: CHECK_EXTRA ----------------------------------------------   PS050793.661    
CLL                                                                        PS050793.662    
CLL  Purpose: To check that code is correct for vector                     PS050793.663    
CLL                                                                        PS050793.664    
CLL  Tested under compiler:   cft77                                        PS050793.665    
CLL  Tested under OS version: UNICOS 5.1                                   PS050793.666    
CLL                                                                        PS050793.667    
CLL  Model            Modification history:                                PS050793.668    
CLL version  Date                                                          PS050793.669    
CLL                                                                        PS050793.670    
CLL  Programming standard: UM Doc Paper 3, version 1 (15/1/90)             PS050793.671    
CLL                                                                        PS050793.672    
CLL  Logical components covered:                                           PS050793.673    
CLL                                                                        PS050793.674    
CLL  Project task:                                                         PS050793.675    
CLL                                                                        PS050793.676    
CLL  External documentation:                                               PS050793.677    
CLL                                                                        PS050793.678    
CLL  -------------------------------------------------------------------   PS050793.679    
C*L  Interface and arguments: ------------------------------------------   PS050793.680    

      SUBROUTINE CHECK_EXTRA(CODE,DATA_VALUES,ICODE,CMESSAGE)               3PS050793.681    
      IMPLICIT NONE                                                        PS050793.682    
C     arguments                                                            PS050793.683    
      CHARACTER                                                            PS050793.684    
     &     CMESSAGE*(*)         !OUT error message                         PS050793.685    
      INTEGER                                                              PS050793.686    
     &     CODE                 !IN Code to be checked                     PS050793.687    
     &    ,DATA_VALUES          !IN Number of data values in vector        PS050793.688    
     &    ,ICODE                !OUT error code                            PS050793.689    
c     Local variables                                                      PS050793.690    
      INTEGER                                                              PS050793.691    
     &     TYPE                                                            PS050793.692    
                                                                           FIELDCOS.1815   
      DATA_VALUES=CODE/1000                                                PS050793.693    
      TYPE=CODE-DATA_VALUES*1000                                           PS050793.694    
      IF (.NOT.(TYPE.LT.10.AND.TYPE.GT.0)) THEN ! TYPE is one of real se   PS050793.695    
        ICODE=1                                                            PS050793.696    
        IF (CODE.EQ.10) THEN                                               PS050793.697    
          CMESSAGE='CHECK_DATA: Char extra not supported at present'       PS050793.698    
        ELSE                                                               FIELDCOS.1823   
          CMESSAGE='CHECK_DATA: Unrecognized code in extra data'           PS050793.699    
        ENDIF                                                              FIELDCOS.1825   
        RETURN                                                             FIELDCOS.1826   
      ENDIF                                                                FIELDCOS.1827   
      RETURN                                                               FIELDCOS.1828   
      END                                                                  FIELDCOS.1829   
                                                                           FIELDCOS.1830   

      INTEGER FUNCTION CRAY2VAX(I,LEN_RLABEL,                               10UIE1F402.23     
     &                          VAX_LABEL,BIT_OFF,RLABEL)                  UIE1F402.24     
      INTEGER I,LEN_RLABEL,BIT_OFF,VAX_LABEL                               UIE1F402.25     
      REAL RLABEL                                                          UIE1F402.26     
      CRAY2VAX=-1                                                          UIE1F402.27     
      RETURN                                                               UIE1F402.28     
      END                                                                  UIE1F402.29