*IF DEF,CONVIEEE CONVIEE1.2
C ******************************COPYRIGHT****************************** GTS2F400.1297
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.1298
C GTS2F400.1299
C Use, duplication or disclosure of this code is subject to the GTS2F400.1300
C restrictions as set forth in the contract. GTS2F400.1301
C GTS2F400.1302
C Meteorological Office GTS2F400.1303
C London Road GTS2F400.1304
C BRACKNELL GTS2F400.1305
C Berkshire UK GTS2F400.1306
C RG12 2SZ GTS2F400.1307
C GTS2F400.1308
C If no contract has been raised with this copy of the code, the use, GTS2F400.1309
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.1310
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.1311
C Modelling at the above address. GTS2F400.1312
C ******************************COPYRIGHT****************************** GTS2F400.1313
C GTS2F400.1314
CLL PROGRAM MAIN_CONVIEEE and SUBROUTINE CONVIEEE ------------------ CONVIEE1.3
CLL CONVIEE1.4
CLL Written by A. Dickinson 05/05/92 CONVIEE1.5
CLL CONVIEE1.6
CLL Model Modification history from model version 3.0: CONVIEE1.7
CLL version Date CONVIEE1.8
CLL 3.2 06/04/93 Correct use of packing indicator as per vn2.8 AD070493.1
CLL Author: A.Dickinson Reviewer: P.Burton AD070493.2
CLL AD060593.24
CLL 3.2 06/05/93 Extend code to recognise PP type files AD060593.25
CLL Author: A. Dickinson Reviewer: D. Richardson AD060593.26
CLL 3.3 08/12/93 Extra argument for READFLDS. DR081293.68
CLL Author: A. Dickinson Reviewer: D. Richardson DR081293.69
CLL AD311093.3
CLL 3.3 31/10/93 Dimension of data array set to maximum value AD311093.4
CLL Author: A. Dickinson Reviewer: P.Burton AD311093.5
CLL 3.4 11/10/94 Part of modset which makes sure that LOGICAL's are UDG8F304.1
CLL set correctly for IEEE machines covered by CONVIEEE UDG8F304.2
CLL Necessary to port model to a T3D. UDG8F304.3
CLL Author D.M. Goddard UDG8F304.4
CLL 3.5 24/03/95 Changed OPEN to FILE_OPEN P.Burton GPB1F305.18
! 4.0 21/12/95 Timeseries now catered for UDG7F400.214
! Author D.M. Goddard. UDG7F400.215
! 4.0 18/06/96 Changes to cope with changes in STASH addressing GDG0F401.380
! Author D.M. Goddard. GDG0F401.381
! 4.3 02/04/97 Remove surplus definition of GETARG D.M.Goddard UDG4F403.1
! 4.3 15/04/97 Extra argument for READFLDS to select 32-64 bit UDG6F403.1
! expansion routine EXPAND21 or C90_EXPAND21 UDG6F403.2
! D.M.Goddard UDG6F403.3
! 4.3 06/05/97 Prevents program crashing if a number, which is UDG7F403.1
! unrepresentable in 32 bits, is present. UDG7F403.2
! Unrepresentable number is replaced by RMDI UDG7F403.3
! Author: D.M. Goddard UDG7F403.4
CLL 4.4 Oct. 1997 Changed error handling from routine HDPPXRF GDW1F404.150
CLL so only fatal (+ve) errors are handled. GDW1F404.151
CLL Shaun de Witt GDW1F404.152
! 4.4 23/09/97 Produce correct well-formed 32-bit GBCYF404.1
! dumpfiles. GBCYF404.2
! Author: Bob Carruthhers, Cray Research GBCYF404.3
! 4.4 17/07/97 Introduce conversion from ieee to Cray PVP UDG2F404.1
! numbers and reintroduce functionality for UDG2F404.2
! PVP machines UDG2F404.3
! Author: D.M. Goddard UDG2F404.4
! 4.4 24/10/97 Initialise ICODE as it is no longer UDG9F404.22
! initialised in HDPPXRF UDG9F404.23
! Author D.M. Goddard UDG9F404.24
! 4.5 01/04/98 Removed SETPOS32 subroutine as it is now available GPB5F405.1
! in C PORTIO2A. P.Burton GPB5F405.2
! 4.5 14/10/97 Sets correct most significant number UDG1F405.37
! in packing indicator. UDG1F405.38
! Either 2 for CRAY format or 3 for IEEE format UDG1F405.39
! Author D.M. Goddard UDG1F405.40
! 4.5 14/01/98 Conversion of data moved into new subroutines UDG1F405.41
! ATMOS_CONVIEEE and OCEAN_CONVIEEE depending on UDG1F405.42
! whether an atmosphere or ocean dataset is being UDG1F405.43
! processed. The ocean subroutine contains UDG1F405.44
! additional code to expand ocean compressed fields UDG1F405.45
! before conversion. UDG1F405.46
! Author D.M. Goddard UDG1F405.47
! 4.5 13/07/98 In boundary datasets the entire block of data for UDG1F405.48
! a given time is rounded up to a sector boundary UDG1F405.49
! in well formed datasets rather than individual UDG1F405.50
! fields. Subroutine set_dumpfile_address is UDG1F405.51
! skipped for boundary files and the addressing UDG1F405.52
! caluclated in subroutine CONVIEEE. UDG1F405.53
! Author D.M. Goddard UDG1F405.54
CLL CONVIEE1.9
CLL Purpose: Converts a dump, ancillary or fieldsfile UDG2F404.5
CLL (atmosphere or ocean) from CRAY PVP format UDG2F404.6
CLL into 32-bit or 64-bit IEEE format or vice-versa. UDG2F404.7
CLL The following conversions are supported:- UDG2F404.8
CLL On a IEEE machine ie CRAY T3E UDG2F404.9
CLL Cray PVP to 64-bit IEEE UDG2F404.10
CLL 64-bit IEEE to 32-bit IEEE UDG2F404.11
CLL 64-bit IEEE to Cray PVP UDG2F404.12
CLL On a PVP machine ie C90 UDG2F404.13
CLL Cray PVP to 64-bit IEEE UDG2F404.14
CLL Cray PVP to 32-bit IEEE UDG2F404.15
CLL MAIN_CONVIEEE reads in fixed length and integer CONVIEE1.12
CLL headers of UM file to be converted, extracts dimensions CONVIEE1.13
CLL of file and then passes these values to CONVIEE1.14
CLL subroutine CONVIEEE. CONVIEE1.15
CLL CONVIEE1.16
CLL CONVIEEE Converts a dump, ancillary or fieldsfile UDG2F404.16
CLL (atmosphere or ocean) from CRAY PVP format UDG2F404.17
CLL into 32-bit or 64-bit IEEE format or vice-versa. UDG2F404.18
CLL CONVIEEE reads in headers and data fields from unit NFTIN CONVIEE1.20
CLL converts them to IEEE format and writes them to NFTOUT. CONVIEE1.21
CLL CONVIEE1.22
CLL Documentation: UM Doc Paper F5 CONVIEE1.23
CLL CONVIEE1.24
CLLEND---------------------------------------------------------------- CONVIEE1.25
PROGRAM MAIN_CONVIEEE ,14CONVIEE1.26
CONVIEE1.27
IMPLICIT NONE CONVIEE1.28
CONVIEE1.29
INTEGER CONVIEE1.30
& FIXHD(256) !Space for fixed length header CONVIEE1.31
&,INTHD(100) !Space for integer header CONVIEE1.32
CONVIEE1.33
INTEGER CONVIEE1.34
& LEN_FIXHD !Length of fixed length header on input file CONVIEE1.35
&,LEN_INTHD !Length of integer header on input file CONVIEE1.36
&,LEN_REALHD !Length of real header on input file CONVIEE1.37
&,LEN1_LEVDEPC !1st dim of lev dependent consts on input file CONVIEE1.38
&,LEN2_LEVDEPC !2nd dim of lev dependent consts on input file CONVIEE1.39
&,LEN1_ROWDEPC !1st dim of row dependent consts on input file CONVIEE1.40
&,LEN2_ROWDEPC !2nd dim of row dependent consts on input file CONVIEE1.41
&,LEN1_COLDEPC !1st dim of col dependent consts on input file CONVIEE1.42
&,LEN2_COLDEPC !2nd dim of col dependent consts on input file CONVIEE1.43
&,LEN1_FLDDEPC !1st dim of field dependent consts on input file CONVIEE1.44
&,LEN2_FLDDEPC !2nd dim of field dependent consts on input file CONVIEE1.45
&,LEN_EXTCNST !Length of extra consts on input file CONVIEE1.46
&,LEN_DUMPHIST !Length of history header on input file CONVIEE1.47
&,LEN_CFI1 !Length of index1 on input file CONVIEE1.48
&,LEN_CFI2 !Length of index2 on input file CONVIEE1.49
&,LEN_CFI3 !Length of index3 on input file CONVIEE1.50
&,LEN1_LOOKUP !1st dim of LOOKUP on input file CONVIEE1.51
&,LEN2_LOOKUP !2nd dim of LOOKUP on input file CONVIEE1.52
&,LEN_DATA !Length of data on input file CONVIEE1.53
&,ROW_LENGTH !No of points E-W on input file CONVIEE1.54
&,P_ROWS !No of p-rows on input file CONVIEE1.55
&,P_FIELD !No of p-points per level on input file CONVIEE1.56
&,MAX_FIELD_SIZE !Maximum field size on file AD311093.6
CONVIEE1.57
INTEGER CONVIEE1.58
& LEN_IO !Length of I/O returned by BUFFER IN CONVIEE1.59
&,I !Loop index CONVIEE1.60
&,NFTIN !Unit number of input UM dump CONVIEE1.61
&,NFTOUT !Unit number of output IEEE dump CONVIEE1.62
&,ERR !Return code from OPEN CONVIEE1.63
&,IEEE_TYPE ! Output file precision CONVIEE1.64
&,ICODE !Return code from setpos GTD0F400.50
&,LEN !Length of string returned by PXFGETARG UDG1F402.1
&,IERR !Return code from PXFGETARG UDG1F402.2
CONVIEE1.66
LOGICAL LPVP !TRUE if output required in PVP format UDG2F404.19
CHARACTER *80 CONVIEE1.67
& STRING ! Character string holding command line arg CONVIEE1.68
CONVIEE1.69
REAL A !Return code from BUFFIN; -1.0 = O.K. CONVIEE1.70
CONVIEE1.71
integer wgdos_expand UBC2F402.1
CONVIEE1.72
*CALL CNTL_IO
UDG2F404.20
UDG2F404.21
C External subroutines called:------------------------------------------ CONVIEE1.73
EXTERNAL IOERROR,ABORT_IO,BUFFIN,FILE_OPEN, GPB1F305.19
& SETPOS,ABORT,CONVIEEE,PXFGETARG UDG1F402.3
C*---------------------------------------------------------------------- CONVIEE1.75
UDG2F404.22
LPVP=.FALSE. UDG2F404.23
CONVIEE1.76
c--select no WGDOS expansion UBC2F402.2
wgdos_expand=0 UBC2F402.3
CONVIEE1.77
CL 0. Read in precision of output file CONVIEE1.78
CALL PXFGETARG(
1,STRING,LEN,IERR) UDG1F402.4
IF(LEN.NE.2.OR.IERR.NE.0)THEN UDG1F402.5
IEEE_TYPE=32 CONVIEE1.81
if(len.eq.3 .and. ierr.eq.0) then UBC2F402.4
if(string.eq.'32e' .or. string.eq.'32E') then UBC2F402.5
wgdos_expand=1 UBC2F402.6
else if(string.eq.'64e' .or. string.eq.'64E') then UBC2F402.7
ieee_type=64 UBC2F402.8
wgdos_expand=1 UBC2F402.9
else if(string.eq.'64c' .or. string.eq.'64C') then UDG2F404.24
ieee_type=64 UDG2F404.25
lpvp=.true. UDG2F404.26
else UDG2F404.27
WRITE(6,*)'Unsupported word length ',STRING UDG2F404.28
CALL ABORT
UDG2F404.29
endif UBC2F402.10
elseif(len.eq.4 .and. ierr.eq.0) then UDG2F404.30
if(string.eq.'64ce' .or. string.eq.'64ec' .or. UDG2F404.31
& string.eq.'64CE' .or. string.eq.'64EC' ) then UDG2F404.32
ieee_type=64 UDG2F404.33
lpvp=.true. UDG2F404.34
wgdos_expand=1 UDG2F404.35
else UDG2F404.36
WRITE(6,*)'Unsupported word length ',STRING UDG2F404.37
CALL ABORT
UDG2F404.38
end if UDG2F404.39
endif UBC2F402.11
ELSE CONVIEE1.82
IF(STRING.EQ.'32')THEN CONVIEE1.83
IEEE_TYPE=32 CONVIEE1.84
ELSEIF(STRING.EQ.'64')THEN CONVIEE1.85
IEEE_TYPE=64 CONVIEE1.86
ELSE CONVIEE1.87
WRITE(6,*)'Unsupported word length ',STRING CONVIEE1.88
CALL ABORT
CONVIEE1.89
ENDIF CONVIEE1.90
ENDIF CONVIEE1.91
c UBC2F402.12
IF(WGDOS_EXPAND.EQ.0) THEN UDG2F404.40
IF(LPVP)THEN UDG2F404.41
WRITE(6,'(/''Conversion to PVP '',i2,''-bit Format'', UDG2F404.42
& '' with no expansion of WGDOS Fields''/)') ieee_type UDG2F404.43
ELSE UDG2F404.44
WRITE(6,'(/''Conversion to IEEE '',i2,''-bit Format'', UDG2F404.45
& '' with no expansion of WGDOS Fields''/)') ieee_type UDG2F404.46
END IF UDG2F404.47
ELSE UDG2F404.48
IF(LPVP)THEN UDG2F404.49
WRITE(6,'(/''Conversion to PVP '',i2,''-bit Format'', UDG2F404.50
& '' with expansion of WGDOS Fields''/)') ieee_type UDG2F404.51
ELSE UDG2F404.52
WRITE(6,'(/''Conversion to IEEE '',i2,''-bit Format'', UDG2F404.53
& '' with expansion of WGDOS Fields''/)') ieee_type UDG2F404.54
END IF UDG2F404.55
END IF UDG2F404.56
CONVIEE1.92
CONVIEE1.93
CL 1. Assign unit numbers CONVIEE1.94
CONVIEE1.95
NFTIN=20 CONVIEE1.96
NFTOUT=21 CONVIEE1.97
CONVIEE1.98
WRITE(6,'(20x,''FILE STATUS'')') CONVIEE1.99
WRITE(6,'(20x,''==========='')') CONVIEE1.100
C CALL OPEN(1,'PPXREF',6,0,0,ERR) CONVIEE1.101
CALL FILE_OPEN
(20,'FILE1',5,0,0,ERR) GPB1F305.21
CALL FILE_OPEN
(21,'FILE2',5,1,0,ERR) GPB1F305.22
CONVIEE1.104
CONVIEE1.105
CL 2. Buffer in fixed length header record CONVIEE1.106
CONVIEE1.107
CALL BUFFIN
(NFTIN,FIXHD,256,LEN_IO,A) CONVIEE1.108
CONVIEE1.109
C Check for I/O errors CONVIEE1.110
IF(A.NE.-1.0.OR.LEN_IO.NE.256)THEN CONVIEE1.111
CALL IOERROR
('buffer in of fixed length header of input dump', CONVIEE1.112
* A,LEN_IO,256) CONVIEE1.113
CALL ABORT
CONVIEE1.114
ENDIF CONVIEE1.115
CONVIEE1.116
C Set missing data indicator to zero CONVIEE1.117
DO I=1,256 CONVIEE1.118
IF(FIXHD(I).LT.0)FIXHD(I)=0 CONVIEE1.119
ENDDO CONVIEE1.120
CONVIEE1.121
C Input file dimensions CONVIEE1.122
LEN_FIXHD=256 CONVIEE1.123
LEN_INTHD=FIXHD(101) CONVIEE1.124
LEN_REALHD=FIXHD(106) CONVIEE1.125
LEN1_LEVDEPC=FIXHD(111) CONVIEE1.126
LEN2_LEVDEPC=FIXHD(112) CONVIEE1.127
LEN1_ROWDEPC=FIXHD(116) CONVIEE1.128
LEN2_ROWDEPC=FIXHD(117) CONVIEE1.129
LEN1_COLDEPC=FIXHD(121) CONVIEE1.130
LEN2_COLDEPC=FIXHD(122) CONVIEE1.131
LEN1_FLDDEPC=FIXHD(126) CONVIEE1.132
LEN2_FLDDEPC=FIXHD(127) CONVIEE1.133
LEN_EXTCNST=FIXHD(131) CONVIEE1.134
LEN_DUMPHIST=FIXHD(136) CONVIEE1.135
LEN_CFI1=FIXHD(141) CONVIEE1.136
LEN_CFI2=FIXHD(143) CONVIEE1.137
LEN_CFI3=FIXHD(145) CONVIEE1.138
LEN1_LOOKUP=FIXHD(151) CONVIEE1.139
LEN2_LOOKUP=FIXHD(152) CONVIEE1.140
LEN_DATA=FIXHD(161) CONVIEE1.141
CONVIEE1.142
CONVIEE1.143
CL 3. Buffer in integer constants from dump CONVIEE1.144
CONVIEE1.145
CALL BUFFIN
(NFTIN,INTHD,FIXHD(101),LEN_IO,A) CONVIEE1.146
CONVIEE1.147
C Check for I/O errors CONVIEE1.148
IF(A.NE.-1.0.OR.LEN_IO.NE.FIXHD(101))THEN CONVIEE1.149
CALL IOERROR
('buffer in of integer constants in input dump', CONVIEE1.150
* A,LEN_IO,FIXHD(101)) CONVIEE1.151
CALL ABORT
CONVIEE1.152
ENDIF CONVIEE1.153
CONVIEE1.154
C Set missing data indicator to zero CONVIEE1.155
DO I=1,FIXHD(101) CONVIEE1.156
IF(INTHD(I).LT.0)INTHD(I)=0 CONVIEE1.157
ENDDO CONVIEE1.158
CONVIEE1.159
ROW_LENGTH=INTHD(6) CONVIEE1.160
P_ROWS=INTHD(7) CONVIEE1.161
P_FIELD=ROW_LENGTH*P_ROWS CONVIEE1.162
CONVIEE1.163
! If converting to CRAY format reset um_sector_size = 1 UDG2F404.57
IF(LPVP)THEN UDG2F404.58
um_sector_size = 1 UDG2F404.59
ENDIF UDG2F404.60
AD311093.7
CL Extract maximum field size from LOOKUP header AD311093.8
CALL FIND_MAX_FIELD_SIZE
AD311093.9
& (NFTIN,FIXHD(151),FIXHD(152),FIXHD,MAX_FIELD_SIZE, UBC2F402.20
& wgdos_expand) UBC2F402.21
C Rewind file CONVIEE1.164
CALL SETPOS
(NFTIN,0,ICODE) GTD0F400.51
CONVIEE1.166
CL 4. Call CONVIEEE CONVIEE1.167
CONVIEE1.168
CALL CONVIEEE
(LEN_FIXHD,LEN_INTHD,LEN_REALHD, CONVIEE1.169
& LEN1_LEVDEPC,LEN2_LEVDEPC,LEN1_ROWDEPC, CONVIEE1.170
& LEN2_ROWDEPC,LEN1_COLDEPC,LEN2_COLDEPC, CONVIEE1.171
& LEN1_FLDDEPC,LEN2_FLDDEPC,LEN_EXTCNST, CONVIEE1.172
& LEN_DUMPHIST,LEN_CFI1,LEN_CFI2,LEN_CFI3, CONVIEE1.173
& LEN1_LOOKUP,LEN2_LOOKUP,LEN_DATA,P_FIELD, CONVIEE1.174
& NFTIN,NFTOUT,IEEE_TYPE,LPVP, UDG2F404.61
& MAX_FIELD_SIZE, WGDOS_EXPAND) UDG2F404.62
CONVIEE1.176
STOP CONVIEE1.177
END CONVIEE1.178
C*L Arguments:------------------------------------------------------- CONVIEE1.179
SUBROUTINE CONVIEEE 1,26CONVIEE1.180
& (LEN_FIXHD,LEN_INTHD,LEN_REALHD, CONVIEE1.181
& LEN1_LEVDEPC,LEN2_LEVDEPC,LEN1_ROWDEPC, CONVIEE1.182
& LEN2_ROWDEPC,LEN1_COLDEPC,LEN2_COLDEPC, CONVIEE1.183
& LEN1_FLDDEPC,LEN2_FLDDEPC,LEN_EXTCNST, CONVIEE1.184
& LEN_DUMPHIST,LEN_CFI1,LEN_CFI2,LEN_CFI3, CONVIEE1.185
& LEN1_LOOKUP,LEN2_LOOKUP,LEN_DATA,P_FIELD, CONVIEE1.186
& NFTIN,NFTOUT,IEEE_TYPE,LPVP, UDG2F404.63
& MAX_FIELD_SIZE, WGDOS_EXPAND) UDG2F404.64
CONVIEE1.188
IMPLICIT NONE CONVIEE1.189
CONVIEE1.190
INTEGER CONVIEE1.191
CONVIEE1.192
& LEN_FIXHD !IN Length of fixed length header on input file CONVIEE1.193
&,LEN_INTHD !IN Length of integer header on input file CONVIEE1.194
&,LEN_REALHD !IN Length of real header on input file CONVIEE1.195
&,LEN1_LEVDEPC !IN 1st dim of lev dependent consts on input file CONVIEE1.196
&,LEN2_LEVDEPC !IN 2nd dim of lev dependent consts on input file CONVIEE1.197
&,LEN1_ROWDEPC !IN 1st dim of row dependent consts on input file CONVIEE1.198
&,LEN2_ROWDEPC !IN 2nd dim of row dependent consts on input file CONVIEE1.199
&,LEN1_COLDEPC !IN 1st dim of col dependent consts on input file CONVIEE1.200
&,LEN2_COLDEPC !IN 2nd dim of col dependent consts on input file CONVIEE1.201
&,LEN1_FLDDEPC !IN 1st dim of field dependent consts on input fi CONVIEE1.202
&,LEN2_FLDDEPC !IN 2nd dim of field dependent consts on input fi CONVIEE1.203
&,LEN_EXTCNST !IN Length of extra consts on input file CONVIEE1.204
&,LEN_DUMPHIST !IN Length of history header on input file CONVIEE1.205
&,LEN_CFI1 !IN Length of index1 on input file CONVIEE1.206
&,LEN_CFI2 !IN Length of index2 on input file CONVIEE1.207
&,LEN_CFI3 !IN Length of index3 on input file CONVIEE1.208
&,LEN1_LOOKUP !IN 1st dim of LOOKUP on input file CONVIEE1.209
&,LEN2_LOOKUP !IN 2nd dim of LOOKUP on input file CONVIEE1.210
&,LEN_DATA !IN Length of data on input file CONVIEE1.211
&,P_FIELD !IN No of p-points per level on input file CONVIEE1.212
&,MAX_FIELD_SIZE !Maximum field size on file AD311093.13
integer wgdos_expand ! set to 1 for expansion of WGDOS Fields UBC2F402.24
CONVIEE1.213
INTEGER CONVIEE1.214
& NFTIN !IN Unit number of input UM dump CONVIEE1.215
&,NFTOUT !IN Unit number of output IEEE dump CONVIEE1.216
&,IEEE_TYPE ! Output file precision CONVIEE1.217
CONVIEE1.218
LOGICAL LPVP !IN: TRUE if output required in PVP format UDG2F404.65
C Local arrays:--------------------------------------------------------- CONVIEE1.219
INTEGER CONVIEE1.220
& FIXHD(LEN_FIXHD), ! CONVIEE1.221
& INTHD(LEN_INTHD), !\ integer CONVIEE1.222
& CFI1(LEN_CFI1+1),CFI2(LEN_CFI2+1), ! > file headers CONVIEE1.223
& CFI3(LEN_CFI3+1), !/ CONVIEE1.224
& LOOKUP(LEN1_LOOKUP,LEN2_LOOKUP), ! CONVIEE1.225
& LOOKUP_21(LEN2_LOOKUP) ! Holds values of input LOOKUP(21,K) CONVIEE1.226
&,LOOKUP_LBNREC(LEN2_LOOKUP) AD060593.27
&,lookup_lblrec(len2_lookup) UBC2F402.25
&,lookup_lbegin(len2_lookup) ! Old value of lbegin in lookup GBCYF404.4
&,lookup_lblrec_new(len2_lookup) ! New value of lblrec in lookup GBCYF404.5
&,lookup_lbnrec_new(len2_lookup) ! New value of lbnrec in lookup GBCYF404.6
&,lookup_lbegin_new(len2_lookup) ! New value of lbegin in lookup GBCYF404.7
&,disk_address ! Current rounded disk address GBCYF404.8
&,number_of_data_words_on_disk ! Number of data words on disk GBCYF404.9
&,number_of_data_words_in_memory ! Number of Data Words in memory GBCYF404.10
&,old_fixhd_160 ! Input value of FIXHD(160) GBCYF404.11
&,new_fixhd_160 ! Output value of FIXHD(160) GBCYF404.12
CONVIEE1.227
REAL CONVIEE1.228
& REALHD(LEN_REALHD), CONVIEE1.229
& LEVDEPC(1+LEN1_LEVDEPC*LEN2_LEVDEPC), ! CONVIEE1.230
& ROWDEPC(1+LEN1_ROWDEPC*LEN2_ROWDEPC), ! CONVIEE1.231
& COLDEPC(1+LEN1_COLDEPC*LEN2_COLDEPC), !\ real CONVIEE1.232
& FLDDEPC(1+LEN1_FLDDEPC*LEN2_FLDDEPC), ! > file headers CONVIEE1.233
& EXTCNST(LEN_EXTCNST+1), !/ CONVIEE1.234
& DUMPHIST(LEN_DUMPHIST+1) UDG8F304.5
INTEGER UDG8F304.6
& D1(MAX_FIELD_SIZE) ! Data array used to read in each field AD311093.14
REAL*4 IEEE_32(MAX_FIELD_SIZE) !Array containing 32 bit IEEE data UDG7F403.5
REAL*8 IEEE_64(MAX_FIELD_SIZE) !Array containing 64 bit IEEE data UDG7F403.6
CONVIEE1.238
C External subroutines called:------------------------------------------ CONVIEE1.239
EXTERNAL READHEAD,WRITHEAD,ABORT,READFLDS,ABORT_IO,HDPPXRF,GETPPX UDG1F405.55
C*---------------------------------------------------------------------- CONVIEE1.243
C*L Local variables:--------------------------------------------------- CONVIEE1.244
CONVIEE1.245
INTEGER CONVIEE1.246
& ICODE ! Error return code from subroutines CONVIEE1.247
&,START_BLOCK ! READHEAD argument (not used) CONVIEE1.248
&,I,J,K,L ! Loop indices CONVIEE1.249
&,LEN_IO ! I/O length CONVIEE1.250
&,ITYPE ! Conversion type CONVIEE1.251
&,MODEL ! Internal model number UDG1F405.56
&,SECTION ! Section number UDG1F405.57
&,ITEM ! Item code UDG1F405.58
&,JOC_NO_SEAPTS ! Number of points in compressed ocean field UDG1F405.59
&,LEN_OCFLD ! Length of uncompressed ocean field UDG1F405.60
&,INIT_FIXHD_161 ! Initialised value of FIXHD(161) UDG1F405.61
&,PPXREF_GRID_TYPE ! Grid type form ppxref UDG1F405.62
&,LEN_BUF ! Record length of boundary dataset UDG1F405.63
&,MAX_LEN_BUF ! Maximum record length of boundary dataset UDG1F405.64
&,POS ! Position of field in file UDG1F405.65
UDG1F405.66
INTEGER EXPPXI UDG1F405.67
EXTERNAL EXPPXI UDG1F405.68
INTEGER RowNumber GDG0F401.383
GDG0F401.384
CONVIEE1.253
REAL A !Return code from BUFFIN; -1.0 = O.K. CONVIEE1.254
CONVIEE1.255
CHARACTER CONVIEE1.256
& CMESSAGE*100 ! Character string returned if ICODE .ne. 0 CONVIEE1.257
INTEGER NFT1,NFT2 GDG0F401.385
PARAMETER (NFT1=22, NFT2=2) GDG0F401.386
C*---------------------------------------------------------------------- CONVIEE1.258
*CALL CLOOKADD
AD060593.28
*CALL CSUBMODL
GDG0F401.387
*CALL CPPXREF
GDG0F401.388
*CALL PPXLOOK
GDG0F401.389
*CALL CSTASH
GDG0F401.390
*CALL C_MDI
UDG7F403.7
*CALL CNTL_IO
UDG1F405.69
CL 0. Read in PPXREF GDG0F401.391
cmessage = ' ' GDW1F404.153
ppxRecs=1 GDG0F401.392
RowNumber=0 GDG0F401.393
ICODE=0 UDG9F404.25
CALL HDPPXRF
(NFT1,'STASHmaster_A',ppxRecs,ICODE,CMESSAGE) GDG0F401.394
IF(ICODE.GT.0)THEN UDG9F404.26
WRITE(6,*) 'Error reading STASHmaster_A' UDG9F404.27
WRITE(6,*) CMESSAGE UDG9F404.28
CALL ABORT
UDG9F404.29
END IF UDG9F404.30
CALL HDPPXRF
(NFT1,'STASHmaster_O',ppxRecs,ICODE,CMESSAGE) GDG0F401.395
IF(ICODE.GT.0)THEN UDG9F404.31
WRITE(6,*) 'Error reading STASHmaster_O' UDG9F404.32
WRITE(6,*) CMESSAGE UDG9F404.33
CALL ABORT
UDG9F404.34
END IF UDG9F404.35
CALL HDPPXRF
(NFT1,'STASHmaster_S',ppxRecs,ICODE,CMESSAGE) GDG0F401.396
IF(ICODE.GT.0)THEN UDG9F404.36
WRITE(6,*) 'Error reading STASHmaster_S' UDG9F404.37
WRITE(6,*) CMESSAGE UDG9F404.38
CALL ABORT
UDG9F404.39
END IF UDG9F404.40
CALL HDPPXRF
(NFT1,'STASHmaster_W',ppxRecs,ICODE,CMESSAGE) UDG1F402.12
IF(ICODE.GT.0)THEN GDW1F404.154
WRITE(6,*) 'Error reading STASHmaster_W' UDG9F404.41
WRITE(6,*) CMESSAGE GDG0F401.398
CALL ABORT
GDG0F401.399
END IF GDG0F401.400
GDG0F401.401
CALL GETPPX
(NFT1,NFT2,'STASHmaster_A',RowNumber, GDG0F401.402
*CALL ARGPPX
GDG0F401.403
& ICODE,CMESSAGE) GDG0F401.404
CALL GETPPX
(NFT1,NFT2,'STASHmaster_O',RowNumber, GDG0F401.405
*CALL ARGPPX
GDG0F401.406
& ICODE,CMESSAGE) GDG0F401.407
CALL GETPPX
(NFT1,NFT2,'STASHmaster_S',RowNumber, GDG0F401.408
*CALL ARGPPX
GDG0F401.409
& ICODE,CMESSAGE) GDG0F401.410
CALL GETPPX
(NFT1,NFT2,'STASHmaster_W',RowNumber, GDG0F401.411
*CALL ARGPPX
GDG0F401.412
& ICODE,CMESSAGE) GDG0F401.413
IF(ICODE.NE.0)THEN GDG0F401.414
WRITE(6,*) CMESSAGE GDG0F401.415
CALL ABORT
GDG0F401.416
END IF GDG0F401.417
GDG0F401.418
!User STASHmaster GDG0F401.419
CALL HDPPXRF
(0,' ',ppxRecs,ICODE,CMESSAGE) GDG0F401.420
IF(ICODE.NE.0)THEN GDG0F401.421
WRITE(6,*) CMESSAGE GDG0F401.422
CALL ABORT
GDG0F401.423
END IF GDG0F401.424
GDG0F401.425
CALL GETPPX
(0,NFT2,' ',RowNumber, GDG0F401.426
*CALL ARGPPX
GDG0F401.427
& ICODE,CMESSAGE) GDG0F401.428
IF(ICODE.NE.0)THEN GDG0F401.429
WRITE(6,*) CMESSAGE GDG0F401.430
CALL ABORT
GDG0F401.431
END IF GDG0F401.432
CONVIEE1.259
CL 1. Read in file header CONVIEE1.260
CONVIEE1.261
CALL READHEAD
(NFTIN,FIXHD,LEN_FIXHD, GDG0F401.433
& INTHD,LEN_INTHD,REALHD,LEN_REALHD, GDG0F401.434
& LEVDEPC,LEN1_LEVDEPC,LEN2_LEVDEPC, GDG0F401.435
& ROWDEPC,LEN1_ROWDEPC,LEN2_ROWDEPC, GDG0F401.436
& COLDEPC,LEN1_COLDEPC,LEN2_COLDEPC, GDG0F401.437
& FLDDEPC,LEN1_FLDDEPC,LEN2_FLDDEPC, GDG0F401.438
& EXTCNST,LEN_EXTCNST,DUMPHIST,LEN_DUMPHIST, GDG0F401.439
& CFI1,LEN_CFI1,CFI2,LEN_CFI2,CFI3,LEN_CFI3, GDG0F401.440
& LOOKUP,LEN1_LOOKUP,LEN2_LOOKUP,LEN_DATA, GDG0F401.441
*CALL ARGPPX
GDG0F401.442
& START_BLOCK,ICODE,CMESSAGE) GDG0F401.443
CONVIEE1.277
IF(ICODE.NE.0)THEN CONVIEE1.278
WRITE(6,*)CMESSAGE,ICODE CONVIEE1.279
CALL ABORT
CONVIEE1.280
ENDIF CONVIEE1.281
CONVIEE1.282
! 2: Check for PP format dataset if field to be expanded UDG1F405.70
UDG1F405.71
IF(LOOKUP(LBNREC,1).GT.0.AND.FIXHD(12).GT.0)THEN UDG1F405.72
! Check for WGDOS expansion UDG1F405.73
IF (WGDOS_EXPAND.EQ.1)THEN UDG1F405.74
! Issue a message on why we are doing this UDG1F405.75
write(6,'(//''***** Initial Scan for PP Format Dataset'', UDG1F405.76
& '' *****''/)') UDG1F405.77
DO I=1,LEN2_LOOKUP UDG1F405.78
IF(LOOKUP(1,I).EQ.-99) GOTO 195 UDG1F405.79
CALL READFLDS
(NFTIN,1,I,LOOKUP,LEN1_LOOKUP, UDG1F405.80
& D1,MAX_FIELD_SIZE,FIXHD, UDG1F405.81
*CALL ARGPPX
UDG1F405.82
& IEEE_TYPE,LPVP,WGDOS_EXPAND,ICODE,CMESSAGE) UDG1F405.83
IF(ICODE.NE.0)CALL ABORT_IO('CONVIEEE',CMESSAGE,ICODE,NFTIN) UDG1F405.84
END DO UDG1F405.85
195 CONTINUE UDG1F405.86
END IF UDG1F405.87
END IF UDG1F405.88
UDG1F405.89
! 3: Reset LOOKUP and FIXHD UDG1F405.90
UDG1F405.91
INIT_FIXHD_161=0 UDG1F405.92
DO K=1,LEN2_LOOKUP UDG1F405.93
UDG1F405.94
IF(LOOKUP(1,K).EQ.-99)GOTO 200 UDG1F405.95
! Set LOOKUP(LBNREC) = 0 in old dumps where UM version number UDG1F405.96
! not in fixed length header UDG1F405.97
IF(FIXHD(12).LT.0.AND.FIXHD(5).NE.3)THEN UDG1F405.98
LOOKUP(LBNREC,K)=0 UDG1F405.99
END IF UDG1F405.100
UDG1F405.101
! Packing code = -2 now obselete, reset packing code to 2 UDG1F405.102
IF(LOOKUP(LBPACK,K).EQ.-2)LOOKUP(LBPACK,K)=2 UDG1F405.103
UDG1F405.104
! Preserve the original length values for re-use UDG1F405.105
OLD_FIXHD_160=FIXHD(160) UDG1F405.106
LOOKUP_LBLREC(K)=LOOKUP(LBLREC,K) UDG1F405.107
LOOKUP_LBEGIN(K)=LOOKUP(LBEGIN,K) UDG1F405.108
LOOKUP_LBNREC(K)=LOOKUP(LBNREC,K) UDG1F405.109
UDG1F405.110
! Store values of packing indicator and set least significant UDG1F405.111
! number in LOOKUP(LBPACK,K) to 0 to indicate no packing UDG1F405.112
LOOKUP_21(K)=LOOKUP(LBPACK,K) UDG1F405.113
LOOKUP(LBPACK,K)=MOD(LOOKUP(LBPACK,K),1000) UDG1F405.114
IF(MOD(LOOKUP(LBPACK,K),10).NE.1)THEN UDG1F405.115
LOOKUP(LBPACK,K)=(LOOKUP(LBPACK,K)/10)*10 UDG1F405.116
ELSE IF(WGDOS_EXPAND.EQ.1) THEN UDG1F405.117
LOOKUP(LBPACK,K)=(LOOKUP(LBPACK,K)/10)*10 UDG1F405.118
END IF UDG1F405.119
UDG1F405.120
! Process compressed fields UDG1F405.121
IF(MOD(LOOKUP(LBPACK, K),1000).EQ.110)THEN UDG1F405.122
IF(K.LE.(INTHD(14)+2)*INTHD(8))THEN UDG1F405.123
! Calculate expanded field lengths for ocean compressed fields UDG1F405.124
MODEL=LOOKUP(MODEL_CODE, K) UDG1F405.125
ITEM=MOD(LOOKUP(ITEM_CODE, K),1000) UDG1F405.126
SECTION=(LOOKUP(ITEM_CODE, K)-ITEM)/1000 UDG1F405.127
PPXREF_GRID_TYPE=EXPPXI
(MODEL,SECTION,ITEM,PPX_GRID_TYPE, UDG1F405.128
*CALL ARGPPX
UDG1F405.129
& ICODE,CMESSAGE) UDG1F405.130
IF(PPXREF_GRID_TYPE.EQ.36)THEN UDG1F405.131
! Ocean mass points. UDG1F405.132
LOOKUP(LBNPT,K) = INTHD(6) UDG1F405.133
LOOKUP(LBROW,K) = INTHD(7) UDG1F405.134
LOOKUP(LBLREC, K) = INTHD(6)*INTHD(7) UDG1F405.135
ELSEIF(PPXREF_GRID_TYPE.EQ.37)THEN UDG1F405.136
! Ocean velocity points. One less row. UDG1F405.137
LOOKUP(LBNPT,K) = INTHD(6) UDG1F405.138
LOOKUP(LBROW,K) = INTHD(7)-1 UDG1F405.139
LOOKUP(LBLREC, K) = INTHD(6)*(INTHD(7)-1) UDG1F405.140
END IF UDG1F405.141
LOOKUP(LBPACK, K) = 0 UDG1F405.142
UDG1F405.143
ELSE UDG1F405.144
! Field not compressed onto sea points. Correct packing code UDG1F405.145
LOOKUP(LBPACK, K)=MOD(LOOKUP(LBPACK, K),10) UDG1F405.146
END IF UDG1F405.147
UDG1F405.148
END IF UDG1F405.149
! Add to length of data UDG1F405.150
INIT_FIXHD_161=INIT_FIXHD_161+LOOKUP(LBLREC,K) UDG1F405.151
UDG1F405.152
END DO UDG1F405.153
UDG1F405.154
200 CONTINUE UDG1F405.155
FIXHD(160)=FIXHD(150)+FIXHD(151)*FIXHD(152) UDG1F405.156
FIXHD(161)=INIT_FIXHD_161 UDG1F405.157
LEN_DATA=INIT_FIXHD_161 UDG1F405.158
UDG1F405.159
DO K=1,LEN2_LOOKUP UDG1F405.160
! indicate output format. UDG1F405.161
IF(LPVP)THEN UDG1F405.162
LOOKUP(LBPACK,K)=LOOKUP(LBPACK,K)+2000 UDG1F405.163
ELSE UDG1F405.164
LOOKUP(LBPACK,K)=LOOKUP(LBPACK,K)+3000 UDG1F405.165
END IF UDG1F405.166
UDG1F405.167
END DO UDG1F405.168
UDG1F405.169
IF(FIXHD(12).LT.208)FIXHD(12)=208 AD070493.4
CONVIEE1.290
! Boundary datasets are structured differently. UDG1F405.170
! Skip call to set_dumpfile_address for boundary datasets and UDG1F405.171
! Calculate addressing for well formed boundary datasets explicitly. UDG1F405.172
IF (FIXHD(5).NE.5.OR.LPVP)THEN UDG1F405.173
UDG1F405.174
! Not a boundary dataset. Call set_dumpfile_address UDG1F405.175
c GBCYF404.22
c--reset the 32/64 bit lookup headers after packing, etc GBCYF404.23
c has been removed GBCYF404.24
call set_dumpfile_address
(fixhd, len_fixhd, GBCYF404.25
& lookup, len1_lookup, GBCYF404.26
& len2_lookup, GBCYF404.27
& number_of_data_words_in_memory, GBCYF404.28
& number_of_data_words_on_disk, GBCYF404.29
& disk_address) GBCYF404.30
ELSE UDG1F405.176
UDG1F405.177
! Boundary dataset. Calcuate start address from header and round it up UDG1F405.178
! to ensure we start on a sector boundary UDG1F405.179
DISK_ADDRESS=FIXHD(160)-1 UDG1F405.180
DISK_ADDRESS=((DISK_ADDRESS+UM_SECTOR_SIZE-1)/ UDG1F405.181
& UM_SECTOR_SIZE)*UM_SECTOR_SIZE UDG1F405.182
UDG1F405.183
! Loop over number of times for which data is present in dataset UDG1F405.184
DO K=1,INTHD(3) UDG1F405.185
UDG1F405.186
! Loop over number of different field types present UDG1F405.187
LEN_BUF=0 UDG1F405.188
MAX_LEN_BUF=0 UDG1F405.189
DO I=1,INTHD(15) UDG1F405.190
POS=(K-1)*INTHD(15)+I UDG1F405.191
LOOKUP(LBEGIN,POS)=DISK_ADDRESS+LEN_BUF UDG1F405.192
LOOKUP(LBNREC,POS)=LOOKUP(LBLREC,POS) UDG1F405.193
LEN_BUF=LEN_BUF+LOOKUP(LBLREC,POS) UDG1F405.194
END DO UDG1F405.195
MAX_LEN_BUF=MAX0(LEN_BUF,MAX_LEN_BUF) UDG1F405.196
UDG1F405.197
! Update disk address and ensure that next time starts UDG1F405.198
! on a sector boundary UDG1F405.199
DISK_ADDRESS=DISK_ADDRESS+LEN_BUF UDG1F405.200
DISK_ADDRESS=((DISK_ADDRESS+UM_SECTOR_SIZE-1)/ UDG1F405.201
& UM_SECTOR_SIZE)*UM_SECTOR_SIZE UDG1F405.202
UDG1F405.203
END DO UDG1F405.204
UDG1F405.205
END IF UDG1F405.206
c--preserve the new length values for re-use GBCYF404.31
new_fixhd_160=fixhd(160) GBCYF404.32
do k=1,len2_lookup GBCYF404.33
lookup_lblrec_new(k)=lookup(lblrec, k) GBCYF404.34
lookup_lbnrec_new(k)=lookup(lbnrec, k) GBCYF404.35
lookup_lbegin_new(k)=lookup(lbegin, k) GBCYF404.36
end do GBCYF404.37
CL 1. Write out file header CONVIEE1.291
CONVIEE1.292
CALL WRITHEAD
(NFTOUT,FIXHD,LEN_FIXHD, GDG0F401.444
& INTHD,LEN_INTHD,REALHD,LEN_REALHD, GDG0F401.445
& LEVDEPC,LEN1_LEVDEPC,LEN2_LEVDEPC, GDG0F401.446
& ROWDEPC,LEN1_ROWDEPC,LEN2_ROWDEPC, GDG0F401.447
& COLDEPC,LEN1_COLDEPC,LEN2_COLDEPC, GDG0F401.448
& FLDDEPC,LEN1_FLDDEPC,LEN2_FLDDEPC, GDG0F401.449
& EXTCNST,LEN_EXTCNST,DUMPHIST,LEN_DUMPHIST, GDG0F401.450
& CFI1,LEN_CFI1,CFI2,LEN_CFI2,CFI3,LEN_CFI3, GDG0F401.451
& LOOKUP,LEN1_LOOKUP,LEN2_LOOKUP,LEN_DATA, GDG0F401.452
*IF DEF,IEEE GDG0F401.453
& IEEE_TYPE, GDG0F401.454
& LPVP, UDG2F404.68
*ENDIF GDG0F401.455
*CALL ARGPPX
GDG0F401.456
& START_BLOCK,ICODE,CMESSAGE) GDG0F401.457
CONVIEE1.313
IF(ICODE.NE.0)THEN CONVIEE1.314
WRITE(6,*)CMESSAGE,ICODE CONVIEE1.315
CALL ABORT
CONVIEE1.316
ENDIF CONVIEE1.317
CONVIEE1.318
C Reset PP file indicator AD060593.50
IF(LOOKUP_LBNREC(1).GT.0)THEN AD060593.51
DO K=1,LEN2_LOOKUP AD060593.52
LOOKUP(LBNREC,K)=LOOKUP_LBNREC(K) AD060593.53
lookup(lblrec,k)=lookup_lblrec(k) UBC2F402.62
lookup(lbegin,k)=lookup_lbegin(k) GBCYF404.38
ENDDO AD060593.54
ENDIF AD060593.55
C Restore value of packing indicator CONVIEE1.319
CONVIEE1.320
DO K=1,LEN2_LOOKUP CONVIEE1.321
LOOKUP(21,K)=LOOKUP_21(K) CONVIEE1.322
ENDDO CONVIEE1.323
CONVIEE1.324
CL 3. Read in each field, convert to IEEE format and write out CONVIEE1.325
CL results to new file CONVIEE1.326
CONVIEE1.327
IF (FIXHD(2).EQ.1)THEN UDG1F405.207
UDG1F405.208
! Atmosphere file UDG1F405.209
CALL ATMOS_CONVIEEE
(NFTIN,NFTOUT,IEEE_TYPE,MAX_FIELD_SIZE UDG1F405.210
&, LEN_FIXHD,LEN1_LOOKUP,LEN2_LOOKUP UDG1F405.211
&, OLD_FIXHD_160,NEW_FIXHD_160 UDG1F405.212
&, LOOKUP_LBLREC UDG1F405.213
&, LOOKUP_LBEGIN,LOOKUP_LBNREC UDG1F405.214
&, LOOKUP_LBEGIN_NEW,LOOKUP_LBNREC_NEW, UDG1F405.215
*CALL ARGPPX
UDG1F405.216
& FIXHD,LOOKUP,WGDOS_EXPAND,LPVP) UDG1F405.217
UDG1F405.218
ELSEIF (FIXHD(2).EQ.2)THEN UDG1F405.219
UDG1F405.220
! Ocean file UDG1F405.221
UDG1F405.222
! Calculate sizes of compressed and uncompressed ocean fields UDG1F405.223
JOC_NO_SEAPTS=INTHD(11) UDG1F405.224
LEN_OCFLD =INTHD(6)*INTHD(7)*INTHD(8) UDG1F405.225
UDG1F405.226
CALL OCEAN_CONVIEEE
(NFTIN,NFTOUT,IEEE_TYPE,MAX_FIELD_SIZE UDG1F405.227
&, LEN_FIXHD,LEN_INTHD UDG1F405.228
&, LEN_CFI1,LEN_CFI2,LEN_CFI3 UDG1F405.229
&, LEN1_LOOKUP,LEN2_LOOKUP UDG1F405.230
&, JOC_NO_SEAPTS,LEN_OCFLD UDG1F405.231
&, OLD_FIXHD_160,NEW_FIXHD_160 UDG1F405.232
&, LOOKUP_LBLREC,LOOKUP_LBLREC_NEW UDG1F405.233
&, LOOKUP_LBEGIN,LOOKUP_LBEGIN_NEW UDG1F405.234
&, LOOKUP_LBNREC,LOOKUP_LBNREC_NEW UDG1F405.235
&, FIXHD,INTHD,LOOKUP,CFI1,CFI2,CFI3, UDG1F405.236
*CALL ARGPPX
UDG1F405.237
& WGDOS_EXPAND,LPVP) UDG1F405.238
UDG1F405.239
END IF UDG1F405.240
UDG1F405.241
WRITE(6,'(I4,'' fields have been converted'')') LEN2_LOOKUP UDG1F405.242
UDG1F405.243
RETURN UDG1F405.244
END CONVIEE1.389
SUBROUTINE ATMOS_CONVIEEE(NFTIN,NFTOUT,IEEE_TYPE,MAX_FIELD_SIZE 1,12UDG1F405.245
&, LEN_FIXHD,LEN1_LOOKUP,LEN2_LOOKUP UDG1F405.246
&, OLD_FIXHD_160,NEW_FIXHD_160 UDG1F405.247
&, LOOKUP_LBLREC UDG1F405.248
&, LOOKUP_LBEGIN,LOOKUP_LBNREC UDG1F405.249
&, LOOKUP_LBEGIN_NEW,LOOKUP_LBNREC_NEW, UDG1F405.250
*CALL ARGPPX
UDG1F405.251
& FIXHD,LOOKUP,WGDOS_EXPAND,LPVP) UDG1F405.252
IMPLICIT NONE UDG1F405.253
INTEGER IEEE_TYPE UDG1F405.254
INTEGER LEN_FIXHD UDG1F405.255
INTEGER LEN1_LOOKUP UDG1F405.256
INTEGER LEN2_LOOKUP UDG1F405.257
INTEGER MAX_FIELD_SIZE UDG1F405.258
INTEGER NEW_FIXHD_160 UDG1F405.259
INTEGER NFTIN UDG1F405.260
INTEGER NFTOUT UDG1F405.261
INTEGER OLD_FIXHD_160 UDG1F405.262
INTEGER WGDOS_EXPAND UDG1F405.263
LOGICAL LPVP UDG1F405.264
UDG1F405.265
INTEGER FIXHD(LEN_FIXHD) UDG1F405.266
INTEGER LOOKUP_LBLREC(LEN2_LOOKUP) UDG1F405.267
INTEGER LOOKUP_LBEGIN(LEN2_LOOKUP) UDG1F405.268
INTEGER LOOKUP_LBNREC(LEN2_LOOKUP) UDG1F405.269
INTEGER LOOKUP_LBEGIN_NEW(LEN2_LOOKUP) UDG1F405.270
INTEGER LOOKUP_LBNREC_NEW(LEN2_LOOKUP) UDG1F405.271
INTEGER LOOKUP(LEN1_LOOKUP,LEN2_LOOKUP) UDG1F405.272
! Local arrays:-------------------------------------------------------- UDG1F405.273
INTEGER D1(MAX_FIELD_SIZE) ! Data array used to read in each field UDG1F405.274
REAL*4 IEEE_32(MAX_FIELD_SIZE) !Array containing 32 bit IEEE data UDG1F405.275
REAL*8 IEEE_64(MAX_FIELD_SIZE) !Array containing 64 bit IEEE data UDG1F405.276
! External subroutines called:----------------------------------------- UDG1F405.277
EXTERNAL ABORT,READFLDS,ABORT_IO,BUFFO32,PR_LOOK UDG1F405.278
EXTERNAL CRI2IEG,CRAY2CRI,CRI2CRAY UDG1F405.279
!---------------------------------------------------------------------- UDG1F405.280
! Local variables:----------------------------------------------------- UDG1F405.281
INTEGER I,J ! Loop variables UDG1F405.282
INTEGER K ! Return code from CRAY intrinsic functions UDG1F405.283
INTEGER ICODE ! Error return code from READFLDS UDG1F405.284
INTEGER ITYPE ! Conversion type UDG1F405.285
INTEGER LEN_IO ! I/O length UDG1F405.286
INTEGER CRI2IEG ! Function to convert Cray IEEE numbers UDG1F405.287
! to generic IEEE numbers UDG1F405.288
INTEGER CRAY2CRI ! Function to convert Cray PVP numbers UDG1F405.289
! to Cray IEEE numbers UDG1F405.290
INTEGER CRI2CRAY ! Function to convert Cray IEEE numbers UDG1F405.291
! to Cray PVP numbers UDG1F405.292
REAL A ! Return code from BUFFIN; -1.0 = O.K. UDG1F405.293
CHARACTER*80 CMESSAGE ! Character string returned if ICODE .ne. 0 UDG1F405.294
!---------------------------------------------------------------------- UDG1F405.295
*CALL CSUBMODL
UDG1F405.296
*CALL CPPXREF
UDG1F405.297
*CALL PPXLOOK
UDG1F405.298
*CALL CSTASH
UDG1F405.299
*CALL CLOOKADD
UDG1F405.300
*CALL C_MDI
UDG1F405.301
UDG1F405.302
! Loop over all fields UDG1F405.303
DO I=1,LEN2_LOOKUP UDG1F405.304
UDG1F405.305
! Check for the end of a PP format lookup table UDG1F405.306
IF(LOOKUP(1,I).EQ.-99) GOTO 2000 UDG1F405.307
UDG1F405.308
! Reset the headers in case WDGOS packing has altered them UDG1F405.309
LOOKUP(LBLREC,I)=LOOKUP_LBLREC(I) UDG1F405.310
LOOKUP(LBEGIN,I)=LOOKUP_LBEGIN(I) UDG1F405.311
LOOKUP(LBNREC,I)=LOOKUP_LBNREC(I) UDG1F405.312
FIXHD(160)=OLD_FIXHD_160 UDG1F405.313
UDG1F405.314
! Check if this field has already been converted - WGDOS only UDG1F405.315
IF(MOD(LOOKUP(21,I),10).EQ.1 .AND. WGDOS_EXPAND.NE.1) THEN UDG1F405.316
! Read in field UDG1F405.317
IF(IEEE_TYPE.EQ.32)THEN UDG1F405.318
CALL READFLDS
(NFTIN,1,I,LOOKUP,LEN1_LOOKUP, UDG1F405.319
& IEEE_32,MAX_FIELD_SIZE,FIXHD, UDG1F405.320
*CALL ARGPPX
UDG1F405.321
& IEEE_TYPE,LPVP, UDG1F405.322
& WGDOS_EXPAND,ICODE,CMESSAGE) UDG1F405.323
ELSEIF(IEEE_TYPE.EQ.64)THEN UDG1F405.324
! Read in field UDG1F405.325
CALL READFLDS
(NFTIN,1,I,LOOKUP,LEN1_LOOKUP, UDG1F405.326
& IEEE_64,MAX_FIELD_SIZE,FIXHD, UDG1F405.327
*CALL ARGPPX
UDG1F405.328
& IEEE_TYPE,LPVP, UDG1F405.329
& WGDOS_EXPAND,ICODE,CMESSAGE) UDG1F405.330
END IF UDG1F405.331
IF(ICODE.NE.0)CALL ABORT_IO('CONVIEEE',CMESSAGE,ICODE,NFTIN) UDG1F405.332
UDG1F405.333
ELSE IF(MOD(LOOKUP(21,I),10).EQ.1 .AND. WGDOS_EXPAND.EQ.1) THEN UDG1F405.334
! Read in field UDG1F405.335
CALL READFLDS
(NFTIN,1,I,LOOKUP,LEN1_LOOKUP, UDG1F405.336
& IEEE_64,MAX_FIELD_SIZE,FIXHD, UDG1F405.337
*CALL ARGPPX
UDG1F405.338
& IEEE_TYPE,LPVP, UDG1F405.339
& WGDOS_EXPAND,ICODE,CMESSAGE) UDG1F405.340
IF(ICODE.NE.0)CALL ABORT_IO('CONVIEEE',CMESSAGE,ICODE,NFTIN) UDG1F405.341
UDG1F405.342
ELSE UDG1F405.343
! Read in field UDG1F405.344
CALL READFLDS
(NFTIN,1,I,LOOKUP,LEN1_LOOKUP, UDG1F405.345
& D1,MAX_FIELD_SIZE,FIXHD, UDG1F405.346
*CALL ARGPPX
UDG1F405.347
& IEEE_TYPE,LPVP, UDG1F405.348
& WGDOS_EXPAND,ICODE,CMESSAGE) UDG1F405.349
IF(ICODE.NE.0)CALL ABORT_IO('CONVIEEE',CMESSAGE,ICODE,NFTIN) UDG1F405.350
UDG1F405.351
C Set data type UDG1F405.352
IF(ABS(LOOKUP(DATA_TYPE,I)).EQ.1) THEN UDG1F405.353
C Type real UDG1F405.354
IF(IEEE_TYPE.EQ.32)THEN UDG1F405.355
ITYPE=3 UDG1F405.356
ELSEIF(IEEE_TYPE.EQ.64)THEN UDG1F405.357
ITYPE=2 UDG1F405.358
ENDIF UDG1F405.359
ELSE IF(ABS(LOOKUP(DATA_TYPE,I)).EQ.2) THEN UDG1F405.360
C Type integer UDG1F405.361
IF(IEEE_TYPE.EQ.32)THEN UDG1F405.362
ITYPE=2 UDG1F405.363
ELSEIF(IEEE_TYPE.EQ.64)THEN UDG1F405.364
ITYPE=1 UDG1F405.365
ENDIF UDG1F405.366
ELSE IF(ABS(LOOKUP(DATA_TYPE,I)).EQ.3) THEN UDG1F405.367
C Type logical UDG1F405.368
ITYPE=5 UDG1F405.369
ELSE UDG1F405.370
CALL PR_LOOK
( UDG1F405.371
*CALL ARGPPX
UDG1F405.372
& LOOKUP,LOOKUP,LEN1_LOOKUP,I) UDG1F405.373
ICODE=3 UDG1F405.374
CMESSAGE='CONVIEEE: Invalid code in LOOKUP(39,K)' UDG1F405.375
RETURN UDG1F405.376
ENDIF UDG1F405.377
UDG1F405.378
C Convert to IEEE format and write to disk UDG1F405.379
IF(ITYPE.GE.0)THEN UDG1F405.380
IF(IEEE_TYPE.EQ.32)THEN UDG1F405.381
K=CRI2IEG(ITYPE,LOOKUP(LBLREC,I),IEEE_32,0, UDG1F405.382
& D1,1,64,IEEE_TYPE) UDG1F405.383
IF(K.NE.0)THEN UDG1F405.384
WRITE(6,*)'Conversion Error - Return Code is ',K UDG1F405.385
DO J=1,LOOKUP(LBLREC,I) UDG1F405.386
IF(.NOT.IEEE_FINITE(IEEE_32(J)))THEN UDG1F405.387
WRITE(6,'(''Error converting field '',i5, UDG1F405.388
& '' : Stash Code '',i5, UDG1F405.389
& '' : Point No. '',i5,)') UDG1F405.390
& I, LOOKUP(ITEM_CODE,I),J UDG1F405.391
WRITE(6,*) 'Number unconvertable reset to RMDI' UDG1F405.392
IEEE_32(J)=RMDI UDG1F405.393
END IF UDG1F405.394
END DO UDG1F405.395
END IF UDG1F405.396
END IF UDG1F405.397
IF(IEEE_TYPE.EQ.64)THEN UDG1F405.398
IF(LPVP)THEN UDG1F405.399
K=CRI2CRAY(ITYPE,LOOKUP(LBLREC,I),IEEE_64,0,D1,1) UDG1F405.400
IF(K.NE.0)THEN UDG1F405.401
WRITE(6,*)'Conversion Error - Return Code is ',K UDG1F405.402
CALL ABORT
('CRI2CRAY Conversion Error') UDG1F405.403
END IF UDG1F405.404
ELSE UDG1F405.405
K=CRAY2CRI(ITYPE,LOOKUP(LBLREC,I),D1,0,IEEE_64,1) UDG1F405.406
IF(K.NE.0)THEN UDG1F405.407
WRITE(6,*)'Conversion Error - Return Code is ',K UDG1F405.408
CALL ABORT
('CRAY2CRI Conversion Error') UDG1F405.409
END IF UDG1F405.410
END IF UDG1F405.411
END IF UDG1F405.412
ELSE UDG1F405.413
DO K=1,LOOKUP(LBLREC,I) UDG1F405.414
IEEE_32(k)=IAND(D1(K),1) UDG1F405.415
IEEE_64(k)=IAND(D1(K),1) UDG1F405.416
END DO UDG1F405.417
ENDIF UDG1F405.418
ENDIF UDG1F405.419
UDG1F405.420
C Write out field UDG1F405.421
FIXHD(160)=NEW_FIXHD_160 UDG1F405.422
IF(IEEE_TYPE.EQ.32)THEN UDG1F405.423
CALL SETPOS32
(NFTOUT, LOOKUP_LBEGIN_NEW(I), K) UDG1F405.424
CALL BUFFO32(
NFTOUT, IEEE_32, LOOKUP_LBNREC_NEW(I), LEN_IO, A) UDG1F405.425
ELSEIF(IEEE_TYPE.EQ.64)THEN UDG1F405.426
CALL SETPOS
(NFTOUT, LOOKUP_LBEGIN_NEW(I), K) UDG1F405.427
CALL BUFFOUT
(NFTOUT, IEEE_64, LOOKUP_LBNREC_NEW(I), LEN_IO, A) UDG1F405.428
ENDIF UDG1F405.429
UDG1F405.430
C Check for I/O errors UDG1F405.431
if(A.NE.-1.0.OR.LEN_IO.NE.LOOKUP_LBNREC_NEW(I)) THEN UDG1F405.432
CALL IOERROR
('buffer out of data field', UDG1F405.433
* A,LEN_IO,LOOKUP(15,I)) UDG1F405.434
CALL ABORT
UDG1F405.435
ENDIF UDG1F405.436
UDG1F405.437
WRITE(6,'(''Field '',i5,'' : Stash Code '',i5, UDG1F405.438
& '' : has been converted'')') I, LOOKUP(42,I) UDG1F405.439
UDG1F405.440
! Reset the headers in case WDGOS packing has altered them UDG1F405.441
LOOKUP(LBLREC,I)=LOOKUP_LBLREC(I) UDG1F405.442
LOOKUP(LBEGIN,I)=LOOKUP_LBEGIN(I) UDG1F405.443
LOOKUP(LBNREC,I)=LOOKUP_LBNREC(I) UDG1F405.444
FIXHD(160)=OLD_FIXHD_160 UDG1F405.445
UDG1F405.446
END DO UDG1F405.447
2000 CONTINUE UDG1F405.448
UDG1F405.449
RETURN UDG1F405.450
END UDG1F405.451
SUBROUTINE OCEAN_CONVIEEE(NFTIN,NFTOUT,IEEE_TYPE,MAX_FIELD_SIZE 1,20UDG1F405.452
&, LEN_FIXHD,LEN_INTHD UDG1F405.453
&, LEN_CFI1,LEN_CFI2,LEN_CFI3 UDG1F405.454
&, LEN1_LOOKUP,LEN2_LOOKUP UDG1F405.455
&, JOC_NO_SEAPTS,LEN_OCFLD UDG1F405.456
&, OLD_FIXHD_160,NEW_FIXHD_160 UDG1F405.457
&, LOOKUP_LBLREC,LOOKUP_LBLREC_NEW UDG1F405.458
&, LOOKUP_LBEGIN,LOOKUP_LBEGIN_NEW UDG1F405.459
&, LOOKUP_LBNREC,LOOKUP_LBNREC_NEW UDG1F405.460
&, FIXHD,INTHD,LOOKUP,CFI1,CFI2,CFI3, UDG1F405.461
*CALL ARGPPX
UDG1F405.462
& WGDOS_EXPAND,LPVP) UDG1F405.463
IMPLICIT NONE UDG1F405.464
INTEGER IEEE_TYPE UDG1F405.465
INTEGER JOC_NO_SEAPTS UDG1F405.466
INTEGER LEN_OCFLD UDG1F405.467
INTEGER LEN_FIXHD UDG1F405.468
INTEGER LEN_INTHD UDG1F405.469
INTEGER LEN_CFI1 UDG1F405.470
INTEGER LEN_CFI2 UDG1F405.471
INTEGER LEN_CFI3 UDG1F405.472
INTEGER LEN1_LOOKUP UDG1F405.473
INTEGER LEN2_LOOKUP UDG1F405.474
INTEGER MAX_FIELD_SIZE UDG1F405.475
INTEGER NEW_FIXHD_160 UDG1F405.476
INTEGER NFTIN UDG1F405.477
INTEGER NFTOUT UDG1F405.478
INTEGER OLD_FIXHD_160 UDG1F405.479
INTEGER WGDOS_EXPAND UDG1F405.480
LOGICAL LPVP UDG1F405.481
UDG1F405.482
INTEGER FIXHD(LEN_FIXHD) UDG1F405.483
INTEGER INTHD(LEN_INTHD) UDG1F405.484
INTEGER CFI1(LEN_CFI1+1) UDG1F405.485
INTEGER CFI2(LEN_CFI2+1) UDG1F405.486
INTEGER CFI3(LEN_CFI3+1) UDG1F405.487
INTEGER LOOKUP_LBLREC(LEN2_LOOKUP) UDG1F405.488
INTEGER LOOKUP_LBEGIN(LEN2_LOOKUP) UDG1F405.489
INTEGER LOOKUP_LBNREC(LEN2_LOOKUP) UDG1F405.490
INTEGER LOOKUP_LBLREC_NEW(LEN2_LOOKUP) UDG1F405.491
INTEGER LOOKUP_LBEGIN_NEW(LEN2_LOOKUP) UDG1F405.492
INTEGER LOOKUP_LBNREC_NEW(LEN2_LOOKUP) UDG1F405.493
INTEGER LOOKUP(LEN1_LOOKUP,LEN2_LOOKUP) UDG1F405.494
! Local arrays:-------------------------------------------------------- UDG1F405.495
INTEGER D1(MAX_FIELD_SIZE) !Data array used to read in each fieldl UDG1F405.496
REAL*4 IEEE_32(MAX_FIELD_SIZE) !Array containing 32 bit IEEE data UDG1F405.497
REAL*8 IEEE_64(MAX_FIELD_SIZE) !Array containing 64 bit IEEE data UDG1F405.498
REAL C1(JOC_NO_SEAPTS) !Array holding compressed field UDG1F405.499
REAL E1(JOC_NO_SEAPTS) !Array holding compressed field UDG1F405.500
REAL U1(LEN_OCFLD) !Array holding uncompressed field UDG1F405.501
! External subroutines called:----------------------------------------- UDG1F405.502
EXTERNAL ABORT,READFLDS,ABORT_IO,BUFFO32,PR_LOOK UDG1F405.503
EXTERNAL CRI2IEG,CRAY2CRI,CRI2CRAY UDG1F405.504
!---------------------------------------------------------------------- UDG1F405.505
! Local variables:----------------------------------------------------- UDG1F405.506
INTEGER I,J,L ! Loop variables UDG1F405.507
INTEGER K ! Return code from CRAY intrinsic functions UDG1F405.508
INTEGER ICODE ! Error return code from READFLDS UDG1F405.509
INTEGER ITYPE ! Conversion type UDG1F405.510
INTEGER LEN_IO ! I/O length UDG1F405.511
INTEGER NCOMP ! Number of compressed fields UDG1F405.512
INTEGER NCOLS ! Number of points east-west UDG1F405.513
INTEGER NROWS ! Number of points north-south UDG1F405.514
INTEGER NLEVS ! Number of levels UDG1F405.515
INTEGER NT ! Number of tracers UDG1F405.516
INTEGER RECNUM ! Record number of field in lookup table UDG1F405.517
INTEGER POSIN ! Start position of field within C1 UDG1F405.518
INTEGER CRI2IEG ! Function to convert Cray IEEE numbers UDG1F405.519
! to generic IEEE numbers UDG1F405.520
INTEGER CRAY2CRI ! Function to convert Cray PVP numbers UDG1F405.521
! to Cray IEEE numbers UDG1F405.522
INTEGER CRI2CRAY ! Function to convert Cray IEEE numbers UDG1F405.523
! to Cray PVP numbers UDG1F405.524
REAL A ! Return code from BUFFIN; -1.0 = O.K. UDG1F405.525
LOGICAL LL_CYCLIC! T => cyclic ; f=> not cyclic UDG1F405.526
CHARACTER*80 CMESSAGE ! Character string returned if ICODE .ne. 0 UDG1F405.527
!---------------------------------------------------------------------- UDG1F405.528
*CALL CSUBMODL
UDG1F405.529
*CALL CPPXREF
UDG1F405.530
*CALL PPXLOOK
UDG1F405.531
*CALL CSTASH
UDG1F405.532
*CALL CLOOKADD
UDG1F405.533
*CALL C_MDI
UDG1F405.534
UDG1F405.535
! 1: Process ocean compressed fields first UDG1F405.536
UDG1F405.537
NCOLS = INTHD(6) UDG1F405.538
NROWS = INTHD(7) UDG1F405.539
NLEVS = INTHD(8) UDG1F405.540
IF(FIXHD(12).GE.304)THEN UDG1F405.541
NT = INTHD(14) UDG1F405.542
ELSE UDG1F405.543
NT = INTHD(14)+2 UDG1F405.544
END IF UDG1F405.545
RECNUM = 1 UDG1F405.546
UDG1F405.547
IF( MOD (FIXHD(4), 100 ) .NE. 3) THEN UDG1F405.548
LL_CYCLIC = .TRUE. UDG1F405.549
ELSE UDG1F405.550
LL_CYCLIC = .FALSE. UDG1F405.551
END IF UDG1F405.552
UDG1F405.553
! Decide whether there are any compressed fields and how many of them. UDG1F405.554
! Use LBPACK to determine whether the first field contains sea points UDG1F405.555
! only UDG1F405.556
IF( MOD(LOOKUP(LBPACK, 1)/10,10) .EQ. 0) THEN UDG1F405.557
NCOMP = 0 UDG1F405.558
ELSE UDG1F405.559
NCOMP = NT + 2 UDG1F405.560
!Can only convert compressed fields from cray pvp format to UDG1F405.561
! 64-bit ieee format UDG1F405.562
IF(IEEE_TYPE.EQ.32.OR.LPVP)THEN UDG1F405.563
WRITE(6,*) 'CONVIEEE: Conversion not supported' UDG1F405.564
WRITE(6,*) 'Conversion of compressed ocean fields to ' UDG1F405.565
&, '32-bit IEEE format' UDG1F405.566
WRITE(6,*) 'and cray PVP format not supported' UDG1F405.567
CALL ABORT
UDG1F405.568
END IF UDG1F405.569
END IF UDG1F405.570
UDG1F405.571
DO L = 1,NCOMP UDG1F405.572
UDG1F405.573
! Loop over levels storing all levels in one 1-D array and convert UDG1F405.574
POSIN = 1 UDG1F405.575
DO J = 1,NLEVS UDG1F405.576
UDG1F405.577
! Reset the headers in case WDGOS packing has altered them UDG1F405.578
LOOKUP(LBLREC,J+(L-1)*NLEVS)=LOOKUP_LBLREC(J+(L-1)*NLEVS) UDG1F405.579
LOOKUP(LBEGIN,J+(L-1)*NLEVS)=LOOKUP_LBEGIN(J+(L-1)*NLEVS) UDG1F405.580
LOOKUP(LBNREC,J+(L-1)*NLEVS)=LOOKUP_LBNREC(J+(L-1)*NLEVS) UDG1F405.581
FIXHD(160)=OLD_FIXHD_160 UDG1F405.582
UDG1F405.583
CALL READFLDS
(NFTIN,1,RECNUM,LOOKUP,LEN1_LOOKUP, UDG1F405.584
& E1(POSIN),MAX_FIELD_SIZE,FIXHD, UDG1F405.585
*CALL ARGPPX
UDG1F405.586
& IEEE_TYPE,LPVP, UDG1F405.587
& WGDOS_EXPAND,ICODE,CMESSAGE) UDG1F405.588
IF(ICODE.NE.0)CALL ABORT_IO('CONVIEEE',CMESSAGE, UDG1F405.589
& ICODE,NFTIN) UDG1F405.590
POSIN=POSIN+LOOKUP(LBLREC, J+(L-1)*NLEVS) UDG1F405.591
RECNUM=RECNUM+1 UDG1F405.592
END DO UDG1F405.593
UDG1F405.594
! Convert to IEEE format. UDG1F405.595
ITYPE = 2 !Assume compressed data are type 'real' UDG1F405.596
K=CRAY2CRI(ITYPE,JOC_NO_SEAPTS,E1,0,C1,1) UDG1F405.597
IF(K.NE.0)THEN UDG1F405.598
WRITE(6,*)'Conversion Error - Return Code is ',K UDG1F405.599
CALL ABORT
('CRAY2CRI Conversion Error') UDG1F405.600
END IF UDG1F405.601
UDG1F405.602
! Uncompress 3-D field UDG1F405.603
CALL UNPACK
(1,NROWS,1,NLEVS,NROWS,NLEVS,NCOLS,NROWS,NLEVS, UDG1F405.604
& CFI1,CFI2,LEN_CFI1,CFI3,JOC_NO_SEAPTS, UDG1F405.605
& C1,U1,RMDI,LL_CYCLIC) UDG1F405.606
UDG1F405.607
! Write uncompressed IEEE data to disk a level at a time UDG1F405.608
DO J = 1,NLEVS UDG1F405.609
DO I=1,LOOKUP_LBLREC_NEW(J+(L-1)*NLEVS) UDG1F405.610
IEEE_64(I)=U1(I+(J-1)*NROWS*NCOLS) UDG1F405.611
END DO !I UDG1F405.612
CALL SETPOS
(NFTOUT,LOOKUP_LBEGIN_NEW(J+(L-1)*NLEVS),K) UDG1F405.613
CALL BUFFOUT
(NFTOUT,IEEE_64, UDG1F405.614
& LOOKUP_LBNREC_NEW(J+(L-1)*NLEVS), UDG1F405.615
& LEN_IO,A) UDG1F405.616
UDG1F405.617
C Check for I/O errors UDG1F405.618
IF(A.NE.-1.0.OR. UDG1F405.619
& LEN_IO.NE.LOOKUP_LBNREC_NEW(J+(L-1)*NLEVS))THEN UDG1F405.620
CALL IOERROR
('buffer out of data field' UDG1F405.621
&, A,LEN_IO UDG1F405.622
&, LOOKUP_LBLREC_NEW(J+(L-1)*NLEVS)) UDG1F405.623
CALL ABORT
UDG1F405.624
END IF UDG1F405.625
UDG1F405.626
WRITE(6,'(''Field '',i5,'' : Stash Code '',i5, UDG1F405.627
& '' : has been converted'')') UDG1F405.628
& J+(L-1)*NLEVS,LOOKUP(ITEM_CODE,J+(L-1)*NLEVS) UDG1F405.629
UDG1F405.630
! Reset the headers in case WDGOS packing has altered them UDG1F405.631
LOOKUP(LBLREC,J+(L-1)*NLEVS)=LOOKUP_LBLREC(J+(L-1)*NLEVS) UDG1F405.632
LOOKUP(LBEGIN,J+(L-1)*NLEVS)=LOOKUP_LBEGIN(J+(L-1)*NLEVS) UDG1F405.633
LOOKUP(LBNREC,J+(L-1)*NLEVS)=LOOKUP_LBNREC(J+(L-1)*NLEVS) UDG1F405.634
FIXHD(160)=OLD_FIXHD_160 UDG1F405.635
UDG1F405.636
UDG1F405.637
END DO ! J UDG1F405.638
END DO ! L UDG1F405.639
UDG1F405.640
! 2. Process uncompressed ocean fields UDG1F405.641
UDG1F405.642
! Loop over all fields UDG1F405.643
DO I=NCOMP*NLEVS+1,LEN2_LOOKUP UDG1F405.644
UDG1F405.645
! Check for the end of a PP format lookup table UDG1F405.646
IF(LOOKUP(1,I).EQ.-99) GOTO 2000 UDG1F405.647
UDG1F405.648
! Reset the headers in case WDGOS packing has altered them UDG1F405.649
LOOKUP(LBLREC,I)=LOOKUP_LBLREC(I) UDG1F405.650
LOOKUP(LBEGIN,I)=LOOKUP_LBEGIN(I) UDG1F405.651
LOOKUP(LBNREC,I)=LOOKUP_LBNREC(I) UDG1F405.652
FIXHD(160)=OLD_FIXHD_160 UDG1F405.653
UDG1F405.654
! Check if this field has already been converted - WGDOS only UDG1F405.655
IF(MOD(LOOKUP(21,I),10).EQ.1 .AND. WGDOS_EXPAND.NE.1) THEN UDG1F405.656
! Read in field UDG1F405.657
IF(IEEE_TYPE.EQ.32)THEN UDG1F405.658
CALL READFLDS
(NFTIN,1,I,LOOKUP,LEN1_LOOKUP, UDG1F405.659
& IEEE_32,MAX_FIELD_SIZE,FIXHD, UDG1F405.660
*CALL ARGPPX
UDG1F405.661
& IEEE_TYPE,LPVP, UDG1F405.662
& WGDOS_EXPAND,ICODE,CMESSAGE) UDG1F405.663
ELSE IF(IEEE_TYPE.EQ.64)THEN UDG1F405.664
! Read in field UDG1F405.665
CALL READFLDS
(NFTIN,1,I,LOOKUP,LEN1_LOOKUP, UDG1F405.666
& IEEE_64,MAX_FIELD_SIZE,FIXHD, UDG1F405.667
*CALL ARGPPX
UDG1F405.668
& IEEE_TYPE,LPVP, UDG1F405.669
& WGDOS_EXPAND,ICODE,CMESSAGE) UDG1F405.670
END IF UDG1F405.671
IF(ICODE.NE.0)CALL ABORT_IO('CONVIEEE',CMESSAGE,ICODE,NFTIN) UDG1F405.672
UDG1F405.673
ELSE IF(MOD(LOOKUP(21,I),10).EQ.1 .AND. WGDOS_EXPAND.EQ.1)THEN UDG1F405.674
! Read in field UDG1F405.675
CALL READFLDS
(NFTIN,1,I,LOOKUP,LEN1_LOOKUP, UDG1F405.676
& IEEE_64,MAX_FIELD_SIZE,FIXHD, UDG1F405.677
*CALL ARGPPX
UDG1F405.678
& IEEE_TYPE,LPVP, UDG1F405.679
& WGDOS_EXPAND,ICODE,CMESSAGE) UDG1F405.680
IF(ICODE.NE.0)CALL ABORT_IO('CONVIEEE',CMESSAGE,ICODE,NFTIN) UDG1F405.681
UDG1F405.682
ELSE UDG1F405.683
! Read in field UDG1F405.684
CALL READFLDS
(NFTIN,1,I,LOOKUP,LEN1_LOOKUP, UDG1F405.685
& D1,MAX_FIELD_SIZE,FIXHD, UDG1F405.686
*CALL ARGPPX
UDG1F405.687
& IEEE_TYPE,LPVP, UDG1F405.688
& WGDOS_EXPAND,ICODE,CMESSAGE) UDG1F405.689
IF(ICODE.NE.0)CALL ABORT_IO('CONVIEEE',CMESSAGE,ICODE,NFTIN) UDG1F405.690
UDG1F405.691
C Set data type UDG1F405.692
IF(ABS(LOOKUP(DATA_TYPE,I)).EQ.1) THEN UDG1F405.693
C Type real UDG1F405.694
IF(IEEE_TYPE.EQ.32)THEN UDG1F405.695
ITYPE=3 UDG1F405.696
ELSEIF(IEEE_TYPE.EQ.64)THEN UDG1F405.697
ITYPE=2 UDG1F405.698
ENDIF UDG1F405.699
ELSE IF(ABS(LOOKUP(DATA_TYPE,I)).EQ.2) THEN UDG1F405.700
C Type integer UDG1F405.701
IF(IEEE_TYPE.EQ.32)THEN UDG1F405.702
ITYPE=2 UDG1F405.703
ELSEIF(IEEE_TYPE.EQ.64)THEN UDG1F405.704
ITYPE=1 UDG1F405.705
ENDIF UDG1F405.706
ELSE IF(ABS(LOOKUP(DATA_TYPE,I)).EQ.3) THEN UDG1F405.707
C Type logical UDG1F405.708
ITYPE=5 UDG1F405.709
ELSE UDG1F405.710
CALL PR_LOOK
( UDG1F405.711
*CALL ARGPPX
UDG1F405.712
& LOOKUP,LOOKUP,LEN1_LOOKUP,I) UDG1F405.713
ICODE=3 UDG1F405.714
CMESSAGE='CONVIEEE: Invalid code in LOOKUP(39,K)' UDG1F405.715
RETURN UDG1F405.716
ENDIF UDG1F405.717
UDG1F405.718
C Convert to IEEE format and write to disk UDG1F405.719
IF(ITYPE.GE.0)THEN UDG1F405.720
IF(IEEE_TYPE.EQ.32)THEN UDG1F405.721
K=CRI2IEG(ITYPE,LOOKUP(LBLREC,I),IEEE_32,0, UDG1F405.722
& D1,1,64,IEEE_TYPE) UDG1F405.723
IF(K.NE.0)THEN UDG1F405.724
WRITE(6,*)'Conversion Error - Return Code is ',K UDG1F405.725
DO J=1,LOOKUP(LBLREC,I) UDG1F405.726
IF(.NOT.IEEE_FINITE(IEEE_32(J)))THEN UDG1F405.727
WRITE(6,'(''Error converting field '',i5, UDG1F405.728
& '' : Stash Code '',i5, UDG1F405.729
& '' : Point No. '',i5,)') UDG1F405.730
& I, LOOKUP(ITEM_CODE,I),J UDG1F405.731
WRITE(6,*) 'Number unconvertable reset to RMDI' UDG1F405.732
IEEE_32(J)=RMDI UDG1F405.733
END IF UDG1F405.734
END DO UDG1F405.735
END IF UDG1F405.736
END IF UDG1F405.737
IF(IEEE_TYPE.EQ.64)THEN UDG1F405.738
IF(LPVP)THEN UDG1F405.739
K=CRI2CRAY(ITYPE,LOOKUP(LBLREC,I),IEEE_64,0,D1,1) UDG1F405.740
IF(K.NE.0)THEN UDG1F405.741
WRITE(6,*)'Conversion Error - Return Code is ',K UDG1F405.742
CALL ABORT
('CRI2CRAY Conversion Error') UDG1F405.743
END IF UDG1F405.744
ELSE UDG1F405.745
K=CRAY2CRI(ITYPE,LOOKUP(LBLREC,I),D1,0,IEEE_64,1) UDG1F405.746
IF(K.NE.0)THEN UDG1F405.747
WRITE(6,*)'Conversion Error - Return Code is ',K UDG1F405.748
CALL ABORT
('CRAY2CRI Conversion Error') UDG1F405.749
END IF UDG1F405.750
END IF UDG1F405.751
END IF UDG1F405.752
ELSE UDG1F405.753
DO K=1,LOOKUP(LBLREC,I) UDG1F405.754
IEEE_32(k)=IAND(D1(K),1) UDG1F405.755
IEEE_64(k)=IAND(D1(K),1) UDG1F405.756
END DO UDG1F405.757
ENDIF UDG1F405.758
ENDIF UDG1F405.759
UDG1F405.760
C Write out field UDG1F405.761
FIXHD(160)=NEW_FIXHD_160 UDG1F405.762
IF(IEEE_TYPE.EQ.32)THEN UDG1F405.763
CALL SETPOS32
(NFTOUT, LOOKUP_LBEGIN_NEW(I), K) UDG1F405.764
CALL BUFFO32(
NFTOUT,IEEE_32,LOOKUP_LBNREC_NEW(I),LEN_IO,A) UDG1F405.765
ELSEIF(IEEE_TYPE.EQ.64)THEN UDG1F405.766
CALL SETPOS
(NFTOUT, LOOKUP_LBEGIN_NEW(I), K) UDG1F405.767
CALL BUFFOUT
(NFTOUT,IEEE_64,LOOKUP_LBNREC_NEW(I),LEN_IO,A) UDG1F405.768
ENDIF UDG1F405.769
UDG1F405.770
C Check for I/O errors UDG1F405.771
IF(A.NE.-1.0.OR.LEN_IO.NE.LOOKUP_LBNREC_NEW(I)) THEN UDG1F405.772
CALL IOERROR
('buffer out of data field', UDG1F405.773
* A,LEN_IO,LOOKUP(15,I)) UDG1F405.774
CALL ABORT
UDG1F405.775
ENDIF UDG1F405.776
UDG1F405.777
WRITE(6,'(''Field '',i5,'' : Stash Code '',i5, UDG1F405.778
& '' : has been converted'')') I, LOOKUP(42,I) UDG1F405.779
UDG1F405.780
! Reset the headers in case WDGOS packing has altered them UDG1F405.781
LOOKUP(LBLREC,I)=LOOKUP_LBLREC(I) UDG1F405.782
LOOKUP(LBEGIN,I)=LOOKUP_LBEGIN(I) UDG1F405.783
LOOKUP(LBNREC,I)=LOOKUP_LBNREC(I) UDG1F405.784
FIXHD(160)=OLD_FIXHD_160 UDG1F405.785
UDG1F405.786
END DO UDG1F405.787
2000 CONTINUE UDG1F405.788
UDG1F405.789
RETURN UDG1F405.790
END UDG1F405.791
*ENDIF CONVIEE1.390