*IF DEF,A13_1C THQDIF1C.2
C ******************************COPYRIGHT****************************** THQDIF1C.3
C (c) CROWN COPYRIGHT 1997, METEOROLOGICAL OFFICE, All Rights Reserved. THQDIF1C.4
C THQDIF1C.5
C Use, duplication or disclosure of this code is subject to the THQDIF1C.6
C restrictions as set forth in the contract. THQDIF1C.7
C THQDIF1C.8
C Meteorological Office THQDIF1C.9
C London Road THQDIF1C.10
C BRACKNELL THQDIF1C.11
C Berkshire UK THQDIF1C.12
C RG12 2SZ THQDIF1C.13
C THQDIF1C.14
C If no contract has been raised with this copy of the code, the use, THQDIF1C.15
C duplication or disclosure of it is strictly prohibited. Permission THQDIF1C.16
C to do so must first be obtained in writing from the Head of Numerical THQDIF1C.17
C Modelling at the above address. THQDIF1C.18
C ******************************COPYRIGHT****************************** THQDIF1C.19
C THQDIF1C.20
CLL SUBROUTINE TH_Q_DIF ----------------------------------------- THQDIF1C.21
CLL THQDIF1C.22
CLL PURPOSE: CALCULATES DIFFUSION INCREMENTS FOR THETAL OR QT THQDIF1C.23
CLL IF STEEP SLOPE THEN EFFECTIVE DIFFUSION IS ZERO. THQDIF1C.24
CLL THQDIF1C.25
CLL NOT SUITABLE FOR SINGLE COLUMN USE. THQDIF1C.26
CLL THQDIF1C.27
CLL WAS VERSION FOR CRAY Y-MP THQDIF1C.28
CLL THQDIF1C.29
CLL MM, TJ <- PROGRAMMER OF SOME OR ALL OF PREVIOUS CODE OR CHANGES THQDIF1C.30
CLL THQDIF1C.31
CLL MODEL MODIFICATION HISTORY: THQDIF1C.32
CLL VERSION DATE THQDIF1C.33
!LL 4.4 11/08/97 New version optimised for T3E. THQDIF1C.34
!LL Not bit-reproducible with THQDIF1A. THQDIF1C.35
! 4.4 17/07/97 SCALAR calculated using SEC_P_LATITUDE at both THQDIF1C.36
! poles for non MPP code to enable bit comparison THQDIF1C.37
! with MPP code. I Edmond THQDIF1C.38
CLL 4.4 25/07/97 Calling sequence changed from once per diffusion THQDIF1C.39
CLL sweep per level to once per dynamics sweep, in THQDIF1C.40
CLL order to improve MPP scalability. THQDIF1C.41
CLL A. Dickinson THQDIF1C.42
CLL THQDIF1C.43
CLL THQDIF1C.44
CLL PROGRAMMING STANDARD: THQDIF1C.45
CLL THQDIF1C.46
CLL SYSTEM COMPONENTS COVERED: P131 THQDIF1C.47
CLL THQDIF1C.48
CLL SYSTEM TASK: P1 THQDIF1C.49
CLL THQDIF1C.50
CLL DOCUMENTATION: THE EQUATION USED IS (47) THQDIF1C.51
CLL IN UNIFIED MODEL DOCUMENTATION PAPER THQDIF1C.52
CLL NO. 10 M.J.P. CULLEN,T.DAVIES AND M.H.MAWSON THQDIF1C.53
CLL VERSION 16, DATED 09/01/91. THQDIF1C.54
CLLEND------------------------------------------------------------- THQDIF1C.55
THQDIF1C.56
C*L ARGUMENTS:--------------------------------------------------- THQDIF1C.57
SUBROUTINE TH_Q_DIF 4,5THQDIF1C.58
1 (TH_Q,RECIP_RS_SQUARED_DELTAP, THQDIF1C.59
2 SEC_P_LATITUDE,ROW_LENGTH, THQDIF1C.60
*CALL ARGFLDPT
THQDIF1C.61
5 LEVEL_BASE,LEVELS, THQDIF1C.62
6 KEXP_K1,ADVECTION_TIMESTEP, THQDIF1C.63
4 P_FIELD,U_FIELD, THQDIF1C.64
5 DIFFUSION_EW,DIFFUSION_NS) THQDIF1C.65
THQDIF1C.66
THQDIF1C.67
IMPLICIT NONE THQDIF1C.68
THQDIF1C.69
INTEGER THQDIF1C.70
* U_FIELD !IN DIMENSION OF FIELDS ON VELOCITY GRID THQDIF1C.71
*, P_FIELD !IN DIMENSION OF FIELDS ON PRESSURE GRID THQDIF1C.72
*, ROW_LENGTH !IN NUMBER OF POINTS PER ROW THQDIF1C.73
*, LEVELS !IN NUMBER OF LEVELS THQDIF1C.74
*, LEVEL_BASE !IN BOTTOM LEVEL AT WHICH DIFFUSION APPLIES THQDIF1C.75
*, KEXP_K1(LEVELS) !IN ORDER OF DIFFUSION THQDIF1C.76
THQDIF1C.77
! All TYPFLDPT arguments are intent IN THQDIF1C.78
*CALL TYPFLDPT
THQDIF1C.79
THQDIF1C.80
REAL THQDIF1C.81
* TH_Q(P_FIELD,LEVELS) !IN. THETAL OR QT FIELD. THQDIF1C.82
*, RECIP_RS_SQUARED_DELTAP(P_FIELD,LEVELS) !IN 1/RS**2*DELTAP THQDIF1C.83
*,ADVECTION_TIMESTEP !IN THQDIF1C.84
THQDIF1C.85
REAL THQDIF1C.86
* DIFFUSION_EW(P_FIELD,LEVELS) !IN EAST-WEST EFFECTIVE DIFFUSION THQDIF1C.87
*,DIFFUSION_NS(P_FIELD,LEVELS) !IN NORTH-SOUTH EFFECTIVE DIFFUSION THQDIF1C.88
*,SEC_P_LATITUDE(P_FIELD) !IN 1/COS(LAT) AT P POINTS THQDIF1C.89
THQDIF1C.90
C*--------------------------------------------------------------------- THQDIF1C.91
THQDIF1C.92
C*L DEFINE ARRAYS AND VARIABLES USED IN THIS ROUTINE----------------- THQDIF1C.93
C DEFINE LOCAL ARRAYS: 5 ARE REQUIRED THQDIF1C.94
THQDIF1C.95
REAL THQDIF1C.96
* FIELD1(P_FIELD) ! GENERAL WORKSPACE THQDIF1C.97
*,FIELD2(P_FIELD) ! GENERAL WORKSPACE THQDIF1C.98
*,FIELD3(P_FIELD) ! GENERAL WORKSPACE THQDIF1C.99
*,FIELD(P_FIELD) ! GENERAL WORKSPACE THQDIF1C.100
*,FIELD_INC(P_FIELD) ! GENERAL WORKSPACE THQDIF1C.101
*,NP_FLUX(ROW_LENGTH) ! HOLDS NORTH POLAR FLUX THQDIF1C.102
*,SP_FLUX(ROW_LENGTH) ! HOLDS SOUTH POLAR FLUX THQDIF1C.103
C*--------------------------------------------------------------------- THQDIF1C.104
C DEFINE LOCAL VARIABLES THQDIF1C.105
THQDIF1C.106
C LOCAL REALS. THQDIF1C.107
REAL THQDIF1C.108
* SCALAR THQDIF1C.109
C COUNT VARIABLES FOR DO LOOPS ETC. THQDIF1C.110
INTEGER THQDIF1C.111
* I,J,IJ,K,JJ THQDIF1C.112
THQDIF1C.113
C*L EXTERNAL SUBROUTINE CALLS:--------------------------------------- THQDIF1C.114
EXTERNAL THQDIF1C.115
* POLAR THQDIF1C.116
C*--------------------------------------------------------------------- THQDIF1C.117
CL MAXIMUM VECTOR LENGTH ASSUMED IS END_P_UPDATE-START_P_UPDATE+1 THQDIF1C.118
CL--------------------------------------------------------------------- THQDIF1C.119
CL INTERNAL STRUCTURE. THQDIF1C.120
CL--------------------------------------------------------------------- THQDIF1C.121
CL THQDIF1C.122
THQDIF1C.123
DO K=LEVEL_BASE,LEVELS THQDIF1C.124
THQDIF1C.125
DO I=FIRST_VALID_PT,LAST_P_VALID_PT THQDIF1C.126
FIELD(I) = TH_Q(I,K) THQDIF1C.127
END DO THQDIF1C.128
THQDIF1C.129
C LOOP THROUGH CODE KEXP_K1 TIMES. THE ORDER OF THE DIFFUSION SCHEME IS THQDIF1C.130
C DEL TO THE POWER 2*KEXP_K1. THQDIF1C.131
DO JJ=1,KEXP_K1(K) THQDIF1C.132
THQDIF1C.133
*IF -DEF,GLOBAL THQDIF1C.134
CL ZERO INCREMENTS FOR FIRST AND LAST ROW THQDIF1C.135
CL OVERWRITTEN BY POLAR IN GLOBAL MODELS THQDIF1C.136
*IF DEF,MPP THQDIF1C.137
IF (at_top_of_LPG) THEN THQDIF1C.138
*ENDIF THQDIF1C.139
DO I=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1 THQDIF1C.140
FIELD_INC(I)=0.0 THQDIF1C.141
ENDDO THQDIF1C.142
*IF DEF,MPP THQDIF1C.143
ENDIF THQDIF1C.144
IF (at_base_of_LPG) THEN THQDIF1C.145
*ENDIF THQDIF1C.146
DO I=P_BOT_ROW_START,P_BOT_ROW_START+ROW_LENGTH-1 THQDIF1C.147
FIELD_INC(I)=0.0 THQDIF1C.148
ENDDO THQDIF1C.149
*IF DEF,MPP THQDIF1C.150
ENDIF THQDIF1C.151
*ENDIF THQDIF1C.152
*ENDIF THQDIF1C.153
THQDIF1C.154
THQDIF1C.155
CL--------------------------------------------------------------------- THQDIF1C.156
CL SECTION 1. DELTA LAMBDA TERMS THQDIF1C.157
CL--------------------------------------------------------------------- THQDIF1C.158
C---------------------------------------------------------------------- THQDIF1C.159
CL SECTION 1.1 CALCULATE DELTAPHILAMBDA*1/(DELTALAMBDA)SQUARED THQDIF1C.160
C---------------------------------------------------------------------- THQDIF1C.161
THQDIF1C.162
THQDIF1C.163
DO I=START_POINT_NO_HALO,END_P_POINT_NO_HALO-1 THQDIF1C.164
FIELD1(I)=FIELD(I+1)-FIELD(I) THQDIF1C.165
END DO THQDIF1C.166
THQDIF1C.167
THQDIF1C.168
*IF -DEF,MPP THQDIF1C.169
C RECALCULATE END-POINTS THQDIF1C.170
THQDIF1C.171
DO I=START_POINT_NO_HALO-1,END_P_POINT_NO_HALO,ROW_LENGTH THQDIF1C.172
IJ=I-ROW_LENGTH+1 THQDIF1C.173
FIELD1(I)=FIELD(IJ)-FIELD(I) THQDIF1C.174
END DO THQDIF1C.175
*ELSE THQDIF1C.176
! Set last point of field THQDIF1C.177
FIELD1(END_P_POINT_NO_HALO)=FIELD1(END_P_POINT_NO_HALO-1) THQDIF1C.178
*ENDIF THQDIF1C.179
THQDIF1C.180
C---------------------------------------------------------------------- THQDIF1C.181
CL SECTION 1.2 CALCULATE DELTA LAMBDA TERM THQDIF1C.182
C---------------------------------------------------------------------- THQDIF1C.183
THQDIF1C.184
DO I= START_POINT_NO_HALO+1,END_P_POINT_NO_HALO THQDIF1C.185
FIELD2(I)=(DIFFUSION_EW(I,K)*FIELD1(I)- THQDIF1C.186
& DIFFUSION_EW(I-1,K)*FIELD1(I-1))* THQDIF1C.187
& SEC_P_LATITUDE(I) THQDIF1C.188
END DO THQDIF1C.189
THQDIF1C.190
THQDIF1C.191
*IF -DEF,MPP THQDIF1C.192
C RECALCULATE END-POINTS THQDIF1C.193
DO I= START_POINT_NO_HALO,END_P_POINT_NO_HALO,ROW_LENGTH THQDIF1C.194
IJ=I+ROW_LENGTH-1 THQDIF1C.195
FIELD2(I)=(DIFFUSION_EW(I,K)*FIELD1(I)- THQDIF1C.196
& DIFFUSION_EW(IJ,K)*FIELD1(IJ))* THQDIF1C.197
& SEC_P_LATITUDE(I) THQDIF1C.198
END DO THQDIF1C.199
*ELSE THQDIF1C.200
FIELD2(START_POINT_NO_HALO)=FIELD2(START_POINT_NO_HALO+1) THQDIF1C.201
*ENDIF THQDIF1C.202
THQDIF1C.203
C---------------------------------------------------------------------- THQDIF1C.204
CL SECTION 2 CALCULATE PHI DIRECTION TERM AND ADD THQDIF1C.205
CL ONTO FIRST TERM TO GET TOTAL CORRECTION. THQDIF1C.206
C---------------------------------------------------------------------- THQDIF1C.207
THQDIF1C.208
C CALCULATE DELTA PHI TERMS THQDIF1C.209
THQDIF1C.210
DO I=START_POINT_NO_HALO-ROW_LENGTH,END_P_POINT_NO_HALO THQDIF1C.211
FIELD1(I)=FIELD(I)-FIELD(I+ROW_LENGTH) THQDIF1C.212
END DO THQDIF1C.213
THQDIF1C.214
C---------------------------------------------------------------------- THQDIF1C.215
CL SECTION 2.3 CALCULATE DELTAPHI TERM AND ADD ONTO DELTALAMBDA TERM THQDIF1C.216
C---------------------------------------------------------------------- THQDIF1C.217
cdir$ nosplit THQDIF1C.218
DO I=START_POINT_NO_HALO,END_P_POINT_NO_HALO THQDIF1C.219
FIELD_INC(I)= (FIELD2(I)+ THQDIF1C.220
& DIFFUSION_NS(I-ROW_LENGTH,K)*FIELD1(I-ROW_LENGTH)- THQDIF1C.221
& DIFFUSION_NS(I,K)*FIELD1(I))*SEC_P_LATITUDE(I) THQDIF1C.222
END DO THQDIF1C.223
THQDIF1C.224
C---------------------------------------------------------------------- THQDIF1C.225
CL SECTION 3 CALCULATE DIFFUSION AT POLES THQDIF1C.226
C---------------------------------------------------------------------- THQDIF1C.227
THQDIF1C.228
*IF DEF,GLOBAL THQDIF1C.229
THQDIF1C.230
C GLOBAL MODEL CALCULATES POLAR DEL-SQUARED USING ACROSS-POLE DIFFERENCE THQDIF1C.231
C ASSUMING FLUX=0 AT HALF-GRID-LENGTH ON OTHER SIDE OF POLE THQDIF1C.232
THQDIF1C.233
THQDIF1C.234
SCALAR=SEC_P_LATITUDE(TOP_ROW_START) THQDIF1C.235
THQDIF1C.236
! Do North Pole THQDIF1C.237
*IF DEF,MPP THQDIF1C.238
IF (at_top_of_LPG) THEN THQDIF1C.239
*ENDIF THQDIF1C.240
DO I=1,ROW_LENGTH THQDIF1C.241
J=TOP_ROW_START+I-1 THQDIF1C.242
FIELD3(J)=-DIFFUSION_NS(J,K)*FIELD1(J)*SCALAR THQDIF1C.243
NP_FLUX(I)=FIELD3(J) THQDIF1C.244
FIELD_INC(J)=0.0 THQDIF1C.245
ENDDO THQDIF1C.246
*IF DEF,MPP THQDIF1C.247
ENDIF THQDIF1C.248
*ENDIF THQDIF1C.249
THQDIF1C.250
! And South Pole THQDIF1C.251
SCALAR=SEC_P_LATITUDE(P_BOT_ROW_START) THQDIF1C.252
*IF DEF,MPP THQDIF1C.253
THQDIF1C.254
IF (at_base_of_LPG) THEN THQDIF1C.255
*ENDIF THQDIF1C.256
DO I=1,ROW_LENGTH THQDIF1C.257
J=I+P_BOT_ROW_START-1 THQDIF1C.258
FIELD3(J)=DIFFUSION_NS(J-ROW_LENGTH,K)*FIELD1(J-ROW_LENGTH)* THQDIF1C.259
& SCALAR THQDIF1C.260
SP_FLUX(I)=FIELD3(J) THQDIF1C.261
FIELD_INC(J)=0.0 THQDIF1C.262
ENDDO THQDIF1C.263
*IF DEF,MPP THQDIF1C.264
ENDIF THQDIF1C.265
*ENDIF THQDIF1C.266
THQDIF1C.267
CL CALL POLAR TO UPDATE POLAR VALUES THQDIF1C.268
THQDIF1C.269
CALL POLAR
(FIELD_INC,NP_FLUX,SP_FLUX, THQDIF1C.270
*CALL ARGFLDPT
THQDIF1C.271
& P_FIELD,ROW_LENGTH,ROW_LENGTH, THQDIF1C.272
& 1,1,ROW_LENGTH,1) THQDIF1C.273
THQDIF1C.274
*ELSE THQDIF1C.275
CL LIMITED AREA MODEL ZEROES DEL-SQUARED ON BOUNDARIES. THQDIF1C.276
*IF DEF,MPP THQDIF1C.277
IF (at_left_of_LPG) THEN THQDIF1C.278
*ENDIF THQDIF1C.279
DO I=START_POINT_NO_HALO+FIRST_ROW_PT-1, THQDIF1C.280
& END_P_POINT_NO_HALO,ROW_LENGTH THQDIF1C.281
FIELD_INC(I)=0.0 THQDIF1C.282
ENDDO THQDIF1C.283
*IF DEF,MPP THQDIF1C.284
ENDIF THQDIF1C.285
THQDIF1C.286
IF (at_right_of_LPG) THEN THQDIF1C.287
*ENDIF THQDIF1C.288
DO I=START_POINT_NO_HALO+LAST_ROW_PT-1, THQDIF1C.289
& END_P_POINT_NO_HALO,ROW_LENGTH THQDIF1C.290
FIELD_INC(I)=0.0 THQDIF1C.291
ENDDO THQDIF1C.292
*IF DEF,MPP THQDIF1C.293
ENDIF THQDIF1C.294
*ENDIF THQDIF1C.295
*ENDIF THQDIF1C.296
THQDIF1C.297
C DE-MASS-WEIGHT INCREMENT AND COPY INTO FIELD1 THQDIF1C.298
DO I=FIRST_FLD_PT,LAST_P_FLD_PT THQDIF1C.299
FIELD(I) = FIELD_INC(I)*RECIP_RS_SQUARED_DELTAP(I,K) THQDIF1C.300
END DO THQDIF1C.301
THQDIF1C.302
*IF DEF,MPP THQDIF1C.303
if(jj.ne.KEXP_K1(K))then THQDIF1C.304
CALL SWAPBOUNDS
(FIELD,ROW_LENGTH,tot_P_ROWS, THQDIF1C.305
& EW_Halo,NS_Halo,1) THQDIF1C.306
endif THQDIF1C.307
*ENDIF THQDIF1C.308
THQDIF1C.309
C END OF DIFFUSION SWEEPS THQDIF1C.310
END DO THQDIF1C.311
THQDIF1C.312
CL ADD FINAL INCREMENT ONTO THETAL FIELD. THQDIF1C.313
SCALAR = (-1)**KEXP_K1(K) THQDIF1C.314
DO I=FIRST_VALID_PT,LAST_P_VALID_PT THQDIF1C.315
TH_Q(I,K) = TH_Q(I,K) - FIELD(I) * ADVECTION_TIMESTEP THQDIF1C.316
& *SCALAR THQDIF1C.317
END DO THQDIF1C.318
THQDIF1C.319
CL END LOOP OVER P_LEVELS FOR THETAL THQDIF1C.320
END DO THQDIF1C.321
*IF DEF,MPP THQDIF1C.322
CALL SWAPBOUNDS
THQDIF1C.323
1 (TH_Q,ROW_LENGTH,tot_P_ROWS, THQDIF1C.324
& EW_Halo,NS_Halo,LEVELS) THQDIF1C.325
*ENDIF THQDIF1C.326
CL END OF ROUTINE TH_Q_DIF THQDIF1C.327
THQDIF1C.328
RETURN THQDIF1C.329
END THQDIF1C.330
*ENDIF THQDIF1C.331