*IF DEF,C82_1A,OR,DEF,RECON RPANCA1A.2
C ******************************COPYRIGHT****************************** GTS2F400.8371
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.8372
C GTS2F400.8373
C Use, duplication or disclosure of this code is subject to the GTS2F400.8374
C restrictions as set forth in the contract. GTS2F400.8375
C GTS2F400.8376
C Meteorological Office GTS2F400.8377
C London Road GTS2F400.8378
C BRACKNELL GTS2F400.8379
C Berkshire UK GTS2F400.8380
C RG12 2SZ GTS2F400.8381
C GTS2F400.8382
C If no contract has been raised with this copy of the code, the use, GTS2F400.8383
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.8384
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.8385
C Modelling at the above address. GTS2F400.8386
C ******************************COPYRIGHT****************************** GTS2F400.8387
C GTS2F400.8388
CLL Subroutine REPLANCA --------------------------------------------- RPANCA1A.3
CLL RPANCA1A.4
CLL Purpose: Updates ancillary fields as requested in FIELDCODE array. RPANCA1A.5
CLL Tests whether update is required for each field, allowing for RPANCA1A.6
CLL dependencies between fields. Uses LOOKUP array to find data for RPANCA1A.7
CLL appropriate time, reads a record and checks for current data RPANCA1A.8
CLL type. Reads second record if time interpolation required. Updates RPANCA1A.9
CLL the field. Under DEF RECON, the interface to the routine is RPANCA1A.10
CLL modified for use in the reconfiguration rather than the model. RPANCA1A.11
CLL Under DEF CAL360 the 360 day rather than the Gregorian calender RPANCA1A.12
CLL is used. RPANCA1A.13
CLL RPANCA1A.14
CLL Level 2 control routine for CRAY YMP RPANCA1A.15
CLL RPANCA1A.16
CLL C.Wilson <- programmer of some or all of previous code or changes RPANCA1A.17
CLL RPANCA1A.18
CLL Model Modification history from model version 3.0: RPANCA1A.19
CLL version Date RPANCA1A.20
CLL 3.1 22/02/93 Changes to allow updating of SLAB ref SST and ice TJ240293.18
CLL ancillary fields (items 178,179) from SST/ice files. TJ240293.19
CLL Correct bug if SST updated but not ice fraction. TJ240293.20
CLL 3.2 13/07/93 Changed CHARACTER*(*) to CHARACTER*(80) for TS150793.165
CLL portability. Author Tracey Smith. TS150793.166
CLL 3.2 15/04/93 Remove misleading warning messages if no time CW150193.1
CLL interpolation of SST CW150193.2
CLL 3.3 08/02/94 Modify calls to TIME2SEC/SEC2TIME to output/input TJ080294.336
CLL elapsed times in days & secs, for portability. TCJ TJ080294.337
CLL 3.3 22/11/93 Source term and aerosol ancillary fields added. RB221193.84
CLL 3.3 17/11/93 Initializing Integer UPDATE_MONTHS (N.Farnon) NF171193.1
CLL 3.3 08/12/93 Extra argument for READFLDS. D. Robinson DR081293.110
CLL 3.4 17/06/94 DEF CAL360 replaced by LOGICAL LCAL360 GSS1F304.543
CLL Argument LCAL360 passed to SEC2TIME, TIME2SEC GSS1F304.544
CLL S.J.Swarbrick GSS1F304.545
CLL 3.4 20/07/94 Improve time interpolation by using reference time GRB1F304.45
CLL for ancillary updating. R.T.H.Barnes. GRB1F304.46
CLL 3.4 05/09/94 Add murk and user ancillary fields. R.T.H.Barnes. GRB0F304.131
CLL 3.4 18/05/94 Allow prognostic slabtemp under sea ice.J Thomson GJT1F304.120
CLL 3.4 31/8/94 More error trapping. (William Ingram) AWI2F304.1
CLL 4.0 06/09/95 Only print time interpolation diagnostics when it GRB1F400.63
CLL is really done. RTHBarnes. GRB1F400.64
CLL 4.0 08/09/95 Allow time interpolation of ozone fields and GDR4F400.1
CLL cater for zonal/full fields. D. Robinson GDR4F400.2
CLL 4.0 29/11/95 Set land points to zero for surface currents GDR5F400.60
CLL and Heat convergence fields. D. Robinson GDR5F400.61
! 4.1 18/06/96 Changes to cope with changes in STASH addressing GDG0F401.1354
! Author D.M. Goddard. GDG0F401.1355
CLL 4.1 22/05/96 Replace list of ancillary fields with call to GDR1F401.94
CLL comdeck CANCLSTA. D. Robinson. GDR1F401.95
CLL 4.2 08/11/96 Initialise fields to ensure haloes contain data APB1F402.270
CLL for time interpolation for MPP runs. D. Robinson APB1F402.271
! 4.1 16/12/96 Check ancillary files for non-constant polar rows, UDG4F402.251
! in reconfiguration only. Correct if LPOLARCHK=T UDG4F402.252
! Author D.M. Goddard UDG4F402.253
!LL 4.4 07/07/97 Alter SST and ice updating for AMIPII runs GRS2F404.1
!LL R A Stratton GRS2F404.2
! 4.4 13/11/97 Ancilary fields 72 - 89 no longer used for UDG0F404.16
! for user defined ancillaries. Code altered to UDG0F404.17
! ensure correct treatment of these fields. UDG0F404.18
! Author D.M. Goddard UDG0F404.19
CLL 4.4 25/07/97 (Reconfiguration only). Prevent failure when URR0F404.1
CLL non-constant polar values for ancillary files are URR0F404.2
CLL corrected. R. Rawlins URR0F404.3
CLL 4.5 22/04/98 Add control of new NH3, soot aerosol emission ARR5F405.25
CLL ancillary fields. Plus minor message changes. ARR5F405.26
CLL R.Rawlins ARR5F405.27
! 4.5 22/10/98 Increase number of user ancillary fields by GDG2F405.100
! deleting existing four fields 68 - 72 and GDG2F405.101
! adding twenty to end 90 - 109 GDG2F405.102
! Author D.M. Goddard GDG2F405.103
!LL 4.5 22/01/98 Correct level of second field read in for time GDR1F405.1
!LL interpolation. D. Robinson GDR1F405.2
CLL RPANCA1A.21
CLL Programing standard : UMDP no 3, version no 2, dated 07/09/90 RPANCA1A.22
CLL RPANCA1A.23
CLL Logical component covered : C71 RPANCA1A.24
CLL RPANCA1A.25
CLL System task : C7 RPANCA1A.26
CLL RPANCA1A.27
CLL External Documentation: UMDP no C7 RPANCA1A.28
CLL RPANCA1A.29
CLLEND------------------------------------------------------------- RPANCA1A.30
RPANCA1A.31
SUBROUTINE REPLANCA(I_YEAR,I_MONTH,I_DAY,I_HOUR, 2,36GDG0F401.1356
& I_MINUTE,I_SECOND,I_DAY_NUMBER, GDG0F401.1357
& ANCIL_REFTIME,OFFSET_STEPS, GDG0F401.1358
& P_FIELD,P_ROWS,U_FIELD,D1,LAND, GDG0F401.1359
*IF -DEF,RECON GDG0F401.1360
& A_STEP,LAND_FIELD,STEPS_PER_HR, GDG0F401.1361
*ENDIF GDG0F401.1362
& ICE_FRACTION,TSTAR,TSTAR_ANOM, GDG0F401.1363
& NS_SPACE,FIRST_LAT, GRS2F404.3
& LEN1_LOOKUP,LEN_FIXHD,LEN_INTHD, GDG0F401.1364
& LEN_REALHD,LEN_D1,FIXHD,INTHD,REALHD, GDG0F401.1365
& LOOKUP,RLOOKUP,FTNANCIL,LOOKUP_START, GDG0F401.1366
& NDATASETS,NLOOKUPS, GDG0F401.1367
*CALL ARGPPX
GDG0F401.1368
*IF DEF,RECON GDG0F401.1369
& LPOLARCHK, UDG4F402.254
& IOUNIT,ICODE,CMESSAGE,LCAL360) ! Intent Out GDG0F401.1370
*ELSE GDG0F401.1371
& ICODE,CMESSAGE,LCAL360) ! Intent Out GDG0F401.1372
*ENDIF GDG0F401.1373
RPANCA1A.67
IMPLICIT NONE RPANCA1A.68
RPANCA1A.69
LOGICAL LCAL360 GSS1F304.547
RPANCA1A.70
INTEGER RPANCA1A.72
& I_YEAR, ! Curent Model Time RPANCA1A.73
& I_MONTH, ! " " " RPANCA1A.74
& I_DAY, ! " " " RPANCA1A.75
& I_HOUR, ! " " " RPANCA1A.76
& I_MINUTE, ! " " " RPANCA1A.77
& I_SECOND, ! " " " RPANCA1A.78
& I_DAY_NUMBER, RPANCA1A.79
& ANCIL_REFTIME(6), ! Reference time for ancillary updating GRB1F304.48
& OFFSET_STEPS, ! Offset in timesteps of ref. from basis GRB1F304.49
RPANCA1A.80
*IF -DEF,RECON RPANCA1A.81
RPANCA1A.82
& A_STEP,LAND_FIELD,STEPS_PER_HR, RPANCA1A.83
RPANCA1A.84
*ENDIF RPANCA1A.85
RPANCA1A.86
& P_FIELD, ! Size of horizontal fields RPANCA1A.88
& P_ROWS, ! RPANCA1A.89
& U_FIELD, ! " " " " RPANCA1A.90
& NDATASETS, ! Number of ancillary datasets RPANCA1A.91
& NLOOKUPS, ! Number of lookup tables RPANCA1A.92
& LEN_D1 ! Size of primary data array RPANCA1A.93
RPANCA1A.94
INTEGER RPANCA1A.95
& LEN1_LOOKUP, ! First dimension of lookup table RPANCA1A.96
& LEN_FIXHD, ! Length of headers in data sets RPANCA1A.97
& LEN_INTHD, ! RPANCA1A.98
& LEN_REALHD, ! RPANCA1A.99
& FIXHD(LEN_FIXHD,NDATASETS), ! Data set headers RPANCA1A.100
& INTHD(LEN_INTHD,NDATASETS), ! RPANCA1A.101
& LOOKUP(LEN1_LOOKUP,NLOOKUPS),! Data set lookup tables RPANCA1A.102
& FTNANCIL(NDATASETS), ! FTN numbers of data sets RPANCA1A.103
& LOOKUP_START(NDATASETS) ! Start of lookup tables RPANCA1A.104
C ! referring to each data set. RPANCA1A.105
RPANCA1A.106
REAL RPANCA1A.107
& D1(LEN_D1), !INOUT Primary data array used to hold RPANCA1A.108
C ! all fields except TSTAR and RPANCA1A.109
C ! ICE_FRACTION RPANCA1A.110
& ICE_FRACTION(P_FIELD), !INOUT Ice fraction, updated if RPANCA1A.111
C ! requested RPANCA1A.112
& TSTAR(P_FIELD), !INOUT TSTAR, updated if requested RPANCA1A.113
& TSTAR_ANOM(P_FIELD),!INOUT SST anomaly,formed in recon; RPANCA1A.114
& ! added if requested in model run RPANCA1A.115
& REALHD(LEN_REALHD,NDATASETS), RPANCA1A.116
& RLOOKUP(LEN1_LOOKUP,NLOOKUPS) RPANCA1A.117
& ,NS_SPACE ! NS latitude spacing GRS2F404.4
& ,FIRST_LAT ! latitude of first gridpoint GRS2F404.5
RPANCA1A.118
LOGICAL RPANCA1A.119
& LAND(P_FIELD) ! Land sea mask RPANCA1A.120
RPANCA1A.121
INTEGER RPANCA1A.122
& ICODE ! Return code RPANCA1A.123
& ,IOUNIT !OUT I/O unit passed out in RECON mode RPANCA1A.124
RPANCA1A.125
CHARACTER*(80) TS150793.167
& CMESSAGE ! Error message RPANCA1A.127
C* RPANCA1A.129
! Comdecks:------------------------------------------------------------ GDG0F401.1374
*CALL CSUBMODL
GDG0F401.1375
*CALL CPPXREF
GDG0F401.1376
*CALL PPXLOOK
GDG0F401.1377
*CALL CANCILA
RPANCA1A.131
*CALL CLOOKADD
RPANCA1A.132
*CALL CPHYSCON
RPANCA1A.133
*IF DEF,MPP GRS2F404.6
*CALL PARVARS
GRS2F404.7
*ENDIF GRS2F404.8
RPANCA1A.134
C*L Subroutines called; RPANCA1A.135
RPANCA1A.136
EXTERNAL RPANCA1A.137
& TIME2SEC, RPANCA1A.138
& READFLDS, RPANCA1A.139
& T_INT, RPANCA1A.140
*IF -DEF,RECON RPANCA1A.141
RPANCA1A.142
& TO_LAND_POINTS, RPANCA1A.143
& SEC2TIME,TIME_DF, GRB1F304.50
RPANCA1A.145
*ENDIF RPANCA1A.146
& T_INT_C RPANCA1A.147
RPANCA1A.148
C* RPANCA1A.149
C*L Local real arrays RPANCA1A.150
RPANCA1A.151
REAL RPANCA1A.152
& ANCIL1(P_FIELD), ! Buffers to hold values of ancillary RPANCA1A.153
C ! data for time interpolation. RPANCA1A.154
& ANCIL2(P_FIELD), ! RPANCA1A.155
& ANCIL_DATA(P_FIELD),! Field of ancillary data held prior RPANCA1A.156
C ! to selective updating. RPANCA1A.157
& SNOW_CHANGE(P_FIELD),! Fractional time of change of RPANCA1A.158
C ! snow cover RPANCA1A.159
& ICE_EXTENT(P_FIELD,2),! Fractional time of change RPANCA1A.160
C ! of ice cover RPANCA1A.161
& PRES_VALUE(P_FIELD) ! Prescribed value of data when RPANCA1A.162
C ! controlling field is zero. RPANCA1A.163
&, NO_ICE_EXTENT(P_FIELD)! Indicator for no sea ice RPANCA1A.164
C ! =0 if ice cover RPANCA1A.165
C* RPANCA1A.166
C Local variables RPANCA1A.167
RPANCA1A.168
INTEGER RPANCA1A.169
& I, ! RPANCA1A.170
& I1, ! RPANCA1A.171
& I2, ! RPANCA1A.172
& I3, AWI2F304.2
& ID, ! RPANCA1A.173
& IM, ! RPANCA1A.174
& IY, ! RPANCA1A.175
& K, UDG4F402.255
& FIELD, ! Current field number. RPANCA1A.176
& FILE ! RPANCA1A.177
RPANCA1A.178
INTEGER RPANCA1A.179
& INTERVAL, ! Interval between data times RPANCA1A.180
& STEP, ! Number of data times skipped. RPANCA1A.181
& MONTHS, ! Used in calculation of position RPANCA1A.182
C ! of data required. RPANCA1A.183
& HOURS, ! RPANCA1A.184
& PERIOD, ! Period of periodic data RPANCA1A.185
& START_MONTH, ! RPANCA1A.186
& LEVEL, ! RPANCA1A.187
& NFTIN, ! Current FTN number for ancillary field RPANCA1A.188
& ANCIL_REF_DAYS, ! Ancil.reference time in whole days GRB1F304.51
& ANCIL_REF_SECS, ! Ancil.reference time in extra seconds GRB1F304.52
& DAY,SEC, ! Times relative to reference time GRB1F304.53
& DAY1,SEC1, ! Times relative to reference time GRB1F304.54
& INCR_SEC, ! Increment in sec GRB1F304.55
& LEN RPANCA1A.191
& ,IEND GRS2F404.9
& ,II,ROW_LENGTH,J GRS2F404.10
INTEGER RPANCA1A.193
& I_YEAR1, ! Copy of Curent Model Time year RPANCA1A.194
& I_MONTH1, ! " " " month RPANCA1A.195
& I_DAY1, ! " " " day RPANCA1A.196
& I_HOUR1 ! " " " hour RPANCA1A.197
*IF -DEF,RECON GRS2F404.11
RPANCA1A.198
INTEGER RPANCA1A.199
& UPDATE_MONTHS ! update frequency (months) if Gregorian RPANCA1A.200
LOGICAL RPANCA1A.201
& LGREG_MONTHLY ! True for Gregorian monthly updating RPANCA1A.202
C GSS1F304.548
C *IF -DEF,CAL360 GSS1F304.549
C GSS1F304.550
INTEGER RPANCA1A.204
& I_YEAR_BASIS, ! Basis Model Time RPANCA1A.205
& I_MONTH_BASIS, ! " " " RPANCA1A.206
& I_DAY_BASIS, ! " " " RPANCA1A.207
& I_HOUR_BASIS, ! " " " RPANCA1A.208
& I_MINUTE_BASIS, ! " " " RPANCA1A.209
& I_SECOND_BASIS, ! " " " RPANCA1A.210
& I_DAY_NUMBER_BASIS RPANCA1A.211
C GSS1F304.551
C *ENDIF GSS1F304.552
C GSS1F304.553
RPANCA1A.214
INTEGER GRB1F304.56
& I_YEAR_REF, ! Reference Time GRB1F304.57
& I_MONTH_REF, ! " " GRB1F304.58
& I_DAY_REF, ! " " GRB1F304.59
& I_HOUR_REF, ! " " GRB1F304.60
& I_MINUTE_REF, ! " " GRB1F304.61
& I_SECOND_REF ! " " GRB1F304.62
GRB1F304.63
*ENDIF RPANCA1A.215
RPANCA1A.216
LOGICAL RPANCA1A.217
& LINTERPOLATE, ! Indicates whether time RPANCA1A.218
C ! interpolation needed. RPANCA1A.219
& LT_INT_C, ! Indicates use of controlled time RPANCA1A.220
C ! interpolation RPANCA1A.221
& LMISMATCH, ! Used in header checks RPANCA1A.222
& LICE_FRACTION, ! RPANCA1A.223
& LSNOW_DEPTH, ! RPANCA1A.224
& SINGLE_TIME, ! Indicates that only one time is RPANCA1A.225
C ! available in data set RPANCA1A.226
& PERIODIC, ! Data set is periodic RPANCA1A.227
& REGULAR ! Interval between data times in RPANCA1A.228
C ! dataset is regular in model timesteps. RPANCA1A.229
& ,LICE_DEPTH GRS2F404.12
RPANCA1A.230
REAL RPANCA1A.231
& ZERO, ! RPANCA1A.232
& TIME1, ! Times if data used in time interpolation RPANCA1A.233
& TIME2, ! RPANCA1A.234
& TIME !Target time for time interpolation RPANCA1A.235
& ,LAT_P ! latitude of point GRS2F404.13
*IF DEF,RECON UDG4F402.256
REAL RP_ROW_SUM UDG4F402.257
LOGICAL LPOLARCHK UDG4F402.258
*ENDIF UDG4F402.259
RPANCA1A.236
CL Internal structure RPANCA1A.237
RPANCA1A.238
CL List of Atmosphere & Slab Ancillary fields. GDR1F401.96
*CALL CANCLSTA
GDR1F401.97
GDR1F401.98
CL 1. Initialisation for atmosphere RPANCA1A.239
RPANCA1A.240
RPANCA1A.264
ICODE=0 UDG4F402.260
IOUNIT=0 RPANCA1A.265
*IF -DEF,RECON NF171193.2
UPDATE_MONTHS=0 NF171193.3
INCR_SEC = 0 GRB1F304.64
*ENDIF NF171193.4
RPANCA1A.266
! Initialise ANCIL1/2. Includes Halos for MPP runs. APB1F402.272
DO I=1,P_FIELD APB1F402.273
ANCIL1(I)=0.0 APB1F402.274
ANCIL2(I)=0.0 APB1F402.275
ENDDO APB1F402.276
CL 1.1 Set logical UPDATE for each ancillary field independently RB221193.90
RPANCA1A.268
DO FIELD=1,NANCIL_FIELDS RPANCA1A.269
RPANCA1A.270
*IF -DEF,RECON RPANCA1A.271
RPANCA1A.272
UPDATE(FIELD)=.FALSE. RPANCA1A.273
IF(STEPS(FIELD).NE.0) THEN RPANCA1A.274
C UPDATE(FIELD)=MOD(A_STEP,STEPS(FIELD)).EQ.0 GRB1F304.65
UPDATE(FIELD)=(MOD(A_STEP+OFFSET_STEPS,STEPS(FIELD)).EQ.0 GRB1F304.66
& .OR.A_STEP.EQ.0) GRB1F304.67
& .AND.FIELDCODE(1,FIELD).GT.0 RPANCA1A.276
& .AND.D1_ANCILADD(FIELD).GT.1 GDR3F305.311
END IF RPANCA1A.277
GRB1F304.68
CL 1.05 Copy ancillary updating reference time to local variables GRB1F304.69
I_YEAR_REF = ANCIL_REFTIME(1) GRB1F304.70
I_MONTH_REF = ANCIL_REFTIME(2) GRB1F304.71
I_DAY_REF = ANCIL_REFTIME(3) GRB1F304.72
I_HOUR_REF = ANCIL_REFTIME(4) GRB1F304.73
I_MINUTE_REF = ANCIL_REFTIME(5) GRB1F304.74
I_SECOND_REF = ANCIL_REFTIME(6) GRB1F304.75
CL and convert to reference days & secs GRB1F304.76
CALL TIME2SEC
(I_YEAR_REF,I_MONTH_REF,I_DAY_REF, GRB1F304.77
& I_HOUR_REF,I_MINUTE_REF,I_SECOND_REF, GRB1F304.78
& 0,0,ANCIL_REF_DAYS,ANCIL_REF_SECS,LCAL360) GRB1F304.79
GRB1F304.80
C GSS1F304.555
IF (.NOT. LCAL360) THEN GSS1F304.556
RPANCA1A.282
CL 1.11 Set logical UPDATE for Gregorian calender updates at monthly RPANCA1A.283
CL or yearly intervals. NB STEPS value set to 1 day in INANCILA RPANCA1A.284
IF(FIELDCODE(1,FIELD).EQ.1.OR.FIELDCODE(1,FIELD).EQ.2) THEN RPANCA1A.285
MONTHS=I_MONTH+I_YEAR*12-(I_MONTH_REF+I_YEAR_REF*12) GRB1F304.81
UPDATE_MONTHS= FIELDCODE(2,FIELD)* RPANCA1A.287
& ((3-FIELDCODE(1,FIELD))/2 *12+ 1-(3-FIELDCODE(1,FIELD))/2) RPANCA1A.288
UPDATE(FIELD)=MOD(MONTHS,UPDATE_MONTHS).EQ.0.AND.I_DAY.EQ.1 RPANCA1A.289
END IF RPANCA1A.290
END IF ! (.NOT.LCAL360) GSS1F304.557
C GSS1F304.558
RPANCA1A.292
*ELSE RPANCA1A.293
RPANCA1A.294
UPDATE(FIELD)=FIELDCODE(FIELD).GT.0 RPANCA1A.295
! Initialise for valid time interpolation in reconfiguration mode. GDG0F401.1378
ANCIL_REF_DAYS = 0 GDG0F401.1379
ANCIL_REF_SECS = 0 GDG0F401.1380
RPANCA1A.296
*ENDIF RPANCA1A.297
RPANCA1A.298
END DO RPANCA1A.299
RPANCA1A.300
CL 1.2 Allow for dependencies between fields RPANCA1A.301
C Sea surface temperature must be updated when sea ice is updated RPANCA1A.302
RPANCA1A.303
UPDATE(28)=UPDATE(27).OR.UPDATE(28) RPANCA1A.304
RPANCA1A.305
C Both surface current components must be updated together RPANCA1A.306
RPANCA1A.307
UPDATE(30)=UPDATE(30).OR.UPDATE(31) RPANCA1A.308
UPDATE(31)=UPDATE(30) RPANCA1A.309
RPANCA1A.310
CL Select method of time interpolation for SST. The interpolation RPANCA1A.311
CL allows for sea ice if ice data is available at the same times RPANCA1A.312
CL as the temperature data. Otherwise linear interpolation is used. RB221193.91
RPANCA1A.314
LT_INT_C=.TRUE. RPANCA1A.315
RPANCA1A.316
IF(UPDATE(28)) THEN RPANCA1A.317
IF(FIXHD(10,FILEANCIL(27)).EQ.0) LT_INT_C=.FALSE. RPANCA1A.318
IF(LT_INT_C) THEN CW150193.3
DO I=21,41 RPANCA1A.319
IF(FIXHD(I,FILEANCIL(27)).NE.FIXHD(I, RPANCA1A.320
& FILEANCIL(28))) THEN RPANCA1A.321
LT_INT_C=.FALSE. RPANCA1A.322
WRITE(6,*)' WARNING:controlled time interpolation for SST', RPANCA1A.323
& ' not available: Mismatch in SST and SEA-ICE ancillary data' RPANCA1A.324
& ,' times in FIXED HEADER' RPANCA1A.325
WRITE(6,*)' position=',I,' SEA-ICE=',FIXHD(I,FILEANCIL(27)) RPANCA1A.326
WRITE(6,*)' position=',I,' SST=',FIXHD(I,FILEANCIL(28)) RPANCA1A.327
END IF RPANCA1A.328
END DO RPANCA1A.329
ENDIF CW150193.4
END IF RPANCA1A.330
RPANCA1A.331
RPANCA1A.332
RPANCA1A.333
CL Loop over ancillary fields(atmosphere) RPANCA1A.334
RPANCA1A.335
DO FIELD=1,NANCIL_FIELDS RPANCA1A.336
RPANCA1A.337
LICE_DEPTH=field.eq.29 ! required for LAMIPII GRS2F404.14
RPANCA1A.339
IF (UPDATE(FIELD)) THEN ! (1st level IF) RPANCA1A.340
FILE=FILEANCIL(FIELD) RPANCA1A.341
NFTIN=FTNANCIL(FILE) RPANCA1A.342
RPANCA1A.343
IF(LICE_DEPTH.AND.LAMIPII) THEN GRS2F404.15
GRS2F404.16
! Uses ice fraction set earlier in field loop. GRS2F404.17
! WARNING this will fail if the order of ancillary fields is ever GRS2F404.18
! changed so that ice-depth preceeds ice fraction GRS2F404.19
! Note : For complete sea ice cover GRS2F404.20
! Arctic ice depth = 2m GRS2F404.21
! Antarctic ice depth = 1m GRS2F404.22
! For ice concentrations less than 1. ice depth is 1 or 2 times conc. GRS2F404.23
! This results in similar values to those from runs using ancillary GRS2F404.24
! files containing ice depths set to 1 or 2m. GRS2F404.25
GRS2F404.26
ROW_LENGTH=P_FIELD/P_ROWS GRS2F404.27
DO I=1,P_ROWS GRS2F404.28
! work out latitude in radians GRS2F404.29
*IF -DEF,MPP GRS2F404.30
LAT_P=FIRST_LAT-NS_SPACE*(I-1) GRS2F404.31
*ELSE GRS2F404.32
LAT_P=FIRST_LAT-NS_SPACE*(I+datastart(2)-Offy-1) GRS2F404.33
*ENDIF GRS2F404.34
DO J=1,ROW_LENGTH GRS2F404.35
II=J+(I-1)*ROW_LENGTH GRS2F404.36
ANCIL_DATA(II)=0.0 GRS2F404.37
IF (ICE_FRACTION(II).gt.0.0) THEN GRS2F404.38
IF (LAT_P.GT.0.0) THEN ! Arctic ice depth GRS2F404.39
ANCIL_DATA(II)=2.*ICE_FRACTION(II) GRS2F404.40
ELSE ! Antarctic ice depth GRS2F404.41
ANCIL_DATA(II)=1.*ICE_FRACTION(II) GRS2F404.42
ENDIF GRS2F404.43
ENDIF GRS2F404.44
ENDDO GRS2F404.45
ENDDO GRS2F404.46
!L Sea ice thickness GRS2F404.47
!L Update over all sea points (all sea ice points are the only GRS2F404.48
!L ones strictly required, but this cannot be determined easily) GRS2F404.49
GRS2F404.50
DO I=1,P_FIELD GRS2F404.51
IF(.NOT.LAND(I)) THEN GRS2F404.52
D1(D1_ANCILADD(FIELD)+I-1)=ANCIL_DATA(I) GRS2F404.53
END IF GRS2F404.54
END DO GRS2F404.55
ELSE GRS2F404.56
C Update required for field RPANCA1A.344
RPANCA1A.345
WRITE(6,*)'REPLANCA: UPDATE REQUIRED FOR FIELD',FIELD GIE0F403.603
RPANCA1A.347
IF ( FIXHD(10,FILE) .LT. 0 .OR. FIXHD(10,FILE) .GT. 2 ) THEN AWI2F304.3
ICODE = 700 + FIELD AWI2F304.4
CMESSAGE = 'REPLANCA: Error in fixed header(10) of ancillary AWI2F304.5
& file ' AWI2F304.6
RETURN AWI2F304.7
ENDIF AWI2F304.8
AWI2F304.9
CL Check whether more than one data time available in data set RPANCA1A.348
RPANCA1A.349
SINGLE_TIME=FIXHD(10,FILE).EQ.0 RPANCA1A.350
RPANCA1A.351
CL Set default values for time interpolation RPANCA1A.352
RPANCA1A.353
LINTERPOLATE=.TRUE. RPANCA1A.354
IF(SINGLE_TIME) THEN RPANCA1A.355
LINTERPOLATE=.FALSE. RPANCA1A.356
END IF RPANCA1A.357
RPANCA1A.358
IF (FIELD.GT.9 .AND. FIELD.LT.27) THEN GDR4F400.3
LINTERPOLATE=.FALSE. RPANCA1A.360
END IF RPANCA1A.361
RPANCA1A.362
CL 2.1 Find position of input record RPANCA1A.363
RPANCA1A.364
CL Default settings of search parameters if only one time present RPANCA1A.365
RPANCA1A.366
IF(SINGLE_TIME) THEN RPANCA1A.367
STEP=0 RPANCA1A.368
ELSE RPANCA1A.369
RPANCA1A.370
*IF -DEF,RECON RPANCA1A.371
RPANCA1A.372
LGREG_MONTHLY=.FALSE. RPANCA1A.373
C GSS1F304.561
IF (.NOT. LCAL360) THEN GSS1F304.562
IF(FIELDCODE(1,FIELD).EQ.1.OR.FIELDCODE(1,FIELD).EQ.2) THEN RPANCA1A.375
LGREG_MONTHLY=.TRUE. RPANCA1A.376
UPDATE_MONTHS= FIELDCODE(2,FIELD)* RPANCA1A.377
& ((3-FIELDCODE(1,FIELD))/2 *12+ 1-(3-FIELDCODE(1,FIELD))/2) RPANCA1A.378
END IF RPANCA1A.379
END IF GSS1F304.563
C GSS1F304.564
RPANCA1A.381
*ENDIF RPANCA1A.382
RPANCA1A.383
PERIODIC=FIXHD(10,FILE).EQ.2 RPANCA1A.384
REGULAR=.TRUE. RPANCA1A.385
RPANCA1A.386
C GSS1F304.567
IF (.NOT. LCAL360) THEN GSS1F304.568
REGULAR=FIXHD(35,FILE).EQ.0.AND.FIXHD(36,FILE). RPANCA1A.389
& EQ.0 RPANCA1A.390
C i.e. data at intervals of days/hours & non-periodic RPANCA1A.391
IF(PERIODIC) REGULAR=REGULAR.AND.FIXHD(37,FILE).EQ.0 RPANCA1A.392
C i.e. data at intervals of hours & periodic RPANCA1A.393
END IF GSS1F304.569
C GSS1F304.570
RPANCA1A.396
C Error checking on time information. AWI2F304.10
AWI2F304.11
IF ( FIXHD(35,FILE) .LT. 0 .OR. AWI2F304.12
& FIXHD(36,FILE) .LT. 0 .OR. FIXHD(36,FILE) .GT. 12 .OR. AWI2F304.13
& REGULAR .AND. ( FIXHD(37,FILE) .LT. 0 .OR. FIXHD(37,FILE) .GT. 31 AWI2F304.14
& .OR. FIXHD(38,FILE) .LT. 0 .OR. FIXHD(38,FILE) .GT. 24 ) ) THEN AWI2F304.15
C FIXHD(39-40) are not used by REPLANCA. AWI2F304.16
C FIXHD(35-37) have already been used if not CAL360. AWI2F304.17
ICODE = 700 + FIELD AWI2F304.18
CMESSAGE = 'REPLANCA: Error in validity time interval given AWI2F304.19
&in ancillary file (FIXHD(35-38))' AWI2F304.20
RETURN AWI2F304.21
ENDIF AWI2F304.22
AWI2F304.23
IF ( FIXHD(21,FILE) .LT. 0 .AND. .NOT. PERIODIC AWI2F304.24
& .OR. .NOT. ( REGULAR .AND. PERIODIC ) .AND. AWI2F304.25
C ! If it is REGULAR & PERIODIC more detailed check is applied below AWI2F304.26
& ( FIXHD(22,FILE) .LT. 0 .OR. FIXHD(22,FILE) .GT. 12 .OR. AWI2F304.27
& FIXHD(23,FILE) .LT. 0 .OR. FIXHD(23,FILE) .GT. 31 .OR. AWI2F304.28
& FIXHD(24,FILE) .LT. 0 .OR. FIXHD(24,FILE) .GT. 24 .OR. AWI2F304.29
& FIXHD(25,FILE) .LT. 0 .OR. FIXHD(25,FILE) .GT. 60 .OR. AWI2F304.30
& FIXHD(26,FILE) .LT. 0 .OR. FIXHD(26,FILE) .GT. 60 ) ) THEN AWI2F304.31
ICODE = 700 + FIELD AWI2F304.32
CMESSAGE = 'REPLANCA: Error in first validity time given in AWI2F304.33
& ancillary file (FIXHD(21-26)) ' AWI2F304.34
RETURN AWI2F304.35
ENDIF AWI2F304.36
AWI2F304.37
IF(.NOT.PERIODIC) THEN RPANCA1A.397
RPANCA1A.398
CL If data taken from full time series of input data. RPANCA1A.399
RPANCA1A.400
CALL TIME2SEC
(I_YEAR,I_MONTH,I_DAY,I_HOUR RPANCA1A.401
& ,I_MINUTE,I_SECOND TJ080294.346
& ,ANCIL_REF_DAYS,ANCIL_REF_SECS,DAY,SEC GSS1F304.572
& ,LCAL360) GSS1F304.573
RPANCA1A.403
*IF -DEF,RECON RPANCA1A.404
RPANCA1A.405
CL Adjust time to middle of updating interval RPANCA1A.406
RPANCA1A.407
IF(.NOT.LGREG_MONTHLY) THEN RPANCA1A.408
SEC=SEC+STEPS(FIELD)*1800/STEPS_PER_HR RPANCA1A.409
RPANCA1A.410
C If start-up, adjust for offset of reference time from initial time, GRB1F304.82
C & update with values for half a period before first standard update. GRB1F304.83
IF (A_STEP.EQ.0) THEN GRB1F304.84
DAY1 = DAY GRB1F304.85
SEC1 = SEC GRB1F304.86
INCR_SEC=-3600*MOD(OFFSET_STEPS,STEPS(FIELD))/STEPS_PER_HR GRB1F304.87
CALL TIME_DF
(DAY1,SEC1,0,INCR_SEC,DAY,SEC) GRB1F304.88
END IF GRB1F304.89
GRB1F304.90
ELSE RPANCA1A.411
IM=MOD(I_MONTH+UPDATE_MONTHS-1,12) + 1 RPANCA1A.412
IY=I_YEAR+(I_MONTH+UPDATE_MONTHS-1)/12 RPANCA1A.413
CALL TIME2SEC
(IY,IM,I_DAY,I_HOUR RPANCA1A.414
& ,I_MINUTE,I_SECOND TJ080294.348
& ,ANCIL_REF_DAYS,ANCIL_REF_SECS,DAY1,SEC1 GSS1F304.574
& ,LCAL360) GSS1F304.575
IF (MOD(DAY+DAY1,2).EQ.0) THEN TJ080294.350
DAY=(DAY+DAY1)/2 TJ080294.351
SEC=(SEC+SEC1)/2 TJ080294.352
ELSE TJ080294.353
DAY=(DAY+DAY1-1)/2 TJ080294.354
SEC=(SEC+SEC1+86400)/2 TJ080294.355
ENDIF TJ080294.356
C If start-up, adjust for offset of reference time from initial time, GRB1F304.91
C & update with values for half a period before first standard update. GRB1F304.92
IF (A_STEP.EQ.0) THEN GRB1F304.93
DAY1 = DAY GRB1F304.94
SEC1 = SEC GRB1F304.95
INCR_SEC=-3600*MOD(OFFSET_STEPS,STEPS(FIELD))/STEPS_PER_HR GRB1F304.96
CALL TIME_DF
(DAY1,SEC1,0,INCR_SEC,DAY,SEC) GRB1F304.97
END IF GRB1F304.98
ENDIF RPANCA1A.417
RPANCA1A.418
*ENDIF RPANCA1A.419
RPANCA1A.420
IF(REGULAR) THEN RPANCA1A.421
CL 2.1.1 Standard cases:360 day calender; RPANCA1A.422
CL 2.1.1 or Gregorian calendar with RPANCA1A.423
CL interval between data times in days or hours RPANCA1A.424
CL updating interval may be regular in model timesteps, RPANCA1A.425
CL or (LGREG_MONTHLY=T) irregular in model timesteps, RPANCA1A.426
RPANCA1A.427
HOURS=SEC/3600+DAY*24 TJ080294.357
CL FInd time(in hours) of first ancillary data on file RPANCA1A.429
CALL TIME2SEC
(FIXHD(21,FILE),FIXHD(22,FILE), RPANCA1A.430
& FIXHD(23,FILE),FIXHD(24,FILE), RPANCA1A.431
& FIXHD(25,FILE),FIXHD(26,FILE), RPANCA1A.432
& ANCIL_REF_DAYS,ANCIL_REF_SECS,DAY,SEC, GSS1F304.576
& LCAL360) GSS1F304.577
HOURS=HOURS-SEC/3600-DAY*24 TJ080294.359
RPANCA1A.435
IF(HOURS.LT.0) THEN RPANCA1A.436
ICODE=400+FIELD RPANCA1A.437
CMESSAGE='REPLANCA: Current time precedes start time of data' RPANCA1A.438
RETURN RPANCA1A.439
END IF RPANCA1A.440
RPANCA1A.441
CL FInd interval(in hours) between ancillary data on file RPANCA1A.442
INTERVAL=FIXHD(35,FILE)*8640+FIXHD(36,FILE)*720+ RPANCA1A.443
& FIXHD(37,FILE)*24+FIXHD(38,FILE) RPANCA1A.444
RPANCA1A.445
C Do not interpolate in time if data time exactly matches model time RPANCA1A.446
RPANCA1A.447
IF(MOD(HOURS,INTERVAL).EQ.0) THEN RPANCA1A.448
LINTERPOLATE=.FALSE. RPANCA1A.449
END IF RPANCA1A.450
RPANCA1A.451
STEP=HOURS/INTERVAL RPANCA1A.452
TIME=REAL(HOURS) RPANCA1A.453
TIME1=STEP*INTERVAL RPANCA1A.454
TIME2=(STEP+1)*INTERVAL RPANCA1A.455
RPANCA1A.456
ELSE RPANCA1A.457
RPANCA1A.458
CL 2.1.2 Gregorian calender;ancillary data interval is in months or RPANCA1A.459
CL years,which is irregular in model timesteps. RPANCA1A.460
!L original code is inaccurate for this section - corrected code under GRS2F404.57
!L LAMIPII makes use of dates in lookup headers GRS2F404.58
!L For a real calendar year the mid-point of each month is different GRS2F404.59
!L in terms of its hour and day. The old inaccurate method assumes GRS2F404.60
!L the hour and day are taken from the fixhd values. These are only GRS2F404.61
!L usually correct for the first month on the ancillary file. GRS2F404.62
RPANCA1A.461
*IF -DEF,RECON RPANCA1A.462
RPANCA1A.463
CL Adjust YMD time to middle of updating interval RPANCA1A.464
RPANCA1A.465
I_YEAR1=I_YEAR RPANCA1A.466
I_MONTH1=I_MONTH RPANCA1A.467
I_DAY1=I_DAY RPANCA1A.468
I_HOUR1=I_HOUR RPANCA1A.469
CALL SEC2TIME
(DAY,SEC,ANCIL_REF_DAYS,ANCIL_REF_SECS, GRB1F304.99
& I_YEAR,I_MONTH,I_DAY, TJ080294.361
& I_HOUR,I_MINUTE,I_SECOND,I_DAY_NUMBER, GSS1F304.578
& LCAL360) GSS1F304.579
RPANCA1A.472
*ENDIF RPANCA1A.473
RPANCA1A.474
CL FInd interval(in months) between ancillary data on file RPANCA1A.475
INTERVAL=FIXHD(35,FILE)*12+FIXHD(36,FILE) RPANCA1A.476
MONTHS=I_YEAR*12+I_MONTH RPANCA1A.477
START_MONTH=FIXHD(21,FILE)*12+FIXHD(22,FILE) RPANCA1A.478
MONTHS=MONTHS-START_MONTH RPANCA1A.479
C Check for time within month RPANCA1A.480
IF (LAMIPII) THEN ! corrected code uses pp header GRS2F404.63
STEP=MONTHS/INTERVAL GRS2F404.64
I2=NLOOKUP(FIELD)+LOOKUP_STEP(FIELD)*STEP GRS2F404.65
I1=I2+LOOKUP_START(FILE)-1 GRS2F404.66
! Check against day and hour of actual lookup header not first field GRS2F404.67
IF((I_DAY*24+I_HOUR).LT. RPANCA1A.481
& (LOOKUP(3,I1)*24+LOOKUP(4,I1))) THEN GRS2F404.68
MONTHS=MONTHS-1 GRS2F404.69
END IF GRS2F404.70
ELSE ! old less accurate code uses FIXHD GRS2F404.71
IF((I_DAY*24+I_HOUR).LT. GRS2F404.72
* (FIXHD(23,FILE)*24+FIXHD(24,FILE))) THEN RPANCA1A.482
MONTHS=MONTHS-1 RPANCA1A.483
END IF RPANCA1A.484
ENDIF ! LAMIPII GRS2F404.73
RPANCA1A.485
IF(MONTHS.LT.0) THEN RPANCA1A.486
ICODE=400+FIELD RPANCA1A.487
CMESSAGE='REPLANCA: Current time precedes start time of data' RPANCA1A.488
RETURN RPANCA1A.489
END IF RPANCA1A.490
RPANCA1A.491
*IF -DEF,RECON RPANCA1A.492
RPANCA1A.493
CL Adjust YMD time back to start of updating interval RPANCA1A.494
RPANCA1A.495
I_YEAR=I_YEAR1 RPANCA1A.496
I_MONTH=I_MONTH1 RPANCA1A.497
I_DAY=I_DAY1 RPANCA1A.498
I_HOUR=I_HOUR1 RPANCA1A.499
RPANCA1A.500
*ENDIF RPANCA1A.501
RPANCA1A.502
RPANCA1A.503
STEP=MONTHS/INTERVAL RPANCA1A.504
GRS2F404.74
IF (LAMIPII) THEN ! corrected code GRS2F404.75
TIME=REAL(SEC)/3600+REAL(DAY*24) GRS2F404.76
! correct calculation of dates uses lookup table dates not fixhd date GRS2F404.77
I2=NLOOKUP(FIELD)+LOOKUP_STEP(FIELD)*STEP GRS2F404.78
I1=I2+LOOKUP_START(FILE)-1 GRS2F404.79
I_YEAR1=lookup(1,i1) GRS2F404.80
I_MONTH1=lookup(2,i1) GRS2F404.81
I_DAY1=lookup(3,i1) GRS2F404.82
I_HOUR1=lookup(4,i1) GRS2F404.83
CALL TIME2SEC
(I_YEAR1,I_MONTH1,I_DAY1,I_HOUR1, GRS2F404.84
& FIXHD(25,FILE),FIXHD(26,FILE), GRS2F404.85
& ANCIL_REF_DAYS,ANCIL_REF_SECS,DAY,SEC, GRS2F404.86
& LCAL360) GRS2F404.87
TIME1=REAL(SEC)/3600+REAL(DAY*24) GRS2F404.88
! I1+1 correct pointer to next field as only one field in ancil file GRS2F404.89
I_YEAR1=lookup(1,i1+1) GRS2F404.90
I_MONTH1=lookup(2,i1+1) GRS2F404.91
I_DAY1=lookup(3,i1+1) GRS2F404.92
I_HOUR1=lookup(4,i1+1) GRS2F404.93
CALL TIME2SEC
(I_YEAR1,I_MONTH1,I_DAY1,I_HOUR1, GRS2F404.94
& FIXHD(25,FILE),FIXHD(26,FILE), GRS2F404.95
& ANCIL_REF_DAYS,ANCIL_REF_SECS,DAY,SEC, GRS2F404.96
& LCAL360) GRS2F404.97
TIME2=REAL(SEC)/3600+REAL(DAY*24) GRS2F404.98
GRS2F404.99
ELSE ! LAMIPII test - old inaccurate code using FIXHD GRS2F404.100
C NB INTERVAL may be > 1 month RPANCA1A.505
MONTHS=STEP*INTERVAL RPANCA1A.506
C Calculate data times for time interpolation RPANCA1A.507
TIME=REAL(SEC)/3600+REAL(DAY*24) TJ080294.362
IM=MOD(FIXHD(22,FILE)+MONTHS-1,12)+1 RPANCA1A.509
IY=FIXHD(21,FILE)+(MONTHS+FIXHD(22,FILE)-1)/12 RPANCA1A.510
CALL TIME2SEC
(IY,IM,FIXHD(23,FILE),FIXHD(24,FILE), RPANCA1A.511
& FIXHD(25,FILE),FIXHD(26,FILE), TJ080294.363
& ANCIL_REF_DAYS,ANCIL_REF_SECS,DAY,SEC, GSS1F304.580
& LCAL360) GSS1F304.581
TIME1=REAL(SEC)/3600+REAL(DAY*24) TJ080294.365
IM=MOD(FIXHD(22,FILE)+MONTHS+INTERVAL-1,12)+1 RPANCA1A.514
IY=FIXHD(21,FILE)+(MONTHS+INTERVAL+FIXHD(22,FILE)-1)/12 RPANCA1A.515
CALL TIME2SEC
(IY,IM,FIXHD(23,FILE),FIXHD(24,FILE), RPANCA1A.516
& FIXHD(25,FILE),FIXHD(26,FILE), TJ080294.366
& ANCIL_REF_DAYS,ANCIL_REF_SECS,DAY,SEC, GSS1F304.582
& LCAL360) GSS1F304.583
TIME2=REAL(SEC)/3600+REAL(DAY*24) TJ080294.368
ENDIF ! end LAMIPII test GRS2F404.101
RPANCA1A.519
C Do not interpolate in time if data time exactly matches model time RPANCA1A.520
RPANCA1A.521
IF(TIME.EQ.TIME1) THEN RPANCA1A.522
LINTERPOLATE=.FALSE. RPANCA1A.523
END IF RPANCA1A.524
RPANCA1A.525
ENDIF ! End of REGULAR/not REGULAR RPANCA1A.526
RPANCA1A.527
ELSE ! PERIODIC data RPANCA1A.528
RPANCA1A.529
CL 2.2 If data is taken from ancillary periodic data. RPANCA1A.530
RPANCA1A.531
CALL TIME2SEC
(I_YEAR,I_MONTH,I_DAY,I_HOUR, RPANCA1A.532
& I_MINUTE,I_SECOND, TJ080294.369
& ANCIL_REF_DAYS,ANCIL_REF_SECS,DAY,SEC, GSS1F304.584
& LCAL360) GSS1F304.585
RPANCA1A.534
*IF -DEF,RECON RPANCA1A.535
RPANCA1A.536
CL Adjust time to middle of updating interval RPANCA1A.537
RPANCA1A.538
IF(.NOT.LGREG_MONTHLY) THEN RPANCA1A.539
SEC=SEC+STEPS(FIELD)*1800/STEPS_PER_HR RPANCA1A.540
RPANCA1A.541
C If start-up, adjust for offset of reference time from initial time, GRB1F304.100
C & update with values for half a period before first standard update. GRB1F304.101
IF (A_STEP.EQ.0) THEN GRB1F304.102
DAY1 = DAY GRB1F304.103
SEC1 = SEC GRB1F304.104
INCR_SEC=-3600*MOD(OFFSET_STEPS,STEPS(FIELD))/STEPS_PER_HR GRB1F304.105
CALL TIME_DF
(DAY1,SEC1,0,INCR_SEC,DAY,SEC) GRB1F304.106
END IF GRB1F304.107
GRB1F304.108
ELSE RPANCA1A.542
IM=MOD(I_MONTH+UPDATE_MONTHS-1,12) + 1 RPANCA1A.543
IY=I_YEAR+(I_MONTH+UPDATE_MONTHS-1)/12 RPANCA1A.544
CALL TIME2SEC
(IY,IM,I_DAY,I_HOUR RPANCA1A.545
& ,I_MINUTE,I_SECOND TJ080294.371
& ,ANCIL_REF_DAYS,ANCIL_REF_SECS,DAY1,SEC1 GSS1F304.586
& ,LCAL360) GSS1F304.587
IF (MOD(DAY+DAY1,2).EQ.0) THEN TJ080294.373
DAY=(DAY+DAY1)/2 TJ080294.374
SEC=(SEC+SEC1)/2 TJ080294.375
ELSE TJ080294.376
DAY=(DAY+DAY1-1)/2 TJ080294.377
SEC=(SEC+SEC1+86400)/2 TJ080294.378
ENDIF TJ080294.379
C If start-up, adjust for offset of reference time from initial time, GRB1F304.109
C & update with values for half a period before first standard update. GRB1F304.110
IF (A_STEP.EQ.0) THEN GRB1F304.111
DAY1 = DAY GRB1F304.112
SEC1 = SEC GRB1F304.113
INCR_SEC=-3600*MOD(OFFSET_STEPS,STEPS(FIELD))/STEPS_PER_HR GRB1F304.114
CALL TIME_DF
(DAY1,SEC1,0,INCR_SEC,DAY,SEC) GRB1F304.115
END IF GRB1F304.116
ENDIF RPANCA1A.548
RPANCA1A.549
RPANCA1A.550
CL Adjust YMD time to middle of updating interval RPANCA1A.551
RPANCA1A.552
I_YEAR1=I_YEAR RPANCA1A.553
I_MONTH1=I_MONTH RPANCA1A.554
I_DAY1=I_DAY RPANCA1A.555
I_HOUR1=I_HOUR RPANCA1A.556
CALL SEC2TIME
(DAY,SEC,ANCIL_REF_DAYS,ANCIL_REF_SECS, GRB1F304.117
& I_YEAR,I_MONTH,I_DAY, TJ080294.381
& I_HOUR,I_MINUTE,I_SECOND,I_DAY_NUMBER, GSS1F304.588
& LCAL360) GSS1F304.589
RPANCA1A.559
RPANCA1A.560
*ENDIF RPANCA1A.561
RPANCA1A.562
IF (REGULAR) THEN RPANCA1A.563
CL 2.2.1 Standard cases:1) 360 day calender, with allowed periods of RPANCA1A.564
CL 1 day, 1 month or 1 year; RPANCA1A.565
CL RPANCA1A.566
CL 2) Gregorian calender with update in hours,and period of RPANCA1A.567
CL data 1 day. RPANCA1A.568
CL RPANCA1A.569
CL For both updating interval and number of RPANCA1A.570
CL data times to be skipped in data set calculated in hours. RPANCA1A.571
RPANCA1A.572
HOURS=SEC/3600+DAY*24 TJ080294.382
INTERVAL=FIXHD(35,FILE)*8640+FIXHD(36,FILE)*720+ RPANCA1A.574
& FIXHD(37,FILE)*24+FIXHD(38,FILE) RPANCA1A.575
RPANCA1A.576
PERIOD=INTHD(3,FILE)*INTERVAL RPANCA1A.577
RPANCA1A.578
CL Do not allow non-standard periods RPANCA1A.579
IF (LCAL360) THEN GSS1F304.590
IF(PERIOD.NE.8640.AND.PERIOD.NE.720.AND.PERIOD.NE.24)THEN RPANCA1A.581
ICODE=600+FIELD RPANCA1A.585
CMESSAGE='REPLANCA: Non-standard period for periodic data' RPANCA1A.586
RETURN RPANCA1A.587
ENDIF RPANCA1A.588
ELSE GSS1F304.591
IF(PERIOD.NE.24)THEN GSS1F304.592
ICODE=600+FIELD GSS1F304.593
CMESSAGE='REPLANCA: Non-standard period for periodic data' GSS1F304.594
RETURN GSS1F304.595
ENDIF GSS1F304.596
ENDIF GSS1F304.597
IF(PERIOD.EQ.24)THEN RPANCA1A.590
C Ancillary data interval in hour(s), period is 1 day RPANCA1A.591
RPANCA1A.592
IY=I_YEAR RPANCA1A.593
IM=I_MONTH RPANCA1A.594
ID=I_DAY RPANCA1A.595
IF(I_HOUR.LT.FIXHD(24,FILE)) HOURS=HOURS+24 RPANCA1A.596
RPANCA1A.597
ELSE IF(PERIOD.EQ.720)THEN RPANCA1A.598
C Ancillary data interval in day(s) or hours , period is 1 month RPANCA1A.599
RPANCA1A.600
IY=I_YEAR RPANCA1A.601
IM=I_MONTH RPANCA1A.602
ID=FIXHD(23,FILE) RPANCA1A.603
IF((I_DAY*24+I_HOUR).LT. RPANCA1A.604
& (FIXHD(23,FILE)*24+FIXHD(24,FILE))) RPANCA1A.605
& HOURS=HOURS+720 RPANCA1A.606
RPANCA1A.607
ELSE IF(PERIOD.EQ.8640)THEN RPANCA1A.608
C Ancillary data interval in month(s)or days or hours, period is 1 year RPANCA1A.609
RPANCA1A.610
IY=I_YEAR RPANCA1A.611
IM=FIXHD(22,FILE) RPANCA1A.612
ID=FIXHD(23,FILE) RPANCA1A.613
IF((I_MONTH*720+I_DAY*24+I_HOUR).LT. RPANCA1A.614
& (FIXHD(22,FILE)*720+FIXHD(23,FILE)*24+FIXHD(24,FILE))) RPANCA1A.615
& HOURS=HOURS+8640 RPANCA1A.616
RPANCA1A.617
END IF RPANCA1A.618
RPANCA1A.619
CALL TIME2SEC
(IY,IM,ID,FIXHD(24,FILE), RPANCA1A.620
& FIXHD(25,FILE),FIXHD(26,FILE), RPANCA1A.621
& ANCIL_REF_DAYS,ANCIL_REF_SECS,DAY,SEC, GSS1F304.598
& LCAL360) GSS1F304.599
HOURS=HOURS-SEC/3600-DAY*24 TJ080294.384
RPANCA1A.624
C Do not interpolate in time if data time exactly matches model time RPANCA1A.625
RPANCA1A.626
IF(MOD(HOURS,INTERVAL).EQ.0) THEN RPANCA1A.627
LINTERPOLATE=.FALSE. RPANCA1A.628
END IF RPANCA1A.629
STEP=HOURS/INTERVAL RPANCA1A.630
TIME=REAL(HOURS) RPANCA1A.631
TIME1=STEP*INTERVAL RPANCA1A.632
TIME2=(STEP+1)*INTERVAL RPANCA1A.633
RPANCA1A.634
ELSE ! non regular case RPANCA1A.635
RPANCA1A.636
CL 2.2.2 Gregorian calender,and data interval is in months, RPANCA1A.637
CL period is 1 year RPANCA1A.638
CL Updating interval and number of data times to be skipped RPANCA1A.639
CL calculated in months. RPANCA1A.640
RPANCA1A.641
TIME=REAL(SEC)/3600+REAL(DAY*24) TJ080294.385
INTERVAL=FIXHD(36,FILE)+FIXHD(35,FILE)*12 RPANCA1A.643
PERIOD=INTHD(3,FILE)*INTERVAL RPANCA1A.644
IF(PERIOD.NE.12)THEN RPANCA1A.645
ICODE=600+FIELD RPANCA1A.646
CMESSAGE='REPLANCA: Non-standard period for periodic data' RPANCA1A.647
RETURN RPANCA1A.648
ENDIF RPANCA1A.649
! Difference between date now (month) & first date ancil file (month) GRS2F404.102
MONTHS=I_MONTH-FIXHD(22,FILE) RPANCA1A.651
GRS2F404.103
GRS2F404.104
IF (LAMIPII) THEN ! correct code to use lookup header dates GRS2F404.105
! Correctly use day and hour from lookup header not fixhd which GRS2F404.106
! contains values for first field on ancillary file only. GRS2F404.107
step=months/INTERVAL GRS2F404.108
I2=NLOOKUP(FIELD)+LOOKUP_STEP(FIELD)*step GRS2F404.109
I1=I2+LOOKUP_START(FILE)-1 GRS2F404.110
! Check for time within month - using ppheader information GRS2F404.111
IF((I_DAY*24+I_HOUR).LT.(lookup(3,i1)*24+lookup(4,i1))) THEN GRS2F404.112
MONTHS=MONTHS-1 GRS2F404.113
END IF GRS2F404.114
IF(MONTHS.LT.0) THEN GRS2F404.115
MONTHS=MONTHS+12 GRS2F404.116
END IF GRS2F404.117
! recalculate STEP GRS2F404.118
STEP=MONTHS/INTERVAL GRS2F404.119
! NB INTERVAL may be > 1 month GRS2F404.120
MONTHS=STEP*INTERVAL GRS2F404.121
IY=I_YEAR GRS2F404.122
IM=MOD(FIXHD(22,FILE)+MONTHS-1,12)+1 GRS2F404.123
IF(IM.GT.I_MONTH) IY=IY-1 GRS2F404.124
I2=NLOOKUP(FIELD)+LOOKUP_STEP(FIELD)*STEP GRS2F404.125
I1=I2+LOOKUP_START(FILE)-1 GRS2F404.126
CALL TIME2SEC
(IY,IM,lookup(3,i1),lookup(4,i1), GRS2F404.127
& FIXHD(25,FILE),FIXHD(26,FILE), GRS2F404.128
& ANCIL_REF_DAYS,ANCIL_REF_SECS,DAY,SEC,LCAL360) GRS2F404.129
TIME1=REAL(SEC)/3600+REAL(DAY*24) GRS2F404.130
! Calculate TIME2 for second ancillary data time GRS2F404.131
! set IY correctly for time interpolation calculations GRS2F404.132
IY=I_YEAR GRS2F404.133
IM=MOD(FIXHD(22,FILE)+MONTHS+INTERVAL-1,12)+1 GRS2F404.134
IF(IM.LT.I_MONTH) IY=IY+1 GRS2F404.135
I1=(IM-1)/INTERVAL GRS2F404.136
I2=NLOOKUP(FIELD)+LOOKUP_STEP(FIELD)*I1 GRS2F404.137
I1=I2+LOOKUP_START(FILE)-1 GRS2F404.138
CALL TIME2SEC
(IY,IM,lookup(3,i1),lookup(4,i1), GRS2F404.139
& FIXHD(25,FILE),FIXHD(26,FILE), GRS2F404.140
& ANCIL_REF_DAYS,ANCIL_REF_SECS,DAY,SEC,LCAL360) GRS2F404.141
TIME2=REAL(SEC)/3600+REAL(DAY*24) GRS2F404.142
GRS2F404.143
ELSE ! original code inaccurate use of FIXHD dates GRS2F404.144
C Check for time within month RPANCA1A.652
IF((I_DAY*24+I_HOUR).LT. RPANCA1A.653
& (FIXHD(23,FILE)*24+FIXHD(24,FILE))) THEN RPANCA1A.654
MONTHS=MONTHS-1 RPANCA1A.655
END IF RPANCA1A.656
IF(MONTHS.LT.0) THEN RPANCA1A.657
MONTHS=MONTHS+12 RPANCA1A.658
END IF RPANCA1A.659
RPANCA1A.660
STEP=MONTHS/INTERVAL RPANCA1A.661
C NB INTERVAL may be > 1 month RPANCA1A.662
MONTHS=STEP*INTERVAL RPANCA1A.663
C Calculate TIME1 for first ancillary data time RPANCA1A.664
C set IY correctly for time interpolation calculations RPANCA1A.665
IY=I_YEAR RPANCA1A.666
IM=MOD(FIXHD(22,FILE)+MONTHS-1,12)+1 RPANCA1A.667
IF(IM.GT.I_MONTH) IY=IY-1 RPANCA1A.668
CALL TIME2SEC
(IY,IM,FIXHD(23,FILE),FIXHD(24,FILE), RPANCA1A.669
& FIXHD(25,FILE),FIXHD(26,FILE), TJ080294.386
& ANCIL_REF_DAYS,ANCIL_REF_SECS,DAY,SEC, GSS1F304.600
& LCAL360) GSS1F304.601
TIME1=REAL(SEC)/3600+REAL(DAY*24) TJ080294.388
C Calculate TIME2 for second ancillary data time RPANCA1A.672
C set IY correctly for time interpolation calculations RPANCA1A.673
IY=I_YEAR RPANCA1A.674
IM=MOD(FIXHD(22,FILE)+MONTHS+INTERVAL-1,12)+1 RPANCA1A.675
IF(IM.LT.I_MONTH) IY=IY+1 RPANCA1A.676
CALL TIME2SEC
(IY,IM,FIXHD(23,FILE),FIXHD(24,FILE), RPANCA1A.677
& FIXHD(25,FILE),FIXHD(26,FILE), TJ080294.389
& ANCIL_REF_DAYS,ANCIL_REF_SECS,DAY,SEC, GSS1F304.602
& LCAL360) GSS1F304.603
TIME2=REAL(SEC)/3600+REAL(DAY*24) TJ080294.391
ENDIF ! end LAMIPII test GRS2F404.145
RPANCA1A.680
C Do not interpolate in time if data time exactly matches model time RPANCA1A.681
RPANCA1A.682
IF(TIME.EQ.TIME1) THEN RPANCA1A.683
LINTERPOLATE=.FALSE. RPANCA1A.684
END IF RPANCA1A.685
RPANCA1A.686
ENDIF ! regular/non-regular GRB1F304.118
RPANCA1A.688
*IF -DEF,RECON RPANCA1A.689
RPANCA1A.690
CL Adjust YMD time back to start of updating interval RPANCA1A.691
RPANCA1A.692
I_YEAR=I_YEAR1 RPANCA1A.693
I_MONTH=I_MONTH1 RPANCA1A.694
I_DAY=I_DAY1 RPANCA1A.695
I_HOUR=I_HOUR1 RPANCA1A.696
RPANCA1A.697
*ENDIF RPANCA1A.698
RPANCA1A.699
ENDIF ! non-periodic/periodic GRB1F304.119
RPANCA1A.701
*IF -DEF,RECON GRB1F304.120
IF (LINTERPOLATE) THEN GRB1F400.65
WRITE(6,*)' REPLANCA - time interpolation for field ',field GIE0F403.604
WRITE(6,*)' time,time1,time2 ',time,time1,time2 GIE0F403.605
WRITE(6,*)' hours,int,period ',hours,interval,period GIE0F403.606
END IF GRB1F400.66
*ENDIF GRB1F304.124
GRB1F304.125
END IF ! singletime/non-singletime GRB1F304.126
RPANCA1A.703
CL 2.3 Check STASH Code RPANCA1A.704
RPANCA1A.705
I2=NLOOKUP(FIELD)+LOOKUP_STEP(FIELD)*STEP RPANCA1A.706
RPANCA1A.707
I1=LOOKUP(ITEM_CODE,I2+LOOKUP_START(FILE)-1) RPANCA1A.708
RPANCA1A.709
LMISMATCH=.FALSE. RPANCA1A.710
WRITE(6,*)' Information used in checking ancillary data set:', RPANCA1A.711
* ' position of lookup table in dataset:',I2 RPANCA1A.712
WRITE(6,*)' Position of first lookup table referring to ', RPANCA1A.713
* 'data type ',NLOOKUP(FIELD) RPANCA1A.714
WRITE(6,*)' Interval between lookup tables referring to data ', RPANCA1A.715
* 'type ', LOOKUP_STEP(FIELD),' Number of steps', STEP RPANCA1A.716
WRITE(6,*)' STASH code in dataset ',I1, RPANCA1A.717
* ' STASH code requested ',STASHANCIL(FIELD) RPANCA1A.718
WRITE(6,*)'''Start'' position of lookup tables for dataset ', RPANCA1A.719
* 'in overall lookup array ' ,LOOKUP_START(FILE) RPANCA1A.720
RPANCA1A.721
IF(I1.NE.STASHANCIL(FIELD)) THEN RPANCA1A.722
WRITE(6,*)I1,STASHANCIL(FIELD),FIELD RPANCA1A.723
LMISMATCH=.TRUE. RPANCA1A.724
END IF RPANCA1A.725
RPANCA1A.726
CL Error exit if checks fail RPANCA1A.727
RPANCA1A.728
IF(LMISMATCH) THEN RPANCA1A.729
ICODE=200+FIELD RPANCA1A.730
CMESSAGE='REPLANCA: PP HEADERS ON ANCILLARY FILE DO NOT MATCH' RPANCA1A.731
RETURN RPANCA1A.732
END IF RPANCA1A.733
RPANCA1A.734
IF(LINTERPOLATE.AND..NOT.SINGLE_TIME) THEN RPANCA1A.735
CL Check time interpolation factors RPANCA1A.736
IF(TIME.LT.TIME1.OR.TIME.GT.TIME2) THEN RPANCA1A.737
WRITE(6,*)' Information used in interpolation/replacement:' RPANCA1A.738
WRITE(6,*)' Time of first data=', TIME1 RPANCA1A.739
WRITE(6,*)' Validity Time for update=', TIME RPANCA1A.740
WRITE(6,*)' Time of second data=', TIME2 RPANCA1A.741
RPANCA1A.742
ICODE=500+FIELD RPANCA1A.743
CMESSAGE='REPLANCA: TIME INTERPOLATION ERROR' RPANCA1A.744
RETURN RPANCA1A.745
END IF RPANCA1A.746
END IF RPANCA1A.747
RPANCA1A.748
CL 3 Loop over levels of ancillary data for field I RPANCA1A.749
CL Reset pointer for dataset RPANCA1A.750
RPANCA1A.751
RPANCA1A.752
CL Includes loop over X and Y components of surface currents RPANCA1A.753
RPANCA1A.754
LICE_FRACTION=FIELD.EQ.27 RPANCA1A.755
LSNOW_DEPTH=FIELD.EQ.9 RPANCA1A.756
LICE_DEPTH=FIELD.EQ.29 GRS2F404.146
RPANCA1A.757
DO 30 LEVEL=1,LEVELS(FIELD) RPANCA1A.758
RPANCA1A.759
CL Do not go through loop for ice edge or snow edge RPANCA1A.760
RPANCA1A.761
IF((LICE_FRACTION.OR.LSNOW_DEPTH).AND.LEVEL.EQ.2) THEN RPANCA1A.762
GOTO 30 RPANCA1A.763
END IF RPANCA1A.764
RPANCA1A.765
CL 3.1 Read data for single level of ancillary field. RPANCA1A.766
RPANCA1A.767
IF(.NOT.LICE_FRACTION) THEN RPANCA1A.768
! AMIPII case ice depth field not read from ancillary file GRS2F404.147
IF(.NOT.(LICE_DEPTH.and.LAMIPII)) THEN GRS2F404.148
CALL READFLDS
(NFTIN,1,I2,LOOKUP(1,LOOKUP_START(FILE)), GDG0F401.1381
& LEN1_LOOKUP,ANCIL1,P_FIELD,FIXHD(1,FILE), GDG0F401.1382
*CALL ARGPPX
GDG0F401.1383
& ICODE,CMESSAGE) GDG0F401.1384
RPANCA1A.772
ENDIF GRS2F404.149
*IF DEF,RECON UDG4F402.261
IF(LOOKUP(ITEM_CODE,LOOKUP_START(FILE)).NE.30)THEN UDG4F402.262
IF(ICODE.EQ.1501)THEN UDG4F402.263
IF(LPOLARCHK)THEN UDG4F402.264
write(6,*) 'REPLANCA: Averaging polar rows to make them ', ARR5F405.29
& 'constant' ARR5F405.30
! North polar row UDG4F402.266
RP_ROW_SUM=0.0 UDG4F402.267
DO I=1,LOOKUP(LBNPT,LOOKUP_START(FILE)) UDG4F402.268
RP_ROW_SUM=RP_ROW_SUM+ANCIL1(I) UDG4F402.269
END DO UDG4F402.270
DO I=1,LOOKUP(LBNPT,LOOKUP_START(FILE)) UDG4F402.271
ANCIL1(I)=RP_ROW_SUM/LOOKUP(LBNPT,LOOKUP_START(FILE)) UDG4F402.272
END DO UDG4F402.273
! South polar row UDG4F402.274
RP_ROW_SUM=0.0 UDG4F402.275
DO I=1,LOOKUP(LBNPT,LOOKUP_START(FILE)) UDG4F402.276
RP_ROW_SUM=RP_ROW_SUM+ANCIL1( UDG4F402.277
& (LOOKUP(LBROW,LOOKUP_START(FILE))-1)* UDG4F402.278
& LOOKUP(LBNPT,LOOKUP_START(FILE))+I) UDG4F402.279
END DO UDG4F402.280
DO I=1,LOOKUP(LBNPT,LOOKUP_START(FILE)) UDG4F402.281
ANCIL1((LOOKUP(LBROW,LOOKUP_START(FILE))-1)* UDG4F402.282
& LOOKUP(LBNPT,LOOKUP_START(FILE))+I) UDG4F402.283
& =RP_ROW_SUM/LOOKUP(LBNPT,LOOKUP_START(FILE)) UDG4F402.284
END DO UDG4F402.285
ICODE = 0 ! Re-set condition code after correction URR0F404.4
END IF UDG4F402.286
ELSE IF(ICODE.NE.0)THEN UDG4F402.287
ICODE=FIELD+100 UDG4F402.288
IOUNIT=NFTIN UDG4F402.289
CMESSAGE='REPLANCA :I/O ERROR ' UDG4F402.290
RETURN UDG4F402.291
END IF UDG4F402.292
END IF UDG4F402.293
*ELSE UDG4F402.294
IF(ICODE.NE.0)THEN UDG4F402.295
ICODE=FIELD+100 RPANCA1A.774
IOUNIT=NFTIN RPANCA1A.775
CMESSAGE='REPLANCA :I/O ERROR ' RPANCA1A.776
RETURN RPANCA1A.777
END IF RPANCA1A.778
*ENDIF UDG4F402.296
RPANCA1A.779
ELSE RPANCA1A.780
RPANCA1A.781
CL If ice-fraction,read fractional time field as well RPANCA1A.782
CL UNLESS IT IS A SINGLE TIME FIELD RPANCA1A.783
CL If snow-depth,read fractional time field as well only if time RPANCA1A.784
CL interpolation required. RPANCA1A.785
RPANCA1A.786
IF(.NOT.SINGLE_TIME.and..NOT.LAMIPII) THEN GRS2F404.150
IF(LOOKUP(ITEM_CODE,I2+LOOKUP_START(FILE)).EQ.38) THEN RPANCA1A.788
CALL READFLDS
(NFTIN,2,I2,LOOKUP(1,LOOKUP_START(FILE)), GDG0F401.1385
& LEN1_LOOKUP,ICE_EXTENT,P_FIELD,FIXHD(1,FILE), GDG0F401.1386
*CALL ARGPPX
GDG0F401.1387
& ICODE,CMESSAGE) GDG0F401.1388
*IF DEF,RECON UDG4F402.297
IF(ICODE.EQ.1501)THEN UDG4F402.298
IF(LPOLARCHK)THEN UDG4F402.299
write(6,*) 'REPLANCA: Averaging polar rows to make them ', ARR5F405.31
& 'constant' ARR5F405.32
UDG4F402.301
DO K=1,2 ! loop over ice_extent fields GRS2F404.151
! North polar row UDG4F402.303
RP_ROW_SUM=0.0 UDG4F402.304
DO I=1,LOOKUP(LBNPT,LOOKUP_START(FILE)+K-1) UDG4F402.305
RP_ROW_SUM=RP_ROW_SUM+ICE_EXTENT(I,K) UDG4F402.306
END DO UDG4F402.307
DO I=1,LOOKUP(LBNPT,LOOKUP_START(FILE)+K-1) UDG4F402.308
ICE_EXTENT(I,K)= UDG4F402.309
& RP_ROW_SUM/LOOKUP(LBNPT,LOOKUP_START(FILE)+K-1) UDG4F402.310
END DO UDG4F402.311
! South polar row UDG4F402.312
RP_ROW_SUM=0.0 UDG4F402.313
DO I=1,LOOKUP(LBNPT,LOOKUP_START(FILE)+K-1) UDG4F402.314
RP_ROW_SUM=RP_ROW_SUM+ICE_EXTENT( UDG4F402.315
& (LOOKUP(LBROW,LOOKUP_START(FILE)+K-1)-1)* UDG4F402.316
& LOOKUP(LBNPT,LOOKUP_START(FILE)+K-1)+I,K) UDG4F402.317
END DO UDG4F402.318
DO I=1,LOOKUP(LBNPT,LOOKUP_START(FILE)+K-1) UDG4F402.319
ICE_EXTENT((LOOKUP(LBROW,LOOKUP_START(FILE)+K-1)-1)* UDG4F402.320
& LOOKUP(LBNPT,LOOKUP_START(FILE)+K-1)+I,K) UDG4F402.321
& =RP_ROW_SUM/LOOKUP(LBNPT,LOOKUP_START(FILE)+K-1) UDG4F402.322
END DO UDG4F402.323
END DO UDG4F402.324
ICODE = 0 ! Re-set condition code after correction URR0F404.5
END IF UDG4F402.325
ELSE IF(ICODE.NE.0)THEN UDG4F402.326
ICODE=FIELD+100 UDG4F402.327
UDG4F402.328
IOUNIT=NFTIN UDG4F402.329
CMESSAGE='REPLANCA :I/O ERROR ' UDG4F402.330
RETURN UDG4F402.331
ENDIF UDG4F402.332
*ELSE UDG4F402.333
IF(ICODE.NE.0)THEN UDG4F402.334
ICODE=FIELD+100 RPANCA1A.793
IOUNIT=NFTIN RPANCA1A.794
CMESSAGE='REPLANCA :I/O ERROR ' RPANCA1A.795
RETURN RPANCA1A.796
END IF RPANCA1A.797
*ENDIF UDG4F402.335
RPANCA1A.798
ELSE RPANCA1A.799
ICODE=FIELD+100 RPANCA1A.800
IOUNIT=NFTIN RPANCA1A.801
CMESSAGE='REPLANCA :ICE CHANGE DATA MISSING' RPANCA1A.802
RETURN RPANCA1A.803
END IF RPANCA1A.804
ELSE ! single time or LAMIPII - ie no time change field GRS2F404.152
CALL READFLDS
(NFTIN,1,I2,LOOKUP(1,LOOKUP_START(FILE)), GDG0F401.1389
& LEN1_LOOKUP,ICE_EXTENT,P_FIELD,FIXHD(1,FILE), GDG0F401.1390
*CALL ARGPPX
GDG0F401.1391
& ICODE,CMESSAGE) GDG0F401.1392
*IF DEF,RECON UDG4F402.336
IF(ICODE.EQ.1501)THEN UDG4F402.337
IF(LPOLARCHK)THEN UDG4F402.338
write(6,*) 'REPLANCA: Averaging polar rows to make them ', ARR5F405.33
& 'constant' ARR5F405.34
! North polar row UDG4F402.340
RP_ROW_SUM=0.0 UDG4F402.341
DO I=1,LOOKUP(LBNPT,LOOKUP_START(FILE)) UDG4F402.342
RP_ROW_SUM=RP_ROW_SUM+ICE_EXTENT(I,1) UDG4F402.343
END DO UDG4F402.344
DO I=1,LOOKUP(LBNPT,LOOKUP_START(FILE)) UDG4F402.345
ICE_EXTENT(I,1)=RP_ROW_SUM/ UDG4F402.346
& LOOKUP(LBNPT,LOOKUP_START(FILE)) UDG4F402.347
END DO UDG4F402.348
! South polar row UDG4F402.349
RP_ROW_SUM=0.0 UDG4F402.350
DO I=1,LOOKUP(LBNPT,LOOKUP_START(FILE)) UDG4F402.351
RP_ROW_SUM=RP_ROW_SUM+ICE_EXTENT( UDG4F402.352
& (LOOKUP(LBROW,LOOKUP_START(FILE))-1)* UDG4F402.353
& LOOKUP(LBNPT,LOOKUP_START(FILE))+I,1) UDG4F402.354
END DO UDG4F402.355
DO I=1,LOOKUP(LBNPT,LOOKUP_START(FILE)) UDG4F402.356
ICE_EXTENT((LOOKUP(LBROW,LOOKUP_START(FILE))-1)* UDG4F402.357
& LOOKUP(LBNPT,LOOKUP_START(FILE))+I,1) UDG4F402.358
& =RP_ROW_SUM/LOOKUP(LBNPT,LOOKUP_START(FILE)) UDG4F402.359
END DO UDG4F402.360
ICODE = 0 ! Re-set condition code after correction URR0F404.6
END IF UDG4F402.361
ELSE IF(ICODE.NE.0)THEN UDG4F402.362
ICODE=FIELD+100 UDG4F402.363
IOUNIT=NFTIN UDG4F402.364
CMESSAGE='REPLANCA :I/O ERROR ' UDG4F402.365
RETURN UDG4F402.366
ENDIF UDG4F402.367
*ELSE UDG4F402.368
IF(ICODE.NE.0)THEN UDG4F402.369
ICODE=FIELD+100 RPANCA1A.810
IOUNIT=NFTIN RPANCA1A.811
CMESSAGE='REPLANCA: I/O ERROR' RPANCA1A.812
RETURN RPANCA1A.813
ENDIF RPANCA1A.814
*ENDIF UDG4F402.370
END IF RPANCA1A.815
ENDIF RPANCA1A.816
RPANCA1A.817
IF(LSNOW_DEPTH.AND.LINTERPOLATE) THEN RPANCA1A.818
IF(LOOKUP(ITEM_CODE,I2+LOOKUP_START(FILE)).EQ.27) THEN RPANCA1A.819
RPANCA1A.820
CALL READFLDS
(NFTIN,1,I2+1,LOOKUP(1,LOOKUP_START(FILE)), GDG0F401.1393
& LEN1_LOOKUP,SNOW_CHANGE,P_FIELD,FIXHD(1,FILE), GDG0F401.1394
*CALL ARGPPX
GDG0F401.1395
& ICODE,CMESSAGE) GDG0F401.1396
*IF DEF,RECON UDG4F402.371
IF(ICODE.EQ.1501)THEN UDG4F402.372
IF(LPOLARCHK)THEN UDG4F402.373
write(6,*) 'REPLANCA: Averaging polar rows to make them ', ARR5F405.35
& 'constant' ARR5F405.36
! North polar row UDG4F402.375
RP_ROW_SUM=0.0 UDG4F402.376
DO I=1,LOOKUP(LBNPT,LOOKUP_START(FILE)) UDG4F402.377
RP_ROW_SUM=RP_ROW_SUM+SNOW_CHANGE(I) UDG4F402.378
END DO UDG4F402.379
DO I=1,LOOKUP(LBNPT,LOOKUP_START(FILE)) UDG4F402.380
SNOW_CHANGE(I)=RP_ROW_SUM/ UDG4F402.381
& LOOKUP(LBNPT,LOOKUP_START(FILE)) UDG4F402.382
END DO UDG4F402.383
! South polar row UDG4F402.384
RP_ROW_SUM=0.0 UDG4F402.385
DO I=1,LOOKUP(LBNPT,LOOKUP_START(FILE)) UDG4F402.386
RP_ROW_SUM=RP_ROW_SUM+SNOW_CHANGE( UDG4F402.387
& (LOOKUP(LBROW,LOOKUP_START(FILE))-1)* UDG4F402.388
& LOOKUP(LBNPT,LOOKUP_START(FILE))+I) UDG4F402.389
END DO UDG4F402.390
DO I=1,LOOKUP(LBNPT,LOOKUP_START(FILE)) UDG4F402.391
SNOW_CHANGE((LOOKUP(LBROW,LOOKUP_START(FILE))-1)* UDG4F402.392
& LOOKUP(LBNPT,LOOKUP_START(FILE))+I) UDG4F402.393
& =RP_ROW_SUM/LOOKUP(LBNPT,LOOKUP_START(FILE)) UDG4F402.394
END DO UDG4F402.395
ICODE = 0 ! Re-set condition code after correction URR0F404.7
END IF UDG4F402.396
ELSE IF(ICODE.NE.0)THEN UDG4F402.397
ICODE=FIELD+100 UDG4F402.398
IOUNIT=NFTIN UDG4F402.399
CMESSAGE='REPLANCA :I/O ERROR ' UDG4F402.400
RETURN UDG4F402.401
ENDIF UDG4F402.402
*ELSE UDG4F402.403
IF(ICODE.NE.0)THEN UDG4F402.404
ICODE=FIELD+100 RPANCA1A.824
IOUNIT=NFTIN RPANCA1A.825
CMESSAGE='REPLANCA :I/O ERROR ' RPANCA1A.826
RETURN RPANCA1A.827
END IF RPANCA1A.828
*ENDIF UDG4F402.405
RPANCA1A.829
ELSE RPANCA1A.830
ICODE=FIELD+100 RPANCA1A.831
IOUNIT=NFTIN RPANCA1A.832
CMESSAGE='REPLANCA :SNOW CHANGE DATA MISSING' RPANCA1A.833
RETURN RPANCA1A.834
END IF RPANCA1A.835
END IF RPANCA1A.836
RPANCA1A.837
CL If sea surface temperature or other ice fields, read ice fraction RPANCA1A.838
CL and fractional time field if not already pressent and if required RPANCA1A.839
CL by time interpolation. Similar if SLAB ref SST or ice depth needed. TJ240293.23
RPANCA1A.841
IF(FIELD.EQ.29.OR.(FIELD.EQ.28.AND.LT_INT_C).OR. TJ240293.24
& FIELD.EQ.38.OR.(FIELD.EQ.37.AND.LT_INT_C)) TJ240293.25
& THEN RPANCA1A.843
RPANCA1A.844
IF(.NOT.UPDATE(27)) THEN RPANCA1A.845
I3 = NLOOKUP(27) + LOOKUP_STEP(27)*STEP + LOOKUP_START( AWI2F304.38
& FILEANCIL(27)) RPANCA1A.847
IF ( LOOKUP(ITEM_CODE,I3) .EQ. 38 ) THEN AWI2F304.39
RPANCA1A.849
CALL READFLDS
(FTNANCIL(FILEANCIL(27)),2, GDG0F401.1397
& NLOOKUP(27)+LOOKUP_STEP(27)*STEP, GDG0F401.1398
& LOOKUP(1,LOOKUP_START(FILEANCIL(27))), GDG0F401.1399
& LEN1_LOOKUP,ICE_EXTENT, GDG0F401.1400
& P_FIELD,FIXHD(1,FILEANCIL(27)), GDG0F401.1401
*CALL ARGPPX
GDG0F401.1402
& ICODE,CMESSAGE) GDG0F401.1403
*IF DEF,RECON UDG4F402.406
IF(ICODE.EQ.1501)THEN UDG4F402.407
IF(LPOLARCHK)THEN UDG4F402.408
write(6,*) 'REPLANCA: Averaging polar rows to make them ', ARR5F405.37
& 'constant' ARR5F405.38
UDG4F402.410
DO K=1,2 UDG4F402.411
! North polar row UDG4F402.412
RP_ROW_SUM=0.0 UDG4F402.413
DO I=1,LOOKUP(LBNPT,LOOKUP_START(FILEANCIL(27))+K-1) UDG4F402.414
RP_ROW_SUM=RP_ROW_SUM+ICE_EXTENT(I,K) UDG4F402.415
END DO UDG4F402.416
DO I=1,LOOKUP(LBNPT,LOOKUP_START(FILEANCIL(27))+K-1) UDG4F402.417
ICE_EXTENT(I,K)= UDG4F402.418
& RP_ROW_SUM/ UDG4F402.419
& LOOKUP(LBNPT,LOOKUP_START(FILEANCIL(27))+K-1) UDG4F402.420
END DO UDG4F402.421
! South polar row UDG4F402.422
RP_ROW_SUM=0.0 UDG4F402.423
DO I=1,LOOKUP(LBNPT,LOOKUP_START(FILEANCIL(27))+K-1) UDG4F402.424
RP_ROW_SUM=RP_ROW_SUM+ICE_EXTENT( UDG4F402.425
& (LOOKUP(LBROW,LOOKUP_START(FILEANCIL(27))+K-1)-1)* UDG4F402.426
& LOOKUP(LBNPT,LOOKUP_START(FILEANCIL(27))+K-1)+I, UDG4F402.427
& K) UDG4F402.428
END DO UDG4F402.429
DO I=1,LOOKUP(LBNPT,LOOKUP_START(FILEANCIL(27))+K-1) UDG4F402.430
ICE_EXTENT(( UDG4F402.431
& LOOKUP(LBROW,LOOKUP_START(FILEANCIL(27))+K-1)-1)* UDG4F402.432
& LOOKUP(LBNPT,LOOKUP_START(FILEANCIL(27))+K-1)+I,K) UDG4F402.433
& =RP_ROW_SUM/ UDG4F402.434
& LOOKUP(LBNPT,LOOKUP_START(FILEANCIL(27))+K-1) UDG4F402.435
END DO UDG4F402.436
END DO UDG4F402.437
ICODE = 0 ! Re-set condition code after correction URR0F404.8
END IF UDG4F402.438
ELSE IF(ICODE.NE.0)THEN UDG4F402.439
ICODE=FIELD+100 UDG4F402.440
IOUNIT=NFTIN UDG4F402.441
CMESSAGE='REPLANCA :I/O ERROR ' UDG4F402.442
RETURN UDG4F402.443
ENDIF UDG4F402.444
*ELSE UDG4F402.445
IF(ICODE.NE.0)THEN UDG4F402.446
ICODE=FIELD+100 RPANCA1A.854
IOUNIT=NFTIN RPANCA1A.855
CMESSAGE='REPLANCA :I/O ERROR ' RPANCA1A.856
RETURN RPANCA1A.857
END IF RPANCA1A.858
*ENDIF UDG4F402.447
IF ( RLOOKUP(BMDI,I3-1) .NE. RMDI ) THEN AWI2F304.40
ICODE = 700 + FIELD AWI2F304.41
CMESSAGE = 'REPLANCA: RMDI in lookup of ancillary file of ti AWI2F304.42
&mes of sea-ice chge not standard' AWI2F304.43
RETURN AWI2F304.44
ENDIF AWI2F304.45
AWI2F304.46
RPANCA1A.859
ELSE RPANCA1A.860
ICODE=FIELD+100 RPANCA1A.861
IOUNIT=NFTIN RPANCA1A.862
CMESSAGE='REPLANCA :ICE FIELD DATA MISSING' RPANCA1A.863
RETURN RPANCA1A.864
END IF RPANCA1A.865
END IF RPANCA1A.866
END IF RPANCA1A.867
RPANCA1A.868
CL 3.3 If time interpolation required, read second record RPANCA1A.869
RPANCA1A.870
IF(LINTERPOLATE) THEN RPANCA1A.871
RPANCA1A.872
I1=I2+ LOOKUP_STEP(FIELD) RPANCA1A.873
IF(I1.LE.FIXHD(152,FILE)) THEN RPANCA1A.874
RPANCA1A.875
! AMIP II and ice depth don't read in ice depth field GRS2F404.153
IF (.NOT.(LAMIPII.and.LICE_DEPTH)) THEN GRS2F404.154
GRS2F404.155
CALL READFLDS
(NFTIN,1,I1,LOOKUP(1,LOOKUP_START(FILE)), GDG0F401.1404
& LEN1_LOOKUP,ANCIL2,P_FIELD,FIXHD(1,FILE), GDG0F401.1405
*CALL ARGPPX
GDG0F401.1406
& ICODE,CMESSAGE) GDG0F401.1407
ENDIF GRS2F404.156
*IF DEF,RECON UDG4F402.448
IF(ICODE.EQ.1501)THEN UDG4F402.449
IF(LPOLARCHK)THEN UDG4F402.450
write(6,*) 'REPLANCA: Averaging polar rows to make them ', ARR5F405.39
& 'constant' ARR5F405.40
! North polar row UDG4F402.452
RP_ROW_SUM=0.0 UDG4F402.453
DO I=1,LOOKUP(LBNPT,LOOKUP_START(FILE)) UDG4F402.454
RP_ROW_SUM=RP_ROW_SUM+ANCIL2(I) UDG4F402.455
END DO UDG4F402.456
DO I=1,LOOKUP(LBNPT,LOOKUP_START(FILE)) UDG4F402.457
ANCIL2(I)=RP_ROW_SUM/LOOKUP(LBNPT,LOOKUP_START(FILE)) UDG4F402.458
END DO UDG4F402.459
! South polar row UDG4F402.460
RP_ROW_SUM=0.0 UDG4F402.461
DO I=1,LOOKUP(LBNPT,LOOKUP_START(FILE)) UDG4F402.462
RP_ROW_SUM=RP_ROW_SUM+ANCIL2( UDG4F402.463
& (LOOKUP(LBROW,LOOKUP_START(FILE))-1)* UDG4F402.464
& LOOKUP(LBNPT,LOOKUP_START(FILE))+I) UDG4F402.465
END DO UDG4F402.466
DO I=1,LOOKUP(LBNPT,LOOKUP_START(FILE)) UDG4F402.467
ANCIL2((LOOKUP(LBROW,LOOKUP_START(FILE))-1)* UDG4F402.468
& LOOKUP(LBNPT,LOOKUP_START(FILE))+I) UDG4F402.469
& =RP_ROW_SUM/LOOKUP(LBNPT,LOOKUP_START(FILE)) UDG4F402.470
END DO UDG4F402.471
ICODE = 0 ! Re-set condition code after correction URR0F404.9
END IF UDG4F402.472
ELSE IF(ICODE.NE.0)THEN UDG4F402.473
ICODE=FIELD+100 UDG4F402.474
IOUNIT=NFTIN UDG4F402.475
CMESSAGE='REPLANCA :I/O ERROR ' UDG4F402.476
RETURN UDG4F402.477
ENDIF UDG4F402.478
*ELSE UDG4F402.479
IF(ICODE.NE.0)THEN UDG4F402.480
ICODE=FIELD+300 RPANCA1A.879
IOUNIT=NFTIN RPANCA1A.880
CMESSAGE='REPLANCA :I/O ERROR ' RPANCA1A.881
RETURN RPANCA1A.882
END IF RPANCA1A.883
*ENDIF UDG4F402.481
RPANCA1A.884
ELSE !end of data on file RPANCA1A.885
RPANCA1A.886
CL If end of data has been reached go back to the start.If data is RPANCA1A.887
CL periodic. RPANCA1A.888
CL Otherwise cancel time interpolation RPANCA1A.889
RPANCA1A.890
IF(PERIODIC) THEN RPANCA1A.891
RPANCA1A.892
I1 = NLOOKUP(FIELD) + LEVEL - 1 GDR1F405.3
RPANCA1A.894
CALL READFLDS
(NFTIN,1,I1,LOOKUP(1,LOOKUP_START(FILE)), GDG0F401.1408
& LEN1_LOOKUP,ANCIL2,P_FIELD,FIXHD(1,FILE), GDG0F401.1409
*CALL ARGPPX
GDG0F401.1410
& ICODE,CMESSAGE) GDG0F401.1411
*IF DEF,RECON UDG4F402.482
IF(ICODE.EQ.1501)THEN UDG4F402.483
IF(LPOLARCHK)THEN UDG4F402.484
write(6,*) 'REPLANCA: Averaging polar rows to make them ', ARR5F405.41
& 'constant' ARR5F405.42
! North polar row UDG4F402.486
RP_ROW_SUM=0.0 UDG4F402.487
DO I=1,LOOKUP(LBNPT,LOOKUP_START(FILE)) UDG4F402.488
RP_ROW_SUM=RP_ROW_SUM+ANCIL2(I) UDG4F402.489
END DO UDG4F402.490
DO I=1,LOOKUP(LBNPT,LOOKUP_START(FILE)) UDG4F402.491
ANCIL2(I)=RP_ROW_SUM/LOOKUP(LBNPT,LOOKUP_START(FILE)) UDG4F402.492
END DO UDG4F402.493
! South polar row UDG4F402.494
RP_ROW_SUM=0.0 UDG4F402.495
DO I=1,LOOKUP(LBNPT,LOOKUP_START(FILE)) UDG4F402.496
RP_ROW_SUM=RP_ROW_SUM+ANCIL2( UDG4F402.497
& (LOOKUP(LBROW,LOOKUP_START(FILE))-1)* UDG4F402.498
& LOOKUP(LBNPT,LOOKUP_START(FILE))+I) UDG4F402.499
END DO UDG4F402.500
DO I=1,LOOKUP(LBNPT,LOOKUP_START(FILE)) UDG4F402.501
ANCIL2((LOOKUP(LBROW,LOOKUP_START(FILE))-1)* UDG4F402.502
& LOOKUP(LBNPT,LOOKUP_START(FILE))+I) UDG4F402.503
& =RP_ROW_SUM/LOOKUP(LBNPT,LOOKUP_START(FILE)) UDG4F402.504
END DO UDG4F402.505
ICODE = 0 ! Re-set condition code after correction URR0F404.10
END IF UDG4F402.506
ELSE IF(ICODE.NE.0)THEN UDG4F402.507
ICODE=FIELD+100 UDG4F402.508
IOUNIT=NFTIN UDG4F402.509
CMESSAGE='REPLANCA :I/O ERROR ' UDG4F402.510
RETURN UDG4F402.511
ENDIF UDG4F402.512
*ELSE UDG4F402.513
IF(ICODE.NE.0)THEN UDG4F402.514
ICODE=FIELD+300 RPANCA1A.898
IOUNIT=NFTIN RPANCA1A.899
CMESSAGE='REPLANCA :I/O ERROR ' RPANCA1A.900
RETURN RPANCA1A.901
END IF RPANCA1A.902
*ENDIF UDG4F402.515
ELSE RPANCA1A.903
LINTERPOLATE=.FALSE. RPANCA1A.904
END IF RPANCA1A.905
END IF! End of position on file test RPANCA1A.906
RPANCA1A.907
ICODE=0 RPANCA1A.908
END IF ! End LINTERPOLATE RPANCA1A.909
RPANCA1A.910
CL 3.4 Perform time interpolation RPANCA1A.911
RPANCA1A.912
IF(LINTERPOLATE) THEN RPANCA1A.913
RPANCA1A.914
ZERO=0.0 RPANCA1A.915
RPANCA1A.916
CL Select appropriate time interpolation for each field RPANCA1A.917
C Snowdepth: set equal to zero if no snow cover RPANCA1A.918
RPANCA1A.919
IF(LSNOW_DEPTH) THEN RPANCA1A.920
DO I=1,P_FIELD RPANCA1A.921
PRES_VALUE(I)=ZERO RPANCA1A.922
END DO RPANCA1A.923
RPANCA1A.924
C For the call to T_INT_C, need to know BMDI is OK for SNOW_CHANGE AWI2F304.47
C which was read in from position I2+1. AWI2F304.48
IF ( RLOOKUP(BMDI,LOOKUP_START(FILE)+I2) .NE. RMDI ) THEN AWI2F304.49
ICODE = 700 + FIELD AWI2F304.50
CMESSAGE = 'REPLANCA: RMDI in lookup of ancillary file of ti AWI2F304.51
&mes of snow change non-standard ' AWI2F304.52
RETURN AWI2F304.53
ENDIF AWI2F304.54
AWI2F304.55
CALL T_INT_C
(ANCIL1,TIME1,ANCIL2,TIME2,ANCIL_DATA, RPANCA1A.925
& TIME,P_FIELD,SNOW_CHANGE,ANCIL1,PRES_VALUE) RPANCA1A.926
RPANCA1A.927
C Ice fraction: ice depth set equal to zero if no ice RPANCA1A.928
RPANCA1A.929
ELSE IF(FIELD.EQ.27.OR.FIELD.EQ.29.OR.FIELD.EQ.38) THEN TJ240293.28
IF(FIELD.EQ.27) THEN RPANCA1A.931
C For the call to T_INT_C, need to know BMDI is OK for ICE_EXTENT(1,2) AWI2F304.56
C which was read in from position I1+1 AWI2F304.57
IF(.NOT.LAMIPII) THEN GRS2F404.157
IF ( RLOOKUP(BMDI,LOOKUP_START(FILE)+I1) .NE. RMDI ) THEN AWI2F304.58
ICODE = 700 + FIELD AWI2F304.59
CMESSAGE = 'REPLANCA: RMDI in lookup of ancillary file of ti AWI2F304.60
&mes of sea-ice chge non-standard' AWI2F304.61
RETURN AWI2F304.62
ENDIF AWI2F304.63
ENDIF GRS2F404.158
AWI2F304.64
IF (LAMIPII) THEN GRS2F404.159
! linear uncontrolled time interpolation GRS2F404.160
CALL T_INT
(ICE_EXTENT,TIME1,ANCIL2,TIME2,ANCIL_DATA, GRS2F404.161
& TIME,P_FIELD) GRS2F404.162
GRS2F404.163
! For AMIP II strictly ice concentrations should range between GRS2F404.164
! 0.0 and 1.0 but because of assumptions on T* made by the boundary GRS2F404.165
! layer and radiation schemes ice concentrations are restricted to GRS2F404.166
! 0.3 to 1.0. This will allow SSTs in areas of less than 30% ice to GRS2F404.167
! be used rather than TFS=-1.8C. GRS2F404.168
GRS2F404.169
DO I=1,P_FIELD RPANCA1A.932
IF (ANCIL_DATA(I).lt.0.3) ANCIL_DATA(I)=0.0 GRS2F404.170
IF (ANCIL_DATA(I).gt.1.0) ANCIL_DATA(I)=1.0 GRS2F404.171
ENDDO GRS2F404.172
GRS2F404.173
ELSE ! non AMIPII option GRS2F404.174
DO I=1,P_FIELD GRS2F404.175
PRES_VALUE(I)=0 RPANCA1A.933
END DO RPANCA1A.934
GRS2F404.176
CALL T_INT_C
(ICE_EXTENT,TIME1,ANCIL2,TIME2,ANCIL_DATA, RPANCA1A.935
& TIME,P_FIELD,ICE_EXTENT(1,2),ICE_EXTENT,PRES_VALUE) RPANCA1A.936
RPANCA1A.937
ENDIF ! end AMIPII test GRS2F404.177
RPANCA1A.938
ELSE IF (FIELD.EQ.29.OR.FIELD.EQ.38) THEN TJ240293.29
RPANCA1A.940
DO I=1,P_FIELD RPANCA1A.941
PRES_VALUE(I)=0 RPANCA1A.942
END DO RPANCA1A.943
RPANCA1A.944
CALL T_INT_C
(ANCIL1,TIME1,ANCIL2,TIME2,ANCIL_DATA, RPANCA1A.945
& TIME,P_FIELD,ICE_EXTENT(1,2),ICE_EXTENT,PRES_VALUE) RPANCA1A.946
RPANCA1A.947
RPANCA1A.948
END IF RPANCA1A.949
RPANCA1A.950
RPANCA1A.951
C Sea surface temperature, set equal to TFS if ice present RPANCA1A.952
RPANCA1A.953
ELSE IF ((FIELD.EQ.28.OR.FIELD.EQ.37).AND.LT_INT_C) THEN TJ240293.30
IF (LAMIPII) THEN GRS2F404.178
RPANCA1A.955
CALL T_INT
(ANCIL1,TIME1,ANCIL2,TIME2,ANCIL_DATA, GRS2F404.179
& TIME,P_FIELD) GRS2F404.180
! remove any T below TFS GRS2F404.181
DO I=1,P_FIELD RPANCA1A.956
IF (ANCIL_DATA(i).LT.TFS) ANCIL_DATA(I)=TFS GRS2F404.182
ENDDO GRS2F404.183
GRS2F404.184
ELSE ! non AMIPII option GRS2F404.185
GRS2F404.186
DO I=1,P_FIELD GRS2F404.187
PRES_VALUE(I)=TFS RPANCA1A.957
RPANCA1A.958
C Set no_ice_extent indicator for controlled SST interpolation RPANCA1A.959
IF(ICE_EXTENT(I,1).EQ.0) THEN RPANCA1A.960
NO_ICE_EXTENT(I)=1.0 RPANCA1A.961
ELSE RPANCA1A.962
NO_ICE_EXTENT(I)=0.0 RPANCA1A.963
ENDIF RPANCA1A.964
END DO RPANCA1A.965
RPANCA1A.966
CALL T_INT_C
(ANCIL1,TIME1,ANCIL2,TIME2,ANCIL_DATA, RPANCA1A.967
& TIME,P_FIELD,ICE_EXTENT(1,2),NO_ICE_EXTENT,PRES_VALUE) RPANCA1A.968
RPANCA1A.969
ENDIF ! end AMIPII test GRS2F404.188
C Otherwise linear interpolation in time, unless missing data indicator RPANCA1A.970
C present at either time. RPANCA1A.971
RPANCA1A.972
ELSE RPANCA1A.973
RPANCA1A.974
C Time interpolation checks the data against the standard missing data AWI2F304.65
C indicator - check that the field is labelled as using the same one. AWI2F304.66
C (It is to have the right I1 here that I3 is used above.) AWI2F304.67
IF ( RLOOKUP(BMDI,LOOKUP_START(FILE)+I1-1) .NE. RMDI .OR. AWI2F304.68
& RLOOKUP(BMDI,LOOKUP_START(FILE)+I2-1) .NE. RMDI ) THEN AWI2F304.69
WRITE (6, *) 'LOOKUPS:', AWI2F304.70
& RLOOKUP(BMDI,LOOKUP_START(FILE)+I1-1), AWI2F304.71
& RLOOKUP(BMDI,LOOKUP_START(FILE)+I2-1) AWI2F304.72
ICODE = 700 + FIELD AWI2F304.73
CMESSAGE = 'REPLANCA: Missing data indicator in lookup of an AWI2F304.74
&cillary file is non-standard ' AWI2F304.75
RETURN AWI2F304.76
ENDIF AWI2F304.77
RPANCA1A.975
LEN=P_FIELD GDR4F400.4
CL Ozone, test for zonal mean or full field GDR4F400.5
IF(FIELD.EQ.7) THEN GDR4F400.6
IF(LOOKUP(LBNPT,LOOKUP_START(FILE)+I2-1).EQ.1) THEN GDR4F400.7
LEN=P_ROWS GDR4F400.8
END IF GDR4F400.9
END IF GDR4F400.10
GDR4F400.11
CALL T_INT
(ANCIL1,TIME1,ANCIL2,TIME2,ANCIL_DATA, RPANCA1A.976
& TIME,LEN) GDR4F400.12
RPANCA1A.978
END IF ! End Lsnow_depth RPANCA1A.979
RPANCA1A.980
C If no interpolation, copy data into final array RPANCA1A.981
RPANCA1A.982
ELSE ! no interpolation RPANCA1A.983
IF(LICE_FRACTION) THEN RPANCA1A.984
IF (LAMIPII) THEN GRS2F404.189
DO I=1,P_FIELD RPANCA1A.985
GRS2F404.190
ANCIL_DATA(I)=ICE_EXTENT(I,1) RPANCA1A.986
GRS2F404.191
! For AMIP II strictly ice concentrations should range between GRS2F404.192
! 0.0 and 1.0 but because of assumptions on T* made by the boundary GRS2F404.193
! layer and radiation schemes ice concentrations are restricted to GRS2F404.194
! 0.3 to 1.0. This will allow SSTs in areas of less than 30% ice to GRS2F404.195
! be used rather than TFS=-1.8C. GRS2F404.196
GRS2F404.197
IF (ANCIL_DATA(I).lt.0.3) ANCIL_DATA(I)=0.0 GRS2F404.198
IF (ANCIL_DATA(I).gt.1.0) ANCIL_DATA(I)=1.0 GRS2F404.199
GRS2F404.200
ENDDO RPANCA1A.987
ELSE ! non AMIP II option GRS2F404.201
DO I=1,P_FIELD GRS2F404.202
ANCIL_DATA(I)=ICE_EXTENT(I,1) GRS2F404.203
ENDDO GRS2F404.204
ENDIF ! end of AMIPII test GRS2F404.205
ELSE IF (LAMIPII.AND.FIELD.EQ.28) THEN GRS2F404.206
DO I=1,P_FIELD GRS2F404.207
ANCIL_DATA(I)=ANCIL1(I) GRS2F404.208
IF (ANCIL_DATA(I).lt.TFS) ANCIL_DATA(I)=TFS GRS2F404.209
ENDDO GRS2F404.210
ELSE RPANCA1A.988
DO I=1,P_FIELD RPANCA1A.989
ANCIL_DATA(I)=ANCIL1(I) RPANCA1A.990
END DO RPANCA1A.991
ENDIF RPANCA1A.992
END IF !End interpolate/no interpolate RPANCA1A.993
RPANCA1A.994
CL 3.5 Updating action for each field at each level RPANCA1A.995
CL Fields replaced except that Sea Surface Temperature may be RPANCA1A.996
CL incremented. Take apropriate action for each field. RPANCA1A.997
RPANCA1A.998
IF(FIELD.LE.2.OR.FIELD.EQ.7.OR.FIELD.EQ.39.OR.FIELD.EQ.40. RB221193.92
& OR.FIELD.EQ.41.OR.FIELD.EQ.42.OR.FIELD.EQ.43. GRB0F304.160
& OR.FIELD.EQ.44.OR.FIELD.EQ.45. ! multi-level murk GRB0F304.161
& OR.(FIELD.GE.68.AND.FIELD.LE.70). !NH3,soot aerosol emissions ARR5F405.28
& OR.(FIELD.GE.72.AND.FIELD.LE.77). !Sulphur cycle UDG0F404.21
& OR.FIELD.EQ.78. !CO2 EMISSIONS ACN1F405.164
& OR.FIELD.EQ.82. !HADCM2 sulphate aerosol GDG2F405.104
& OR.(FIELD.GE.90.AND.FIELD.LE.109) !multi-level user ancillaries GDG2F405.105
& )THEN GDG2F405.106
RPANCA1A.1000
CL 3.5.0 Updates at all points RPANCA1A.1001
RPANCA1A.1002
LEN=P_FIELD RPANCA1A.1003
CL Ozone, test for zonal mean or full field RPANCA1A.1004
IF(FIELD.EQ.7) THEN RPANCA1A.1005
IF(LOOKUP(LBNPT,LOOKUP_START(FILE)+I2-1).EQ.1) THEN RPANCA1A.1006
LEN=P_ROWS RPANCA1A.1007
END IF RPANCA1A.1008
END IF RPANCA1A.1009
RPANCA1A.1010
DO I=1,LEN RPANCA1A.1011
D1(D1_ANCILADD(FIELD)+I-1+(LEVEL-1)*LEN)=ANCIL_DATA(I) RPANCA1A.1012
END DO RPANCA1A.1013
RPANCA1A.1014
CL 3.5.1 Updates over all land points RPANCA1A.1015
RPANCA1A.1016
ELSEIF((FIELD.GT.2.AND.FIELD.LT.7). GRB0F304.163
& OR.(FIELD.GT.7.AND.FIELD.LT.27). GRB0F304.164
& OR.(FIELD.EQ.32).OR.(FIELD.GE.34.AND.FIELD.LE.36).OR. GRB0F304.165
& (FIELD.GE.48.AND.FIELD.LE.67). ! single level user ancillaries GRB0F304.166
& OR.(FIELD.GE.46.AND.FIELD.LE.47). !Orographic roughness UDG0F404.23
& OR.(FIELD.GE.79.AND.FIELD.LE.81). !MOSES-I UDG0F404.24
& OR.(FIELD.GE.83.AND.FIELD.LE.89)) THEN !MOSES-II UDG0F404.25
RPANCA1A.1020
*IF DEF,RECON RPANCA1A.1021
C Set default value of Z0 over sea RPANCA1A.1022
RPANCA1A.1023
DO I=1,P_FIELD RPANCA1A.1024
IF(.NOT.LAND(I).AND.FIELD.EQ.26) THEN RPANCA1A.1025
D1(D1_ANCILADD(FIELD)+I-1+(LEVEL-1)*P_FIELD)=10.E-4 RPANCA1A.1026
END IF RPANCA1A.1027
END DO RPANCA1A.1028
RPANCA1A.1029
DO I=1,P_FIELD RPANCA1A.1030
IF (LAND(I)) THEN RPANCA1A.1031
D1(D1_ANCILADD(FIELD)+I-1+(LEVEL-1)*P_FIELD)=ANCIL_DATA(I) RPANCA1A.1032
END IF RPANCA1A.1033
END DO RPANCA1A.1034
RPANCA1A.1035
CL Reset TSTAR to TM if snow cover present RPANCA1A.1036
IF(LSNOW_DEPTH) THEN RPANCA1A.1037
DO I=1,P_FIELD RPANCA1A.1038
IF (LAND(I).AND.ANCIL_DATA(I).GT.0.0) THEN RPANCA1A.1039
IF(TSTAR(I).GT.TM) TSTAR(I)=TM RPANCA1A.1040
END IF RPANCA1A.1041
END DO RPANCA1A.1042
END IF RPANCA1A.1043
*ELSE RPANCA1A.1044
RPANCA1A.1045
CL If not reconfiguration, set snowdepth values at all land points RPANCA1A.1046
CL Reset TSTAR to TM if snow cover present RPANCA1A.1047
RPANCA1A.1048
IF(LSNOW_DEPTH) THEN RPANCA1A.1049
DO I=1,P_FIELD RPANCA1A.1050
IF(LAND(I)) THEN RPANCA1A.1051
D1(D1_ANCILADD(FIELD)+I-1)=ANCIL_DATA(I) RPANCA1A.1052
IF(TSTAR(I).GT.TM.AND.ANCIL_DATA(I).GT.0.0) THEN RPANCA1A.1053
TSTAR(I)=TM RPANCA1A.1054
END IF RPANCA1A.1055
END IF RPANCA1A.1056
END DO RPANCA1A.1057
RPANCA1A.1058
CL Set all other fields , which are stored at land points only RPANCA1A.1059
RPANCA1A.1060
ELSE RPANCA1A.1061
CALL TO_LAND_POINTS
(ANCIL_DATA,D1(D1_ANCILADD(FIELD)+ RPANCA1A.1062
& (LEVEL-1)*LAND_FIELD),LAND,P_FIELD,I) RPANCA1A.1063
END IF RPANCA1A.1064
RPANCA1A.1065
*ENDIF RPANCA1A.1066
RPANCA1A.1067
RPANCA1A.1068
CL 3.5.2 Ice fraction RPANCA1A.1069
RPANCA1A.1070
ELSE IF(FIELD.EQ.27) THEN RPANCA1A.1071
DO I=1,P_FIELD RPANCA1A.1072
ICE_FRACTION(I)=0. RPANCA1A.1073
IF (.NOT.LAND(I)) THEN RPANCA1A.1074
ICE_FRACTION(I)=ANCIL_DATA(I) RPANCA1A.1075
END IF RPANCA1A.1076
END DO RPANCA1A.1077
RPANCA1A.1078
CL Reduce TSTAR to TFS where ice fraction greater than zero RPANCA1A.1079
! Required at present because radiation and boundary layer codes GRS2F404.211
! assume T* is TFS and ignore any value set in TSTAR. GRS2F404.212
RPANCA1A.1080
DO I=1,P_FIELD RPANCA1A.1081
IF(ICE_FRACTION(I).GT.0.0) THEN RPANCA1A.1082
TSTAR(I)=AMIN1(TSTAR(I),TFS) RPANCA1A.1083
ENDIF RPANCA1A.1084
END DO RPANCA1A.1085
RPANCA1A.1086
CL 3.5.3 Sea surface temperatures for atmosphere, allow fields to be RPANCA1A.1087
CL incremented rather than replaced RPANCA1A.1088
RPANCA1A.1089
ELSE IF (FIELD.EQ.28) THEN RPANCA1A.1090
RPANCA1A.1091
*IF DEF,RECON RPANCA1A.1092
IF(L_SSTANOM) THEN RPANCA1A.1093
DO I=1,P_FIELD RPANCA1A.1094
TSTAR_ANOM(I)=0.0 RPANCA1A.1095
END DO RPANCA1A.1096
END IF RPANCA1A.1097
*ENDIF RPANCA1A.1098
RPANCA1A.1099
DO I=1,P_FIELD RPANCA1A.1100
IF (.NOT.LAND(I).AND.ICE_FRACTION(I).EQ.0.0) THEN RPANCA1A.1101
IF(L_SSTANOM) THEN RPANCA1A.1102
*IF -DEF,RECON RPANCA1A.1103
TSTAR(I)=ANCIL_DATA(I)+TSTAR_ANOM(I) RPANCA1A.1104
*ELSE RPANCA1A.1105
TSTAR_ANOM(I)=TSTAR(I)-ANCIL_DATA(I) RPANCA1A.1106
*ENDIF RPANCA1A.1107
ELSE RPANCA1A.1108
TSTAR(I)=ANCIL_DATA(I) RPANCA1A.1109
END IF RPANCA1A.1110
END IF RPANCA1A.1111
END DO RPANCA1A.1112
RPANCA1A.1113
CL 3.5.3.1 Reference SSTs for SLAB model TJ240293.32
TJ240293.33
ELSE IF (FIELD.EQ.37) THEN TJ240293.34
TJ240293.35
DO I=1,P_FIELD TJ240293.36
IF (.NOT.LAND(I)) THEN GJT1F304.121
D1(D1_ANCILADD(FIELD)+I-1)=ANCIL_DATA(I) TJ240293.38
ELSE TJ240293.39
D1(D1_ANCILADD(FIELD)+I-1)=TSTAR(I) TJ240293.40
ENDIF TJ240293.41
END DO TJ240293.42
TJ240293.43
CL 3.5.4 Sea ice thickness/Reference seaice thickness for SLAB TJ240293.44
CL Update over all sea points (all sea ice points are the only RPANCA1A.1115
CL ones strictly required, but this cannot be determined easily) RPANCA1A.1116
RPANCA1A.1117
ELSE IF (FIELD.EQ.29.OR.FIELD.EQ.38) THEN TJ240293.45
RPANCA1A.1119
DO I=1,P_FIELD RPANCA1A.1120
IF(.NOT.LAND(I)) THEN RPANCA1A.1121
D1(D1_ANCILADD(FIELD)+I-1)=ANCIL_DATA(I) RPANCA1A.1122
END IF RPANCA1A.1123
END DO RPANCA1A.1124
RPANCA1A.1125
CL 3.5.5 Surface currents RPANCA1A.1126
RPANCA1A.1127
ELSE IF (FIELD.EQ.30.OR.FIELD.EQ.31) THEN RPANCA1A.1128
DO I=1,U_FIELD RPANCA1A.1129
IF(.NOT.LAND(I)) THEN RPANCA1A.1130
D1(D1_ANCILADD(FIELD)+I-1)=ANCIL_DATA(I) RPANCA1A.1131
ELSE GDR5F400.62
D1(D1_ANCILADD(FIELD)+I-1) = 0.0 GDR5F400.63
END IF RPANCA1A.1132
END DO RPANCA1A.1133
RPANCA1A.1134
CL 3.5.6 Heat convergence (slab model) RPANCA1A.1135
CL Update over all non-land points RPANCA1A.1136
RPANCA1A.1137
ELSE IF (FIELD.EQ.33) THEN RPANCA1A.1138
RPANCA1A.1139
DO I=1,P_FIELD RPANCA1A.1140
IF(.NOT.LAND(I)) THEN RPANCA1A.1141
D1(D1_ANCILADD(FIELD)+I-1)=ANCIL_DATA(I) RPANCA1A.1142
ELSE GDR5F400.64
D1(D1_ANCILADD(FIELD)+I-1) = 0.0 GDR5F400.65
END IF RPANCA1A.1143
END DO RPANCA1A.1144
RPANCA1A.1145
ELSE GRB0F304.168
GRB0F304.169
WRITE(6,*)' REPLANCA: ERROR - FIELD ',FIELD, GIE0F403.607
& ' omitted from update block' GRB0F304.171
RPANCA1A.1146
END IF !End tests on FIELD numbers RPANCA1A.1147
RPANCA1A.1148
CL End loop over levels RPANCA1A.1149
RPANCA1A.1150
I2=I2+1 RPANCA1A.1151
RPANCA1A.1152
30 CONTINUE RPANCA1A.1153
RPANCA1A.1154
CL End loop over ancillary fields (atmosphere) RPANCA1A.1155
ENDIF ! LAMIPII and ice depth test GRS2F404.213
RPANCA1A.1156
END IF ! End UPDATE(field) test level 1 IF RPANCA1A.1157
RPANCA1A.1158
RPANCA1A.1159
END DO RPANCA1A.1160
RPANCA1A.1161
900 RETURN RPANCA1A.1162
END RPANCA1A.1163
RPANCA1A.1164
*ENDIF RPANCA1A.1165