*IF DEF,A12_1E ADVCTL1E.2
C ******************************COPYRIGHT****************************** ADVCTL1E.3
C (c) CROWN COPYRIGHT 1997, METEOROLOGICAL OFFICE, All Rights Reserved. ADVCTL1E.4
C ADVCTL1E.5
C Use, duplication or disclosure of this code is subject to the ADVCTL1E.6
C restrictions as set forth in the contract. ADVCTL1E.7
C ADVCTL1E.8
C Meteorological Office ADVCTL1E.9
C London Road ADVCTL1E.10
C BRACKNELL ADVCTL1E.11
C Berkshire UK ADVCTL1E.12
C RG12 2SZ ADVCTL1E.13
C ADVCTL1E.14
C If no contract has been raised with this copy of the code, the use, ADVCTL1E.15
C duplication or disclosure of it is strictly prohibited. Permission ADVCTL1E.16
C to do so must first be obtained in writing from the Head of Numerical ADVCTL1E.17
C Modelling at the above address. ADVCTL1E.18
C ******************************COPYRIGHT****************************** ADVCTL1E.19
C ADVCTL1E.20
CLL SUBROUTINE ADV_CTL -------------------------------------------- ADVCTL1E.21
CLL ADVCTL1E.22
CLL PURPOSE: CALCULATES THE RIGHT-HAND SIDES OF EQUATIONS (40) TO ADVCTL1E.23
CLL (42) REPRESENTING THE MASS WEIGHTED FIELDS AFTER ADVCTL1E.24
CLL ADVECTION AND THE ADDITION OF THE CORIOLIS TERM DUE ADVCTL1E.25
CLL TO VERTICAL MOTION. THE SPATIAL DIFFERENCING SCHEME ADVCTL1E.26
CLL (35) TO (38) IS USED. ONE MORE PRESSURE ROW THAN ADVCTL1E.27
CLL VELOCITY ROW IS UPDATED. DIVERGENCE DAMPS VELOCITY ADVCTL1E.28
CLL FIELDS AS DESCRIBED IN SECTION 3.4 OF DOCUMENTATION ADVCTL1E.29
CLL PAPER NO. 10 ADVCTL1E.30
CLL NOT SUITABLE FOR SINGLE COLUMN USE. ADVCTL1E.31
CLL WAS VERSION FOR CRAY Y-MP ADVCTL1E.32
CLL ADVCTL1E.33
CLL WRITTEN BY M.H MAWSON. ADVCTL1E.34
CLL ADVCTL1E.35
CLL MODEL MODIFICATION HISTORY: ADVCTL1E.36
CLL VERSION DATE ADVCTL1E.37
!LL 4.4 11/08/97 New version optimised for T3E. ADVCTL1E.38
!LL Required for new interface to THQADV ADVCTL1E.39
!LL Version 1E not bit reprod with 1C ADVCTL1E.40
CLL 4.4 04/08/97 Optimisation for T3E D.Salmond ADVCTL1E.41
CLL ADVCTL1E.42
CLL ADVCTL1E.43
CLL ADVCTL1E.44
CLL PROGRAMMING STANDARD: ADVCTL1E.45
CLL ADVCTL1E.46
CLL LOGIACL COMPONENTS COVERED: P12 ADVCTL1E.47
CLL ADVCTL1E.48
CLL PROJECT TASK: P1 ADVCTL1E.49
CLL ADVCTL1E.50
CLL DOCUMENTATION: THE EQUATIONS USED ARE (35) TO (46) AND ADVCTL1E.51
CLL SECTION 3.4 IN UNIFIED MODEL DOCUMENTATION ADVCTL1E.52
CLL NO. 10 M.J.P. CULLEN, T.DAVIES AND ADVCTL1E.53
CLL M.H. MAWSON VERSION 17, DATED 11/02/91. ADVCTL1E.54
CLLEND------------------------------------------------------------- ADVCTL1E.55
C*L ARGUMENTS:--------------------------------------------------- ADVCTL1E.56
SUBROUTINE ADV_CTL 2,37ADVCTL1E.57
1 (THETAL,QT,PSTAR_OLD,PSTAR,U_MEAN,V_MEAN,U,V, ADVCTL1E.58
& COS_U_LATITUDE,COS_P_LATITUDE, ADVCTL1E.59
2 SEC_P_LATITUDE,ETADOT_MEAN,RS,DELTA_AK,DELTA_BK, ADVCTL1E.60
3 LATITUDE_STEP_INVERSE,ADVECTION_TIMESTEP,NU_BASIC, ADVCTL1E.61
4 LONGITUDE_STEP_INVERSE,NORTHERN_FILTERED_P_ROW, ADVCTL1E.62
5 SOUTHERN_FILTERED_P_ROW,Q_LEVELS, ADVCTL1E.63
6 U_FIELD,P_FIELD,ROW_LENGTH, ADVCTL1E.64
*CALL ARGFLDPT
ADVCTL1E.65
7 P_LEVELS,SEC_U_LATITUDE,F1,F2,AK,BK,KD,AKH,BKH, ADVCTL1E.66
8 COS_U_LONGITUDE,SIN_U_LONGITUDE,TRIGS,IFAX, ADVCTL1E.67
9 FILTER_WAVE_NUMBER_P_ROWS,OMEGA,QCL,QCF,P_EXNER, ADVCTL1E.68
& LLINTS,LWHITBROM, ADVCTL1E.69
& L_TRACER_THETAL_QT,NSWEEP,L_SUPERBEE) ADVCTL1E.70
ADVCTL1E.71
IMPLICIT NONE ADVCTL1E.72
ADVCTL1E.73
! All TYPFLDPT arguments are intent IN ADVCTL1E.74
*CALL TYPFLDPT
ADVCTL1E.75
*CALL PARVARS
ADVCTL1E.76
ADVCTL1E.77
INTEGER ADVCTL1E.78
* P_FIELD !IN DIMENSION OF FIELDS ON PRESSSURE GRID. ADVCTL1E.79
*, U_FIELD !IN DIMENSION OF FIELDS ON VELOCITY GRID ADVCTL1E.80
*, P_LEVELS !IN NUMBER OF PRESSURE LEVELS. ADVCTL1E.81
*, Q_LEVELS !IN NUMBER OF MOIST LEVELS. ADVCTL1E.82
*, ROW_LENGTH !IN NUMBER OF POINTS PER ROW ADVCTL1E.83
*, NORTHERN_FILTERED_P_ROW !IN ROW ON WHICH FILTERING STOPS ADVCTL1E.84
* ! MOVING TOWARDS THE EQUATOR. ADVCTL1E.85
*, SOUTHERN_FILTERED_P_ROW !IN ROW ON WHICH FILTERING STARTS AGAIN. ADVCTL1E.86
* ! MOVING TOWARDS SOUTHPOLE. ADVCTL1E.87
*, IFAX(10) !IN HOLDS FACTORS OF ROW_LENGTH USED BY ADVCTL1E.88
* ! FILTERING. ADVCTL1E.89
*IF DEF,MPP ADVCTL1E.90
*, NSWEEP(glsize(2),P_LEVELS) !IN No.of EW sweeps for all rows. ADVCTL1E.91
*ELSE ADVCTL1E.92
*, NSWEEP(P_FIELD/ROW_LENGTH,P_LEVELS) !IN ADVCTL1E.93
*ENDIF ADVCTL1E.94
* ! NUMBER OF EAST_WEST TIMESTEPS NEEDED FOR ADVCTL1E.95
* ! EACH LATITUDE WHEN USING TRACER ADVECTION. ADVCTL1E.96
*, FIRST_POINT ! ADVCTL1E.97
*, POINTS ! ADVCTL1E.98
ADVCTL1E.99
INTEGER ADVCTL1E.100
& FILTER_WAVE_NUMBER_P_ROWS(GLOBAL_P_FIELD/GLOBAL_ROW_LENGTH) ADVCTL1E.101
! LAST WAVE NUMBER NOT TO BE CHOPPED ON A P ROW ADVCTL1E.102
LOGICAL ADVCTL1E.103
& L_SUPERBEE ! FORM OF LIMITER USED IN TRACER ADVCTL1E.104
& ! ADVECTION ADVCTL1E.105
& ,L_TRACER_THETAL_QT ! LOGICAL TRUE IF USING TRACER ADVCTL1E.106
& ! ADVECTION FOR THETAL & QT ADVCTL1E.107
INTEGER ADVCTL1E.108
& P_POINTS_UPDATE ADVCTL1E.109
& ,START_U_REQUIRED ADVCTL1E.110
& ,P_POINTS_REQUIRED ADVCTL1E.111
& ,U_POINTS_REQUIRED ADVCTL1E.112
ADVCTL1E.113
& ,LLINTS !Logical switch for linear TS ADVCTL1E.114
& ,LWHITBROM !Log swch for White & Bromley terms ADVCTL1E.115
ADVCTL1E.116
REAL ADVCTL1E.117
* U_MEAN(U_FIELD,P_LEVELS) !IN AVERAGED MASS-WEIGHTED U VELOCITY ADVCTL1E.118
* ! FROM ADJUSTMENT STEP ADVCTL1E.119
*,V_MEAN(U_FIELD,P_LEVELS) !IN AVERAGED MASS-WEIGHTED V VELOCITY ADVCTL1E.120
* ! * COS(LAT) FROM ADJUSTMENT STEP ADVCTL1E.121
*,ETADOT_MEAN(P_FIELD,P_LEVELS) !IN AVERAGED MASS-WEIGHTED ADVCTL1E.122
* !VERTICAL VELOCITY FROM ADJUSTMENT STEP ADVCTL1E.123
*,PSTAR(P_FIELD) !IN PSTAR FIELD AT NEW TIME-LEVEL ADVCTL1E.124
*,PSTAR_OLD(P_FIELD) !IN PSTAR AT PREVIOUS TIME-LEVEL ADVCTL1E.125
*,RS(P_FIELD,P_LEVELS) !IN RS FIELD ADVCTL1E.126
*,TRIGS(ROW_LENGTH) !IN HOLDS TRIGONOMETRIC FUNCTIONS USED ADVCTL1E.127
* ! IN FILTERING. ADVCTL1E.128
*,QCL(P_FIELD,Q_LEVELS) !IN. PRIMARY ARRAY FOR QCL. ADVCTL1E.129
*,QCF(P_FIELD,Q_LEVELS) !IN. PRIMARY ARRAY FOR QCF. ADVCTL1E.130
*,P_EXNER(P_FIELD,P_LEVELS+1) !IN. PRIMARY ARRAY FOR P_EXNER. ADVCTL1E.131
ADVCTL1E.132
REAL ADVCTL1E.133
* U(U_FIELD,P_LEVELS) !INOUT U FIELD, MASS-WEIGHTED ON OUT. ADVCTL1E.134
*,V(U_FIELD,P_LEVELS) !INOUT V FIELD, MASS-WEIGHTED ON OUT. ADVCTL1E.135
*,THETAL(P_FIELD,P_LEVELS) !INOUT THETAL FIELD ADVCTL1E.136
*,QT(P_FIELD,Q_LEVELS) !INOUT QT FIELD. ADVCTL1E.137
ADVCTL1E.138
REAL ADVCTL1E.139
* DELTA_AK(P_LEVELS) !IN LAYER THICKNESS ADVCTL1E.140
*,DELTA_BK(P_LEVELS) !IN LAYER THICKNESS ADVCTL1E.141
*,AK(P_LEVELS) !IN FIRST TERM IN HYBRID CO-ORDS. ADVCTL1E.142
*,BK(P_LEVELS) !IN SECOND TERM IN HYBRID CO-ORDS. ADVCTL1E.143
*,AKH(P_LEVELS+1) !IN AK AT HALF LEVELS ADVCTL1E.144
*,BKH(P_LEVELS+1) !IN BK AT HALF LEVELS ADVCTL1E.145
&,COS_P_LATITUDE(P_FIELD) !IN COS_LAT AT P_POINTS (2D ARRAY) ADVCTL1E.146
*,SEC_P_LATITUDE(P_FIELD) !IN 1/COS(LAT) AT P POINTS (2-D ARRAY) ADVCTL1E.147
*,COS_U_LATITUDE(U_FIELD) !IN COS(LAT) AT U POINTS (2-D ARRAY) ADVCTL1E.148
*,SEC_U_LATITUDE(U_FIELD) !IN 1/COS(LAT) AT U POINTS (2-D ARRAY) ADVCTL1E.149
*,COS_U_LONGITUDE(ROW_LENGTH) !IN COS(LONGITUDE) AT U-POINTS. ADVCTL1E.150
*,SIN_U_LONGITUDE(ROW_LENGTH) !IN SIN(LONGITUDE) AT U-POINTS. ADVCTL1E.151
*,LONGITUDE_STEP_INVERSE !IN 1/(DELTA LAMDA) ADVCTL1E.152
*,LATITUDE_STEP_INVERSE !IN 1/(DELTA PHI) ADVCTL1E.153
*,ADVECTION_TIMESTEP !IN ADVCTL1E.154
*,NU_BASIC !IN STANDARD NU TERM FOR MODEL RUN. ADVCTL1E.155
*,F1(U_FIELD) !IN A CORIOLIS TERM SEE DOCUMENTATION ADVCTL1E.156
*,F2(U_FIELD) !IN A CORIOLIS TERM SEE DOCUMENTATION ADVCTL1E.157
*,KD(P_LEVELS) !IN DIVERGENCE DAMPING COEFFICIENTS ADVCTL1E.158
ADVCTL1E.159
REAL ADVCTL1E.160
* OMEGA(U_FIELD,P_LEVELS) !OUT TRUE VERTICAL VELOCITY ADVCTL1E.161
C*--------------------------------------------------------------------- ADVCTL1E.162
ADVCTL1E.163
C*L DEFINE ARRAYS AND VARIABLES USED IN THIS ROUTINE----------------- ADVCTL1E.164
C DEFINE LOCAL ARRAYS: 3 ARE REQUIRED ADVCTL1E.165
REAL ADVCTL1E.166
* WORK1(U_FIELD) ! GENERAL WORKSPACE ADVCTL1E.167
*,WORK2(P_FIELD) ! GENERAL WORKSPACE ADVCTL1E.168
&, OMEGA_P(P_FIELD) ! HOLDS OMEGA AT P POINTS. ADVCTL1E.169
ADVCTL1E.170
C*--------------------------------------------------------------------- ADVCTL1E.171
C DEFINE LOCAL VARIABLES ADVCTL1E.172
ADVCTL1E.173
C COUNT VARIABLES FOR DO LOOPS ETC. ADVCTL1E.174
INTEGER ADVCTL1E.175
& I,K,K1 ADVCTL1E.176
ADVCTL1E.177
INTEGER X_FIELD ! 1 IF 2ND ORDER ELSE U_FIELD IF 4TH ORDER ADVCTL1E.178
ADVCTL1E.179
C REAL SCALARS ADVCTL1E.180
REAL ADVCTL1E.181
& CONST1,LC_LF,TIMESTEP ADVCTL1E.182
& ,PK, PK1 ! Pressure at half levels ADVCTL1E.183
& ,P_EXNER_FULL ! Exner pressure at full model level ADVCTL1E.184
ADVCTL1E.185
C LOGICAL VARIABLE ADVCTL1E.186
LOGICAL ADVCTL1E.187
* L_SECOND ! SET TO TRUE IF NU_BASIC EQUAL TO ZERO ADVCTL1E.188
C*L EXTERNAL SUBROUTINE CALLS:--------------------------------------- ADVCTL1E.189
EXTERNAL TH_Q_ADV,UV_ADV,P_TO_UV,DIV_DAMP ADVCTL1E.190
& ,TRAC_ADV,TRAC_VERT_ADV,UV_TO_P,POLAR ADVCTL1E.191
C*--------------------------------------------------------------------- ADVCTL1E.192
ADVCTL1E.193
*IF DEF,MPP ADVCTL1E.194
INTEGER extended_address(P_FIELD) ADVCTL1E.195
*ENDIF ADVCTL1E.196
ADVCTL1E.197
*CALL C_THADV
ADVCTL1E.198
*CALL P_EXNERC
ADVCTL1E.199
ADVCTL1E.200
ADVCTL1E.201
*IF DEF,MPP ADVCTL1E.202
IF (NU_BASIC .NE. 0.0) THEN ADVCTL1E.203
! Calculate the mapping between points on the normal horizontal ADVCTL1E.204
! field, and points in the extended field (with double halos for ADVCTL1E.205
! the fourth order code) ADVCTL1E.206
! Logic: extended_address=old_address ADVCTL1E.207
! + ROW_LENGTH*extra_NS_Halo ADVCTL1E.208
! -> extra halo row at top of field ADVCTL1E.209
! + (row_number+1)*2*extra_EW_Halo ADVCTL1E.210
! -> two extra halo points for each preceeding row ADVCTL1E.211
! + extra_EW_Halo -> extra halo point at start of this row ADVCTL1E.212
DO I=FIRST_VALID_PT,LAST_P_VALID_PT ADVCTL1E.213
extended_address(I)=I + ROW_LENGTH*extra_NS_Halo + ADVCTL1E.214
& (((I-1)/ROW_LENGTH)+extra_NS_Halo)*2*extra_EW_Halo + ADVCTL1E.215
& extra_EW_Halo ADVCTL1E.216
ENDDO ADVCTL1E.217
ENDIF ADVCTL1E.218
*ENDIF ADVCTL1E.219
CL MAXIMUM VECTOR LENGTH ASSUMED IS U_FIELD. ADVCTL1E.220
CL--------------------------------------------------------------------- ADVCTL1E.221
CL INTERNAL STRUCTURE INCLUDING SUBROUTINE CALLS: ADVCTL1E.222
CL--------------------------------------------------------------------- ADVCTL1E.223
CL ADVCTL1E.224
C**************************************************************** ADVCTL1E.225
C INTEGERS AND VARIABLES NEEDED WHEN USING ADVCTL1E.226
C TRACER ADVECTION OF THETAL & QT ADVCTL1E.227
C***************************************************************** ADVCTL1E.228
IF(L_TRACER_THETAL_QT)THEN ADVCTL1E.229
LC_LF=LC + LF ADVCTL1E.230
P_POINTS_UPDATE=upd_P_ROWS*ROW_LENGTH ADVCTL1E.231
START_U_REQUIRED = START_POINT_NO_HALO-ROW_LENGTH ADVCTL1E.232
P_POINTS_REQUIRED = (upd_P_ROWS+2)*ROW_LENGTH ADVCTL1E.233
U_POINTS_REQUIRED = (upd_U_ROWS+2)*ROW_LENGTH ADVCTL1E.234
ENDIF ADVCTL1E.235
CL--------------------------------------------------------------------- ADVCTL1E.236
CL SECTION 1. INTERPOLATE FIELDS ONTO U GRID. ADVCTL1E.237
CL--------------------------------------------------------------------- ADVCTL1E.238
ADVCTL1E.239
IF(NU_BASIC.EQ.0.) THEN ADVCTL1E.240
L_SECOND=.TRUE. ADVCTL1E.241
X_FIELD=1 ADVCTL1E.242
ELSE ADVCTL1E.243
L_SECOND=.FALSE. ADVCTL1E.244
X_FIELD=U_FIELD ADVCTL1E.245
END IF ADVCTL1E.246
*IF DEF,MPP ADVCTL1E.247
! Initialise arrays WORK1 & WORK2 ADVCTL1E.248
DO I = 1,P_FIELD ADVCTL1E.249
WORK1(I) = 1.0 ADVCTL1E.250
WORK2(I) = 1.0 ADVCTL1E.251
END DO ADVCTL1E.252
*ENDIF ADVCTL1E.253
ADVCTL1E.254
C---------------------------------------------------------------------- ADVCTL1E.255
CL SECTION 1.1 INTERPOLATE PSTAR ONTO U GRID. ADVCTL1E.256
C---------------------------------------------------------------------- ADVCTL1E.257
ADVCTL1E.258
CALL P_TO_UV
(PSTAR,WORK1,P_FIELD,U_FIELD,ROW_LENGTH,tot_P_ROWS) ADVCTL1E.259
ADVCTL1E.260
C---------------------------------------------------------------------- ADVCTL1E.261
CL SECTION 1.2 INTERPOLATE PSTAR_OLD ONTO U GRID. ADVCTL1E.262
C---------------------------------------------------------------------- ADVCTL1E.263
ADVCTL1E.264
CALL P_TO_UV
(PSTAR_OLD,WORK2,P_FIELD,U_FIELD,ROW_LENGTH, ADVCTL1E.265
& tot_P_ROWS) ADVCTL1E.266
ADVCTL1E.267
*IF DEF,MPP ADVCTL1E.268
! Update the halos of WORK1 and WORK2 ADVCTL1E.269
CALL SWAPBOUNDS
(WORK1,ROW_LENGTH,tot_P_ROWS,EW_Halo,NS_Halo,1) ADVCTL1E.270
CALL SWAPBOUNDS
(WORK2,ROW_LENGTH,tot_P_ROWS,EW_Halo,NS_Halo,1) ADVCTL1E.271
*ENDIF ADVCTL1E.272
ADVCTL1E.273
CL ADVCTL1E.274
CL--------------------------------------------------------------------- ADVCTL1E.275
CL SECTION 2. CALL DIV_DAMP TO PERFORM DIVERGENCE DAMPING. ADVCTL1E.276
CL--------------------------------------------------------------------- ADVCTL1E.277
ADVCTL1E.278
C PSTAR_OLD ON U GRID IS HELD IN WORK2. ADVCTL1E.279
ADVCTL1E.280
CALL DIV_DAMP
(U,V,RS,SEC_U_LATITUDE,WORK2,COS_U_LATITUDE,KD, ADVCTL1E.281
* LONGITUDE_STEP_INVERSE,LATITUDE_STEP_INVERSE, ADVCTL1E.282
* P_FIELD,U_FIELD,ROW_LENGTH,P_LEVELS, ADVCTL1E.283
*CALL ARGFLDPT
ADVCTL1E.284
* BKH,ADVECTION_TIMESTEP,DELTA_AK,DELTA_BK, ADVCTL1E.285
* COS_U_LONGITUDE,SIN_U_LONGITUDE,SEC_P_LATITUDE) ADVCTL1E.286
ADVCTL1E.287
CL ADVCTL1E.288
CL--------------------------------------------------------------------- ADVCTL1E.289
CL SECTION 3. CALL UV_ADV TO ADVECT U AND V. ADVCTL1E.290
CL--------------------------------------------------------------------- ADVCTL1E.291
ADVCTL1E.292
C PSTAR ON U GRID IS HELD IN WORK1. ADVCTL1E.293
C PSTAR_OLD ON U GRID IS HELD IN WORK2. ADVCTL1E.294
ADVCTL1E.295
CALL UV_ADV
(U,V,WORK2,WORK1,U_MEAN,V_MEAN, ADVCTL1E.296
* SEC_U_LATITUDE,ETADOT_MEAN,RS,DELTA_AK,DELTA_BK,AK, ADVCTL1E.297
* BK,F1,F2,LATITUDE_STEP_INVERSE,ADVECTION_TIMESTEP, ADVCTL1E.298
* NU_BASIC,LONGITUDE_STEP_INVERSE,U_FIELD,P_FIELD, ADVCTL1E.299
* ROW_LENGTH,P_LEVELS, ADVCTL1E.300
*CALL ARGFLDPT
ADVCTL1E.301
* COS_U_LONGITUDE,SIN_U_LONGITUDE,SEC_P_LATITUDE, ADVCTL1E.302
& AKH,BKH,OMEGA,L_SECOND,LLINTS, ADVCTL1E.303
*IF DEF,MPP ADVCTL1E.304
& extended_address, ADVCTL1E.305
*ENDIF ADVCTL1E.306
& LWHITBROM,X_FIELD) ADVCTL1E.307
*IF DEF,MPP ADVCTL1E.308
! Update the halos for the OMEGA array ADVCTL1E.309
CALL SWAPBOUNDS
(OMEGA,ROW_LENGTH,tot_P_ROWS, ADVCTL1E.310
& EW_Halo,NS_Halo,P_LEVELS) ADVCTL1E.311
ADVCTL1E.312
! U and V are not swapped here, but in ATM_DYN, after the call to ADVCTL1E.313
! MASS_UWT which spoils the halo. ADVCTL1E.314
ADVCTL1E.315
*ENDIF ADVCTL1E.316
CL ADVCTL1E.317
CL--------------------------------------------------------------------- ADVCTL1E.318
CL SECTION 4. CALL TH_Q_ADV TO ADVECT THETAL AND ADVCTL1E.319
CL QT USING STANDARD HEUN ADVECTION. ADVCTL1E.320
CL IF USING TRACER ADVECTION FOR THETAL & QT ADVCTL1E.321
CL THEN CALL APPROPRIATE TRACER ROUTINES. ADVCTL1E.322
CL--------------------------------------------------------------------- ADVCTL1E.323
IF(.NOT.L_TRACER_THETAL_QT)THEN ADVCTL1E.324
CL--------------------------------------------------------------- ADVCTL1E.325
C SECTION 4.1 HEUN ADVVECTION SCHEME ADVCTL1E.326
C ADVCTL1E.327
CL---------------------------------------------------------------- ADVCTL1E.328
ADVCTL1E.329
CALL TH_Q_ADV
(THETAL,QT,PSTAR_OLD,PSTAR,U_MEAN,V_MEAN, ADVCTL1E.330
* SEC_P_LATITUDE, ADVCTL1E.331
* ETADOT_MEAN,RS,DELTA_AK,DELTA_BK,LATITUDE_STEP_INVERSE ADVCTL1E.332
* ,ADVECTION_TIMESTEP,NU_BASIC,LONGITUDE_STEP_INVERSE, ADVCTL1E.333
* NORTHERN_FILTERED_P_ROW,SOUTHERN_FILTERED_P_ROW, ADVCTL1E.334
* P_LEVELS,U_FIELD,P_FIELD,ROW_LENGTH, ADVCTL1E.335
*CALL ARGFLDPT
ADVCTL1E.336
* TRIGS,IFAX,FILTER_WAVE_NUMBER_P_ROWS,SEC_U_LATITUDE, ADVCTL1E.337
* AKH,BKH,QCL,QCF,P_EXNER,OMEGA, ADVCTL1E.338
& Q_LEVELS,AK,BK,L_SECOND, ADVCTL1E.339
*IF DEF,MPP ADVCTL1E.340
& extended_address, ADVCTL1E.341
*ENDIF ADVCTL1E.342
& LWHITBROM) ADVCTL1E.343
ADVCTL1E.344
*IF DEF,MPP ADVCTL1E.345
! Update the halos for the THETAL array ADVCTL1E.346
CALL SWAPBOUNDS
(THETAL,ROW_LENGTH,tot_P_ROWS, ADVCTL1E.347
& EW_Halo,NS_Halo,P_LEVELS) ADVCTL1E.348
ADVCTL1E.349
! Update the halos for the QT array ADVCTL1E.350
CALL SWAPBOUNDS
(QT,ROW_LENGTH,tot_P_ROWS, ADVCTL1E.351
& EW_Halo,NS_Halo,Q_LEVELS) ADVCTL1E.352
*ENDIF ADVCTL1E.353
ELSE ADVCTL1E.354
CL--------------------------------------------------------------- ADVCTL1E.355
C SECTION 4.2 TRACER ADVECTION OF THETAL AND QT ADVCTL1E.356
C ADVCTL1E.357
CL---------------------------------------------------------------- ADVCTL1E.358
DO K=1,P_LEVELS ADVCTL1E.359
CALL TRAC_ADV
(THETAL(1,K),NSWEEP(1,K),U_MEAN(1,K),V_MEAN(1,K), ADVCTL1E.360
& U_FIELD,P_FIELD,ADVECTION_TIMESTEP,ROW_LENGTH, ADVCTL1E.361
*CALL ARGFLDPT
ADVCTL1E.362
& SEC_P_LATITUDE,COS_P_LATITUDE,RS(1,K), ADVCTL1E.363
& PSTAR_OLD,DELTA_AK(K),DELTA_BK(K), ADVCTL1E.364
& LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE, ADVCTL1E.365
& L_SUPERBEE) ADVCTL1E.366
END DO ADVCTL1E.367
ADVCTL1E.368
C Set temperature flux through lower boundary to zero ADVCTL1E.369
DO I=1,P_FIELD ADVCTL1E.370
WORK2(I)=0. ADVCTL1E.371
END DO ADVCTL1E.372
ADVCTL1E.373
*IF DEF,MPP ADVCTL1E.374
FIRST_POINT = START_POINT_NO_HALO ADVCTL1E.375
POINTS = upd_P_ROWS * ROW_LENGTH ADVCTL1E.376
*IF DEF,GLOBAL ADVCTL1E.377
! If processor includes North or South polar row, compute a pt. on it ADVCTL1E.378
IF (at_top_of_LPG) THEN ADVCTL1E.379
FIRST_POINT = FIRST_POINT -Offx -1 ADVCTL1E.380
POINTS = POINTS +Offx +1 ADVCTL1E.381
END IF ADVCTL1E.382
IF (at_base_of_LPG) THEN ADVCTL1E.383
POINTS = POINTS +Offx +1 ADVCTL1E.384
END IF ADVCTL1E.385
*ENDIF ADVCTL1E.386
*ELSE ADVCTL1E.387
*IF DEF,GLOBAL ADVCTL1E.388
FIRST_POINT=ROW_LENGTH ADVCTL1E.389
POINTS = P_FIELD - 2*ROW_LENGTH + 2 ADVCTL1E.390
*ELSE ADVCTL1E.391
FIRST_POINT=ROW_LENGTH+2 ADVCTL1E.392
POINTS = P_FIELD - 2*ROW_LENGTH - 2 ADVCTL1E.393
*ENDIF ADVCTL1E.394
*ENDIF ADVCTL1E.395
ADVCTL1E.396
TIMESTEP=ADVECTION_TIMESTEP ADVCTL1E.397
CONST1=R/(CP*CP)*TIMESTEP ADVCTL1E.398
CALL TRAC_VERT_ADV
(THETAL,ETADOT_MEAN,PSTAR,P_FIELD, ADVCTL1E.399
& TIMESTEP,1,P_LEVELS,FIRST_POINT, ADVCTL1E.400
& POINTS,P_LEVELS,1,P_LEVELS,RS,AK,BK,DELTA_AK, ADVCTL1E.401
& DELTA_BK,WORK2,L_TRACER_THETAL_QT,L_SUPERBEE) ADVCTL1E.402
C --------------------------------------------------------------------- ADVCTL1E.403
CL INTERPOLATE OMEGA TO P GRID AND CALCULATE ADVCTL1E.404
CL REMAINING TERM IN ADVECTION EQUATION. ADVCTL1E.405
CL CALCULATE TOTAL MASS-WEIGHTED INCREMENT TO FIELD. ADVCTL1E.406
C --------------------------------------------------------------------- ADVCTL1E.407
ADVCTL1E.408
DO 110 K=1,P_LEVELS ADVCTL1E.409
ADVCTL1E.410
CALL UV_TO_P
(OMEGA(START_U_REQUIRED,K), ADVCTL1E.411
& OMEGA_P(START_POINT_NO_HALO),U_POINTS_REQUIRED, ADVCTL1E.412
& P_POINTS_UPDATE,ROW_LENGTH,upd_P_ROWS+1) ADVCTL1E.413
ADVCTL1E.414
*IF DEF,GLOBAL ADVCTL1E.415
DO I = FIRST_VALID_PT,FIRST_VALID_PT+ROW_LENGTH-1 ADVCTL1E.416
OMEGA_P(I)=0. ADVCTL1E.417
END DO ADVCTL1E.418
DO I = LAST_P_VALID_PT-ROW_LENGTH+1,LAST_P_VALID_PT ADVCTL1E.419
OMEGA_P(I)=0. ADVCTL1E.420
END DO ADVCTL1E.421
ADVCTL1E.422
C SET UP POLAR VALUE OF OMEGA ADVCTL1E.423
ADVCTL1E.424
CALL POLAR
(OMEGA_P,OMEGA_P,OMEGA_P, ADVCTL1E.425
*CALL ARGFLDPT
ADVCTL1E.426
& P_FIELD,P_FIELD,P_FIELD, ADVCTL1E.427
& START_POINT_NO_HALO, ADVCTL1E.428
& END_P_POINT_NO_HALO-ROW_LENGTH+1, ADVCTL1E.429
& ROW_LENGTH,1) ADVCTL1E.430
*ENDIF ADVCTL1E.431
C TOTAL MASS-WEIGHTED HORIZONTAL AND VERTICAL INCREMENTS ARE CALCULATED ADVCTL1E.432
C SEPARATELY. ADVCTL1E.433
ADVCTL1E.434
IF(K.LT.Q_LEVELS+1) THEN ADVCTL1E.435
DO I = FIRST_POINT,FIRST_POINT+POINTS-1 ADVCTL1E.436
ADVCTL1E.437
PK = AKH(K+1)+ BKH(K+1)*PSTAR(I) ADVCTL1E.438
PK1 = AKH(K) + BKH(K)*PSTAR(I) ADVCTL1E.439
P_EXNER_FULL = P_EXNER_C ADVCTL1E.440
& (P_EXNER(I,K+1),P_EXNER(I,K),PK,PK1,KAPPA) ADVCTL1E.441
ADVCTL1E.442
WORK2(I) = ADVCTL1E.443
& -(LC*QCL(I,K)+LC_LF*QCF(I,K))*CONST1* ADVCTL1E.444
& OMEGA_P(I)/((AK(K)+BK(K)*PSTAR(I)) ADVCTL1E.445
& *(P_EXNER_FULL)* ADVCTL1E.446
& RS(I,K)*RS(I,K)*(DELTA_AK(K)+DELTA_BK(K)*PSTAR(I))) ADVCTL1E.447
THETAL(I,K) =THETAL(I,K)+WORK2(I) ADVCTL1E.448
END DO ADVCTL1E.449
END IF ADVCTL1E.450
ADVCTL1E.451
CL END LOOP OVER P_LEVELS+1 ADVCTL1E.452
110 CONTINUE ADVCTL1E.453
ADVCTL1E.454
*IF DEF,GLOBAL ADVCTL1E.455
C Copy polar values along row ADVCTL1E.456
DO K=1,P_LEVELS ADVCTL1E.457
*IF DEF,MPP ADVCTL1E.458
IF (at_top_of_LPG) THEN ADVCTL1E.459
DO I = FIRST_VALID_PT+Offx,START_POINT_NO_HALO-Offx-2 ADVCTL1E.460
THETAL(I,K) = THETAL(START_POINT_NO_HALO-Offx-1,K) ADVCTL1E.461
END DO ADVCTL1E.462
END IF ADVCTL1E.463
IF (at_base_of_LPG) THEN ADVCTL1E.464
DO I = END_P_POINT_NO_HALO+Offx+2,LAST_P_VALID_PT-Offx ADVCTL1E.465
THETAL(I,K) = THETAL(END_P_POINT_NO_HALO+Offx+1,K) ADVCTL1E.466
END DO ADVCTL1E.467
END IF ADVCTL1E.468
*ELSE ADVCTL1E.469
DO I=1,ROW_LENGTH-1 ADVCTL1E.470
THETAL(I,K) = THETAL(ROW_LENGTH,K) ADVCTL1E.471
THETAL(P_FIELD+1-I,K) = THETAL(P_FIELD+1-ROW_LENGTH,K) ADVCTL1E.472
END DO ADVCTL1E.473
*ENDIF ADVCTL1E.474
END DO ADVCTL1E.475
*ENDIF ADVCTL1E.476
*IF DEF,MPP ADVCTL1E.477
! Update the halos for the THETAL array ADVCTL1E.478
CALL SWAPBOUNDS
(THETAL,ROW_LENGTH,tot_P_ROWS, ADVCTL1E.479
& EW_Halo,NS_Halo,P_LEVELS) ADVCTL1E.480
ADVCTL1E.481
*ENDIF ADVCTL1E.482
ADVCTL1E.483
DO K=1,Q_LEVELS ADVCTL1E.484
CALL TRAC_ADV
(QT(1,K),NSWEEP(1,K),U_MEAN(1,K),V_MEAN(1,K), ADVCTL1E.485
& U_FIELD,P_FIELD,ADVECTION_TIMESTEP,ROW_LENGTH, ADVCTL1E.486
*CALL ARGFLDPT
ADVCTL1E.487
& SEC_P_LATITUDE,COS_P_LATITUDE,RS(1,K), ADVCTL1E.488
& PSTAR_OLD,DELTA_AK(K),DELTA_BK(K), ADVCTL1E.489
& LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE, ADVCTL1E.490
& L_SUPERBEE) ADVCTL1E.491
END DO ADVCTL1E.492
ADVCTL1E.493
C Set moisture flux through lower boundary to zero ADVCTL1E.494
DO I=1,P_FIELD ADVCTL1E.495
WORK2(I)=0. ADVCTL1E.496
END DO ADVCTL1E.497
ADVCTL1E.498
! Values of FIRST_POINT and POINTS ADVCTL1E.499
! should be unaltered from those set for Thetal ADVCTL1E.500
ADVCTL1E.501
CALL TRAC_VERT_ADV
(QT,ETADOT_MEAN,PSTAR,P_FIELD, ADVCTL1E.502
& TIMESTEP,1,Q_LEVELS,FIRST_POINT, ADVCTL1E.503
& POINTS,P_LEVELS,1,Q_LEVELS,RS,AK,BK,DELTA_AK, ADVCTL1E.504
& DELTA_BK,WORK2,L_TRACER_THETAL_QT,L_SUPERBEE) ADVCTL1E.505
ADVCTL1E.506
C END DO ADVCTL1E.507
ADVCTL1E.508
*IF DEF,GLOBAL ADVCTL1E.509
C Copy polar values along row ADVCTL1E.510
DO K=1,Q_LEVELS ADVCTL1E.511
*IF DEF,MPP ADVCTL1E.512
IF (at_top_of_LPG) THEN ADVCTL1E.513
DO I = FIRST_VALID_PT+Offx,START_POINT_NO_HALO-Offx-2 ADVCTL1E.514
QT(I,K) = QT(START_POINT_NO_HALO-Offx-1,K) ADVCTL1E.515
END DO ADVCTL1E.516
END IF ADVCTL1E.517
IF (at_base_of_LPG) THEN ADVCTL1E.518
DO I = END_P_POINT_NO_HALO+Offx+2,LAST_P_VALID_PT-Offx ADVCTL1E.519
QT(I,K) = QT(END_P_POINT_NO_HALO+Offx+1,K) ADVCTL1E.520
END DO ADVCTL1E.521
END IF ADVCTL1E.522
*ELSE ADVCTL1E.523
DO I=1,ROW_LENGTH-1 ADVCTL1E.524
QT(I,K) = QT(ROW_LENGTH,K) ADVCTL1E.525
QT(P_FIELD+1-I,K) = QT(P_FIELD+1-ROW_LENGTH,K) ADVCTL1E.526
END DO ADVCTL1E.527
*ENDIF ADVCTL1E.528
END DO ADVCTL1E.529
*ENDIF ADVCTL1E.530
*IF DEF,MPP ADVCTL1E.531
! Update the halos for the QT array ADVCTL1E.532
CALL SWAPBOUNDS
(QT,ROW_LENGTH,tot_P_ROWS, ADVCTL1E.533
& EW_Halo,NS_Halo,Q_LEVELS) ADVCTL1E.534
*ENDIF ADVCTL1E.535
ENDIF ! L_TRACER_THETAL_QT ADVCTL1E.536
ADVCTL1E.537
CL END OF ROUTINE ADV_CTL ADVCTL1E.538
ADVCTL1E.539
RETURN ADVCTL1E.540
END ADVCTL1E.541
*ENDIF ADVCTL1E.542