*IF DEF,CONTROL,AND,DEF,ATMOS ATMDYN1.2
C ******************************COPYRIGHT****************************** GTS2F400.361
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.362
C GTS2F400.363
C Use, duplication or disclosure of this code is subject to the GTS2F400.364
C restrictions as set forth in the contract. GTS2F400.365
C GTS2F400.366
C Meteorological Office GTS2F400.367
C London Road GTS2F400.368
C BRACKNELL GTS2F400.369
C Berkshire UK GTS2F400.370
C RG12 2SZ GTS2F400.371
C GTS2F400.372
C If no contract has been raised with this copy of the code, the use, GTS2F400.373
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.374
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.375
C Modelling at the above address. GTS2F400.376
C ******************************COPYRIGHT****************************** GTS2F400.377
C GTS2F400.378
CLL Subroutine ATM_DYN ------------------------------------------------ ATMDYN1.3
CLL ATMDYN1.4
CLL Purpose : Sets filtering constants every N_SET_FILTER steps. Calls ATMDYN1.5
CLL ADJ_CTL to cary out A_ADJSTEPS adjustment steps. Corrects ATMDYN1.6
CLL THETA,Q,QCL,QCF, to THETAL,QT. Advects TR_VARS tracers. ATMDYN1.7
CLL Sets divergence damping coefficients. Calls ADV_CTL to ATMDYN1.8
CLL advect U,V,THETAL,QT using two-step Heun scheme., and add ATMDYN1.9
CLL divergence damping. Calculates vertical velocity ATMDYN1.10
CLL diagnostics. Removes the mass weighting from MASS_UWT. ATMDYN1.11
CLL Calls DIF_CTL to diffuse these values. Removes negative ATMDYN1.12
CLL moistures (QT_POS) and filters PU and PV (FILT_UV) ATMDYN1.13
CLL ATMDYN1.14
CLL Level 2 control routine ATMDYN1.15
CLL version for CRAY YMP ATMDYN1.16
CLL ATMDYN1.17
CLL ATMDYN1.18
CLL AV, DR <- programmer of some or all of previous code or changes ATMDYN1.19
CLL R.Stratton <- programmer of some or all of previous code or changes ATMDYN1.20
CLL ATMDYN1.21
CLL Model Modification history from model version 3.0: ATMDYN1.22
CLL version Date ATMDYN1.23
CLL 3.1 22/01/93 Add debugging code under *DEF BITCOM11 to assist TJ270193.39
CLL bit compare tests across new releases of the model. TJ270193.40
CLL 3.1 2/02/93 : added comdeck CHSUNITS to define NUNITS for i/o. RS030293.91
CLL 3.2 13/07/93 Changed CHARACTER*(*) to CHARACTER*(80) for TS150793.7
CLL portability. Author: Tracey Smith TS150793.8
CLL 3.2 07/04/93 Dynamic allocation of main arrays. R T H Barnes @DYALLOC.240
CLL 3.3 29/09/93 Correction to Omega on pressure levels diagnostic. MM280993.1
CLL Levels list was of wrong data type. MM280993.2
CLL 3.3 13/12/93 Half timestep dynamics. A.S.Lawless AL131293.38
CLL 3.4 02/08/94 Add diagnostic 201,13 for -ve QT fix. Tim Johns. ACH1F304.13
CLL NOTE: only output on final sweep if NSWEEPS = 2. ACH1F304.14
CLL 3.4 23/08/94 Option added for local corrections for neg. QT ACH1F304.15
CLL C.D.Hall ACH1F304.16
CLL 3.3 27/09/94 Treatment of aerosol variable. Pete Clark. APC1F304.1
CLL 3.4 06/06/94 DEF BITCOM11 replaced by logical L_WRIT_DYN GSS1F304.1286
CLL Time step control mechanism for WRITD1 added GSS1F304.1287
CLL Argument LLINTS passed to ADJ_CTL,ADV_CTL, GSS1F304.1288
CLL MASS_UWT,FILT_FLD GSS1F304.1289
CLL Argument LWHITBROM passed to ADV_CTL, ADJ_CTL, GSS1F304.1290
CLL MASS_UWT GSS1F304.1291
CLL S.J.Swarbrick GSS1F304.1292
!LL 3.4 04/08/95 Changed LS_CLD call to GLUE_CLD. Andrew Bushell. AYY2F400.200
! 4.0 31/01/95 : Add angular momemtum as a diagnostics at the end ARS1F400.1
! of section 10. R A Stratton ARS1F400.2
CLL 3.5 27/03/95 Sub-Model Changes : Remove run time constants ADR1F305.7
CLL from Atmos Dump Headers. D.Robinson ADR1F305.8
! 3.5 28/03/95 MPP code: Change updateable area, APB0F305.1
! add halo updates, recode negative APB0F305.2
! theta check. P.Burton APB0F305.3
CLL 3.5 05/06/95 Chgs to SI & STINDEX arrays. RTHBarnes GRB4F305.1
CLL 4.0 06/09/95 Put Timer calls around Tracer Advn. routines. RTHB GRB1F400.1
CLL 4.0 18/08/95 Option for dynamics timestep different from ARB0F400.1
CLL physics/assm. timestep. RTHBarnes ARB0F400.2
CLL 4.0 01/09/95 New section 10 diagnostics : items 229/230 for ABM3F400.1
CLL qcl/qcf before dynamics. Call to new subroutine ABM3F400.2
CLL DIAG10_QC added. B Macpherson ABM3F400.3
CLL 4.0 05/09/95 Model hour and minute added to call to TRSRCE. APC3F400.1
CLL Programmer Pete Clark. APC3F400.2
!LL 4.0 04/12/95 Mod for dynamic array put in at vn3.5 AYY2F400.201
!LL - for lexcon. (N. Farnon) AYY2F400.202
CLL 4.1 02/05/96 AMPlitude added to argument list in TRSRCE calls. AWO2F401.1
CLL TRSRCE called to insert 3_D natural SO2 emissions. AWO2F401.2
CLL Tracer Advection called for Sulphur Cycle tracers. AWO2F401.3
CLL M.Woodage AWO2F401.4
! 4.1 02/04/96 Added TYPFLDPT arguments to dynamics routines APB0F401.2
! which allows many of the differences between APB0F401.3
! MPP and "normal" code to be at top level APB0F401.4
! P.Burton APB0F401.5
! 4.2 20/08/96 MPP mods for tracer advection. RTHBarnes. ARB1F402.70
!LL 4.2 16/08/96 Added TYPFLDPT arguments to SET_FIL and APB0F402.51
!LL FILT_FLD P.Burton APB0F402.52
!LL 4.2 12/12/96 Need new SWAPBOUNDS at end of routine for LAM ARB2F402.1
!LL configuration in MPP mode. RTHBarnes. ARB2F402.2
! 4.2 Oct. 96 T3E migration: IF DEF CRAY removed GSS9F402.89
! S.J.Swarbrick GSS9F402.90
!LL 4.3 10/02/97 Added PPX arguments to COPY_DIAG GPB1F403.282
!LL Added ARGFLDPT args to dyn_diag routines GPB1F403.283
!LL P.Burton GPB1F403.284
!LL 4.3 14/04/97 Change WRITD1 to DUMPCTL1 calls for MPP. K Rogers GKR4F403.101
!LL 4.3 18/03/97 Add SWAPBOUNDS for fields filtered in ADR1F403.5
!LL FILT_FLD. D. Robinson. ADR1F403.6
!LL 4.3 17/03/97 Set no.of levels for each tracer advection ARB1F403.66
!LL section. Also print no.of EW sweeps for tracer ARB1F403.67
!LL advection under control of LPRVXN. R.T.H.Barnes. ARB1F403.68
!LL 4.3 6/3/97 Moved loop for multiple dynamics timesteps down GPB3F403.7
!LL to atmdyn. P.Burton GPB3F403.8
CLL ATMDYN1.24
!LL 4.4 17/10/97 CMESSAGE not passed to pe0 for -ve theta GSM2F405.1
!LL S.D.Mullerworth GSM2F405.2
!LL 4.3 28/01/97 Alter argument list for DIV_CALC. RTHBarnes. ARB2F403.1
!LL 4.4 2/7/97 Added ARGFLDPT args to ATMOS_ANG_MOM P.Burton GPB1F404.153
CLL AAD2F404.306
CLL 4.4 14/07/97 Optimisation of memory usage and run time: AAD2F404.307
CLL AAD2F404.308
CLL 1. Remove copy from WORK3 to TH after ADJ AAD2F404.309
CLL 2. Pass RS from MASS_UWT to FILTUV via WORK4. AAD2F404.310
CLL AAD2F404.311
CLL A. Dickinson AAD2F404.312
CLL AAD2F404.313
!LL 4.4 Sept 97 Mixed phase precip scheme uses zero array ADM2F404.33
!LL instead of QCF in call to THETL_QT. ADM2F404.34
!LL Include tracer advection of ice. Ensure qcf not ADM2F404.35
!LL negative at start of dynamics due to physics polar ADM2F404.36
!LL update problem. Damian Wilson. ADM2F404.37
!LL 4.5 Apr 98 Added start-end args to V_INT call GSM1F405.561
!LL S.D.Mullerworth GSM1F405.562
!LL 4.5 June 98 Swapbounds moved out of tracer advection GPB7F405.1
!LL Deborah Salmond GPB7F405.2
!LL 4.5 18/03/98 Add tracer advection of NH3 for S Cycle if required AWO2F405.1
!LL M Woodage AWO2F405.2
!LL 4.5 May 1998 Add tracer advection for 3 modes of soot. AWO2F405.3
!LL Luke Robinson. AWO2F405.4
!LL 4.5 Sept 98 Remove negative qcf warning messages ADM0F405.302
!LL Damian Wilson. ADM0F405.303
CLL 4.5 15/07/98 Add code to advect 3D CO2 tracer. C.D.Jones ACN2F405.136
!LL 4.5 25/02/98 Ensure evolution is independent of diagnostics AFF2F405.1
!LL (229-230,10) being calculated, by removing AFF2F405.2
!LL thermodynamic balancing before DIAG10_QC. AFF2F405.3
!LL Bruce Macpherson AFF2F405.4
!LL 4.5 13/02/98 Default for WRITD1 dump write diagnostics changed to ARR2F405.1
!LL force write only on first sweep of dynamics (instead ARR2F405.2
!LL of each sweep overwriting the previous). R. Rawlins ARR2F405.3
CLL 4.5 13/05/98 Modified calls to GLUE_CLD and THLQT2THQ to ASK1F405.82
CLL include new RHcrit variable. S. Cusack ASK1F405.83
!LL 4.5 02/09/98 Print NSWEEPS if Wind Limit or Divergence GDR8F405.52
!LL Limit exceeded. D. Robinson. GDR8F405.53
!LL 4.5 05/05/98 Add Fujitsu vectorization directives. GRB0F405.34
!LL RBarnes@ecmwf.int GRB0F405.35
!LL GRB0F405.36
CLL programming standard : unified model documentation paper No 3 ATMDYN1.25
CLL ATMDYN1.26
CLL system components covered : P1 ATMDYN1.27
CLL ATMDYN1.28
CLL system task : P0 ATMDYN1.29
CLL ATMDYN1.30
CLL Documentation : unified model documentation paper no. P0, version ATMDYN1.31
CLL 11, dated 26/11/90, and UMDP NO C4 version 5 ATMDYN1.32
CLL dated 23/11/90. ATMDYN1.33
CLLEND ----------------------------------------------------------------- ATMDYN1.34
CLL Arguments copy @DYALLOC.241
@DYALLOC.242
SUBROUTINE ATM_DYN 1,155ATMDYN1.35
& (U_FIELDDA,P_FIELDDA,P_LEVELSDA,Q_LEVELSDA,P_ROWSDA, AYY2F400.203
& NUM_STASH_LEVELSDA, AYY2F400.204
& STASHLEN,PSTAR_OLD,DYN_TIMESTEP, GPB3F403.9
*CALL ARGSIZE
@DYALLOC.245
*CALL ARGD1
@DYALLOC.246
*CALL ARGDUMA
@DYALLOC.247
*CALL ARGDUMO
@DYALLOC.248
*CALL ARGDUMW
GKR1F401.166
*CALL ARGSTS
@DYALLOC.249
*CALL ARGPTRA
@DYALLOC.250
*CALL ARGPTRO
@DYALLOC.251
*CALL ARGCONA
@DYALLOC.252
*CALL ARGPPX
GKR0F305.878
*CALL ARGFLDPT
APB0F401.6
& ICODE,CMESSAGE,WRITD1_TEST) GSS1F304.1293
ATMDYN1.42
IMPLICIT NONE ATMDYN1.43
ATMDYN1.44
*CALL CMAXSIZE
@DYALLOC.254
*CALL CSUBMODL
GSS1F305.919
*CALL TYPSIZE
@DYALLOC.255
*CALL TYPD1
@DYALLOC.256
*CALL TYPDUMA
@DYALLOC.257
*CALL TYPDUMO
@DYALLOC.258
*CALL TYPDUMW
GKR1F401.167
*CALL TYPSTS
@DYALLOC.259
*CALL TYPPTRA
@DYALLOC.260
*CALL TYPPTRO
@DYALLOC.261
*CALL TYPCONA
@DYALLOC.262
*CALL PPXLOOK
GKR0F305.879
APB0F401.7
! All TYPFLDPT arguments are intent IN APB0F401.8
*CALL TYPFLDPT
APB0F401.9
@DYALLOC.263
INTEGER ATMDYN1.45
& U_FIELDDA, ! Extra copy of U_FIELD for dynamic alloc @DYALLOC.264
& P_FIELDDA, ! and P_FIELD @DYALLOC.265
& P_LEVELSDA, ! and P_LEVELS @DYALLOC.266
& Q_LEVELSDA, ! and Q_LEVELS AYY2F400.205
& P_ROWSDA, ! and P_ROWS AYY2F400.206
& NUM_STASH_LEVELSDA,! and NUM_STASH_LEVELS @DYALLOC.267
& STASHLEN, ! max. length of stashwork required ARB0F400.4
& ICODE ! Return code : 0 Normal exit ATMDYN1.50
C ! :>0 Error ATMDYN1.51
REAL @DYALLOC.268
& PSTAR_OLD(P_FIELD) ! OUT pstar at beginning of dynamics @DYALLOC.269
& ,DYN_TIMESTEP ! IN timestep for dynamics ARB0F400.6
CHARACTER*80 TS150793.9
& CMESSAGE ! Error message if ICODE >0 ATMDYN1.54
ATMDYN1.55
CL include comdecks @DYALLOC.270
ATMDYN1.58
*CALL CHSUNITS
RS030293.92
*CALL CCONTROL
ATMDYN1.60
*CALL CHISTORY
GDR3F305.6
*CALL CPHYSCON
ATMDYN1.65
*CALL CTIME
@DYALLOC.271
*CALL C_GLOBAL
GSS1F304.1294
*CALL C_WRITD
GSS1F304.1295
*CALL CRUNTIMC
ADR1F305.9
*CALL CPPRINT
ARB1F403.69
*IF DEF,MPP ARB1F402.71
*CALL PARVARS
ARB1F402.72
*ENDIF ARB1F402.73
ATMDYN1.70
CL Dynamically allocated area for stash processing ATMDYN1.71
ATMDYN1.72
REAL ATMDYN1.73
& STASHWORK(STASHLEN) ATMDYN1.74
ATMDYN1.76
REAL MM280993.3
& OMEGA_PRESS(NUM_STASH_LEVELSDA) @DYALLOC.272
ATMDYN1.79
CXL additional dynamically allocated workspace ATMDYN1.80
ATMDYN1.81
REAL ATMDYN1.82
& KD(P_LEVELSDA), @DYALLOC.273
& U_MEAN(U_FIELDDA,P_LEVELSDA), @DYALLOC.274
& WORK1(U_FIELDDA,P_LEVELSDA), @DYALLOC.275
& ETADOT(P_FIELDDA,P_LEVELSDA), @DYALLOC.276
& RS_FUNCTIONS(P_FIELDDA,P_LEVELSDA) @DYALLOC.277
ATMDYN1.88
REAL ATMDYN1.89
& WORK2(P_FIELDDA), @DYALLOC.278
& WORK3(P_FIELDDA*P_LEVELSDA) @DYALLOC.279
&, WORK4(P_FIELDDA,P_LEVELSDA) AAD2F404.314
&, WORK5(P_FIELDDA,Q_LEVELSDA) AYY2F400.208
&, ZERO_FIELD(P_FIELDDA,Q_LEVELSDA) ! mixed phase precip ADM2F404.38
ATMDYN1.92
LOGICAL ATMDYN1.93
& LIST(P_LEVELSDA) @DYALLOC.280
ATMDYN1.95
INTEGER ATMDYN1.96
*IF DEF,MPP ARB1F402.74
& TRACER_EW_SWEEPS(glsize(2),P_LEVELSDA) ARB1F402.75
*ELSE ARB1F402.76
& TRACER_EW_SWEEPS(P_ROWSDA,P_LEVELSDA) AYY2F400.209
*ENDIF ARB1F402.77
ATMDYN1.98
C*L external subroutine calls ATMDYN1.99
ATMDYN1.100
EXTERNAL ATMDYN1.101
& SET_FIL, ATMDYN1.102
& ADJ_CTL, ATMDYN1.103
& THETL_QT, ATMDYN1.104
& SET_TRAC, ARB1F402.78
& TRAC_ADV, ATMDYN1.105
& TRAC_VERT_ADV, ATMDYN1.106
& ADV_CTL, ATMDYN1.107
& MASS_UWT, ATMDYN1.108
& MASS_UWT_UV, ATD1F400.1
& DIF_CTL, ATMDYN1.109
& QT_POS, ATMDYN1.110
& FILT_UV, ATMDYN1.111
& STASH, ATMDYN1.112
& SET_LEVELS_LIST, ATMDYN1.113
& DIAG10_QC, ABM3F400.4
& DIAG10_A, ATMDYN1.114
& DIAG10_B, ATMDYN1.115
& TIMER ATMDYN1.116
& ,GLUE_CLD AYY2F400.210
& ,DIV_CALC AL131293.40
& ,MAXWIND AL131293.41
& ,DIVTEST AL131293.42
& ,ATMOS_ANG_MOM ARS1F400.3
& ,TRSRCE APC1F304.2
& ,TRBDRY APC1F304.3
*IF DEF,GLOBAL ATMDYN1.117
& ,FILT_FLD ATMDYN1.118
*ENDIF ATMDYN1.119
& ,DUMPCTL GKR4F403.102
ATMDYN1.120
ATMDYN1.121
ATMDYN1.128
C* --------------------------------------------------------------------- ATMDYN1.129
C Other local variables ATMDYN1.130
ATMDYN1.131
INTEGER ATMDYN1.132
& FIRST_POINT, ATMDYN1.135
& LAST_POINT, ATMDYN1.136
& VAR, ATMDYN1.137
& I, ATMDYN1.138
& II, ATD1F400.2
& IQNEG(P_FIELDDA), ! Pointer to negative q points to reset ATD1F400.3
& ! before calling tracer advection on qt ATD1F400.4
* & ,PRESSURE_ALTITUDE ! Pressure altitude for steep slope test ATD1F400.5
& ISL, ATMDYN1.139
& NI, ATMDYN1.140
& OMEGA_P_LEVS, ATMDYN1.141
& K, ATMDYN1.142
& POINTS, ATMDYN1.144
& START_LEVEL, ATMDYN1.145
& END_LEVEL, ATMDYN1.146
& LEVEL, ATMDYN1.147
& INEG_THETA, ATMDYN1.148
& WORK_LENGTH ATMDYN1.149
& ,IQCFNEG(P_FIELDDA) ADM2F404.122
& ,IM_IDENT ! internal model identifier GRB4F305.2
& ,IM_INDEX ! internal model index for STASH arrays GRB4F305.3
& ,I_COUNT AL131293.43
& ,NSWEEPS ! Number of sweeps of dynamics to perform AL131293.44
& ,ERROR AL131293.45
& ,A_STEP GDR5F305.7
& ,I_LOOP ! loop for multiple dynamics timesteps GPB3F403.10
*IF DEF,MPP APB0F305.9
APB0F305.10
INTEGER J,I_start,I_end APB0F401.10
INTEGER info APB0F401.11
INTEGER int_log ! integer version of logical: APB0F401.12
! ! 0 = .FALSE. APB0F401.13
! ! 1 = .TRUE. APB0F401.14
APB0F305.12
*ENDIF APB0F305.13
ATMDYN1.150
REAL ATMDYN1.151
& ADJUSTMENT_TIMESTEP, ATMDYN1.152
& LONGITUDE_STEP_INVERSE, ATMDYN1.153
& LATITUDE_STEP_INVERSE, ATMDYN1.154
& SCALAR, ATMDYN1.155
& WEIGHT ATMDYN1.156
& ,LOCAL_ADVSTEP ! Local advection timestep AL131293.46
& ,LOCAL_ADJSTEP ! Local adjustment timestep AL131293.47
& ,PU,PL AL131293.48
& ,DIVERG(P_FIELDDA) ! Horizontal divergence at top level ANF1F304.36
ATMDYN1.157
LOGICAL ATMDYN1.158
& L_GEOP ATMDYN1.159
&,L_WIND ! Set to true if wind exceeds limit AL131293.50
&,L_DIVERG ! Set to true if divergence exceeds limit AL131293.51
&,L_NEG_THETA_FOUND ! set to true if negative theta found APB0F401.15
&,FIRST_SWEEP,LAST_SWEEP ! First and/or last sweeps of dynamics ARR2F405.4
&,WRITD1_FIRST_SWEEP ! =T write on first sweep, =F on last sweep ARR2F405.5
&,WRITD1_THIS_SWEEP ! diagnostic dump write local switch ARR2F405.6
ARR2F405.7
PARAMETER(WRITD1_FIRST_SWEEP=.true.) ! default for dump write ARR2F405.8
C AL131293.52
*CALL P_EXNERC
AL131293.53
ATMDYN1.160
ATMDYN1.161
ICODE=0 ATMDYN1.162
A_STEP = STEPim(atmos_im) GDR5F305.8
im_ident = atmos_im GRB4F305.4
im_index = internal_model_index(im_ident) GRB4F305.5
ATMDYN1.163
DO I_LOOP=1,A_SWEEPS_DYN GPB3F403.11
GPB3F403.12
! Must convert thetal,qt to theta,q,cl,cf for 2nd and subsequent loops GPB3F403.13
GPB3F403.14
IF (I_LOOP .GT. 1) THEN GPB3F403.15
GPB3F403.16
IF (LTIMER) CALL TIMER
('THL2TH ',3) GPB3F403.17
GPB3F403.18
CALL THLQT2THQ
(P_FIELD,Q_LEVELS, GPB3F403.19
& D1(JPSTAR),D1(JP_EXNER(1)), GPB3F403.20
& AKH,BKH,A_LEVDEPC(JAK),A_LEVDEPC(JBK),RHCRIT, GPB3F403.21
& D1(JTHETA(1)), GPB3F403.22
& D1(JQ(1)),D1(JQCF(1)),D1(JQCL(1)),D1(JRHC(1)), ASK1F405.84
& ICODE) GPB3F403.24
GPB3F403.25
IF (LTIMER) CALL TIMER
('THL2TH ',4) GPB3F403.26
GPB3F403.27
ENDIF GPB3F403.28
ADJUSTMENT_TIMESTEP = DYN_TIMESTEP/A_ADJSTEPS ARB0F400.7
LONGITUDE_STEP_INVERSE=RECIP_PI_OVER_180/A_REALHD(1) ATMDYN1.165
LATITUDE_STEP_INVERSE=RECIP_PI_OVER_180/A_REALHD(2) ATMDYN1.166
NSWEEPS=1 AL131293.54
C AL131293.55
C TEST OF WIND AL131293.56
IF (L_HALF_TIMESTEP_DYN) THEN AL131293.57
L_WIND=.FALSE. AL131293.58
CALL MAXWIND
(L_WIND,WIND_LIMIT,D1(JU(1)),D1(JV(1)),U_FIELD, ADR1F305.11
& FIRST_FLD_PT,LAST_U_FLD_PT,P_LEVELS) APB0F401.16
*IF DEF,MPP APB0F401.17
! Create a global version of L_WIND - so if any processor has L_WIND APB0F401.18
! set to .TRUE. - all processors will. APB0F401.19
int_log=0 APB0F401.20
IF (L_WIND) int_log=1 APB0F401.21
CALL GC_IMAX(
1,N_PROCS,info,int_log) APB0F401.22
IF (int_log .EQ. 1) L_WIND=.TRUE. APB0F401.23
APB0F401.24
*ENDIF APB0F401.25
C IF WIND EXCEEDS LIMIT DO TWO SWEEPS AL131293.61
IF (L_WIND) THEN AL131293.62
NSWEEPS=2 AL131293.63
WRITE(6,'(A,I2)') ' WIND LIMIT EXCEEDED. NSWEEPS = ', GDR8F405.54
& NSWEEPS GDR8F405.55
END IF AL131293.64
END IF AL131293.65
C AL131293.66
C TEST OF DIVERGENCE AL131293.67
IF (L_HALF_TIMESTEP_DIV) THEN AL131293.68
C CALCULATE DIVERGENCE OF TOP LEVEL AL131293.69
K=P_LEVELS AL131293.70
CALL DIV_CALC
(D1(JU(K)),D1(JV(K)),U_FIELD,P_FIELD,ROW_LENGTH, ARB2F403.2
*CALL ARGFLDPT
ARB2F403.3
& SEC_P_LATITUDE,COS_U_LATITUDE, ARB2F403.4
& LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE,DIVERG) ARB2F403.5
C COMPARE DIVERGENCE WITH LIMIT SET AL131293.74
L_DIVERG=.FALSE. AL131293.75
CALL DIVTEST
(P_FIELD, APB0F401.26
& (FIRST_ROW-1)*ROW_LENGTH+1,LAST_U_FLD_PT, APB0F401.27
& DIVERG,DIV_LIMIT,L_DIVERG) APB0F401.28
*IF DEF,MPP APB0F401.29
! Create a global version of L_DIVERG - so if any processor has L_DIVERG APB0F401.30
! set to .TRUE. - all processors will. APB0F401.31
int_log=0 APB0F401.32
IF (L_DIVERG) int_log=1 APB0F401.33
CALL GC_IMAX(
1,N_PROCS,info,int_log) APB0F401.34
IF (int_log .EQ. 1) L_DIVERG=.TRUE. APB0F401.35
APB0F401.36
*ENDIF APB0F401.37
C IF DIVERGENCE EXCEEDS LIMIT DO TWO SWEEPS AL131293.78
IF (L_DIVERG) THEN AL131293.79
NSWEEPS=2 AL131293.80
WRITE(6,'(A,I2)') ' DIVERGENCE LIMIT EXCEEDED.'// GDR8F405.56
& ' NSWEEPS = ',NSWEEPS GDR8F405.57
END IF AL131293.81
END IF AL131293.82
C AL131293.83
LOCAL_ADVSTEP = DYN_TIMESTEP/NSWEEPS ARB0F400.8
LOCAL_ADJSTEP = LOCAL_ADVSTEP/A_ADJSTEPS ARB0F400.9
ATMDYN1.167
IF (L_LSPICE) THEN ADM2F404.123
! Remove negative qcf before dynamics,generated by ac and physics, ADM2F404.124
! probably. ADM2F404.125
DO K=1,Q_LEVELS ADM2F404.126
II=0 ADM2F404.127
IQCFNEG(1)=0 ADM2F404.128
DO I=1,P_FIELD ADM2F404.129
IF(D1(JQCF(K)+I-1).LT.0.0) THEN ADM2F404.130
II=II+1 ADM2F404.131
IQCFNEG(II)=I ADM2F404.132
D1(JQCF(K)+I-1)=0.0 ADM2F404.133
ENDIF ADM2F404.134
ENDDO ADM2F404.135
ENDDO ADM2F404.142
END IF ADM2F404.143
IF(L_TRACER_THETAL_QT)THEN ATD1F400.6
C Remove negative qt generated by ac and physics, ATD1F400.7
C before calling tracer (postive definite) advection dynamics ATD1F400.8
DO K=1,Q_LEVELS ATD1F400.9
II=0 ATD1F400.10
IQNEG(1)=0 ATD1F400.11
! loop over all points, including valid halos APB0F401.38
DO I=FIRST_VALID_PT,LAST_P_VALID_PT APB0F401.39
IF(D1(JQ(K)+I-1).LT.0.0) THEN ATD1F400.13
II=II+1 ATD1F400.14
IQNEG(II)=I ATD1F400.15
D1(JQ(K)+I-1)=0.0 ATD1F400.16
ENDIF ATD1F400.17
ENDDO ATD1F400.18
IF(II.GT.0) THEN ATD1F400.19
WRITE(6,*) 'BEFORE DYNAMICS:' ATD1F400.20
WRITE(6,*) 'LEVEL, NO. Q NEG ',K,II ATD1F400.21
& ,(IQNEG(I),I=1,II) ATD1F400.22
WRITE(6,*) ' NEGATIVE VALUES SET TO ZERO.' ATD1F400.23
END IF ATD1F400.24
ENDDO ATD1F400.25
END IF ATD1F400.26
*IF DEF,GLOBAL ATMDYN1.168
ATMDYN1.169
IF(L_SET_FILTER) THEN ATMDYN1.170
ATMDYN1.171
IF(LTIMER) THEN ATMDYN1.172
CALL TIMER
('SET_FIL ',3) ATMDYN1.173
END IF ATMDYN1.174
CALL SET_FIL
(D1(JU(1)),GRAV_WAVE_SPEED,ADJUSTMENT_TIMESTEP, ADR1F305.14
& DYN_TIMESTEP,SEC_P_LATITUDE, ARB0F400.10
& A_ROWDEPC(JFILTER_WAVE_NUMBER_P_ROWS), ATMDYN1.178
& A_ROWDEPC(JFILTER_WAVE_NUMBER_U_ROWS), ATMDYN1.179
& LONGITUDE_STEP_INVERSE,A_INTHD(19),A_INTHD(20), ATMDYN1.180
& P_FIELD,U_FIELD,P_LEVELS,ROW_LENGTH, ADR1F305.16
*CALL ARGFLDPT
APB0F402.53
& FILTERING_SAFETY_FACTOR,TWO_D_GRID_CORRECTION) ATD1F400.27
ATMDYN1.184
IF(LTIMER) THEN ATMDYN1.185
CALL TIMER
('SET_FIL ',4) ATMDYN1.186
END IF ATMDYN1.187
ATMDYN1.188
END IF ATMDYN1.189
ATMDYN1.190
*ENDIF ATMDYN1.191
ATMDYN1.192
*IF DEF,GLOBAL ATMDYN1.193
CL If this is the last assimilation step before the analysis dump ATMDYN1.194
CL is written then call FILT_FLD to field filter the moisture and ATMDYN1.195
CL potential temperature fields but not the cloud fields. ATMDYN1.196
CL The polar values of surface pressure, potential temperature, ATMDYN1.197
CL moisture and cloud fields are reset to the mean value of the ATMDYN1.198
CL surrounding row. ATMDYN1.199
IF( A_STEP.EQ.ASSIM_FIRSTSTEPim(a_im) + ASSIM_STEPSim(a_im) .AND. GDR5F305.9
& (MODEL_ASSIM_MODE.EQ."Atmosphere" .OR. ATMDYN1.201
& MODEL_ASSIM_MODE.EQ."Coupled ") .AND. ATMDYN1.202
& (RUN_ASSIM_MODE .EQ."Atmosphere" .OR. ATMDYN1.203
& RUN_ASSIM_MODE .EQ."Coupled ") .AND. ATMDYN1.204
& L_FIELD_FLT ) THEN ATMDYN1.205
CALL FILT_FLD
(P_FIELD,P_LEVELS,Q_LEVELS,ROW_LENGTH, ATMDYN1.206
*CALL ARGFLDPT
APB0F402.54
& D1(JPSTAR),D1(JTHETA(1)),D1(JQ(1)),D1(JQCL(1)), ATMDYN1.207
& D1(JQCF(1)),IFAX,TRIGS, ATMDYN1.208
& A_ROWDEPC(JFILTER_WAVE_NUMBER_P_ROWS), ATMDYN1.209
& A_INTHD(19),A_INTHD(20),A_LEVDEPC(JAK), ATMDYN1.210
& A_LEVDEPC(JBK),A_LEVDEPC(JDELTA_AK), ATMDYN1.211
& A_LEVDEPC(JDELTA_BK),COS_P_LATITUDE, ATMDYN1.212
& RS_FUNCTIONS,LATITUDE_STEP_INVERSE,LLINTS) GSS1F304.1297
ADR1F403.7
*IF DEF,MPP ADR1F403.8
! Update the halos of fields filtered in FILT_FLD ADR1F403.9
CALL SWAPBOUNDS
(D1(JPSTAR),ROW_LENGTH,P_ROWS, ADR1F403.10
& EW_Halo,NS_Halo,1) ADR1F403.11
CALL SWAPBOUNDS
(D1(JTHETA(1)),ROW_LENGTH,P_ROWS, ADR1F403.12
& EW_Halo,NS_Halo,P_LEVELS) ADR1F403.13
CALL SWAPBOUNDS
(D1(JQ(1)),ROW_LENGTH,P_ROWS, ADR1F403.14
& EW_Halo,NS_Halo,Q_LEVELS) ADR1F403.15
CALL SWAPBOUNDS
(D1(JQCL(1)),ROW_LENGTH,P_ROWS, ADR1F403.16
& EW_Halo,NS_Halo,Q_LEVELS) ADR1F403.17
CALL SWAPBOUNDS
(D1(JQCF(1)),ROW_LENGTH,P_ROWS, ADR1F403.18
& EW_Halo,NS_Halo,Q_LEVELS) ADR1F403.19
*ENDIF ADR1F403.20
ADR1F403.21
END IF ATMDYN1.214
*ENDIF ATMDYN1.215
APB0F401.40
FIRST_POINT=(FIRST_ROW-1)*ROW_LENGTH+1 APB0F401.41
LAST_POINT=P_LAST_ROW*ROW_LENGTH APB0F401.42
APB0F401.43
ATMDYN1.221
! if cloud water/ice diagnostics are required before dynamics ABM3F400.5
IF(I_LOOP.EQ.1 .AND. ( SF(229,10).OR.SF(230,10) ) ) THEN ABM3F400.6
! copy qcl/qcf to STASH diagnostic ABM3F400.34
CALL DIAG10_QC
(D1(JQCL(1)),D1(JQCF(1)), ABM3F400.35
& ROW_LENGTH,P_LEVELS,Q_LEVELS,P_FIELD, ABM3F400.36
& NSECTS,NITEMS,TOTITEMS,NUM_STASH_LEVELS, ABM3F400.37
& NUM_LEVEL_LISTS,LEN_STLIST,STASHLEN,SF, ABM3F400.38
& STINDEX(1,1,0,im_index),STLIST, ABM3F400.39
& SI(1,0,im_index),STASH_LEVELS,STASHWORK, ABM3F400.40
& im_ident, GPB1F403.285
*CALL ARGFLDPT
GPB1F403.286
*CALL ARGPPX
GPB1F403.287
& ICODE,CMESSAGE) ABM3F400.41
ENDIF ABM3F400.42
DO I_COUNT=1,NSWEEPS AL131293.86
ARR2F405.9
! Find whether this is first or last sweep of the dynamics ARR2F405.10
IF(I_LOOP.EQ.1.AND.I_COUNT.EQ.1) THEN ARR2F405.11
FIRST_SWEEP=.true. ARR2F405.12
ELSE ARR2F405.13
FIRST_SWEEP=.false. ARR2F405.14
ENDIF ARR2F405.15
IF(I_LOOP.EQ.A_SWEEPS_DYN.AND.I_COUNT.EQ.NSWEEPS) THEN ARR2F405.16
LAST_SWEEP=.true. ARR2F405.17
ELSE ARR2F405.18
LAST_SWEEP=.false. ARR2F405.19
ENDIF ARR2F405.20
ARR2F405.21
! Diagnostic dumps on first sweep (default), otherwise last sweep ARR2F405.22
IF((FIRST_SWEEP.AND.WRITD1_FIRST_SWEEP).OR. ARR2F405.23
& (LAST_SWEEP.AND..NOT.WRITD1_FIRST_SWEEP)) THEN ARR2F405.24
WRITD1_THIS_SWEEP=.true. ARR2F405.25
ELSE ARR2F405.26
WRITD1_THIS_SWEEP=.false. ARR2F405.27
ENDIF ARR2F405.28
IF (I_COUNT.GT.1) THEN AL131293.87
C CONVERT THETAL AND QT TO THETA AND Q FOR SECOND SWEEP AL131293.88
C CONVERT THETA TO TEMPERATURE AL131293.89
DO K=1,Q_LEVELS AL131293.90
! loop over all points, including valid halos APB0F401.48
! Fujitsu vectorization directive GRB0F405.37
!OCL NOVREC GRB0F405.38
DO I=FIRST_VALID_PT,LAST_P_VALID_PT APB0F401.49
PU=D1(JPSTAR+I-1)*BKH(K+1)+AKH(K+1) AL131293.92
PL=D1(JPSTAR+I-1)*BKH(K)+AKH(K) AL131293.93
D1(JTHETA(K)+I-1)=D1(JTHETA(K)+I-1) * AL131293.94
& P_EXNER_C(D1(JP_EXNER(K+1)+I-1),D1(JP_EXNER(K)+I-1), AL131293.95
& PU,PL,KAPPA) AL131293.96
END DO AL131293.97
END DO AL131293.98
! CALL GLUE_CLD TO CONVERT TO TEMPERATURE AND Q AYY2F400.211
! Output LS_GRID_QC and LS_BS in WORK4 and WORK5 as CF not being updated AYY2F400.212
CALL GLUE_CLD
(A_LEVDEPC(JAK),A_LEVDEPC(JBK),D1(JPSTAR), AYY2F400.213
& RHCRIT,Q_LEVELS,D1(JRHC(1)),P_FIELD,P_FIELD,D1(JTHETA(1)), ASK1F405.85
& WORK3,D1(JQ(1)),D1(JQCF(1)),D1(JQCL(1)),WORK4,WORK5,ERROR) AYY2F400.214
C CONVERT TEMPERATURE BACK TO THETA AL131293.103
DO K=1,Q_LEVELS AL131293.104
! loop over all points, including valid halos APB0F401.50
! Fujitsu vectorization directive GRB0F405.39
!OCL NOVREC GRB0F405.40
DO I=FIRST_VALID_PT,LAST_P_VALID_PT APB0F401.51
PU=D1(JPSTAR+I-1)*BKH(K+1)+AKH(K+1) AL131293.106
PL=D1(JPSTAR+I-1)*BKH(K)+AKH(K) AL131293.107
D1(JTHETA(K)+I-1)=D1(JTHETA(K)+I-1) / AL131293.108
& P_EXNER_C(D1(JP_EXNER(K+1)+I-1),D1(JP_EXNER(K)+I-1), AL131293.109
& PU,PL,KAPPA) AL131293.110
END DO AL131293.111
END DO AL131293.112
END IF AL131293.113
CL --------------------------------------------------------------------- ATMDYN1.222
CL Section 10 - adjustment ATMDYN1.223
CL call ADJ_CTL to perform adjustment steps ATMDYN1.224
CL --------------------------------------------------------------------- ATMDYN1.225
CL ATMDYN1.226
CL WORK1 holds V_MEAN ATMDYN1.227
CL ATMDYN1.228
ATMDYN1.229
CL copy THETA into WORK3 ATMDYN1.230
ATMDYN1.231
DO LEVEL=1,P_LEVELS ATMDYN1.232
K= (LEVEL-1)*P_FIELD ATMDYN1.233
DO I=1,P_FIELD ATMDYN1.234
WORK3(I+K) = D1(JTHETA(LEVEL)+I-1) ATMDYN1.235
END DO ATMDYN1.236
END DO ATMDYN1.237
ATMDYN1.238
IF(LTIMER) THEN ATMDYN1.239
CALL TIMER
('ADJ_CTL ',3) ATMDYN1.240
CALL TIMER
('ADJUSTMENT',5) GPB1F401.13
END IF ATMDYN1.241
ATMDYN1.242
C If geopotential required as diagnostic or required for calculating ATMDYN1.243
C another diagnostic then set logical to obtain field from ADJ_CTL. ATMDYN1.244
ATMDYN1.245
L_GEOP = .FALSE. ATMDYN1.246
IF(SF(206,10).OR.SF(219,10).OR.SF(220,10).OR.SF(221,10) ATMDYN1.247
& .OR.SF(222,10)) L_GEOP=.TRUE. ATMDYN1.248
ATMDYN1.249
CL 10.1 call ADJ_CTL to adjust model. ATMDYN1.250
CL ATMDYN1.251
IF (L_WRIT_DYN .AND. WRITD1_THIS_SWEEP .AND. ARR2F405.29
& (A_STEP.LE.T_WRITD1_END .OR. T_WRITD1_END .EQ. 0)) THEN GSS1F304.1299
ATMDYN1.252
IF (A_STEP.EQ.T_WRITD1_START .OR. GSS1F304.1300
& WRITD1_TEST.GT.WRITD1_TEST_PREV) THEN GSS1F304.1301
TJ270193.47
CALL DUMPCTL
( GKR4F403.103
*CALL ARGSIZE
GKR4F403.104
*CALL ARGD1
GKR4F403.105
*CALL ARGDUMA
GKR4F403.106
*CALL ARGDUMO
GKR4F403.107
*CALL ARGDUMW
GKR4F403.108
*CALL ARGCONA
GKR4F403.109
*CALL ARGPTRA
GKR4F403.110
*CALL ARGSTS
GKR4F403.111
*CALL ARGPPX
GKR4F403.112
& atmos_sm,0,.TRUE.,'bf_adj_ctl',a_step, GIE1F405.20
& ICODE,CMESSAGE) GKR4F403.114
GSS1F304.1303
END IF GSS1F304.1304
GSS1F304.1305
END IF GSS1F304.1306
GSS1F304.1307
CALL ADJ_CTL
( ATMDYN1.253
& D1(JU(1)),D1(JV(1)),WORK3,D1(JQ(1)),D1(JPSTAR), AAD2F404.315
& D1(JOROG),RS_FUNCTIONS,U_MEAN, ATMDYN1.255
& WORK1,D1(JP_EXNER(1)),ETADOT, ATMDYN1.256
& PSTAR_OLD,COS_P_LATITUDE,COS_U_LATITUDE,SEC_P_LATITUDE, ATMDYN1.257
& SEC_U_LATITUDE,TAN_U_LATITUDE,F1,F2,F3, ATMDYN1.258
& LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE, ATMDYN1.259
& A_LEVDEPC(JAK),A_LEVDEPC(JBK), ATMDYN1.260
& A_LEVDEPC(JDELTA_AK),A_LEVDEPC(JDELTA_BK), ATMDYN1.261
& A_LEVDEPC(JTHETA_REF),LOCAL_ADJSTEP,A_ADJSTEPS, AL131293.114
& A_INTHD(19),A_INTHD(20), ATMDYN1.263
& ROW_LENGTH,P_LEVELS,Q_LEVELS, APB0F401.52
*CALL ARGFLDPT
APB0F401.53
& P_FIELD,U_FIELD,AKH,BKH,AKH_TO_THE_KAPPA, ATMDYN1.265
& BKH_TO_THE_KAPPA,AK_TO_THE_KAPPA,BK_TO_THE_KAPPA, ATMDYN1.266
& COS_LONGITUDE,SIN_LONGITUDE, ATMDYN1.267
& TRIGS,IFAX,A_ROWDEPC(JFILTER_WAVE_NUMBER_P_ROWS), ATMDYN1.268
& A_ROWDEPC(JFILTER_WAVE_NUMBER_U_ROWS),ICODE,CMESSAGE, ATMDYN1.269
& L_NEG_PSTAR,STASHWORK(SI(206,10,im_index)),L_GEOP, GRB4F305.6
& ADJ_TIME_SMOOTHING_WEIGHT,ADJ_TIME_SMOOTHING_COEFF, GSS1F304.1308
& LLINTS,LWHITBROM) GSS1F304.1309
ATMDYN1.272
IF (L_WRIT_DYN .AND. WRITD1_THIS_SWEEP .AND. ARR2F405.30
& (A_STEP.LE.T_WRITD1_END .OR. T_WRITD1_END .EQ. 0)) THEN GSS1F304.1311
TJ270193.51
IF (A_STEP.EQ.T_WRITD1_START .OR. GSS1F304.1312
& WRITD1_TEST.GT.WRITD1_TEST_PREV) THEN GSS1F304.1313
GSS1F304.1314
CALL DUMPCTL
( GKR4F403.115
*CALL ARGSIZE
GKR4F403.116
*CALL ARGD1
GKR4F403.117
*CALL ARGDUMA
GKR4F403.118
*CALL ARGDUMO
GKR4F403.119
*CALL ARGDUMW
GKR4F403.120
*CALL ARGCONA
GKR4F403.121
*CALL ARGPTRA
GKR4F403.122
*CALL ARGSTS
GKR4F403.123
*CALL ARGPPX
GKR4F403.124
& atmos_sm,0,.TRUE.,'af_adj_ctl',a_step, GIE1F405.1
& ICODE,CMESSAGE) GKR4F403.126
GSS1F304.1316
END IF GSS1F304.1317
GSS1F304.1318
END IF GSS1F304.1319
GSS1F304.1320
IF(LTIMER) THEN ATMDYN1.273
CALL TIMER
('ADJ_CTL ',4) ATMDYN1.274
CALL TIMER
('ADJUSTMENT',6) GPB1F401.14
END IF ATMDYN1.275
ATMDYN1.276
IF(ICODE.GT.0) RETURN ATMDYN1.277
ATMDYN1.278
! Call DIAG10_A only on last sweep of long physics timestep ARB0F400.11
! and of half-timestep dynamics. ARB0F400.12
IF (I_LOOP.eq.A_SWEEPS_DYN .and. I_COUNT.eq.NSWEEPS) THEN ARB0F400.13
IF(LTIMER) THEN ATMDYN1.289
CALL TIMER
('DIAG10_A',3) ATMDYN1.290
END IF ATMDYN1.291
ATMDYN1.292
CL calculate amount of work-space required by DIAG10_A. ATMDYN1.293
IF(SF(207,10).OR.SF(208,10).OR.SF(209,10).OR.SF(210,10)) THEN ATMDYN1.294
WORK_LENGTH = P_FIELD*P_LEVELS ATMDYN1.295
ELSE ATMDYN1.296
WORK_LENGTH = 1 ATMDYN1.297
END IF ATMDYN1.298
ATMDYN1.299
CL call DIAG10_A to obtain diagnostics before call to THETL_QT. ATMDYN1.300
! N.B. PSTAR_OLD saved in 1st call to P_TH_ADJ from ADJ_CTL above, ARB0F400.14
! so timestep for pstar tendency should be local advection step. ARB0F400.15
ATMDYN1.301
CALL DIAG10_A
( ATMDYN1.302
& D1(JPSTAR),PSTAR_OLD,U_MEAN,WORK1,D1(JQ(1)),ETADOT, ATMDYN1.303
& D1(JTHETA(1)),D1(JP_EXNER(1)),RS_FUNCTIONS, ATMDYN1.304
& SEC_U_LATITUDE,ROW_LENGTH,P_LEVELS,Q_LEVELS,P_FIELD, ATMDYN1.305
& U_FIELD,A_LEVDEPC(JAK),A_LEVDEPC(JBK),AKH,BKH, ATMDYN1.306
& LOCAL_ADVSTEP,FIRST_POINT,LAST_POINT, ARB0F400.16
& NSECTS,NITEMS,TOTITEMS,NUM_STASH_LEVELS, ATMDYN1.308
& NUM_LEVEL_LISTS,LEN_STLIST,STASHLEN,SF, ATMDYN1.309
& STINDEX(1,1,0,im_index),STLIST, GRB4F305.7
& SI(1,0,im_index),STASH_LEVELS,STASHWORK, GRB4F305.8
& WORK3,WORK_LENGTH, GPB1F403.288
& im_ident, GPB1F403.289
*CALL ARGFLDPT
GPB1F403.290
*CALL ARGPPX
GPB1F403.291
& ICODE,CMESSAGE) GPB1F403.292
ATMDYN1.312
IF(LTIMER) THEN ATMDYN1.313
CALL TIMER
('DIAG10_A',4) ATMDYN1.314
END IF ATMDYN1.315
ATMDYN1.316
END IF ! I_LOOP.eq.A_SWEEPS_DYN .and. I_COUNT.eq.NSWEEPS ARB0F400.17
ATMDYN1.317
CL 10.2 call THETL_QT to convert THETA and Q to THETAL and QT ATMDYN1.318
CL ATMDYN1.319
ATMDYN1.320
IF(LTIMER) THEN ATMDYN1.321
CALL TIMER
('THETL_QT',3) ATMDYN1.322
END IF ATMDYN1.323
ATMDYN1.324
! If using mixed phase precip scheme then do not want ice in the call ADM2F404.57
! to THETL_QT. ADM2F404.58
IF (L_LSPICE) THEN ADM2F404.59
! Mixed phase precip scheme. Define an array of zeros instead ADM2F404.60
! of using QCF. ADM2F404.61
DO K=1,Q_LEVELS ADM2F404.62
DO I=1,P_FIELD ADM2F404.63
ZERO_FIELD(I,K)=0.0 ADM2F404.64
END DO ADM2F404.65
END DO ADM2F404.66
! Now call THETL_QT with the zero field ADM2F404.67
CALL THETL_QT
( ADM2F404.68
& D1(JPSTAR),D1(JTHETA(1)),D1(JQ(1)),D1(JQCL(1)),ZERO_FIELD, ADM2F404.69
& D1(JP_EXNER(1)),AKH,BKH,P_FIELD,P_LEVELS,Q_LEVELS) ADM2F404.70
! Else the call to THETL_QT does contain the QCF field ADM2F404.71
ELSE ADM2F404.72
CALL THETL_QT
( ATMDYN1.325
& D1(JPSTAR),D1(JTHETA(1)),D1(JQ(1)),D1(JQCL(1)),D1(JQCF(1)), ATMDYN1.326
& D1(JP_EXNER(1)),AKH,BKH,P_FIELD,P_LEVELS,Q_LEVELS) ATMDYN1.327
! END IF for L_LSPICE ADM2F404.73
END IF ADM2F404.74
ATMDYN1.328
IF(LTIMER) THEN ATMDYN1.329
CALL TIMER
('THETL_QT',4) ATMDYN1.330
END IF ATMDYN1.331
ATMDYN1.332
! Call DIAG10_B only on last sweep of long physics timestep ARB0F400.18
! and of half-timestep dynamics. ARB0F400.19
IF (I_LOOP.eq.A_SWEEPS_DYN .and. I_COUNT.eq.NSWEEPS) THEN ARB0F400.20
ATMDYN1.333
CL Check to see if any diagnostic calculated by DIAG10_B requested. ATMDYN1.334
IF(SF(211,10).OR.SF(212,10).OR.SF(213,10).OR.SF(214,10).OR. ATMDYN1.335
& SF(215,10).OR.SF(216,10).OR.SF(217,10).OR.SF(218,10).OR. ATMDYN1.336
& SF(219,10).OR.SF(220,10).OR.SF(221,10).OR.SF(222,10)) THEN ATMDYN1.337
ATMDYN1.338
IF(LTIMER) THEN ATMDYN1.339
CALL TIMER
('DIAG10_B',3) ATMDYN1.340
END IF ATMDYN1.341
ATMDYN1.342
CL call DIAG10_B to obtain diagnostics after call to THETL_QT. ATMDYN1.343
ATMDYN1.344
CALL DIAG10_B
( ATMDYN1.345
& U_MEAN,WORK1,D1(JQ(1)),D1(JTHETA(1)), ATMDYN1.346
& D1(JP_EXNER(1)),D1(JPSTAR),D1(JU(1)),D1(JV(1)), ATMDYN1.347
& SEC_U_LATITUDE,AKH,BKH,ROW_LENGTH,P_LEVELS, ATMDYN1.348
& Q_LEVELS,P_FIELD,U_FIELD,FIRST_POINT,LAST_POINT, ATMDYN1.349
& NSECTS,NITEMS,TOTITEMS,NUM_STASH_LEVELS, ATMDYN1.350
& NUM_LEVEL_LISTS,LEN_STLIST,STASHLEN,SF, ATMDYN1.351
& STINDEX(1,1,0,im_index),STLIST, GRB4F305.9
& SI(1,0,im_index),STASH_LEVELS,STASHWORK, GRB4F305.10
& WORK3, GPB1F403.293
& im_ident, GPB1F403.294
*CALL ARGFLDPT
GPB1F403.295
*CALL ARGPPX
GPB1F403.296
& ICODE,CMESSAGE) GPB1F403.297
ATMDYN1.354
IF(LTIMER) THEN ATMDYN1.355
CALL TIMER
('DIAG10_B',4) ATMDYN1.356
END IF ATMDYN1.357
ATMDYN1.358
END IF ! SFs ARB0F400.21
ATMDYN1.360
! Calculate angular momentum diagnostics if required on last sweep only ARS1F400.4
ARS1F400.5
IF (I_COUNT.EQ.NSWEEPS) THEN ARS1F400.6
IF(SF(223,10).OR.SF(224,10).OR.SF(225,10).OR. ARS1F400.7
& SF(226,10).OR.SF(227,10).OR.SF(228,10)) THEN ARS1F400.8
CALL ATMOS_ANG_MOM
(P_FIELD,U_FIELD,P_ROWS,ROW_LENGTH,P_LEVELS, ARS1F400.9
*CALL ARGFLDPT
GPB1F404.154
& A_REALHD(1),A_REALHD(2),A_REALHD(3),A_REALHD(4), ARS1F400.10
& D1(JPSTAR),D1(JU(1)),D1(JV(1)),RS_FUNCTIONS, ARS1F400.11
& COS_U_LATITUDE, ARS1F400.12
& A_LEVDEPC(JDELTA_AK),A_LEVDEPC(JDELTA_BK), ARS1F400.13
& SF(223,10),SF(224,10),SF(225,10), ARS1F400.14
& SF(226,10),SF(227,10),SF(228,10), ARS1F400.15
& STASHWORK(SI(223,10,im_index)),STASHWORK(SI(224,10,im_index)), ARS1F400.16
& STASHWORK(SI(225,10,im_index)),STASHWORK(SI(226,10,im_index)), ARS1F400.17
& STASHWORK(SI(227,10,im_index)),STASHWORK(SI(228,10,im_index))) ARS1F400.18
ENDIF ARS1F400.19
ENDIF ARS1F400.20
ARS1F400.21
ARS1F400.22
IF(LTIMER) THEN ATMDYN1.361
CALL TIMER
('STASH ',3) ATMDYN1.362
END IF ATMDYN1.363
ATMDYN1.364
CALL STASH
(a_sm,a_im,10,STASHWORK, GKR0F305.880
*CALL ARGSIZE
@DYALLOC.285
*CALL ARGD1
@DYALLOC.286
*CALL ARGDUMA
@DYALLOC.287
*CALL ARGDUMO
@DYALLOC.288
*CALL ARGDUMW
GKR1F401.168
*CALL ARGSTS
@DYALLOC.289
*CALL ARGPPX
GKR0F305.881
& ICODE,CMESSAGE) @DYALLOC.293
ATMDYN1.366
IF(LTIMER) THEN ATMDYN1.367
CALL TIMER
('STASH ',4) ATMDYN1.368
END IF ATMDYN1.369
ATMDYN1.370
IF(ICODE.GT.0) THEN ATMDYN1.371
RETURN ATMDYN1.372
END IF ATMDYN1.373
ATMDYN1.374
END IF ! I_LOOP.eq.A_SWEEPS_DYN .and. I_COUNT.eq.NSWEEPS ARB0F400.22
ATMDYN1.375
CL --------------------------------------------------------------------- ATMDYN1.376
CL Section 11 Tracer Advection ATMDYN1.377
CL --------------------------------------------------------------------- ATMDYN1.378
CL WORK1 holds V_MEAN. ATMDYN1.379
CL ATMDYN1.380
CL 11.1 horizontal advection of tracers. mass weighted values are output ATMDYN1.381
ATMDYN1.382
C Enable calculation of number of tracer sweeps. ATD1F400.28
IF(L_TRACER_THETAL_QT .OR. TR_VARS.NE.0 .OR. L_MURK AWO2F401.5
& .OR. L_SOOT AWO2F405.74
!------- Code for soot variables ----------- AWO2F405.75
! AWO2F405.76
& .OR. L_SULPC_SO2 .OR. L_LSPICE .OR. L_CO2_INTERACTIVE) THEN ACN2F405.137
GRB1F400.2
IF(LTIMER) THEN GSM1F401.1
CALL TIMER
('TRAC_ADV',3) GRB1F400.3
END IF GSM1F401.2
ATMDYN1.384
CL Call SET_TRAC to calculate number of horizontal sweeps required at ATMDYN1.385
CL each level. ATMDYN1.386
ATMDYN1.387
CALL SET_TRAC
(TRACER_EW_SWEEPS,U_MEAN,P_FIELD,U_FIELD, ATMDYN1.388
& P_LEVELS,ROW_LENGTH, ARB1F402.79
*CALL ARGFLDPT
ARB1F402.80
& LONGITUDE_STEP_INVERSE,SEC_P_LATITUDE, ARB1F402.81
& LOCAL_ADVSTEP,PSTAR_OLD,A_LEVDEPC(JDELTA_AK), ARB1F402.82
& A_LEVDEPC(JDELTA_BK),RS_FUNCTIONS) ARB1F402.83
ATMDYN1.393
! Print number of EW tracer advection sweeps required, under same ARB1F403.70
! control variables as for max/min print diagnostics. ARB1F403.71
IF(LPRVXN) THEN ARB1F403.72
IF(MOD(A_STEP-PRVXN_FIRST,PRVXN_STEP).EQ.0 .AND. ARB1F403.73
& A_STEP.GE.PRVXN_FIRST .AND. ARB1F403.74
& (PRVXN_LAST.LE.0 .OR. A_STEP.LE.PRVXN_LAST)) THEN ARB1F403.75
do k = 1,p_levels ARB1F403.76
write(6,*)' ATMDYN; level, tracer_ew_sweeps ',k, ARB1F403.77
*IF DEF,MPP ARB1F403.78
& (tracer_ew_sweeps(i,k),i=1,glsize(2)) ARB1F403.79
*ELSE ARB1F403.80
& (tracer_ew_sweeps(i,k),i=1,p_rows) ARB1F403.81
*ENDIF ARB1F403.82
end do ARB1F403.83
END IF ARB1F403.84
END IF ARB1F403.85
ARB1F403.86
*IF DEF,MPP ARB1F402.84
FIRST_POINT = START_POINT_NO_HALO ARB1F402.85
POINTS = upd_P_ROWS * ROW_LENGTH ARB1F402.86
*IF DEF,GLOBAL APB0F401.1796
! If processor includes North or South polar row, compute a pt. on it ARB1F402.87
IF (at_top_of_LPG) THEN ARB1F402.88
FIRST_POINT = FIRST_POINT -Offx -1 ARB1F402.89
POINTS = POINTS +Offx +1 ARB1F402.90
END IF ARB1F402.91
IF (at_base_of_LPG) THEN ARB1F402.92
POINTS = POINTS +Offx +1 ARB1F402.93
END IF ARB1F402.94
*ENDIF ARB1F402.95
*ELSE ARB1F402.96
*IF DEF,GLOBAL ARB1F402.97
POINTS=upd_P_ROWS*ROW_LENGTH+2 APB0F401.1797
FIRST_POINT=ROW_LENGTH APB0F401.1798
*ELSE APB0F401.1799
POINTS=upd_P_ROWS*ROW_LENGTH APB0F401.1800
FIRST_POINT=ROW_LENGTH+1 APB0F401.1801
*ENDIF APB0F401.1802
*ENDIF ARB1F402.98
ATMDYN1.396
START_LEVEL=1+P_LEVELS-TR_LEVELS ATMDYN1.397
END_LEVEL=START_LEVEL+TRAC_ADV_LEVELS-1 ADR1F305.20
ATMDYN1.399
IF (TR_VARS.NE.0) THEN APC1F304.5
DO VAR=1,TR_VARS ATMDYN1.400
ATMDYN1.401
*IF DEF,MPP GPB7F405.3
GPB7F405.4
! Call swapbounds to update halo points for tracer advection levels. GPB7F405.5
CALL SWAPBOUNDS
(D1(JTRACER(START_LEVEL,VAR)),ROW_LENGTH,P_ROWS, GPB7F405.6
& EW_Halo,NS_Halo,TRAC_ADV_LEVELS) GPB7F405.7
GPB7F405.8
*ENDIF GPB7F405.9
GPB7F405.10
DO K=START_LEVEL,END_LEVEL ATMDYN1.402
ATMDYN1.403
CALL TRAC_ADV
(D1(JTRACER(K,VAR)),TRACER_EW_SWEEPS(1,K), ATMDYN1.404
& U_MEAN(1,K),WORK1(1,K),U_FIELD,P_FIELD, ATMDYN1.405
& LOCAL_ADVSTEP,ROW_LENGTH, ARB1F402.99
*CALL ARGFLDPT
ARB1F402.100
& SEC_P_LATITUDE,COS_P_LATITUDE,RS_FUNCTIONS(1,K), ATMDYN1.407
& PSTAR_OLD,A_LEVDEPC(JDELTA_AK+K-1), ATMDYN1.408
& A_LEVDEPC(JDELTA_BK+K-1), ATMDYN1.409
& LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE, ATMDYN1.410
& L_SUPERBEE) ATMDYN1.411
ATMDYN1.412
END DO ATMDYN1.413
ATMDYN1.414
*IF DEF,MPP GPB7F405.11
GPB7F405.12
! Call swapbounds to update halo points for tracer advection levels. GPB7F405.13
CALL SWAPBOUNDS
(D1(JTRACER(START_LEVEL,VAR)),ROW_LENGTH,P_ROWS, GPB7F405.14
& EW_Halo,NS_Halo,TRAC_ADV_LEVELS) GPB7F405.15
GPB7F405.16
*ENDIF GPB7F405.17
GPB7F405.18
ATMDYN1.418
! For vertical advection of tracers call TRAC_VERT_ADV with ATD1F400.30
! penultimate argument (L_TRACER_THETAL_QT) set to .FALSE. ATD1F400.31
CALL TRAC_VERT_ADV
(D1(JTRACER(1,VAR)),ETADOT,D1(JPSTAR), ATMDYN1.419
& P_FIELD,LOCAL_ADVSTEP,START_LEVEL,END_LEVEL, AL131293.123
& FIRST_POINT,POINTS,P_LEVELS, ATMDYN1.421
& P_LEVELS+1-TR_LEVELS, ATMDYN1.422
& P_LEVELS,RS_FUNCTIONS,A_LEVDEPC(JAK), ATMDYN1.423
& A_LEVDEPC(JBK),A_LEVDEPC(JDELTA_AK), ATMDYN1.424
& A_LEVDEPC(JDELTA_BK),WORK2, ATD1F400.32
& .FALSE.,L_SUPERBEE) ATD1F400.33
ATMDYN1.426
*IF DEF,GLOBAL APB0F401.1803
C Copy the one polar value updated by TRAC_VERT_ADV to the other APB0F401.1804
C polar locations. APB0F401.1805
DO K= START_LEVEL,END_LEVEL APB0F401.1806
*IF DEF,MPP ARB1F402.101
IF (at_top_of_LPG) THEN ARB1F402.102
DO I = FIRST_VALID_PT+Offx-1,START_POINT_NO_HALO-Offx-3 ARB1F402.103
D1(JTRACER(K,VAR)+I) = ARB1F402.104
& D1(JTRACER(K,VAR)+START_POINT_NO_HALO-Offx-2) ARB1F402.105
END DO ARB1F402.106
END IF ARB1F402.107
IF (at_base_of_LPG) THEN ARB1F402.108
DO I = END_P_POINT_NO_HALO+Offx+1,LAST_P_VALID_PT-Offx-1 ARB1F402.109
D1(JTRACER(K,VAR)+I) = ARB1F402.110
& D1(JTRACER(K,VAR)+END_P_POINT_NO_HALO+Offx) ARB1F402.111
END DO ARB1F402.112
END IF ARB1F402.113
*ELSE ARB1F402.114
DO I = 0, ROW_LENGTH - 2 APB0F401.1807
D1(JTRACER(K,VAR)+I) = D1(JTRACER(K,VAR)+ROW_LENGTH-1) APB0F401.1808
D1(JTRACER(K,VAR)+P_FIELD-1-I) = APB0F401.1809
& D1(JTRACER(K,VAR)+P_FIELD-ROW_LENGTH) APB0F401.1810
END DO APB0F401.1811
*ENDIF ARB1F402.115
END DO APB0F401.1812
*ENDIF APB0F401.1813
*IF DEF,MPP ARB1F402.116
ARB1F402.117
! Call swapbounds to update halo points for tracer advection levels. ARB1F402.118
CALL SWAPBOUNDS
(D1(JTRACER(START_LEVEL,VAR)),ROW_LENGTH,P_ROWS, ARB1F402.119
& EW_Halo,NS_Halo,TRAC_ADV_LEVELS) ARB1F402.120
ARB1F402.121
*ENDIF ARB1F402.122
END DO ATMDYN1.427
ENDIF APC1F304.6
APC1F304.7
C Advect Aerosol if required. APC1F304.8
IF (L_MURK) THEN APC1F304.9
START_LEVEL=1 APC1F304.10
END_LEVEL=A_INTHD(13) ! Boundary layer levels APC0F405.764
CL If required, add source increment to aerosol field. APC1F304.12
IF (L_MURK_SOURCE) THEN APC1F304.13
DO K=START_LEVEL,END_LEVEL APC1F304.14
CALL TRSRCE
( APC1F304.15
& A_LEVDEPC(JDELTA_AK+K-1), APC1F304.16
& A_LEVDEPC(JDELTA_BK+K-1), APC1F304.17
& P_FIELD, APC1F304.18
& P_FIELD, APC1F304.19
& D1(JPSTAR), APC1F304.20
& D1(JMURK(K)), APC1F304.21
& D1(JMURK_SOURCE(K)), APC1F304.22
& LOCAL_ADVSTEP, APC1F304.23
& I_HOUR, APC3F400.3
& I_MINUTE, APC3F400.4
& 0.1, ! AMPlitude of diurnal variation of emissions AWO2F401.7
& ICODE APC1F304.24
& ) APC1F304.25
IF (ICODE.GT.0) THEN APC1F304.26
CMESSAGE='Error in TRSRCE' APC1F304.27
RETURN APC1F304.28
ENDIF APC1F304.29
END DO APC1F304.30
END IF APC1F304.31
C Now advect the aerosol APC1F304.32
IF (L_MURK_ADVECT) THEN APC1F304.33
GPB7F405.19
*IF DEF,MPP GPB7F405.20
GPB7F405.21
! Call swapbounds to update halo points for tracer advection levels. GPB7F405.22
K = END_LEVEL-START_LEVEL+1 GPB7F405.23
CALL SWAPBOUNDS
(D1(JMURK(START_LEVEL)),ROW_LENGTH,P_ROWS, GPB7F405.24
& EW_Halo,NS_Halo,K) GPB7F405.25
GPB7F405.26
*ENDIF GPB7F405.27
GPB7F405.28
DO K=START_LEVEL,END_LEVEL APC1F304.34
APC1F304.35
CALL TRAC_ADV
(D1(JMURK(K)),TRACER_EW_SWEEPS(1,K), APC1F304.36
& U_MEAN(1,K),WORK1(1,K),U_FIELD,P_FIELD, APC1F304.37
& LOCAL_ADVSTEP,ROW_LENGTH, ARB1F402.123
*CALL ARGFLDPT
ARB1F402.124
& SEC_P_LATITUDE,COS_P_LATITUDE,RS_FUNCTIONS(1,K), APC1F304.39
& PSTAR_OLD,A_LEVDEPC(JDELTA_AK+K-1), APC1F304.40
& A_LEVDEPC(JDELTA_BK+K-1), APC1F304.41
& LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE, APC1F304.42
& L_SUPERBEE) APC1F304.43
APC1F304.44
END DO APC1F304.45
APC1F304.46
*IF DEF,MPP GPB7F405.29
GPB7F405.30
! Call swapbounds to update halo points for tracer advection levels. GPB7F405.31
K = END_LEVEL-START_LEVEL+1 GPB7F405.32
CALL SWAPBOUNDS
(D1(JMURK(START_LEVEL)),ROW_LENGTH,P_ROWS, GPB7F405.33
& EW_Halo,NS_Halo,K) GPB7F405.34
GPB7F405.35
*ENDIF GPB7F405.36
GPB7F405.37
APC1F304.50
! For vertical advection of aerosol call TRAC_VERT_ADV with ATD1F400.34
! penultimate argument (L_TRACER_THETAL_QT) set to .FALSE. ATD1F400.35
CALL TRAC_VERT_ADV
(D1(JMURK(1)),ETADOT,D1(JPSTAR), APC1F304.51
& P_FIELD,LOCAL_ADVSTEP,START_LEVEL,END_LEVEL, APC1F304.52
& FIRST_POINT,POINTS,P_LEVELS, APC1F304.53
& START_LEVEL,END_LEVEL, APC1F304.54
& RS_FUNCTIONS,A_LEVDEPC(JAK), APC1F304.55
& A_LEVDEPC(JBK),A_LEVDEPC(JDELTA_AK), APC1F304.56
& A_LEVDEPC(JDELTA_BK),WORK2, ATD1F400.36
& .FALSE.,L_SUPERBEE) ATD1F400.37
END IF APC1F304.58
APC1F304.59
*IF DEF,GLOBAL APB0F401.1814
C Copy the one polar value updated by TRAC_VERT_ADV to the other APB0F401.1815
C polar locations. APB0F401.1816
DO K= START_LEVEL,END_LEVEL APB0F401.1817
*IF DEF,MPP ARB1F402.125
IF (at_top_of_LPG) THEN ARB1F402.126
DO I = FIRST_VALID_PT+Offx-1,START_POINT_NO_HALO-Offx-3 ARB1F402.127
D1(JMURK(K)+I) = D1(JMURK(K)+START_POINT_NO_HALO-Offx-2) ARB1F402.128
END DO ARB1F402.129
END IF ARB1F402.130
IF (at_base_of_LPG) THEN ARB1F402.131
DO I = END_P_POINT_NO_HALO+Offx+1,LAST_P_VALID_PT-Offx-1 ARB1F402.132
D1(JMURK(K)+I) = D1(JMURK(K)+END_P_POINT_NO_HALO+Offx) ARB1F402.133
END DO ARB1F402.134
END IF ARB1F402.135
*ELSE ARB1F402.136
DO I = 0, ROW_LENGTH - 2 APB0F401.1818
D1(JMURK(K)+I) = D1(JMURK(K)+ROW_LENGTH-1) APB0F401.1819
D1(JMURK(K)+P_FIELD-1-I) = D1(JMURK(K)+P_FIELD-ROW_LENGTH) APB0F401.1820
END DO APB0F401.1821
*ENDIF ARB1F402.137
END DO APB0F401.1822
*ENDIF APB0F401.1823
C APC1F304.60
C Add boundary terms for aerosol. APC1F304.61
C APC1F304.62
IF( L_MURK_BDRY) THEN APC1F304.63
DO K=START_LEVEL,END_LEVEL APC1F304.64
CALL TRBDRY
( APC1F304.65
& A_LEVDEPC(JAK+K-1), APC1F304.66
& A_LEVDEPC(JBK+K-1), APC1F304.67
& P_FIELD, APC1F304.70
& P_FIELD, APC1F304.71
& U_FIELD, APC1F304.72
& ROW_LENGTH, ARB1F402.138
*CALL ARGFLDPT
ARB1F402.139
& D1(JPSTAR), APC1F304.74
& D1(JU(K)),D1(JV(K)), APC1F304.75
& D1(JMURK(K)), APC1F304.76
& LOCAL_ADVSTEP, APC1F304.77
& ICODE APC1F304.78
& ) APC1F304.79
IF (ICODE.GT.0) THEN APC1F304.80
CMESSAGE='Error in TRBDRY' APC1F304.81
RETURN APC1F304.82
ENDIF APC1F304.83
END DO APC1F304.84
END IF APC1F304.85
*IF DEF,MPP ARB1F402.140
ARB1F402.141
! Call swapbounds to update halo points for tracer advection levels. ARB1F402.142
K = END_LEVEL-START_LEVEL+1 ARB1F403.87
CALL SWAPBOUNDS
(D1(JMURK(START_LEVEL)),ROW_LENGTH,P_ROWS, ARB1F402.143
& EW_Halo,NS_Halo,K) ARB1F403.88
ARB1F402.145
*ENDIF ARB1F402.146
END IF ! End of aerosol code APC1F304.86
! -------------------------------------------------------------------- ADM2F404.146
! Code to advect ICE_VAR ADM2F404.147
! -------------------------------------------------------------------- ADM2F404.148
IF (L_LSPICE) THEN ADM2F404.149
! Start of 3A precipitation scheme ice tracer advection ADM2F404.150
! ADM2F404.151
*IF DEF,MPP GPB7F405.38
! Call swapbounds to update halo points for tracer advection levels. GPB7F405.39
K = Q_LEVELS GPB7F405.40
CALL SWAPBOUNDS
(D1(JQCF(1)),ROW_LENGTH,P_ROWS, GPB7F405.41
& EW_Halo,NS_Halo,K) GPB7F405.42
*ENDIF GPB7F405.43
! GPB7F405.44
! GPB7F405.45
DO K=1, Q_LEVELS ADM2F404.152
! ADM2F404.153
CALL TRAC_ADV
(D1(JQCF(K)),TRACER_EW_SWEEPS(1,K), ADM2F404.154
& U_MEAN(1,K),WORK1(1,K),U_FIELD,P_FIELD, ADM2F404.155
& LOCAL_ADVSTEP,ROW_LENGTH, ADM2F404.156
*CALL ARGFLDPT
ADM2F404.157
& SEC_P_LATITUDE,COS_P_LATITUDE,RS_FUNCTIONS(1,K), ADM2F404.158
& PSTAR_OLD,A_LEVDEPC(JDELTA_AK+K-1), ADM2F404.159
& A_LEVDEPC(JDELTA_BK+K-1), ADM2F404.160
& LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE, ADM2F404.161
& L_SUPERBEE) ADM2F404.162
! ADM2F404.163
END DO ADM2F404.164
*IF DEF,MPP GPB7F405.46
! Call swapbounds to update halo points for tracer advection levels. GPB7F405.47
K = Q_LEVELS GPB7F405.48
CALL SWAPBOUNDS
(D1(JQCF(1)),ROW_LENGTH,P_ROWS, GPB7F405.49
& EW_Halo,NS_Halo,K) GPB7F405.50
*ENDIF GPB7F405.51
! GPB7F405.52
! GPB7F405.53
! ADM2F404.165
! Set ice flux through lower boundary to zero ADM2F404.166
GPB7F405.54
! ADM2F404.170
! ADM2F404.171
CALL TRAC_VERT_ADV
(D1(JQCF(1)),ETADOT,D1(JPSTAR), ADM2F404.172
& P_FIELD,LOCAL_ADVSTEP,1,Q_LEVELS, ADM2F404.173
& FIRST_POINT,POINTS,P_LEVELS, ADM2F404.174
& 1, ADM2F404.175
& Q_LEVELS,RS_FUNCTIONS,A_LEVDEPC(JAK), ADM2F404.176
& A_LEVDEPC(JBK),A_LEVDEPC(JDELTA_AK), ADM2F404.177
& A_LEVDEPC(JDELTA_BK),WORK2, ADM2F404.178
& .FALSE.,L_SUPERBEE) ADM2F404.179
ADM2F404.180
*IF DEF,GLOBAL ADM2F404.181
! Copy polar values along row ADM2F404.182
DO K=1,Q_LEVELS ADM2F404.183
*IF DEF,MPP ADM2F404.184
IF (at_top_of_LPG) THEN ADM2F404.185
DO I=FIRST_VALID_PT+Offx-1,START_POINT_NO_HALO-Offx-3 ADM2F404.186
D1(JQCF(K)+I)=D1(JQCF(K)+START_POINT_NO_HALO-Offx-2) ADM2F404.187
END DO ADM2F404.188
END IF ADM2F404.189
IF (at_base_of_LPG) THEN ADM2F404.190
DO I=END_P_POINT_NO_HALO+Offx+1,LAST_P_VALID_PT-Offx-1 ADM2F404.191
D1(JQCF(K)+I)=D1(JQCF(K)+END_P_POINT_NO_HALO+Offx) ADM2F404.192
END DO ADM2F404.193
END IF ADM2F404.194
*ELSE ADM2F404.195
DO I=1,ROW_LENGTH-1 ADM2F404.196
D1(JQCF(K)+I-1) = D1(JQCF(K)+ROW_LENGTH-1) ADM2F404.197
D1(JQCF(K)+P_FIELD-I) = D1(JQCF(K)+P_FIELD-ROW_LENGTH) ADM2F404.198
END DO ADM2F404.199
*ENDIF ADM2F404.200
END DO ADM2F404.201
*ENDIF ADM2F404.202
*IF DEF,MPP ADM2F404.203
! Call swapbounds to update halo points for tracer advection levels. ADM2F404.204
K = Q_LEVELS ADM2F404.205
CALL SWAPBOUNDS
(D1(JQCF(1)),ROW_LENGTH,P_ROWS, ADM2F404.206
& EW_Halo,NS_Halo,K) ADM2F404.207
*ENDIF ADM2F404.208
! ADM2F404.209
! ADM2F404.210
POINTS=upd_P_ROWS*ROW_LENGTH+2 ADM2F404.226
! End of 3A precipitation scheme ice tracer advection ADM2F404.227
END IF ADM2F404.228
! AWO2F401.8
!-- ---- Code for Sulphur Cycle tracers ------ AWO2F401.9
! AWO2F401.10
IF (L_SULPC_SO2) THEN AWO2F401.11
START_LEVEL=1 AWO2F401.12
END_LEVEL=P_LEVELS AWO2F401.13
AWO2F401.14
! If required, add 3_D Natural SO2 emissions AWO2F401.15
! AWO2F401.16
IF (L_SO2_NATEM) THEN AWO2F401.17
! AWO2F401.18
DO K=START_LEVEL,END_LEVEL AWO2F401.19
CALL TRSRCE
( AWO2F401.20
& A_LEVDEPC(JDELTA_AK+K-1), AWO2F401.21
& A_LEVDEPC(JDELTA_BK+K-1), AWO2F401.22
& P_FIELD, AWO2F401.23
& P_FIELD, AWO2F401.24
& D1(JPSTAR), AWO2F401.25
& D1(JSO2(K)), AWO2F401.26
& D1(JSO2_NATEM(K)), AWO2F401.27
& LOCAL_ADVSTEP, AWO2F401.28
& I_HOUR, AWO2F401.29
& I_MINUTE, AWO2F401.30
& 0.0, ! AMPlitude of diurnal variation of emissions AWO2F401.31
& ICODE AWO2F401.32
& ) AWO2F401.33
! AWO2F401.34
IF (ICODE.GT.0) THEN AWO2F401.35
CMESSAGE='Error in TRSRCE' AWO2F401.36
RETURN AWO2F401.37
ENDIF AWO2F401.38
END DO AWO2F401.39
! AWO2F401.40
END IF ! END L_SO2_NATEM condition AWO2F401.41
! AWO2F401.42
! Now advect the Sulphur Cycle tracers AWO2F401.43
! AWO2F401.44
*IF DEF,MPP GPB7F405.55
GPB7F405.56
! Call swapbounds to update halo points for tracer advection levels. GPB7F405.57
K = END_LEVEL-START_LEVEL+1 GPB7F405.58
CALL SWAPBOUNDS
(D1(JSO2(START_LEVEL)),ROW_LENGTH,P_ROWS, GPB7F405.59
& EW_Halo,NS_Halo,K) GPB7F405.60
GPB7F405.61
*ENDIF GPB7F405.62
DO K=START_LEVEL,END_LEVEL ! for SO2 AWO2F401.45
CALL TRAC_ADV
(D1(JSO2(K)),TRACER_EW_SWEEPS(1,K), AWO2F401.46
& U_MEAN(1,K),WORK1(1,K),U_FIELD,P_FIELD, AWO2F401.47
& LOCAL_ADVSTEP,ROW_LENGTH, ARB1F402.147
*CALL ARGFLDPT
ARB1F402.148
& SEC_P_LATITUDE,COS_P_LATITUDE,RS_FUNCTIONS(1,K), AWO2F401.49
& PSTAR_OLD,A_LEVDEPC(JDELTA_AK+K-1), AWO2F401.50
& A_LEVDEPC(JDELTA_BK+K-1), AWO2F401.51
& LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE, AWO2F401.52
& L_SUPERBEE) AWO2F401.53
END DO AWO2F401.54
*IF DEF,MPP GPB7F405.63
GPB7F405.64
! Call swapbounds to update halo points for tracer advection levels. GPB7F405.65
K = END_LEVEL-START_LEVEL+1 GPB7F405.66
CALL SWAPBOUNDS
(D1(JSO2(START_LEVEL)),ROW_LENGTH,P_ROWS, GPB7F405.67
& EW_Halo,NS_Halo,K) GPB7F405.68
GPB7F405.69
*ENDIF GPB7F405.70
! AWO2F401.55
GPB7F405.71
AWO2F401.59
! For vertical advection of aerosol call TRAC_VERT_ADV with AWO2F401.60
! penultimate argument (L_TRACER_THETAL_QT) set to .FALSE. AWO2F401.61
CALL TRAC_VERT_ADV
(D1(JSO2(1)),ETADOT,D1(JPSTAR), AWO2F401.62
& P_FIELD,LOCAL_ADVSTEP,START_LEVEL,END_LEVEL, AWO2F401.63
& FIRST_POINT,POINTS,P_LEVELS, AWO2F401.64
& START_LEVEL,END_LEVEL, AWO2F401.65
& RS_FUNCTIONS,A_LEVDEPC(JAK), AWO2F401.66
& A_LEVDEPC(JBK),A_LEVDEPC(JDELTA_AK), AWO2F401.67
& A_LEVDEPC(JDELTA_BK),WORK2, AWO2F401.68
& .FALSE.,L_SUPERBEE) AWO2F401.69
! AWO2F401.70
*IF DEF,GLOBAL AWO2F401.71
C Copy the one polar value updated by TRAC_VERT_ADV to the other AWO2F401.72
C polar locations. AWO2F401.73
DO K= START_LEVEL,END_LEVEL AWO2F401.74
*IF DEF,MPP ARB1F402.149
IF (at_top_of_LPG) THEN ARB1F402.150
DO I = FIRST_VALID_PT+Offx-1,START_POINT_NO_HALO-Offx-3 ARB1F402.151
D1(JSO2(K)+I) = D1(JSO2(K)+START_POINT_NO_HALO-Offx-2) ARB1F402.152
END DO ARB1F402.153
END IF ARB1F402.154
IF (at_base_of_LPG) THEN ARB1F402.155
DO I = END_P_POINT_NO_HALO+Offx+1,LAST_P_VALID_PT-Offx-1 ARB1F402.156
D1(JSO2(K)+I) = D1(JSO2(K)+END_P_POINT_NO_HALO+Offx) ARB1F402.157
END DO ARB1F402.158
END IF ARB1F402.159
*ELSE ARB1F402.160
DO I = 0, ROW_LENGTH - 2 AWO2F401.75
D1(JSO2(K)+I) = D1(JSO2(K)+ROW_LENGTH-1) AWO2F401.76
D1(JSO2(K)+P_FIELD-1-I) = AWO2F401.77
& D1(JSO2(K)+P_FIELD-ROW_LENGTH) AWO2F401.78
END DO AWO2F401.79
*ENDIF ARB1F402.161
END DO AWO2F401.80
*ENDIF AWO2F401.81
*IF DEF,MPP ARB1F402.162
ARB1F402.163
! Call swapbounds to update halo points for tracer advection levels. ARB1F402.164
K = END_LEVEL-START_LEVEL+1 ARB1F403.89
CALL SWAPBOUNDS
(D1(JSO2(START_LEVEL)),ROW_LENGTH,P_ROWS, ARB1F402.165
& EW_Halo,NS_Halo,K) ARB1F403.90
ARB1F402.167
*ENDIF ARB1F402.168
! AWO2F401.82
! Advect NH3 if present AWO2F405.5
IF (L_SULPC_NH3) THEN AWO2F405.6
*IF DEF,MPP AWO2F405.7
K=END_LEVEL-START_LEVEL+1 AWO2F405.8
CALL SWAPBOUNDS
(D1(JNH3(START_LEVEL)),ROW_LENGTH,P_ROWS, AWO2F405.9
& EW_Halo,NS_Halo,K) AWO2F405.10
*ENDIF AWO2F405.11
DO K=START_LEVEL,END_LEVEL AWO2F405.12
CALL TRAC_ADV
(D1(JNH3(K)),TRACER_EW_SWEEPS(1,K), AWO2F405.13
& U_MEAN(1,K),WORK1(1,K),U_FIELD,P_FIELD, AWO2F405.14
& LOCAL_ADVSTEP,ROW_LENGTH, AWO2F405.15
*CALL ARGFLDPT
AWO2F405.16
& SEC_P_LATITUDE,COS_P_LATITUDE,RS_FUNCTIONS(1,K), AWO2F405.17
& PSTAR_OLD,A_LEVDEPC(JDELTA_AK+K-1), AWO2F405.18
& A_LEVDEPC(JDELTA_BK+K-1), AWO2F405.19
& LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE, AWO2F405.20
& L_SUPERBEE) AWO2F405.21
END DO AWO2F405.22
! AWO2F405.23
*IF DEF,MPP AWO2F405.24
K=END_LEVEL-START_LEVEL+1 AWO2F405.25
CALL SWAPBOUNDS
(D1(JNH3(START_LEVEL)),ROW_LENGTH,P_ROWS, AWO2F405.26
& EW_Halo,NS_Halo,K) AWO2F405.27
*ENDIF AWO2F405.28
! AWO2F405.29
! For vertical advection of aerosol call TRAC_VERT_ADV with AWO2F405.30
! penultimate argument (L_TRACER_THETAL_QT) set to .FALSE. AWO2F405.31
CALL TRAC_VERT_ADV
(D1(JNH3(1)),ETADOT,D1(JPSTAR), AWO2F405.32
& P_FIELD,LOCAL_ADVSTEP,START_LEVEL,END_LEVEL, AWO2F405.33
& FIRST_POINT,POINTS,P_LEVELS, AWO2F405.34
& START_LEVEL,END_LEVEL, AWO2F405.35
& RS_FUNCTIONS,A_LEVDEPC(JAK), AWO2F405.36
& A_LEVDEPC(JBK),A_LEVDEPC(JDELTA_AK), AWO2F405.37
& A_LEVDEPC(JDELTA_BK),WORK2, AWO2F405.38
& .FALSE.,L_SUPERBEE) AWO2F405.39
! AWO2F405.40
*IF DEF,GLOBAL AWO2F405.41
C Copy the one polar value updated by TRAC_VERT_ADV to the other AWO2F405.42
C polar locations. AWO2F405.43
DO K= START_LEVEL,END_LEVEL AWO2F405.44
*IF DEF,MPP AWO2F405.45
IF (at_top_of_LPG) THEN AWO2F405.46
DO I = FIRST_VALID_PT+Offx-1,START_POINT_NO_HALO-Offx-3 AWO2F405.47
D1(JNH3(K)+I) = D1(JNH3(K)+START_POINT_NO_HALO-Offx-2) AWO2F405.48
END DO AWO2F405.49
END IF AWO2F405.50
IF (at_base_of_LPG) THEN AWO2F405.51
DO I = END_P_POINT_NO_HALO+Offx+1,LAST_P_VALID_PT-Offx-1 AWO2F405.52
D1(JNH3(K)+I) = D1(JNH3(K)+END_P_POINT_NO_HALO+Offx) AWO2F405.53
END DO AWO2F405.54
END IF AWO2F405.55
*ELSE AWO2F405.56
DO I = 0, ROW_LENGTH - 2 AWO2F405.57
D1(JNH3(K)+I) = D1(JNH3(K)+ROW_LENGTH-1) AWO2F405.58
D1(JNH3(K)+P_FIELD-1-I) = AWO2F405.59
& D1(JNH3(K)+P_FIELD-ROW_LENGTH) AWO2F405.60
END DO AWO2F405.61
*ENDIF AWO2F405.62
END DO AWO2F405.63
*ENDIF AWO2F405.64
*IF DEF,MPP AWO2F405.65
! AWO2F405.66
! Call swapbounds to update halo points for tracer advection levels. AWO2F405.67
K = END_LEVEL-START_LEVEL+1 AWO2F405.68
CALL SWAPBOUNDS
(D1(JNH3(START_LEVEL)),ROW_LENGTH,P_ROWS, AWO2F405.69
& EW_Halo,NS_Halo,K) AWO2F405.70
*ENDIF AWO2F405.71
! AWO2F405.72
END IF ! END OF L_SULPC_NH3 BLOCK AWO2F405.73
! AWO2F401.83
*IF DEF,MPP GPB7F405.72
GPB7F405.73
! Call swapbounds to update halo points for tracer advection levels. GPB7F405.74
K = END_LEVEL-START_LEVEL+1 GPB7F405.75
CALL SWAPBOUNDS
(D1(JSO4_AITKEN(START_LEVEL)),ROW_LENGTH,P_ROWS, GPB7F405.76
& EW_Halo,NS_Halo,K) GPB7F405.77
GPB7F405.78
*ENDIF GPB7F405.79
DO K=START_LEVEL,END_LEVEL ! for SO4_AIT AWO2F401.84
CALL TRAC_ADV
(D1(JSO4_AITKEN(K)),TRACER_EW_SWEEPS(1,K), AWO2F401.85
& U_MEAN(1,K),WORK1(1,K),U_FIELD,P_FIELD, AWO2F401.86
& LOCAL_ADVSTEP,ROW_LENGTH, ARB1F402.169
*CALL ARGFLDPT
ARB1F402.170
& SEC_P_LATITUDE,COS_P_LATITUDE,RS_FUNCTIONS(1,K), AWO2F401.88
& PSTAR_OLD,A_LEVDEPC(JDELTA_AK+K-1), AWO2F401.89
& A_LEVDEPC(JDELTA_BK+K-1), AWO2F401.90
& LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE, AWO2F401.91
& L_SUPERBEE) AWO2F401.92
END DO AWO2F401.93
*IF DEF,MPP GPB7F405.80
AWO2F401.94
! Call swapbounds to update halo points for tracer advection levels. GPB7F405.81
K = END_LEVEL-START_LEVEL+1 GPB7F405.82
CALL SWAPBOUNDS
(D1(JSO4_AITKEN(START_LEVEL)),ROW_LENGTH,P_ROWS, GPB7F405.83
& EW_Halo,NS_Halo,K) GPB7F405.84
GPB7F405.85
*ENDIF GPB7F405.86
GPB7F405.87
AWO2F401.98
! For vertical advection of aerosol call TRAC_VERT_ADV with AWO2F401.99
! penultimate argument (L_TRACER_THETAL_QT) set to .FALSE. AWO2F401.100
CALL TRAC_VERT_ADV
(D1(JSO4_AITKEN(1)),ETADOT,D1(JPSTAR), AWO2F401.101
& P_FIELD,LOCAL_ADVSTEP,START_LEVEL,END_LEVEL, AWO2F401.102
& FIRST_POINT,POINTS,P_LEVELS, AWO2F401.103
& START_LEVEL,END_LEVEL, AWO2F401.104
& RS_FUNCTIONS,A_LEVDEPC(JAK), AWO2F401.105
& A_LEVDEPC(JBK),A_LEVDEPC(JDELTA_AK), AWO2F401.106
& A_LEVDEPC(JDELTA_BK),WORK2, AWO2F401.107
& .FALSE.,L_SUPERBEE) AWO2F401.108
! AWO2F401.109
*IF DEF,GLOBAL AWO2F401.110
C Copy the one polar value updated by TRAC_VERT_ADV to the other AWO2F401.111
C polar locations. AWO2F401.112
DO K= START_LEVEL,END_LEVEL AWO2F401.113
*IF DEF,MPP ARB1F402.171
IF (at_top_of_LPG) THEN ARB1F402.172
DO I = FIRST_VALID_PT+Offx-1,START_POINT_NO_HALO-Offx-3 ARB1F402.173
D1(JSO4_AITKEN(K)+I) = ARB1F402.174
& D1(JSO4_AITKEN(K)+START_POINT_NO_HALO-Offx-2) ARB1F402.175
END DO ARB1F402.176
END IF ARB1F402.177
IF (at_base_of_LPG) THEN ARB1F402.178
DO I = END_P_POINT_NO_HALO+Offx+1,LAST_P_VALID_PT-Offx-1 ARB1F402.179
D1(JSO4_AITKEN(K)+I) = ARB1F402.180
& D1(JSO4_AITKEN(K)+END_P_POINT_NO_HALO+Offx) ARB1F402.181
END DO ARB1F402.182
END IF ARB1F402.183
*ELSE ARB1F402.184
DO I = 0, ROW_LENGTH - 2 AWO2F401.114
D1(JSO4_AITKEN(K)+I) = D1(JSO4_AITKEN(K)+ROW_LENGTH-1) AWO2F401.115
D1(JSO4_AITKEN(K)+P_FIELD-1-I) = AWO2F401.116
& D1(JSO4_AITKEN(K)+P_FIELD-ROW_LENGTH) AWO2F401.117
END DO AWO2F401.118
*ENDIF ARB1F402.185
END DO AWO2F401.119
*ENDIF AWO2F401.120
*IF DEF,MPP ARB1F402.186
ARB1F402.187
! Call swapbounds to update halo points for tracer advection levels. ARB1F402.188
K = END_LEVEL-START_LEVEL+1 ARB1F403.91
CALL SWAPBOUNDS
(D1(JSO4_AITKEN(START_LEVEL)),ROW_LENGTH,P_ROWS, ARB1F402.189
& EW_Halo,NS_Halo,K) ARB1F403.92
ARB1F402.191
*ENDIF ARB1F402.192
! AWO2F401.121
! AWO2F401.122
*IF DEF,MPP GPB7F405.88
GPB7F405.89
! Call swapbounds to update halo points for tracer advection levels. GPB7F405.90
K = END_LEVEL-START_LEVEL+1 GPB7F405.91
CALL SWAPBOUNDS
(D1(JSO4_ACCU(START_LEVEL)),ROW_LENGTH,P_ROWS, GPB7F405.92
& EW_Halo,NS_Halo,K) GPB7F405.93
GPB7F405.94
*ENDIF GPB7F405.95
DO K=START_LEVEL,END_LEVEL ! for SO4_ACCU AWO2F401.123
CALL TRAC_ADV
(D1(JSO4_ACCU(K)),TRACER_EW_SWEEPS(1,K), AWO2F401.124
& U_MEAN(1,K),WORK1(1,K),U_FIELD,P_FIELD, AWO2F401.125
& LOCAL_ADVSTEP,ROW_LENGTH, ARB1F402.193
*CALL ARGFLDPT
ARB1F402.194
& SEC_P_LATITUDE,COS_P_LATITUDE,RS_FUNCTIONS(1,K), AWO2F401.127
& PSTAR_OLD,A_LEVDEPC(JDELTA_AK+K-1), AWO2F401.128
& A_LEVDEPC(JDELTA_BK+K-1), AWO2F401.129
& LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE, AWO2F401.130
& L_SUPERBEE) AWO2F401.131
END DO AWO2F401.132
*IF DEF,MPP GPB7F405.96
AWO2F401.133
! Call swapbounds to update halo points for tracer advection levels. GPB7F405.97
K = END_LEVEL-START_LEVEL+1 GPB7F405.98
CALL SWAPBOUNDS
(D1(JSO4_ACCU(START_LEVEL)),ROW_LENGTH,P_ROWS, GPB7F405.99
& EW_Halo,NS_Halo,K) GPB7F405.100
GPB7F405.101
*ENDIF GPB7F405.102
GPB7F405.103
AWO2F401.137
! For vertical advection of aerosol call TRAC_VERT_ADV with AWO2F401.138
! penultimate argument (L_TRACER_THETAL_QT) set to .FALSE. AWO2F401.139
CALL TRAC_VERT_ADV
(D1(JSO4_ACCU(1)),ETADOT,D1(JPSTAR), AWO2F401.140
& P_FIELD,LOCAL_ADVSTEP,START_LEVEL,END_LEVEL, AWO2F401.141
& FIRST_POINT,POINTS,P_LEVELS, AWO2F401.142
& START_LEVEL,END_LEVEL, AWO2F401.143
& RS_FUNCTIONS,A_LEVDEPC(JAK), AWO2F401.144
& A_LEVDEPC(JBK),A_LEVDEPC(JDELTA_AK), AWO2F401.145
& A_LEVDEPC(JDELTA_BK),WORK2, AWO2F401.146
& .FALSE.,L_SUPERBEE) AWO2F401.147
! AWO2F401.148
*IF DEF,GLOBAL AWO2F401.149
C Copy the one polar value updated by TRAC_VERT_ADV to the other AWO2F401.150
C polar locations. AWO2F401.151
DO K= START_LEVEL,END_LEVEL AWO2F401.152
*IF DEF,MPP ARB1F402.195
IF (at_top_of_LPG) THEN ARB1F402.196
DO I = FIRST_VALID_PT+Offx-1,START_POINT_NO_HALO-Offx-3 ARB1F402.197
D1(JSO4_ACCU(K)+I) = ARB1F402.198
& D1(JSO4_ACCU(K)+START_POINT_NO_HALO-Offx-2) ARB1F402.199
END DO ARB1F402.200
END IF ARB1F402.201
IF (at_base_of_LPG) THEN ARB1F402.202
DO I = END_P_POINT_NO_HALO+Offx+1,LAST_P_VALID_PT-Offx-1 ARB1F402.203
D1(JSO4_ACCU(K)+I) = ARB1F402.204
& D1(JSO4_ACCU(K)+END_P_POINT_NO_HALO+Offx) ARB1F402.205
END DO ARB1F402.206
END IF ARB1F402.207
*ELSE ARB1F402.208
DO I = 0, ROW_LENGTH - 2 AWO2F401.153
D1(JSO4_ACCU(K)+I) = D1(JSO4_ACCU(K)+ROW_LENGTH-1) AWO2F401.154
D1(JSO4_ACCU(K)+P_FIELD-1-I) = AWO2F401.155
& D1(JSO4_ACCU(K)+P_FIELD-ROW_LENGTH) AWO2F401.156
END DO AWO2F401.157
*ENDIF ARB1F402.209
END DO AWO2F401.158
*ENDIF AWO2F401.159
*IF DEF,MPP ARB1F402.210
ARB1F402.211
! Call swapbounds to update halo points for tracer advection levels. ARB1F402.212
K = END_LEVEL-START_LEVEL+1 ARB1F403.93
CALL SWAPBOUNDS
(D1(JSO4_ACCU(START_LEVEL)),ROW_LENGTH,P_ROWS, ARB1F402.213
& EW_Halo,NS_Halo,K) ARB1F403.94
ARB1F402.215
*ENDIF ARB1F402.216
! AWO2F401.160
! AWO2F401.161
*IF DEF,MPP GPB7F405.104
GPB7F405.105
! Call swapbounds to update halo points for tracer advection levels. GPB7F405.106
K = END_LEVEL-START_LEVEL+1 GPB7F405.107
CALL SWAPBOUNDS
(D1(JSO4_DISS(START_LEVEL)),ROW_LENGTH,P_ROWS, GPB7F405.108
& EW_Halo,NS_Halo,K) GPB7F405.109
GPB7F405.110
*ENDIF GPB7F405.111
GPB7F405.112
DO K=START_LEVEL,END_LEVEL ! for SO4_DISS AWO2F401.162
CALL TRAC_ADV
(D1(JSO4_DISS(K)),TRACER_EW_SWEEPS(1,K), AWO2F401.163
& U_MEAN(1,K),WORK1(1,K),U_FIELD,P_FIELD, AWO2F401.164
& LOCAL_ADVSTEP,ROW_LENGTH, ARB1F402.217
*CALL ARGFLDPT
ARB1F402.218
& SEC_P_LATITUDE,COS_P_LATITUDE,RS_FUNCTIONS(1,K), AWO2F401.166
& PSTAR_OLD,A_LEVDEPC(JDELTA_AK+K-1), AWO2F401.167
& A_LEVDEPC(JDELTA_BK+K-1), AWO2F401.168
& LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE, AWO2F401.169
& L_SUPERBEE) AWO2F401.170
END DO AWO2F401.171
*IF DEF,MPP GPB7F405.113
AWO2F401.172
! Call swapbounds to update halo points for tracer advection levels. GPB7F405.114
K = END_LEVEL-START_LEVEL+1 GPB7F405.115
CALL SWAPBOUNDS
(D1(JSO4_DISS(START_LEVEL)),ROW_LENGTH,P_ROWS, GPB7F405.116
& EW_Halo,NS_Halo,K) GPB7F405.117
GPB7F405.118
*ENDIF GPB7F405.119
GPB7F405.120
AWO2F401.176
! For vertical advection of aerosol call TRAC_VERT_ADV with AWO2F401.177
! penultimate argument (L_TRACER_THETAL_QT) set to .FALSE. AWO2F401.178
CALL TRAC_VERT_ADV
(D1(JSO4_DISS(1)),ETADOT,D1(JPSTAR), AWO2F401.179
& P_FIELD,LOCAL_ADVSTEP,START_LEVEL,END_LEVEL, AWO2F401.180
& FIRST_POINT,POINTS,P_LEVELS, AWO2F401.181
& START_LEVEL,END_LEVEL, AWO2F401.182
& RS_FUNCTIONS,A_LEVDEPC(JAK), AWO2F401.183
& A_LEVDEPC(JBK),A_LEVDEPC(JDELTA_AK), AWO2F401.184
& A_LEVDEPC(JDELTA_BK),WORK2, AWO2F401.185
& .FALSE.,L_SUPERBEE) AWO2F401.186
! AWO2F401.187
*IF DEF,GLOBAL AWO2F401.188
C Copy the one polar value updated by TRAC_VERT_ADV to the other AWO2F401.189
C polar locations. AWO2F401.190
DO K= START_LEVEL,END_LEVEL AWO2F401.191
*IF DEF,MPP ARB1F402.219
IF (at_top_of_LPG) THEN ARB1F402.220
DO I = FIRST_VALID_PT+Offx-1,START_POINT_NO_HALO-Offx-3 ARB1F402.221
D1(JSO4_DISS(K)+I) = ARB1F402.222
& D1(JSO4_DISS(K)+START_POINT_NO_HALO-Offx-2) ARB1F402.223
END DO ARB1F402.224
END IF ARB1F402.225
IF (at_base_of_LPG) THEN ARB1F402.226
DO I = END_P_POINT_NO_HALO+Offx+1,LAST_P_VALID_PT-Offx-1 ARB1F402.227
D1(JSO4_DISS(K)+I) = ARB1F402.228
& D1(JSO4_DISS(K)+END_P_POINT_NO_HALO+Offx) ARB1F402.229
END DO ARB1F402.230
END IF ARB1F402.231
*ELSE ARB1F402.232
DO I = 0, ROW_LENGTH - 2 AWO2F401.192
D1(JSO4_DISS(K)+I) = D1(JSO4_DISS(K)+ROW_LENGTH-1) AWO2F401.193
D1(JSO4_DISS(K)+P_FIELD-1-I) = AWO2F401.194
& D1(JSO4_DISS(K)+P_FIELD-ROW_LENGTH) AWO2F401.195
END DO AWO2F401.196
*ENDIF ARB1F402.233
END DO AWO2F401.197
*ENDIF AWO2F401.198
*IF DEF,MPP ARB1F402.234
ARB1F402.235
! Call swapbounds to update halo points for tracer advection levels. ARB1F402.236
K = END_LEVEL-START_LEVEL+1 ARB1F403.95
CALL SWAPBOUNDS
(D1(JSO4_DISS(START_LEVEL)),ROW_LENGTH,P_ROWS, ARB1F402.237
& EW_Halo,NS_Halo,K) ARB1F403.96
ARB1F402.239
*ENDIF ARB1F402.240
! AWO2F401.199
! AWO2F401.200
IF (L_SULPC_DMS) THEN ! advect DMS if present AWO2F401.201
! AWO2F401.202
*IF DEF,MPP GPB7F405.121
GPB7F405.122
! Call swapbounds to update halo points for tracer advection levels. GPB7F405.123
K = END_LEVEL-START_LEVEL+1 GPB7F405.124
CALL SWAPBOUNDS
(D1(JDMS(START_LEVEL)),ROW_LENGTH,P_ROWS, GPB7F405.125
& EW_Halo,NS_Halo,K) GPB7F405.126
GPB7F405.127
*ENDIF GPB7F405.128
DO K=START_LEVEL,END_LEVEL AWO2F401.203
CALL TRAC_ADV
(D1(JDMS(K)),TRACER_EW_SWEEPS(1,K), AWO2F401.204
& U_MEAN(1,K),WORK1(1,K),U_FIELD,P_FIELD, AWO2F401.205
& LOCAL_ADVSTEP,ROW_LENGTH, ARB1F402.241
*CALL ARGFLDPT
ARB1F402.242
& SEC_P_LATITUDE,COS_P_LATITUDE,RS_FUNCTIONS(1,K), AWO2F401.207
& PSTAR_OLD,A_LEVDEPC(JDELTA_AK+K-1), AWO2F401.208
& A_LEVDEPC(JDELTA_BK+K-1), AWO2F401.209
& LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE, AWO2F401.210
& L_SUPERBEE) AWO2F401.211
END DO AWO2F401.212
*IF DEF,MPP GPB7F405.129
AWO2F401.213
! Call swapbounds to update halo points for tracer advection levels. GPB7F405.130
K = END_LEVEL-START_LEVEL+1 GPB7F405.131
CALL SWAPBOUNDS
(D1(JDMS(START_LEVEL)),ROW_LENGTH,P_ROWS, GPB7F405.132
& EW_Halo,NS_Halo,K) GPB7F405.133
GPB7F405.134
*ENDIF GPB7F405.135
AWO2F401.217
! For vertical advection of aerosol call TRAC_VERT_ADV with AWO2F401.218
! penultimate argument (L_TRACER_THETAL_QT) set to .FALSE. AWO2F401.219
CALL TRAC_VERT_ADV
(D1(JDMS(1)),ETADOT,D1(JPSTAR), AWO2F401.220
& P_FIELD,LOCAL_ADVSTEP,START_LEVEL,END_LEVEL, AWO2F401.221
& FIRST_POINT,POINTS,P_LEVELS, AWO2F401.222
& START_LEVEL,END_LEVEL, AWO2F401.223
& RS_FUNCTIONS,A_LEVDEPC(JAK), AWO2F401.224
& A_LEVDEPC(JBK),A_LEVDEPC(JDELTA_AK), AWO2F401.225
& A_LEVDEPC(JDELTA_BK),WORK2, AWO2F401.226
& .FALSE.,L_SUPERBEE) AWO2F401.227
! AWO2F401.228
! AWO2F401.229
*IF DEF,GLOBAL AWO2F401.230
C Copy the one polar value updated by TRAC_VERT_ADV to the other AWO2F401.231
C polar locations. AWO2F401.232
DO K= START_LEVEL,END_LEVEL AWO2F401.233
*IF DEF,MPP ARB1F402.243
IF (at_top_of_LPG) THEN ARB1F402.244
DO I = FIRST_VALID_PT+Offx-1,START_POINT_NO_HALO-Offx-3 ARB1F402.245
D1(JDMS(K)+I) = D1(JDMS(K)+START_POINT_NO_HALO-Offx-2) ARB1F402.246
END DO ARB1F402.247
END IF ARB1F402.248
IF (at_base_of_LPG) THEN ARB1F402.249
DO I = END_P_POINT_NO_HALO+Offx+1,LAST_P_VALID_PT-Offx-1 ARB1F402.250
D1(JDMS(K)+I) = D1(JDMS(K)+END_P_POINT_NO_HALO+Offx) ARB1F402.251
END DO ARB1F402.252
END IF ARB1F402.253
*ELSE ARB1F402.254
DO I = 0, ROW_LENGTH - 2 AWO2F401.234
D1(JDMS(K)+I) = D1(JDMS(K)+ROW_LENGTH-1) AWO2F401.235
D1(JDMS(K)+P_FIELD-1-I) = AWO2F401.236
& D1(JDMS(K)+P_FIELD-ROW_LENGTH) AWO2F401.237
END DO AWO2F401.238
*ENDIF ARB1F402.255
END DO AWO2F401.239
*ENDIF AWO2F401.240
*IF DEF,MPP ARB1F402.256
ARB1F402.257
! Call swapbounds to update halo points for tracer advection levels. ARB1F402.258
K = END_LEVEL-START_LEVEL+1 ARB1F403.97
CALL SWAPBOUNDS
(D1(JDMS(START_LEVEL)),ROW_LENGTH,P_ROWS, ARB1F402.259
& EW_Halo,NS_Halo,K) ARB1F403.98
ARB1F402.261
*ENDIF ARB1F402.262
! AWO2F401.241
END IF ! END L_SULPC_DMS condition AWO2F401.242
! AWO2F401.243
END IF ! END L_SULPC_SO2 condition AWO2F401.244
! AWO2F401.245
! ---End of Sulphur Cycle code --- AWO2F401.246
! AWO2F401.247
AWO2F401.248
IF (L_SOOT) THEN ! Advect 3 modes of soot AWO2F405.77
START_LEVEL=1 AWO2F405.78
END_LEVEL=P_LEVELS AWO2F405.79
! Fresh soot: AWO2F405.80
!~~~~~~~~~~~~ AWO2F405.81
*IF DEF,MPP AWO2F405.82
K=END_LEVEL-START_LEVEL+1 AWO2F405.83
CALL SWAPBOUNDS
(D1(JSOOT_NEW(START_LEVEL)),ROW_LENGTH, AWO2F405.84
& P_ROWS,EW_Halo,NS_Halo,K) AWO2F405.85
*ENDIF AWO2F405.86
DO K=START_LEVEL,END_LEVEL AWO2F405.87
CALL TRAC_ADV
(D1(JSOOT_NEW(K)),TRACER_EW_SWEEPS(1,K), AWO2F405.88
& U_MEAN(1,K),WORK1(1,K),U_FIELD,P_FIELD, AWO2F405.89
& LOCAL_ADVSTEP,ROW_LENGTH, AWO2F405.90
*CALL ARGFLDPT
AWO2F405.91
& SEC_P_LATITUDE,COS_P_LATITUDE, AWO2F405.92
& RS_FUNCTIONS(1,K), AWO2F405.93
& PSTAR_OLD,A_LEVDEPC(JDELTA_AK+K-1), AWO2F405.94
& A_LEVDEPC(JDELTA_BK+K-1), AWO2F405.95
& LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE, AWO2F405.96
& L_SUPERBEE) AWO2F405.97
END DO AWO2F405.98
AWO2F405.99
*IF DEF,MPP AWO2F405.100
K=END_LEVEL-START_LEVEL+1 AWO2F405.101
CALL SWAPBOUNDS
(D1(JSOOT_NEW(START_LEVEL)),ROW_LENGTH,P_ROWS, AWO2F405.102
& EW_Halo,NS_Halo,K) AWO2F405.103
*ENDIF AWO2F405.104
AWO2F405.105
! AWO2F405.106
! For vertical advection of aerosol call TRAC_VERT_ADV with AWO2F405.107
! penultimate argument (L_TRACER_THETAL_QT) set to .FALSE. AWO2F405.108
CALL TRAC_VERT_ADV
(D1(JSOOT_NEW(1)),ETADOT,D1(JPSTAR), AWO2F405.109
& P_FIELD,LOCAL_ADVSTEP,START_LEVEL, AWO2F405.110
& END_LEVEL, AWO2F405.111
& FIRST_POINT,POINTS,P_LEVELS, AWO2F405.112
& START_LEVEL,END_LEVEL, AWO2F405.113
& RS_FUNCTIONS,A_LEVDEPC(JAK), AWO2F405.114
& A_LEVDEPC(JBK),A_LEVDEPC(JDELTA_AK), AWO2F405.115
& A_LEVDEPC(JDELTA_BK),WORK2, AWO2F405.116
& .FALSE.,L_SUPERBEE) AWO2F405.117
! AWO2F405.118
! AWO2F405.119
*IF DEF,GLOBAL AWO2F405.120
C Copy the one polar value updated by TRAC_VERT_ADV to the other AWO2F405.121
C polar locations. AWO2F405.122
DO K= START_LEVEL,END_LEVEL AWO2F405.123
*IF DEF,MPP AWO2F405.124
IF (at_top_of_LPG) THEN AWO2F405.125
DO I = FIRST_VALID_PT+Offx-1,START_POINT_NO_HALO-Offx-3 AWO2F405.126
D1(JSOOT_NEW(K)+I) = AWO2F405.127
& D1(JSOOT_NEW(K)+START_POINT_NO_HALO-Offx-2) AWO2F405.128
END DO AWO2F405.129
END IF AWO2F405.130
IF (at_base_of_LPG) THEN AWO2F405.131
DO I = END_P_POINT_NO_HALO+Offx+1,LAST_P_VALID_PT-Offx-1 AWO2F405.132
D1(JSOOT_NEW(K)+I) = AWO2F405.133
& D1(JSOOT_NEW(K)+END_P_POINT_NO_HALO+Offx) AWO2F405.134
END DO AWO2F405.135
END IF AWO2F405.136
*ELSE AWO2F405.137
DO I = 0, ROW_LENGTH - 2 AWO2F405.138
D1(JSOOT_NEW(K)+I) = D1(JSOOT_NEW(K)+ROW_LENGTH-1) AWO2F405.139
D1(JSOOT_NEW(K)+P_FIELD-1-I) = AWO2F405.140
& D1(JSOOT_NEW(K)+P_FIELD-ROW_LENGTH) AWO2F405.141
END DO AWO2F405.142
*ENDIF AWO2F405.143
END DO AWO2F405.144
*ENDIF AWO2F405.145
*IF DEF,MPP AWO2F405.146
! AWO2F405.147
! Call swapbounds to update halo points for tracer advection levels. AWO2F405.148
K = END_LEVEL-START_LEVEL+1 AWO2F405.149
CALL SWAPBOUNDS
(D1(JSOOT_NEW(START_LEVEL)),ROW_LENGTH,P_ROWS, AWO2F405.150
& EW_Halo,NS_Halo,K) AWO2F405.151
AWO2F405.152
*ENDIF AWO2F405.153
! AWO2F405.154
! Aged soot: AWO2F405.155
!~~~~~~~~~~~ AWO2F405.156
*IF DEF,MPP AWO2F405.157
K=END_LEVEL-START_LEVEL+1 AWO2F405.158
CALL SWAPBOUNDS
(D1(JSOOT_AGD(START_LEVEL)),ROW_LENGTH, AWO2F405.159
& P_ROWS,EW_Halo,NS_Halo,K) AWO2F405.160
*ENDIF AWO2F405.161
DO K=START_LEVEL,END_LEVEL AWO2F405.162
CALL TRAC_ADV
(D1(JSOOT_AGD(K)),TRACER_EW_SWEEPS(1,K), AWO2F405.163
& U_MEAN(1,K),WORK1(1,K),U_FIELD,P_FIELD, AWO2F405.164
& LOCAL_ADVSTEP,ROW_LENGTH, AWO2F405.165
*CALL ARGFLDPT
AWO2F405.166
& SEC_P_LATITUDE,COS_P_LATITUDE, AWO2F405.167
& RS_FUNCTIONS(1,K), AWO2F405.168
& PSTAR_OLD,A_LEVDEPC(JDELTA_AK+K-1), AWO2F405.169
& A_LEVDEPC(JDELTA_BK+K-1), AWO2F405.170
& LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE, AWO2F405.171
& L_SUPERBEE) AWO2F405.172
END DO AWO2F405.173
AWO2F405.174
*IF DEF,MPP AWO2F405.175
K=END_LEVEL-START_LEVEL+1 AWO2F405.176
CALL SWAPBOUNDS
(D1(JSOOT_AGD(START_LEVEL)),ROW_LENGTH, AWO2F405.177
& P_ROWS,EW_Halo,NS_Halo,K) AWO2F405.178
*ENDIF AWO2F405.179
AWO2F405.180
! AWO2F405.181
! For vertical advection of aerosol call TRAC_VERT_ADV with AWO2F405.182
! penultimate argument (L_TRACER_THETAL_QT) set to .FALSE. AWO2F405.183
CALL TRAC_VERT_ADV
(D1(JSOOT_AGD(1)),ETADOT,D1(JPSTAR), AWO2F405.184
& P_FIELD,LOCAL_ADVSTEP,START_LEVEL, AWO2F405.185
& END_LEVEL, AWO2F405.186
& FIRST_POINT,POINTS,P_LEVELS, AWO2F405.187
& START_LEVEL,END_LEVEL, AWO2F405.188
& RS_FUNCTIONS,A_LEVDEPC(JAK), AWO2F405.189
& A_LEVDEPC(JBK),A_LEVDEPC(JDELTA_AK), AWO2F405.190
& A_LEVDEPC(JDELTA_BK),WORK2, AWO2F405.191
& .FALSE.,L_SUPERBEE) AWO2F405.192
! AWO2F405.193
! AWO2F405.194
*IF DEF,GLOBAL AWO2F405.195
C Copy the one polar value updated by TRAC_VERT_ADV to the other AWO2F405.196
C polar locations. AWO2F405.197
DO K= START_LEVEL,END_LEVEL AWO2F405.198
*IF DEF,MPP AWO2F405.199
IF (at_top_of_LPG) THEN AWO2F405.200
DO I = FIRST_VALID_PT+Offx-1,START_POINT_NO_HALO-Offx-3 AWO2F405.201
D1(JSOOT_AGD(K)+I) = AWO2F405.202
& D1(JSOOT_AGD(K)+START_POINT_NO_HALO-Offx-2) AWO2F405.203
END DO AWO2F405.204
END IF AWO2F405.205
IF (at_base_of_LPG) THEN AWO2F405.206
DO I = END_P_POINT_NO_HALO+Offx+1,LAST_P_VALID_PT-Offx-1 AWO2F405.207
D1(JSOOT_AGD(K)+I) = AWO2F405.208
& D1(JSOOT_AGD(K)+END_P_POINT_NO_HALO+Offx) AWO2F405.209
END DO AWO2F405.210
END IF AWO2F405.211
*ELSE AWO2F405.212
DO I = 0, ROW_LENGTH - 2 AWO2F405.213
D1(JSOOT_AGD(K)+I) = D1(JSOOT_AGD(K)+ROW_LENGTH-1) AWO2F405.214
D1(JSOOT_AGD(K)+P_FIELD-1-I) = AWO2F405.215
& D1(JSOOT_AGD(K)+P_FIELD-ROW_LENGTH) AWO2F405.216
END DO AWO2F405.217
*ENDIF AWO2F405.218
END DO AWO2F405.219
*ENDIF AWO2F405.220
*IF DEF,MPP AWO2F405.221
! AWO2F405.222
! Call swapbounds to update halo points for tracer advection levels. AWO2F405.223
K = END_LEVEL-START_LEVEL+1 AWO2F405.224
CALL SWAPBOUNDS
(D1(JSOOT_AGD(START_LEVEL)),ROW_LENGTH, AWO2F405.225
& P_ROWS,EW_Halo,NS_Halo,K) AWO2F405.226
! AWO2F405.227
*ENDIF AWO2F405.228
! AWO2F405.229
! Soot in cloud water: AWO2F405.230
!~~~~~~~~~~~~~~~~~~~~~ AWO2F405.231
*IF DEF,MPP AWO2F405.232
K=END_LEVEL-START_LEVEL+1 AWO2F405.233
CALL SWAPBOUNDS
(D1(JSOOT_CLD(START_LEVEL)),ROW_LENGTH, AWO2F405.234
& P_ROWS,EW_Halo,NS_Halo,K) AWO2F405.235
*ENDIF AWO2F405.236
DO K=START_LEVEL,END_LEVEL AWO2F405.237
CALL TRAC_ADV
(D1(JSOOT_CLD(K)),TRACER_EW_SWEEPS(1,K), AWO2F405.238
& U_MEAN(1,K),WORK1(1,K),U_FIELD,P_FIELD, AWO2F405.239
& LOCAL_ADVSTEP,ROW_LENGTH, AWO2F405.240
*CALL ARGFLDPT
AWO2F405.241
& SEC_P_LATITUDE,COS_P_LATITUDE, AWO2F405.242
& RS_FUNCTIONS(1,K), AWO2F405.243
& PSTAR_OLD,A_LEVDEPC(JDELTA_AK+K-1), AWO2F405.244
& A_LEVDEPC(JDELTA_BK+K-1), AWO2F405.245
& LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE, AWO2F405.246
& L_SUPERBEE) AWO2F405.247
END DO AWO2F405.248
AWO2F405.249
*IF DEF,MPP AWO2F405.250
K=END_LEVEL-START_LEVEL+1 AWO2F405.251
CALL SWAPBOUNDS
(D1(JSOOT_CLD(START_LEVEL)),ROW_LENGTH, AWO2F405.252
& P_ROWS,EW_Halo,NS_Halo,K) AWO2F405.253
*ENDIF AWO2F405.254
AWO2F405.255
AWO2F405.256
! For vertical advection of aerosol call TRAC_VERT_ADV with AWO2F405.257
! penultimate argument (L_TRACER_THETAL_QT) set to .FALSE. AWO2F405.258
CALL TRAC_VERT_ADV
(D1(JSOOT_CLD(1)),ETADOT,D1(JPSTAR), AWO2F405.259
& P_FIELD,LOCAL_ADVSTEP,START_LEVEL, AWO2F405.260
& END_LEVEL, AWO2F405.261
& FIRST_POINT,POINTS,P_LEVELS, AWO2F405.262
& START_LEVEL,END_LEVEL, AWO2F405.263
& RS_FUNCTIONS,A_LEVDEPC(JAK), AWO2F405.264
& A_LEVDEPC(JBK),A_LEVDEPC(JDELTA_AK), AWO2F405.265
& A_LEVDEPC(JDELTA_BK),WORK2, AWO2F405.266
& .FALSE.,L_SUPERBEE) AWO2F405.267
! AWO2F405.268
! AWO2F405.269
*IF DEF,GLOBAL AWO2F405.270
C Copy the one polar value updated by TRAC_VERT_ADV to the other AWO2F405.271
C polar locations. AWO2F405.272
DO K= START_LEVEL,END_LEVEL AWO2F405.273
*IF DEF,MPP AWO2F405.274
IF (at_top_of_LPG) THEN AWO2F405.275
DO I = FIRST_VALID_PT+Offx-1,START_POINT_NO_HALO-Offx-3 AWO2F405.276
D1(JSOOT_CLD(K)+I) = AWO2F405.277
& D1(JSOOT_CLD(K)+START_POINT_NO_HALO-Offx-2) AWO2F405.278
END DO AWO2F405.279
END IF AWO2F405.280
IF (at_base_of_LPG) THEN AWO2F405.281
DO I = END_P_POINT_NO_HALO+Offx+1,LAST_P_VALID_PT-Offx-1 AWO2F405.282
D1(JSOOT_CLD(K)+I) = AWO2F405.283
& D1(JSOOT_CLD(K)+END_P_POINT_NO_HALO+Offx) AWO2F405.284
END DO AWO2F405.285
END IF AWO2F405.286
*ELSE AWO2F405.287
DO I = 0, ROW_LENGTH - 2 AWO2F405.288
D1(JSOOT_CLD(K)+I) = D1(JSOOT_CLD(K)+ROW_LENGTH-1) AWO2F405.289
D1(JSOOT_CLD(K)+P_FIELD-1-I) = AWO2F405.290
& D1(JSOOT_CLD(K)+P_FIELD-ROW_LENGTH) AWO2F405.291
END DO AWO2F405.292
*ENDIF AWO2F405.293
END DO AWO2F405.294
*ENDIF AWO2F405.295
*IF DEF,MPP AWO2F405.296
! AWO2F405.297
! Call swapbounds to update halo points for tracer advection levels. AWO2F405.298
K = END_LEVEL-START_LEVEL+1 AWO2F405.299
CALL SWAPBOUNDS
(D1(JSOOT_CLD(START_LEVEL)),ROW_LENGTH, AWO2F405.300
& P_ROWS,EW_Halo,NS_Halo,K) AWO2F405.301
AWO2F405.302
*ENDIF AWO2F405.303
! AWO2F405.304
END IF ! L_SOOT condition AWO2F405.305
! AWO2F405.306
! --- End of soot advection --- AWO2F405.307
! AWO2F405.308
AWO2F405.309
ACN2F405.138
!-- ---- Code for Carbon Cycle tracer ------ ACN2F405.139
! ACN2F405.140
IF (L_CO2_INTERACTIVE) THEN ACN2F405.141
START_LEVEL=1 ACN2F405.142
END_LEVEL=P_LEVELS ACN2F405.143
ACN2F405.144
*IF DEF,MPP ACN2F405.145
K=END_LEVEL-START_LEVEL+1 ACN2F405.146
CALL SWAPBOUNDS
(D1(JCO2(START_LEVEL)), ACN2F405.147
& ROW_LENGTH,P_ROWS,EW_Halo,NS_Halo,K) ACN2F405.148
*ENDIF ACN2F405.149
ACN2F405.150
DO K=START_LEVEL,END_LEVEL ACN2F405.151
CALL TRAC_ADV
(D1(JCO2(K)),TRACER_EW_SWEEPS(1,K), ACN2F405.152
& U_MEAN(1,K),WORK1(1,K),U_FIELD,P_FIELD, ACN2F405.153
& LOCAL_ADVSTEP,ROW_LENGTH, ACN2F405.154
*CALL ARGFLDPT
ACN2F405.155
& SEC_P_LATITUDE,COS_P_LATITUDE,RS_FUNCTIONS(1,K), ACN2F405.156
& PSTAR_OLD,A_LEVDEPC(JDELTA_AK+K-1), ACN2F405.157
& A_LEVDEPC(JDELTA_BK+K-1), ACN2F405.158
& LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE, ACN2F405.159
& L_SUPERBEE) ACN2F405.160
END DO ACN2F405.161
ACN2F405.162
*IF DEF,MPP ACN2F405.163
K=END_LEVEL-START_LEVEL+1 ACN2F405.164
CALL SWAPBOUNDS
(D1(JCO2(START_LEVEL)), ACN2F405.165
& ROW_LENGTH,P_ROWS,EW_Halo,NS_Halo,K) ACN2F405.166
*ENDIF ACN2F405.167
ACN2F405.168
! For vertical advection of carbon dioxide call TRAC_VERT_ADV with ACN2F405.169
! penultimate argument (L_TRACER_THETAL_QT) set to .FALSE. ACN2F405.170
CALL TRAC_VERT_ADV
(D1(JCO2(1)),ETADOT,D1(JPSTAR), ACN2F405.171
& P_FIELD,LOCAL_ADVSTEP,START_LEVEL,END_LEVEL, ACN2F405.172
& FIRST_POINT,POINTS,P_LEVELS, ACN2F405.173
& START_LEVEL,END_LEVEL, ACN2F405.174
& RS_FUNCTIONS,A_LEVDEPC(JAK), ACN2F405.175
& A_LEVDEPC(JBK),A_LEVDEPC(JDELTA_AK), ACN2F405.176
& A_LEVDEPC(JDELTA_BK),WORK2, ACN2F405.177
& .FALSE.,L_SUPERBEE) ACN2F405.178
! ACN2F405.179
! ACN2F405.180
*IF DEF,GLOBAL ACN2F405.181
C Copy the one polar value updated by TRAC_VERT_ADV to the other ACN2F405.182
C polar locations. ACN2F405.183
DO K= START_LEVEL,END_LEVEL ACN2F405.184
*IF DEF,MPP ACN2F405.185
IF (at_top_of_LPG) THEN ACN2F405.186
DO I = FIRST_VALID_PT+Offx-1,START_POINT_NO_HALO-Offx-3 ACN2F405.187
D1(JCO2(K)+I) = D1(JCO2(K)+START_POINT_NO_HALO-Offx-2) ACN2F405.188
END DO ACN2F405.189
END IF ACN2F405.190
IF (at_base_of_LPG) THEN ACN2F405.191
DO I = END_P_POINT_NO_HALO+Offx+1,LAST_P_VALID_PT-Offx-1 ACN2F405.192
D1(JCO2(K)+I) = D1(JCO2(K)+END_P_POINT_NO_HALO+Offx) ACN2F405.193
END DO ACN2F405.194
END IF ACN2F405.195
*ELSE ACN2F405.196
DO I = 0, ROW_LENGTH - 2 ACN2F405.197
D1(JCO2(K)+I) = D1(JCO2(K)+ROW_LENGTH-1) ACN2F405.198
D1(JCO2(K)+P_FIELD-1-I) = ACN2F405.199
& D1(JCO2(K)+P_FIELD-ROW_LENGTH) ACN2F405.200
END DO ACN2F405.201
*ENDIF ACN2F405.202
END DO ACN2F405.203
*ENDIF ACN2F405.204
*IF DEF,MPP ACN2F405.205
! Call swapbounds to update halo points for tracer advection levels. ACN2F405.206
K = END_LEVEL-START_LEVEL+1 ACN2F405.207
CALL SWAPBOUNDS
(D1(JCO2(START_LEVEL)),ROW_LENGTH,P_ROWS, ACN2F405.208
& EW_Halo,NS_Halo,K) ACN2F405.209
ACN2F405.210
*ENDIF ACN2F405.211
! ACN2F405.212
END IF ! END CO2_INTERACTIVE condition ACN2F405.213
! ACN2F405.214
! ---End of Carbon Cycle code --- ACN2F405.215
! ACN2F405.216
GRB1F400.4
IF(LTIMER)CALL TIMER('TRAC_ADV',4) GSM1F401.3
C APC1F304.87
C STASH handling APC1F304.88
C APC1F304.89
FIRST_POINT=ROW_LENGTH+1 ATMDYN1.428
ATMDYN1.429
! Call STASH only on last sweep of long physics timestep ARB0F400.23
! and of half-timestep dynamics. ARB0F400.24
IF (I_LOOP.eq.A_SWEEPS_DYN .and. I_COUNT.eq.NSWEEPS) THEN ARB0F400.25
ATD0F304.3
IF(LTIMER) THEN ATMDYN1.430
CALL TIMER
('STASH ',3) ATMDYN1.431
END IF ATMDYN1.432
ATMDYN1.433
CALL STASH
(a_sm,a_im,11,STASHWORK, GKR0F305.882
*CALL ARGSIZE
@DYALLOC.295
*CALL ARGD1
@DYALLOC.296
*CALL ARGDUMA
@DYALLOC.297
*CALL ARGDUMO
@DYALLOC.298
*CALL ARGDUMW
GKR1F401.169
*CALL ARGSTS
@DYALLOC.299
*CALL ARGPPX
GKR0F305.883
& ICODE,CMESSAGE) @DYALLOC.303
ATMDYN1.435
IF(LTIMER) THEN ATMDYN1.436
CALL TIMER
('STASH ',4) ATMDYN1.437
END IF ATMDYN1.438
ATMDYN1.439
IF(ICODE.GT.0) THEN ATMDYN1.440
RETURN ATMDYN1.441
END IF ATMDYN1.442
ATD0F304.4
END IF ! I_LOOP.eq.A_SWEEPS_DYN .and. I_COUNT.eq.NSWEEPS ARB0F400.26
ATMDYN1.443
ENDIF ! TR_VARS.NE.0 ARB0F400.27
ATMDYN1.445
CL --------------------------------------------------------------------- ATMDYN1.446
CL Section 12 Advection of momentum, thetal and qt ATMDYN1.447
CL --------------------------------------------------------------------- ATMDYN1.448
CL ATMDYN1.449
CL WORK1 holds V_MEAN. ATMDYN1.450
CL ATMDYN1.451
CL 12.1 Set up divergence damping coefficients for assimilation ADR1F305.21
CL or forecast as appropriate ATMDYN1.453
ATMDYN1.454
IF(.NOT.LASSIMILATION) THEN ATMDYN1.455
DO LEVEL=1,P_LEVELS ATMDYN1.456
KD(LEVEL)=DIV_DAMP_COEFF_FC(LEVEL) ADR1F305.22
END DO ATMDYN1.458
ATMDYN1.459
ELSEIF(A_STEP-ASSIM_FIRSTSTEPim(a_im).LT.ASSIM_STEPSim(a_im))THEN GDR5F305.10
DO LEVEL=1,P_LEVELS ATMDYN1.461
KD(LEVEL)=DIV_DAMP_COEFF_ASSM(LEVEL) ADR1F305.23
END DO ATMDYN1.463
ATMDYN1.464
ELSE ATMDYN1.465
IF (ASSIM_EXTRASTEPSim(a_im).EQ.0) THEN GDR5F305.11
WEIGHT=1.0 ATMDYN1.467
ELSE ATMDYN1.468
WEIGHT = GDR5F305.12
& REAL(A_STEP-ASSIM_FIRSTSTEPim(a_im)-ASSIM_STEPSim(a_im))/ GDR5F305.13
& REAL(ASSIM_EXTRASTEPSim(a_im)) GDR5F305.14
END IF ATMDYN1.471
ATMDYN1.472
DO LEVEL=1,P_LEVELS ATMDYN1.473
KD(LEVEL) = WEIGHT*DIV_DAMP_COEFF_FC(LEVEL) + ADR1F305.24
& (1.0-WEIGHT)*DIV_DAMP_COEFF_ASSM(LEVEL) ADR1F305.25
END DO ATMDYN1.476
ATMDYN1.477
END IF ATMDYN1.478
ATMDYN1.479
CL 12.2 Call ADV_CTL to advect primary fields, all advected fields are ATMDYN1.480
CL mass weighted on output ATMDYN1.481
ATMDYN1.482
IF(LTIMER) THEN ATMDYN1.483
CALL TIMER
('ADVECTION',5) GPB1F401.15
CALL TIMER
('ADV_CTL ',3) ATMDYN1.484
END IF ATMDYN1.485
ATMDYN1.486
IF (L_WRIT_DYN .AND. WRITD1_THIS_SWEEP .AND. ARR2F405.31
& (A_STEP.LE.T_WRITD1_END .OR. T_WRITD1_END .EQ. 0)) THEN GSS1F304.1322
TJ270193.55
IF (A_STEP.EQ.T_WRITD1_START .OR. GSS1F304.1323
& WRITD1_TEST.GT.WRITD1_TEST_PREV) THEN GSS1F304.1324
GSS1F304.1325
CALL DUMPCTL
( GKR4F403.127
*CALL ARGSIZE
GKR4F403.128
*CALL ARGD1
GKR4F403.129
*CALL ARGDUMA
GKR4F403.130
*CALL ARGDUMO
GKR4F403.131
*CALL ARGDUMW
GKR4F403.132
*CALL ARGCONA
GKR4F403.133
*CALL ARGPTRA
GKR4F403.134
*CALL ARGSTS
GKR4F403.135
*CALL ARGPPX
GKR4F403.136
& atmos_sm,0,.TRUE.,'bf_adv_ctl',a_step, GIE1F405.21
& ICODE,CMESSAGE) GKR4F403.138
GSS1F304.1327
END IF GSS1F304.1328
GSS1F304.1329
END IF GSS1F304.1330
GSS1F304.1331
! If using mixed phase precip scheme then do not want ice in the call ADM2F404.75
IF (L_LSPICE) THEN ADM2F404.76
! Already set up zerofield array so no need to do it again ADM2F404.77
! Mixed phase precip scheme. Go straight to the call. ADM2F404.78
CALL ADV_CTL
( ADM2F404.79
& D1(JTHETA(1)),D1(JQ(1)),PSTAR_OLD,D1(JPSTAR), ADM2F404.80
& U_MEAN,WORK1,D1(JU(1)), ADM2F404.81
& D1(JV(1)),COS_U_LATITUDE,COS_P_LATITUDE,SEC_P_LATITUDE,ETADOT, ADM2F404.82
& RS_FUNCTIONS,A_LEVDEPC(JDELTA_AK),A_LEVDEPC(JDELTA_BK), ADM2F404.83
& LATITUDE_STEP_INVERSE,LOCAL_ADVSTEP, ADM2F404.84
& NU_BASIC,LONGITUDE_STEP_INVERSE,A_INTHD(19),A_INTHD(20) ADM2F404.85
& ,Q_LEVELS,U_FIELD,P_FIELD,ROW_LENGTH, ADM2F404.86
*CALL ARGFLDPT
ADM2F404.87
& P_LEVELS,SEC_U_LATITUDE, ADM2F404.88
& F1,F2,A_LEVDEPC(JAK),A_LEVDEPC(JBK), ADM2F404.89
& KD,AKH,BKH,COS_LONGITUDE,SIN_LONGITUDE, ADM2F404.90
& TRIGS,IFAX,A_ROWDEPC(JFILTER_WAVE_NUMBER_P_ROWS), ADM2F404.91
& WORK3,D1(JQCL(1)),ZERO_FIELD, ADM2F404.92
& D1(JP_EXNER(1)),LLINTS,LWHITBROM, ADM2F404.93
& L_TRACER_THETAL_QT,TRACER_EW_SWEEPS,L_SUPERBEE) ADM2F404.94
ELSE ADM2F404.95
CALL ADV_CTL
( ATMDYN1.487
& D1(JTHETA(1)),D1(JQ(1)),PSTAR_OLD,D1(JPSTAR), ATMDYN1.488
& U_MEAN,WORK1,D1(JU(1)), ATMDYN1.489
& D1(JV(1)),COS_U_LATITUDE,COS_P_LATITUDE,SEC_P_LATITUDE,ETADOT, ATD1F400.38
& RS_FUNCTIONS,A_LEVDEPC(JDELTA_AK),A_LEVDEPC(JDELTA_BK), ATMDYN1.491
& LATITUDE_STEP_INVERSE,LOCAL_ADVSTEP, AL131293.124
& NU_BASIC,LONGITUDE_STEP_INVERSE,A_INTHD(19),A_INTHD(20) ADR1F305.26
& ,Q_LEVELS,U_FIELD,P_FIELD,ROW_LENGTH, APB0F401.54
*CALL ARGFLDPT
APB0F401.55
& P_LEVELS,SEC_U_LATITUDE, APB0F401.56
& F1,F2,A_LEVDEPC(JAK),A_LEVDEPC(JBK), ATMDYN1.496
& KD,AKH,BKH,COS_LONGITUDE,SIN_LONGITUDE, ATMDYN1.497
& TRIGS,IFAX,A_ROWDEPC(JFILTER_WAVE_NUMBER_P_ROWS), ATMDYN1.498
& WORK3,D1(JQCL(1)),D1(JQCF(1)), ATMDYN1.499
& D1(JP_EXNER(1)),LLINTS,LWHITBROM, ATD1F400.39
& L_TRACER_THETAL_QT,TRACER_EW_SWEEPS,L_SUPERBEE) ATD1F400.40
! END IF for L_LSPICE ADM2F404.96
END IF ADM2F404.97
ATMDYN1.501
IF (L_WRIT_DYN .AND. WRITD1_THIS_SWEEP .AND. ARR2F405.32
& (A_STEP.LE.T_WRITD1_END .OR. T_WRITD1_END .EQ. 0)) THEN GSS1F304.1334
GSS1F304.1335
IF (A_STEP.EQ.T_WRITD1_START .OR. GSS1F304.1336
& WRITD1_TEST.GT.WRITD1_TEST_PREV) THEN GSS1F304.1337
GSS1F304.1338
CALL DUMPCTL
( GKR4F403.139
*CALL ARGSIZE
GKR4F403.140
*CALL ARGD1
GKR4F403.141
*CALL ARGDUMA
GKR4F403.142
*CALL ARGDUMO
GKR4F403.143
*CALL ARGDUMW
GKR4F403.144
*CALL ARGCONA
GKR4F403.145
*CALL ARGPTRA
GKR4F403.146
*CALL ARGSTS
GKR4F403.147
*CALL ARGPPX
GKR4F403.148
& atmos_sm,0,.TRUE.,'af_adv_ctl',a_step, GIE1F405.2
& ICODE,CMESSAGE) GKR4F403.150
GSS1F304.1340
END IF GSS1F304.1341
GSS1F304.1342
END IF GSS1F304.1343
TJ270193.59
IF(LTIMER) THEN ATMDYN1.502
CALL TIMER
('ADV_CTL ',4) ATMDYN1.503
CALL TIMER
('ADVECTION',6) GPB1F401.16
END IF ATMDYN1.504
ATMDYN1.506
CL --------------------------------------------------------------------- ATMDYN1.507
CL 12.3 IF STANDARD ADVECTION THEN CALL MASS_UWT TO REMOVE ATD1F400.41
CL MASS-WEIGHTING OF PRIMARY FIELDS (CALL MASS_UWT) ATD1F400.42
CL IF TRACER ADVECTION OF THETAL AND QT THEN REMOVE ATD1F400.43
CL MASS-WEIGHTING FROM U AND V ONLY (CALL MASS_UWT_UV) ATD1F400.44
CL --------------------------------------------------------------------- ATMDYN1.510
IF(L_TRACER_THETAL_QT)THEN ATD1F400.45
ATD1F400.46
IF(LTIMER) THEN ATD1F400.47
CALL TIMER
('MASS_UVW',3) ATD1F400.48
END IF ATD1F400.49
ATD1F400.50
CALL MASS_UWT_UV
( ATD1F400.51
& RS_FUNCTIONS,WORK4,D1(JU(1)),D1(JV(1)),D1(JPSTAR), AAD2F404.316
& A_LEVDEPC(JAK),A_LEVDEPC(JBK),A_LEVDEPC(JDELTA_AK), ATD1F400.53
& A_LEVDEPC(JDELTA_BK),P_FIELD,U_FIELD,P_LEVELS,ROW_LENGTH, APB0F401.57
*CALL ARGFLDPT
APB0F401.58
& LLINTS,LWHITBROM) APB0F401.59
ATD1F400.56
IF(LTIMER) THEN ATD1F400.57
CALL TIMER
('MASS_UVW',4) ATD1F400.58
END IF ATD1F400.59
ATD1F400.60
ELSE ATD1F400.61
ATD1F400.62
ATMDYN1.511
IF(LTIMER) THEN ATMDYN1.512
CALL TIMER
('MASS_UWT',3) ATMDYN1.513
END IF ATMDYN1.514
ATMDYN1.515
CALL MASS_UWT
( ATMDYN1.516
& RS_FUNCTIONS,WORK4,D1(JTHETA(1)),D1(JQ(1)),D1(JU(1)), AAD2F404.317
& D1(JV(1)),D1(JPSTAR), ATMDYN1.518
& A_LEVDEPC(JAK),A_LEVDEPC(JBK),A_LEVDEPC(JDELTA_AK), ATMDYN1.519
& A_LEVDEPC(JDELTA_BK),P_FIELD,U_FIELD,P_LEVELS,Q_LEVELS, ATMDYN1.520
& ROW_LENGTH, APB0F401.60
*CALL ARGFLDPT
APB0F401.61
& LLINTS,LWHITBROM) APB0F401.62
ATMDYN1.522
IF(LTIMER) THEN ATMDYN1.523
CALL TIMER
('MASS_UWT',4) ATMDYN1.524
END IF ATMDYN1.525
END IF ATD1F400.63
ATMDYN1.526
*IF DEF,MPP APB0F305.32
! U and V are swapped here, and not within adv_ctl, as are the other APB0F305.33
! advected variables, because MASS_UWT applies an interpolated operator APB0F305.34
! to U and V which leaves the halo incorrect. Moving the UV swap to here APB0F305.35
! saves having to do an extra swap on the operator or UV. APB0F305.36
CALL SWAPBOUNDS
(D1(JU(1)),ROW_LENGTH,P_ROWS, APB0F401.63
& EW_Halo,NS_Halo,P_LEVELS) APB0F401.64
CALL SWAPBOUNDS
(D1(JV(1)),ROW_LENGTH,P_ROWS, APB0F401.65
& EW_Halo,NS_Halo,P_LEVELS) APB0F401.66
! And update the halos of THETA APB0F401.67
! CALL SWAPBOUNDS(D1(JTHETA(1)),ROW_LENGTH,P_ROWS, APB0F401.68
! & EW_Halo,NS_Halo,P_LEVELS) APB0F401.69
*ENDIF APB0F305.39
! Compute omega and call STASH only on last sweep ARB0F400.28
! of long physics timestep and of half-timestep dynamics. ARB0F400.29
IF (I_LOOP.eq.A_SWEEPS_DYN .and. I_COUNT.eq.NSWEEPS) THEN ARB0F400.30
ATD0F304.8
c if either omega on pressure levels or omega on model levels requested ATMDYN1.527
c then remove mass-weighting from omega on model levels. ATMDYN1.528
ATMDYN1.529
IF(SF(201,12).OR.SF(202,12)) THEN ATMDYN1.530
DO K=1,P_LEVELS ATMDYN1.531
CALL P_TO_UV
(RS_FUNCTIONS(1,K),WORK2,P_FIELD,U_FIELD, ATMDYN1.532
& ROW_LENGTH,P_ROWS) ATMDYN1.533
! loop over "local" points - not including top and bottom halos APB0F401.70
DO I=FIRST_FLD_PT,LAST_U_FLD_PT APB0F401.71
WORK3((K-1)*U_FIELD+I)= WORK3((K-1)*U_FIELD+I)/WORK2(I) ATMDYN1.535
END DO ATMDYN1.536
END DO ATMDYN1.537
END IF ATMDYN1.538
ATMDYN1.539
CL Copy omega on model levels into stashwork if diagnostic required. ATMDYN1.540
IF(SF(201,12)) THEN ATMDYN1.541
CALL COPYDIAG_3D
(STASHWORK(SI(201,12,im_index)), GRB4F305.11
& WORK3,FIRST_POINT, GRB4F305.12
& LAST_POINT,U_FIELD,ROW_LENGTH,P_LEVELS, ATMDYN1.543
& STLIST(1,STINDEX(1,201,12,im_index)), GRB4F305.13
& LEN_STLIST,STASH_LEVELS, GRB4F305.14
& NUM_STASH_LEVELS+1, GPB1F403.298
& im_ident,12,201, GPB1F403.299
*CALL ARGPPX
GPB1F403.300
& ICODE,CMESSAGE) GPB1F403.301
IF(ICODE.GT.0) THEN ATMDYN1.547
RETURN ATMDYN1.548
END IF ATMDYN1.549
END IF ATMDYN1.550
ATMDYN1.551
CL-------------------Extract Reqd Pressures for OMEGA_P-------------- ATMDYN1.552
ATMDYN1.553
C WORK1 holds pressure, WORK2 holds required pressure ATMDYN1.554
ATMDYN1.555
IF(SF(202,12)) THEN ATMDYN1.556
ATMDYN1.557
ISL=STINDEX(1,202,12,im_index) GRB4F305.15
IF(STLIST(10,ISL).LT.0) THEN ATMDYN1.559
IF(STLIST(11,ISL).EQ.2) THEN ATMDYN1.560
NI=-STLIST(10,ISL) ATMDYN1.561
OMEGA_P_LEVS=STASH_LEVELS(1,NI) ATMDYN1.562
DO K =1,OMEGA_P_LEVS ATMDYN1.563
OMEGA_PRESS(K)=STASH_LEVELS(K+1,NI)/1000.0 ATMDYN1.564
ENDDO ATMDYN1.565
ELSE ATMDYN1.566
CMESSAGE='ATM_DYN Level not pressure for OMEGA' ATMDYN1.567
ICODE=1 ATMDYN1.568
RETURN ATMDYN1.569
END IF ATMDYN1.570
ELSE ATMDYN1.571
CMESSAGE='ATM_DYN Level not a LEVELS list for OMEGA' ATMDYN1.572
ICODE=1 ATMDYN1.573
RETURN ATMDYN1.574
END IF ATMDYN1.575
ATMDYN1.576
CL------------------Interpolate OMEGA onto Pressure level--------- ATMDYN1.577
ATMDYN1.578
C Set up inout and output pressures ATMDYN1.579
CALL P_TO_UV
(D1(JPSTAR),WORK2,P_FIELD,U_FIELD,ROW_LENGTH,P_ROWS) ATMDYN1.580
DO K=1,P_LEVELS ATMDYN1.581
! loop over "local" points - not including top and bottom halos APB0F401.72
DO I=FIRST_FLD_PT,LAST_U_FLD_PT APB0F401.73
WORK1(I,K) = A_LEVDEPC(JAK+K-1)+A_LEVDEPC(JBK+K-1)*WORK2(I) ATMDYN1.583
END DO ATMDYN1.584
END DO ATMDYN1.585
*IF DEF,MPP GSM5F403.1
CALL SWAPBOUNDS
(WORK1(1,1),ROW_LENGTH,tot_U_ROWS,EW_Halo, GSM5F403.2
& NS_Halo,P_LEVELS) GSM5F403.3
*ENDIF GSM5F403.4
ATMDYN1.586
DO K=1,OMEGA_P_LEVS ATMDYN1.587
! loop over "local" points - not including top and bottom halos APB0F401.74
DO I=FIRST_FLD_PT,LAST_U_FLD_PT APB0F401.75
WORK2(I)=OMEGA_PRESS(K)*100.0 ! convert to Pascals ATMDYN1.589
END DO ATMDYN1.590
CALL V_INT
(WORK1,WORK2,WORK3, ATMDYN1.591
& STASHWORK(SI(202,12,im_index)+(K-1)*U_FIELD), GRB4F305.16
& U_FIELD,P_LEVELS,WORK1,WORK2,.FALSE., GSM1F405.563
& FIRST_FLD_PT,LAST_U_FLD_PT) GSM1F405.564
END DO ATMDYN1.594
ENDIF ATMDYN1.595
ATMDYN1.596
IF(LTIMER) THEN ATMDYN1.597
CALL TIMER
('STASH ',3) ATMDYN1.598
END IF ATMDYN1.599
CALL STASH
(a_sm,a_im,12,STASHWORK, GKR0F305.884
*CALL ARGSIZE
@DYALLOC.305
*CALL ARGD1
@DYALLOC.306
*CALL ARGDUMA
@DYALLOC.307
*CALL ARGDUMO
@DYALLOC.308
*CALL ARGDUMW
GKR1F401.170
*CALL ARGSTS
@DYALLOC.309
*CALL ARGPPX
GKR0F305.885
& ICODE,CMESSAGE) @DYALLOC.313
ATMDYN1.601
IF(LTIMER) THEN ATMDYN1.602
CALL TIMER
('STASH ',4) ATMDYN1.603
END IF ATMDYN1.604
ATMDYN1.605
IF (ICODE.GT.0) THEN ATMDYN1.606
RETURN ATMDYN1.607
END IF ATMDYN1.608
ATD0F304.9
END IF ! I_LOOP.eq.A_SWEEPS_DYN .and. I_COUNT.eq.NSWEEPS ARB0F400.31
ATMDYN1.609
ATMDYN1.610
CL --------------------------------------------------------------------- ATMDYN1.611
CL section 13 Divergence, damping, diffusion and filtering ATMDYN1.612
CL --------------------------------------------------------------------- ATMDYN1.613
CL 13.1 call DIF_CTL to perform diffusions ATMDYN1.614
CL --------------------------------------------------------------------- ATMDYN1.615
ATMDYN1.616
IF(LTIMER) THEN ATMDYN1.617
CALL TIMER
('DIFFUSION',5) GPB1F401.17
CALL TIMER
('DIF_CTL ',3) ATMDYN1.618
END IF ATMDYN1.619
ATMDYN1.620
CALL DIF_CTL
( ATMDYN1.621
& D1(JPSTAR),D1(JU(1)),D1(JV(1)),D1(JTHETA(1)),D1(JQ(1)), ATMDYN1.622
& RS_FUNCTIONS,DIFF_COEFF,DIFF_COEFF_Q, ADR1F305.27
& DIFF_EXP,DIFF_EXP_Q, ADR1F305.28
& A_LEVDEPC(JDELTA_AK),A_LEVDEPC(JDELTA_BK), ATMDYN1.625
& A_LEVDEPC(JAK),A_LEVDEPC(JBK), ATD1F400.64
& LOCAL_ADVSTEP, AL131293.125
& COS_U_LATITUDE,COS_P_LATITUDE,SEC_U_LATITUDE, ATMDYN1.627
& SEC_P_LATITUDE,LONGITUDE_STEP_INVERSE,P_FIELD, ATMDYN1.628
& LATITUDE_STEP_INVERSE,U_FIELD,ROW_LENGTH, APB0F401.76
*CALL ARGFLDPT
APB0F401.77
& P_LEVELS,Q_LEVELS, APB0F401.78
& COS_LONGITUDE,SIN_LONGITUDE, ATD1F400.65
& PRESSURE_ALTITUDE,L_TRACER_THETAL_QT) ATD1F400.66
ATMDYN1.632
IF(LTIMER) THEN ATMDYN1.633
CALL TIMER
('DIF_CTL ',4) ATMDYN1.634
CALL TIMER
('DIFFUSION',6) GPB1F401.18
END IF ATMDYN1.635
ATMDYN1.636
IF(.NOT.L_TRACER_THETAL_QT)THEN ATD1F400.67
C IF NOT TRACER QT THEN CALL QTPOS TO REMOVE NEGATIVE HUMIDITY ATD1F400.68
CL --------------------------------------------------------------------- ATMDYN1.637
CL 13.2 call QT_POS to remove negative humidity ATMDYN1.638
CL --------------------------------------------------------------------- ATMDYN1.639
ATMDYN1.640
IF(LTIMER) THEN ATMDYN1.641
CALL TIMER
('QT_POS ',3) ATMDYN1.642
END IF ATMDYN1.643
ATMDYN1.644
CALL QT_POS_CTL
( APB6F401.1
& D1(JQ(1)),RS_FUNCTIONS,ROW_LENGTH,P_FIELD,Q_LEVELS, APB6F401.2
*CALL ARGFLDPT
APB6F401.3
& ICODE,CMESSAGE,COS_P_LATITUDE,SEC_P_LATITUDE, APB6F401.4
& L_NEG_QT,L_QT_POS_LOCAL, APB6F401.5
& LOCAL_ADVSTEP,SF(201,13),STASHWORK(SI(201,13,im_index))) ARB0F400.32
ATMDYN1.649
IF (L_WRIT_DYN .AND. WRITD1_THIS_SWEEP .AND. ARR2F405.33
& (A_STEP.LE.T_WRITD1_END .OR. T_WRITD1_END .EQ. 0)) THEN GSS1F304.1346
TJ270193.63
IF (A_STEP.EQ.T_WRITD1_START .OR. GSS1F304.1347
& WRITD1_TEST.GT.WRITD1_TEST_PREV) THEN GSS1F304.1348
GSS1F304.1349
CALL DUMPCTL
( GKR4F403.151
*CALL ARGSIZE
GKR4F403.152
*CALL ARGD1
GKR4F403.153
*CALL ARGDUMA
GKR4F403.154
*CALL ARGDUMO
GKR4F403.155
*CALL ARGDUMW
GKR4F403.156
*CALL ARGCONA
GKR4F403.157
*CALL ARGPTRA
GKR4F403.158
*CALL ARGSTS
GKR4F403.159
*CALL ARGPPX
GKR4F403.160
& atmos_sm,0,.TRUE.,'af_qt_pos_',a_step, GIE1F405.3
& ICODE,CMESSAGE) GKR4F403.162
GSS1F304.1351
END IF GSS1F304.1352
GSS1F304.1353
END IF GSS1F304.1354
GSS1F304.1355
IF(LTIMER) THEN ATMDYN1.650
CALL TIMER
('QT_POS ',4) ATMDYN1.651
END IF ATMDYN1.652
ATMDYN1.653
IF(ICODE.GT.0) THEN ATMDYN1.654
RETURN ATMDYN1.655
END IF ATMDYN1.656
END IF ATD1F400.69
ATMDYN1.657
IF(L_NEG_THETA) THEN ATMDYN1.658
DO K=1,P_LEVELS ATMDYN1.659
*IF -DEF,MPP APB0F401.79
INEG_THETA=1 APB0F305.40
DO I=1,P_FIELD ATMDYN1.663
IF(D1(JTHETA(K)+I-1).LT.0.0) THEN APB0F401.83
L_NEG_THETA_FOUND=.TRUE. APB0F401.84
GOTO 132 APB0F401.85
ENDIF APB0F401.86
INEG_THETA=I +1 ATMDYN1.665
END DO ATMDYN1.666
*ELSE APB0F305.42
! New version of the check for negative theta - doesn't look at halos APB0F305.43
INEG_THETA=1 APB0F401.81
L_NEG_THETA_FOUND=.FALSE. APB0F401.82
DO J=NS_Halo+1,P_ROWS-NS_Halo APB0F401.87
I_start=(J-1)*ROW_LENGTH + FIRST_ROW_PT APB0F401.88
I_end=(J-1)*ROW_LENGTH + LAST_ROW_PT APB0F401.89
DO I=I_start,I_end APB0F401.90
INEG_THETA=I APB0F401.91
IF (D1(JTHETA(K)+I-1).LT.0.0) THEN APB0F401.92
L_NEG_THETA_FOUND=.TRUE. APB0F401.93
GOTO 132 APB0F401.94
ENDIF APB0F401.95
ENDDO APB0F401.96
ENDDO APB0F401.97
*ENDIF APB0F305.52
132 CONTINUE ATMDYN1.667
*IF -DEF,MPP GSS9F402.91
IF(INEG_THETA.NE.P_FIELD+1) THEN ATMDYN1.669
*ELSE APB0F401.99
IF(L_NEG_THETA_FOUND) THEN APB0F401.100
*ENDIF APB0F401.101
*IF DEF,MPP APB0F401.102
WRITE(6,*) ' Processor ',MY_PROC_ID,' has found negative THETA' GIE0F403.88
*ENDIF APB0F401.104
WRITE(6,*)'NEGATIVE THETA AT POINT',INEG_THETA,' LEVEL ',K GIE0F403.89
ICODE = 1 ATMDYN1.671
ENDIF ATMDYN1.674
END DO ATMDYN1.675
*IF DEF,MPP APB0F401.105
! Add PE number to ICODE and broadcast to PE0 GSM2F405.3
IF (ICODE .GT. 0) ICODE=ICODE+MY_PROC_ID GSM2F405.4
CALL GC_IMAX(
1,N_PROCS,info,ICODE) APB0F401.106
*ENDIF APB0F401.107
IF (ICODE .GT. 0) THEN GSM2F405.5
*IF DEF,MPP GSM2F405.6
WRITE(6,*)'NEGATIVE THETA DETECTED IN PE ',ICODE-1 GSM2F405.7
WRITE(6,*)'Check output from all PEs for full details' GSM2F405.8
ICODE=1 GSM2F405.9
*ENDIF GSM2F405.10
CMESSAGE='ATM_DYN : NEGATIVE THETA DETECTED. ' GSM2F405.11
RETURN GSM2F405.12
END IF GSM2F405.13
END IF ATMDYN1.676
ATMDYN1.677
*IF DEF,GLOBAL ATMDYN1.678
ATMDYN1.679
CL --------------------------------------------------------------------- ATMDYN1.680
CL 13.3 call FILT_UV to filter ATMDYN1.681
CL --------------------------------------------------------------------- ATMDYN1.682
ATMDYN1.683
IF(LTIMER) THEN ATMDYN1.684
CALL TIMER
('FILT_UV ',3) ATMDYN1.685
END IF ATMDYN1.686
ATMDYN1.687
CALL FILT_UV
( ATMDYN1.688
*IF DEF,A13_1C AAD2F404.318
& D1(JPSTAR),D1(JU(1)),D1(JV(1)),WORK4, AAD2F404.319
*ELSE AAD2F404.320
& D1(JPSTAR),D1(JU(1)),D1(JV(1)),RS_FUNCTIONS, ATMDYN1.689
*ENDIF AAD2F404.321
& A_LEVDEPC(JDELTA_AK),A_LEVDEPC(JDELTA_BK), ATMDYN1.690
& P_FIELD,U_FIELD, ATMDYN1.691
& A_INTHD(19),A_INTHD(20), ATMDYN1.692
& P_LEVELS,ROW_LENGTH, APB7F401.121
*CALL ARGFLDPT
APB7F401.122
& TRIGS,IFAX,COS_LONGITUDE,SIN_LONGITUDE, APB7F401.123
& A_ROWDEPC(JFILTER_WAVE_NUMBER_U_ROWS)) ATMDYN1.695
*IF DEF,MPP APB0F401.109
! Swap required to renew halos on U,V after new values from filter APB0F401.110
CALL SWAPBOUNDS
(D1(JU(1)),ROW_LENGTH,P_ROWS, APB0F401.111
& EW_Halo,NS_Halo,P_LEVELS) APB0F401.112
CALL SWAPBOUNDS
(D1(JV(1)),ROW_LENGTH,P_ROWS, APB0F401.113
& EW_Halo,NS_Halo,P_LEVELS) APB0F401.114
*ENDIF APB0F401.115
TJ270193.64
IF (L_WRIT_DYN .AND. WRITD1_THIS_SWEEP .AND. ARR2F405.34
& (A_STEP.LE.T_WRITD1_END .OR. T_WRITD1_END .EQ. 0)) THEN GSS1F304.1357
GSS1F304.1358
IF (A_STEP.EQ.T_WRITD1_START .OR. GSS1F304.1359
& WRITD1_TEST.GT.WRITD1_TEST_PREV) THEN GSS1F304.1360
GSS1F304.1361
CALL DUMPCTL
( GKR4F403.163
*CALL ARGSIZE
GKR4F403.164
*CALL ARGD1
GKR4F403.165
*CALL ARGDUMA
GKR4F403.166
*CALL ARGDUMO
GKR4F403.167
*CALL ARGDUMW
GKR4F403.168
*CALL ARGCONA
GKR4F403.169
*CALL ARGPTRA
GKR4F403.170
*CALL ARGSTS
GKR4F403.171
*CALL ARGPPX
GKR4F403.172
& atmos_sm,0,.TRUE.,'af_filt_uv',a_step, GIE1F405.4
& ICODE,CMESSAGE) GKR4F403.174
GSS1F304.1363
END IF GSS1F304.1364
GSS1F304.1365
END IF GSS1F304.1366
ATMDYN1.696
IF(LTIMER) THEN ATMDYN1.697
CALL TIMER
('FILT_UV ',4) ATMDYN1.698
END IF ATMDYN1.699
ATMDYN1.700
*ELSE ARB2F402.3
*IF DEF,MPP ARB2F402.4
! Swap required to renew halos on U,V because of new values from FILTER ARB2F402.5
CALL SWAPBOUNDS
(D1(JU(1)),ROW_LENGTH,P_ROWS, ARB2F402.6
& EW_Halo,NS_Halo,P_LEVELS) ARB2F402.7
CALL SWAPBOUNDS
(D1(JV(1)),ROW_LENGTH,P_ROWS, ARB2F402.8
& EW_Halo,NS_Halo,P_LEVELS) ARB2F402.9
*ENDIF ARB2F402.10
*ENDIF ATMDYN1.701
ATMDYN1.702
END DO ! I_COUNT ARB0F400.33
CL --------------------------------------------------------------------- ATMDYN1.703
CL call stash to output diagnostics, and complete routine ATMDYN1.704
CL --------------------------------------------------------------------- ATMDYN1.705
ATMDYN1.706
! Call STASH only on last sweep of long physics timestep. ARB0F400.34
IF (I_LOOP.eq.A_SWEEPS_DYN) THEN ARB0F400.35
ARB0F400.36
IF(LTIMER) THEN ATMDYN1.707
CALL TIMER
('STASH ',3) ATMDYN1.708
END IF ATMDYN1.709
ATMDYN1.710
CALL STASH
(a_sm,a_im,13,STASHWORK, GKR0F305.886
*CALL ARGSIZE
@DYALLOC.316
*CALL ARGD1
@DYALLOC.317
*CALL ARGDUMA
@DYALLOC.318
*CALL ARGDUMO
@DYALLOC.319
*CALL ARGDUMW
GKR1F401.171
*CALL ARGSTS
@DYALLOC.320
*CALL ARGPPX
GKR0F305.887
& ICODE,CMESSAGE) @DYALLOC.324
ATMDYN1.712
IF(LTIMER) THEN ATMDYN1.713
CALL TIMER
('STASH ',4) ATMDYN1.714
END IF ATMDYN1.715
ATMDYN1.716
IF(L_TRACER_THETAL_QT)THEN ATD1F400.70
C IF TRACER ADVECTION CHECK FOR NEGATIVE Q AFTER DYNAMICS ATD1F400.71
DO K=1,Q_LEVELS ATD1F400.72
II=0 ATD1F400.73
IQNEG(1)=0 ATD1F400.74
DO I=1,P_FIELD ATD1F400.75
IF(D1(JQ(K)+I-1).LT.0.0) THEN ATD1F400.76
II=II+1 ATD1F400.77
IQNEG(II)=I ATD1F400.78
ENDIF ATD1F400.79
ENDDO ATD1F400.80
IF(II.NE.0) THEN ATD1F400.81
WRITE(6,*) 'AFTER DYNAMICS:' ATD1F400.82
WRITE(6,*) 'NEGATIVE QT LEVEL ',K,' POINTS ',(IQNEG(I),I=1,II) ATD1F400.83
END IF ATD1F400.84
END DO ATD1F400.85
END IF ATD1F400.86
IF(ICODE.GT.0) THEN ATMDYN1.717
RETURN ATMDYN1.718
END IF ATMDYN1.719
ARB0F400.37
END IF ! I_LOOP.eq.A_SWEEPS_DYN ARB0F400.38
ATMDYN1.720
GPB3F403.29
ENDDO ! I_LOOP : loop over multiple dynamics timesteps GPB3F403.30
GPB3F403.31
RETURN ATMDYN1.721
END ATMDYN1.722
CLL Subroutine MAXWIND------------------------------------------- AL131293.127
CLL AL131293.128
CLL Purpose: Subroutine for use with half timestep dynamics. AL131293.129
CLL Checks wind speed, starting from the top level, AL131293.130
CLL to see if it exceeds IMAX. AL131293.131
CLL If this value is exceeded, L_WIND is set to .TRUE. AL131293.132
CLL and control is returned to the main program. AL131293.133
CLL AL131293.134
CLL Model Modification history: AL131293.135
CLL version Date AL131293.136
CLL 3.3 13/12/93 Written by A.S.Lawless AL131293.137
CLL 4.1 02/04/96 Added START and END arguments P.Burton APB0F401.116
CLL AL131293.138
CLL Programming standard: UMDP No 3 AL131293.139
CLL AL131293.140
CLL System components covered: P1 AL131293.141
CLL AL131293.142
CLL System task: P0 AL131293.143
CLL AL131293.144
CLLEND----------------------------------------------------------- AL131293.145
C*L Arguments--------------------------------------------------- AL131293.146
SUBROUTINE MAXWIND(L_WIND,WMAX,U,V,U_FIELD,START,END,P_LEVELS) 1APB0F401.117
INTEGER AL131293.148
& U_FIELD ! DIMENSION OF FIELD ON VELOCITY GRID AL131293.149
&,P_LEVELS ! NUMBER OF PRESSURE LEVELS AL131293.150
&,START ! Point to start check at APB0F401.118
&,END ! Point to end check at APB0F401.119
REAL AL131293.151
& U(U_FIELD,P_LEVELS) ! U FIELD AL131293.152
&,V(U_FIELD,P_LEVELS) ! V FIELD AL131293.153
&,WMAX ! MAXIMUM WIND TO TEST AGAINST AL131293.154
LOGICAL AL131293.155
& L_WIND ! SET TO TRUE IF WIND EXCEEDS LIMIT AL131293.156
C*--------------------------------------------------------------- AL131293.157
C*L Define local variables AL131293.158
INTEGER AL131293.159
& I,K ! LOOP VARIABLES AL131293.160
REAL AL131293.161
& WSQ ! SQUARE OF WIND AL131293.162
&,WMAXSQ ! SQUARE OF WMAX AL131293.163
C---------------------------------------------------------------- AL131293.164
WMAXSQ=WMAX*WMAX AL131293.165
K=P_LEVELS AL131293.166
DO WHILE ((.NOT.L_WIND).AND.(K.GT.0)) AL131293.167
DO I=START,END APB0F401.120
WSQ=U(I,K)*U(I,K)+V(I,K)*V(I,K) AL131293.169
IF (WSQ.GT.WMAXSQ) L_WIND=.TRUE. AL131293.170
END DO AL131293.171
K=K-1 AL131293.172
END DO AL131293.173
C AL131293.174
RETURN AL131293.175
END AL131293.176
C AL131293.177
CLL Subroutine DIVTEST--------------------------------------------- AL131293.178
CLL AL131293.179
CLL PURPOSE: To test if the input field exceeds AL131293.180
CLL the input limit. If so, the logical variable AL131293.181
CLL L_DIVERG is returned as true. AL131293.182
CLL AL131293.183
CLL 13/12/93 Written by A.S.Lawless AL131293.184
CLL 4.1 02/04/96 Removed unused ROW_LENGTH argument P.Burton APB0F401.121
CLL AL131293.185
CLL Programming standard: UMDP No 3 AL131293.186
CLL AL131293.187
CLL System components covered: P1 AL131293.188
CLL System task: P0 AL131293.189
CLL AL131293.190
CLLEND------------------------------------------------------------- AL131293.191
C*L Arguments:----------------------------------------------------- AL131293.192
SUBROUTINE DIVTEST(P_FIELD,START,END,FIELD,LIMIT,L_DIVERG) 1APB0F401.122
APB0F401.123
INTEGER APB0F401.124
& P_FIELD ! SIZE OF FIELD ON P POINTS APB0F401.125
& ,START ! FIRST POINT TO CHECK AL131293.199
& ,END ! LAST POINT TO CHECK AL131293.200
REAL AL131293.201
& FIELD(P_FIELD) ! INPUT FIELD AL131293.202
& ,LIMIT ! INPUT LIMIT AL131293.203
LOGICAL AL131293.204
& L_DIVERG ! RETURN AS TRUE IF FIELD EXCEEDS LIMIT AL131293.205
C*----------------------------------------------------------------- AL131293.206
C*L LOCAL VARIABLES AL131293.207
INTEGER I AL131293.208
C------------------------------------------------------------------ AL131293.209
L_DIVERG=.FALSE. AL131293.210
DO I=START,END AL131293.211
IF(ABS(FIELD(I)).GT.LIMIT) L_DIVERG=.TRUE. AL131293.212
END DO AL131293.213
C AL131293.214
RETURN AL131293.215
END AL131293.216
*ENDIF ATMDYN1.723