*IF DEF,A12_1D,AND,DEF,MPP THADV1D.2
C *****************************COPYRIGHT****************************** THADV1D.3
C (c) CROWN COPYRIGHT 1996, METEOROLOGICAL OFFICE, All Rights Reserved. THADV1D.4
C THADV1D.5
C Use, duplication or disclosure of this code is subject to the THADV1D.6
C restrictions as set forth in the contract. THADV1D.7
C THADV1D.8
C Meteorological Office THADV1D.9
C London Road THADV1D.10
C BRACKNELL THADV1D.11
C Berkshire UK THADV1D.12
C RG12 2SZ THADV1D.13
C THADV1D.14
C If no contract has been raised with this copy of the code, the use, THADV1D.15
C duplication or disclosure of it is strictly prohibited. Permission THADV1D.16
C to do so must first be obtained in writing from the Head of Numerical THADV1D.17
C Modelling at the above address. THADV1D.18
C ******************************COPYRIGHT****************************** THADV1D.19
CLL SUBROUTINE TH_ADV ------------------------------------------- THADV1D.20
CLL THADV1D.21
CLL PURPOSE: CALCULATES MASS-WEIGHTED INCREMENTS TO THETAL THADV1D.22
CLL DUE TO ADVECTION BY USING EQUATION (35) TO CALCULATE PROVISIONAL THADV1D.23
CLL VALUES OF THETAL AT THE NEW TIME-LEVEL, AND THEN RECALCULATING THE THADV1D.24
CLL ADVECTION TERMS ON THE RIGHT-HAND SIDE OF (35) USING THESE THADV1D.25
CLL PROVISIONAL VALUES. THE FINAL INCREMENTS ARE CALCULATED AS IN THADV1D.26
CLL EQUATION (40). THOSE REQUIRING FILTERING ARE FILTERED AND ALL THE THADV1D.27
CLL INCREMENTS ARE ADDED ONTO THE FIELDS USING (40). IF RUNNING A THADV1D.28
CLL GLOBAL MODEL POLAR IS CALLED TO UPDATE POLAR VALUES. THADV1D.29
CLL THADV1D.30
CLL NOT SUITABLE FOR SINGLE COLUMN USE. THADV1D.31
CLL VERSION FOR CRAY Y-MP THADV1D.32
CLL THADV1D.33
CLL MM, DR <- PROGRAMMER OF SOME OR ALL OF PREVIOUS CODE OR CHANGES THADV1D.34
CLL MPP CODE ADDED BY P.BURTON THADV1D.35
CLL THADV1D.36
CLL MODEL MODIFICATION HISTORY: THADV1D.37
CLL VERSION DATE THADV1D.38
!LL 4.2 25/10/96 New deck for HADCM2-specific section A12_1D, THADV1D.39
!LL as THADV1C but with reintroduced error in THADV1D.40
!LL calculation of S.Pole THETAL_INCREMENT. T.Johns THADV1D.41
!LL 4.3 24/04/97 Updated in line with MPP optimisations. ATJ0F403.72
!LL Complete coding non-local communication. T Johns ATJ0F403.73
!LL 4.3 24/04/97 Fixes to 4th order calculations P.Burton GPB5F403.25
!LL 4.4 03/12/97 Fix to HadCM2 deliberate bug S.D.Mullerworth GSM1F404.75
CLL THADV1D.42
CLL PROGRAMMING STANDARD: UNIFIED MODEL DOCUMENTATION PAPER NO. 4, THADV1D.43
CLL STANDARD B. THADV1D.44
CLL THADV1D.45
CLL SYSTEM COMPONENTS COVERED: P121 THADV1D.46
CLL THADV1D.47
CLL SYSTEM TASK: P1 THADV1D.48
CLL THADV1D.49
CLL DOCUMENTATION: THE EQUATIONS USED ARE (35) AND (40) THADV1D.50
CLL IN UNIFIED MODEL DOCUMENTATION PAPER NO. 10 THADV1D.51
CLL M.J.P. CULLEN,T.DAVIES AND M.H.MAWSON THADV1D.52
CLL THADV1D.53
CLLEND------------------------------------------------------------- THADV1D.54
THADV1D.55
C*L ARGUMENTS:--------------------------------------------------- THADV1D.56
SUBROUTINE TH_ADV 1,59THADV1D.57
1 (THETAL,PSTAR_OLD,PSTAR,U_MEAN,V_MEAN, THADV1D.58
2 SEC_P_LATITUDE,ETADOT_MEAN,RS,DELTA_AK,DELTA_BK, THADV1D.59
3 LATITUDE_STEP_INVERSE,ADVECTION_TIMESTEP,NU_BASIC, THADV1D.60
4 LONGITUDE_STEP_INVERSE,NORTHERN_FILTERED_P_ROW, THADV1D.61
5 SOUTHERN_FILTERED_P_ROW,P_LEVELS, THADV1D.62
6 U_FIELD,P_FIELD,ROW_LENGTH, THADV1D.63
*CALL ARGFLDPT
THADV1D.64
7 TRIGS,IFAX,FILTER_WAVE_NUMBER_P_ROWS,SEC_U_LATITUDE, THADV1D.65
8 AKH,BKH,QCL,QCF,P_EXNER,OMEGA, THADV1D.66
9 Q_LEVELS,AK,BK,L_SECOND, THADV1D.67
& extended_address, ATJ0F403.74
& LWHITBROM) THADV1D.68
THADV1D.69
IMPLICIT NONE THADV1D.70
THADV1D.71
! All TYPFLDPT arguments are intent IN THADV1D.72
*CALL TYPFLDPT
THADV1D.73
THADV1D.74
INTEGER THADV1D.75
* P_FIELD !IN DIMENSION OF FIELDS ON PRESSSURE GRID. THADV1D.76
*, U_FIELD !IN DIMENSION OF FIELDS ON VELOCITY GRID THADV1D.77
*, P_LEVELS !IN NUMBER OF PRESSURE LEVELS. THADV1D.78
*, Q_LEVELS !IN NUMBER OF MOIST LEVELS. THADV1D.79
*, ROW_LENGTH !IN NUMBER OF POINTS PER ROW THADV1D.80
*, NORTHERN_FILTERED_P_ROW !IN ROW ON WHICH FILTERING STOPS THADV1D.81
*, SOUTHERN_FILTERED_P_ROW !IN ROW ON WHICH FILTERING STARTS AGAIN. THADV1D.82
&, FILTER_WAVE_NUMBER_P_ROWS(GLOBAL_P_FIELD/GLOBAL_ROW_LENGTH) THADV1D.83
& ! LAST WAVE NUMBER NOT TO BE CHOPPED THADV1D.84
*, IFAX(10) !IN HOLDS FACTORS OF ROW_LENGTH USED BY THADV1D.85
* ! FILTERING. THADV1D.86
THADV1D.87
C LOGICAL VARIABLE THADV1D.88
LOGICAL THADV1D.89
* L_SECOND ! SET TO TRUE IF NU_BASIC IS ZERO. THADV1D.90
& ,LWHITBROM THADV1D.91
INTEGER extended_address(P_FIELD) ATJ0F403.75
THADV1D.92
REAL THADV1D.93
* THETAL(P_FIELD,P_LEVELS) !INOUT THETAL FIELD THADV1D.94
* ! MASS-WEIGHTED ON OUTPUT. THADV1D.95
THADV1D.96
REAL THADV1D.97
* U_MEAN(U_FIELD,P_LEVELS) !IN AVERAGED MASS-WEIGHTED U VELOCITY THADV1D.98
* ! FROM ADJUSTMENT STEP THADV1D.99
*,V_MEAN(U_FIELD,P_LEVELS) !IN AVERAGED MASS-WEIGHTED V VELOCITY THADV1D.100
* ! * COS(LAT) FROM ADJUSTMENT STEP THADV1D.101
*,ETADOT_MEAN(P_FIELD,P_LEVELS) !IN AVERAGED MASS-WEIGHTED THADV1D.102
* !VERTICAL VELOCITY FROM ADJUSTMENT STEP THADV1D.103
*,PSTAR(P_FIELD) !IN PSTAR FIELD AT NEW TIME-LEVEL THADV1D.104
*,PSTAR_OLD(P_FIELD) !IN PSTAR AT PREVIOUS TIME-LEVEL THADV1D.105
*,RS(P_FIELD,P_LEVELS) !IN RS FIELD THADV1D.106
*,QCL(P_FIELD,Q_LEVELS) !IN. PRIMARY ARRAY FOR QCL THADV1D.107
*,QCF(P_FIELD,Q_LEVELS) !IN. PRIMARY ARRAY FOR QCF THADV1D.108
*,OMEGA(U_FIELD,P_LEVELS) !IN. TRUE VERTICAL VELOCITY DP/DT THADV1D.109
*,P_EXNER(P_FIELD,P_LEVELS+1) !IN. PRIMARY ARRAY FOR EXNER FUNCTION THADV1D.110
THADV1D.111
REAL THADV1D.112
* DELTA_AK(P_LEVELS) !IN LAYER THICKNESS THADV1D.113
*,DELTA_BK(P_LEVELS) !IN LAYER THICKNESS THADV1D.114
*,AK(P_LEVELS) !IN HYBRID CO-ORDINATE AT FULL LEVELS THADV1D.115
*,BK(P_LEVELS) !IN HYBRID CO-ORDINATE AT FULL LEVELS THADV1D.116
*,AKH(P_LEVELS+1) !IN HYBRID CO-ORDINATE AT HALF LEVELS THADV1D.117
*,BKH(P_LEVELS+1) !IN HYBRID CO-ORDINATE AT HALF LEVELS THADV1D.118
*,SEC_P_LATITUDE(P_FIELD) !IN 1/COS(LAT) AT P POINTS (2-D ARRAY) THADV1D.119
*,SEC_U_LATITUDE(U_FIELD) !IN 1/COS(LAT) AT U POINTS (2-D ARRAY) THADV1D.120
*,LONGITUDE_STEP_INVERSE !IN 1/(DELTA LAMDA) THADV1D.121
*,LATITUDE_STEP_INVERSE !IN 1/(DELTA PHI) THADV1D.122
*,ADVECTION_TIMESTEP !IN THADV1D.123
*,NU_BASIC !IN STANDARD NU TERM FOR MODEL RUN. THADV1D.124
*,TRIGS(ROW_LENGTH) !IN HOLDS TRIGONOMETRIC FUNCTIONS USED THADV1D.125
* ! IN FILTERING. THADV1D.126
THADV1D.127
! MPP Parameters ATJ0F403.76
ATJ0F403.77
*CALL PARVARS
ATJ0F403.78
*CALL GCCOM
ATJ0F403.79
ATJ0F403.80
C*L DEFINE ARRAYS AND VARIABLES USED IN THIS ROUTINE----------------- THADV1D.128
C DEFINE LOCAL ARRAYS: 24 ARE REQUIRED. THADV1D.129
REAL THADV1D.130
& OMEGA_P(P_FIELD,P_LEVELS) ! HOLDS OMEGA AT P POINTS. THADV1D.131
THADV1D.132
REAL THADV1D.133
* THETAL_FIRST_INC(P_FIELD,P_LEVELS) ! HOLDS THETAL INCREMENT THADV1D.134
* ! RETURNED BY FIRST CALL TO ADV_P_GD THADV1D.135
*,THETAL_SECOND_INC(P_FIELD)! HOLDS THETAL INCREMENT THADV1D.136
* ! RETURNED BY SECOND CALL TO ADV_P_GD THADV1D.137
*,THETAL_PROV(P_FIELD,P_LEVELS) ! HOLDS PROVISIONAL VALUE OF THADV1D.138
* ! THETAL THADV1D.139
THADV1D.140
REAL THADV1D.141
* THETAL_INCREMENT(P_FIELD,P_LEVELS) !HOLDS INCREMENT TO THETAL THADV1D.142
*,ZERO(P_FIELD) !A FIELD OF ZEROES USED WHERE VERTICAL THADV1D.143
* !VELOCITY IS ZERO. THADV1D.144
THADV1D.145
REAL THADV1D.146
* NUX(P_FIELD,P_LEVELS) !COURANT NBR DEPENDENT NU AT P PTS USED THADV1D.147
* ! IN EAST-WEST ADVECTION. THADV1D.148
*,NUY(P_FIELD,P_LEVELS) !COURANT NBR DEPENDENT NU AT P PTS USED THADV1D.149
* ! IN NORTH-SOUTH ADVECTION. THADV1D.150
THADV1D.151
REAL NUX_MIN(upd_P_ROWS), ! minimum value of NUX along a row THADV1D.152
& NUY_MIN(ROW_LENGTH) ! min of NUY along a column THADV1D.153
THADV1D.154
REAL THADV1D.155
* BRSP(P_FIELD,P_LEVELS) !MASS TERM AT LEVEL K THADV1D.156
THADV1D.157
! Work space required to allow the use of Fourth Order Advection THADV1D.158
! U/V_MEAN_COPY and T_COPY arrays are defined with an extra halo THADV1D.159
! this is required for the bigger stencil of the 4th order operator. THADV1D.160
REAL U_MEAN_COPY((ROW_LENGTH+2*extra_EW_Halo)* THADV1D.161
& (tot_U_ROWS+2*extra_NS_Halo),P_LEVELS), THADV1D.162
& ! Copy of U_MEAN with extra halo space for 4th order THADV1D.163
& V_MEAN_COPY((ROW_LENGTH+2*extra_EW_Halo)* THADV1D.164
& (tot_U_ROWS+2*extra_NS_Halo),P_LEVELS), THADV1D.165
& ! Copy of V_MEAN with extra halo space for 4th order THADV1D.166
& T_COPY((ROW_LENGTH+2*extra_EW_Halo)* THADV1D.167
& (tot_P_ROWS+2*extra_NS_Halo),P_LEVELS) THADV1D.168
& ! Copy of THETAL with extra halo space for 4th order THADV1D.169
THADV1D.170
INTEGER extended_P_FIELD, THADV1D.171
& extended_U_FIELD THADV1D.172
! These are the sizes of the arrays with the extra halos THADV1D.173
C*--------------------------------------------------------------------- THADV1D.174
C DEFINE LOCAL VARIABLES THADV1D.175
ATJ0F403.81
! Extra local arrays to allow N.polar PSTAR and P_EXNER to be sent ATJ0F403.82
! to S.polar processors, recreating the HADCM2 behaviour caused by ATJ0F403.83
! an error in indexing in the original advection code. ATJ0F403.84
ATJ0F403.85
REAL ATJ0F403.86
& PSTAR_NP(ROW_LENGTH), ATJ0F403.87
& P_EXNER_NP(ROW_LENGTH,P_LEVELS+1) ATJ0F403.88
ATJ0F403.89
INTEGER THADV1D.176
* P_POINTS_UPDATE ! NUMBER OF P POINTS TO BE UPDATED. THADV1D.177
* ! = ROWS*ROWLENGTH THADV1D.178
*, U_POINTS_UPDATE ! NUMBER OF U POINTS TO BE UPDATED. THADV1D.179
* ! = (ROWS-1)*ROWLENGTH THADV1D.180
*, P_POINTS_REQUIRED ! NUMBER OF P POINTS AT WHICH VALUES ARE THADV1D.181
* ! NEEDED TO UPDATE AT P_POINTS_UPDATE THADV1D.182
*, U_POINTS_REQUIRED ! NUMBER OF U POINTS AT WHICH VALUES ARE THADV1D.183
* ! NEEDED TO UPDATE AT U_POINTS_UPDATE THADV1D.184
*, START_U_REQUIRED ! FIRST U POINT OF VALUES REQUIRED TO UPDATE THADV1D.185
* ! AT P POINTS UPDATE. THADV1D.186
*, END_U_REQUIRED ! LAST U POINT OF REQUIRED VALUES. THADV1D.187
THADV1D.188
INTEGER I_start,I_end ! loop bounds THADV1D.189
INTEGER info ! return code from comms THADV1D.190
THADV1D.191
C REAL SCALARS THADV1D.192
REAL THADV1D.193
& SCALAR1,SCALAR2,CONST1,LC_LF,TIMESTEP THADV1D.194
&,PK, PK1 ! Pressure at half levels k and k1 (k1=k-1) THADV1D.195
&,P_EXNER_FULL ! Exner pressure at full model level THADV1D.196
THADV1D.197
C COUNT VARIABLES FOR DO LOOPS ETC. THADV1D.198
INTEGER THADV1D.199
& I,J,K1,IK,K THADV1D.200
*, FILTER_SPACE ! HORIZONTAL DIMENSION OF SPACE NEEDED IN FILTERING THADV1D.201
* ! ROUTINE. THADV1D.202
THADV1D.203
C*L EXTERNAL SUBROUTINE CALLS:--------------------------------------- THADV1D.204
EXTERNAL ADV_P_GD,POLAR,UV_TO_P,FILTER THADV1D.205
*IF DEF,CRAY THADV1D.206
INTEGER ISMIN THADV1D.207
EXTERNAL ISMIN THADV1D.208
*ENDIF THADV1D.209
C*--------------------------------------------------------------------- THADV1D.210
CL CALL COMDECK TO GET PHYSICAL CONSTANTS USED. THADV1D.211
THADV1D.212
*CALL C_THADV
THADV1D.213
THADV1D.214
CL MAXIMUM VECTOR LENGTH ASSUMED IS P_FIELD. THADV1D.215
CL--------------------------------------------------------------------- THADV1D.216
CL INTERNAL STRUCTURE INCLUDING SUBROUTINE CALLS: THADV1D.217
CL--------------------------------------------------------------------- THADV1D.218
CL THADV1D.219
THADV1D.220
*CALL P_EXNERC
THADV1D.221
THADV1D.222
CL--------------------------------------------------------------------- THADV1D.223
CL SECTION 1. INITIALISATION THADV1D.224
CL--------------------------------------------------------------------- THADV1D.225
C INCLUDE LOCAL CONSTANTS FROM GENERAL CONSTANTS BLOCK THADV1D.226
THADV1D.227
LC_LF = LC + LF THADV1D.228
P_POINTS_UPDATE = upd_P_ROWS*ROW_LENGTH THADV1D.229
U_POINTS_UPDATE = upd_U_ROWS*ROW_LENGTH THADV1D.230
P_POINTS_REQUIRED = (upd_P_ROWS+2)*ROW_LENGTH THADV1D.231
U_POINTS_REQUIRED = (upd_U_ROWS+2)*ROW_LENGTH THADV1D.232
START_U_REQUIRED = START_POINT_NO_HALO-ROW_LENGTH THADV1D.233
END_U_REQUIRED = END_U_POINT_NO_HALO+ROW_LENGTH THADV1D.234
THADV1D.235
THADV1D.236
C *IF -DEF,NOWHBR replaced by LWHITBROM logical THADV1D.237
IF (LWHITBROM) THEN THADV1D.238
CL CALCULATE BRSP TERM AT LEVEL K THADV1D.239
THADV1D.240
K=1 THADV1D.241
! Loop over entire field THADV1D.242
DO I=FIRST_VALID_PT,LAST_P_VALID_PT THADV1D.243
BRSP(I,K)=(3.*RS(I,K)+RS(I,K+1))*(RS(I,K)-RS(I,K+1)) THADV1D.244
* *BKH(K+1)*.25*(PSTAR(I)-PSTAR_OLD(I)) THADV1D.245
ENDDO THADV1D.246
K=P_LEVELS THADV1D.247
! Loop over entire field THADV1D.248
DO I=FIRST_VALID_PT,LAST_P_VALID_PT THADV1D.249
BRSP(I,K)=-(3.*RS(I,K)+RS(I,K-1))*(RS(I,K)-RS(I,K-1)) THADV1D.250
* *BKH(K)*.25*(PSTAR(I)-PSTAR_OLD(I)) THADV1D.251
ENDDO THADV1D.252
THADV1D.253
DO K=2,P_LEVELS -1 THADV1D.254
! Loop over entire field THADV1D.255
DO I=FIRST_VALID_PT,LAST_P_VALID_PT THADV1D.256
BRSP(I,K)=((3.*RS(I,K)+RS(I,K+1))*(RS(I,K)-RS(I,K+1))*BKH(K+1) THADV1D.257
* *.25*(PSTAR(I)-PSTAR_OLD(I))) THADV1D.258
* -((3.*RS(I,K)+RS(I,K-1))*(RS(I,K)-RS(I,K-1))*BKH(K) THADV1D.259
* *.25*(PSTAR(I)-PSTAR_OLD(I))) THADV1D.260
ENDDO THADV1D.261
THADV1D.262
ENDDO THADV1D.263
END IF THADV1D.264
C *ENDIF THADV1D.265
THADV1D.266
DO I=FIRST_VALID_PT,LAST_P_VALID_PT THADV1D.267
ZERO(I) = 0. THADV1D.268
ENDDO THADV1D.269
THADV1D.270
! In order to use the same call to adv_p_gd for both the second and THADV1D.271
! fourth order advection, U/V_MEAN are copied into _COPY arrays. THADV1D.272
! In the case of second order advection some of the work space is THADV1D.273
! wasted as there is more halo than we need. THADV1D.274
THADV1D.275
! Calculate the size of the extended arrays which contain an THADV1D.276
! extra halo: THADV1D.277
extended_U_FIELD=(ROW_LENGTH+2*extra_EW_Halo)* THADV1D.278
& (tot_U_ROWS+2*extra_NS_Halo) THADV1D.279
extended_P_FIELD=(ROW_LENGTH+2*extra_EW_Halo)* THADV1D.280
& (tot_P_ROWS+2*extra_NS_Halo) THADV1D.281
THADV1D.282
IF (L_SECOND) THEN THADV1D.283
THADV1D.284
! Copy U/V_MEAN to U/V_MEAN_COPY with the same sized halos THADV1D.285
CALL COPY_FIELD
(U_MEAN,U_MEAN_COPY, THADV1D.286
& U_FIELD,extended_U_FIELD, THADV1D.287
& ROW_LENGTH,tot_U_ROWS,P_LEVELS, THADV1D.288
& EW_Halo,NS_Halo, THADV1D.289
& EW_Halo,NS_Halo, THADV1D.290
& .FALSE.) THADV1D.291
CALL COPY_FIELD
(V_MEAN,V_MEAN_COPY, THADV1D.292
& U_FIELD,extended_U_FIELD, THADV1D.293
& ROW_LENGTH,tot_U_ROWS,P_LEVELS, THADV1D.294
& EW_Halo,NS_Halo, THADV1D.295
& EW_Halo,NS_Halo, THADV1D.296
& .FALSE.) THADV1D.297
THADV1D.298
ELSE ! if its fourth order: THADV1D.299
THADV1D.300
CALL COPY_FIELD
(U_MEAN,U_MEAN_COPY, THADV1D.301
& U_FIELD,extended_U_FIELD, THADV1D.302
& ROW_LENGTH,tot_U_ROWS,P_LEVELS, THADV1D.303
& EW_Halo,NS_Halo, THADV1D.304
& halo_4th,halo_4th, THADV1D.305
& .TRUE.) THADV1D.306
CALL COPY_FIELD
(V_MEAN,V_MEAN_COPY, THADV1D.307
& U_FIELD,extended_U_FIELD, THADV1D.308
& ROW_LENGTH,tot_U_ROWS,P_LEVELS, THADV1D.309
& EW_Halo,NS_Halo, THADV1D.310
& halo_4th,halo_4th, THADV1D.311
& .TRUE.) THADV1D.312
CALL COPY_FIELD
(THETAL,T_COPY, THADV1D.313
& P_FIELD,extended_P_FIELD, THADV1D.314
& ROW_LENGTH,tot_U_ROWS,P_LEVELS, THADV1D.315
& EW_Halo,NS_Halo, THADV1D.316
& halo_4th,halo_4th, THADV1D.317
& .TRUE.) THADV1D.318
THADV1D.319
ENDIF ! IF (L_SECOND) THADV1D.320
THADV1D.321
! For HADCM2, first send (from N.pole) and receive (at S.Pole) the ATJ0F403.90
! requisite N. polar rows of PSTAR and P_EXNER via local arrays, ATJ0F403.91
! but don't bother to call the communications routines if the northern ATJ0F403.92
! and southern polar rows are on the same processor. ATJ0F403.93
! The ids of the corresponding receiving/sending processors are computed ATJ0F403.94
! based on an assumed sequential numbering of PEs as defined in PARVARS. ATJ0F403.95
ATJ0F403.96
! send and receive PSTAR first. ATJ0F403.97
ATJ0F403.98
CALL GC_GSYNC(
nproc,info) ! synchronise all PEs at this point ATJ0F403.99
ATJ0F403.100
IF (at_top_of_LPG) THEN ! This PE is at the N pole ATJ0F403.101
! Send PSTAR N.polar rows to the corresponding S polar PE ATJ0F403.102
DO I=1,ROW_LENGTH ATJ0F403.103
PSTAR_NP(I)=PSTAR(I+TOP_ROW_START-1) GSM1F404.76
END DO ATJ0F403.105
IF (.NOT.at_base_of_LPG) THEN ! only send if not at S pole ATJ0F403.106
CALL GC_RSEND(
4002,ROW_LENGTH, ATJ0F403.107
& (mype+nproc_x*(nproc_y-1)),info, ATJ0F403.108
& PSTAR_NP,PSTAR_NP) ATJ0F403.109
ATJ0F403.110
ENDIF ATJ0F403.111
ENDIF ATJ0F403.112
ATJ0F403.113
CALL GC_GSYNC(
nproc,info) ! synchronise all PEs before receive ATJ0F403.114
ATJ0F403.115
IF (at_base_of_LPG) THEN ATJ0F403.116
! Get PSTAR N.polar rows from the corresponding N polar PE ATJ0F403.117
IF (.NOT.at_top_of_LPG) THEN ATJ0F403.118
ATJ0F403.119
CALL GC_RRECV(
4002,ROW_LENGTH, ATJ0F403.120
& (mype-nproc_x*(nproc_y-1)),info, ATJ0F403.121
& PSTAR_NP,PSTAR_NP) ATJ0F403.122
ATJ0F403.123
ENDIF ATJ0F403.124
ENDIF ATJ0F403.125
ATJ0F403.126
CALL GC_GSYNC(
nproc,info) ! synchronise all PEs at this point ATJ0F403.127
ATJ0F403.128
! now transfer P_EXNER data ATJ0F403.129
ATJ0F403.130
IF (at_top_of_LPG) THEN ! This PE is at the N pole ATJ0F403.131
! Send P_EXNER N.polar rows to the corresponding S polar PE ATJ0F403.132
DO K=1,P_LEVELS+1 ! copy N.pole values of P_EXNER ATJ0F403.133
DO I=1,ROW_LENGTH ATJ0F403.134
P_EXNER_NP(I,K)=P_EXNER(I+TOP_ROW_START-1,K) GSM1F404.77
END DO ATJ0F403.136
END DO ATJ0F403.137
IF (.NOT.at_base_of_LPG) THEN ! only send if not at S pole ATJ0F403.138
CALL GC_RSEND(
4001,(P_LEVELS+1)*ROW_LENGTH, ATJ0F403.139
& (mype+nproc_x*(nproc_y-1)),info, ATJ0F403.140
& P_EXNER_NP,P_EXNER_NP) ATJ0F403.141
ATJ0F403.142
ENDIF ATJ0F403.143
ENDIF ATJ0F403.144
ATJ0F403.145
CALL GC_GSYNC(
nproc,info) ! synchronise all PEs before receive ATJ0F403.146
ATJ0F403.147
IF (at_base_of_LPG) THEN ATJ0F403.148
! Get P_EXNER N.polar rows from the corresponding N polar PE ATJ0F403.149
IF (.NOT.at_top_of_LPG) THEN ATJ0F403.150
CALL GC_RRECV(
4001,(P_LEVELS+1)*ROW_LENGTH, ATJ0F403.151
& (mype-nproc_x*(nproc_y-1)),info, ATJ0F403.152
& P_EXNER_NP,P_EXNER_NP) ATJ0F403.153
ENDIF ATJ0F403.154
ENDIF ATJ0F403.155
ATJ0F403.156
CALL GC_GSYNC(
nproc,info) ! synchronise all PEs after transfer ATJ0F403.157
ATJ0F403.158
CL LOOP OVER P_LEVELS+1. THADV1D.322
CL ON 1 TO P_LEVELS PROVISIONAL VALUES OF THE FIELD ARE CALCULATED. THADV1D.323
CL ON 2 TO P_LEVELS+1 THE FINAL INCREMENTS ARE CALCULATED AND ADDED THADV1D.324
CL ON. THE REASON FOR THIS LOGIC IS THAT THE PROVISIONAL VALUE AT THADV1D.325
CL LEVEL K+1 IS NEEDED BEFORE THE FINAL INCREMENT AT LEVEL K CAN BE THADV1D.326
CL CALCULATED. THADV1D.327
THADV1D.328
DO K=1,P_LEVELS+1 THADV1D.329
CL SET TIMESTEP APPROPRIATE TO LEVEL THADV1D.330
THADV1D.331
TIMESTEP = ADVECTION_TIMESTEP THADV1D.332
CL IF NOT AT P_LEVELS+1 THEN THADV1D.333
IF(K.LE.P_LEVELS) THEN THADV1D.334
THADV1D.335
CL--------------------------------------------------------------------- THADV1D.336
CL SECTION 2. CALCULATE COURANT NUMBER DEPENDENT NU IF IN THADV1D.337
CL FORECAST MODE. THADV1D.338
CL CALCULATE THADV1D.339
CL PROVISIONAL VALUES OF THETAL AT NEW TIME-LEVEL. THADV1D.340
CL--------------------------------------------------------------------- THADV1D.341
THADV1D.342
C --------------------------------------------------------------------- THADV1D.343
CL SECTION 2.1 SET NU TO NU_BASIC DEPENDENT ON MAX COURANT THADV1D.344
CL NUMBER. THADV1D.345
C --------------------------------------------------------------------- THADV1D.346
CL IF NU_BASIC IS ZERO THEN DO NOT BOTHER TO CALCULATE NU THADV1D.347
IF(.NOT.L_SECOND) THEN THADV1D.348
CL CALCULATE COURANT NUMBER THADV1D.349
C NOTE: RS AND TRIG TERMS WILL BE INCLUDED AFTER INTERPOLATION TO P THADV1D.350
C GRID. THADV1D.351
CL CALL UV_TO_P TO MOVE MEAN VELOCITIES ONTO P GRID THADV1D.352
THADV1D.353
CALL UV_TO_P
(U_MEAN(START_U_REQUIRED,K), THADV1D.354
* NUX(START_POINT_NO_HALO,K),U_POINTS_REQUIRED, THADV1D.355
* P_POINTS_UPDATE,ROW_LENGTH,upd_P_ROWS+1) THADV1D.356
THADV1D.357
CALL UV_TO_P
(V_MEAN(START_U_REQUIRED,K), THADV1D.358
* NUY(START_POINT_NO_HALO,K),U_POINTS_REQUIRED, THADV1D.359
* P_POINTS_UPDATE,ROW_LENGTH,upd_P_ROWS+1) THADV1D.360
THADV1D.361
CL CALCULATE NU FROM COURANT NUMBER INCLUDING TRIG AND RS TERMS. THADV1D.362
DO I=START_POINT_NO_HALO,END_P_POINT_NO_HALO THADV1D.363
NUX(I,K) = NUX(I,K)*LONGITUDE_STEP_INVERSE THADV1D.364
NUY(I,K) = NUY(I,K)*LATITUDE_STEP_INVERSE THADV1D.365
SCALAR1 = TIMESTEP/(RS(I,K)* THADV1D.366
* RS(I,K)*(DELTA_AK(K)+DELTA_BK(K)*PSTAR_OLD(I))) THADV1D.367
SCALAR2 = SEC_P_LATITUDE(I)*SCALAR1 THADV1D.368
SCALAR1 = SCALAR1*SCALAR1 THADV1D.369
SCALAR2 = SCALAR2*SCALAR2 THADV1D.370
NUX(I,K) = (1. - NUX(I,K)*NUX(I,K)*SCALAR2)*NU_BASIC THADV1D.371
NUY(I,K) = (1. - NUY(I,K)*NUY(I,K)*SCALAR1)*NU_BASIC THADV1D.372
ENDDO THADV1D.373
THADV1D.374
! Set NUX equal to minimum value along each row THADV1D.375
THADV1D.376
DO J=FIRST_ROW,FIRST_ROW+upd_P_ROWS-1 THADV1D.377
I_start=(J-1)*ROW_LENGTH+FIRST_ROW_PT ! start and end of rpw THADV1D.378
I_end=(J-1)*ROW_LENGTH+LAST_ROW_PT ! missing out halos THADV1D.379
! Calculate minimum along this row THADV1D.380
*IF DEF,CRAY THADV1D.381
IK=ISMIN
(I_end-I_start+1,NUX(I_start,K),1) THADV1D.382
SCALAR1=NUX(IK+I_start-1,K) THADV1D.383
*ELSE THADV1D.384
SCALAR1=NUX(I_start,K) THADV1D.385
DO I=I_start+1,I_end THADV1D.386
IF (NUX(I,K) .LT. SCALAR1) SCALAR1=NUX(I,K) THADV1D.387
ENDDO THADV1D.388
*ENDIF THADV1D.389
NUX_MIN(J-FIRST_ROW+1)=SCALAR1 THADV1D.390
! The indexing of NUX_MIN goes from 1..ROWS THADV1D.391
ENDDO ! J : loop over rows THADV1D.392
THADV1D.393
! So far we have only calculated the minimum along our local THADV1D.394
! part of the row. Now we must find the minimum of all the THADV1D.395
! local minimums along the row THADV1D.396
CALL GCG_RMIN(
upd_P_ROWS,GC_ROW_GROUP,info,NUX_MIN) THADV1D.397
THADV1D.398
! and now set all values of NUX to the minimum along the row THADV1D.399
DO J=FIRST_ROW,FIRST_ROW+upd_P_ROWS-1 THADV1D.400
IF (NUX_MIN(J-FIRST_ROW+1) .LT. 0.0) THADV1D.401
& NUX_MIN(J-FIRST_ROW+1)=0.0 THADV1D.402
THADV1D.403
I_start=(J-1)*ROW_LENGTH+1 ! beginning and THADV1D.404
I_end=J*ROW_LENGTH ! end of row THADV1D.405
THADV1D.406
DO I=I_start,I_end THADV1D.407
NUX(I,K)=NUX_MIN(J-FIRST_ROW+1) THADV1D.408
ENDDO THADV1D.409
THADV1D.410
ENDDO ! J : loop over rows THADV1D.411
THADV1D.412
! Set NUY equal to minimum value along each column THADV1D.413
THADV1D.414
DO J=FIRST_ROW_PT,LAST_ROW_PT GPB5F403.26
I_start=(FIRST_ROW-1)*ROW_LENGTH+J THADV1D.417
! I_start points to the beginning of column J THADV1D.418
THADV1D.419
! Calculate the minimum along this column THADV1D.420
*IF DEF,CRAY THADV1D.421
IK=ISMIN
(upd_P_ROWS,NUY(I_start,K),ROW_LENGTH) THADV1D.422
SCALAR1=NUY((IK-1)*ROW_LENGTH+I_start,K) GPB5F403.27
*ELSE THADV1D.424
I_end=I_start+(upd_P_ROWS-1)*ROW_LENGTH GPB5F403.28
! I_end points to the end of column J THADV1D.426
SCALAR1=NUY(I_start,K) THADV1D.427
DO I=I_start+ROW_LENGTH,I_end,ROW_LENGTH THADV1D.428
IF (NUY(I,K) .LT. SCALAR1) SCALAR1=NUY(I,K) THADV1D.429
ENDDO THADV1D.430
*ENDIF THADV1D.431
NUY_MIN(J)=SCALAR1 THADV1D.432
THADV1D.433
ENDDO ! J : loop over columns THADV1D.434
! Once again, this is only the minimum along our local part THADV1D.435
! of each column. We must now find the miniumum of all the local THADV1D.436
! minimums along the column THADV1D.437
CALL GCG_RMIN(
ROW_LENGTH-2*EW_Halo,GC_COL_GROUP,info, GPB5F403.29
& NUY_MIN(EW_Halo+1)) GPB5F403.30
THADV1D.439
! and now set all values of NUY to the minimum along the column THADV1D.440
DO J=FIRST_ROW_PT,LAST_ROW_PT GPB5F403.31
IF (NUY_MIN(J) .LT. 0.0) NUY_MIN(J)=0.0 THADV1D.443
THADV1D.444
I_start=(FIRST_ROW-1)*ROW_LENGTH+J THADV1D.445
I_end=I_start+(upd_P_ROWS-1)*ROW_LENGTH GPB5F403.32
THADV1D.447
DO I=I_start,I_end,ROW_LENGTH THADV1D.448
NUY(I,K)=NUY_MIN(J) THADV1D.449
ENDDO THADV1D.450
THADV1D.451
ENDDO ! J : loop over columns THADV1D.452
THADV1D.453
ENDIF ! IF its fourth order advection THADV1D.454
THADV1D.455
THADV1D.456
C --------------------------------------------------------------------- THADV1D.457
CL SECTION 2.2 CALL ADV_P_GD TO OBTAIN FIRST INCREMENT DUE TO THADV1D.458
CL ADVECTION. THADV1D.459
C --------------------------------------------------------------------- THADV1D.460
THADV1D.461
CL CALL ADV_P_GD FOR THETAL. THADV1D.462
K1=K+1 THADV1D.463
THADV1D.464
IF(K.EQ.P_LEVELS) THEN THADV1D.465
C PASS ANY THETAL VALUES AS THOSE APPARENTLY AT LEVEL K+1 AS ETADOT THADV1D.466
C IS SET TO ZERO BY USING ARRAY ZERO. THADV1D.467
K1 = K-1 THADV1D.468
THADV1D.469
CALL ADV_P_GD
(THETAL(1,K1),THETAL(1,K),THETAL(1,K1), THADV1D.470
* U_MEAN_COPY(1,K),V_MEAN_COPY(1,K), THADV1D.471
& ETADOT_MEAN(1,K),ZERO,SEC_P_LATITUDE, THADV1D.472
* THETAL_FIRST_INC(1,K),NUX(1,K),NUY(1,K),P_FIELD, THADV1D.473
* U_FIELD,ROW_LENGTH, THADV1D.474
*CALL ARGFLDPT
THADV1D.475
& TIMESTEP,LATITUDE_STEP_INVERSE, THADV1D.476
* LONGITUDE_STEP_INVERSE,SEC_U_LATITUDE, THADV1D.477
* BRSP(1,K),L_SECOND,LWHITBROM, THADV1D.478
& T_COPY(1,K),extended_P_FIELD,extended_U_FIELD, ATJ0F403.159
& extended_address) ATJ0F403.160
ELSE IF(K.EQ.1)THEN THADV1D.480
THADV1D.481
C PASS ANY THETAL VALUES FOR LEVEL K-1 AS ETADOT AT LEVEL 1 THADV1D.482
C IS SET TO ZERO BY USING ARRAY ZERO. THADV1D.483
CALL ADV_P_GD
(THETAL(1,K1),THETAL(1,K),THETAL(1,K1), THADV1D.484
* U_MEAN_COPY(1,K),V_MEAN_COPY(1,K),ZERO, THADV1D.485
* ETADOT_MEAN(1,K1), THADV1D.486
* SEC_P_LATITUDE,THETAL_FIRST_INC(1,K), THADV1D.487
* NUX(1,K),NUY(1,K), THADV1D.488
* P_FIELD,U_FIELD,ROW_LENGTH, THADV1D.489
*CALL ARGFLDPT
THADV1D.490
& TIMESTEP, THADV1D.491
* LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE, THADV1D.492
* SEC_U_LATITUDE,BRSP(1,K),L_SECOND,LWHITBROM, THADV1D.493
& T_COPY(1,K),extended_P_FIELD,extended_U_FIELD, ATJ0F403.161
& extended_address) ATJ0F403.162
ELSE THADV1D.495
CALL ADV_P_GD
(THETAL(1,K-1),THETAL(1,K),THETAL(1,K1), THADV1D.496
* U_MEAN_COPY(1,K),V_MEAN_COPY(1,K), THADV1D.497
& ETADOT_MEAN(1,K),ETADOT_MEAN(1,K1), THADV1D.498
* SEC_P_LATITUDE,THETAL_FIRST_INC(1,K), THADV1D.499
* NUX(1,K),NUY(1,K), THADV1D.500
* P_FIELD,U_FIELD,ROW_LENGTH, THADV1D.501
*CALL ARGFLDPT
THADV1D.502
& TIMESTEP, THADV1D.503
* LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE, THADV1D.504
* SEC_U_LATITUDE,BRSP(1,K),L_SECOND,LWHITBROM, THADV1D.505
& T_COPY(1,K),extended_P_FIELD,extended_U_FIELD, ATJ0F403.163
& extended_address) ATJ0F403.164
THADV1D.507
END IF THADV1D.508
THADV1D.509
THADV1D.510
C --------------------------------------------------------------------- THADV1D.511
CL SECTION 2.3 REMOVE MASS-WEIGHTING FROM INCREMENT AND ADD ONTO THADV1D.512
CL FIELD TO OBTAIN PROVISIONAL VALUE. THADV1D.513
C --------------------------------------------------------------------- THADV1D.514
THADV1D.515
DO I=1,START_POINT_NO_HALO-1 ATJ0F403.165
THETAL_PROV(I,K) = 0.0 ATJ0F403.166
ENDDO ATJ0F403.167
ATJ0F403.168
DO I=START_POINT_NO_HALO,END_P_POINT_NO_HALO THADV1D.516
SCALAR1 = RS(I,K)*RS(I,K) THADV1D.517
* *(DELTA_AK(K)+DELTA_BK(K)*PSTAR_OLD(I)) THADV1D.518
THETAL_FIRST_INC(I,K)=THETAL_FIRST_INC(I,K)/SCALAR1 THADV1D.519
THETAL_PROV(I,K) = THETAL(I,K)- THETAL_FIRST_INC(I,K) THADV1D.520
ENDDO THADV1D.521
THADV1D.522
DO I=END_P_POINT_NO_HALO+1,P_FIELD ATJ0F403.169
THETAL_PROV(I,K) = 0.0 ATJ0F403.170
ENDDO ATJ0F403.171
ATJ0F403.172
*IF DEF,GLOBAL THADV1D.523
CL GLOBAL MODEL CALCULATE PROVISIONAL POLAR VALUE. THADV1D.524
IF (at_top_of_LPG) THEN THADV1D.525
! North Pole THADV1D.526
DO I=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1 THADV1D.527
THETAL_PROV(I,K) = THETAL(I,K) THADV1D.528
THETAL_FIRST_INC(I,K) = -THETAL_FIRST_INC(I,K)/ THADV1D.529
& (RS(I,K)*RS(I,K)* THADV1D.530
& (DELTA_AK(K)+DELTA_BK(K)*PSTAR_OLD(I))) THADV1D.531
ENDDO THADV1D.532
ENDIF THADV1D.533
THADV1D.534
IF (at_base_of_LPG) THEN THADV1D.535
! South Pole THADV1D.536
DO I=P_BOT_ROW_START,P_BOT_ROW_START+ROW_LENGTH-1 THADV1D.537
THETAL_PROV(I,K) = THETAL(I,K) THADV1D.538
THETAL_FIRST_INC(I,K) = -THETAL_FIRST_INC(I,K)/ THADV1D.539
& (RS(I,K)*RS(I,K)* THADV1D.540
& (DELTA_AK(K)+DELTA_BK(K)*PSTAR_OLD(I))) THADV1D.541
ENDDO THADV1D.542
ENDIF THADV1D.543
THADV1D.544
*ELSE THADV1D.545
CL LIMITED AREA MODEL THEN SET PROVISIONAL VALUES ON BOUNDARIES THADV1D.546
CL TO FIELD VALUES AT OLD TIME LEVEL. THADV1D.547
IF (at_top_of_LPG) THEN THADV1D.548
DO I=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1 THADV1D.549
THETAL_PROV(I,K) = THETAL(I,K) THADV1D.550
ENDDO THADV1D.551
ENDIF THADV1D.552
IF (at_base_of_LPG) THEN THADV1D.553
DO I=P_BOT_ROW_START,P_BOT_ROW_START+ROW_LENGTH-1 THADV1D.554
THETAL_PROV(I,K) = THETAL(I,K) THADV1D.555
ENDDO THADV1D.556
ENDIF THADV1D.557
*ENDIF THADV1D.558
END IF THADV1D.559
CL END CONDITIONAL ON LEVEL BEING LESS THAN P_LEVELS+1 THADV1D.560
ENDDO THADV1D.561
THADV1D.562
*IF DEF,GLOBAL THADV1D.563
THADV1D.564
CALL POLAR
(THETAL_PROV,THETAL_FIRST_INC,THETAL_FIRST_INC, THADV1D.565
*CALL ARGFLDPT
THADV1D.566
& P_FIELD,P_FIELD,P_FIELD, THADV1D.567
& TOP_ROW_START,P_BOT_ROW_START, THADV1D.568
& ROW_LENGTH,P_LEVELS) THADV1D.569
*ENDIF THADV1D.570
THADV1D.571
IF (L_SECOND) THEN THADV1D.572
THADV1D.573
! Do a halo update on the THETAL_PROV array THADV1D.574
! that has just been calculated THADV1D.575
CALL SWAPBOUNDS
(THETAL_PROV,ROW_LENGTH,tot_P_ROWS, THADV1D.576
& EW_Halo,NS_Halo,P_LEVELS) THADV1D.577
! CALL SET_SIDES(THETAL_PROV,P_FIELD,ROW_LENGTH,P_LEVELS, THADV1D.578
! & fld_type_p) THADV1D.579
THADV1D.580
ELSE ! fourth order advection THADV1D.581
THADV1D.582
! Copy THETAL_PROV into T_COPY which has double halos for fourth THADV1D.583
! order advection, and do swap to fill these halos THADV1D.584
CALL COPY_FIELD
(THETAL_PROV,T_COPY, THADV1D.585
& P_FIELD,extended_P_FIELD, THADV1D.586
& ROW_LENGTH,tot_P_ROWS,P_LEVELS, THADV1D.587
& EW_Halo,NS_Halo, THADV1D.588
& halo_4th,halo_4th, THADV1D.589
& .TRUE.) THADV1D.590
THADV1D.591
ENDIF THADV1D.592
THADV1D.593
! Set up OMEGA_P array THADV1D.594
! (Was SECTION 3.2): THADV1D.595
! SECTION 3.2 INTERPOLATE OMEGA TO P GRID AND CALCULATE THADV1D.596
! REMAINING TERM IN ADVECTION EQUATION. THADV1D.597
! CALCULATE TOTAL MASS-WEIGHTED INCREMENT TO FIELD. THADV1D.598
THADV1D.599
DO K1=1,P_LEVELS THADV1D.600
CALL UV_TO_P
(OMEGA(START_U_REQUIRED,K1), THADV1D.601
& OMEGA_P(START_POINT_NO_HALO,K1), THADV1D.602
& U_POINTS_REQUIRED, THADV1D.603
& P_POINTS_UPDATE,ROW_LENGTH,upd_P_ROWS+1) THADV1D.604
*IF DEF,GLOBAL THADV1D.605
IF (at_top_of_LPG) THEN THADV1D.606
DO I=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1 THADV1D.607
OMEGA_P(I,K1)=0. THADV1D.608
ENDDO THADV1D.609
ENDIF THADV1D.610
THADV1D.611
IF (at_base_of_LPG) THEN THADV1D.612
DO I=P_BOT_ROW_START,P_BOT_ROW_START+ROW_LENGTH-1 THADV1D.613
OMEGA_P(I,K1)=0. THADV1D.614
ENDDO THADV1D.615
ENDIF THADV1D.616
*ENDIF THADV1D.617
ENDDO THADV1D.618
*IF DEF,GLOBAL THADV1D.619
THADV1D.620
CALL POLAR
(OMEGA_P,OMEGA_P,OMEGA_P, THADV1D.621
*CALL ARGFLDPT
THADV1D.622
& P_FIELD,P_FIELD,P_FIELD, THADV1D.623
& START_POINT_NO_HALO, THADV1D.624
& END_P_POINT_NO_HALO-ROW_LENGTH+1, THADV1D.625
& ROW_LENGTH,P_LEVELS) THADV1D.626
*ENDIF THADV1D.627
THADV1D.628
CL BEGIN CONDITIONAL ON LEVEL BEING GREATER THAN 1 THADV1D.629
THADV1D.630
DO K=1,P_LEVELS+1 THADV1D.631
IF(K.GT.1) THEN THADV1D.632
CL--------------------------------------------------------------------- THADV1D.633
CL SECTION 3. ALL WORK IN THIS SECTION PERFORMED AT LEVEL-1. THADV1D.634
CL CALCULATE SECOND INCREMENT DUE TO ADVECTION. THADV1D.635
CL CALCULATE TOTAL INCREMENT TO FIELD AND FILTER THADV1D.636
CL WHERE NECESSARY THEN UPDATE FIELD. THADV1D.637
CL THE POLAR INCREMENTS ARE THEN CALCULATED AND ADDED THADV1D.638
CL ON BY CALLING POLAR. THADV1D.639
CL--------------------------------------------------------------------- THADV1D.640
THADV1D.641
TIMESTEP = ADVECTION_TIMESTEP THADV1D.642
THADV1D.643
CONST1 = R/(CP*CP)*TIMESTEP THADV1D.644
C --------------------------------------------------------------------- THADV1D.645
CL SECTION 3.1 CALL ADV_P_GD TO OBTAIN SECOND INCREMENT DUE TO THADV1D.646
CL ADVECTION. THADV1D.647
C --------------------------------------------------------------------- THADV1D.648
THADV1D.649
CL CALL ADV_P_GD FOR THETAL. THADV1D.650
K1=K-1 THADV1D.651
C K1 HOLDS K-1. THADV1D.652
IF(K.GT.P_LEVELS) THEN THADV1D.653
C THE ZERO VERTICAL FLUX AT THE TOP IS ENSURED BY PASSING ETADOT AS THADV1D.654
C ZERO. THADV1D.655
THADV1D.656
CALL ADV_P_GD
(THETAL_PROV(1,K-2),THETAL_PROV(1,K-1), THADV1D.657
* THETAL_PROV(1,K-2), THADV1D.658
* U_MEAN_COPY(1,K1),V_MEAN_COPY(1,K1), THADV1D.659
& ETADOT_MEAN(1,K-1),ZERO,SEC_P_LATITUDE, THADV1D.660
* THETAL_SECOND_INC,NUX(1,K-1),NUY(1,K-1),P_FIELD, THADV1D.661
* U_FIELD,ROW_LENGTH, THADV1D.662
*CALL ARGFLDPT
THADV1D.663
& TIMESTEP,LATITUDE_STEP_INVERSE, THADV1D.664
* LONGITUDE_STEP_INVERSE,SEC_U_LATITUDE, THADV1D.665
* BRSP(1,K-1),L_SECOND,LWHITBROM, THADV1D.666
& T_COPY(1,K-1),extended_P_FIELD,extended_U_FIELD, ATJ0F403.173
& extended_address) ATJ0F403.174
THADV1D.668
ELSE IF(K.EQ.2) THEN THADV1D.669
C THE ZERO VERTICAL FLUX AT THE BOTTOM IS ENSURED BY PASSING ETADOT AS THADV1D.670
C ZERO. THADV1D.671
CALL ADV_P_GD
(THETAL_PROV(1,K),THETAL_PROV(1,K-1), THADV1D.672
* THETAL_PROV(1,K), THADV1D.673
* U_MEAN_COPY(1,K1),V_MEAN_COPY(1,K1),ZERO, THADV1D.674
* ETADOT_MEAN(1,K), THADV1D.675
* SEC_P_LATITUDE,THETAL_SECOND_INC, THADV1D.676
* NUX(1,K-1),NUY(1,K-1), THADV1D.677
* P_FIELD,U_FIELD,ROW_LENGTH, THADV1D.678
*CALL ARGFLDPT
THADV1D.679
& TIMESTEP, THADV1D.680
* LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE, THADV1D.681
* SEC_U_LATITUDE, THADV1D.682
* BRSP(1,K-1),L_SECOND,LWHITBROM, THADV1D.683
& T_COPY(1,K-1),extended_P_FIELD,extended_U_FIELD, ATJ0F403.175
& extended_address) ATJ0F403.176
ELSE THADV1D.685
THADV1D.686
CALL ADV_P_GD
(THETAL_PROV(1,K-2),THETAL_PROV(1,K-1), THADV1D.687
* THETAL_PROV(1,K), THADV1D.688
* U_MEAN_COPY(1,K1),V_MEAN_COPY(1,K1), THADV1D.689
& ETADOT_MEAN(1,K-1),ETADOT_MEAN(1,K), THADV1D.690
* SEC_P_LATITUDE,THETAL_SECOND_INC, THADV1D.691
* NUX(1,K-1),NUY(1,K-1), THADV1D.692
* P_FIELD,U_FIELD,ROW_LENGTH, THADV1D.693
*CALL ARGFLDPT
THADV1D.694
& TIMESTEP, THADV1D.695
* LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE, THADV1D.696
* SEC_U_LATITUDE, THADV1D.697
* BRSP(1,K-1),L_SECOND,LWHITBROM, THADV1D.698
& T_COPY(1,K-1),extended_P_FIELD,extended_U_FIELD, ATJ0F403.177
& extended_address) ATJ0F403.178
END IF THADV1D.700
THADV1D.701
THADV1D.702
C TOTAL MASS-WEIGHTED HORIZONTAL AND VERTICAL INCREMENTS ARE CALCULATED THADV1D.703
C SEPARATELY. THADV1D.704
THADV1D.705
IF(K.LT.Q_LEVELS+2) THEN THADV1D.706
DO I=START_POINT_NO_HALO,END_P_POINT_NO_HALO THADV1D.707
THADV1D.708
PK = AKH(K) + BKH(K) *PSTAR(I) THADV1D.709
PK1 = AKH(K1) + BKH(K1)*PSTAR(I) ! K1 = K-1 THADV1D.710
P_EXNER_FULL = P_EXNER_C THADV1D.711
* (P_EXNER(I,K),P_EXNER(I,K1),PK,PK1,KAPPA) THADV1D.712
THADV1D.713
THETAL_INCREMENT(I,K1) = .5*(THETAL_SECOND_INC(I) + THADV1D.714
* THETAL_FIRST_INC(I,K-1)*RS(I,K1)*RS(I,K1) THADV1D.715
* *(DELTA_AK(K1)+DELTA_BK(K1)*PSTAR(I))) THADV1D.716
* -(LC*QCL(I,K1)+LC_LF*QCF(I,K1))*CONST1* THADV1D.717
& OMEGA_P(I,K1)/((AK(K1)+BK(K1)*PSTAR(I)) THADV1D.718
* *(P_EXNER_FULL)) THADV1D.719
THADV1D.720
ENDDO THADV1D.721
ELSE THADV1D.722
DO I=START_POINT_NO_HALO,END_P_POINT_NO_HALO THADV1D.723
THETAL_INCREMENT(I,K1) = .5*(THETAL_SECOND_INC(I) + THADV1D.724
* THETAL_FIRST_INC(I,K-1)*RS(I,K1)*RS(I,K1) THADV1D.725
* *(DELTA_AK(K1)+DELTA_BK(K1)*PSTAR(I))) THADV1D.726
ENDDO THADV1D.727
END IF THADV1D.728
THADV1D.729
C --------------------------------------------------------------------- THADV1D.730
CL SECTION 3.3 IF GLOBAL MODEL CALCULATE POLAR INCREMENTS. THADV1D.731
CL IF LIMITED AREA MASS-WEIGHT BOUNDARIES. THADV1D.732
C --------------------------------------------------------------------- THADV1D.733
THADV1D.734
CL GLOBAL MODEL CALCULATE POLAR INCREMENT. THADV1D.735
CL CALCULATE MERIDIONAL FLUX AROUND POLES BY ADDING THE TWO THADV1D.736
CL INCREMENTS AND ALSO MASS-WEIGHTING POLAR FIELDS. THADV1D.737
C NEGATIVE SIGN BEFORE FIRST INCS IS DUE TO THEIR SIGN HAVING BEEN THADV1D.738
C CHANGED PRIOR TO THE CALCULATION OF THE INTERMEDIATE VALUE. THADV1D.739
IF (at_top_of_LPG) THEN THADV1D.740
! Northern boundary/pole THADV1D.741
IF (K.LT.Q_LEVELS+2) THEN THADV1D.742
DO I=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1 THADV1D.743
SCALAR1 = RS(I,K1)*RS(I,K1)* THADV1D.744
& (DELTA_AK(K1)+DELTA_BK(K1)*PSTAR(I)) THADV1D.745
*IF DEF,GLOBAL THADV1D.746
PK = AKH(K) + BKH(K) *PSTAR(I) THADV1D.747
PK1 = AKH(K1) + BKH(K1)*PSTAR(I) ! K1 = K-1 THADV1D.748
P_EXNER_FULL = P_EXNER_C(P_EXNER(I,K), THADV1D.749
& P_EXNER(I,K1),PK,PK1,KAPPA) THADV1D.750
THADV1D.751
THETAL_INCREMENT(I,K1) = -.5*(THETAL_SECOND_INC(I) THADV1D.752
& - THETAL_FIRST_INC(I,K-1)*SCALAR1) THADV1D.753
& +(LC*QCL(I,K1)+LC_LF*QCF(I,K1))*CONST1* THADV1D.754
& OMEGA_P(I,K1)/((AK(K1)+BK(K1)*PSTAR(I)) THADV1D.755
& *P_EXNER_FULL) THADV1D.756
*ENDIF THADV1D.757
THETAL(I,K1) = THETAL(I,K1)*SCALAR1 THADV1D.758
ENDDO THADV1D.759
ELSE ! (IF K.GE.Q_LEVELS+2) THADV1D.760
DO I=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1 THADV1D.761
SCALAR1 = RS(I,K1)*RS(I,K1)* THADV1D.762
& (DELTA_AK(K1)+DELTA_BK(K1)*PSTAR(I)) THADV1D.763
*IF DEF,GLOBAL THADV1D.764
THETAL_INCREMENT(I,K1) = -.5*(THETAL_SECOND_INC(I) THADV1D.765
& - THETAL_FIRST_INC(I,K-1)*SCALAR1) THADV1D.766
*ENDIF THADV1D.767
THETAL(I,K1) = THETAL(I,K1)*SCALAR1 THADV1D.768
ENDDO THADV1D.769
ENDIF ! (K.LT.Q_LEVELS+2) THADV1D.770
ENDIF ! (attop) THADV1D.771
THADV1D.772
IF (at_base_of_LPG) THEN THADV1D.773
! Southern boundary/pole THADV1D.774
IF (K.LT.Q_LEVELS+2) THEN THADV1D.775
DO I=P_BOT_ROW_START,P_BOT_ROW_START+ROW_LENGTH-1 THADV1D.776
SCALAR2 = RS(I,K1)*RS(I,K1)* THADV1D.777
& (DELTA_AK(K1)+DELTA_BK(K1)*PSTAR(I)) THADV1D.778
*IF DEF,GLOBAL THADV1D.779
! Reintroduce error in indexing at S.Pole, to get N.Polar PSTAR and THADV1D.780
! P_EXNER -- this involves additional non-local data fetches. THADV1D.781
THADV1D.782
! Old PK = AKH(K) + BKH(K) *PSTAR(I) THADV1D.783
! Old PK1 = AKH(K1) + BKH(K1)*PSTAR(I) ! K1 = K-1 THADV1D.784
! Old P_EXNER_FULL = P_EXNER_C(P_EXNER(I,K), THADV1D.785
! Old & P_EXNER(I,K1),PK,PK1,KAPPA) THADV1D.786
THADV1D.787
! New (HADCM2 uses received N Polar row values sent earlier) ATJ0F403.179
PK = AKH(K) + BKH(K) *PSTAR_NP(I-P_BOT_ROW_START+1) ATJ0F403.180
PK1 = AKH(K1) + BKH(K1)*PSTAR_NP(I-P_BOT_ROW_START+1) ATJ0F403.181
P_EXNER_FULL = P_EXNER_C( THADV1D.791
& P_EXNER_NP(I-P_BOT_ROW_START+1,K), ATJ0F403.182
& P_EXNER_NP(I-P_BOT_ROW_START+1,K1), ATJ0F403.183
& PK,PK1,KAPPA) THADV1D.794
THADV1D.795
! End New (with HADCM2 error in indexing) ATJ0F403.184
THADV1D.800
THETAL_INCREMENT(I,K1) = -.5*(THETAL_SECOND_INC(I) THADV1D.801
& - THETAL_FIRST_INC(I,K-1)*SCALAR2) THADV1D.802
& +(LC*QCL(I,K1)+LC_LF*QCF(I,K1))*CONST1* THADV1D.803
& OMEGA_P(I,K1)/((AK(K1)+BK(K1)*PSTAR(I)) THADV1D.804
& *P_EXNER_FULL) THADV1D.805
*ENDIF THADV1D.806
THETAL(I,K1) = THETAL(I,K1)*SCALAR2 THADV1D.807
ENDDO THADV1D.808
ELSE ! (IF K.GE.Q_LEVELS+2) THADV1D.809
DO I=P_BOT_ROW_START,P_BOT_ROW_START+ROW_LENGTH-1 THADV1D.810
SCALAR2 = RS(I,K1)*RS(I,K1)* THADV1D.811
& (DELTA_AK(K1)+DELTA_BK(K1)*PSTAR(I)) THADV1D.812
THETAL(I,K1) = THETAL(I,K1)*SCALAR2 THADV1D.813
*IF DEF,GLOBAL THADV1D.814
THETAL_INCREMENT(I,K1) = -.5*(THETAL_SECOND_INC(I) THADV1D.815
& - THETAL_FIRST_INC(I,K-1)*SCALAR2) THADV1D.816
*ENDIF THADV1D.817
ENDDO THADV1D.818
ENDIF ! (K.LT.Q_LEVELS+2) THADV1D.819
ENDIF ! (atbase) THADV1D.820
THADV1D.821
CL END CONDITIONAL LEVEL GREATER THAN ONE THADV1D.822
END IF THADV1D.823
THADV1D.824
CL END LOOP OVER P_LEVELS+1 THADV1D.825
enddo THADV1D.826
THADV1D.827
CL--------------------------------------------------------------------- THADV1D.828
CL SECTION 4 IF GLOBAL MODEL THEN FILTER INCREMENTS AND THADV1D.829
CL UPDATE POLAR VALUES BY CALLING POLAR. THADV1D.830
CL UPDATE ALL OTHER VALUES. THADV1D.831
CL--------------------------------------------------------------------- THADV1D.832
THADV1D.833
*IF DEF,GLOBAL THADV1D.834
THADV1D.835
C --------------------------------------------------------------------- THADV1D.836
CL SECTION 4.1 CALL FILTER TO DO FILTERING. THADV1D.837
C --------------------------------------------------------------------- THADV1D.838
THADV1D.839
C SET FILTER_SPACE WHICH IS ROW_LENGTH+2 TIMES THE NUMBER OF ROWS TO THADV1D.840
C BE FILTERED. THADV1D.841
THADV1D.842
FILTER_SPACE = (ROW_LENGTH+2)*(NORTHERN_FILTERED_P_ROW-1+ THADV1D.843
* tot_P_ROWS-SOUTHERN_FILTERED_P_ROW) THADV1D.844
CL CALL FILTER FOR THETAL INCREMENTS THADV1D.845
THADV1D.846
CALL FILTER
(THETAL_INCREMENT,P_FIELD,P_LEVELS, THADV1D.847
& FILTER_SPACE,ROW_LENGTH, THADV1D.848
*CALL ARGFLDPT
THADV1D.849
& FILTER_WAVE_NUMBER_P_ROWS,TRIGS,IFAX, THADV1D.850
* NORTHERN_FILTERED_P_ROW,SOUTHERN_FILTERED_P_ROW) THADV1D.851
THADV1D.852
C --------------------------------------------------------------------- THADV1D.853
CL SECTION 4.2 CALL POLAR TO UPDATE POLAR VALUES THADV1D.854
C --------------------------------------------------------------------- THADV1D.855
THADV1D.856
CALL POLAR
(THETAL,THETAL_INCREMENT,THETAL_INCREMENT, THADV1D.857
*CALL ARGFLDPT
THADV1D.858
& P_FIELD,P_FIELD,P_FIELD, THADV1D.859
& TOP_ROW_START,P_BOT_ROW_START, THADV1D.860
& ROW_LENGTH,P_LEVELS) THADV1D.861
THADV1D.862
*ENDIF THADV1D.863
C --------------------------------------------------------------------- THADV1D.864
CL SECTION 4.3 UPDATE ALL OTHER POINTS. THADV1D.865
C OUTPUT IS MASS-WEIGHTED. THADV1D.866
C INCREMENTS ARE ALREADY MASS-WEIGHTED THADV1D.867
C --------------------------------------------------------------------- THADV1D.868
THADV1D.869
DO K=1,P_LEVELS THADV1D.870
C UPDATE THETAL. THADV1D.871
CFPP$ SELECT(CONCUR) THADV1D.872
DO I= START_POINT_NO_HALO,END_P_POINT_NO_HALO THADV1D.873
THETAL(I,K)=THETAL(I,K)*RS(I,K)*RS(I,K)* THADV1D.874
& (DELTA_AK(K)+DELTA_BK(K)*PSTAR(I))-THETAL_INCREMENT(I,K) THADV1D.875
ENDDO THADV1D.876
ENDDO THADV1D.877
THADV1D.878
CL END OF ROUTINE TH_ADV THADV1D.879
THADV1D.880
RETURN THADV1D.881
END THADV1D.882
*ENDIF THADV1D.883