*IF DEF,CONTROL SETTSCT1.2
C ******************************COPYRIGHT****************************** GTS2F400.8749
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.8750
C GTS2F400.8751
C Use, duplication or disclosure of this code is subject to the GTS2F400.8752
C restrictions as set forth in the contract. GTS2F400.8753
C GTS2F400.8754
C Meteorological Office GTS2F400.8755
C London Road GTS2F400.8756
C BRACKNELL GTS2F400.8757
C Berkshire UK GTS2F400.8758
C RG12 2SZ GTS2F400.8759
C GTS2F400.8760
C If no contract has been raised with this copy of the code, the use, GTS2F400.8761
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.8762
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.8763
C Modelling at the above address. GTS2F400.8764
C ******************************COPYRIGHT****************************** GTS2F400.8765
C GTS2F400.8766
CLL Routine: SETTSCTL ------------------------------------------------- SETTSCT1.3
CLL SETTSCT1.4
CLL Purpose: Sets timestep loop control switches and STASHflags. SETTSCT1.5
CLL Note STEP on entry is the values at the N+1 (ie. updated) SETTSCT1.6
CLL timelevel; control switches are therefore set using SETTSCT1.7
CLL A_STEP/O_STEP, whereas physical switches are set using SETTSCT1.8
CLL A_STEP-1/O_STEP-1 to ensure correct synchronisation. SETTSCT1.9
CLL Note also that step on entry is N (i.e. not updated) when SETTSCT1.10
CCL called from INITIAL. SETTSCT1.11
CCL SETTSCT1.12
CLL Tested under compiler: cft77 SETTSCT1.13
CLL Tested under OS version: UNICOS 5.1 SETTSCT1.14
CLL SETTSCT1.15
CLL Author: T.C.Johns SETTSCT1.16
CLL SETTSCT1.17
CLL Model Modification history from model version 3.0: SETTSCT1.18
CLL version Date SETTSCT1.19
CLL 3.2 27/03/93 Dynamic allocation of main data arrays. R. Rawlins @DYALLOC.3260
CLL @DYALLOC.3261
CLL 3.1 4/2/93 1. Cater for boundary files for multiple LAM areas DR240293.1005
CLL 2. Rearrange code in loop which sets PP file DR240293.1006
CLL switches (LPP/LPP_SELECT) for timestep. DR240293.1007
CLL 3.1 8/02/93 : Altered loop over units to use NUNITS from TJ061293.72
CLL CHSUNITS. TJ061293.73
CLL 3.2 13/07/93 Changed CHARACTER*(*) to CHARACTER*(80) for TS150793.183
CLL portability. Author Tracey Smith. TS150793.184
CLL 3.2 7/6/93 Set SF(0,sect)=TRUE if any item to process in the @DYALLOC.3262
CLL section, FALSE otherwise. (TCJ) @DYALLOC.3263
CLL 3.3 03/09/93 Set L_CONVECT to control calls to convection scheme RB300993.121
CLL in CONV_CTL. R.T.H.Barnes. RB300993.122
CLL 3.3 26/10/93 M. Carter. Part of an extensive mod that: MC261093.247
CLL 1.Removes the limit on primary STASH item numbers. MC261093.248
CLL 2.Removes the assumption that (section,item) MC261093.249
CLL defines the sub-model. MC261093.250
CLL 3.Thus allows for user-prognostics. MC261093.251
CLL Remove reference to A_MAX_VARIABLE MC261093.252
CLL New indexing for PPXREF MC261093.253
CLL 3.3 02/12/93 Generalise switch settings for SLAB model (TCJ). TJ061293.74
CLL 3.3 21/12/93 Change LEXIT so that is also set to true if the TJ061293.75
CLL run end time has been reached. (Claire Douglas) TJ061293.76
CLL 3.4 27/09/94 Use ANCIL_REFTIME to improve time interpolation of GRB1F304.211
CLL ancillaries, with offset in LANCILLARY. RTHBarnes. GRB1F304.212
CLL 3.5 18/04/95 Submodels Stage 1. Replace hardwired submodels with GRB1F305.516
CLL generic forms where possible. R. Rawlins GRB1F305.517
CLL 4.1 29/02/96 Introduce Wave sub-model. RTHBarnes. WRB1F401.752
CLL 4.1 26/04/96 Allow an offset from model_basis_time for GOK1F401.8
CLL logical switch LBOUNDARY. S.Ineson GOK1F401.9
CLL 4.1 15/05/96 Revise use of O_INT_OBS_FRSH M. J. Bell OMB1F401.98
CLL 4.4 21/10/97 Update data time during IAU run. Adam Clayton. VSB2F404.102
CLL VSB2F404.103
!LL 4.4 05/09/97 Add flag to reset net flux field. S.D.Mullerworth GSM3F404.13
!LL 4.4 06/06/97 Allow reinitialisation of non-mean PP files on real GMG1F404.302
!LL month boundaries, as long as 365d calendar used. GMG1F404.303
!LL M.Gallani GMG1F404.304
!LL 4.5 10/11/98 Increase number of dumps allowed at irregular GRR2F405.57
!LL timesteps from 10 to 40: move lengths into GRR2F405.58
!LL CNTLGEN. R Rawlins GRR2F405.59
!LL 4.5 29/07/98 New naming convention for boundary files. GDR2F405.149
!LL D. Robinson. GDR2F405.150
!LL 4.5 29/07/98 Generalise for atmos & ocean boundary files. GMB1F405.539
!LL Call INTF_AREA. M. Bell/P. Horrocks. GMB1F405.540
!LL GMG1F404.305
CLL Programming standard: UM Doc Paper 3, version 2 (07/9/90) SETTSCT1.21
CLL SETTSCT1.22
CLL Logical components covered: C0 SETTSCT1.23
CLL SETTSCT1.24
CLL Project task: C0 SETTSCT1.25
CLL SETTSCT1.26
CLL External documentation: On-line UM document C0 - The top-level SETTSCT1.27
CLL control system SETTSCT1.28
CLL SETTSCT1.29
CLLEND------------------------------------------------------------------ SETTSCT1.30
C*L Interface and arguments: ------------------------------------------ SETTSCT1.31
C SETTSCT1.32
SUBROUTINE SETTSCTL ( 2,4@DYALLOC.3264
*CALL ARGSIZE
@DYALLOC.3265
*CALL ARGDUMA
@DYALLOC.3266
*CALL ARGDUMO
@DYALLOC.3267
*CALL ARGDUMW
WRB1F401.753
*CALL ARGSTS
@DYALLOC.3268
*CALL ARGINFA
@DYALLOC.3269
*CALL ARGINFO
@DYALLOC.3270
*CALL ARGINFW
WRB1F401.754
& internal_model,LINITIAL,MEANLEV,ICODE,CMESSAGE) GRB1F305.518
C TJ061293.78
IMPLICIT NONE SETTSCT1.34
C TJ061293.79
INTEGER internal_model ! IN - internal model identifier GRB1F305.519
LOGICAL LINITIAL ! IN - true in called from INITIAL SETTSCT1.36
INTEGER MEANLEV ! OUT - Mean level indicator SETTSCT1.37
*CALL CMAXSIZE
@DYALLOC.3272
*CALL CSUBMODL
! Needed for N_INTERNAL_MODEL GSS1F305.793
*CALL TYPSIZE
@DYALLOC.3273
*CALL TYPDUMA
@DYALLOC.3274
*CALL TYPDUMO
@DYALLOC.3275
*CALL TYPDUMW
WRB1F401.755
*CALL TYPSTS
! Contains *CALL CPPXREF GSS1F305.794
*CALL TYPINFA
@DYALLOC.3277
*CALL TYPINFO
@DYALLOC.3278
*CALL TYPINFW
WRB1F401.756
INTEGER ICODE ! Out - Return code SETTSCT1.38
CHARACTER*(80) CMESSAGE ! Out - Return error message TS150793.185
C SETTSCT1.40
C*---------------------------------------------------------------------- SETTSCT1.41
C Common blocks SETTSCT1.42
C SETTSCT1.43
*CALL CHSUNITS
GRB1F305.520
*CALL CHISTORY
GRB1F305.521
*CALL CCONTROL
SETTSCT1.44
*CALL CTIME
SETTSCT1.48
*CALL STPARAM
SETTSCT1.49
*CALL CLOOKADD
SETTSCT1.50
C SETTSCT1.51
C SETTSCT1.52
C Local variables SETTSCT1.53
C SETTSCT1.54
INTEGER I,NFTUNIT ! Loop counters SETTSCT1.55
INTEGER ITIME ! Loop index over selected dump times SETTSCT1.56
INTEGER STEP ! A_STEP or O_STEP for atmos/ocean SETTSCT1.57
INTEGER IS,II,IL,IM,NTAB,IT,IE ! STASH variables GSS1F305.795
INTEGER modl ! Int model no, read from STASH list arra GSS1F305.796
INTEGER MODJOBREL ! modulus of JOBREL_STEP() SETTSCT1.59
INTEGER STEP_ASSIM ! model step rel. to assim start SETTSCT1.60
C SETTSCT1.61
INTEGER JINTF ! Interface area index DR240293.1010
INTEGER ANCIL_REF_DAYS,ANCIL_REF_SECS GRB1F304.213
INTEGER ANCIL_OFFSET_STEPS ! offset of ref. from basis time GRB1F304.214
INTEGER MINS_PER_STEP ! minutes per timestep GMG1F404.306
GRB1F304.215
! Temporary variables for development of 3.5 start GRB1F305.522
INTEGER SECS_PER_DAY GRR2F405.60
PARAMETER (SECS_PER_DAY = 24*3600) GRR2F405.61
INTEGER A_S_Steps ! Atmosphere steps: slab steps GRB1F305.531
GRB1F305.532
INTEGER SECS_PER_PERIOD GRB1F305.533
INTEGER STEPS_PER_PERIOD GRB1F305.534
INTEGER DUMPFREQ GRB1F305.535
INTEGER OFFSET_DUMPS GRB1F305.536
INTEGER EXITFREQ GRB1F305.537
INTEGER TARGET_END_STEP GRB1F305.538
INTEGER ANCILLARY_STEPS GRB1F305.539
INTEGER BOUNDARY_STEPS GRB1F305.540
INTEGER BNDARY_OFFSET GOK1F401.10
INTEGER DUMPTIMES(DUMPTIMES_LEN1) GRB1F305.541
INTEGER MEANFREQ (MEANFREQ_LEN1) GRB1F305.542
INTEGER PRINTFREQ(PRINTFREQ_LEN1) GRB1F305.543
INTEGER JOBREL_STEP(JOBREL_LEN1) GRB1F305.544
! Temporary variables for development of 3.5 end GRB1F305.545
GRB1F305.546
LOGICAL IAU_SETDT ! If .TRUE., set data time to that of IAU dump. VSB2F404.104
GRB1F305.547
CL Subroutines called GRB1F304.216
EXTERNAL GRB1F304.217
& INTF_AREA, TIME2SEC, TIM2STEP GMB1F405.541
GRB1F304.219
ICODE=0 SETTSCT1.62
DR240293.1018
CL 1. Set timestep loop top-level control switches SETTSCT1.64
CL SETTSCT1.65
CL SETTSCT1.66
CL 1.0 Initialise control switches which are shared in coupled runs SETTSCT1.67
CL SETTSCT1.68
C GRB1F305.548
STEP= STEPim(internal_model) GRB1F305.549
SECS_PER_PERIOD= SECS_PER_PERIODim(internal_model) GRB1F305.550
STEPS_PER_PERIOD=STEPS_PER_PERIODim(internal_model) GRB1F305.551
mins_per_step=SECS_PER_PERIOD/(60*STEPS_PER_PERIOD) GMG1F404.307
DUMPFREQ= DUMPFREQim(internal_model) GRB1F305.552
OFFSET_DUMPS= OFFSET_DUMPSim(internal_model) GRB1F305.553
EXITFREQ= EXITFREQim(internal_model) GRB1F305.554
TARGET_END_STEP= TARGET_END_STEPim(internal_model) GRB1F305.555
ANCILLARY_STEPS= ANCILLARY_STEPSim(internal_model) GRB1F305.556
BOUNDARY_STEPS = BOUNDARY_STEPSim(internal_model) GRB1F305.557
BNDARY_OFFSET = BNDARY_OFFSETim(internal_model) GOK1F401.11
DO I=1,DUMPTIMES_LEN1 GRB1F305.558
DUMPTIMES(I)= DUMPTIMESim(I,internal_model) GRB1F305.559
ENDDO ! I GRB1F305.560
DO I=1,MEANFREQ_LEN1 GRB1F305.561
MEANFREQ(I)= MEANFREQim(I,internal_model) GRB1F305.562
ENDDO ! I GRB1F305.563
DO I=1,PRINTFREQ_LEN1 GRB1F305.564
PRINTFREQ(I)= PRINTFREQim(I,internal_model) GRB1F305.565
ENDDO ! I GRB1F305.566
DO I=1,JOBREL_LEN1 GRB1F305.567
JOBREL_STEP(I)= JOBREL_STEPim(I,internal_model) GRB1F305.568
ENDDO ! I GRB1F305.569
C SETTSCT1.79
LASSIMILATION=.FALSE. SETTSCT1.80
LDUMP= .FALSE. SETTSCT1.81
LEXIT= .FALSE. SETTSCT1.82
LMEAN= .FALSE. SETTSCT1.83
LHISTORY= .FALSE. TJ061293.88
LPRINT= .FALSE. SETTSCT1.84
LANCILLARY= .FALSE. SETTSCT1.85
LBOUNDARY= .FALSE. SETTSCT1.86
LINTERFACE= .FALSE. SETTSCT1.87
LJOBRELEASE = .FALSE. GRB1F305.570
CL SETTSCT1.88
CL 1.1 Set up PPfile switches for the timestep SETTSCT1.89
CL SETTSCT1.90
LPP =.FALSE. SETTSCT1.91
TJ061293.89
DO NFTUNIT=20,NUNITS RS030293.193
IF (FT_INPUT(NFTUNIT).EQ.'Y'.OR.FT_OUTPUT(NFTUNIT).EQ.'Y') THEN SETTSCT1.93
DR240293.1020
! Allow mix of real-month & regular reinit. periods on different units GMG1F404.308
IF (FT_STEPS(NFTUNIT).LT.0) THEN ! For real-month reinit. GMG1F404.309
DR240293.1022
C Select files to be reinitialised this timestep DR240293.1023
IF ( STEP.EQ.0 .AND. FT_FIRSTSTEP(NFTUNIT).EQ.0 ) then GMG1F404.310
LPP_SELECT(NFTUNIT) =.true. ! 0th tstep GMG1F404.311
ELSEIF ((.not. lcal360) .and. GMG1F404.312
& (nftunit.ge.60 .and. nftunit.lt.70) .and. (i_day.eq.1) GMG1F404.313
& .and. (i_hour .eq. 0) .and. (i_minute .eq. mins_per_step) GMG1F404.314
& .and. (STEP .GT. FT_FIRSTSTEP(NFTUNIT)) .and. GMG1F404.315
& .not.(STEP .LT. ((60/mins_per_step)+1) ! not 1st run hour GMG1F404.316
& .AND. FT_FIRSTSTEP(NFTUNIT).EQ.0)) then GMG1F404.317
if (FT_STEPS(NFTUNIT).eq.-1) then GMG1F404.318
LPP_SELECT(NFTUNIT) =.true. ! months GMG1F404.319
elseif (FT_STEPS(NFTUNIT).eq.-3 .and. GMG1F404.320
& mod((i_month-(MODEL_BASIS_TIME(2) GMG1F404.321
& +FT_FIRSTSTEP(NFTUNIT))),3).eq.0 ) then GMG1F404.322
LPP_SELECT(NFTUNIT) =.true. ! seasons GMG1F404.323
elseif (FT_STEPS(NFTUNIT).eq.-12 .and. GMG1F404.324
& mod((i_month-(MODEL_BASIS_TIME(2) GMG1F404.325
& +FT_FIRSTSTEP(NFTUNIT))),12).eq.0 ) then GMG1F404.326
LPP_SELECT(NFTUNIT) =.true. ! years GMG1F404.327
endif ! of FT_STEPS(NFTUNIT)=reinit. period GMG1F404.328
ELSE ! ensure LPP_SELECT() isn't accidentally set true GMG1F404.329
LPP_SELECT(NFTUNIT)=.false. ! avoid probs if unset GMG1F404.330
ENDIF ! of lcal360 and nftunit etc. GMG1F404.331
ELSE IF (FT_STEPS(NFTUNIT).GT.0) THEN ! use regular reinit. GMG1F404.332
LPP_SELECT(NFTUNIT) = SETTSCT1.106
DR240293.1024
C Is file to be initialised at step 0 DR240293.1025
* ( STEP.EQ.0 .AND. FT_FIRSTSTEP(NFTUNIT).EQ.0 ) DR240293.1026
DR240293.1027
* .OR. DR240293.1028
DR240293.1029
C Is file to be reinitialised this timestep (STEP) DR240293.1030
* ( STEP.GT.FT_FIRSTSTEP(NFTUNIT) DR240293.1031
* .AND. DR240293.1032
* MOD(STEP-1-FT_FIRSTSTEP(NFTUNIT),FT_STEPS(NFTUNIT)).EQ.0 DR240293.1033
* .AND. .NOT. DR240293.1034
C Do not reinitialise files on step 1 if they were DR240293.1035
C initialised at step 0 DR240293.1036
* (STEP.EQ.1 .AND.FT_FIRSTSTEP(NFTUNIT).EQ.0) DR240293.1037
* .AND.( GRB1F305.571
C Sub model id must correspond with TYPE_LETTER_2 GRB1F305.572
*(internal_model.EQ.atmos_im.AND.TYPE_LETTER_2(NFTUNIT).EQ.'a').OR. GRB1F305.573
*(internal_model.EQ.ocean_im.AND.TYPE_LETTER_2(NFTUNIT).EQ.'o')) ) GRB1F305.574
DR240293.1042
CL TJ061293.93
CL 1.1.1 Set up PPfile switches for boundary output files - this needs TJ061293.94
CL to be protected on SLAB model timesteps TJ061293.95
CL TJ061293.96
IF (TYPE_LETTER_1(NFTUNIT).EQ.'b') THEN ! Boundary File GDR2F405.151
DR240293.1049
! Get interface area number GMB1F405.542
call intf_area
( internal_model, NFTUNIT, JINTF) GMB1F405.543
DR240293.1051
LPP_SELECT(NFTUNIT) = ( LPP_SELECT(NFTUNIT) TJ061293.99
* .AND. .NOT. TJ061293.100
C Do not reinitialise first file on timestep ft_firststep TJ061293.101
* (STEP-1-FT_FIRSTSTEP(NFTUNIT).EQ.0) ) TJ061293.102
* .OR. TJ061293.103
C Initialise first file if start of sequence is offset TJ061293.104
C from beginning of run TJ061293.105
* (STEP-1+INTERFACE_STEPSim(JINTF,internal_model) - GMB1F405.544
* FT_FIRSTSTEP(NFTUNIT) .EQ. 0) GDR5F305.152
* .OR. TJ061293.108
C Select boundary file if incomplete on continuation run TJ061293.109
* (LINITIAL TJ061293.110
* .AND. TJ061293.111
* STEP+INTERFACE_STEPSim(JINTF,internal_model).GT. GMB1F405.545
* FT_FIRSTSTEP(NFTUNIT) GDR5F305.154
* .AND. TJ061293.113
* STEP.LE.INTERFACE_LSTEPim(JINTF,internal_model) GMB1F405.546
* .AND. TJ061293.115
* (STEP-FT_FIRSTSTEP(NFTUNIT).EQ.0 .OR. TJ061293.116
* MOD(STEP-FT_FIRSTSTEP(NFTUNIT),FT_STEPS(NFTUNIT)).NE.0) TJ061293.117
* ) TJ061293.118
DR240293.1071
ENDIF DR240293.1072
DR240293.1073
ELSE ! for files not reinitialised, ie. ft_steps(nftunit)=0 GMG1F404.333
DR240293.1075
C Initialise at step 0 DR240293.1076
LPP_SELECT(NFTUNIT) = STEP.EQ.0 .AND. DR240293.1077
* (FT_STEPS(NFTUNIT).EQ.0.OR.FT_FIRSTSTEP(NFTUNIT).EQ.0) DR240293.1078
DR240293.1079
C Select boundary file if incomplete on continuation run DR240293.1080
IF (LINITIAL .AND. DR240293.1081
& TYPE_LETTER_1(NFTUNIT).EQ.'b') THEN ! Boundary File GDR2F405.152
DR240293.1088
! Get interface area number GMB1F405.547
call intf_area
( internal_model, NFTUNIT, JINTF) GMB1F405.548
DR240293.1090
LPP_SELECT(NFTUNIT) = LPP_SELECT(NFTUNIT) .OR. DR240293.1091
* (STEP.GT.0.AND.STEP.LE. GMB1F405.549
* INTERFACE_LSTEPim(JINTF,internal_model)) GMB1F405.550
DR240293.1093
ENDIF DR240293.1094
DR240293.1095
END IF ! of FT_STEPS(NFTUNIT) lt, gt or =0, ie. reinit. type GMG1F404.334
ENDIF ! of FT_INPUT(NFTUNIT) or FT_OUTPUT(NFTUNIT) =Y GMG1F404.335
LPP = LPP .OR. LPP_SELECT(NFTUNIT) SETTSCT1.136
END DO ! of loop over nftunit from 20 to nunits GMG1F404.336
CL SETTSCT1.138
CL 1.2 Set switches for general internal models. GRB1F305.576
CL For coupled models dump related switches can only be set when GRB1F305.577
CL the last internal model in a submodel has completed its group GRB1F305.578
CL of timesteps. For coupled models the only safe restart point GRB1F305.579
CL is at the completion of all groups within a model timestep. GRB1F305.580
GRB1F305.581
IF(N_INTERNAL_MODEL.EQ.1.OR.( ! if not coupled model, or GRB1F305.582
* LAST_IM_IN_SM(internal_model).AND. ! last model in submodel GRB1F305.583
* MOD(STEP,STEPS_PER_PERIOD).EQ.0)) ! and last step in group GRB1F305.584
* THEN GRB1F305.585
C TJ061293.128
C LDUMP : Write-up dump on this timestep TJ061293.129
C TJ061293.130
IF (DUMPFREQ.GT.0) THEN GRB1F305.586
LDUMP= (MOD(STEP,DUMPFREQ) .EQ.0) GRB1F305.587
ELSE SETTSCT1.145
LDUMP=.FALSE. SETTSCT1.146
DO ITIME=1,DUMPTIMES_LEN1 GRB1F305.588
LDUMP=LDUMP.OR.(STEP.EQ.DUMPTIMES(ITIME)) GRB1F305.589
ENDDO SETTSCT1.149
ENDIF SETTSCT1.150
C TJ061293.131
C LMEAN : Perform climate-meaning from dumps on this timestep TJ061293.132
C LHISTORY: Write-up history file on this timestep TJ061293.133
C TJ061293.134
IF (DUMPFREQ.GT.0.AND.MEANFREQ(1).GT.0) THEN GRB1F305.590
LMEAN= (MOD(STEP,DUMPFREQ) .EQ.0) GRB1F305.591
LHISTORY= (MOD(STEP-OFFSET_DUMPS*DUMPFREQ, GRB1F305.592
& DUMPFREQ*MEANFREQ(1)).EQ.0) GRB1F305.593
ELSE TJ061293.139
LMEAN= .FALSE. TJ061293.140
LHISTORY= LDUMP TJ061293.141
ENDIF TJ061293.142
! For coupled models, only allow history write-ups if model GRB1F305.594
! timestep complete, ie last internal model. GRB1F305.595
IF(LHISTORY.AND.N_INTERNAL_MODEL.GT.1.AND. ! Coupled model GRB1F305.596
* internal_model.NE.INTERNAL_MODEL_LIST(N_INTERNAL_MODEL)) THEN GRB1F305.597
LHISTORY= .FALSE. GRB1F305.598
ENDIF ! Test on last internal model in coupled GRB1F305.599
C TJ061293.143
C LPRINT : Write a formatted print from dump on this timestep TJ061293.144
C TJ061293.145
IF (LDUMP) THEN TJ061293.146
IF (DUMPFREQ.GT.0.AND.PRINTFREQ(1).GT.0) THEN GRB1F305.600
LPRINT= (MOD(STEP,DUMPFREQ*PRINTFREQ(1)).EQ.0) GRB1F305.601
ELSE TJ061293.149
LPRINT= .FALSE. TJ061293.150
ENDIF TJ061293.151
ELSE TJ061293.152
LPRINT= .FALSE. TJ061293.153
ENDIF TJ061293.154
C TJ061293.155
C LEXIT : Check for exit condition on this timestep TJ061293.156
C TJ061293.157
IF (EXITFREQ.GT.0) THEN ! Implies climate meaning GRB1F305.602
GRB1F305.603
LEXIT= ( (MOD(STEP,EXITFREQ) .EQ.0) .OR. GRB1F305.604
& (STEP .GE. TARGET_END_STEP) ) GRB1F305.605
GRB1F305.606
ELSE ! No climate meaning GRB1F305.607
GRB1F305.608
LEXIT= (STEP .GE. TARGET_END_STEP) GRB1F305.609
GRB1F305.610
ENDIF GRB1F305.611
C TJ061293.161
C LANCILLARY: Update ancillary fields on this timestep TJ061293.162
C LBOUNDARY : Update boundary fields on this timestep TJ061293.163
C TJ061293.164
CL Convert ancillary reference time to days & secs GRB1F304.220
CALL TIME2SEC
(ANCIL_REFTIME(1),ANCIL_REFTIME(2), GRB1F304.221
& ANCIL_REFTIME(3),ANCIL_REFTIME(4), GRB1F304.222
& ANCIL_REFTIME(5),ANCIL_REFTIME(6), GRB1F304.223
& 0,0,ANCIL_REF_DAYS,ANCIL_REF_SECS,LCAL360) GRB1F304.224
GRB1F304.225
CL Compute offset in timesteps of basis time from ancillary ref.time GRB1F304.226
CALL TIM2STEP
(BASIS_TIME_DAYS-ANCIL_REF_DAYS, GRB1F304.227
& BASIS_TIME_SECS-ANCIL_REF_SECS, GRB1F304.228
& STEPS_PER_PERIOD,SECS_PER_PERIOD,ANCIL_OFFSET_STEPS) GRB1F305.612
GRB1F304.230
IF (ANCILLARY_STEPS.GT.0.AND.STEP.GT.0) GRB1F305.613
&LANCILLARY=(MOD(STEP+ANCIL_OFFSET_STEPS,ANCILLARY_STEPS).EQ.0) GRB1F305.614
TJ061293.169
ENDIF ! Test for non-coupled or coupled + last step in group GRB1F305.615
GRB1F305.616
C GRB1F305.617
C LBOUNDARY : Update boundary fields on this timestep GRB1F305.618
C GRB1F305.619
IF (BOUNDARY_STEPS.GT.0) GRB1F305.620
& LBOUNDARY= (MOD(STEP+BNDARY_OFFSET,BOUNDARY_STEPS) .EQ.0) GOK1F401.12
C GRB1F305.622
C LJOBRELEASE : Release user jobs on this timestep GRB1F305.623
C GRB1F305.624
DO I=1,JOBREL_LEN1 GRB1F305.625
MODJOBREL=ABS(JOBREL_STEP(I)) GRB1F305.626
IF (MODJOBREL.NE.0)THEN GRB1F305.627
LJOBRELEASE = LJOBRELEASE .OR. GRB1F305.628
* (STEP.EQ.JOBREL_STEP(I) .AND. JOBREL_STEP(I).GT.0).OR. GRB1F305.629
* (MOD(STEP,MODJOBREL).EQ.0.AND. JOBREL_STEP(I).LT.0) GRB1F305.630
ENDIF GRB1F305.631
ENDDO GRB1F305.632
GRB1F305.633
GRB1F305.634
CL GRB1F305.635
CL 1.2.1 Set switches for atmosphere timestep GRB1F305.636
CL GRB1F305.637
*IF DEF,ATMOS GRB1F305.638
IF (internal_model.EQ.atmos_im) THEN GRB1F305.639
CL 1.2.2 Set switches for all cases TJ061293.171
C TJ061293.172
C LENERGY : Readjust energy/mass correction on this timestep TJ061293.173
C TJ061293.174
IF (A_ENERGYSTEPS.GT.0) THEN GSM3F404.14
LENERGY= (MOD(STEP,A_ENERGYSTEPS).EQ.0) GSM3F404.15
LFLUX_RESET= (MOD(STEP-1,A_ENERGYSTEPS).EQ.0) GSM3F404.16
ENDIF GSM3F404.17
C TJ061293.177
C LDAY : End of day on this timestep TJ061293.178
C TJ061293.179
! Assumes that period is an integral number of days GRB1F305.641
! or an integral divisor of a day. GRB1F305.642
IF (SECS_PER_PERIOD.GT.0) THEN GRB1F305.643
GRB1F305.644
IF(SECS_PER_PERIOD.LT.SECS_PER_DAY) THEN ! ts < 1 day GRB1F305.645
LDAY= (MOD(STEP, GRB1F305.646
* STEPS_PER_PERIOD*(SECS_PER_DAY/SECS_PER_PERIOD)) GRB1F305.647
* .EQ.0) GRB1F305.648
ELSE ! ts >= 1 day GRB1F305.649
LDAY= .TRUE. GRB1F305.650
ENDIF GRB1F305.651
GRB1F305.652
ELSE TJ061293.182
CMESSAGE='SETTSCTL: SECS_PER_PERIOD has illegal value' GRB1F305.653
ICODE=1 TJ061293.184
GOTO 999 TJ061293.185
ENDIF TJ061293.186
C TJ061293.187
C LASSIMILATION: Perform data assimilation on this timestep TJ061293.188
C TJ061293.189
LASSIMILATION= (STEP.GT.ASSIM_FIRSTSTEPim(a_im) .AND. GRB1F305.654
& (STEP-ASSIM_FIRSTSTEPim(a_im) .LE. GRB1F305.655
& ASSIM_STEPSim(a_im)+ASSIM_EXTRASTEPSim(a_im))) GRB1F305.656
LASSIMILATION=LASSIMILATION.AND. SETTSCT1.153
& ( MODEL_ASSIM_MODE.EQ.'Atmosphere' .OR. SETTSCT1.154
& MODEL_ASSIM_MODE.EQ.'Coupled ') SETTSCT1.155
CL SETTSCT1.156
CL Reset Data Time fields in dump header at new analysis time SETTSCT1.157
CL ( also in history block ) SETTSCT1.158
CL ( This now includes resetting prognostic field LOOKUP headers ) SETTSCT1.159
CL NB: done even if assimilation suppressed by RUN_ASSIM_MODE SETTSCT1.160
CL Set MEANLEV to -1 and LDUMP to TRUE to force dump of analysis SETTSCT1.161
CL - otherwise set MEANLEV to 0 (ie. instantaneous) SETTSCT1.162
CL SETTSCT1.163
IAU_SETDT=.FALSE. VSB2F404.105
IF (L_IAU) THEN VSB2F404.106
IF (IAU_DATA_TIME(1).EQ.A_FIXHD(28) .AND. VSB2F404.107
& IAU_DATA_TIME(2).EQ.A_FIXHD(29) .AND. VSB2F404.108
& IAU_DATA_TIME(3).EQ.A_FIXHD(30) .AND. VSB2F404.109
& IAU_DATA_TIME(4).EQ.A_FIXHD(31) .AND. VSB2F404.110
& IAU_DATA_TIME(5).EQ.A_FIXHD(32) .AND. VSB2F404.111
& IAU_DATA_TIME(6).EQ.A_FIXHD(33)) IAU_SETDT=.TRUE. VSB2F404.112
ENDIF VSB2F404.113
IF ( (STEP.EQ.ASSIM_FIRSTSTEPim(a_im)+ASSIM_STEPSim(a_im) VSB2F404.114
* .AND.LASSIMILATION) .OR. IAU_SETDT) THEN VSB2F404.115
VSB2F404.116
DO I=21,27 SETTSCT1.166
A_FIXHD(I)=A_FIXHD(I+7) SETTSCT1.167
ENDDO SETTSCT1.168
DO I=1,6 SETTSCT1.169
MODEL_DATA_TIME(I)=A_FIXHD(20+I) SETTSCT1.170
ENDDO SETTSCT1.171
DO I=1,A_PROG_LOOKUP SETTSCT1.172
A_LOOKUP(LBYRD ,I)=A_FIXHD(21) SETTSCT1.173
A_LOOKUP(LBMOND,I)=A_FIXHD(22) SETTSCT1.174
A_LOOKUP(LBDATD,I)=A_FIXHD(23) SETTSCT1.175
A_LOOKUP(LBHRD ,I)=A_FIXHD(24) SETTSCT1.176
A_LOOKUP(LBMIND,I)=A_FIXHD(25) SETTSCT1.177
A_LOOKUP(LBDAYD,I)=A_FIXHD(27) SETTSCT1.178
ENDDO SETTSCT1.179
MEANLEV=-1 SETTSCT1.180
LDUMP=.TRUE. SETTSCT1.181
ELSE SETTSCT1.182
MEANLEV=0 SETTSCT1.183
ENDIF SETTSCT1.184
CL SETTSCT1.185
CL Suppress assimilation using RUN_ASSIM_MODE if necessary SETTSCT1.186
LASSIMILATION=LASSIMILATION.AND. SETTSCT1.187
& ((RUN_ASSIM_MODE.EQ.'Atmosphere').OR. SETTSCT1.188
& (RUN_ASSIM_MODE.EQ.'Coupled ')) SETTSCT1.189
C TJ061293.190
C L_SET_FILTER : Recalculate filter weights on this timestep TJ061293.191
C L_SW_RADIATE : Perform SW-radiation on this timestep TJ061293.192
C L_LW_RADIATE : Perform LW-radiation on this timestep TJ061293.193
C TJ061293.194
IF (A_NSET_FILTER.GT.0) SETTSCT1.190
& L_SET_FILTER= (MOD(STEP-1,A_NSET_FILTER).EQ.0) GRB1F305.658
IF (A_SW_RADSTEP.GT.0) SETTSCT1.192
& L_SW_RADIATE=(MOD(STEP-1,A_SW_RADSTEP) .EQ.0) GRB1F305.659
IF (A_LW_RADSTEP.GT.0) SETTSCT1.194
& L_LW_RADIATE=(MOD(STEP-1,A_LW_RADSTEP) .EQ.0) GRB1F305.660
IF (A_CONV_STEP.GT.0) RB300993.123
& L_CONVECT = (MOD(STEP-1,A_CONV_STEP) .EQ. 0) GRB1F305.661
C TJ061293.195
C LINTERFACE: Output interface fields on this timestep (>1 file poss.) TJ061293.196
C TJ061293.197
DO JINTF=1,N_INTF_A TJ061293.198
IF (INTERFACE_STEPSim(JINTF,atmos_im).GT.0) THEN GRB1F305.662
LINTERFACE = LINTERFACE .OR. TJ061293.200
& (MOD(STEP-INTERFACE_FSTEPim(JINTF,atmos_im), GRB1F305.663
& INTERFACE_STEPSim(JINTF,atmos_im)).EQ.0 GRB1F305.664
& .AND. STEP.GE.INTERFACE_FSTEPim(JINTF,atmos_im) GRB1F305.665
& .AND. STEP.LE.INTERFACE_LSTEPim(JINTF,atmos_im) ) GRB1F305.666
ENDIF TJ061293.205
ENDDO TJ061293.206
ENDIF ! Test for atmos_im GRB1F305.667
*ENDIF ATMOS SETTSCT1.250
CL SETTSCT1.251
CL 1.3 Set switches for ocean timestep SETTSCT1.252
CL SETTSCT1.253
*IF DEF,OCEAN SETTSCT1.254
IF (Internal_model.EQ.ocean_im) THEN GRB1F305.668
C SETTSCT1.264
*IF DEF,OCNASSM SETTSCT1.265
C SETTSCT1.266
CL Set LASSIMILATION and set LDUMP to TRUE at analysis time to force dum SETTSCT1.267
C SETTSCT1.268
STEP_ASSIM = STEP - ASSIM_FIRSTSTEPim(o_im) GRB1F305.669
LASSIMILATION= (STEP.GT.ASSIM_FIRSTSTEPim(o_im) .AND. GRB1F305.670
& (STEP_ASSIM.LE.ASSIM_STEPSim(o_im)+ASSIM_EXTRASTEPSim(o_im))) GRB1F305.671
LASSIMILATION=LASSIMILATION.AND. SETTSCT1.272
& ( MODEL_ASSIM_MODE.EQ.'Ocean ' .OR. SETTSCT1.273
& MODEL_ASSIM_MODE.EQ.'Coupled ') SETTSCT1.274
CL SETTSCT1.275
CL Reset Data Time fields in dump header at new analysis time SETTSCT1.276
CL ( also in history block ) SETTSCT1.277
CL ( This includes resetting prognostic field LOOKUP headers ) SETTSCT1.278
CL NB: done even if assimilation suppressed by RUN_ASSIM_MODE SETTSCT1.279
CL Set MEANLEV to -1 and LDUMP to TRUE to force dump of analysis SETTSCT1.280
CL - otherwise set MEANLEV to 0 (ie. instantaneous) SETTSCT1.281
CL SETTSCT1.282
IF (STEP.EQ.ASSIM_FIRSTSTEPim(o_im)+ASSIM_STEPSim(o_im) GRB1F305.672
* .AND.LASSIMILATION) THEN SETTSCT1.284
DO I=21,27 SETTSCT1.285
O_FIXHD(I)=O_FIXHD(I+7) SETTSCT1.286
ENDDO SETTSCT1.287
DO I=1,6 SETTSCT1.288
MODEL_DATA_TIME(I)=O_FIXHD(20+I) SETTSCT1.289
ENDDO SETTSCT1.290
DO I=1,O_PROG_LOOKUP SETTSCT1.291
O_LOOKUP(LBYRD ,I)=O_FIXHD(21) SETTSCT1.292
O_LOOKUP(LBMOND,I)=O_FIXHD(22) SETTSCT1.293
O_LOOKUP(LBDATD,I)=O_FIXHD(23) SETTSCT1.294
O_LOOKUP(LBHRD ,I)=O_FIXHD(24) SETTSCT1.295
O_LOOKUP(LBMIND,I)=O_FIXHD(25) SETTSCT1.296
O_LOOKUP(LBDAYD,I)=O_FIXHD(27) SETTSCT1.297
ENDDO SETTSCT1.298
MEANLEV=-1 SETTSCT1.299
LDUMP=.TRUE. SETTSCT1.300
ELSE SETTSCT1.301
MEANLEV=0 SETTSCT1.302
ENDIF SETTSCT1.303
CL SETTSCT1.304
CL Suppress assimilation using RUN_ASSIM_MODE if necessary SETTSCT1.305
CL SETTSCT1.306
LASSIMILATION=LASSIMILATION.AND. SETTSCT1.307
& ((RUN_ASSIM_MODE.EQ.'Ocean ').OR. SETTSCT1.308
& (RUN_ASSIM_MODE.EQ.'Coupled ')) SETTSCT1.309
*ENDIF OCNASSM SETTSCT1.310
C SETTSCT1.311
DO JINTF=1,N_INTF_O GMB1F405.551
IF (INTERFACE_STEPSim(JINTF,o_im).GT.0) THEN GMB1F405.552
LINTERFACE = LINTERFACE .OR. GMB1F405.553
& (MOD(STEP-INTERFACE_FSTEPim(JINTF,o_im), GMB1F405.554
& INTERFACE_STEPSim(JINTF,o_im)).EQ.0 GMB1F405.555
& .AND. STEP.GE.INTERFACE_FSTEPim(JINTF,o_im) GMB1F405.556
& .AND. STEP.LE.INTERFACE_LSTEPim(JINTF,o_im) ) GMB1F405.557
ENDIF GMB1F405.558
ENDDO GMB1F405.559
C SETTSCT1.357
*IF DEF,OCNASSM SETTSCT1.358
C SETTSCT1.359
CL Set the other high level switches for ocean assimilation SETTSCT1.360
C SETTSCT1.361
LAS_CLM_INC = ( STEP.GT.O_CLM_FIRSTSTEP .AND. GRB1F305.673
& (STEP .LE. O_CLM_LASTSTEP) ) GRB1F305.674
IF ( LAS_CLM_INC .AND. O_INT_CLM_INC.GT.0 ) LAS_CLM_INC = SETTSCT1.364
& MOD(STEP - O_CLM_FIRSTSTEP, O_INT_CLM_INC) .EQ. 0 GRB1F305.675
C SETTSCT1.366
IF ( LASSIMILATION ) THEN SETTSCT1.367
C SETTSCT1.368
LAS_ADD_INC = O_INT_ANA_STP .GT. 1 SETTSCT1.369
C SETTSCT1.370
IF ( O_INT_ANA_STP .GT. 0 ) THEN SETTSCT1.371
LAS_ANA_STP = MOD (STEP_ASSIM, O_INT_ANA_STP) .EQ. 0 SETTSCT1.372
ELSE SETTSCT1.373
LAS_ANA_STP = .FALSE. SETTSCT1.374
END IF SETTSCT1.375
C SETTSCT1.376
IF ( O_INT_EVO_BTS .GT. 0 ) THEN SETTSCT1.377
LAS_EVO_BTS = MOD (STEP_ASSIM, O_INT_EVO_BTS) .EQ. 0 SETTSCT1.378
ELSE SETTSCT1.379
LAS_EVO_BTS = .FALSE. SETTSCT1.380
END IF SETTSCT1.381
C SETTSCT1.382
IF ( O_INT_VRY_BTS .GT. 0 ) THEN SETTSCT1.383
LAS_VRY_BTS = MOD (STEP_ASSIM, O_INT_VRY_BTS) .EQ. 0 SETTSCT1.384
ELSE SETTSCT1.385
LAS_VRY_BTS = .FALSE. SETTSCT1.386
END IF SETTSCT1.387
C SETTSCT1.388
IF ( O_INT_WTS_ACC .GT. 0 ) THEN SETTSCT1.389
LAS_WTS_ACC = MOD (STEP_ASSIM, O_INT_WTS_ACC) .EQ. 0 SETTSCT1.390
ELSE SETTSCT1.391
LAS_WTS_ACC = .FALSE. SETTSCT1.392
END IF SETTSCT1.393
C SETTSCT1.394
IF ( O_INT_OBS_FRSH .GT. 0 ) THEN SETTSCT1.395
LAS_OBS_FRSH = MOD (STEP_ASSIM, O_INT_OBS_FRSH) .EQ. 1 OMB1F401.99
OMB1F401.100
ELSE SETTSCT1.397
LAS_OBS_FRSH = .FALSE. SETTSCT1.398
END IF SETTSCT1.399
C SETTSCT1.400
IF ( O_INT_OBS_OUT .GT. 0 ) THEN SETTSCT1.401
LAS_OBS_OUT = MOD (STEP_ASSIM, O_INT_OBS_OUT) .EQ. 0 SETTSCT1.402
ELSE SETTSCT1.403
LAS_OBS_OUT = .FALSE. SETTSCT1.404
END IF SETTSCT1.405
C SETTSCT1.406
IF ( O_INT_OBS_STR .GT. 0 ) THEN SETTSCT1.407
LAS_OBS_STR = MOD (STEP_ASSIM, O_INT_OBS_STR) .EQ. 0 SETTSCT1.408
ELSE SETTSCT1.409
LAS_OBS_STR = .FALSE. SETTSCT1.410
END IF SETTSCT1.411
C SETTSCT1.412
IF ( O_INT_FLD_STR .GT. 0 ) THEN SETTSCT1.413
LAS_FLD_STR = MOD (STEP_ASSIM, O_INT_FLD_STR) .EQ. 0 SETTSCT1.414
ELSE SETTSCT1.415
LAS_FLD_STR = .FALSE. SETTSCT1.416
END IF SETTSCT1.417
C SETTSCT1.418
ELSE SETTSCT1.419
C SETTSCT1.420
LAS_ADD_INC = .FALSE. SETTSCT1.421
C SETTSCT1.422
END IF ! LASSIMILATION SETTSCT1.423
C SETTSCT1.424
*ENDIF OCNASSM SETTSCT1.425
C SETTSCT1.426
ENDIF ! Test on ocean_im GRB1F305.676
*ENDIF OCEAN SETTSCT1.427
CL---------------------------------------------------------------------- SETTSCT1.428
CL 2. Set STASHflags to activate diagnostics this timestep SETTSCT1.429
CL SETTSCT1.430
C IS is section number SETTSCT1.431
C IE is item number within section SETTSCT1.432
C IL is item number within STASHlist SETTSCT1.433
C II is counter within given section/item sublist for repeated items SETTSCT1.434
C IM is cumulative active item number within section SETTSCT1.435
C SETTSCT1.436
CL Clear all STASHflags SETTSCT1.437
SETTSCT1.438
DO IS=0,NSECTS SETTSCT1.439
DO IM=0,NITEMS @DYALLOC.3279
SF(IM,IS) = .FALSE. SETTSCT1.441
ENDDO SETTSCT1.442
ENDDO SETTSCT1.443
SETTSCT1.444
CL Loop over all items in STASHlist, enabling flags for diagnostics SETTSCT1.445
CL which are active this step -- SETTSCT1.446
CL note that atmosphere/ocean diagnostics must be discriminated SETTSCT1.447
SETTSCT1.448
DO IL =1,TOTITEMS GSS1F305.797
modl=STLIST(st_model_code ,IL) GSS1F305.798
IS =STLIST(st_sect_no_code,IL) GSS1F305.799
IM =STLIST(st_item_code ,IL) GSS1F305.800
C Skip diagnostics which are not active TJ061293.276
IF(STLIST(st_proc_no_code,IL).EQ.0) GOTO 200 GSS1F305.801
C Skip diagnostics which don't correspond to the submodel this timestep TJ061293.277
! IF(ISUBMODL.NE.modl) GOTO 200 GSS1F305.802
IF(Internal_model.NE.modl) GOTO 200 GSS1F305.803
C SETTSCT1.465
C STASHflag is off by default. SETTSCT1.466
C But reset ... SETTSCT1.467
C SETTSCT1.468
C ... if required every timestep between start and end SETTSCT1.469
C SETTSCT1.470
IF (STLIST(st_freq_code,IL).EQ.1) THEN SETTSCT1.471
IF (STEP.GE.STLIST(st_start_time_code,IL).AND. SETTSCT1.472
& (STEP.LE.STLIST(st_end_time_code,IL).OR. SETTSCT1.473
& STLIST(st_end_time_code,IL).EQ.st_infinite_time)) SETTSCT1.474
& THEN @DYALLOC.3280
SF(IM,IS)=.TRUE. @DYALLOC.3281
SF(0 ,IS)=.TRUE. @DYALLOC.3282
ENDIF @DYALLOC.3283
C SETTSCT1.476
C ... if required at specified times and this is one of them SETTSCT1.477
C SETTSCT1.478
ELSEIF(STLIST(st_freq_code,IL).LT.0)THEN SETTSCT1.479
NTAB=-STLIST(st_freq_code,IL) SETTSCT1.480
DO IT=1,NSTTIMS SETTSCT1.481
IF(STTABL(IT,NTAB).EQ.st_end_of_list) GOTO 200 SETTSCT1.482
IF(STEP.EQ.STTABL(IT,NTAB)) THEN @DYALLOC.3284
SF(IM,IS)=.TRUE. @DYALLOC.3285
SF(0 ,IS)=.TRUE. @DYALLOC.3286
ENDIF @DYALLOC.3287
ENDDO SETTSCT1.484
C SETTSCT1.485
C ... if required every N timesteps and this is one of them SETTSCT1.486
C SETTSCT1.487
ELSEIF (STLIST(st_freq_code,IL).GT.0) THEN SETTSCT1.488
IF (MOD((STEP-STLIST(st_start_time_code,IL)), SETTSCT1.489
& STLIST(st_freq_code,IL)).EQ.0.AND. SETTSCT1.490
& STEP.GE.STLIST(st_start_time_code,IL).AND. SETTSCT1.491
& (STEP.LE.STLIST(st_end_time_code,IL).OR. SETTSCT1.492
& STLIST(st_end_time_code,IL).EQ.st_infinite_time)) SETTSCT1.493
& THEN @DYALLOC.3288
SF(IM,IS)=.TRUE. @DYALLOC.3289
SF(0 ,IS)=.TRUE. @DYALLOC.3290
ENDIF @DYALLOC.3291
ENDIF SETTSCT1.495
C SETTSCT1.496
C Next item SETTSCT1.497
C SETTSCT1.498
200 CONTINUE SETTSCT1.499
ENDDO SETTSCT1.500
CL---------------------------------------------------------------------- SETTSCT1.501
CL 3. If errors occurred in setting STASHflags, set error return code SETTSCT1.502
IF (ICODE.EQ.1) CMESSAGE='SETTSCTL: STASH code error' SETTSCT1.503
999 CONTINUE SETTSCT1.504
RETURN SETTSCT1.505
CL---------------------------------------------------------------------- SETTSCT1.506
END SETTSCT1.507
*ENDIF SETTSCT1.508