*IF DEF,CONTROL INBOUND1.2
C ******************************COPYRIGHT****************************** GTS2F400.4537
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.4538
C GTS2F400.4539
C Use, duplication or disclosure of this code is subject to the GTS2F400.4540
C restrictions as set forth in the contract. GTS2F400.4541
C GTS2F400.4542
C Meteorological Office GTS2F400.4543
C London Road GTS2F400.4544
C BRACKNELL GTS2F400.4545
C Berkshire UK GTS2F400.4546
C RG12 2SZ GTS2F400.4547
C GTS2F400.4548
C If no contract has been raised with this copy of the code, the use, GTS2F400.4549
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.4550
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.4551
C Modelling at the above address. GTS2F400.4552
C ******************************COPYRIGHT****************************** GTS2F400.4553
C GTS2F400.4554
CLL Subroutine IN_BOUND INBOUND1.3
CLL INBOUND1.4
CLL Purpose : Takes as input,the code defining whether updates of INBOUND1.5
CLL boundary data are required. The physical files required are INBOUND1.6
CLL identified, and the headers lookup tables are read into common INBOUND1.7
CLL blocks. Reads the update intervals from the boundary datasets. INBOUND1.8
CLL Where the update interval is in months or years, the check will be INBOUND1.9
CLL made daily. INBOUND1.10
CLL INBOUND1.11
CLL Control routine for CRAY YMP INBOUND1.12
CLL INBOUND1.13
CLL CW, SI <- programmer of some or all of previous code or changes INBOUND1.14
CLL INBOUND1.15
CLL Model Modification history from model version 3.0: INBOUND1.16
CLL version Date INBOUND1.17
CLL 3.1 2/02/93 : added comdeck CHSUNITS to define NUNITS for i/o. RS030293.107
CLL 3.2 21/05/93 Dynamic allocation changes - R.T.H.Barnes. @DYALLOC.1271
CLL 3.3 08/02/94 Modify calls to TIME2SEC/SEC2TIME to output/input TJ080294.261
CLL elapsed times in days & secs, for portability. TCJ TJ080294.262
CLL 05/05/94 Add calls to LOGICAL functions TIME_EQ/TIME_LT. TCJ TJ080294.263
CLL INBOUND1.18
CLL 3.3 07/10/93 Changed CHARACTER*(*) to CHARACTER*(80) for TS071093.1
CLL portability. Author: Tracey Smith TS071093.2
CLL INBOUND1.19
CLL 3.3 24/09/93 : added A/O_LEN1_LEVDEPCDA & A/O_LEN2_LEVDEPCDA NF171193.22
CLL to argument list for portable dynamic arrays. NF171193.23
CLL Author: Paul Burton NF171193.24
CLL 3.4 16/06/94 DEF CAL360 replaced by LOGICAL LCAL360 GSS1F304.366
CLL Argument LCAL360 passed to s/r TIME2SEC GSS1F304.367
CLL S.J.Swarbrick GSS1F304.368
CLL GSS1F304.369
CLL 3.4 08/07/94 Correct misspelled TIM2STEP in EXTERNAL stmt. TCJ GTJ0F304.1
CLL 3.5 1/08/95 Stage 1 submodel changes and relax check on real GDR5F305.31
CLL constants to near 32 bit accuracy. R Rawlins GDR5F305.32
CLL 3.5 24/03/95 Changed OPEN to FILE_OPEN P.Burton GPB1F305.48
CLL 4.1 17/04/96 Introduce wave sub-model. RTHBarnes. WRB1F401.185
CLL 4.1 26/04/96 Initialise BNDARY_OFFSETim for all internal GOK1F401.1
CLL model ids. S.Ineson GOK1F401.2
! 4.1 12/01/96 Use READHEAD for Atmos Boundary Datasets (LBC) APB4F401.396
! D. Robinson. APB4F401.397
! APB4F401.398
! 4.1 18/06/96 Changes to cope with changes in STASH addressing GDG0F401.796
! Author D.M. Goddard. GDG0F401.797
!LL 4.4 14/08/97 Generate list of boundary updated variables from ARB1F404.328
!LL control logicals and pass to chk_look_bounda for ARB1F404.329
!LL checking against boundary file headers. RTHBarnes. ARB1F404.330
!LL 4.4 25/03/97 Use READHEAD for Ocean Boundary Datasets and GDR1F404.1
!LL Atmos Lower Boundary Datasets. D. Robinson. GDR1F404.2
!LL 4.5 13/08/97 Initialise O_BDY_STEP_PREV for use in the ocean GSI1F405.156
!LL open bdy routine BOUNDVOL and delete FLOOR_STEPSO. GSI1F405.157
!LL M.J. Bell GSI1F405.158
!LL 4.5 19/01/98 Remove SOIL_VARS and VEG_VARS. D. Robinson. GDR6F405.25
!LL 4.5 11/09/98 Use DEFs in EXTERNAL statement. D. Robinson. GDR6F405.26
GDG0F401.798
CLL Programming standard; Unified Model Documentation Paper No. 3 INBOUND1.20
CLL version no. 1, dated 15/01/90 INBOUND1.21
CLL INBOUND1.22
CLL Logical components covered : C720 INBOUND1.23
CLL INBOUND1.24
CLL System task : C7 INBOUND1.25
CLL INBOUND1.26
CLL Documentation : Unified Model Documentation Paper No C7 INBOUND1.27
CLLEND INBOUND1.28
C INBOUND1.29
C*L Arguments INBOUND1.30
SUBROUTINE IN_BOUND ( 2,43@DYALLOC.1272
*CALL ARGSIZE
@DYALLOC.1273
*CALL ARGDUMA
@DYALLOC.1274
*CALL ARGDUMO
@DYALLOC.1275
*CALL ARGDUMW
WRB1F401.186
*CALL ARGSTS
ARB1F404.331
*CALL ARGPTRA
@DYALLOC.1276
*CALL ARGPTRO
@DYALLOC.1277
*CALL ARGPTRW
WRB1F401.187
*CALL ARGBND
@DYALLOC.1278
*IF DEF,ATMOS NF171193.25
& A_LEN1_LEVDEPCDA,A_LEN2_LEVDEPCDA, NF171193.26
*ENDIF NF171193.27
*IF DEF,OCEAN NF171193.28
& O_LEN1_LEVDEPCDA,O_LEN2_LEVDEPCDA, NF171193.29
*ENDIF NF171193.30
*IF DEF,WAVE WRB1F401.188
& W_LEN1_LEVDEPCDA,W_LEN2_LEVDEPCDA, WRB1F401.189
*ENDIF WRB1F401.190
*CALL ARGPPX
GDG0F401.799
& ICODE,CMESSAGE) GDR3F305.239
INBOUND1.32
IMPLICIT NONE INBOUND1.33
@DYALLOC.1280
*CALL CMAXSIZE
@DYALLOC.1281
*CALL CSUBMODL
PXORDER.23
*CALL TYPSIZE
@DYALLOC.1282
*CALL TYPDUMA
@DYALLOC.1283
*CALL TYPDUMO
@DYALLOC.1284
*CALL TYPDUMW
WRB1F401.191
*CALL TYPSTS
ARB1F404.332
*CALL TYPPTRA
@DYALLOC.1285
*CALL TYPPTRO
@DYALLOC.1286
*CALL TYPPTRW
WRB1F401.192
*CALL TYPBND
@DYALLOC.1287
INBOUND1.34
INTEGER INBOUND1.35
*IF DEF,ATMOS NF171193.31
& A_LEN1_LEVDEPCDA, ! IN : copy of A_LEN1_LEVDEPC NF171193.32
& A_LEN2_LEVDEPCDA, ! IN : copy of A_LEN2_LEVDEPC NF171193.33
*ENDIF NF171193.34
*IF DEF,OCEAN NF171193.35
& O_LEN1_LEVDEPCDA, ! IN : copy of O_LEN1_LEVDEPC NF171193.36
& O_LEN2_LEVDEPCDA, ! IN : copy of O_LEN2_LEVDEPC NF171193.37
*ENDIF NF171193.38
*IF DEF,WAVE WRB1F401.193
& W_LEN1_LEVDEPCDA, ! IN : copy of W_LEN1_LEVDEPC WRB1F401.194
& W_LEN2_LEVDEPCDA, ! IN : copy of W_LEN2_LEVDEPC WRB1F401.195
*ENDIF WRB1F401.196
& ICODE ! Return code = 0 Normal Exit INBOUND1.36
C ! " " > 0 Error Exit INBOUND1.37
INBOUND1.38
CHARACTER*(80) CMESSAGE ! Error message if ICODE > 0 TS071093.3
C* INBOUND1.40
INBOUND1.41
*CALL PPXLOOK
GDG0F401.801
*CALL CHSUNITS
GDR3F305.241
*CALL CHISTORY
GDR3F305.242
*CALL CCONTROL
GDR3F305.243
*CALL CTIME
GDR3F305.244
*CALL C_MDI
GDR3F305.245
*CALL CENVIR
INBOUND1.48
*CALL CTRACERA
ARB1F404.333
INBOUND1.49
C Local variables INBOUND1.50
INBOUND1.51
INTEGER INBOUND1.52
& I, ! INBOUND1.53
& J, ! INBOUND1.54
& J1, ! INBOUND1.55
& START_BLOCK, ! GDR1F404.3
& NFTIN, ! INBOUND1.57
& DAYS,SECS, ! Various clock times TJ080294.264
& DAYS_DATA_START,SECS_DATA_START, ! related to time range TJ080294.265
& DAYS_DATA_END,SECS_DATA_END, ! of data files TJ080294.266
& ELAPSED_STEPS, ! Elapsed timesteps from data start time TJ080294.267
& DATA_TO_SKIP ! no of data times from first entry in lookup INBOUND1.66
C table to current model time INBOUND1.67
&, BASISMDATA_STEPS ! model basis time minus first data time INBOUND1.68
&, INTERVAL ! time interval between data times (seconds) INBOUND1.69
&, PERIOD ! length of periodic data set (seconds) INBOUND1.70
&, im_index ! internal model index ARB1F404.334
&, ITEM_BOUNDA(RIM_LOOKUPSA) ! boundary updatable item list ARB1F404.335
INBOUND1.71
*IF DEF,ATMOS,AND,-DEF,GLOBAL @DYALLOC.1288
REAL A_LEVDEPC_BO(A_LEN1_LEVDEPCDA,A_LEN2_LEVDEPCDA) GDR1F404.4
*ENDIF @DYALLOC.1290
*IF DEF,OCEAN,AND,DEF,BOUNDSO @DYALLOC.1291
REAL O_LEVDEPC_BO(O_LEN1_LEVDEPCDA,O_LEN2_LEVDEPCDA) GDR1F404.5
*ENDIF @DYALLOC.1293
INTEGER DUMMY APB4F401.399
DATA DUMMY /1/ APB4F401.400
INBOUND1.75
*IF DEF,MPP APB4F401.401
*CALL PARVARS
APB4F401.402
*ENDIF APB4F401.403
INBOUND1.76
CL Subroutines called: INBOUND1.77
INBOUND1.78
EXTERNAL INBOUND1.79
& TIME2SEC,TIM2STEP GDR6F405.27
! & ,PR_REHDA ! Commented out in routine GDR6F405.28
*IF DEF,ATMOS,AND,-DEF,GLOBAL,OR,DEF,ATMOS,AND,DEF,FLOOR GDR6F405.29
& ,CHK_LOOK_BOUNDA GDR6F405.30
*ENDIF GDR6F405.31
INBOUND1.82
CL Functions called: TJ080294.269
TJ080294.270
EXTERNAL TJ080294.271
& TIME_EQ,TIME_LT TJ080294.272
TJ080294.273
LOGICAL TIME_EQ,TIME_LT TJ080294.274
TJ080294.275
NAMELIST/BOUNCNST/BOUND_FIELDCODE,RIMWEIGHTSA,RIMWEIGHTSO INBOUND1.83
INBOUND1.84
REAL P1,P2 INBOUND1.85
LOGICAL LNER INBOUND1.86
LNER(P1,P2) = ((ABS(P1-P2)) .GT. (1.E-6*ABS(P1+P2))) INBOUND1.87
INBOUND1.88
INBOUND1.89
CL Internal Structure INBOUND1.90
INBOUND1.91
ICODE=0 INBOUND1.92
CMESSAGE=' ' INBOUND1.93
INBOUND1.94
*IF DEF,ATMOS,AND,-DEF,GLOBAL,OR,DEF,OCEAN,AND,DEF,BOUNDSO INBOUND1.95
INBOUND1.96
! Rewind file and read namelist for boundary updating constants GDR3F305.246
INBOUND1.98
REWIND 5 GDR3F305.247
READ(5,BOUNCNST) INBOUND1.99
INBOUND1.100
*ENDIF INBOUND1.101
CL 1.0 Initialise variables in COMMON/CBND/, lest undefined for some RB300393.33
CL choices of boundary updating, eg. -DEF,GLOBAL but not DEF,FLOOR, RB300393.34
CL as used in section 2 to set BOUNDARY_STEPSim for atmos GDR5F305.33
RIM_STEPSA = 0 RB300393.36
RIM_STEPSO = 0 RB300393.37
FLOOR_STEPSA = 0 RB300393.38
! Initialise bndary_offset for all internal model ids. GOK1F401.3
DO I=1,INTERNAL_ID_MAX GOK1F401.4
BNDARY_OFFSETim(I) = 0 GOK1F401.5
END DO GOK1F401.6
GOK1F401.7
*IF DEF,ATMOS,AND,-DEF,GLOBAL INBOUND1.102
INBOUND1.103
CL 1.1 Update interval for lateral boundaries for atmosphere INBOUND1.104
CL Read headers and test whether boundary updating required INBOUND1.105
INBOUND1.106
RIM_STEPSA =IMDI INBOUND1.107
IF ( BOUND_FIELDCODE(1).LE.0) THEN INBOUND1.108
RIM_STEPSA=0 INBOUND1.109
ELSE INBOUND1.110
INBOUND1.111
C Check that space has been reserved for boundary tendencies INBOUND1.112
INBOUND1.113
IF(JRIM.LE.0.OR.JRIM_TENDENCY.LE.0) THEN INBOUND1.114
ICODE= 1 INBOUND1.115
CMESSAGE=' INBOUND: No space reserved for boundary data' INBOUND1.116
RETURN INBOUND1.117
END IF INBOUND1.118
INBOUND1.119
CL Open input boundary file and read headers INBOUND1.120
INBOUND1.121
NFTIN=95 INBOUND1.122
APB4F401.404
NBOUND_LOOKUP(1)=1 APB4F401.405
INBOUND1.123
CALL FILE_OPEN
(NFTIN,FT_ENVIRON(NFTIN), GPB1F305.49
* LEN_FT_ENVIR(NFTIN),0,0,ICODE) INBOUND1.125
IF(ICODE.NE.0) THEN INBOUND1.126
CMESSAGE=' IN_BOUND: Failure of opening boundary file' INBOUND1.127
RETURN INBOUND1.128
ENDIF INBOUND1.129
INBOUND1.130
C Read in fixed header to get array dimensions APB4F401.406
CALL READ_FLH
(NFTIN,FIXHD_BOUNDA(1,1),LEN_FIXHD,ICODE,CMESSAGE) APB4F401.407
IF (ICODE.GT.0) THEN APB4F401.408
WRITE (6,*) 'INBOUND : Error in READ_FLH for BOUNDA(1,1)' APB4F401.409
WRITE (6,*) 'ICODE ',ICODE,' CMESSAGE ',CMESSAGE APB4F401.410
GO TO 9999 ! Return APB4F401.411
ENDIF APB4F401.412
APB4F401.413
C Check for negative dimensions APB4F401.414
IF (FIXHD_BOUNDA(101,1).LE.0) FIXHD_BOUNDA(101,1)=1 APB4F401.415
IF (FIXHD_BOUNDA(106,1).LE.0) FIXHD_BOUNDA(106,1)=1 APB4F401.416
IF (FIXHD_BOUNDA(111,1).LE.0) FIXHD_BOUNDA(111,1)=1 APB4F401.417
IF (FIXHD_BOUNDA(112,1).LE.0) FIXHD_BOUNDA(112,1)=1 APB4F401.418
IF (FIXHD_BOUNDA(151,1).LE.0) FIXHD_BOUNDA(151,1)=1 APB4F401.419
IF (FIXHD_BOUNDA(152,1).LE.0) FIXHD_BOUNDA(152,1)=1 APB4F401.420
IF (FIXHD_BOUNDA(161,1).LE.0) FIXHD_BOUNDA(161,1)=1 APB4F401.421
APB4F401.422
! Check if sufficient space allocated for LOOKUP table APB4F401.423
IF (FIXHD_BOUNDA(152,1).GT.BOUND_LOOKUPSA) THEN APB4F401.424
write(6,*)' IN_BOUND; not enough space for LBC lookup headers.' ARB1F404.336
write(6,*)' try increasing value specified in umui' ARB1F404.337
write(6,*)' window atmos_Infile_Options_Headers' ARB1F404.338
CMESSAGE = 'INBOUND: Insufficient space for Lookup Table' APB4F401.425
ICODE = 2 APB4F401.426
GO TO 9999 ! Return APB4F401.427
ENDIF APB4F401.428
APB4F401.429
CALL SETPOS
(NFTIN,0,ICODE) APB4F401.430
IF (ICODE.GT.0) THEN APB4F401.431
WRITE (6,*) 'INBOUND: Problem with SETPOS for BOUNDA(1,1)' APB4F401.432
WRITE (6,*) 'ICODE ',ICODE,' NFTIN ',NFTIN APB4F401.433
GO TO 9999 ! Return APB4F401.434
ENDIF APB4F401.435
APB4F401.436
CALL READHEAD
(NFTIN, APB4F401.437
& FIXHD_BOUNDA(1,1),LEN_FIXHD, APB4F401.438
& INTHD_BOUNDA(1,1),FIXHD_BOUNDA(101,1), APB4F401.439
& REALHD_BOUNDA(1,1),FIXHD_BOUNDA(106,1), APB4F401.440
& A_LEVDEPC_BO(1,1), APB4F401.441
& FIXHD_BOUNDA(111,1),FIXHD_BOUNDA(112,1), APB4F401.442
& DUMMY,DUMMY,DUMMY, APB4F401.443
& DUMMY,DUMMY,DUMMY, APB4F401.444
& DUMMY,DUMMY,DUMMY, APB4F401.445
& DUMMY,DUMMY, APB4F401.446
& DUMMY,DUMMY, APB4F401.447
& DUMMY,DUMMY, APB4F401.448
& DUMMY,DUMMY, APB4F401.449
& DUMMY,DUMMY, APB4F401.450
& LOOKUP_BOUNDA(1,NBOUND_LOOKUP(1)), APB4F401.451
& FIXHD_BOUNDA(151,1),FIXHD_BOUNDA(152,1), APB4F401.452
& FIXHD_BOUNDA(161,1), APB4F401.453
*CALL ARGPPX
APB4F401.454
& START_BLOCK,ICODE,CMESSAGE) GDR1F404.7
APB4F401.456
IF (ICODE.GT.0) THEN APB4F401.457
WRITE (6,*) 'INBOUND: Problem with READHEAD for BOUNDA(1,1)' APB4F401.458
WRITE (6,*) 'ICODE ',ICODE,' CMESSAGE ',CMESSAGE APB4F401.459
GO TO 9999 ! Return APB4F401.460
ENDIF APB4F401.461
APB4F401.462
INBOUND1.146
C Check validity of data and print out fixed header information INBOUND1.147
C Allow variable length of data and level dependent constants INBOUND1.148
C in boundary data set.Do not check other constants arrays. INBOUND1.149
WRITE(6,*) ' HEADER FOR LATERAL BOUNDARY DATASET - ATMOSPHERE' INBOUND1.150
INBOUND1.151
CL 1.1.2 Buffer in integer constants INBOUND1.162
INBOUND1.163
IF(FIXHD_BOUNDA(100,1).GT.0) THEN INBOUND1.164
INBOUND1.165
*IF -DEF,MPP APB4F401.463
IF(INTHD_BOUNDA(6,1).NE.ROW_LENGTH) THEN INBOUND1.197
WRITE(6,*)'Mismatch in row_length:data set has',INTHD_BOUNDA GIE0F403.303
& (6,1),'required value is',ROW_LENGTH INBOUND1.199
*ELSE APB4F401.464
IF(INTHD_BOUNDA(6,1).NE.glsize(1)) THEN APB4F401.465
WRITE(6,*)'Mismatch in row_length:data set has',INTHD_BOUNDA GIE0F403.304
& (6,1),'required value is',glsize(1) APB4F401.467
*ENDIF APB4F401.468
ICODE=5 INBOUND1.200
CMESSAGE='IN_BOUND:integer header error' INBOUND1.201
RETURN INBOUND1.202
END IF INBOUND1.203
INBOUND1.204
*IF -DEF,MPP APB4F401.469
IF(INTHD_BOUNDA(7,1).NE.P_ROWS) THEN INBOUND1.205
WRITE(6,*)'Mismatch in numbers of rows:data set GIE0F403.305
& has',INTHD_BOUNDA(7,1),'required values are', INBOUND1.207
& P_ROWS INBOUND1.208
*ELSE APB4F401.470
IF(INTHD_BOUNDA(7,1).NE.glsize(2)) THEN APB4F401.471
WRITE(6,*)'Mismatch in numbers of rows:data set GIE0F403.306
& has',INTHD_BOUNDA(7,1),'required values are', APB4F401.473
& glsize(2) APB4F401.474
*ENDIF APB4F401.475
ICODE=6 INBOUND1.209
CMESSAGE='IN_BOUND:integer header error' INBOUND1.210
RETURN INBOUND1.211
END IF INBOUND1.212
INBOUND1.213
IF(ICODE.GT.0) RETURN INBOUND1.214
INBOUND1.215
END IF INBOUND1.216
INBOUND1.217
CL 1.1.3 Buffer in real constants INBOUND1.218
INBOUND1.219
IF(FIXHD_BOUNDA(105,1).GT.0) THEN INBOUND1.220
INBOUND1.221
C Check validity of real data and print out information INBOUND1.247
INBOUND1.248
C CALL PR_REHDA(REALHD_BOUNDA(1,1),PP_LEN_REALHD) INBOUND1.249
INBOUND1.250
DO 113 J=1,6 INBOUND1.251
! Check real headers agree to near 32 bit accuracy GDR5F305.34
IF(LNER(REALHD_BOUNDA(J,1),A_REALHD(J))) THEN GDR5F305.35
WRITE(6,*)'Mismatch in real header position',J,'data set GIE0F403.307
& has',REALHD_BOUNDA(J,1),'required value is:',A_ INBOUND1.254
& REALHD(J) INBOUND1.255
ICODE=9 INBOUND1.256
CMESSAGE=' INBOUND: Real header error.' INBOUND1.257
RETURN INBOUND1.258
END IF INBOUND1.259
113 CONTINUE INBOUND1.260
INBOUND1.261
END IF INBOUND1.262
INBOUND1.263
CL 1.1.4 Buffer in level dependent constants INBOUND1.264
INBOUND1.265
IF(FIXHD_BOUNDA(110,1).GT.0) THEN INBOUND1.266
INBOUND1.267
CL check against model levels INBOUND1.294
INBOUND1.295
DO J=1,P_LEVELS INBOUND1.296
DO J1=1,FIXHD_BOUNDA(112,1) INBOUND1.297
IF(LNER(A_LEVDEPC_BO(J,J1), @DYALLOC.1297
& A_LEVDEPC(J+(J1-1)*A_LEN1_LEVDEPC))) THEN @DYALLOC.1298
WRITE(6,*)'INBOUND:Error in level dependent constants' GIE0F403.308
WRITE(6,*)'level=',J,' Position=',J1 GIE0F403.309
WRITE(6,*)'Value in model = ', GIE0F403.310
& A_LEVDEPC(J+(J1-1)*A_LEN1_LEVDEPC) INBOUND1.303
WRITE(6,*)'Value in lateral bound. data =',A_LEVDEPC_BO(J,J1) GIE0F403.311
ICODE=100 INBOUND1.305
CMESSAGE='INBOUND : error in A_LEVDEPC_BO.' @DYALLOC.1300
RETURN INBOUND1.307
END IF INBOUND1.308
END DO INBOUND1.309
END DO INBOUND1.310
INBOUND1.311
END IF INBOUND1.312
CL Set update interval INBOUND1.313
C If update interval includes months or years, a 360 day INBOUND1.314
C calender assumed. INBOUND1.315
INBOUND1.316
RIM_STEPSA=(FIXHD_BOUNDA(35,1)*8640+FIXHD_BOUNDA(36,1)*720 INBOUND1.317
& +FIXHD_BOUNDA(37,1)*24+FIXHD_BOUNDA(38,1)) GDR3F305.248
& *3600*STEPS_PER_PERIODim(a_im)/SECS_PER_PERIODim(a_im) GDR3F305.249
INBOUND1.319
END IF INBOUND1.320
INBOUND1.321
*ENDIF INBOUND1.322
INBOUND1.323
*IF DEF,OCEAN,AND,DEF,BOUNDSO INBOUND1.324
INBOUND1.325
CL 1.2 Update interval for lateral boundaries for ocean INBOUND1.326
CL Read headers and test whether boundary updating required INBOUND1.327
INBOUND1.328
RIM_STEPSO =IMDI INBOUND1.329
IF ( BOUND_FIELDCODE(2).LE.0) THEN INBOUND1.330
RIM_STEPSO=0 INBOUND1.331
ELSE INBOUND1.332
INBOUND1.333
C Check that space has been reserved for boundary tendencies INBOUND1.334
INBOUND1.335
IF(joc_bounds_prev.LE.0.OR.joc_bounds_next.LE.0) THEN GSI1F405.159
ICODE= 1 INBOUND1.337
CMESSAGE=' INBOUND: No space reserved for ocean bndry data' INBOUND1.338
RETURN INBOUND1.339
END IF INBOUND1.340
INBOUND1.341
CL Open input boundary file and read headers INBOUND1.342
INBOUND1.343
NFTIN=98 INBOUND1.344
GDR1F404.8
NBOUND_LOOKUP(2)=1 GDR1F404.9
INBOUND1.345
CALL FILE_OPEN
(NFTIN,FT_ENVIRON(NFTIN), GPB1F305.50
* LEN_FT_ENVIR(NFTIN),0,0,ICODE) INBOUND1.347
IF(ICODE.NE.0) THEN INBOUND1.348
CMESSAGE=' IN_BOUND: Failure of opening boundary file' INBOUND1.349
RETURN INBOUND1.350
ENDIF INBOUND1.351
INBOUND1.352
! Read in fixed header to get array dimensions GDR1F404.10
CALL READ_FLH
(NFTIN,FIXHD_BOUNDO(1,1),LEN_FIXHD,ICODE,CMESSAGE) GDR1F404.11
IF (ICODE.GT.0) THEN GDR1F404.12
WRITE (6,*) 'INBOUND : Error in READ_FLH for BOUNDO(1,1)' GDR1F404.13
WRITE (6,*) 'ICODE ',ICODE,' CMESSAGE ',CMESSAGE GDR1F404.14
GO TO 9999 ! Return GDR1F404.15
ENDIF GDR1F404.16
GDR1F404.17
! Check for negative dimensions GDR1F404.18
IF (FIXHD_BOUNDO(101,1).LE.0) FIXHD_BOUNDO(101,1)=1 GDR1F404.19
IF (FIXHD_BOUNDO(106,1).LE.0) FIXHD_BOUNDO(106,1)=1 GDR1F404.20
IF (FIXHD_BOUNDO(111,1).LE.0) FIXHD_BOUNDO(111,1)=1 GDR1F404.21
IF (FIXHD_BOUNDO(112,1).LE.0) FIXHD_BOUNDO(112,1)=1 GDR1F404.22
IF (FIXHD_BOUNDO(151,1).LE.0) FIXHD_BOUNDO(151,1)=1 GDR1F404.23
IF (FIXHD_BOUNDO(152,1).LE.0) FIXHD_BOUNDO(152,1)=1 GDR1F404.24
IF (FIXHD_BOUNDO(161,1).LE.0) FIXHD_BOUNDO(161,1)=1 GDR1F404.25
GDR1F404.26
! Check if sufficient space allocated for LOOKUP table GDR1F404.27
IF (FIXHD_BOUNDO(152,1).GT.BOUND_LOOKUPSO) THEN GDR1F404.28
CMESSAGE = 'INBOUND: Insufficient space for Lookup Table' GDR1F404.29
ICODE = 2 GDR1F404.30
GO TO 9999 ! Return GDR1F404.31
ENDIF GDR1F404.32
GDR1F404.33
CALL SETPOS
(NFTIN,0,ICODE) GDR1F404.34
IF (ICODE.GT.0) THEN GDR1F404.35
WRITE (6,*) 'INBOUND: Problem with SETPOS for BOUNDO(1,1)' GDR1F404.36
WRITE (6,*) 'ICODE ',ICODE,' NFTIN ',NFTIN GDR1F404.37
GO TO 9999 ! Return GDR1F404.38
ENDIF GDR1F404.39
GDR1F404.40
CALL READHEAD
(NFTIN, GDR1F404.41
& FIXHD_BOUNDO(1,1),LEN_FIXHD, GDR1F404.42
& INTHD_BOUNDO(1,1),FIXHD_BOUNDO(101,1), GDR1F404.43
& REALHD_BOUNDO(1,1),FIXHD_BOUNDO(106,1), GDR1F404.44
& O_LEVDEPC_BO(1,1), GDR1F404.45
& FIXHD_BOUNDO(111,1),FIXHD_BOUNDO(112,1), GDR1F404.46
& DUMMY,DUMMY,DUMMY, GDR1F404.47
& DUMMY,DUMMY,DUMMY, GDR1F404.48
& DUMMY,DUMMY,DUMMY, GDR1F404.49
& DUMMY,DUMMY, GDR1F404.50
& DUMMY,DUMMY, GDR1F404.51
& DUMMY,DUMMY, GDR1F404.52
& DUMMY,DUMMY, GDR1F404.53
& DUMMY,DUMMY, GDR1F404.54
& LOOKUP_BOUNDO(1,NBOUND_LOOKUP(2)), GDR1F404.55
& FIXHD_BOUNDO(151,1),FIXHD_BOUNDO(152,1), GDR1F404.56
& FIXHD_BOUNDO(161,1), GDR1F404.57
*CALL ARGPPX
GDR1F404.58
& START_BLOCK,ICODE,CMESSAGE) GDR1F404.59
GDR1F404.60
IF (ICODE.GT.0) THEN GDR1F404.61
WRITE (6,*) 'INBOUND: Problem with READHEAD for BOUNDO(1,1)' GDR1F404.62
WRITE (6,*) 'ICODE ',ICODE,' CMESSAGE ',CMESSAGE GDR1F404.63
GO TO 9999 ! Return GDR1F404.64
ENDIF GDR1F404.65
INBOUND1.477
CL Set update interval INBOUND1.478
INBOUND1.479
INTERVAL=(FIXHD_BOUNDO(35,1)*8640*3600+ INBOUND1.480
& FIXHD_BOUNDO(36,1)*720*3600+FIXHD_BOUNDO(37,1)*24*3600+ INBOUND1.481
& FIXHD_BOUNDO(38,1)*3600) INBOUND1.482
RIM_STEPSO=(INTERVAL*STEPS_PER_PERIODim(o_im))/ GDR3F305.250
& SECS_PER_PERIODim(o_im) GDR3F305.251
INBOUND1.484
END IF INBOUND1.485
INBOUND1.486
*ENDIF INBOUND1.487
INBOUND1.488
INBOUND1.489
*IF DEF,ATMOS,AND,DEF,FLOOR INBOUND1.490
INBOUND1.491
CL 1.3 Set update interval for lower boundary update for atmosphere INBOUND1.492
C Assume all lower boundary fields updated together INBOUND1.493
INBOUND1.494
FLOOR_STEPSA=IMDI INBOUND1.495
IF ( BOUND_FIELDCODE(3).LE.0) THEN INBOUND1.496
FLOOR_STEPSA=0 INBOUND1.497
ELSE INBOUND1.498
CL Open input boundary file and read headers INBOUND1.499
INBOUND1.500
NFTIN=96 INBOUND1.501
GDR1F404.66
NBOUND_LOOKUP(3)=1 GDR1F404.67
INBOUND1.502
CALL FILE_OPEN
(NFTIN,FT_ENVIRON(NFTIN), GPB1F305.51
* LEN_FT_ENVIR(NFTIN),0,0,ICODE) INBOUND1.504
IF(ICODE.NE.0) THEN INBOUND1.505
CMESSAGE=' IN_BOUND: Failure of opening boundary file' INBOUND1.506
RETURN INBOUND1.507
ENDIF INBOUND1.508
INBOUND1.509
! Read in fixed header to get array dimensions GDR1F404.68
CALL READ_FLH
(NFTIN,FIXHD_BOUNDA(1,2),LEN_FIXHD,ICODE,CMESSAGE) GDR1F404.69
IF (ICODE.GT.0) THEN GDR1F404.70
WRITE (6,*) 'INBOUND : Error in READ_FLH for BOUNDA(1,2)' GDR1F404.71
WRITE (6,*) 'ICODE ',ICODE,' CMESSAGE ',CMESSAGE GDR1F404.72
GO TO 9999 ! Return GDR1F404.73
ENDIF GDR1F404.74
GDR1F404.75
! Check for negative dimensions GDR1F404.76
IF (FIXHD_BOUNDA(101,2).LE.0) FIXHD_BOUNDA(101,2)=1 GDR1F404.77
IF (FIXHD_BOUNDA(106,2).LE.0) FIXHD_BOUNDA(106,2)=1 GDR1F404.78
IF (FIXHD_BOUNDA(111,2).LE.0) FIXHD_BOUNDA(111,2)=1 GDR1F404.79
IF (FIXHD_BOUNDA(112,2).LE.0) FIXHD_BOUNDA(112,2)=1 GDR1F404.80
IF (FIXHD_BOUNDA(151,2).LE.0) FIXHD_BOUNDA(151,2)=1 GDR1F404.81
IF (FIXHD_BOUNDA(152,2).LE.0) FIXHD_BOUNDA(152,2)=1 GDR1F404.82
IF (FIXHD_BOUNDA(161,2).LE.0) FIXHD_BOUNDA(161,2)=1 GDR1F404.83
GDR1F404.84
! Check if sufficient space allocated for LOOKUP table GDR1F404.85
IF (FIXHD_BOUNDA(152,2).GT.BOUND_LOOKUPSA) THEN GDR1F404.86
CMESSAGE = 'INBOUND: Insufficient space for Lookup Table' GDR1F404.87
ICODE = 2 GDR1F404.88
GO TO 9999 ! Return GDR1F404.89
ENDIF GDR1F404.90
GDR1F404.91
CALL SETPOS
(NFTIN,0,ICODE) GDR1F404.92
IF (ICODE.GT.0) THEN GDR1F404.93
WRITE (6,*) 'INBOUND: Problem with SETPOS for BOUNDA(1,2)' GDR1F404.94
WRITE (6,*) 'ICODE ',ICODE,' NFTIN ',NFTIN GDR1F404.95
GO TO 9999 ! Return GDR1F404.96
ENDIF GDR1F404.97
GDR1F404.98
CALL READHEAD
(NFTIN, GDR1F404.99
& FIXHD_BOUNDA(1,2),LEN_FIXHD, GDR1F404.100
& INTHD_BOUNDA(1,2),FIXHD_BOUNDA(101,2), GDR1F404.101
& REALHD_BOUNDA(1,2),FIXHD_BOUNDA(106,2), GDR1F404.102
& A_LEVDEPC_BO(1,2), GDR1F404.103
& FIXHD_BOUNDA(111,2),FIXHD_BOUNDA(112,2), GDR1F404.104
& DUMMY,DUMMY,DUMMY, GDR1F404.105
& DUMMY,DUMMY,DUMMY, GDR1F404.106
& DUMMY,DUMMY,DUMMY, GDR1F404.107
& DUMMY,DUMMY, GDR1F404.108
& DUMMY,DUMMY, GDR1F404.109
& DUMMY,DUMMY, GDR1F404.110
& DUMMY,DUMMY, GDR1F404.111
& DUMMY,DUMMY, GDR1F404.112
& LOOKUP_BOUNDA(1,NBOUND_LOOKUP(3)), GDR1F404.113
& FIXHD_BOUNDA(151,2),FIXHD_BOUNDA(152,2), GDR1F404.114
& FIXHD_BOUNDA(161,2), GDR1F404.115
*CALL ARGPPX
GDR1F404.116
& START_BLOCK,ICODE,CMESSAGE) GDR1F404.117
GDR1F404.118
IF (ICODE.GT.0) THEN GDR1F404.119
WRITE (6,*) 'INBOUND: Problem with READHEAD for BOUNDA(1,2)' GDR1F404.120
WRITE (6,*) 'ICODE ',ICODE,' CMESSAGE ',CMESSAGE GDR1F404.121
GO TO 9999 ! Return GDR1F404.122
ENDIF GDR1F404.123
INBOUND1.541
IF(FIXHD_BOUNDA(100,2).GT.0) THEN INBOUND1.542
INBOUND1.568
IF(INTHD_BOUNDA(6,2).NE.ROW_LENGTH) THEN INBOUND1.575
WRITE(6,*)'Mismatch in row_length:data set has',INTHD_BOUNDA GIE0F403.312
& (6,2),'required value is',ROW_LENGTH INBOUND1.577
ICODE=15 INBOUND1.578
CMESSAGE='IN_BOUND:integer header error' INBOUND1.579
RETURN INBOUND1.580
END IF INBOUND1.581
INBOUND1.582
IF(INTHD_BOUNDA(7,2).NE.P_ROWS) THEN INBOUND1.583
WRITE(6,*)'Mismatch in numbers of rows:data set GIE0F403.313
& has',INTHD_BOUNDA(7,2),'required values are', INBOUND1.585
& P_ROWS INBOUND1.586
ICODE=16 INBOUND1.587
CMESSAGE='IN_BOUND:integer header error' INBOUND1.588
RETURN INBOUND1.589
END IF INBOUND1.590
INBOUND1.591
IF(ICODE.GT.0) RETURN INBOUND1.592
INBOUND1.593
END IF INBOUND1.594
INBOUND1.595
IF(FIXHD_BOUNDA(105,2).GT.0) THEN INBOUND1.598
INBOUND1.599
C Check validity of integer data and print out information INBOUND1.625
INBOUND1.626
C CALL PR_REHDA(REALHD_BOUNDA(1,2),PP_LEN_REALHD) INBOUND1.627
INBOUND1.628
DO 133 J=1,6 INBOUND1.629
IF(REALHD_BOUNDA(J,2).NE.A_REALHD(J)) THEN INBOUND1.630
WRITE(6,*)'Mismatch in real header position',J,'data set GIE0F403.314
& has',REALHD_BOUNDA(J,2),'required value is:',A_ INBOUND1.632
& REALHD(J) INBOUND1.633
ICODE=19 INBOUND1.634
CMESSAGE=' INBOUND: Real header error.' INBOUND1.635
RETURN INBOUND1.636
END IF INBOUND1.637
133 CONTINUE INBOUND1.638
INBOUND1.639
INBOUND1.640
END IF INBOUND1.641
INBOUND1.642
CL Set update interval INBOUND1.643
C If update interval includes months or years, a 360 day INBOUND1.644
C calender assumed. INBOUND1.645
FLOOR_STEPSA=(FIXHD_BOUNDA(35,2)*8640+FIXHD_BOUNDA(36,2)*720 INBOUND1.646
& +FIXHD_BOUNDA(37,2)*24+FIXHD_BOUNDA(38,2)) GDR3F305.252
& *3600*STEPS_PER_PERIODim(a_im)/SECS_PER_PERIODim(a_im) GDR3F305.253
END IF INBOUND1.648
INBOUND1.649
*ENDIF INBOUND1.650
INBOUND1.651
*IF DEF,OCEAN,AND,DEF,FLOOR INBOUND1.652
INBOUND1.653
INBOUND1.654
CL 1.4 Set update interval for lower boundary update for ocean INBOUND1.655
INBOUND1.656
C NOT YET AVAILABLE INBOUND1.657
GDR5F305.36
C Assign value to INTERVAL to prevent error message GDR5F305.37
C when compiling for OCEAN/FLOOR GDR5F305.38
GDR5F305.39
INTERVAL = 1 ! Temporary value GDR5F305.40
INBOUND1.658
*ENDIF INBOUND1.659
INBOUND1.660
*IF DEF,ATMOS,AND,-DEF,GLOBAL,OR,DEF,ATMOS,AND,DEF,FLOOR INBOUND1.661
INBOUND1.662
CL 2 Set interval for setting any boundary field INBOUND1.663
INBOUND1.664
IF (RIM_STEPSA.EQ.FLOOR_STEPSA ) THEN INBOUND1.665
BOUNDARY_STEPSim(a_im) = RIM_STEPSA GDR5F305.41
ELSE IF ( RIM_STEPSA.EQ.0 ) THEN INBOUND1.667
BOUNDARY_STEPSim(a_im) = FLOOR_STEPSA GDR5F305.42
ELSE IF ( FLOOR_STEPSA.EQ.0 ) THEN INBOUND1.669
BOUNDARY_STEPSim(a_im) = RIM_STEPSA GDR5F305.43
ELSE IF ( RIM_STEPSA.LT.FLOOR_STEPSA ) THEN INBOUND1.671
INBOUND1.672
IF ( MOD(FLOOR_STEPSA,RIM_STEPSA).EQ.0) THEN INBOUND1.673
BOUNDARY_STEPSim(a_im) = RIM_STEPSA GDR5F305.44
ELSE INBOUND1.675
INBOUND1.676
DO 200 I=RIM_STEPSA,1,-1 INBOUND1.677
INBOUND1.678
IF (MOD(FLOOR_STEPSA,I).EQ.0.AND.MOD(RIM_STEPSA,I).EQ.0) THEN INBOUND1.679
BOUNDARY_STEPSim(a_im)=I GDR5F305.45
END IF INBOUND1.681
INBOUND1.682
200 CONTINUE INBOUND1.683
INBOUND1.684
END IF INBOUND1.685
INBOUND1.686
ELSE IF (FLOOR_STEPSA.LT.RIM_STEPSA) THEN INBOUND1.687
INBOUND1.688
IF(MOD(RIM_STEPSA,FLOOR_STEPSA).EQ.0) THEN INBOUND1.689
BOUNDARY_STEPSim(a_im)=FLOOR_STEPSA GDR5F305.46
ELSE INBOUND1.691
INBOUND1.692
DO 210 I=FLOOR_STEPSA,1,-1 INBOUND1.693
INBOUND1.694
IF(MOD(FLOOR_STEPSA,I).EQ.0.AND.MOD(RIM_STEPSA,I).EQ.0) THEN INBOUND1.695
BOUNDARY_STEPSim(a_im) = I GDR5F305.47
END IF INBOUND1.697
INBOUND1.698
210 CONTINUE INBOUND1.699
INBOUND1.700
END IF INBOUND1.701
INBOUND1.702
END IF INBOUND1.703
INBOUND1.704
CL 3 Check LOOKUP Table GDR1F404.124
INBOUND1.706
J1=0 INBOUND1.707
IF (BOUND_FIELDCODE(1).NE.0) THEN INBOUND1.708
J1=FIXHD_BOUNDA(152,1) INBOUND1.710
INBOUND1.711
IF(FIXHD_BOUNDA(150,1).GT.0) THEN INBOUND1.716
INBOUND1.717
! Set up list of variables expected to be boundary updated. ARB1F404.339
ITEM_BOUNDA(1) = 1 ! Pstar ARB1F404.340
ITEM_BOUNDA(2) = 2 ! u-compt wind ARB1F404.341
ITEM_BOUNDA(3) = 3 ! v-compt wind ARB1F404.342
ITEM_BOUNDA(4) = 5 ! thetal ARB1F404.343
ITEM_BOUNDA(5) = 11 ! qt ARB1F404.344
IF (TR_VARS .gt. 0) THEN ARB1F404.345
! Find STASH item no. for each tracer in use. ARB1F404.346
I=0 ! count tracers in use ARB1F404.347
im_index=internal_model_index(A_IM) ARB1F404.348
DO J = A_TRACER_FIRST,A_TRACER_LAST ARB1F404.349
IF (SI(J,0,im_index).NE.1) THEN ! tracer is in use ARB1F404.350
I = I+1 ARB1F404.351
ITEM_BOUNDA(5+I) = J ARB1F404.352
END IF ARB1F404.353
END DO ARB1F404.354
! Number of tracers found should correspond to TR_VARS ARB1F404.355
IF (I.NE.TR_VARS) THEN ARB1F404.356
WRITE(6,*)' INBOUND: no.of tracers found, ',I, ARB1F404.357
& ', differs from TR_VARS, ',TR_VARS ARB1F404.358
CMESSAGE=' INBOUND: inconsistency in number of tracers' ARB1F404.359
ICODE = 100 ARB1F404.360
GO TO 9999 ARB1F404.361
END IF ARB1F404.362
END IF ARB1F404.363
IF (L_LSPICE_BDY) THEN ! mixed phase precipitation scheme ARB1F404.364
ITEM_BOUNDA(6+TR_VARS) = 12 ! qcf (cloud ice) ARB1F404.365
END IF ARB1F404.366
C Check LOOKUP for consistency INBOUND1.750
CALL CHK_LOOK_BOUNDA
(ITEM_BOUNDA,RIM_LOOKUPSA, ARB1F404.367
*CALL ARGSIZE
@DYALLOC.1303
*CALL ARGBND
@DYALLOC.1304
*CALL ARGPPX
GDG0F401.802
& ICODE,CMESSAGE) @DYALLOC.1305
INBOUND1.752
CL Find start position in lookup tables INBOUND1.753
INBOUND1.754
CALL TIME2SEC
(I_YEAR,I_MONTH,I_DAY,I_HOUR,I_MINUTE,I_SECOND, INBOUND1.755
& BASIS_TIME_DAYS,BASIS_TIME_SECS,DAYS,SECS, GSS1F304.373
& LCAL360) GSS1F304.374
CALL TIME2SEC
(FIXHD_BOUNDA(21,1),FIXHD_BOUNDA(22,1),FIXHD_BOUNDA INBOUND1.757
& (23,1),FIXHD_BOUNDA(24,1),FIXHD_BOUNDA(25,1),FIXHD_BOUNDA( INBOUND1.758
& 26,1),BASIS_TIME_DAYS,BASIS_TIME_SECS, TJ080294.277
& DAYS_DATA_START,SECS_DATA_START,LCAL360) GSS1F304.375
INBOUND1.760
CALL TIME2SEC
(FIXHD_BOUNDA(28,1),FIXHD_BOUNDA(29,1),FIXHD_BOUNDA INBOUND1.761
& (30,1),FIXHD_BOUNDA(31,1),FIXHD_BOUNDA(32,1),FIXHD_BOUNDA( INBOUND1.762
& 33,1),BASIS_TIME_DAYS,BASIS_TIME_SECS, TJ080294.279
& DAYS_DATA_END,SECS_DATA_END,LCAL360) GSS1F304.376
INBOUND1.764
CALL TIM2STEP
(DAYS_DATA_START-DAYS,SECS_DATA_START-SECS, TJ080294.281
& STEPS_PER_PERIODim(a_im),SECS_PER_PERIODim(a_im), GDR3F305.254
& ELAPSED_STEPS) GDR3F305.255
TJ080294.283
IF((TIME_LT
(DAYS_DATA_START,SECS_DATA_START,DAYS,SECS) .OR. TJ080294.284
& TIME_EQ
(DAYS_DATA_START,SECS_DATA_START,DAYS,SECS)) .AND. TJ080294.285
& (TIME_LT
(DAYS,SECS,DAYS_DATA_END,SECS_DATA_END) .OR. TJ080294.286
& TIME_EQ
(DAYS,SECS,DAYS_DATA_END,SECS_DATA_END))) THEN TJ080294.287
NBOUND_LOOKUP(1)=-ELAPSED_STEPS*RIM_LOOKUPSA/RIM_STEPSA+1 TJ080294.288
IF (STEPim(a_im).GT.0) THEN GDR5F305.48
NBOUND_LOOKUP(1)=NBOUND_LOOKUP(1)+ RIM_LOOKUPSA INBOUND1.769
ENDIF INBOUND1.770
C Continuation run with new boundary data file INBOUND1.771
ELSE IF(ELAPSED_STEPS.EQ.RIM_STEPSA .AND. GDR5F305.49
& STEPim(a_im).GT.0) THEN GDR5F305.50
NBOUND_LOOKUP(1)=1 INBOUND1.774
ELSE IF(TIME_LT
(DAYS,SECS,DAYS_DATA_START,SECS_DATA_START)) TJ080294.290
& THEN TJ080294.291
CMESSAGE=' INBOUND: Model time preceeds 1st validty time of INBOUND1.776
&lateral boundary data' INBOUND1.777
ICODE=101 INBOUND1.778
RETURN INBOUND1.779
ELSE INBOUND1.780
CMESSAGE=' INBOUND: Model time after last validty time of INBOUND1.781
&lateral boundary data' INBOUND1.782
ICODE=102 INBOUND1.783
RETURN INBOUND1.784
ENDIF INBOUND1.785
INBOUND1.786
END IF INBOUND1.787
INBOUND1.788
END IF ! lateral boundary INBOUND1.789
INBOUND1.790
IF (BOUND_FIELDCODE(3).NE.0) THEN INBOUND1.791
J1=J1+1 INBOUND1.792
NBOUND_LOOKUP(3)=J1 INBOUND1.793
C J1 used to correctly position in LOOKUP_BOUNDA INBOUND1.794
INBOUND1.795
IF(FIXHD_BOUNDA(150,2).GT.0) THEN INBOUND1.800
INBOUND1.840
CL Find start position in lookup tables INBOUND1.841
INBOUND1.842
CALL TIME2SEC
(I_YEAR,I_MONTH,I_DAY,I_HOUR,I_MINUTE,I_SECOND, INBOUND1.843
& BASIS_TIME_DAYS,BASIS_TIME_SECS,DAYS,SECS, GSS1F304.377
& LCAL360) GSS1F304.378
CALL TIME2SEC
(FIXHD_BOUNDA(21,2),FIXHD_BOUNDA(22,2),FIXHD_BOUNDA INBOUND1.845
& (23,2),FIXHD_BOUNDA(24,2),FIXHD_BOUNDA(25,2),FIXHD_BOUNDA( INBOUND1.846
& 26,2),BASIS_TIME_DAYS,BASIS_TIME_SECS, TJ080294.293
& DAYS_DATA_START,SECS_DATA_START,LCAL360) GSS1F304.379
INBOUND1.848
IF (TIME_LT
(DAYS_DATA_START,SECS_DATA_START,DAYS,SECS) .OR. TJ080294.295
& TIME_EQ
(DAYS_DATA_START,SECS_DATA_START,DAYS,SECS)) THEN TJ080294.296
CALL TIM2STEP
(DAYS-DAYS_DATA_START,SECS-SECS_DATA_START, TJ080294.297
& STEPS_PER_PERIODim(a_im),SECS_PER_PERIODim(a_im), GDR3F305.256
& ELAPSED_STEPS) GDR3F305.257
NBOUND_LOOKUP(3)=ELAPSED_STEPS*FLOORFLDSA/FLOOR_STEPSA+ TJ080294.299
& NBOUND_LOOKUP(3) TJ080294.300
IF (STEPim(a_im).GT.0) THEN GDR5F305.51
NBOUND_LOOKUP(3)=NBOUND_LOOKUP(3)+ FLOORFLDSA INBOUND1.853
ENDIF INBOUND1.854
ELSE IF (TIME_LT
(DAYS,SECS,DAYS_DATA_START,SECS_DATA_START)) TJ080294.301
& THEN TJ080294.302
CMESSAGE=' INBOUND: Model time preceeds 1st validty time of INBOUND1.856
&lower boundary data' INBOUND1.857
ICODE=103 INBOUND1.858
RETURN INBOUND1.859
ENDIF INBOUND1.860
INBOUND1.861
END IF INBOUND1.862
INBOUND1.863
END IF INBOUND1.864
INBOUND1.865
*ENDIF INBOUND1.866
INBOUND1.867
*IF DEF,OCEAN,AND,DEF,BOUNDSO GSI1F405.160
INBOUND1.869
CL 2 Set interval for setting any boundary field INBOUND1.870
INBOUND1.871
BOUNDARY_STEPSim(o_im)=RIM_STEPSO GDR5F305.52
INBOUND1.873
CL 3 Check LOOKUP Table GDR1F404.125
INBOUND1.875
IF (BOUND_FIELDCODE(2).NE.0) THEN INBOUND1.876
INBOUND1.882
IF(FIXHD_BOUNDO(150,1).GT.0) THEN INBOUND1.883
GDR1F404.126
C Checking routine for lateral boundary data set not available yet INBOUND1.918
INBOUND1.919
INBOUND1.921
IF (FIXHD_BOUNDO(10,1).EQ.1) THEN ! timeseries data INBOUND1.922
INBOUND1.923
CALL TIME2SEC
(I_YEAR,I_MONTH,I_DAY,I_HOUR,I_MINUTE,I_SECOND, INBOUND1.924
& BASIS_TIME_DAYS,BASIS_TIME_SECS,DAYS,SECS, GSS1F304.380
& LCAL360) GSS1F304.381
CALL TIME2SEC
(FIXHD_BOUNDO(21,1),FIXHD_BOUNDO(22,1), INBOUND1.926
& FIXHD_BOUNDO(23,1),FIXHD_BOUNDO(24,1), INBOUND1.927
& FIXHD_BOUNDO(25,1),FIXHD_BOUNDO(26,1), INBOUND1.928
& BASIS_TIME_DAYS,BASIS_TIME_SECS, TJ080294.304
& DAYS_DATA_START,SECS_DATA_START,LCAL360) GSS1F304.382
CALL TIME2SEC
(FIXHD_BOUNDO(28,1),FIXHD_BOUNDO(29,1), INBOUND1.930
& FIXHD_BOUNDO(30,1),FIXHD_BOUNDO(31,1), INBOUND1.931
& FIXHD_BOUNDO(32,1),FIXHD_BOUNDO(33,1), INBOUND1.932
& BASIS_TIME_DAYS,BASIS_TIME_SECS, TJ080294.306
& DAYS_DATA_END,SECS_DATA_END,LCAL360) GSS1F304.383
CALL TIM2STEP
(DAYS-DAYS_DATA_START,SECS-SECS_DATA_START, TJ080294.308
& STEPS_PER_PERIODim(o_im),SECS_PER_PERIODim(o_im), GDR3F305.258
& ELAPSED_STEPS) TJ080294.310
INBOUND1.934
IF((TIME_LT
(DAYS_DATA_START,SECS_DATA_START,DAYS,SECS) .OR. TJ080294.311
& TIME_EQ
(DAYS_DATA_START,SECS_DATA_START,DAYS,SECS)) .AND. TJ080294.312
& (TIME_LT
(DAYS,SECS,DAYS_DATA_END,SECS_DATA_END) .OR. TJ080294.313
& TIME_EQ
(DAYS,SECS,DAYS_DATA_END,SECS_DATA_END))) THEN TJ080294.314
DATA_TO_SKIP=ELAPSED_STEPS/RIM_STEPSO TJ080294.315
ELSE IF(TIME_LT
(DAYS,SECS,DAYS_DATA_START,SECS_DATA_START)) GDR5F305.53
& THEN TJ080294.317
CMESSAGE=' INBOUND: Model time preceeds first validity time INBOUND1.939
&of lateral boundary data' INBOUND1.940
ICODE=101 INBOUND1.941
RETURN INBOUND1.942
ELSE INBOUND1.943
CMESSAGE=' INBOUND: Model time after last validity time of INBOUND1.944
&lateral boundary data' INBOUND1.945
ICODE=102 INBOUND1.946
RETURN INBOUND1.947
ENDIF INBOUND1.948
INBOUND1.949
GSI1F405.161
C Calculate no of steps from first data time to basis time GSI1F405.162
GSI1F405.163
CALL TIM2STEP
(-DAYS_DATA_START,-SECS_DATA_START, GSI1F405.164
& STEPS_PER_PERIODim(o_im),SECS_PER_PERIODim(o_im), GSI1F405.165
& BASISMDATA_STEPS) GSI1F405.166
GSI1F405.167
C Calculate no of steps of "previous" boundary time relative to the GSI1F405.168
C the model basis time GSI1F405.169
GSI1F405.170
O_BDY_STEP_PREV = DATA_TO_SKIP*RIM_STEPSO-BASISMDATA_STEPS GSI1F405.171
GSI1F405.172
C If this is a continuation step, boundary data has already been GSI1F405.173
C read into the dump and the first field to be read next is 1 or 2 GSI1F405.174
C sets of data further on in the boundary file GSI1F405.175
GSI1F405.176
IF (STEPim(o_im).NE.0) THEN GSI1F405.177
IF (MOD(ELAPSED_STEPS,RIM_STEPSO).EQ.0) THEN GSI1F405.178
DATA_TO_SKIP=DATA_TO_SKIP+1 GSI1F405.179
ELSE GSI1F405.180
DATA_TO_SKIP=DATA_TO_SKIP+2 GSI1F405.181
END IF GSI1F405.182
GSI1F405.183
O_BDY_STEP_PREV = (DATA_TO_SKIP-2)*RIM_STEPSO GSI1F405.184
& -BASISMDATA_STEPS GSI1F405.185
END IF GSI1F405.186
GSI1F405.187
NBOUND_LOOKUP(2)=DATA_TO_SKIP*RIM_LOOKUPSO+1 GSI1F405.188
GSI1F405.189
BNDARY_OFFSETim(o_im)=MOD(BASISMDATA_STEPS,RIM_STEPSO) GSI1F405.190
INBOUND1.960
ELSEIF (FIXHD_BOUNDO(10,1).EQ.2) THEN ! periodic data INBOUND1.961
INBOUND1.962
C Assume a 360 day calender and data of period one year INBOUND1.963
C GSS1F304.385
IF (.NOT. LCAL360) THEN GSS1F304.386
CMESSAGE= 'IN_BOUND: Gregorian calender not allowed with INBOUND1.965
& periodic boundary data' INBOUND1.966
ICODE=1 INBOUND1.967
RETURN INBOUND1.968
END IF GSS1F304.387
C GSS1F304.388
PERIOD=INTHD_BOUNDO(3,1)*INTERVAL INBOUND1.970
IF (PERIOD.NE.8640*3600) THEN INBOUND1.971
CMESSAGE= 'IN_BOUND: Period for periodic boundary data must INBOUND1.972
& be one year ' INBOUND1.973
ICODE=1 INBOUND1.974
RETURN INBOUND1.975
ENDIF INBOUND1.976
INBOUND1.977
CALL TIME2SEC
(I_YEAR,I_MONTH,I_DAY,I_HOUR,I_MINUTE,I_SECOND, INBOUND1.978
& BASIS_TIME_DAYS,BASIS_TIME_SECS,DAYS,SECS, GSS1F304.390
& LCAL360) GSS1F304.391
INBOUND1.980
GSI1F405.191
IF ((I_MONTH*720+I_DAY*24+I_HOUR).LT.(FIXHD_BOUNDO(22,1)*720+ GSI1F405.192
& FIXHD_BOUNDO(23,1)*24+FIXHD_BOUNDO(24,1))) THEN GSI1F405.193
GSI1F405.194
CALL TIME2SEC
(I_YEAR-1,FIXHD_BOUNDO(22,1),FIXHD_BOUNDO(23,1), GSI1F405.195
& FIXHD_BOUNDO(24,1),FIXHD_BOUNDO(25,1),FIXHD_BOUNDO(26,1), GSI1F405.196
& BASIS_TIME_DAYS,BASIS_TIME_SECS, GSI1F405.197
& DAYS_DATA_START,SECS_DATA_START,LCAL360) GSI1F405.198
GSI1F405.199
ELSE GSI1F405.200
GSI1F405.201
CALL TIME2SEC
(I_YEAR,FIXHD_BOUNDO(22,1),FIXHD_BOUNDO(23,1), GSI1F405.202
& FIXHD_BOUNDO(24,1),FIXHD_BOUNDO(25,1),FIXHD_BOUNDO(26,1), GSI1F405.203
& BASIS_TIME_DAYS,BASIS_TIME_SECS, GSI1F405.204
& DAYS_DATA_START,SECS_DATA_START,LCAL360) GSI1F405.205
GSI1F405.206
ENDIF GSI1F405.207
GSI1F405.208
CALL TIM2STEP
(DAYS-DAYS_DATA_START,SECS-SECS_DATA_START, GSI1F405.209
& STEPS_PER_PERIODim(o_im),SECS_PER_PERIODim(o_im), GSI1F405.210
& ELAPSED_STEPS) GSI1F405.211
GSI1F405.212
DATA_TO_SKIP=ELAPSED_STEPS/RIM_STEPSO GSI1F405.213
GSI1F405.214
C Calculate no of steps from first data time to basis time GSI1F405.215
GSI1F405.216
CALL TIM2STEP
(-DAYS_DATA_START,-SECS_DATA_START, GSI1F405.217
& STEPS_PER_PERIODim(o_im),SECS_PER_PERIODim(o_im), GSI1F405.218
& BASISMDATA_STEPS) GSI1F405.219
GSI1F405.220
O_BDY_STEP_PREV = DATA_TO_SKIP*RIM_STEPSO-BASISMDATA_STEPS GSI1F405.221
GSI1F405.222
C If this is a continuation step, boundary data has already been GSI1F405.223
C read into the dump and the first field to be read next is 1 or 2 GSI1F405.224
C sets of data further on in the boundary file GSI1F405.225
GSI1F405.226
IF (STEPim(o_im).NE.0) THEN GSI1F405.227
IF (MOD(ELAPSED_STEPS,RIM_STEPSO).EQ.0) THEN GSI1F405.228
DATA_TO_SKIP=DATA_TO_SKIP+1 GSI1F405.229
ELSE GSI1F405.230
DATA_TO_SKIP=DATA_TO_SKIP+2 GSI1F405.231
END IF GSI1F405.232
GSI1F405.233
O_BDY_STEP_PREV = (DATA_TO_SKIP-2)*RIM_STEPSO GSI1F405.234
& -BASISMDATA_STEPS GSI1F405.235
END IF GSI1F405.236
GSI1F405.237
DATA_TO_SKIP=MOD(DATA_TO_SKIP,INTHD_BOUNDO(3,1)) GSI1F405.238
GSI1F405.239
NBOUND_LOOKUP(2)=DATA_TO_SKIP*RIM_LOOKUPSO+1 GSI1F405.240
GSI1F405.241
BNDARY_OFFSETim(o_im)=MOD(BASISMDATA_STEPS,RIM_STEPSO) GSI1F405.242
GSI1F405.243
INBOUND1.1006
END IF ! End if timeseries or periodic data INBOUND1.1007
INBOUND1.1008
INBOUND1.1018
ENDIF ! End if length of lookup table gt 0 INBOUND1.1019
ENDIF ! End if boundary update chosen INBOUND1.1020
INBOUND1.1021
CL Section for lower boundary conditions omitted INBOUND1.1022
INBOUND1.1023
*ENDIF WRB1F401.197
WRB1F401.198
*IF DEF,WAVE WRB1F401.199
WRITE(6,*)'INBOUND;wave sub-model boundary code yet to be written' GIE0F403.315
*ENDIF INBOUND1.1024
INBOUND1.1025
INBOUND1.1026
INBOUND1.1027
CL 4 End of routine INBOUND1.1028
INBOUND1.1029
9999 CONTINUE APB4F401.480
RETURN INBOUND1.1030
END INBOUND1.1031
*----------------------------------------------------------------------- INBOUND1.1032
INBOUND1.1033
*ENDIF INBOUND1.1034