*IF DEF,A13_1A,OR,DEF,A13_1B ATJ0F402.25
C ******************************COPYRIGHT****************************** GTS2F400.2179
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.2180
C GTS2F400.2181
C Use, duplication or disclosure of this code is subject to the GTS2F400.2182
C restrictions as set forth in the contract. GTS2F400.2183
C GTS2F400.2184
C Meteorological Office GTS2F400.2185
C London Road GTS2F400.2186
C BRACKNELL GTS2F400.2187
C Berkshire UK GTS2F400.2188
C RG12 2SZ GTS2F400.2189
C GTS2F400.2190
C If no contract has been raised with this copy of the code, the use, GTS2F400.2191
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.2192
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.2193
C Modelling at the above address. GTS2F400.2194
C ******************************COPYRIGHT****************************** GTS2F400.2195
C GTS2F400.2196
CLL SUBROUTINE DIF_CTL ------------------------------------------ DIFCTL1A.3
CLL DIFCTL1A.4
CLL PURPOSE: CALCULATES AND ADDS DIFFUSION INCREMENTS TO U,V, QT DIFCTL1A.5
CLL AND THETAL USING EQUATIONS (47) AND (48). ONE MORE DIFCTL1A.6
CLL PRESSURE THAN VELOCITY ROW IS UPDATED. DIFCTL1A.7
CLL DIFCTL1A.8
CLL NOT SUITABLE FOR SINGLE COLUMN USE. DIFCTL1A.9
CLL DIFCTL1A.10
CLL WRITTEN BY M.H MAWSON. DIFCTL1A.11
CLL DIFCTL1A.12
CLL MODEL MODIFICATION HISTORY FROM MODEL VERSION 3.0: DIFCTL1A.13
CLL VERSION DATE DIFCTL1A.14
CLL DIFCTL1A.15
CLL 3.4 07/08/94 Directives inserted to improve parallel AAD2F304.1
CLL efficiency on C90. AAD2F304.2
CLL Authors: A. Dickinson, D. Salmond AAD2F304.3
CLL Reviewer: M. Mawson AAD2F304.4
! 3.5 28/03/95 MPP code: Change updateable area, APB0F305.1161
! add halo updates. P.Burton APB0F305.1162
CLL AAD2F304.5
ATD1F400.350
CLL 4.0 02/02/95: SET EFFECTIVE DIFFUSION TO ZERO WHENEVER ATD1F400.351
CLL SLOPE IS CONSIDERED TOO STEEP. THIS REDUCES EXCESSIVE ATD1F400.352
CLL PRECIPITATION OVER STEEP OROGRAPHY PROVIDED ATD1F400.353
CLL PRESSURE_TEST IS SET TO AN APPROPRIATE ALTITUDE ATD1F400.354
CLL E.G. 20000Pa (200hPa) ATD1F400.355
CLL Author: T. DAVIES FR. Reviewer: M. MAWSON ATD1F400.356
! 4.1 07/05/96 Added MPP code and TYPFLDPT arguments P.Burton APB0F401.1443
C vn4.3 Mar. 97 T3E migration : optimisation changes GSS1F403.580
C D.Salmond GSS1F403.581
CLL ATD1F400.357
CLL PROGRAMMING STANDARD: UNIFIED MODEL DOCUMENTATION PAPER NO. 4, DIFCTL1A.16
CLL STANDARD B. VERSION 2, DATED 18/01/90 DIFCTL1A.17
CLL DIFCTL1A.18
CLL SYSTEM COMPONENTS COVERED: P13 DIFCTL1A.19
CLL DIFCTL1A.20
CLL SYSTEM TASK: P1 DIFCTL1A.21
CLL DIFCTL1A.22
CLL DOCUMENTATION: THE EQUATIONS USED ARE (47) AND (48) DIFCTL1A.23
CLL IN UNIFIED MODEL DOCUMENTATION PAPER DIFCTL1A.24
CLL NO. 10 M.J.P. CULLEN,T.DAVIES AND M.H.MAWSON DIFCTL1A.25
CLLEND------------------------------------------------------------- DIFCTL1A.26
C DIFCTL1A.27
C*L ARGUMENTS:--------------------------------------------------- DIFCTL1A.28
SUBROUTINE DIF_CTL 1,31DIFCTL1A.29
1 (PSTAR,U,V,THETAL,QT,RS_SQUARED_DELTAP,K1,K2, DIFCTL1A.30
2 KEXP_K1,KEXP_K2, DIFCTL1A.31
& DELTA_AK,DELTA_BK,AK,BK,ADVECTION_TIMESTEP, ATD1F400.358
3 COS_U_LATITUDE,COS_P_LATITUDE,SEC_U_LATITUDE, DIFCTL1A.33
4 SEC_P_LATITUDE,LONGITUDE_STEP_INVERSE,P_FIELD, DIFCTL1A.34
5 LATITUDE_STEP_INVERSE,U_FIELD,ROW_LENGTH, APB0F401.1444
*CALL ARGFLDPT
APB0F401.1445
6 P_LEVELS,Q_LEVELS, APB0F401.1446
7 COS_U_LONGITUDE,SIN_U_LONGITUDE, ATD1F400.359
8 PRESSURE_ALTITUDE,L_TRACER_THETAL_QT) ATD1F400.360
DIFCTL1A.38
IMPLICIT NONE DIFCTL1A.39
DIFCTL1A.40
INTEGER DIFCTL1A.41
* U_FIELD !IN DIMENSION OF FIELDS ON VELOCITY GRID DIFCTL1A.42
*, P_FIELD !IN DIMENSION OF FIELDS ON PRESSURE GRID DIFCTL1A.43
*, P_LEVELS !IN NUMBER OF MODEL LEVELS. DIFCTL1A.44
*, Q_LEVELS !IN NUMBER OF MOIST MODEL LEVELS. DIFCTL1A.45
*, ROW_LENGTH !IN NUMBER OF POINTS PER ROW DIFCTL1A.46
&, KEXP_K1(P_LEVELS) !IN. EXPONENT OF DIFFUSION SCHEME FOR U,V DIFCTL1A.49
& ! AND THETAL FIELDS. DIFCTL1A.50
&, KEXP_K2(Q_LEVELS) !IN. EXPONENT OF DIFFUSION SCHEME FOR DIFCTL1A.51
& ! QT FIELD. DIFCTL1A.52
APB0F401.1447
! All TYPFLDPT arguments are intent IN APB0F401.1448
*CALL TYPFLDPT
APB0F401.1449
DIFCTL1A.53
REAL DIFCTL1A.54
* U(U_FIELD,P_LEVELS) !INOUT U VELOCITY FIELD. DIFCTL1A.55
*,V(U_FIELD,P_LEVELS) !INOUT V VELOCITY FIELD. DIFCTL1A.56
*,THETAL(P_FIELD,P_LEVELS) !INOUT THETAL FIELD. DIFCTL1A.57
*,QT(P_FIELD,Q_LEVELS) !INOUT QT FIELD. DIFCTL1A.58
DIFCTL1A.59
REAL DIFCTL1A.60
* PSTAR(P_FIELD) !IN PSTAR FIELD. DIFCTL1A.61
*,RS_SQUARED_DELTAP(P_FIELD,P_LEVELS) !IN RS*RS*DELTA P DIFCTL1A.62
*,COS_U_LATITUDE(U_FIELD) !IN COS(LAT) AT U POINTS. DIFCTL1A.63
*,COS_P_LATITUDE(P_FIELD) !IN COS(LAT) AT P POINTS. DIFCTL1A.64
*,SEC_U_LATITUDE(U_FIELD) !IN 1/COS(LAT) AT U POINTS. DIFCTL1A.65
*,SEC_P_LATITUDE(P_FIELD) !IN 1/COS(LAT) AT P POINTS. DIFCTL1A.66
*,COS_U_LONGITUDE(ROW_LENGTH) !IN COS(LONGITUDE) AT U POINTS. DIFCTL1A.67
*,SIN_U_LONGITUDE(ROW_LENGTH) !IN SIN(LONGITUDE) AT U POINTS. DIFCTL1A.68
DIFCTL1A.69
REAL DIFCTL1A.70
* DELTA_AK(P_LEVELS) !IN LAYER THICKNESS DIFCTL1A.71
*,DELTA_BK(P_LEVELS) !IN LAYER THICKNESS DIFCTL1A.72
*,AK(P_LEVELS) !LAYER AK'S ATD1F400.361
*,BK(P_LEVELS) !LAYER BK'S ATD1F400.362
*,K1(P_LEVELS) !IN DIFFUSION COEFF SEE EQ. (45) DIFCTL1A.73
*,K2(P_LEVELS) !IN DIFFUSION COEFF SEE EQ. (45) DIFCTL1A.74
*,LONGITUDE_STEP_INVERSE !IN 1/(DELTA LAMDA) DIFCTL1A.75
*,LATITUDE_STEP_INVERSE !IN 1/(DELTA PHI) DIFCTL1A.76
*,ADVECTION_TIMESTEP !IN DIFCTL1A.77
*, PRESSURE_ALTITUDE ! ALTITUDE FOR HIGHEST SLOPE TEST ATD1F400.363
DIFCTL1A.78
LOGICAL ATD1F400.364
* L_TRACER_THETAL_QT ! T if tracer advn. for thetal,qt ATD1F400.365
C*--------------------------------------------------------------------- DIFCTL1A.79
DIFCTL1A.80
C*L DEFINE ARRAYS AND VARIABLES USED IN THIS ROUTINE----------------- DIFCTL1A.81
C DEFINE LOCAL ARRAYS: 13 ARE REQUIRED DIFCTL1A.82
REAL DIFCTL1A.83
* DIFFUSION_COEFFICIENT(P_FIELD) !HOLDS EAST-WEST DIFFUSION DIFCTL1A.84
* ! COEFFICIENT DIFCTL1A.85
*,DIFFUSION_COEFFICIENT2(P_FIELD) !HOLDS NORTH-SOUTH DIFFUSION DIFCTL1A.86
* ! COEFFICIENT DIFCTL1A.87
*,QT_INC(P_FIELD) ! HOLDS QT INCREMENT DIFCTL1A.88
*,THETAL_INC(P_FIELD) ! HOLDS THETAL INCREMENT DIFCTL1A.89
*,RS_SQUARED_DELTAP_U_GRID(U_FIELD) ! RS*RS*DELTA P AT U POINTS. DIFCTL1A.90
*,RECIP_RS_SQUARED_DELTAP(P_FIELD) ! 1./RS*RS*DELTA P DIFCTL1A.91
*,PSTAR_UV(U_FIELD) ! HOLDS PRESSURE AT U POINTS. DIFCTL1A.92
*,FIELD1(P_FIELD) ! GENERAL WORK-SPACE DIFCTL1A.93
*,FIELD2(P_FIELD) ! GENERAL WORK-SPACE DIFCTL1A.94
*, PRESSURE(P_FIELD,P_LEVELS) !3-D PRESSURE ARRAY FOR TESTING ATD1F400.366
* ! SLOPE. LEVEL_P=1 IS SURFACE, LEVEL_P=K IS LEVEL K-1 ATD1F400.367
* ! FOR UV POINTS PRESSURE RE-CALCULATED TO UV POINTS ATD1F400.368
*, DIFFUSION_EW(P_FIELD,P_LEVELS) GSS1F403.582
!HOLDS EFFECTIVE EAST-WEST DIFFUSION GSS1F403.583
* ! COEFFICIENT ATD1F400.370
*, DIFFUSION_NS(P_FIELD,P_LEVELS) GSS1F403.584
!HOLDS EFFECTIVE NORTH-SOUTH DIFFUSION GSS1F403.585
* ! COEFFICIENT ATD1F400.372
*,COS_FUNCTION_U(U_FIELD) DIFCTL1A.97
*,COS_FUNCTION_P(P_FIELD) DIFCTL1A.98
DIFCTL1A.99
C*--------------------------------------------------------------------- DIFCTL1A.100
C DEFINE LOCAL VARIABLES DIFCTL1A.101
INTEGER DIFCTL1A.102
& START_U_UPDATE ! First U point to be updated APB0F401.1450
&, END_U_UPDATE ! Last U point to be updated APB0F401.1451
DIFCTL1A.111
REAL DIFCTL1A.112
* SCALAR,PRESSURE_TEST ATD1F400.373
C COUNT VARIABLES FOR DO LOOPS ETC. DIFCTL1A.114
INTEGER DIFCTL1A.115
* I,J,K,LEVEL_BASE ATD1F400.374
DIFCTL1A.117
C*L EXTERNAL SUBROUTINE CALLS:--------------------------------------- DIFCTL1A.118
EXTERNAL DIFCTL1A.119
* TH_Q_DIF,UV_DIF,P_TO_UV,COEFF_TH_Q,COEFF_UV ATD1F400.375
C*--------------------------------------------------------------------- DIFCTL1A.125
CL MAXIMUM VECTOR LENGTH ASSUMED IS P_FIELD DIFCTL1A.126
CL--------------------------------------------------------------------- DIFCTL1A.127
CL INTERNAL STRUCTURE. DIFCTL1A.128
CL--------------------------------------------------------------------- DIFCTL1A.129
CL DIFCTL1A.130
CL--------------------------------------------------------------------- DIFCTL1A.131
CL SECTION 1. INITIALISE LOCAL VARIABLES AND INTERPOLATE PSTAR DIFCTL1A.132
CL ONTO U-GRID. DIFCTL1A.133
CL--------------------------------------------------------------------- DIFCTL1A.134
DIFCTL1A.135
C**************************************************************** ATD1F400.376
C SET PRESSURE_TEST TO PRESSURE_ALTITUDE ABOVE WHICH HEIGHT ATD1F400.377
C NO SLOPE TESTING FOR EFFECTIVE DIFFUSION ATD1F400.378
C*************************************************************** ATD1F400.379
PRESSURE_TEST=PRESSURE_ALTITUDE ATD1F400.380
ATD1F400.381
! Diffusion is a bit different from the other dynamics routines. APB0F401.1452
! START_U_UPDATE and END_U_UPDATE are different for global and LAM APB0F401.1453
! models - for the global model they include the polar rows, APB0F401.1454
! but for the LAM they miss the Northern and Southern rows. So APB0F401.1455
! for this section of code only, we will keep the START_U_UPDATE APB0F401.1456
! and END_U_UPDATE, rather than using TYPFLDPT equivalents. APB0F401.1457
APB0F401.1458
*IF DEF,GLOBAL APB0F401.1459
! Update U field over entire field, including poles APB0F401.1460
START_U_UPDATE=FIRST_FLD_PT APB0F401.1461
END_U_UPDATE=LAST_U_FLD_PT APB0F401.1462
*ELSE APB0F401.1463
! Update U field, missing top and bottom rows APB0F401.1464
START_U_UPDATE=START_POINT_NO_HALO APB0F401.1465
END_U_UPDATE=END_U_POINT_NO_HALO APB0F401.1466
*ENDIF APB0F401.1467
SCALAR = LATITUDE_STEP_INVERSE*LATITUDE_STEP_INVERSE/ DIFCTL1A.147
1 (LONGITUDE_STEP_INVERSE*LONGITUDE_STEP_INVERSE) DIFCTL1A.148
DO I=FIRST_VALID_PT,LAST_U_VALID_PT APB0F401.1468
COS_FUNCTION_U(I) = COS_U_LATITUDE(I)*COS_U_LATITUDE(I)*SCALAR DIFCTL1A.150
COS_FUNCTION_P(I) = COS_P_LATITUDE(I)*COS_P_LATITUDE(I)*SCALAR DIFCTL1A.151
END DO DIFCTL1A.152
DIFCTL1A.153
DO I=LAST_U_VALID_PT+1,LAST_P_VALID_PT APB0F401.1469
COS_FUNCTION_P(I) = COS_P_LATITUDE(I)*COS_P_LATITUDE(I)*SCALAR DIFCTL1A.155
END DO DIFCTL1A.156
DIFCTL1A.157
CL CALL P_TO_UV DIFCTL1A.158
C STORE PSTAR ON U GRID IN PSTAR_UV. DIFCTL1A.159
DIFCTL1A.160
CALL P_TO_UV
(PSTAR,PSTAR_UV,P_FIELD,U_FIELD,ROW_LENGTH,tot_P_ROWS) APB0F401.1470
*IF DEF,MPP APB0F401.1471
! Get correct values in halos APB0F401.1472
CALL SWAPBOUNDS
(PSTAR_UV,ROW_LENGTH,tot_U_ROWS,EW_Halo,NS_Halo,1) APB0F401.1473
*ENDIF APB0F401.1474
DIFCTL1A.162
CL MAKE 3-D PRESSURE ARRAY AT P POINTS ATD1F400.382
CL LEVEL_P=1 SURFACE, LEVEL_P=K IS LEVEL K-1 ATD1F400.383
CL ONLY NEED P_LEVELS AS SURFACES SHOULD BE PRESSURE SURFACES ATD1F400.384
CL NEAR TOP OF MODEL SO TESTING UNNECESSARY ATD1F400.385
C**************************************************************** ATD1F400.386
C IF USING TRACER ADVECTION OF THETAL AND QT THEN DIFFUSION IS ATD1F400.387
C CALLED FOR TOP LEVEL THETAL AND FOR ALL U'S AND V'S ONLY ATD1F400.388
C NOTE STEEP SLOPE TEST SHOULD BE DISABLED BY APPROPRIATE ATD1F400.389
C SETTING OF PRESSURE ALTITUDE WHICH MEANS THAT PRESSURES ATD1F400.390
C DO NOT NEED CALCULATING FOR PRESSURE ARRAY ATD1F400.391
C*************************************************************** ATD1F400.392
ATD1F400.393
IF(.NOT.L_TRACER_THETAL_QT)THEN ATD1F400.394
ATD1F400.395
CL FIRST LEVEL ATD1F400.396
DO I=FIRST_VALID_PT,LAST_P_VALID_PT APB0F401.1475
PRESSURE(I,1)=PSTAR(I) ATD1F400.398
END DO ATD1F400.399
CL OTHER LEVELS ATD1F400.400
DO K=2,P_LEVELS ATD1F400.401
DO I=FIRST_VALID_PT,LAST_P_VALID_PT APB0F401.1476
PRESSURE(I,K)=AK(K-1)+BK(K-1)*PSTAR(I) ATD1F400.403
END DO ATD1F400.404
END DO ATD1F400.405
ATD1F400.406
C POINTER FOR DIFFUSION LEVEL START ATD1F400.407
LEVEL_BASE=1 ATD1F400.408
ATD1F400.409
ELSE ATD1F400.410
CLL ATD1F400.411
C IF USING TRACER ADVECTION OF THETAL AND QT THEN DIFFUSION IS ATD1F400.412
C CALLED FOR TOP LEVEL THETAL AND FOR ALL U'S AND V'S ONLY ATD1F400.413
C LEVEL_BASE IS THEN SET TO P_LEVELS OTHERWISE SET TO 1 ATD1F400.414
C IF NECESSARY THE TEST COULD BE MADE ON THE VALUE OF THE ATD1F400.415
C DIFFUSION COEFFICIENT K1 FOR EACH LEVEL ATD1F400.416
C NOTE STEEP SLOPE TEST SHOULD BE DISABLED BY APPROPRIATE ATD1F400.417
C SETTING OF PRESSURE ALTITUDE WHICH MEANS THAT PRESSURES ATD1F400.418
C DO NOT NEED CALCULATING FOR PRESSURE ARRAY ATD1F400.419
CLL ATD1F400.420
LEVEL_BASE=P_LEVELS ATD1F400.421
ATD1F400.422
END IF ATD1F400.423
AAD2F304.6
cmic$ do all shared (advection_timestep, cos_function_u) ATD1F400.424
cmic$* shared (cos_u_latitude, cos_u_longitude) ATD1F400.425
cmic$* shared (delta_ak, delta_bk, end_u_update, k1) APB0F401.1477
cmic$* shared (ak, bk, kexp_k1, latitude_step_inverse) ATD1F400.426
cmic$* shared (longitude_step_inverse, p_field, u_field, p_levels) ATD1F400.427
cmic$* shared (pstar_uv, thetal, row_length) APB0F401.1478
cmic$* shared (rs_squared_deltap, sec_p_latitude) ATD1F400.429
cmic$* shared (start_u_update) APB0F401.1479
*CALL CMICFLD
APB0F401.1480
cmic$* shared ( pressure, pressure_test, level_base) ATD1F400.431
cmic$* private (diffusion_coefficient, diffusion_coefficient2) AAD2F304.16
cmic$* private ( field1, i, j, k, scalar, thetal_inc) ATD1F400.432
cmic$* private ( diffusion_ew, diffusion_ns) ATD1F400.433
cmic$* private (recip_rs_squared_deltap) ATD1F400.434
DIFCTL1A.164
DO K=LEVEL_BASE,P_LEVELS ATD1F400.435
DIFCTL1A.166
CL DIFCTL1A.167
CL--------------------------------------------------------------------- DIFCTL1A.168
CL SECTION 2. CALCULATE DIFFUSION OF THETAL. ATD1F400.436
CL ADD ON INCREMENT TO ALL POINTS EXCEPT POLES DIFCTL1A.180
CL WHICH WOULD HAVE BEEN DONE INSIDE TH_Q_DIF. DIFCTL1A.181
CL--------------------------------------------------------------------- DIFCTL1A.182
DIFCTL1A.183
C SET DIFFUSION COEFFICIENT AND COPY THETAL INTO FIELD1. DIFCTL1A.184
DO I=FIRST_VALID_PT,LAST_U_VALID_PT APB0F401.1481
DIFFUSION_COEFFICIENT2(I) = K1(K)* DIFCTL1A.186
1 (DELTA_AK(K)+DELTA_BK(K)*PSTAR_UV(I)) DIFCTL1A.187
DIFFUSION_COEFFICIENT(I) = COS_FUNCTION_U(I)* DIFCTL1A.188
2 DIFFUSION_COEFFICIENT2(I) DIFCTL1A.189
END DO ATD1F400.438
DIFCTL1A.197
C CALL COEFF_TH_Q FOR EFFECTIVE DIFFUSION COEFFICIENT FOR THETAL ATD1F400.441
C AVERAGING IS DONE AS REQUIRED IN EQUATION(48). ATD1F400.442
C COEFFICIENTS ARE SET TO ZERO FOR STEEP SLOPES ATD1F400.443
C VALUES ARE IN DIFFUSION_EW AND DIFFUSION_NS ATD1F400.444
CALL COEFF_TH_Q
ATD1F400.445
1 (DIFFUSION_EW(1,K),DIFFUSION_NS(1,K), GSS1F403.586
2 PRESSURE,K,PRESSURE_TEST,AK,BK, ATD1F400.447
3 COS_U_LATITUDE,ROW_LENGTH, APB0F401.1483
*CALL ARGFLDPT
APB0F401.1484
5 LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE, ATD1F400.450
6 P_FIELD,U_FIELD,P_LEVELS, ATD1F400.451
7 DIFFUSION_COEFFICIENT,DIFFUSION_COEFFICIENT2) ATD1F400.452
ENDDO GSS1F403.587
APB0F401.1485
*IF DEF,MPP APB0F401.1486
CALL SWAPBOUNDS
(DIFFUSION_EW,ROW_LENGTH,tot_P_ROWS, APB0F401.1487
& EW_Halo,NS_Halo,P_LEVELS) GSS1F403.588
CALL SWAPBOUNDS
(DIFFUSION_NS,ROW_LENGTH,tot_P_ROWS, APB0F401.1489
& EW_Halo,NS_Halo,P_LEVELS) GSS1F403.589
*ENDIF APB0F401.1491
APB0F401.1492
ATD1F400.453
DO K=LEVEL_BASE,P_LEVELS GSS1F403.590
DO I=FIRST_VALID_PT,LAST_P_VALID_PT GSS1F403.591
FIELD1(I) = THETAL(I,K) GSS1F403.592
RECIP_RS_SQUARED_DELTAP(I) = 1./RS_SQUARED_DELTAP(I,K) GSS1F403.593
END DO GSS1F403.594
C LOOP THROUGH CODE KEXP_K1 TIMES. THE ORDER OF THE DIFFUSION SCHEME IS ATD1F400.454
C DEL TO THE POWER 2*KEXP_K1. ATD1F400.455
DO J=1,KEXP_K1(K) ATD1F400.456
ATD1F400.457
*IF -DEF,GLOBAL APB0F401.1493
CL ZERO INCREMENTS FOR FIRST AND LAST ROW ATD1F400.458
CL OVERWRITTEN BY POLAR IN GLOBAL MODELS ATD1F400.459
*IF DEF,MPP APB0F401.1494
IF (at_top_of_LPG) THEN APB0F401.1495
*ENDIF APB0F401.1496
DO I=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1 APB0F401.1497
THETAL_INC(I)=0.0 APB0F401.1498
ENDDO APB0F401.1499
*IF DEF,MPP APB0F401.1500
ENDIF APB0F401.1501
IF (at_base_of_LPG) THEN APB0F401.1502
*ENDIF APB0F401.1503
DO I=P_BOT_ROW_START,P_BOT_ROW_START+ROW_LENGTH-1 APB0F401.1504
THETAL_INC(I)=0.0 APB0F401.1505
ENDDO APB0F401.1506
*IF DEF,MPP APB0F401.1507
ENDIF APB0F401.1508
*ENDIF APB0F401.1509
*ENDIF APB0F401.1510
ATD1F400.464
CL CALL TH_Q_DIF ATD1F400.465
CL ATD1F400.466
CL--------------------------------------------------------------------- ATD1F400.467
CL NEW VERSION INCLUDES PRESSURE TEST ON SLOPES ATD1F400.468
CALL TH_Q_DIF
(FIELD1,THETAL_INC, ATD1F400.469
& SEC_P_LATITUDE,ROW_LENGTH, APB0F401.1511
*CALL ARGFLDPT
APB0F401.1512
& P_FIELD,U_FIELD, ATD1F400.472
& DIFFUSION_EW(1,K),DIFFUSION_NS(1,K)) GSS1F403.595
ATD1F400.474
C DE-MASS-WEIGHT INCREMENT AND COPY INTO FIELD1 SO THAT IT CAN BE FED ATD1F400.475
C BACK INTO TH_Q_DIF. ATD1F400.476
DO I=FIRST_FLD_PT,LAST_P_FLD_PT APB0F401.1513
FIELD1(I) = THETAL_INC(I)*RECIP_RS_SQUARED_DELTAP(I) ATD1F400.478
END DO ATD1F400.479
APB0F401.1514
*IF DEF,MPP APB0F401.1515
if(j.ne.KEXP_K1(K))then GSS1F403.596
CALL SWAPBOUNDS
(FIELD1,ROW_LENGTH,tot_P_ROWS, APB0F401.1516
& EW_Halo,NS_Halo,1) APB0F401.1517
endif GSS1F403.597
*ENDIF APB0F401.1518
ATD1F400.480
C END OF DIFFUSION SWEEPS ATD1F400.481
END DO ATD1F400.482
ATD1F400.483
CL ADD FINAL INCREMENT ONTO THETAL FIELD. ATD1F400.484
SCALAR = (-1)**KEXP_K1(K) ATD1F400.485
DO I=FIRST_VALID_PT,LAST_P_VALID_PT APB0F401.1519
THETAL(I,K) = THETAL(I,K) - FIELD1(I) * ADVECTION_TIMESTEP ATD1F400.487
& *SCALAR ATD1F400.488
END DO ATD1F400.489
ATD1F400.490
CL END LOOP OVER P_LEVELS FOR THETAL ATD1F400.491
END DO ATD1F400.492
*IF DEF,MPP GSS1F403.598
CALL SWAPBOUNDS
GSS1F403.599
1 (THETAL,ROW_LENGTH,tot_P_ROWS, GSS1F403.600
& EW_Halo,NS_Halo,P_LEVELS) GSS1F403.601
*ENDIF GSS1F403.602
DIFCTL1A.228
CL DIFCTL1A.229
CL--------------------------------------------------------------------- DIFCTL1A.230
CL SECTION 4. CALCULATE DIFFUSION OF QT AND DIFCTL1A.231
CL ADD ON INCREMENT TO ALL POINTS EXCEPT POLES DIFCTL1A.232
CL WHICH WOULD HAVE BEEN DONE INSIDE TH_Q_DIF. DIFCTL1A.233
CL--------------------------------------------------------------------- DIFCTL1A.234
DIFCTL1A.235
IF(.NOT.L_TRACER_THETAL_QT)THEN ATD1F400.493
ATD1F400.494
cmic$ do all shared (advection_timestep, cos_function_u) ATD1F400.495
cmic$* shared (cos_u_latitude, cos_u_longitude) ATD1F400.496
cmic$* shared (delta_ak, delta_bk, end_u_update) APB0F401.1520
cmic$* shared (ak, bk, k2, kexp_k2, latitude_step_inverse) ATD1F400.498
cmic$* shared (longitude_step_inverse, p_field, u_field, p_levels) ATD1F400.499
cmic$* shared (pstar_uv, q_levels, qt, row_length) APB0F401.1521
cmic$* shared (rs_squared_deltap, sec_p_latitude) ATD1F400.501
cmic$* shared (start_u_update) APB0F401.1522
*CALL CMICFLD
APB0F401.1523
cmic$* shared (pressure, pressure_test) ATD1F400.503
cmic$* private ( field1, i, j, k, scalar, qt_inc) ATD1F400.504
cmic$* private ( diffusion_ew, diffusion_ns) ATD1F400.505
cmic$* private (diffusion_coefficient, diffusion_coefficient2) ATD1F400.506
cmic$* private (recip_rs_squared_deltap) ATD1F400.507
ATD1F400.508
DO K=1,Q_LEVELS ATD1F400.509
DIFCTL1A.237
C SET DIFFUSION COEFFICIENT AND COPY QT INTO FIELD1. DIFCTL1A.238
DO I=FIRST_VALID_PT,LAST_U_VALID_PT APB0F401.1524
DIFFUSION_COEFFICIENT2(I) = K2(K)* DIFCTL1A.240
1 (DELTA_AK(K)+DELTA_BK(K)*PSTAR_UV(I)) DIFCTL1A.241
DIFFUSION_COEFFICIENT(I) = COS_FUNCTION_U(I)* DIFCTL1A.242
2 DIFFUSION_COEFFICIENT2(I) DIFCTL1A.243
END DO ATD1F400.512
ATD1F400.513
ATD1F400.517
C CALL COEFF_TH_Q FOR EFFECTIVE DIFFUSION COEFFICIENT FOR QT ATD1F400.518
C AVERAGING IS DONE AS REQUIRED IN EQUATION(48). ATD1F400.519
C COEFFICIENTS ARE SET TO ZERO FOR STEEP SLOPES ATD1F400.520
C VALUES ARE IN DIFFUSION_EW AND DIFFUSION_NS ATD1F400.521
CALL COEFF_TH_Q
ATD1F400.522
1 (DIFFUSION_EW(1,K),DIFFUSION_NS(1,K), GSS1F403.603
2 PRESSURE,K,PRESSURE_TEST,AK,BK, ATD1F400.524
3 COS_U_LATITUDE,ROW_LENGTH, APB0F401.1526
*CALL ARGFLDPT
APB0F401.1527
5 LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE, ATD1F400.527
6 P_FIELD,U_FIELD,P_LEVELS, ATD1F400.528
7 DIFFUSION_COEFFICIENT,DIFFUSION_COEFFICIENT2) ATD1F400.529
ENDDO GSS1F403.604
APB0F401.1528
*IF DEF,MPP APB0F401.1529
CALL SWAPBOUNDS
(DIFFUSION_EW,ROW_LENGTH,tot_P_ROWS, APB0F401.1530
& EW_Halo,NS_Halo,Q_LEVELS) GSS1F403.605
CALL SWAPBOUNDS
(DIFFUSION_NS,ROW_LENGTH,tot_P_ROWS, APB0F401.1532
& EW_Halo,NS_Halo,Q_LEVELS) GSS1F403.606
*ENDIF APB0F401.1534
ATD1F400.530
C LOOP THROUGH CODE KEXP_K2 TIMES. THE ORDER OF THE DIFFUSION SCHEME IS ATD1F400.531
C DEL TO THE POWER 2*KEXP_K2. ATD1F400.532
DO K=1,Q_LEVELS GSS1F403.607
DO I=FIRST_VALID_PT,LAST_P_VALID_PT GSS1F403.608
FIELD1(I) = QT(I,K) GSS1F403.609
RECIP_RS_SQUARED_DELTAP(I) = 1./RS_SQUARED_DELTAP(I,K) GSS1F403.610
END DO GSS1F403.611
DO J=1,KEXP_K2(K) ATD1F400.533
ATD1F400.534
*IF -DEF,GLOBAL APB0F401.1535
CL ZERO INCREMENTS FOR FIRST AND LAST ROW ATD1F400.535
CL OVERWRITTEN BY POLAR IN GLOBAL MODELS ATD1F400.536
*IF DEF,MPP APB0F401.1536
IF (at_top_of_LPG) THEN APB0F401.1537
*ENDIF APB0F401.1538
DO I=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1 APB0F401.1539
QT_INC(I)=0.0 APB0F401.1540
ENDDO APB0F401.1541
*IF DEF,MPP APB0F401.1542
ENDIF APB0F401.1543
IF (at_base_of_LPG) THEN APB0F401.1544
*ENDIF APB0F401.1545
DO I=P_BOT_ROW_START,P_BOT_ROW_START+ROW_LENGTH-1 APB0F401.1546
QT_INC(I)=0.0 APB0F401.1547
ENDDO APB0F401.1548
*IF DEF,MPP APB0F401.1549
ENDIF APB0F401.1550
*ENDIF APB0F401.1551
*ENDIF APB0F401.1552
ATD1F400.541
CL CALL TH_Q_DIF AT A MOIST LEVEL. ATD1F400.542
ATD1F400.543
CL ATD1F400.544
CL--------------------------------------------------------------------- ATD1F400.545
CL NEW VERSION INCLUDES PRESSURE TEST ON SLOPES ATD1F400.546
CALL TH_Q_DIF
(FIELD1,QT_INC, ATD1F400.547
& SEC_P_LATITUDE,ROW_LENGTH, APB0F401.1553
*CALL ARGFLDPT
APB0F401.1554
& P_FIELD,U_FIELD, ATD1F400.550
& DIFFUSION_EW(1,K),DIFFUSION_NS(1,K)) GSS1F403.612
C ATD1F400.552
CL--------------------------------------------------------------------- ATD1F400.553
C DE-MASS-WEIGHT INCREMENT AND COPY INTO FIELD1 SO THAT IT CAN BE FED ATD1F400.554
C BACK INTO TH_Q_DIF. ATD1F400.555
DO I=FIRST_FLD_PT,LAST_P_FLD_PT APB0F401.1555
FIELD1(I) = QT_INC(I)*RECIP_RS_SQUARED_DELTAP(I) ATD1F400.557
END DO ATD1F400.558
*IF DEF,MPP APB0F401.1556
if(J.ne.KEXP_K2(K))then GSS1F403.613
CALL SWAPBOUNDS
(FIELD1,ROW_LENGTH,tot_P_ROWS, APB0F401.1557
& EW_Halo,NS_Halo,1) APB0F401.1558
endif GSS1F403.614
*ENDIF APB0F401.1559
ATD1F400.559
C END OF DIFFUSION SWEEPS ATD1F400.560
END DO ATD1F400.561
ATD1F400.562
CL ADD FINAL INCREMENT ONTO QT FIELD. ATD1F400.563
SCALAR = (-1)**KEXP_K2(K) ATD1F400.564
DO I=FIRST_VALID_PT,LAST_P_VALID_PT APB0F401.1560
QT(I,K) = QT(I,K) - FIELD1(I) * ADVECTION_TIMESTEP ATD1F400.566
& *SCALAR ATD1F400.567
END DO ATD1F400.568
ATD1F400.569
CL END LOOP OVER P_LEVELS FOR QT ATD1F400.570
END DO ATD1F400.571
*IF DEF,MPP GSS1F403.615
CALL SWAPBOUNDS
GSS1F403.616
1 (QT,ROW_LENGTH,tot_P_ROWS, GSS1F403.617
& EW_Halo,NS_Halo,Q_LEVELS) GSS1F403.618
*ENDIF GSS1F403.619
CL END IF TEST FOR NO DIFFUSION WITH TRACER ADVECTION ATD1F400.572
END IF ATD1F400.573
ATD1F400.574
CL MAKE 3-D PRESSURE ARRAY AT UV POINTS ATD1F400.575
CL LEVEL_P=1 SURFACE, LEVEL_P=K IS LEVEL K-1 ATD1F400.576
CL ONLY NEED P_LEVELS AS SURFACES SHOULD BE PRESSURE SURFACES ATD1F400.577
CL NEAR TOP OF MODEL SO TESTING UNNECESSARY ATD1F400.578
CL FIRST LEVEL ATD1F400.579
DO I=FIRST_VALID_PT,LAST_U_VALID_PT APB0F401.1561
PRESSURE(I,1)=PSTAR_UV(I) ATD1F400.581
END DO ATD1F400.582
CL OTHER LEVELS ATD1F400.583
DO K=2,P_LEVELS ATD1F400.584
DO I=FIRST_VALID_PT,LAST_U_VALID_PT APB0F401.1562
PRESSURE(I,K)=AK(K-1)+BK(K-1)*PSTAR_UV(I) ATD1F400.586
END DO ATD1F400.587
END DO ATD1F400.588
ATD1F400.589
CL LOOP OVER P_LEVELS FOR U AND V ATD1F400.590
cmic$ do all shared (advection_timestep, cos_function_p) ATD1F400.591
cmic$* shared (cos_p_latitude, cos_u_longitude, sin_u_longitude) ATD1F400.592
cmic$* shared (delta_ak, delta_bk, end_u_update) APB0F401.1563
cmic$* shared (ak, bk, k1, kexp_k1, latitude_step_inverse) ATD1F400.594
cmic$* shared (longitude_step_inverse, p_field, u_field, p_levels) ATD1F400.595
cmic$* shared (pstar, u, v, row_length) APB0F401.1564
cmic$* shared (rs_squared_deltap, sec_u_latitude) ATD1F400.597
cmic$* shared (start_u_update) APB0F401.1565
*CALL CMICFLD
APB0F401.1566
cmic$* shared (pressure, pressure_test) ATD1F400.599
cmic$* private ( field1, field2, i, j, k, scalar) ATD1F400.600
cmic$* private ( diffusion_ew, diffusion_ns) ATD1F400.601
cmic$* private (diffusion_coefficient, diffusion_coefficient2) ATD1F400.602
cmic$* private (rs_squared_deltap_u_grid) ATD1F400.603
ATD1F400.604
DO K=1,P_LEVELS ATD1F400.605
CL ATD1F400.607
CL--------------------------------------------------------------------- ATD1F400.608
CL SECTION 5. SET DIFFUSION_COEFFICIENTS ON P GRID. DIFCTL1A.286
CL THEN CALCULATE DIFFUSION OF U AND V. DIFCTL1A.287
CL--------------------------------------------------------------------- DIFCTL1A.288
DIFCTL1A.289
C SET DIFFUSION COEFFICIENT DIFCTL1A.290
DO I=FIRST_VALID_PT,LAST_P_VALID_PT APB0F401.1568
DIFFUSION_COEFFICIENT2(I) = K1(K)* DIFCTL1A.292
1 (DELTA_AK(K)+DELTA_BK(K)*PSTAR(I)) DIFCTL1A.293
DIFFUSION_COEFFICIENT(I) = COS_FUNCTION_P(I)* DIFCTL1A.294
2 DIFFUSION_COEFFICIENT2(I) DIFCTL1A.295
END DO ATD1F400.617
C CALL COEFF_UV FOR EFFECTIVE DIFFUSION COEFFICIENT FOR U AND V ATD1F400.618
C AVERAGING IS DONE AS REQUIRED IN EQUATION(48). ATD1F400.619
C COEFFICIENTS ARE SET TO ZERO FOR STEEP SLOPES ATD1F400.620
C VALUES ARE RETURNED IN DIFFUSION_EW AND DIFFUSION_NS ATD1F400.621
CALL COEFF_UV
ATD1F400.622
1 (DIFFUSION_EW(1,K),DIFFUSION_NS(1,K), GSS1F403.620
2 PRESSURE,K,PRESSURE_TEST,AK,BK, ATD1F400.624
3 COS_P_LATITUDE,START_U_UPDATE,END_U_UPDATE, APB0F401.1570
& ROW_LENGTH, APB0F401.1571
*CALL ARGFLDPT
APB0F401.1572
4 LATITUDE_STEP_INVERSE, APB0F401.1573
5 LONGITUDE_STEP_INVERSE,P_FIELD,U_FIELD,P_LEVELS, ATD1F400.627
6 DIFFUSION_COEFFICIENT,DIFFUSION_COEFFICIENT2) ATD1F400.628
APB0F401.1574
ENDDO GSS1F403.621
GSS1F403.622
*IF DEF,MPP APB0F401.1575
CALL SWAPBOUNDS
(DIFFUSION_EW,ROW_LENGTH,tot_P_ROWS, APB0F401.1576
& EW_Halo,NS_Halo,P_LEVELS) GSS1F403.623
CALL SWAPBOUNDS
(DIFFUSION_NS,ROW_LENGTH,tot_P_ROWS, APB0F401.1578
& EW_Halo,NS_Halo,P_LEVELS) GSS1F403.624
*ENDIF APB0F401.1580
APB0F401.1581
DO K=1,P_LEVELS GSS1F403.625
CL GSS1F403.626
CL--------------------------------------------------------------------- GSS1F403.627
CL SECTION 4. INTERPOLATE RS_SQUARED_DELTAP TO U GRID. GSS1F403.628
CL--------------------------------------------------------------------- GSS1F403.629
ATD1F400.629
C INTERPOLATE RS_SQUARED_DELTAP TO U GRID. GSS1F403.630
GSS1F403.631
CALL P_TO_UV
(RS_SQUARED_DELTAP(1,K),RS_SQUARED_DELTAP_U_GRID, GSS1F403.632
* P_FIELD,U_FIELD,ROW_LENGTH,tot_P_ROWS) GSS1F403.633
DO I=FIRST_VALID_PT,LAST_U_VALID_PT GSS1F403.634
FIELD1(I) = U(I,K) GSS1F403.635
FIELD2(I) = V(I,K) GSS1F403.636
END DO GSS1F403.637
GSS1F403.638
GSS1F403.639
C LOOP THROUGH CODE KEXP_K1 TIMES. THE ORDER OF THE DIFFUSION SCHEME IS ATD1F400.630
C DEL TO THE POWER 2*KEXP_K1. ATD1F400.631
ATD1F400.632
DO J=1,KEXP_K1(K) ATD1F400.633
CL CALL UV_DIF FOR U &V ATD1F400.634
ATD1F400.635
CALL UV_DIF
(FIELD1,FIELD2,RS_SQUARED_DELTAP_U_GRID, ATD1F400.636
* SEC_U_LATITUDE,START_U_UPDATE,END_U_UPDATE, ATD1F400.637
& ROW_LENGTH, APB0F401.1582
*CALL ARGFLDPT
APB0F401.1583
* P_FIELD,U_FIELD, APB0F401.1584
* DIFFUSION_EW(1,K),DIFFUSION_NS(1,K)) GSS1F403.640
*IF DEF,MPP APB0F401.1585
if(j.ne.KEXP_K1(K))then GSS1F403.641
CALL SWAPBOUNDS
(FIELD1,ROW_LENGTH,tot_P_ROWS, APB0F401.1586
& EW_Halo,NS_Halo,1) APB0F401.1587
CALL SWAPBOUNDS
(FIELD2,ROW_LENGTH,tot_P_ROWS, APB0F401.1588
& EW_Halo,NS_Halo,1) APB0F401.1589
endif GSS1F403.642
*ENDIF APB0F401.1590
ATD1F400.640
C FIELD1 AND FIELD2 NOW CONTAIN DIFFUSED QUANTITIES WHICH CAN ATD1F400.641
C BE USED IN FURTHER DIFFUSION SWEEPS ATD1F400.642
ATD1F400.643
CL END OF DIFFUSION SWEEPS ATD1F400.644
END DO ATD1F400.645
CL ADD FINAL INCREMENT ONTO WIND FIELDS. DIFCTL1A.331
SCALAR = (-1)**KEXP_K1(K) DIFCTL1A.332
! Loop over field, missing top and bottom rows and halos APB0F401.1591
DO I=START_POINT_NO_HALO,END_U_POINT_NO_HALO APB0F401.1592
U(I,K) = U(I,K) - FIELD1(I) * ADVECTION_TIMESTEP DIFCTL1A.334
& *SCALAR DIFCTL1A.335
V(I,K) = V(I,K) - FIELD2(I) * ADVECTION_TIMESTEP DIFCTL1A.336
& *SCALAR DIFCTL1A.337
END DO ATD1F400.647
CL END LOOP OVER P_LEVELS DIFCTL1A.339
DIFCTL1A.340
END DO ATD1F400.648
GSS1F403.643
*IF DEF,MPP GSS1F403.644
CALL SWAPBOUNDS
GSS1F403.645
1 (U,ROW_LENGTH,tot_P_ROWS, GSS1F403.646
& EW_Halo,NS_Halo,P_LEVELS) GSS1F403.647
CALL SWAPBOUNDS
GSS1F403.648
1 (V,ROW_LENGTH,tot_P_ROWS, GSS1F403.649
& EW_Halo,NS_Halo,P_LEVELS) GSS1F403.650
*ENDIF GSS1F403.651
DIFCTL1A.342
CL END OF ROUTINE DIF_CTL DIFCTL1A.343
DIFCTL1A.344
RETURN DIFCTL1A.345
END DIFCTL1A.346
*ENDIF DIFCTL1A.347