*IF DEF,A12_1B,OR,DEF,A12_1C,OR,DEF,A12_1D ATJ0F402.10
C ******************************COPYRIGHT****************************** GTS2F400.217
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.218
C GTS2F400.219
C Use, duplication or disclosure of this code is subject to the GTS2F400.220
C restrictions as set forth in the contract. GTS2F400.221
C GTS2F400.222
C Meteorological Office GTS2F400.223
C London Road GTS2F400.224
C BRACKNELL GTS2F400.225
C Berkshire UK GTS2F400.226
C RG12 2SZ GTS2F400.227
C GTS2F400.228
C If no contract has been raised with this copy of the code, the use, GTS2F400.229
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.230
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.231
C Modelling at the above address. GTS2F400.232
C ******************************COPYRIGHT****************************** GTS2F400.233
C GTS2F400.234
CLL SUBROUTINE ADV_CTL -------------------------------------------- ADVCTL1A.3
CLL ADVCTL1A.4
CLL PURPOSE: CALCULATES THE RIGHT-HAND SIDES OF EQUATIONS (40) TO ADVCTL1A.5
CLL (42) REPRESENTING THE MASS WEIGHTED FIELDS AFTER ADVCTL1A.6
CLL ADVECTION AND THE ADDITION OF THE CORIOLIS TERM DUE ADVCTL1A.7
CLL TO VERTICAL MOTION. THE SPATIAL DIFFERENCING SCHEME ADVCTL1A.8
CLL (35) TO (38) IS USED. ONE MORE PRESSURE ROW THAN ADVCTL1A.9
CLL VELOCITY ROW IS UPDATED. DIVERGENCE DAMPS VELOCITY ADVCTL1A.10
CLL FIELDS AS DESCRIBED IN SECTION 3.4 OF DOCUMENTATION ADVCTL1A.11
CLL PAPER NO. 10 ADVCTL1A.12
CLL NOT SUITABLE FOR SINGLE COLUMN USE. ADVCTL1A.13
CLL VERSION FOR CRAY Y-MP ADVCTL1A.14
CLL ADVCTL1A.15
CLL WRITTEN BY M.H MAWSON. ADVCTL1A.16
CLL ADVCTL1A.17
CLL MODEL MODIFICATION HISTORY FROM MODEL VERSION 3.0: ADVCTL1A.18
CLL VERSION DATE ADVCTL1A.19
CLL 3.1 24/02/93 Tidy code to remove QA Fortran messages. MM240293.27
CLL 3.4 22/06/94 Argument LLINTS added and passed to UV_ADV GSS1F304.787
CLL Argument LWHITBROM added and passed to UV_ADV, GSS1F304.788
CLL TH_ADV, QT_ADV GSS1F304.789
CLL S.J.Swarbrick GSS1F304.790
CLL Argument X_FIELD passed to UV_ADV to reduce GSS1F304.791
CLL memory use of new macrotasking. R.Rawlins GSS1F304.792
CLL 4.0 1/4/95 TRACER ADVECTION OF THETAL AND QT INCLUDED AS AN ATD1F400.136
CLL OPTION UNDER THE CONTROL OF LOGICAL L_TRACER_THETAL_QT ATD1F400.137
CLL L_TRACER_THETAL_QT IF SET TO TRUE. ATD1F400.138
CLL CALLS TO TH_ADV AND QT_ADV ARE REPLACED BY ATD1F400.139
CLL CALLS TO TRAC_ADV AND TRAC_VERT_ADV ATD1F400.140
CLL L_HALF_TIMESTEP_TOP REPLACED BY L_TRACER_THETAL_QT. ATD1F400.141
CLL AUTHOR: T. DAVIES, REVIEWER: M. MAWSON ATD1F400.142
! 3.5 28/03/95 MPP code: Modify P_TO_UV calls and APB0F305.489
! add halo updates P.Burton APB0F305.490
! 4.1 22/04/96 Added TYPFLDPT arguments to dynamics routines APB0F401.692
! which allows many of the differences between APB0F401.693
! MPP and "normal" code to be at top level APB0F401.694
! P.Burton APB0F401.695
! 4.2 20/08/96 MPP mods for tracer advection. RTHBarnes. ARB1F402.1
!LL 4.2 16/08/96 Make the FILTER_WAVE_NUMBER arrays globally APB0F402.10
!LL sized P.Burton APB0F402.11
!LL 4.2 25/11/96 Corrections to allow LAM to run in MPP mode. ARB2F402.26
!LL RTHBarnes. ARB2F402.27
!LL 4.3 17/03/97 Make initialisation of OMEGA_P safe for MPP. RTHB. ARB1F403.1
C vn4.3 Mar. 97 T3E migration : optimisation changes GSS1F403.652
C D.Salmond GSS1F403.653
CLL ADVCTL1A.20
CLL PROGRAMMING STANDARD: UNIFIED MODEL DOCUMENTATION PAPER NO. 4, ADVCTL1A.21
CLL STANDARD B. ADVCTL1A.22
CLL ADVCTL1A.23
CLL LOGIACL COMPONENTS COVERED: P12 ADVCTL1A.24
CLL ADVCTL1A.25
CLL PROJECT TASK: P1 ADVCTL1A.26
CLL ADVCTL1A.27
CLL DOCUMENTATION: THE EQUATIONS USED ARE (35) TO (46) AND ADVCTL1A.28
CLL SECTION 3.4 IN UNIFIED MODEL DOCUMENTATION ADVCTL1A.29
CLL NO. 10 M.J.P. CULLEN, T.DAVIES AND ADVCTL1A.30
CLL M.H. MAWSON VERSION 17, DATED 11/02/91. ADVCTL1A.31
CLLEND------------------------------------------------------------- ADVCTL1A.32
C*L ARGUMENTS:--------------------------------------------------- ADVCTL1A.33
SUBROUTINE ADV_CTL 2,37ADVCTL1A.34
1 (THETAL,QT,PSTAR_OLD,PSTAR,U_MEAN,V_MEAN,U,V, ADVCTL1A.35
& COS_U_LATITUDE,COS_P_LATITUDE, ATD1F400.143
2 SEC_P_LATITUDE,ETADOT_MEAN,RS,DELTA_AK,DELTA_BK, ADVCTL1A.37
3 LATITUDE_STEP_INVERSE,ADVECTION_TIMESTEP,NU_BASIC, ADVCTL1A.38
4 LONGITUDE_STEP_INVERSE,NORTHERN_FILTERED_P_ROW, ADVCTL1A.39
5 SOUTHERN_FILTERED_P_ROW,Q_LEVELS, ADVCTL1A.40
6 U_FIELD,P_FIELD,ROW_LENGTH, APB0F401.696
*CALL ARGFLDPT
APB0F401.697
7 P_LEVELS,SEC_U_LATITUDE,F1,F2,AK,BK,KD,AKH,BKH, APB0F401.698
8 COS_U_LONGITUDE,SIN_U_LONGITUDE,TRIGS,IFAX, ADVCTL1A.43
9 FILTER_WAVE_NUMBER_P_ROWS,OMEGA,QCL,QCF,P_EXNER, ADVCTL1A.44
& LLINTS,LWHITBROM, ATD1F400.144
& L_TRACER_THETAL_QT,NSWEEP,L_SUPERBEE) ATD1F400.145
ADVCTL1A.46
IMPLICIT NONE ADVCTL1A.47
ADVCTL1A.48
! All TYPFLDPT arguments are intent IN ARB1F402.2
*CALL TYPFLDPT
ARB1F402.3
*CALL PARVARS
ARB1F402.4
ARB1F402.5
INTEGER ADVCTL1A.49
* P_FIELD !IN DIMENSION OF FIELDS ON PRESSSURE GRID. ADVCTL1A.50
*, U_FIELD !IN DIMENSION OF FIELDS ON VELOCITY GRID ADVCTL1A.51
*, P_LEVELS !IN NUMBER OF PRESSURE LEVELS. ADVCTL1A.53
*, Q_LEVELS !IN NUMBER OF MOIST LEVELS. ADVCTL1A.54
*, ROW_LENGTH !IN NUMBER OF POINTS PER ROW ADVCTL1A.56
*, NORTHERN_FILTERED_P_ROW !IN ROW ON WHICH FILTERING STOPS ADVCTL1A.57
* ! MOVING TOWARDS THE EQUATOR. ADVCTL1A.58
*, SOUTHERN_FILTERED_P_ROW !IN ROW ON WHICH FILTERING STARTS AGAIN. ADVCTL1A.59
* ! MOVING TOWARDS SOUTHPOLE. ADVCTL1A.60
*, IFAX(10) !IN HOLDS FACTORS OF ROW_LENGTH USED BY ADVCTL1A.63
* ! FILTERING. ADVCTL1A.64
*IF DEF,MPP ARB1F402.6
*, NSWEEP(glsize(2),P_LEVELS) !IN No.of EW sweeps for all rows. ARB1F402.7
*ELSE ARB1F402.8
*, NSWEEP(P_FIELD/ROW_LENGTH,P_LEVELS) !IN ATD1F400.146
*ENDIF ARB1F402.9
* ! NUMBER OF EAST_WEST TIMESTEPS NEEDED FOR ATD1F400.147
* ! EACH LATITUDE WHEN USING TRACER ADVECTION. ATD1F400.148
*, FIRST_POINT ! ATD1F400.149
*, POINTS ! ATD1F400.150
APB0F401.699
INTEGER APB0F402.12
& FILTER_WAVE_NUMBER_P_ROWS(GLOBAL_P_FIELD/GLOBAL_ROW_LENGTH) APB0F402.13
! LAST WAVE NUMBER NOT TO BE CHOPPED ON A P ROW APB0F402.14
LOGICAL ADVCTL1A.66
& L_SUPERBEE ! FORM OF LIMITER USED IN TRACER ATD1F400.151
& ! ADVECTION ATD1F400.152
& ,L_TRACER_THETAL_QT ! LOGICAL TRUE IF USING TRACER ATD1F400.153
& ! ADVECTION FOR THETAL & QT ATD1F400.154
INTEGER ATD1F400.155
& P_POINTS_UPDATE ATD1F400.156
& ,START_U_REQUIRED ATD1F400.160
& ,P_POINTS_REQUIRED ATD1F400.161
& ,U_POINTS_REQUIRED ATD1F400.162
ATD1F400.163
& ,LLINTS !Logical switch for linear TS GSS1F304.794
& ,LWHITBROM !Log swch for White & Bromley terms GSS1F304.795
ADVCTL1A.69
REAL ADVCTL1A.70
* U_MEAN(U_FIELD,P_LEVELS) !IN AVERAGED MASS-WEIGHTED U VELOCITY ADVCTL1A.71
* ! FROM ADJUSTMENT STEP ADVCTL1A.72
*,V_MEAN(U_FIELD,P_LEVELS) !IN AVERAGED MASS-WEIGHTED V VELOCITY ADVCTL1A.73
* ! * COS(LAT) FROM ADJUSTMENT STEP ADVCTL1A.74
*,ETADOT_MEAN(P_FIELD,P_LEVELS) !IN AVERAGED MASS-WEIGHTED ADVCTL1A.75
* !VERTICAL VELOCITY FROM ADJUSTMENT STEP ADVCTL1A.76
*,PSTAR(P_FIELD) !IN PSTAR FIELD AT NEW TIME-LEVEL ADVCTL1A.77
*,PSTAR_OLD(P_FIELD) !IN PSTAR AT PREVIOUS TIME-LEVEL ADVCTL1A.78
*,RS(P_FIELD,P_LEVELS) !IN RS FIELD ADVCTL1A.79
*,TRIGS(ROW_LENGTH) !IN HOLDS TRIGONOMETRIC FUNCTIONS USED ADVCTL1A.80
* ! IN FILTERING. ADVCTL1A.81
*,QCL(P_FIELD,Q_LEVELS) !IN. PRIMARY ARRAY FOR QCL. ADVCTL1A.82
*,QCF(P_FIELD,Q_LEVELS) !IN. PRIMARY ARRAY FOR QCF. ADVCTL1A.83
*,P_EXNER(P_FIELD,P_LEVELS+1) !IN. PRIMARY ARRAY FOR P_EXNER. ADVCTL1A.84
ADVCTL1A.85
REAL ADVCTL1A.86
* U(U_FIELD,P_LEVELS) !INOUT U FIELD, MASS-WEIGHTED ON OUT. ADVCTL1A.87
*,V(U_FIELD,P_LEVELS) !INOUT V FIELD, MASS-WEIGHTED ON OUT. ADVCTL1A.88
*,THETAL(P_FIELD,P_LEVELS) !INOUT THETAL FIELD ADVCTL1A.89
*,QT(P_FIELD,Q_LEVELS) !INOUT QT FIELD. ADVCTL1A.90
ADVCTL1A.91
REAL ADVCTL1A.92
* DELTA_AK(P_LEVELS) !IN LAYER THICKNESS ADVCTL1A.93
*,DELTA_BK(P_LEVELS) !IN LAYER THICKNESS ADVCTL1A.94
*,AK(P_LEVELS) !IN FIRST TERM IN HYBRID CO-ORDS. ADVCTL1A.95
*,BK(P_LEVELS) !IN SECOND TERM IN HYBRID CO-ORDS. ADVCTL1A.96
*,AKH(P_LEVELS+1) !IN AK AT HALF LEVELS ADVCTL1A.97
*,BKH(P_LEVELS+1) !IN BK AT HALF LEVELS ADVCTL1A.98
&,COS_P_LATITUDE(P_FIELD) !IN COS_LAT AT P_POINTS (2D ARRAY) ATD1F400.164
*,SEC_P_LATITUDE(P_FIELD) !IN 1/COS(LAT) AT P POINTS (2-D ARRAY) ADVCTL1A.99
*,COS_U_LATITUDE(U_FIELD) !IN COS(LAT) AT U POINTS (2-D ARRAY) ADVCTL1A.100
*,SEC_U_LATITUDE(U_FIELD) !IN 1/COS(LAT) AT U POINTS (2-D ARRAY) ADVCTL1A.101
*,COS_U_LONGITUDE(ROW_LENGTH) !IN COS(LONGITUDE) AT U-POINTS. ADVCTL1A.102
*,SIN_U_LONGITUDE(ROW_LENGTH) !IN SIN(LONGITUDE) AT U-POINTS. ADVCTL1A.103
*,LONGITUDE_STEP_INVERSE !IN 1/(DELTA LAMDA) ADVCTL1A.104
*,LATITUDE_STEP_INVERSE !IN 1/(DELTA PHI) ADVCTL1A.105
*,ADVECTION_TIMESTEP !IN ADVCTL1A.106
*,NU_BASIC !IN STANDARD NU TERM FOR MODEL RUN. ADVCTL1A.107
*,F1(U_FIELD) !IN A CORIOLIS TERM SEE DOCUMENTATION ADVCTL1A.108
*,F2(U_FIELD) !IN A CORIOLIS TERM SEE DOCUMENTATION ADVCTL1A.109
*,KD(P_LEVELS) !IN DIVERGENCE DAMPING COEFFICIENTS ADVCTL1A.110
ADVCTL1A.111
REAL ADVCTL1A.112
* OMEGA(U_FIELD,P_LEVELS) !OUT TRUE VERTICAL VELOCITY ADVCTL1A.113
C*--------------------------------------------------------------------- ADVCTL1A.114
ADVCTL1A.115
C*L DEFINE ARRAYS AND VARIABLES USED IN THIS ROUTINE----------------- ADVCTL1A.116
C DEFINE LOCAL ARRAYS: 3 ARE REQUIRED ATD1F400.165
REAL ADVCTL1A.118
* WORK1(U_FIELD) ! GENERAL WORKSPACE ADVCTL1A.119
*,WORK2(P_FIELD) ! GENERAL WORKSPACE ADVCTL1A.120
&, OMEGA_P(P_FIELD) ! HOLDS OMEGA AT P POINTS. ATD1F400.166
ADVCTL1A.121
C*--------------------------------------------------------------------- ADVCTL1A.122
C DEFINE LOCAL VARIABLES ADVCTL1A.123
ADVCTL1A.124
C COUNT VARIABLES FOR DO LOOPS ETC. ATD1F400.167
INTEGER ATD1F400.168
& I,K,K1 ATD1F400.169
ATD1F400.170
INTEGER X_FIELD ! 1 IF 2ND ORDER ELSE U_FIELD IF 4TH ORDER AAD3F304.9
AAD3F304.10
C REAL SCALARS ATD1F400.171
REAL ATD1F400.172
& CONST1,LC_LF,TIMESTEP ATD1F400.173
& ,PK, PK1 ! Pressure at half levels ATD1F400.174
& ,P_EXNER_FULL ! Exner pressure at full model level ATD1F400.175
ATD1F400.176
C LOGICAL VARIABLE ADVCTL1A.129
LOGICAL ADVCTL1A.130
* L_SECOND ! SET TO TRUE IF NU_BASIC EQUAL TO ZERO ADVCTL1A.131
C*L EXTERNAL SUBROUTINE CALLS:--------------------------------------- ADVCTL1A.132
EXTERNAL TH_ADV,QT_ADV,UV_ADV,P_TO_UV,DIV_DAMP MM240293.28
& ,TRAC_ADV,TRAC_VERT_ADV,UV_TO_P,POLAR ATD1F400.177
C*--------------------------------------------------------------------- ADVCTL1A.134
GSS1F403.654
*IF DEF,MPP GSS1F403.655
INTEGER extended_address(P_FIELD) GSS1F403.656
*ENDIF GSS1F403.657
GSS1F403.658
*CALL C_THADV
ATD1F400.178
*CALL P_EXNERC
ATD1F400.179
ATD1F400.180
ADVCTL1A.135
*IF DEF,MPP GSS1F403.659
IF (NU_BASIC .NE. 0.0) THEN GSS1F403.660
! Calculate the mapping between points on the normal horizontal GSS1F403.661
! field, and points in the extended field (with double halos for GSS1F403.662
! the fourth order code) GSS1F403.663
! Logic: extended_address=old_address GSS1F403.664
! + ROW_LENGTH*extra_NS_Halo GSS1F403.665
! -> extra halo row at top of field GSS1F403.666
! + (row_number+1)*2*extra_EW_Halo GSS1F403.667
! -> two extra halo points for each preceeding row GSS1F403.668
! + extra_EW_Halo -> extra halo point at start of this row GSS1F403.669
DO I=FIRST_VALID_PT,LAST_P_VALID_PT GSS1F403.670
extended_address(I)=I + ROW_LENGTH*extra_NS_Halo + GSS1F403.671
& (((I-1)/ROW_LENGTH)+extra_NS_Halo)*2*extra_EW_Halo + GSS1F403.672
& extra_EW_Halo GSS1F403.673
ENDDO GSS1F403.674
ENDIF GSS1F403.675
*ENDIF GSS1F403.676
CL MAXIMUM VECTOR LENGTH ASSUMED IS U_FIELD. ADVCTL1A.136
CL--------------------------------------------------------------------- ADVCTL1A.137
CL INTERNAL STRUCTURE INCLUDING SUBROUTINE CALLS: ADVCTL1A.138
CL--------------------------------------------------------------------- ADVCTL1A.139
CL ADVCTL1A.140
C**************************************************************** ATD1F400.181
C INTEGERS AND VARIABLES NEEDED WHEN USING ATD1F400.182
C TRACER ADVECTION OF THETAL & QT ATD1F400.183
C***************************************************************** ATD1F400.184
IF(L_TRACER_THETAL_QT)THEN ATD1F400.185
LC_LF=LC + LF ATD1F400.186
P_POINTS_UPDATE=upd_P_ROWS*ROW_LENGTH APB0F401.702
START_U_REQUIRED = START_POINT_NO_HALO-ROW_LENGTH APB0F401.703
P_POINTS_REQUIRED = (upd_P_ROWS+2)*ROW_LENGTH APB0F401.704
U_POINTS_REQUIRED = (upd_U_ROWS+2)*ROW_LENGTH APB0F401.705
ENDIF ATD1F400.194
CL--------------------------------------------------------------------- ADVCTL1A.141
CL SECTION 1. INTERPOLATE FIELDS ONTO U GRID. ADVCTL1A.142
CL--------------------------------------------------------------------- ADVCTL1A.143
ADVCTL1A.144
IF(NU_BASIC.EQ.0.) THEN ADVCTL1A.145
L_SECOND=.TRUE. ADVCTL1A.146
X_FIELD=1 AAD3F304.11
ELSE ADVCTL1A.147
L_SECOND=.FALSE. ADVCTL1A.148
X_FIELD=U_FIELD AAD3F304.12
END IF ADVCTL1A.149
*IF DEF,MPP ARB2F402.28
! Initialise arrays WORK1 & WORK2 ARB2F402.29
DO I = 1,P_FIELD ARB2F402.30
WORK1(I) = 1.0 ARB2F402.31
WORK2(I) = 1.0 ARB2F402.32
END DO ARB2F402.33
*ENDIF ARB2F402.34
ADVCTL1A.150
C---------------------------------------------------------------------- ADVCTL1A.151
CL SECTION 1.1 INTERPOLATE PSTAR ONTO U GRID. ADVCTL1A.152
C---------------------------------------------------------------------- ADVCTL1A.153
ADVCTL1A.154
CALL P_TO_UV
(PSTAR,WORK1,P_FIELD,U_FIELD,ROW_LENGTH,tot_P_ROWS) APB0F401.706
ADVCTL1A.156
C---------------------------------------------------------------------- ADVCTL1A.157
CL SECTION 1.2 INTERPOLATE PSTAR_OLD ONTO U GRID. ADVCTL1A.158
C---------------------------------------------------------------------- ADVCTL1A.159
ADVCTL1A.160
CALL P_TO_UV
(PSTAR_OLD,WORK2,P_FIELD,U_FIELD,ROW_LENGTH, APB0F401.707
& tot_P_ROWS) APB0F401.708
APB0F401.709
*IF DEF,MPP APB0F401.710
! Update the halos of WORK1 and WORK2 APB0F401.711
CALL SWAPBOUNDS
(WORK1,ROW_LENGTH,tot_P_ROWS,EW_Halo,NS_Halo,1) APB0F401.712
CALL SWAPBOUNDS
(WORK2,ROW_LENGTH,tot_P_ROWS,EW_Halo,NS_Halo,1) APB0F401.713
! Hopefully we shouldn't need these lines if loop bounds are right APB0F401.714
! CALL SET_SIDES(WORK1,U_FIELD,ROW_LENGTH,1,fld_type_u) APB0F401.715
! CALL SET_SIDES(WORK2,U_FIELD,ROW_LENGTH,1,fld_type_u) APB0F401.716
*ENDIF APB0F401.717
ADVCTL1A.162
CL ADVCTL1A.163
CL--------------------------------------------------------------------- ADVCTL1A.164
CL SECTION 2. CALL DIV_DAMP TO PERFORM DIVERGENCE DAMPING. ADVCTL1A.165
CL--------------------------------------------------------------------- ADVCTL1A.166
ADVCTL1A.167
C PSTAR_OLD ON U GRID IS HELD IN WORK2. ADVCTL1A.168
ADVCTL1A.169
CALL DIV_DAMP
(U,V,RS,SEC_U_LATITUDE,WORK2,COS_U_LATITUDE,KD, ADVCTL1A.170
* LONGITUDE_STEP_INVERSE,LATITUDE_STEP_INVERSE, ADVCTL1A.171
* P_FIELD,U_FIELD,ROW_LENGTH,P_LEVELS, APB0F401.718
*CALL ARGFLDPT
APB0F401.719
* BKH,ADVECTION_TIMESTEP,DELTA_AK,DELTA_BK, ADVCTL1A.173
* COS_U_LONGITUDE,SIN_U_LONGITUDE,SEC_P_LATITUDE) ADVCTL1A.174
ADVCTL1A.175
CL ADVCTL1A.176
CL--------------------------------------------------------------------- ADVCTL1A.177
CL SECTION 3. CALL UV_ADV TO ADVECT U AND V. ADVCTL1A.178
CL--------------------------------------------------------------------- ADVCTL1A.179
ADVCTL1A.180
C PSTAR ON U GRID IS HELD IN WORK1. ADVCTL1A.181
C PSTAR_OLD ON U GRID IS HELD IN WORK2. ADVCTL1A.182
ADVCTL1A.183
CALL UV_ADV
(U,V,WORK2,WORK1,U_MEAN,V_MEAN, ADVCTL1A.184
* SEC_U_LATITUDE,ETADOT_MEAN,RS,DELTA_AK,DELTA_BK,AK, ADVCTL1A.185
* BK,F1,F2,LATITUDE_STEP_INVERSE,ADVECTION_TIMESTEP, ADVCTL1A.186
* NU_BASIC,LONGITUDE_STEP_INVERSE,U_FIELD,P_FIELD, APB0F401.720
* ROW_LENGTH,P_LEVELS, APB0F401.721
*CALL ARGFLDPT
APB0F401.722
* COS_U_LONGITUDE,SIN_U_LONGITUDE,SEC_P_LATITUDE, APB0F401.723
& AKH,BKH,OMEGA,L_SECOND,LLINTS, ATD1F400.195
*IF DEF,MPP GSS1F403.677
& extended_address, GSS1F403.678
*ENDIF GSS1F403.679
& LWHITBROM,X_FIELD) GSS1F304.797
*IF DEF,MPP APB0F305.509
! Update the halos for the OMEGA array APB0F401.724
CALL SWAPBOUNDS
(OMEGA,ROW_LENGTH,tot_P_ROWS, APB0F401.725
& EW_Halo,NS_Halo,P_LEVELS) APB0F401.726
APB0F305.512
! U and V are not swapped here, but in ATM_DYN, after the call to APB0F305.513
! MASS_UWT which spoils the halo. APB0F305.514
APB0F305.515
*ENDIF APB0F305.516
CL ADVCTL1A.192
CL--------------------------------------------------------------------- ADVCTL1A.193
CL SECTION 4. CALL TH_ADV TO ADVECT THETAL AND QT_ADV TO ADVECT ADVCTL1A.194
CL QT USING STANDARD HEUN ADVECTION. ATD1F400.196
CL IF USING TRACER ADVECTION FOR THETAL & QT ATD1F400.197
CL THEN CALL APPROPRIATE TRACER ROUTINES. ATD1F400.198
CL--------------------------------------------------------------------- ADVCTL1A.196
IF(.NOT.L_TRACER_THETAL_QT)THEN ATD1F400.199
CL--------------------------------------------------------------- ATD1F400.200
C SECTION 4.1 HEUN ADVVECTION SCHEME ATD1F400.201
C ATD1F400.202
CL---------------------------------------------------------------- ATD1F400.203
ADVCTL1A.197
CALL TH_ADV
(THETAL,PSTAR_OLD,PSTAR,U_MEAN,V_MEAN,SEC_P_LATITUDE, ADVCTL1A.198
* ETADOT_MEAN,RS,DELTA_AK,DELTA_BK,LATITUDE_STEP_INVERSE ADVCTL1A.199
* ,ADVECTION_TIMESTEP,NU_BASIC,LONGITUDE_STEP_INVERSE, ADVCTL1A.200
* NORTHERN_FILTERED_P_ROW,SOUTHERN_FILTERED_P_ROW, ADVCTL1A.201
* P_LEVELS,U_FIELD,P_FIELD,ROW_LENGTH, APB0F401.727
*CALL ARGFLDPT
APB0F401.728
* TRIGS,IFAX,FILTER_WAVE_NUMBER_P_ROWS,SEC_U_LATITUDE, ADVCTL1A.203
* AKH,BKH,QCL,QCF,P_EXNER,OMEGA, ADVCTL1A.204
& Q_LEVELS,AK,BK,L_SECOND, GSS1F403.680
*IF DEF,MPP GSS1F403.681
& extended_address, GSS1F403.682
*ENDIF GSS1F403.683
& LWHITBROM) GSS1F403.684
ADVCTL1A.206
*IF DEF,MPP APB0F305.517
! Update the halos for the THETAL array APB0F401.729
CALL SWAPBOUNDS
(THETAL,ROW_LENGTH,tot_P_ROWS, APB0F401.730
& EW_Halo,NS_Halo,P_LEVELS) APB0F401.731
APB0F305.520
*ENDIF APB0F305.521
CALL QT_ADV
(QT,PSTAR_OLD,PSTAR,U_MEAN,V_MEAN,SEC_P_LATITUDE, ADVCTL1A.207
* ETADOT_MEAN,RS,DELTA_AK,DELTA_BK,LATITUDE_STEP_INVERSE ADVCTL1A.208
* ,ADVECTION_TIMESTEP,NU_BASIC,LONGITUDE_STEP_INVERSE, ADVCTL1A.209
* NORTHERN_FILTERED_P_ROW,SOUTHERN_FILTERED_P_ROW, ADVCTL1A.210
* Q_LEVELS,P_LEVELS,U_FIELD,P_FIELD,ROW_LENGTH, APB0F401.732
*CALL ARGFLDPT
APB0F401.733
* TRIGS,IFAX,FILTER_WAVE_NUMBER_P_ROWS, APB0F401.734
& SEC_U_LATITUDE,AKH,BKH,L_SECOND, ATD1F400.205
*IF DEF,MPP GSS1F403.685
& extended_address, GSS1F403.686
*ENDIF GSS1F403.687
& LWHITBROM) GSS1F304.800
ADVCTL1A.214
*IF DEF,MPP APB0F401.735
! Update the halos for the QT array APB0F401.736
CALL SWAPBOUNDS
(QT,ROW_LENGTH,tot_P_ROWS, APB0F401.737
& EW_Halo,NS_Halo,Q_LEVELS) APB0F401.738
*ENDIF APB0F401.739
ELSE ATD1F400.206
CL--------------------------------------------------------------- ATD1F400.207
C SECTION 4.2 TRACER ADVECTION OF THETAL AND QT ATD1F400.208
C ATD1F400.209
CL---------------------------------------------------------------- ATD1F400.210
DO K=1,P_LEVELS ATD1F400.211
CALL TRAC_ADV
(THETAL(1,K),NSWEEP(1,K),U_MEAN(1,K),V_MEAN(1,K), ATD1F400.212
& U_FIELD,P_FIELD,ADVECTION_TIMESTEP,ROW_LENGTH, ATD1F400.213
*CALL ARGFLDPT
ARB1F402.10
& SEC_P_LATITUDE,COS_P_LATITUDE,RS(1,K), ARB1F402.11
& PSTAR_OLD,DELTA_AK(K),DELTA_BK(K), ATD1F400.215
& LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE, ATD1F400.216
& L_SUPERBEE) ATD1F400.217
END DO ATD1F400.218
ATD1F400.219
C Set temperature flux through lower boundary to zero ATD1F400.220
DO I=1,P_FIELD ATD1F400.221
WORK2(I)=0. ATD1F400.222
END DO ATD1F400.223
ATD1F400.224
*IF DEF,MPP ARB1F402.12
FIRST_POINT = START_POINT_NO_HALO ARB1F402.13
POINTS = upd_P_ROWS * ROW_LENGTH ARB1F402.14
*IF DEF,GLOBAL ATD1F400.225
! If processor includes North or South polar row, compute a pt. on it ARB1F402.15
IF (at_top_of_LPG) THEN ARB1F402.16
FIRST_POINT = FIRST_POINT -Offx -1 ARB1F402.17
POINTS = POINTS +Offx +1 ARB1F402.18
END IF ARB1F402.19
IF (at_base_of_LPG) THEN ARB1F402.20
POINTS = POINTS +Offx +1 ARB1F402.21
END IF ARB1F402.22
*ENDIF ARB1F402.23
*ELSE ARB1F402.24
*IF DEF,GLOBAL ARB1F402.25
FIRST_POINT=ROW_LENGTH ATD1F400.226
POINTS = P_FIELD - 2*ROW_LENGTH + 2 ATD1F400.227
*ELSE ATD1F400.228
FIRST_POINT=ROW_LENGTH+2 ATD1F400.229
POINTS = P_FIELD - 2*ROW_LENGTH - 2 ATD1F400.230
*ENDIF ATD1F400.231
*ENDIF ARB1F402.26
ATD1F400.232
TIMESTEP=ADVECTION_TIMESTEP ATD1F400.233
CONST1=R/(CP*CP)*TIMESTEP ATD1F400.234
CALL TRAC_VERT_ADV
(THETAL,ETADOT_MEAN,PSTAR,P_FIELD, ATD1F400.235
& TIMESTEP,1,P_LEVELS,FIRST_POINT, ATD1F400.236
& POINTS,P_LEVELS,1,P_LEVELS,RS,AK,BK,DELTA_AK, ATD1F400.237
& DELTA_BK,WORK2,L_TRACER_THETAL_QT,L_SUPERBEE) ATD1F400.238
C --------------------------------------------------------------------- ATD1F400.239
CL INTERPOLATE OMEGA TO P GRID AND CALCULATE ATD1F400.240
CL REMAINING TERM IN ADVECTION EQUATION. ATD1F400.241
CL CALCULATE TOTAL MASS-WEIGHTED INCREMENT TO FIELD. ATD1F400.242
C --------------------------------------------------------------------- ATD1F400.243
ATD1F400.244
DO 110 K=1,P_LEVELS ATD1F400.245
ATD1F400.246
CALL UV_TO_P
(OMEGA(START_U_REQUIRED,K), ATD1F400.247
& OMEGA_P(START_POINT_NO_HALO),U_POINTS_REQUIRED, APB0F401.740
& P_POINTS_UPDATE,ROW_LENGTH,upd_P_ROWS+1) APB0F401.741
ATD1F400.250
*IF DEF,GLOBAL ATD1F400.251
DO I = FIRST_VALID_PT,FIRST_VALID_PT+ROW_LENGTH-1 ARB1F403.2
OMEGA_P(I)=0. ARB1F403.3
END DO ARB1F403.4
DO I = LAST_P_VALID_PT-ROW_LENGTH+1,LAST_P_VALID_PT ARB1F403.5
OMEGA_P(I)=0. ARB1F403.6
END DO ATD1F400.255
ATD1F400.256
C SET UP POLAR VALUE OF OMEGA ATD1F400.257
ATD1F400.258
CALL POLAR
(OMEGA_P,OMEGA_P,OMEGA_P, APB0F401.742
*CALL ARGFLDPT
APB0F401.743
& P_FIELD,P_FIELD,P_FIELD, APB0F401.744
& START_POINT_NO_HALO, APB0F401.745
& END_P_POINT_NO_HALO-ROW_LENGTH+1, APB0F401.746
& ROW_LENGTH,1) APB0F401.747
*ENDIF ATD1F400.261
C TOTAL MASS-WEIGHTED HORIZONTAL AND VERTICAL INCREMENTS ARE CALCULATED ATD1F400.262
C SEPARATELY. ATD1F400.263
ATD1F400.264
IF(K.LT.Q_LEVELS+1) THEN ATD1F400.265
DO I = FIRST_POINT,FIRST_POINT+POINTS-1 ARB1F402.27
ATD1F400.267
PK = AKH(K+1)+ BKH(K+1)*PSTAR(I) ATD1F400.268
PK1 = AKH(K) + BKH(K)*PSTAR(I) ATD1F400.269
P_EXNER_FULL = P_EXNER_C ATD1F400.270
& (P_EXNER(I,K+1),P_EXNER(I,K),PK,PK1,KAPPA) ATD1F400.271
ATD1F400.272
WORK2(I) = ATD1F400.273
& -(LC*QCL(I,K)+LC_LF*QCF(I,K))*CONST1* ATD1F400.274
& OMEGA_P(I)/((AK(K)+BK(K)*PSTAR(I)) ATD1F400.275
& *(P_EXNER_FULL)* ATD1F400.276
& RS(I,K)*RS(I,K)*(DELTA_AK(K)+DELTA_BK(K)*PSTAR(I))) ATD1F400.277
THETAL(I,K) =THETAL(I,K)+WORK2(I) ATD1F400.278
END DO ATD1F400.279
END IF ATD1F400.280
ATD1F400.281
CL END LOOP OVER P_LEVELS+1 ATD1F400.282
110 CONTINUE ATD1F400.283
ATD1F400.284
*IF DEF,GLOBAL ATD1F400.285
C Copy polar values along row ATD1F400.286
DO K=1,P_LEVELS ATD1F400.287
*IF DEF,MPP ARB1F402.28
IF (at_top_of_LPG) THEN ARB1F402.29
DO I = FIRST_VALID_PT+Offx,START_POINT_NO_HALO-Offx-2 ARB1F402.30
THETAL(I,K) = THETAL(START_POINT_NO_HALO-Offx-1,K) ARB1F402.31
END DO ARB1F402.32
END IF ARB1F402.33
IF (at_base_of_LPG) THEN ARB1F402.34
DO I = END_P_POINT_NO_HALO+Offx+2,LAST_P_VALID_PT-Offx ARB1F402.35
THETAL(I,K) = THETAL(END_P_POINT_NO_HALO+Offx+1,K) ARB1F402.36
END DO ARB1F402.37
END IF ARB1F402.38
*ELSE ARB1F402.39
DO I=1,ROW_LENGTH-1 ATD1F400.288
THETAL(I,K) = THETAL(ROW_LENGTH,K) ATD1F400.289
THETAL(P_FIELD+1-I,K) = THETAL(P_FIELD+1-ROW_LENGTH,K) ATD1F400.290
END DO ATD1F400.291
*ENDIF ARB1F402.40
END DO ATD1F400.292
*ENDIF ATD1F400.293
*IF DEF,MPP ARB1F402.41
! Update the halos for the THETAL array ARB1F402.42
CALL SWAPBOUNDS
(THETAL,ROW_LENGTH,tot_P_ROWS, ARB1F402.43
& EW_Halo,NS_Halo,P_LEVELS) ARB1F402.44
ATD1F400.294
*ENDIF ARB1F402.45
ARB1F402.46
DO K=1,Q_LEVELS ATD1F400.295
CALL TRAC_ADV
(QT(1,K),NSWEEP(1,K),U_MEAN(1,K),V_MEAN(1,K), ATD1F400.296
& U_FIELD,P_FIELD,ADVECTION_TIMESTEP,ROW_LENGTH, ATD1F400.297
*CALL ARGFLDPT
ARB1F402.47
& SEC_P_LATITUDE,COS_P_LATITUDE,RS(1,K), ARB1F402.48
& PSTAR_OLD,DELTA_AK(K),DELTA_BK(K), ATD1F400.299
& LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE, ATD1F400.300
& L_SUPERBEE) ATD1F400.301
END DO ATD1F400.302
ATD1F400.303
C Set moisture flux through lower boundary to zero ATD1F400.304
DO I=1,P_FIELD ATD1F400.305
WORK2(I)=0. ATD1F400.306
END DO ATD1F400.307
ATD1F400.308
! Values of FIRST_POINT and POINTS ARB1F402.49
! should be unaltered from those set for Thetal ARB1F402.50
ATD1F400.316
CALL TRAC_VERT_ADV
(QT,ETADOT_MEAN,PSTAR,P_FIELD, ATD1F400.317
& TIMESTEP,1,Q_LEVELS,FIRST_POINT, ATD1F400.318
& POINTS,P_LEVELS,1,Q_LEVELS,RS,AK,BK,DELTA_AK, ATD1F400.319
& DELTA_BK,WORK2,L_TRACER_THETAL_QT,L_SUPERBEE) ATD1F400.320
ATD1F400.321
C END DO ATD1F400.322
ATD1F400.323
*IF DEF,GLOBAL ATD1F400.324
C Copy polar values along row ATD1F400.325
DO K=1,Q_LEVELS ATD1F400.326
*IF DEF,MPP ARB1F402.51
IF (at_top_of_LPG) THEN ARB1F402.52
DO I = FIRST_VALID_PT+Offx,START_POINT_NO_HALO-Offx-2 ARB1F402.53
QT(I,K) = QT(START_POINT_NO_HALO-Offx-1,K) ARB1F402.54
END DO ARB1F402.55
END IF ARB1F402.56
IF (at_base_of_LPG) THEN ARB1F402.57
DO I = END_P_POINT_NO_HALO+Offx+2,LAST_P_VALID_PT-Offx ARB1F402.58
QT(I,K) = QT(END_P_POINT_NO_HALO+Offx+1,K) ARB1F402.59
END DO ARB1F402.60
END IF ARB1F402.61
*ELSE ARB1F402.62
DO I=1,ROW_LENGTH-1 ATD1F400.327
QT(I,K) = QT(ROW_LENGTH,K) ATD1F400.328
QT(P_FIELD+1-I,K) = QT(P_FIELD+1-ROW_LENGTH,K) ATD1F400.329
END DO ATD1F400.330
*ENDIF ARB1F402.63
END DO ATD1F400.331
*ENDIF ATD1F400.332
*IF DEF,MPP ARB1F402.64
! Update the halos for the QT array ARB1F402.65
CALL SWAPBOUNDS
(QT,ROW_LENGTH,tot_P_ROWS, ARB1F402.66
& EW_Halo,NS_Halo,Q_LEVELS) ARB1F402.67
*ENDIF ARB1F402.68
ENDIF ! L_TRACER_THETAL_QT ARB1F402.69
ADVCTL1A.215
CL END OF ROUTINE ADV_CTL ADVCTL1A.216
ADVCTL1A.217
RETURN ADVCTL1A.218
END ADVCTL1A.219
*ENDIF ADVCTL1A.220