*IF DEF,C82_1A,AND,DEF,OCEAN GHM2F405.24
C ******************************COPYRIGHT****************************** GTS2F400.8389
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.8390
C GTS2F400.8391
C Use, duplication or disclosure of this code is subject to the GTS2F400.8392
C restrictions as set forth in the contract. GTS2F400.8393
C GTS2F400.8394
C Meteorological Office GTS2F400.8395
C London Road GTS2F400.8396
C BRACKNELL GTS2F400.8397
C Berkshire UK GTS2F400.8398
C RG12 2SZ GTS2F400.8399
C GTS2F400.8400
C If no contract has been raised with this copy of the code, the use, GTS2F400.8401
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.8402
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.8403
C Modelling at the above address. GTS2F400.8404
C ******************************COPYRIGHT****************************** GTS2F400.8405
C GTS2F400.8406
CLL SUBROUTINE REPLANCO RPANCO1A.3
CLL RPANCO1A.4
CLL Purpose: Updates ancillary fields as requested in FIELDCODE array. RPANCO1A.5
CLL Tests whether update is required for each field, allowing for RPANCO1A.6
CLL dependencies between fields. Uses LOOKUP array to find data for RPANCO1A.7
CLL appropriate time, reads a record and checks for current data RPANCO1A.8
CLL type. Reads second record if time interpolation required. Updates RPANCO1A.9
CLL the field. Under DEF RECON, the interface to the routine is RPANCO1A.10
CLL modified for use in the reconfiguration rather than the model. RPANCO1A.11
CLL Under DEF CAL360 the 360 day rather than the Gregorian calender RPANCO1A.12
CLL is used. RPANCO1A.13
CLL RPANCO1A.14
CLL In 1991 Extensive revision bringing code into line with RPANCO1A.15
CLL vn5.0 of REPLANCA RPANCO1A.16
CLL RPANCO1A.17
CLL CW SI <- programmer of some or all of previous code or changes RPANCO1A.18
CLL RPANCO1A.19
CLL Model Modification history from model version 3.0: RPANCO1A.20
CLL version Date RPANCO1A.21
CLL 3.2 13/07/93 Changed CHARACTER*(*) to CHARACTER*(80) for TS150793.168
CLL portability. Author Tracey Smith. TS150793.169
CLL 3.3 08/02/94 Modify calls to TIME2SEC/SEC2TIME to output/input TJ080294.392
CLL elapsed times in days & secs, for portability. TCJ TJ080294.393
CLL 3.3 08/12/93 Extra argument for READFLDS. D. Robinson DR081293.119
CLL 3.4 20/07/94 Improve time interpolation by using reference time GRB1F304.127
CLL for ancillary updating. R.T.H.Barnes. GRB1F304.128
CLL 3.4 06/10/94 Add user ancillaries. RTHBarnes GRB0F304.172
CLL 3.4 04/08/94 Extended to allow multi-level ancillary fields. MB GMB1F304.117
CLL 3.4 16/06/94 DEF CAL360 replaced by LOGICAL LCAL360 GSS1F304.604
CLL LCAL360 passed to TIME2SEC, SEC2TIME GSS1F304.605
CLL S.J.Swarbrick GSS1F304.606
CLL 4.0 06/09/95 Only print time interpolation diagnostics when it GRB1F400.67
CLL is really done. RTHBarnes. GRB1F400.68
! 4.1 18/06/96 Changes to cope with changes in STASH addressing GDG0F401.1412
! Author D.M. Goddard. GDG0F401.1413
!LL 4.4 05/09/97 Initialise ANCIL arrays. S.D.Mullerworth GSM1F404.1
CLL RPANCO1A.23
CLL PROGRAMMING STANDARD: UMDP NO 3 VERSION NO 2, DATED 07/09/90 RPANCO1A.24
CLL RPANCO1A.25
CLL SYSTEM COMPONENTS COVERED: C71 RPANCO1A.26
CLL RPANCO1A.27
CLL SYSTEM TASK C7 RPANCO1A.28
CLL RPANCO1A.29
CLL RPANCO1A.30
CLL External documentation: UMDP C7 RPANCO1A.31
CLL RPANCO1A.32
CLLEND RPANCO1A.33
RPANCO1A.34
SUBROUTINE REPLANCO 1,21RPANCO1A.35
RPANCO1A.36
C*L Arguments: RPANCO1A.37
&(I_YEAR,I_MONTH,I_DAY,I_HOUR,I_MINUTE,I_SECOND,I_DAY_NUMBER, RPANCO1A.38
& ANCIL_REFTIME,OFFSET_STEPS,IMT,JMT,D1, GRB1F304.129
RPANCO1A.40
*IF -DEF,RECON RPANCO1A.41
RPANCO1A.42
& O_STEP,O_STEPS_P_P,O_SECS_P_P, RPANCO1A.43
RPANCO1A.44
*ENDIF RPANCO1A.45
RPANCO1A.46
& LEN1_LOOKUP, RPANCO1A.47
& LEN_FIXHD, RPANCO1A.48
& LEN_INTHD, RPANCO1A.49
& LEN_REALHD, RPANCO1A.50
& LEN_D1, RPANCO1A.51
& FIXHD, RPANCO1A.52
& INTHD, RPANCO1A.53
& REALHD, RPANCO1A.54
& LOOKUP, RPANCO1A.55
& RLOOKUP, RPANCO1A.56
& FTNANCIL, RPANCO1A.57
& LOOKUP_START, RPANCO1A.58
& NDATASETS, RPANCO1A.59
& NLOOKUPS, RPANCO1A.60
RPANCO1A.61
*CALL ARGPPX
GDG0F401.1414
*IF DEF,RECON RPANCO1A.62
RPANCO1A.63
& IOUNIT, RPANCO1A.64
RPANCO1A.65
*ENDIF RPANCO1A.66
RPANCO1A.67
& ICODE,CMESSAGE,LCAL360) GSS1F304.607
RPANCO1A.69
RPANCO1A.70
IMPLICIT NONE RPANCO1A.71
RPANCO1A.72
LOGICAL LCAL360 GSS1F304.608
C Include COMDECKS RPANCO1A.73
*CALL CSUBMODL
GDG0F401.1415
*CALL CPPXREF
GDG0F401.1416
*CALL PPXLOOK
GDG0F401.1417
*CALL CANCILO
RPANCO1A.74
*CALL CLOOKADD
RPANCO1A.75
*CALL CPHYSCON
RPANCO1A.76
*CALL CNTLOCN
ORH2F401.68
RPANCO1A.77
INTEGER RPANCO1A.78
& I_YEAR, ! Curent Model Time RPANCO1A.79
& I_MONTH, ! " " " RPANCO1A.80
& I_DAY, ! " " " RPANCO1A.81
& I_HOUR, ! " " " RPANCO1A.82
& I_MINUTE, ! " " " RPANCO1A.83
& I_SECOND, ! " " " RPANCO1A.84
& I_DAY_NUMBER, ! RPANCO1A.85
& ANCIL_REFTIME(6), ! Reference time for ancillary updating GRB1F304.130
& OFFSET_STEPS, ! Offset in timesteps of ref. from basis GRB1F304.131
*IF -DEF,RECON RPANCO1A.87
& O_STEP, ! RPANCO1A.89
& O_STEPS_P_P, ! RPANCO1A.90
& O_SECS_P_P, ! RPANCO1A.91
*ENDIF RPANCO1A.93
CCC & BASIS_TIME_DAYS, ! Model basis time in whole days GRB1F304.132
CCC & BASIS_TIME_SECS, ! Model basis time in extra seconds GRB1F304.133
& NDATASETS, ! Number of ancillary datasets RPANCO1A.96
& NLOOKUPS, ! Number of lookup tables RPANCO1A.97
& LEN_D1 ! Size of primary data array RPANCO1A.98
& ,IMT ! Zonal dimension of arrays RPANCO1A.99
& ,JMT ! Meridional dimension of arrays RPANCO1A.100
RPANCO1A.101
INTEGER RPANCO1A.102
& LEN1_LOOKUP, ! First dimension of lookup table RPANCO1A.103
& LEN_FIXHD, ! Length of headers in data sets RPANCO1A.104
& LEN_INTHD, RPANCO1A.105
& LEN_REALHD, RPANCO1A.106
& FIXHD(LEN_FIXHD,NDATASETS), ! Data set headers RPANCO1A.107
& INTHD(LEN_INTHD,NDATASETS), ! RPANCO1A.108
& FTNANCIL(NDATASETS), ! FTN numbers of data sets RPANCO1A.109
& LOOKUP_START(NDATASETS), ! Start of lookup tables RPANCO1A.110
C ! referring to data set RPANCO1A.111
& LOOKUP(LEN1_LOOKUP,NLOOKUPS) ! Data set lookup tables RPANCO1A.112
RPANCO1A.113
REAL RPANCO1A.114
& D1(LEN_D1), ! Primary data array RPANCO1A.115
& REALHD(LEN_REALHD,NDATASETS), RPANCO1A.116
& RLOOKUP(LEN1_LOOKUP,NLOOKUPS) RPANCO1A.117
RPANCO1A.118
INTEGER RPANCO1A.119
& I_AO, ! Atmosphere_Ocean indicator = 1 Atmosphere RPANCO1A.120
C = 2 Ocean RPANCO1A.121
& ICODE, ! Return code RPANCO1A.122
& IOUNIT ! OUT I/O unit passed out in recon mode RPANCO1A.123
RPANCO1A.124
CHARACTER*(80) TS150793.170
& CMESSAGE ! Error message RPANCO1A.126
RPANCO1A.127
RPANCO1A.128
C*L Subroutines called; RPANCO1A.129
EXTERNAL RPANCO1A.130
& TIME2SEC, RPANCO1A.131
& READFLDS, RPANCO1A.132
*IF -DEF,RECON RPANCO1A.133
& SEC2TIME,TIME_DF, GRB1F304.134
*ENDIF RPANCO1A.135
& T_INT RPANCO1A.136
RPANCO1A.137
C*L Local integer arrays RPANCO1A.138
REAL RPANCO1A.139
& ANCIL1(IMT*JMT), ! Buffers to hold values of ancillary RPANCO1A.140
C ! data for time interpolation. RPANCO1A.141
& ANCIL2(IMT*JMT), ! RPANCO1A.142
& ANCIL_DATA(IMT*JMT) ! Field of ancillary data held prior RPANCO1A.143
C ! to selective updating. RPANCO1A.144
RPANCO1A.145
C Local variables RPANCO1A.146
INTEGER RPANCO1A.147
& I, ! RPANCO1A.148
& JADDR, RPANCO1A.149
& J, ! RPANCO1A.150
& I1, ! used for checking stash item code in sec 2.3 GMB1F304.118
& I2, ! ptr to 1st field; calculated in sec 2.3 GMB1F304.119
& I1LEV, ! ptr to 2nd field for this level; used in sec 3 GMB1F304.120
& I2LEV, ! ptr to 1st field for this level; used in sec 3 GMB1F304.121
& ID, ! RPANCO1A.153
& IM, ! RPANCO1A.154
& IY, ! RPANCO1A.155
& FIELD, ! Current field number. RPANCO1A.156
& FILE ! RPANCO1A.157
INTEGER RPANCO1A.158
& INTERVAL, ! Interval between data times. RPANCO1A.159
& STEP, ! Number of data times skipped RPANCO1A.160
& MONTHS, ! Used in calculations of position of RPANCO1A.161
C ! data required RPANCO1A.162
& HOURS, RPANCO1A.163
& DAYS,SECONDS, ! Times used in intermediate calculation TJ080294.397
& PERIOD, RPANCO1A.165
& START_MONTH, ! RPANCO1A.166
& NFTIN, ! Current FTN number for ancillary field RPANCO1A.167
& ANCIL_REF_DAYS, ! Ancil.reference time in whole days GRB1F304.135
& ANCIL_REF_SECS, ! Ancil.reference time in extra seconds GRB1F304.136
& DAY,SEC, ! Times relative to basis time TJ080294.398
& DAY1,SEC1, ! Times relative to basis time TJ080294.399
& INCR_SEC, ! Increment in sec GRB1F304.137
& LEN_IO RPANCO1A.170
& ,LEVEL ! loop index for level number GMB1F304.122
& ,LEN_FLD ! length of (single level) field GMB1F304.123
& ,LEN_FLD_ACC ! accumulated length of fields on GMB1F304.124
C previous levels GMB1F304.125
& ,POS_STRT ! start position in D1 array GMB1F304.126
RPANCO1A.172
*IF -DEF,RECON RPANCO1A.173
INTEGER RPANCO1A.174
& I_YEAR1, ! Copy of Curent Model Time year RPANCO1A.175
& I_MONTH1, ! " " " month RPANCO1A.176
& I_DAY1, ! " " " day RPANCO1A.177
& I_HOUR1, ! " " " hour RPANCO1A.178
& I_MINUTE1, ! " " " minute RPANCO1A.179
& I_SECOND1 ! " " " second RPANCO1A.180
RPANCO1A.181
INTEGER RPANCO1A.182
& UPDATE_MONTHS ! update frequency (months) if Gregorian RPANCO1A.183
LOGICAL RPANCO1A.184
& LGREG_MONTHLY ! True for Gregorian monthly updating RPANCO1A.185
INTEGER RPANCO1A.187
& I_YEAR_BASIS, ! Basis Model Time RPANCO1A.188
& I_MONTH_BASIS, ! " " " RPANCO1A.189
& I_DAY_BASIS, ! " " " RPANCO1A.190
& I_HOUR_BASIS, ! " " " RPANCO1A.191
& I_MINUTE_BASIS, ! " " " RPANCO1A.192
& I_SECOND_BASIS, ! " " " RPANCO1A.193
& I_DAY_NUMBER_BASIS RPANCO1A.194
INTEGER GRB1F304.138
& I_YEAR_REF, ! Reference Time GRB1F304.139
& I_MONTH_REF, ! " " GRB1F304.140
& I_DAY_REF, ! " " GRB1F304.141
& I_HOUR_REF, ! " " GRB1F304.142
& I_MINUTE_REF, ! " " GRB1F304.143
& I_SECOND_REF ! " " GRB1F304.144
*ENDIF RPANCO1A.197
RPANCO1A.198
RPANCO1A.199
LOGICAL RPANCO1A.200
& LINTERPOLATE, ! Indicates whether time RPANCO1A.201
C ! interpolation needed. RPANCO1A.202
& LMISMATCH, ! Used in header chacks RPANCO1A.203
& LICE_DEPTH, ! Number of data times skipped RPANCO1A.204
& SINGLE_TIME, ! Indicates that only one time is RPANCO1A.205
C ! available in data set RPANCO1A.206
& PERIODIC, ! Data set is periodic RPANCO1A.207
& REGULAR ! Interval between data times in RPANCO1A.208
C ! dataset is regular in model timesteps. RPANCO1A.209
RPANCO1A.210
REAL RPANCO1A.211
& A_IO ! Used in check for I/O errors RPANCO1A.212
&, TIME ! Target time for time interpolation GRB1F304.145
&, TIME1 ! Times if data used in time interpn. GRB1F304.146
&, TIME2 ! " GRB1F304.147
RPANCO1A.216
RPANCO1A.217
CL 1. Initialisation for ocean RPANCO1A.218
RPANCO1A.219
C Ocean fields RPANCO1A.220
C FIELD= 1 Land Sea Mask RPANCO1A.221
C 2 Ocean Depth RPANCO1A.222
C 3 Zonal wind stress RPANCO1A.223
C 4 Meridional wind stress RPANCO1A.224
C 5 Wind mixing energy RPANCO1A.225
C 6 Surface pressure RPANCO1A.226
C 7 Solar heat flux at sea surface RPANCO1A.227
C 8 Remaining heat flux at sea surface RPANCO1A.228
C 9 Precipitation minus Evaporation RPANCO1A.229
C 10 River inflow RPANCO1A.230
C 11 Water type RPANCO1A.231
C 12 Solar radiation over ice RPANCO1A.232
C 13 Snowfall RPANCO1A.233
C 14 Sublimation RPANCO1A.234
C 15 Reference surface temperature RPANCO1A.235
C 16 Reference surface salinity RPANCO1A.236
C 17 Climatological air temperature RPANCO1A.237
C 18 Climatological ice depth RPANCO1A.238
C 19 Anomalous heat flux RPANCO1A.239
C 20 Anomalous salinity flux RPANCO1A.240
C 21 Ice depth correction (heat) RPANCO1A.241
C 22 GRB0F304.173
C 23 GRB0F304.174
C 24 Single level user ancillary 1 GRB0F304.175
C 25 Single level user ancillary 2 GRB0F304.176
C 26 Single level user ancillary 3 GRB0F304.177
C 27 Single level user ancillary 4 GRB0F304.178
C 28 Single level user ancillary 5 GRB0F304.179
C 29 Single level user ancillary 6 GRB0F304.180
C 30 Single level user ancillary 7 GRB0F304.181
C 31 Single level user ancillary 8 GRB0F304.182
C 32 Single level user ancillary 9 GRB0F304.183
C 33 Single level user ancillary 10 GRB0F304.184
C 34 Multi-level user ancillary 1 GRB0F304.185
C 35 Multi-level user ancillary 2 GRB0F304.186
C 36 Multi-level user ancillary 3 GRB0F304.187
C 37 Multi-level user ancillary 4 GRB0F304.188
RPANCO1A.242
IOUNIT=0 RPANCO1A.243
INCR_SEC = 0 GRB1F304.148
GSM1F404.2
! Initialise arrays - particularly for unused rows in MPP U fields GSM1F404.3
! *DIR$ CACHE_BYPASS ANCIL1,ANCIL2 GPB0F405.205
DO I = 1,IMT*JMT GSM1F404.5
ANCIL1(I)=0.0 GSM1F404.6
ANCIL2(I)=0.0 GSM1F404.7
ENDDO GSM1F404.8
CL 1.1 Set logical switches for each ancillary field independently RPANCO1A.244
RPANCO1A.245
DO FIELD=1,NANCIL_FIELDS RPANCO1A.246
RPANCO1A.247
*IF -DEF,RECON RPANCO1A.248
RPANCO1A.249
UPDATE(FIELD)=.FALSE. RPANCO1A.250
IF(STEPS(FIELD).NE.0) THEN RPANCO1A.251
C UPDATE(FIELD)=MOD(O_STEP,STEPS(FIELD)).EQ.0 GRB1F304.149
UPDATE(FIELD)=(MOD(O_STEP+OFFSET_STEPS,STEPS(FIELD)).EQ.0 GRB1F304.150
& .OR.O_STEP.EQ.0) GRB1F304.151
& .AND.FIELDCODE(1,FIELD).GT.0 RPANCO1A.253
& .AND.D1_ANCILADD(FIELD).GT.1 GDR3F305.312
END IF RPANCO1A.254
GRB1F304.152
CL 1.05 Copy ancillary updating reference time to local variables GRB1F304.153
I_YEAR_REF = ANCIL_REFTIME(1) GRB1F304.154
I_MONTH_REF = ANCIL_REFTIME(2) GRB1F304.155
I_DAY_REF = ANCIL_REFTIME(3) GRB1F304.156
I_HOUR_REF = ANCIL_REFTIME(4) GRB1F304.157
I_MINUTE_REF = ANCIL_REFTIME(5) GRB1F304.158
I_SECOND_REF = ANCIL_REFTIME(6) GRB1F304.159
CL and convert to reference days & secs GRB1F304.160
CALL TIME2SEC
(I_YEAR_REF,I_MONTH_REF,I_DAY_REF, GRB1F304.161
& I_HOUR_REF,I_MINUTE_REF,I_SECOND_REF, GRB1F304.162
& 0,0,ANCIL_REF_DAYS,ANCIL_REF_SECS,LCAL360) GRB1F304.163
GRB1F304.164
IF (.NOT. LCAL360) THEN GSS1F304.609
RPANCO1A.259
CL 1.11 Set logical UPDATE for Gregorian calender updates at monthly RPANCO1A.260
CL or yearly intervals. NB STEPS value set to 1 day in INANCILO RPANCO1A.261
IF(FIELDCODE(1,FIELD).EQ.1.OR.FIELDCODE(1,FIELD).EQ.2) THEN RPANCO1A.262
MONTHS=I_MONTH+I_YEAR*12-(I_MONTH_REF+I_YEAR_REF*12) GRB1F304.165
UPDATE_MONTHS= FIELDCODE(2,FIELD)* RPANCO1A.264
& ((3-FIELDCODE(1,FIELD))/2 *12+ 1-(3-FIELDCODE(1,FIELD))/2) RPANCO1A.265
UPDATE(FIELD)=MOD(MONTHS,UPDATE_MONTHS).EQ.0.AND.I_DAY.EQ.1 RPANCO1A.266
END IF RPANCO1A.267
RPANCO1A.269
END IF GSS1F304.610
*ELSE RPANCO1A.270
RPANCO1A.271
UPDATE(FIELD)=FIELDCODE(FIELD).GT.0 RPANCO1A.272
! Initialise for valid time interpolation in reconfiguration mode. GDG0F401.1418
ANCIL_REF_DAYS = 0 GDG0F401.1419
ANCIL_REF_SECS = 0 GDG0F401.1420
RPANCO1A.273
*ENDIF RPANCO1A.274
RPANCO1A.275
END DO RPANCO1A.276
RPANCO1A.277
RPANCO1A.278
CL Loop over ancillary fields (ocean) RPANCO1A.279
RPANCO1A.280
DO FIELD=1,NANCIL_FIELDS RPANCO1A.281
RPANCO1A.282
RPANCO1A.283
IF (UPDATE(FIELD)) THEN ! (1st level IF block) RPANCO1A.284
FILE=FILEANCIL(FIELD) RPANCO1A.285
NFTIN=FTNANCIL(FILE) RPANCO1A.286
RPANCO1A.287
C Update required for field RPANCO1A.288
RPANCO1A.289
IF (L_OPRINT) WRITE(6,*)'REPLANCO:UPDATE REQUIRED FOR FIELD',FIELD GIE0F403.608
RPANCO1A.291
CL Check whether more than one data time available in data set RPANCO1A.292
RPANCO1A.293
SINGLE_TIME=FIXHD(10,FILE).EQ.0 RPANCO1A.294
RPANCO1A.295
CL Set default values for time interpolation RPANCO1A.296
RPANCO1A.297
LINTERPOLATE=.TRUE. RPANCO1A.298
IF(SINGLE_TIME) THEN RPANCO1A.299
LINTERPOLATE=.FALSE. RPANCO1A.300
END IF RPANCO1A.301
RPANCO1A.302
RPANCO1A.303
CL 2.1 Find position of input record RPANCO1A.304
RPANCO1A.305
CL Default settings of search parameters if only one time present RPANCO1A.306
RPANCO1A.307
IF(SINGLE_TIME) THEN RPANCO1A.308
STEP=0 RPANCO1A.309
ELSE RPANCO1A.310
RPANCO1A.311
*IF -DEF,RECON RPANCO1A.312
RPANCO1A.313
UPDATE_MONTHS=0 RPANCO1A.314
LGREG_MONTHLY=.FALSE. RPANCO1A.315
IF (.NOT. LCAL360) THEN GSS1F304.611
GSS1F304.612
IF(FIELDCODE(1,FIELD).EQ.1.OR.FIELDCODE(1,FIELD).EQ.2) THEN RPANCO1A.317
LGREG_MONTHLY=.TRUE. RPANCO1A.318
UPDATE_MONTHS= FIELDCODE(2,FIELD)* RPANCO1A.319
& ((3-FIELDCODE(1,FIELD))/2 *12+ 1-(3-FIELDCODE(1,FIELD))/2) RPANCO1A.320
END IF RPANCO1A.321
RPANCO1A.323
END IF GSS1F304.613
*ENDIF RPANCO1A.324
RPANCO1A.325
PERIODIC=FIXHD(10,FILE).EQ.2 RPANCO1A.326
REGULAR=.TRUE. RPANCO1A.327
IF (.NOT. LCAL360) THEN GSS1F304.614
RPANCO1A.330
REGULAR=FIXHD(35,FILE).EQ.0.AND.FIXHD(36,FILE). RPANCO1A.331
& EQ.0 RPANCO1A.332
C i.e. data at intervals of days/hours & non-periodic RPANCO1A.333
IF(PERIODIC) REGULAR=REGULAR.AND.FIXHD(37,FILE).EQ.0 RPANCO1A.334
C i.e. data at intervals of hours & periodic RPANCO1A.335
RPANCO1A.336
END IF GSS1F304.615
IF(.NOT.PERIODIC) THEN RPANCO1A.339
RPANCO1A.340
CL If data taken from full time series of input data. RPANCO1A.341
RPANCO1A.342
CALL TIME2SEC
(I_YEAR,I_MONTH,I_DAY,I_HOUR RPANCO1A.343
& ,I_MINUTE,I_SECOND TJ080294.403
& ,ANCIL_REF_DAYS,ANCIL_REF_SECS,DAY,SEC GSS1F304.616
& ,LCAL360) GSS1F304.617
RPANCO1A.345
*IF -DEF,RECON RPANCO1A.346
RPANCO1A.347
CL Adjust time to middle of updating interval RPANCO1A.348
RPANCO1A.349
IF(.NOT.LGREG_MONTHLY) THEN RPANCO1A.350
SEC=SEC+STEPS(FIELD)*O_SECS_P_P/(O_STEPS_P_P*2) RPANCO1A.351
RPANCO1A.352
C If start-up, adjust for offset of reference time from initial time, GRB1F304.166
C & update with values for half a period before first standard update. GRB1F304.167
IF (O_STEP.EQ.0) THEN GRB1F304.168
DAY1 = DAY GRB1F304.169
SEC1 = SEC GRB1F304.170
INCR_SEC = -O_SECS_P_P*MOD(OFFSET_STEPS,STEPS(FIELD))/O_STEPS_P_P GRB1F304.171
CALL TIME_DF
(DAY1,SEC1,0,INCR_SEC,DAY,SEC) GRB1F304.172
END IF GRB1F304.173
GRB1F304.174
ELSE RPANCO1A.353
IM=MOD(I_MONTH+UPDATE_MONTHS-1,12) + 1 RPANCO1A.354
IY=I_YEAR+(I_MONTH+UPDATE_MONTHS-1)/12 RPANCO1A.355
CALL TIME2SEC
(IY,IM,I_DAY,I_HOUR RPANCO1A.356
& ,I_MINUTE,I_SECOND TJ080294.405
& ,ANCIL_REF_DAYS,ANCIL_REF_SECS,DAY1,SEC1 GSS1F304.618
& ,LCAL360) GSS1F304.619
IF (MOD(DAY+DAY1,2).EQ.0) THEN TJ080294.407
DAY=(DAY+DAY1)/2 TJ080294.408
SEC=(SEC+SEC1)/2 TJ080294.409
ELSE TJ080294.410
DAY=(DAY+DAY1-1)/2 TJ080294.411
SEC=(SEC+SEC1+86400)/2 TJ080294.412
ENDIF TJ080294.413
C If start-up, adjust for offset of reference time from initial time, GRB1F304.175
C & update with values for half a period before first standard update. GRB1F304.176
IF (O_STEP.EQ.0) THEN GRB1F304.177
DAY1 = DAY GRB1F304.178
SEC1 = SEC GRB1F304.179
INCR_SEC = -O_SECS_P_P*MOD(OFFSET_STEPS,STEPS(FIELD))/O_STEPS_P_P GRB1F304.180
CALL TIME_DF
(DAY1,SEC1,0,INCR_SEC,DAY,SEC) GRB1F304.181
END IF GRB1F304.182
ENDIF RPANCO1A.359
RPANCO1A.360
*ENDIF RPANCO1A.361
RPANCO1A.362
IF(REGULAR) THEN RPANCO1A.363
CL 2.1.1 Standard cases:360 day calender; RPANCO1A.364
CL 2.1.1 or Gregorian calendar with RPANCO1A.365
CL interval between data times in days or hours RPANCO1A.366
CL updating interval may be regular in model timesteps, RPANCO1A.367
CL or (LGREG_MONTHLY=T) irregular in model timesteps, RPANCO1A.368
RPANCO1A.369
DAYS =DAY TJ080294.414
SECONDS=SEC RPANCO1A.370
CL FInd time(in seconds) of first ancillary data on file RPANCO1A.371
CALL TIME2SEC
(FIXHD(21,FILE),FIXHD(22,FILE), RPANCO1A.372
& FIXHD(23,FILE),FIXHD(24,FILE), RPANCO1A.373
& FIXHD(25,FILE),FIXHD(26,FILE), RPANCO1A.374
& ANCIL_REF_DAYS,ANCIL_REF_SECS,DAY,SEC, GSS1F304.620
& LCAL360) GSS1F304.621
DAYS =DAYS -DAY TJ080294.416
SECONDS=SECONDS-SEC RPANCO1A.376
SECONDS=SECONDS+86400*DAYS TJ080294.417
RPANCO1A.377
IF(SECONDS.LT.0) THEN RPANCO1A.378
ICODE=400+FIELD RPANCO1A.379
CMESSAGE='REPLANCO: Current time precedes start time of data' RPANCO1A.380
RETURN RPANCO1A.381
END IF RPANCO1A.382
RPANCO1A.383
CL FInd interval(in seconds) between ancillary data on file RPANCO1A.384
INTERVAL=(FIXHD(35,FILE)*8640+FIXHD(36,FILE)*720+ RPANCO1A.385
& FIXHD(37,FILE)*24+FIXHD(38,FILE))*3600+ RPANCO1A.386
& FIXHD(39,FILE)*60+FIXHD(40,FILE) RPANCO1A.387
RPANCO1A.388
C Do not interpolate in time if data time exactly matches model time RPANCO1A.389
RPANCO1A.390
IF(MOD(SECONDS,INTERVAL).EQ.0) THEN RPANCO1A.391
LINTERPOLATE=.FALSE. RPANCO1A.392
END IF RPANCO1A.393
RPANCO1A.394
STEP=SECONDS/INTERVAL RPANCO1A.395
TIME=REAL(SECONDS) RPANCO1A.396
TIME1=STEP*INTERVAL RPANCO1A.397
TIME2=(STEP+1)*INTERVAL RPANCO1A.398
RPANCO1A.399
ELSE RPANCO1A.400
RPANCO1A.401
CL 2.1.2 Gregorian calender;ancillary data interval is in months or RPANCO1A.402
CL years,which is irregular in model timesteps. RPANCO1A.403
RPANCO1A.404
*IF -DEF,RECON RPANCO1A.405
RPANCO1A.406
CL Adjust YMD time to middle of updating interval RPANCO1A.407
RPANCO1A.408
I_YEAR1=I_YEAR RPANCO1A.409
I_MONTH1=I_MONTH RPANCO1A.410
I_DAY1=I_DAY RPANCO1A.411
I_HOUR1=I_HOUR RPANCO1A.412
CALL SEC2TIME
(DAY,SEC,ANCIL_REF_DAYS,ANCIL_REF_SECS, GRB1F304.183
& I_YEAR,I_MONTH,I_DAY, TJ080294.419
& I_HOUR,I_MINUTE,I_SECOND,I_DAY_NUMBER, GSS1F304.622
& LCAL360) GSS1F304.623
RPANCO1A.415
*ENDIF RPANCO1A.416
RPANCO1A.417
CL FInd interval(in months) between ancillary data on file RPANCO1A.418
INTERVAL=FIXHD(35,FILE)*12+FIXHD(36,FILE) RPANCO1A.419
MONTHS=I_YEAR*12+I_MONTH RPANCO1A.420
START_MONTH=FIXHD(21,FILE)*12+FIXHD(22,FILE) RPANCO1A.421
MONTHS=MONTHS-START_MONTH RPANCO1A.422
C Check for time within month RPANCO1A.423
IF((I_DAY*24+I_HOUR).LT. RPANCO1A.424
* (FIXHD(23,FILE)*24+FIXHD(24,FILE))) THEN RPANCO1A.425
MONTHS=MONTHS-1 RPANCO1A.426
END IF RPANCO1A.427
RPANCO1A.428
IF(MONTHS.LT.0) THEN RPANCO1A.429
ICODE=400+FIELD RPANCO1A.430
CMESSAGE='REPLANCO: Current time precedes start time of data' RPANCO1A.431
RETURN RPANCO1A.432
END IF RPANCO1A.433
RPANCO1A.434
*IF -DEF,RECON RPANCO1A.435
RPANCO1A.436
CL Adjust YMD time back to start of updating interval RPANCO1A.437
RPANCO1A.438
I_YEAR=I_YEAR1 RPANCO1A.439
I_MONTH=I_MONTH1 RPANCO1A.440
I_DAY=I_DAY1 RPANCO1A.441
I_HOUR=I_HOUR1 RPANCO1A.442
RPANCO1A.443
*ENDIF RPANCO1A.444
RPANCO1A.445
RPANCO1A.446
STEP=MONTHS/INTERVAL RPANCO1A.447
C NB INTERVAL may be > 1 month RPANCO1A.448
MONTHS=STEP*INTERVAL RPANCO1A.449
C Calculate data times for time interpolation RPANCO1A.450
TIME=REAL(SEC)/3600+REAL(DAY*24) TJ080294.420
IM=MOD(FIXHD(22,FILE)+MONTHS-1,12)+1 RPANCO1A.452
IY=FIXHD(21,FILE)+(MONTHS+FIXHD(22,FILE)-1)/12 RPANCO1A.453
CALL TIME2SEC
(IY,IM,FIXHD(23,FILE),FIXHD(24,FILE), RPANCO1A.454
& FIXHD(25,FILE),FIXHD(26,FILE), TJ080294.421
& ANCIL_REF_DAYS,ANCIL_REF_SECS,DAY,SEC, GSS1F304.624
& LCAL360) GSS1F304.625
TIME1=REAL(SEC)/3600+REAL(DAY*24) TJ080294.423
IM=MOD(FIXHD(22,FILE)+MONTHS+INTERVAL-1,12)+1 RPANCO1A.457
IY=FIXHD(21,FILE)+(MONTHS+INTERVAL+FIXHD(22,FILE)-1)/12 RPANCO1A.458
CALL TIME2SEC
(IY,IM,FIXHD(23,FILE),FIXHD(24,FILE), RPANCO1A.459
& FIXHD(25,FILE),FIXHD(26,FILE), TJ080294.424
& ANCIL_REF_DAYS,ANCIL_REF_SECS,DAY,SEC, GSS1F304.626
& LCAL360) GSS1F304.627
TIME2=REAL(SEC)/3600+REAL(DAY*24) TJ080294.426
RPANCO1A.462
C Do not interpolate in time if data time exactly matches model time RPANCO1A.463
RPANCO1A.464
IF(TIME.EQ.TIME1) THEN RPANCO1A.465
LINTERPOLATE=.FALSE. RPANCO1A.466
END IF RPANCO1A.467
RPANCO1A.468
ENDIF ! End of REGULAR/not REGULAR RPANCO1A.469
RPANCO1A.470
ELSE ! PERIODIC data RPANCO1A.471
RPANCO1A.472
CL 2.2 If data is taken from ancillary periodic data. RPANCO1A.473
RPANCO1A.474
CALL TIME2SEC
(I_YEAR,I_MONTH,I_DAY,I_HOUR, RPANCO1A.475
& I_MINUTE,I_SECOND, TJ080294.427
& ANCIL_REF_DAYS,ANCIL_REF_SECS,DAY,SEC, GSS1F304.628
& LCAL360) GSS1F304.629
RPANCO1A.477
*IF -DEF,RECON RPANCO1A.478
RPANCO1A.479
CL Adjust time to middle of updating interval RPANCO1A.480
RPANCO1A.481
IF(.NOT.LGREG_MONTHLY) THEN RPANCO1A.482
SEC=SEC+STEPS(FIELD)*O_SECS_P_P/(O_STEPS_P_P*2) RPANCO1A.483
RPANCO1A.484
C If start-up, adjust for offset of reference time from initial time, GRB1F304.184
C & update with values for half a period before first standard update. GRB1F304.185
IF (O_STEP.EQ.0) THEN GRB1F304.186
DAY1 = DAY GRB1F304.187
SEC1 = SEC GRB1F304.188
INCR_SEC = -O_SECS_P_P*MOD(OFFSET_STEPS,STEPS(FIELD))/O_STEPS_P_P GRB1F304.189
CALL TIME_DF
(DAY1,SEC1,0,INCR_SEC,DAY,SEC) GRB1F304.190
END IF GRB1F304.191
GRB1F304.192
ELSE RPANCO1A.485
IM=MOD(I_MONTH+UPDATE_MONTHS-1,12) + 1 RPANCO1A.486
IY=I_YEAR+(I_MONTH+UPDATE_MONTHS-1)/12 RPANCO1A.487
CALL TIME2SEC
(IY,IM,I_DAY,I_HOUR RPANCO1A.488
& ,I_MINUTE,I_SECOND TJ080294.429
& ,ANCIL_REF_DAYS,ANCIL_REF_SECS,DAY1,SEC1 GSS1F304.630
& ,LCAL360) GSS1F304.631
IF (MOD(DAY+DAY1,2).EQ.0) THEN TJ080294.431
DAY=(DAY+DAY1)/2 TJ080294.432
SEC=(SEC+SEC1)/2 TJ080294.433
ELSE TJ080294.434
DAY=(DAY+DAY1-1)/2 TJ080294.435
SEC=(SEC+SEC1+86400)/2 TJ080294.436
ENDIF TJ080294.437
C If start-up, adjust for offset of reference time from initial time, GRB1F304.193
C & update with values for half a period before first standard update. GRB1F304.194
IF (O_STEP.EQ.0) THEN GRB1F304.195
DAY1 = DAY GRB1F304.196
SEC1 = SEC GRB1F304.197
INCR_SEC = -O_SECS_P_P*MOD(OFFSET_STEPS,STEPS(FIELD))/O_STEPS_P_P GRB1F304.198
CALL TIME_DF
(DAY1,SEC1,0,INCR_SEC,DAY,SEC) GRB1F304.199
END IF GRB1F304.200
ENDIF RPANCO1A.491
RPANCO1A.492
RPANCO1A.493
CL Adjust YMD time to middle of updating interval RPANCO1A.494
RPANCO1A.495
I_YEAR1=I_YEAR RPANCO1A.496
I_MONTH1=I_MONTH RPANCO1A.497
I_DAY1=I_DAY RPANCO1A.498
I_HOUR1=I_HOUR RPANCO1A.499
I_MINUTE1=I_MINUTE RPANCO1A.500
I_SECOND1=I_SECOND RPANCO1A.501
CALL SEC2TIME
(DAY,SEC,ANCIL_REF_DAYS,ANCIL_REF_SECS, GRB1F304.201
& I_YEAR,I_MONTH,I_DAY, TJ080294.439
& I_HOUR,I_MINUTE,I_SECOND,I_DAY_NUMBER, GSS1F304.632
& LCAL360) GSS1F304.633
RPANCO1A.504
RPANCO1A.505
*ENDIF RPANCO1A.506
RPANCO1A.507
IF (REGULAR) THEN RPANCO1A.508
CL 2.2.1 Standard cases:1) 360 day calender, with allowed periods of RPANCO1A.509
CL 1 day, 1 month or 1 year; RPANCO1A.510
CL RPANCO1A.511
CL 2) Gregorian calender with update in hours,and period of RPANCO1A.512
CL data 1 day. RPANCO1A.513
CL RPANCO1A.514
CL For both updating interval and number of RPANCO1A.515
CL data times to be skipped in data set calculated in seconds. RPANCO1A.516
RPANCO1A.517
DAYS =DAY TJ080294.440
SECONDS=SEC RPANCO1A.518
INTERVAL=(FIXHD(35,FILE)*8640+FIXHD(36,FILE)*720+ RPANCO1A.519
& FIXHD(37,FILE)*24+FIXHD(38,FILE))*3600+ RPANCO1A.520
& FIXHD(39,FILE)*60+FIXHD(40,FILE) RPANCO1A.521
RPANCO1A.522
C PERIOD=INTHD(3,FILE)*INTERVAL RPANCO1A.523
PERIOD=(FIXHD(28,FILE)-FIXHD(21,FILE))*8640*3600 RPANCO1A.524
& + (FIXHD(29,FILE)-FIXHD(22,FILE))*720*3600 RPANCO1A.525
& + (FIXHD(30,FILE)-FIXHD(23,FILE))*24*3600 RPANCO1A.526
& + (FIXHD(31,FILE)-FIXHD(24,FILE))*3600 RPANCO1A.527
& + (FIXHD(32,FILE)-FIXHD(25,FILE))*60 RPANCO1A.528
& + (FIXHD(33,FILE)-FIXHD(26,FILE))+INTERVAL RPANCO1A.529
PERIOD=PERIOD/3600 RPANCO1A.530
RPANCO1A.531
CL Do not allow non-standard periods RPANCO1A.532
GSS1F304.634
IF (LCAL360) THEN GSS1F304.635
GSS1F304.636
IF(PERIOD.NE.8640.AND.PERIOD.NE.720.AND.PERIOD.NE.24)THEN RPANCO1A.534
ICODE=600+FIELD RPANCO1A.538
CMESSAGE='REPLANCO: Non-standard period for periodic data' RPANCO1A.539
RETURN RPANCO1A.540
ENDIF RPANCO1A.541
ELSE GSS1F304.637
IF(PERIOD.NE.24)THEN GSS1F304.638
ICODE=600+FIELD GSS1F304.639
CMESSAGE='REPLANCO: Non-standard period for periodic data' GSS1F304.640
RETURN GSS1F304.641
ENDIF GSS1F304.642
END IF GSS1F304.643
IF(PERIOD.EQ.24)THEN RPANCO1A.543
C Ancillary data interval in hour(s), period is 1 day RPANCO1A.544
RPANCO1A.545
IY=I_YEAR RPANCO1A.546
IM=I_MONTH RPANCO1A.547
ID=I_DAY RPANCO1A.548
IF((I_HOUR*3600+I_MINUTE*60+I_SECOND).LT.(FIXHD(24,FILE) RPANCO1A.549
& *3600+FIXHD(25,FILE)*60+FIXHD(26,FILE))) RPANCO1A.550
& DAYS=DAYS+1 TJ080294.441
RPANCO1A.552
ELSE IF(PERIOD.EQ.720)THEN RPANCO1A.553
C Ancillary data interval in day(s) or hours , period is 1 month RPANCO1A.554
RPANCO1A.555
IY=I_YEAR RPANCO1A.556
IM=I_MONTH RPANCO1A.557
ID=FIXHD(23,FILE) RPANCO1A.558
IF((I_DAY*24*3600+I_HOUR*3600+I_MINUTE*60+I_SECOND).LT. RPANCO1A.559
& (FIXHD(23,FILE)*24*3600+FIXHD(24,FILE)*3600+ RPANCO1A.560
& FIXHD(25,FILE)*60+FIXHD(26,FILE))) RPANCO1A.561
& DAYS=DAYS+30 TJ080294.442
RPANCO1A.563
ELSE IF(PERIOD.EQ.8640)THEN RPANCO1A.564
C Ancillary data interval in month(s)or days or hours, period is 1 year RPANCO1A.565
RPANCO1A.566
IY=I_YEAR RPANCO1A.567
IM=FIXHD(22,FILE) RPANCO1A.568
ID=FIXHD(23,FILE) RPANCO1A.569
IF((I_MONTH*720*3600+I_DAY*24*3600+I_HOUR*3600+ RPANCO1A.570
& I_MINUTE*60+I_SECOND).LT.(FIXHD(22,FILE)*720*3600+ RPANCO1A.571
& FIXHD(23,FILE)*24*3600+FIXHD(24,FILE)*3600+ RPANCO1A.572
& FIXHD(25,FILE)*60+FIXHD(26,FILE))) RPANCO1A.573
& DAYS=DAYS+360 TJ080294.443
RPANCO1A.575
END IF RPANCO1A.576
RPANCO1A.577
CALL TIME2SEC
(IY,IM,ID,FIXHD(24,FILE), RPANCO1A.578
& FIXHD(25,FILE),FIXHD(26,FILE), RPANCO1A.579
& ANCIL_REF_DAYS,ANCIL_REF_SECS,DAY,SEC, GSS1F304.644
& LCAL360) GSS1F304.645
DAYS =DAYS -DAY TJ080294.445
SECONDS=SECONDS-SEC RPANCO1A.581
SECONDS=SECONDS+86400*DAYS TJ080294.446
RPANCO1A.582
C Do not interpolate in time if data time exactly matches model time RPANCO1A.583
RPANCO1A.584
IF(MOD(SECONDS,INTERVAL).EQ.0) THEN RPANCO1A.585
LINTERPOLATE=.FALSE. RPANCO1A.586
END IF RPANCO1A.587
STEP=SECONDS/INTERVAL RPANCO1A.588
TIME=REAL(SECONDS) RPANCO1A.589
TIME1=STEP*INTERVAL RPANCO1A.590
TIME2=(STEP+1)*INTERVAL RPANCO1A.591
RPANCO1A.592
ELSE ! non regular case RPANCO1A.593
RPANCO1A.594
CL 2.2.2 Gregorian calender,and data interval is in months, RPANCO1A.595
CL period is 1 year RPANCO1A.596
CL Updating interval and number of data times to be skipped RPANCO1A.597
CL calculated in months. RPANCO1A.598
RPANCO1A.599
TIME=REAL(SEC)/3600+REAL(DAY*24) TJ080294.447
INTERVAL=FIXHD(36,FILE)+FIXHD(35,FILE)*12 RPANCO1A.601
C PERIOD=INTHD(3,FILE)*INTERVAL RPANCO1A.602
PERIOD=(FIXHD(28,FILE)-FIXHD(21,FILE))*12 RPANCO1A.603
& + (FIXHD(29,FILE)-FIXHD(22,FILE))+INTERVAL RPANCO1A.604
IF(PERIOD.NE.12)THEN RPANCO1A.605
ICODE=600+FIELD RPANCO1A.606
CMESSAGE='REPLANCO: Non-standard period for periodic data' RPANCO1A.607
RETURN RPANCO1A.608
ENDIF RPANCO1A.609
RPANCO1A.610
MONTHS=I_MONTH-FIXHD(22,FILE) RPANCO1A.611
C Check for time within month RPANCO1A.612
IF((I_DAY*24+I_HOUR).LT. RPANCO1A.613
& (FIXHD(23,FILE)*24+FIXHD(24,FILE))) THEN RPANCO1A.614
MONTHS=MONTHS-1 RPANCO1A.615
END IF RPANCO1A.616
IF(MONTHS.LT.0) THEN RPANCO1A.617
MONTHS=MONTHS+12 RPANCO1A.618
END IF RPANCO1A.619
RPANCO1A.620
STEP=MONTHS/INTERVAL RPANCO1A.621
C NB INTERVAL may be > 1 month RPANCO1A.622
MONTHS=STEP*INTERVAL RPANCO1A.623
C Calculate TIME1 for first ancillary data time RPANCO1A.624
C set IY correctly for time interpolation calculations RPANCO1A.625
IY=I_YEAR RPANCO1A.626
IM=MOD(FIXHD(22,FILE)+MONTHS-1,12)+1 RPANCO1A.627
IF(IM.GT.I_MONTH) IY=IY-1 RPANCO1A.628
CALL TIME2SEC
(IY,IM,FIXHD(23,FILE),FIXHD(24,FILE), RPANCO1A.629
& FIXHD(25,FILE),FIXHD(26,FILE), TJ080294.448
& ANCIL_REF_DAYS,ANCIL_REF_SECS,DAY,SEC,LCAL360) GSS1F304.646
TIME1=REAL(SEC)/3600+REAL(DAY*24) TJ080294.450
C Calculate TIME2 for second ancillary data time RPANCO1A.632
C set IY correctly for time interpolation calculations RPANCO1A.633
IY=I_YEAR RPANCO1A.634
IM=MOD(FIXHD(22,FILE)+MONTHS+INTERVAL-1,12)+1 RPANCO1A.635
IF(IM.LT.I_MONTH) IY=IY+1 RPANCO1A.636
CALL TIME2SEC
(IY,IM,FIXHD(23,FILE),FIXHD(24,FILE), RPANCO1A.637
& FIXHD(25,FILE),FIXHD(26,FILE), TJ080294.451
& ANCIL_REF_DAYS,ANCIL_REF_SECS,DAY,SEC,LCAL360) GSS1F304.647
TIME2=REAL(SEC)/3600+REAL(DAY*24) TJ080294.453
RPANCO1A.640
C Do not interpolate in time if data time exactly matches model time RPANCO1A.641
RPANCO1A.642
IF(TIME.EQ.TIME1) THEN RPANCO1A.643
LINTERPOLATE=.FALSE. RPANCO1A.644
END IF RPANCO1A.645
RPANCO1A.646
ENDIF ! regular/non-regular GRB1F304.202
RPANCO1A.648
*IF -DEF,RECON RPANCO1A.649
RPANCO1A.650
CL Adjust YMD time back to start of updating interval RPANCO1A.651
RPANCO1A.652
I_YEAR=I_YEAR1 RPANCO1A.653
I_MONTH=I_MONTH1 RPANCO1A.654
I_DAY=I_DAY1 RPANCO1A.655
I_HOUR=I_HOUR1 RPANCO1A.656
I_MINUTE=I_MINUTE1 RPANCO1A.657
I_SECOND=I_SECOND1 RPANCO1A.658
RPANCO1A.659
*ENDIF RPANCO1A.660
RPANCO1A.661
ENDIF ! non-periodic/periodic GRB1F304.203
RPANCO1A.663
*IF -DEF,RECON GRB1F304.204
IF (LINTERPOLATE.AND.L_OPRINT) THEN ORH2F401.67
WRITE(6,*)' REPLANCO - time interpolation for field ',field GIE0F403.609
WRITE(6,*)' time,time1,time2 ',time,time1,time2 GIE0F403.610
WRITE(6,*)' seconds,int,period ',seconds,interval,period GIE0F403.611
END IF GRB1F400.70
*ENDIF GRB1F304.208
GRB1F304.209
END IF ! singletime/non-singletime GRB1F304.210
RPANCO1A.665
CL 2.3 Check STASH Code RPANCO1A.666
RPANCO1A.667
I2=NLOOKUP(FIELD)+LOOKUP_STEP(FIELD)*STEP RPANCO1A.668
RPANCO1A.669
I1=LOOKUP(ITEM_CODE,I2+LOOKUP_START(FILE)-1) RPANCO1A.670
RPANCO1A.671
LMISMATCH=.FALSE. RPANCO1A.672
IF (L_OPRINT) THEN ORH2F401.70
WRITE(6,*)' Information used in checking ancillary data set:', RPANCO1A.673
* ' position of lookup table in dataset:',I2 RPANCO1A.674
WRITE(6,*)' Position of first lookup table referring to ', RPANCO1A.675
* 'data type ',NLOOKUP(FIELD) RPANCO1A.676
WRITE(6,*)' Interval between lookup tables referring to data ', RPANCO1A.677
* 'type ', LOOKUP_STEP(FIELD),' Number of steps', STEP RPANCO1A.678
WRITE(6,*)' STASH code in dataset ',I1, RPANCO1A.679
* ' STASH code requested ',STASHANCIL(FIELD) RPANCO1A.680
WRITE(6,*)'''Start'' position of lookup tables for dataset ', RPANCO1A.681
* 'in overall lookup array ' ,LOOKUP_START(FILE) RPANCO1A.682
ENDIF ORH2F401.71
RPANCO1A.683
IF(I1.NE.STASHANCIL(FIELD)) THEN RPANCO1A.684
WRITE(6,*)I1,STASHANCIL(FIELD),FIELD RPANCO1A.685
LMISMATCH=.TRUE. RPANCO1A.686
END IF RPANCO1A.687
RPANCO1A.688
CL Error exit if checks fail RPANCO1A.689
RPANCO1A.690
IF(LMISMATCH) THEN RPANCO1A.691
ICODE=200+FIELD RPANCO1A.692
CMESSAGE='REPLANCO: PP HEADERS ON ANCILLARY FILE DO NOT MATCH' RPANCO1A.693
RETURN RPANCO1A.694
END IF RPANCO1A.695
RPANCO1A.696
IF(LINTERPOLATE.AND..NOT.SINGLE_TIME) THEN RPANCO1A.697
CL Check time interpolation factors RPANCO1A.698
IF(TIME.LT.TIME1.OR.TIME.GT.TIME2) THEN RPANCO1A.699
WRITE(6,*)' Information used in interpolation/replacement:' RPANCO1A.700
WRITE(6,*)' Time of first data=', TIME1 RPANCO1A.701
WRITE(6,*)' Validity Time for update=', TIME RPANCO1A.702
WRITE(6,*)' Time of second data=', TIME2 RPANCO1A.703
RPANCO1A.704
ICODE=500+FIELD RPANCO1A.705
CMESSAGE='REPLANCO: TIME INTERPOLATION ERROR' RPANCO1A.706
RETURN RPANCO1A.707
END IF RPANCO1A.708
END IF RPANCO1A.709
RPANCO1A.710
CL 3. Extract ancillary data for field I and transfer to D1 array GMB1F304.127
RPANCO1A.712
C set accumulated length of fields input to zero GMB1F304.128
LEN_FLD_ACC = 0 GMB1F304.129
GMB1F304.130
C start loop over levels (ends near end of routine) GMB1F304.131
DO LEVEL=1,LEVELS(FIELD) GMB1F304.132
GMB1F304.133
I2LEV = I2 + LEVEL - 1 GMB1F304.134
GMB1F304.135
CL 3.0 Determine number of values in each field to be input GMB1F304.136
GMB1F304.137
C LEN_FLD is length of first field to be read GMB1F304.138
LEN_FLD = IMT*JMT ORH6F402.9
ORH6F402.10
GMB1F304.140
IF ( LEN_FLD .GT. IMT*JMT ) THEN GMB1F304.141
ICODE = 1 GMB1F304.142
WRITE(6,*) ' length of ancillary field longer than allowed' GMB1F304.143
WRITE(6,*) 'LEN_FLD, IMT*JMT = ', LEN_FLD, IMT*JMT GMB1F304.144
CMESSAGE='REPLANCO : field length error' GMB1F304.145
GO TO 900 GMB1F304.146
END IF GMB1F304.147
GMB1F304.148
GMB1F304.149
CL 3.1 Read data for single level of ancillary field. GMB1F304.150
GMB1F304.151
CALL READFLDS
(NFTIN,1,I2LEV,LOOKUP(1,LOOKUP_START(FILE)), GDG0F401.1421
& LEN1_LOOKUP,ANCIL1,LEN_FLD,FIXHD(1,FILE), GDG0F401.1422
*CALL ARGPPX
GDG0F401.1423
& ICODE,CMESSAGE) GDG0F401.1424
IF(ICODE.GT.0) THEN RPANCO1A.715
ICODE=FIELD+100 RPANCO1A.716
CMESSAGE='REPLANCO :I|O error' RPANCO1A.717
RETURN RPANCO1A.718
END IF RPANCO1A.719
RPANCO1A.720
CLL 3.2 If time interpolation required, read second record RPANCO1A.721
IF(LINTERPOLATE) THEN RPANCO1A.722
RPANCO1A.723
I1LEV=I2LEV+LOOKUP_STEP(FIELD) GMB1F304.154
RPANCO1A.725
IF (I1LEV.LE.FIXHD(152,FILE)) THEN GMB1F304.155
CALL READFLDS
(NFTIN,1,I1LEV,LOOKUP(1,LOOKUP_START(FILE)), GDG0F401.1425
& LEN1_LOOKUP,ANCIL2,LEN_FLD,FIXHD(1,FILE), GDG0F401.1426
*CALL ARGPPX
GDG0F401.1427
& ICODE,CMESSAGE) GDG0F401.1428
IF(ICODE.GT.0) THEN RPANCO1A.729
ICODE=FIELD+100 RPANCO1A.730
IOUNIT=NFTIN RPANCO1A.731
CMESSAGE='REPLANCO :I|O error' RPANCO1A.732
RETURN RPANCO1A.733
END IF RPANCO1A.734
RPANCO1A.735
ELSE ! end of data on file RPANCO1A.736
RPANCO1A.737
CL If end of data has been reached go back to the start if periodic RPANCO1A.738
CL otherwise cancel time interpolation RPANCO1A.739
RPANCO1A.740
IF(PERIODIC) THEN RPANCO1A.741
RPANCO1A.742
C find number of field to access GMB1F304.158
I1LEV=NLOOKUP(FIELD) + LEVEL - 1 GMB1F304.159
RPANCO1A.744
CALL READFLDS
(NFTIN,1,I1LEV,LOOKUP(1,LOOKUP_START(FILE)), GDG0F401.1429
& LEN1_LOOKUP,ANCIL2,LEN_FLD,FIXHD(1,FILE), GDG0F401.1430
*CALL ARGPPX
GDG0F401.1431
& ICODE,CMESSAGE) GDG0F401.1432
IF(ICODE.GT.0) THEN RPANCO1A.747
ICODE=FIELD+300 RPANCO1A.748
IOUNIT=NFTIN RPANCO1A.749
CMESSAGE='REPLANCO :I|O error' RPANCO1A.750
RETURN RPANCO1A.751
END IF RPANCO1A.752
ELSE RPANCO1A.753
LINTERPOLATE=.FALSE. RPANCO1A.754
END IF RPANCO1A.755
END IF ! end of position of file test RPANCO1A.756
ICODE=0 RPANCO1A.757
END IF ! end of LINTERPOLATE RPANCO1A.758
RPANCO1A.759
CL 3.3 Set number of rows of data (no longer required) GMB1F304.162
RPANCO1A.766
CL 3.4 Perform time interpolation RPANCO1A.767
RPANCO1A.768
IF(LINTERPOLATE) THEN RPANCO1A.769
RPANCO1A.770
C Linear interpolation in time, unless missing data indicator RPANCO1A.771
C present at either time. RPANCO1A.772
RPANCO1A.773
CALL T_INT
(ANCIL1,TIME1,ANCIL2,TIME2,ANCIL_DATA, RPANCO1A.774
& TIME,LEN_FLD) GMB1F304.163
RPANCO1A.776
C If no interpolation, copy data into final array RPANCO1A.777
RPANCO1A.778
ELSE RPANCO1A.779
DO I=1,LEN_FLD GMB1F304.164
ANCIL_DATA(I)=ANCIL1(I) RPANCO1A.781
END DO RPANCO1A.782
END IF RPANCO1A.783
RPANCO1A.784
CL 3.5 Updating action for each field at each level RPANCO1A.785
CL Fields replaced. RPANCO1A.786
RPANCO1A.787
POS_STRT = D1_ANCILADD(FIELD) + LEN_FLD_ACC GMB1F304.165
DO I=1,LEN_FLD GMB1F304.166
D1(POS_STRT+I-1)=ANCIL_DATA(I) GMB1F304.167
END DO RPANCO1A.790
GMB1F304.168
CL End loop over levels GMB1F304.169
GMB1F304.170
LEN_FLD_ACC = LEN_FLD_ACC + LEN_FLD GMB1F304.171
GMB1F304.172
END DO ! LEVEL loop ends GMB1F304.173
RPANCO1A.791
CL End loop over ancillary fields (ocean) RPANCO1A.792
RPANCO1A.793
END IF ! End UPDATE(FIELD) test : 1st level IF block RPANCO1A.794
RPANCO1A.795
END DO RPANCO1A.796
RPANCO1A.797
900 RETURN RPANCO1A.798
END RPANCO1A.799
*ENDIF RPANCO1A.800