*IF DEF,A12_1B,OR,DEF,A12_1C,OR,DEF,A12_1E AAD2F404.249
C ******************************COPYRIGHT****************************** GTS2F400.2215
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.2216
C GTS2F400.2217
C Use, duplication or disclosure of this code is subject to the GTS2F400.2218
C restrictions as set forth in the contract. GTS2F400.2219
C GTS2F400.2220
C Meteorological Office GTS2F400.2221
C London Road GTS2F400.2222
C BRACKNELL GTS2F400.2223
C Berkshire UK GTS2F400.2224
C RG12 2SZ GTS2F400.2225
C GTS2F400.2226
C If no contract has been raised with this copy of the code, the use, GTS2F400.2227
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.2228
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.2229
C Modelling at the above address. GTS2F400.2230
C ******************************COPYRIGHT****************************** GTS2F400.2231
C GTS2F400.2232
CLL SUBROUTINE DIV_DAMP ------------------------------------------- DIVDMP1A.3
CLL DIVDMP1A.4
CLL PURPOSE: CALCULATES AND ADDS DIVERGENCE DAMPING INCREMENTS TO DIVDMP1A.5
CLL U AND V AS DESCRIBED IN SECTION 3.4 OF DOCUMENTATION DIVDMP1A.6
CLL PAPER NO 10. DIVDMP1A.7
CLL NOT SUITABLE FOR SINGLE COLUMN USE. DIVDMP1A.8
CLL DIVDMP1A.9
CLL WRITTEN BY M.H MAWSON. DIVDMP1A.10
CLL DIVDMP1A.11
CLL MODEL MODIFICATION HISTORY FROM MODEL VERSION 3.0: DIVDMP1A.12
CLL VERSION DATE DIVDMP1A.13
CLL 4.0 10/07/95 SEC_P_LATITUDE at pole changed for consistency ACH1F400.36
CLL with other parts of UM code. C.D.Hall ACH1F400.37
! 3.5 28/03/95 MPP code: Change updateable area and APB0F305.659
! remove wrap around code. P.Burton APB0F305.660
! 4.1 23/04/96 Added TYPFLDPT arguments to dynamics routines APB0F401.880
! which allows many of the differences between APB0F401.881
! MPP and "normal" code to be at top level APB0F401.882
! P.Burton APB0F401.883
CLL GDS1F402.1831
CLL 4.2 4/12/96 : FIX to code to make it work for MPP GDS1F402.1832
CLL Alan Dickinson and Deborah Salmond GDS1F402.1833
CLL 4.4 18/11/97 Correction to loop bound: divergence for first point ASB1F404.244
CLL following polar row (non-MPP only) used but not ASB1F404.245
CLL assigned. Rick Rawlins ASB1F404.246
CLL DIVDMP1A.14
CLL PROGRAMMING STANDARD: UNIFIED MODEL DOCUMENTATION PAPER NO. 4, DIVDMP1A.15
CLL STANDARD B. VERSION 2, DATED 18/01/90 DIVDMP1A.16
CLL DIVDMP1A.17
CLL SYSTEM COMPONENTS COVERED: P15 DIVDMP1A.18
CLL DIVDMP1A.19
CLL SYSTEM TASK: P1 DIVDMP1A.20
CLL DIVDMP1A.21
CLL DOCUMENTATION: THE EQUATIONS USED ARE (30) AND (49) DIVDMP1A.22
CLL IN UNIFIED MODEL DOCUMENTATION DIVDMP1A.23
CLL PAPER NO. 10 M.J.P. CULLEN, T.DAVIES AND DIVDMP1A.24
CLLEND------------------------------------------------------------- DIVDMP1A.25
C DIVDMP1A.26
C*L ARGUMENTS:--------------------------------------------------- DIVDMP1A.27
SUBROUTINE DIV_DAMP 2,14DIVDMP1A.28
1 (U,V,RS,SEC_U_LATITUDE,PSTAR_OLD,COS_U_LATITUDE, DIVDMP1A.29
2 KD,LONGITUDE_STEP_INVERSE,LATITUDE_STEP_INVERSE, DIVDMP1A.30
3 P_FIELD,U_FIELD,ROW_LENGTH,P_LEVELS, APB0F401.884
*CALL ARGFLDPT
APB0F401.885
4 BKH,ADVECTION_TIMESTEP,DELTA_AK, APB0F401.886
5 DELTA_BK,COS_U_LONGITUDE,SIN_U_LONGITUDE, DIVDMP1A.33
6 SEC_P_LATITUDE) DIVDMP1A.34
DIVDMP1A.35
IMPLICIT NONE DIVDMP1A.36
DIVDMP1A.37
INTEGER DIVDMP1A.38
* P_FIELD !IN DIMENSION OF FIELDS ON PRESSSURE GRID. DIVDMP1A.39
*, U_FIELD !IN DIMENSION OF FIELDS ON VELOCITY GRID DIVDMP1A.40
*, P_LEVELS !IN NUMBER OF PRESSURE LEVELS. DIVDMP1A.42
*, ROW_LENGTH !IN NUMBER OF POINTS PER ROW DIVDMP1A.44
! All TYPFLDPT arguments are intent IN APB0F401.887
*CALL TYPFLDPT
APB0F401.888
DIVDMP1A.45
REAL DIVDMP1A.46
* U(U_FIELD,P_LEVELS) !IN U VELOCITY FIELD DIVDMP1A.47
*,V(U_FIELD,P_LEVELS) !IN V VELOCITY FIELD DIVDMP1A.48
* ,COS_U_LATITUDE(U_FIELD) ! cos(lat) at u points (2nd array) DIVDMP1A.49
*,PSTAR_OLD(U_FIELD) !IN PSTAR AT PREVIOUS TIME-LEVEL AT DIVDMP1A.50
* ! U POINTS DIVDMP1A.51
*,RS(P_FIELD,P_LEVELS) !IN RS FIELD ON U GRID DIVDMP1A.52
DIVDMP1A.53
REAL DIVDMP1A.54
* DELTA_AK(P_LEVELS) !IN LAYER THICKNESS DIVDMP1A.55
*,DELTA_BK(P_LEVELS) !IN LAYER THICKNESS DIVDMP1A.56
*,BKH(P_LEVELS+1) !IN SECOND TERM IN HYBRID CO-ORDS AT DIVDMP1A.57
* ! HALF LEVELS. DIVDMP1A.58
*,SEC_U_LATITUDE(U_FIELD) !IN 1/COS(LAT) AT U POINTS (2-D ARRAY) DIVDMP1A.59
*,SEC_P_LATITUDE(P_FIELD) !IN 1/COS(LAT) AT P POINTS (2-D ARRAY) DIVDMP1A.60
*,COS_U_LONGITUDE(ROW_LENGTH) !IN COS(LONGITUDE) AT U POINTS DIVDMP1A.61
*,SIN_U_LONGITUDE(ROW_LENGTH) !IN SIN(LONGITUDE) AT U POINTS DIVDMP1A.62
*,LONGITUDE_STEP_INVERSE !IN 1/(DELTA LAMDA) DIVDMP1A.63
*,LATITUDE_STEP_INVERSE !IN 1/(DELTA PHI) DIVDMP1A.64
*,KD(P_LEVELS) !IN DIVERGENCE COEFFICIENTS. DIVDMP1A.65
*,ADVECTION_TIMESTEP !IN DIVDMP1A.66
C*--------------------------------------------------------------------- DIVDMP1A.67
DIVDMP1A.68
C*L DEFINE ARRAYS AND VARIABLES USED IN THIS ROUTINE----------------- DIVDMP1A.69
C DEFINE LOCAL ARRAYS: 7 ARE REQUIRED DIVDMP1A.70
REAL DIVDMP1A.71
* D(P_FIELD) ! HOLDS DIVERGENCE AT A LEVEL DIVDMP1A.72
*, D_BY_DLAT(P_FIELD) ! HOLDS D/D(LAT) OF DIVERGENCE DIVDMP1A.73
*, D_BY_DLAT2(P_FIELD) ! HOLDS AVERAGED D_BY_DLAT DIVDMP1A.74
*, D_BY_DLONG(P_FIELD) ! HOLDS D/D(LONG) OF DIVERGENCE DIVDMP1A.75
*, DU_DLONGITUDE(U_FIELD) DIVDMP1A.76
*, DV_DLATITUDE(U_FIELD) DIVDMP1A.77
*, DV_DLATITUDE2(U_FIELD) DIVDMP1A.78
* ,U_MW(U_FIELD) ! Mass weighted u field DIVDMP1A.79
* ,V_MW(U_FIELD) ! Mass weighted v field DIVDMP1A.80
* ,RS_U_GRID(U_FIELD) ! RS field on u grid DIVDMP1A.81
DIVDMP1A.82
C*--------------------------------------------------------------------- DIVDMP1A.83
C DEFINE LOCAL VARIABLES DIVDMP1A.84
DIVDMP1A.94
*IF DEF,MPP APB0F401.889
*IF DEF,GLOBAL APB0F401.890
INTEGER info APB0F401.891
*ELSE APB0F401.892
INTEGER row_start_offset,row_end_offset APB0F401.893
*ENDIF APB0F401.894
*ENDIF APB0F401.895
C REAL SCALARS DIVDMP1A.95
REAL DIVDMP1A.96
* SCALAR DIVDMP1A.97
*IF DEF,GLOBAL DIVDMP1A.98
*,SUM_N,SUM_S DIVDMP1A.100
*ENDIF DIVDMP1A.102
DIVDMP1A.103
C COUNT VARIABLES FOR DO LOOPS ETC. DIVDMP1A.104
INTEGER DIVDMP1A.105
* I,J,K DIVDMP1A.106
DIVDMP1A.107
C*L EXTERNAL SUBROUTINE CALLS:--------------------------------------- DIVDMP1A.108
EXTERNAL P_TO_UV DIVDMP1A.109
*IF DEF,GLOBAL DIVDMP1A.110
& ,POLAR_UV DIVDMP1A.111
*IF DEF,CRAY DIVDMP1A.112
*, SSUM DIVDMP1A.113
REAL SSUM DIVDMP1A.114
*ENDIF DIVDMP1A.115
*ELSE DIVDMP1A.116
C NO EXTERNAL SUBROUTINE CALLS DIVDMP1A.117
*ENDIF DIVDMP1A.118
C*--------------------------------------------------------------------- DIVDMP1A.119
DIVDMP1A.120
CL MAXIMUM VECTOR LENGTH ASSUMED IS P_POINTS_UPDATE DIVDMP1A.121
CL--------------------------------------------------------------------- DIVDMP1A.122
CL INTERNAL STRUCTURE INCLUDING SUBROUTINE CALLS: DIVDMP1A.123
CL--------------------------------------------------------------------- DIVDMP1A.124
CL DIVDMP1A.125
CL--------------------------------------------------------------------- DIVDMP1A.126
CL SECTION 1. INITIALISATION DIVDMP1A.127
CL--------------------------------------------------------------------- DIVDMP1A.128
C INCLUDE LOCAL CONSTANTS FROM GENERAL CONSTANTS BLOCK DIVDMP1A.129
DIVDMP1A.130
DIVDMP1A.137
CL LOOP OVER P_LEVELS DIVDMP1A.138
DIVDMP1A.139
DO 100 K=1,P_LEVELS DIVDMP1A.140
IF(KD(K).GT.0.) THEN DIVDMP1A.141
CL CALCULATE MASS WEIGHTED VELOCITY COMPONENTS DIVDMP1A.142
CALL P_TO_UV
(RS(1,K),RS_U_GRID,P_FIELD,U_FIELD,ROW_LENGTH, APB0F401.896
& tot_P_ROWS) APB0F401.897
*IF DEF,MPP GDS1F402.1835
call swapbounds
(RS_U_GRID,row_length,tot_u_rows,1,1,1) GDS1F402.1836
*ENDIF GDS1F402.1837
! Loop over field, missing North and South halos APB0F401.898
DO I=FIRST_VALID_PT,LAST_U_VALID_PT GDS1F402.1838
SCALAR=RS_U_GRID(I)*(DELTA_AK(K)+DELTA_BK(K)*PSTAR_OLD(I)) DIVDMP1A.145
U_MW(I)=U(I,K)*SCALAR DIVDMP1A.146
V_MW(I)=V(I,K)*SCALAR*COS_U_LATITUDE(I) DIVDMP1A.147
ENDDO DIVDMP1A.148
DIVDMP1A.149
CL DIVDMP1A.150
CL--------------------------------------------------------------------- DIVDMP1A.151
CL SECTION 2. CALCULATE DIVERGENCE USING EQUATION (30) DIVDMP1A.152
CL--------------------------------------------------------------------- DIVDMP1A.153
DIVDMP1A.154
C CALCULATE DU/D(LAMDA) DIVDMP1A.155
! Loop over field, starting at second row and ending on row above APB0F401.900
! last row. Missing out North and South halos APB0F401.901
DO 210 I=START_POINT_NO_HALO-ROW_LENGTH+1, APB0F401.902
& LAST_U_VALID_PT GDS1F402.1839
DU_DLONGITUDE(I) = LONGITUDE_STEP_INVERSE* DIVDMP1A.157
& (U_MW(I)-U_MW(I-1)) DIVDMP1A.158
210 CONTINUE DIVDMP1A.159
DIVDMP1A.160
C CALCULATE DV/D(PHI) DIVDMP1A.161
! Loop over field, missing top and bottom rows and North and South halos APB0F401.904
DO 220 I=START_POINT_NO_HALO,LAST_U_VALID_PT GDS1F402.1840
DV_DLATITUDE(I) = LATITUDE_STEP_INVERSE* DIVDMP1A.163
& (V_MW(I-ROW_LENGTH)-V_MW(I)) DIVDMP1A.164
220 CONTINUE DIVDMP1A.165
DIVDMP1A.166
*IF DEF,GLOBAL DIVDMP1A.167
C CALCULATE AVERAGE OF DV_DLATITUDE DIVDMP1A.168
! Loop over field, missing first point, poles and North and South halos APB0F401.906
DO 230 I=START_POINT_NO_HALO+1,LAST_U_VALID_PT GDS1F402.1841
DV_DLATITUDE2(I) = DV_DLATITUDE(I) + DV_DLATITUDE(I-1) DIVDMP1A.170
230 CONTINUE DIVDMP1A.171
DIVDMP1A.172
C NOW DO FIRST POINT ON EACH SLICE FOR DU_DLONGITUDE AND DV_DLATITUDE2 DIVDMP1A.173
*IF -DEF,MPP APB0F305.680
I=START_POINT_NO_HALO-ROW_LENGTH APB0F401.908
DU_DLONGITUDE(I)=LONGITUDE_STEP_INVERSE* DIVDMP1A.175
& (U_MW(I)-U_MW(I+ROW_LENGTH-1)) DIVDMP1A.176
! Loop over the first point of each row between top and bottom rows APB0F401.909
DO 240 I=START_POINT_NO_HALO,END_P_POINT_NO_HALO,ROW_LENGTH APB0F401.910
DU_DLONGITUDE(I)=LONGITUDE_STEP_INVERSE* DIVDMP1A.178
& (U_MW(I)-U_MW(I+ROW_LENGTH-1)) DIVDMP1A.179
DV_DLATITUDE2(I)=DV_DLATITUDE(I)+DV_DLATITUDE(I-1+ROW_LENGTH) DIVDMP1A.180
240 CONTINUE DIVDMP1A.181
*ELSE APB0F305.681
DU_DLONGITUDE(START_POINT_NO_HALO-ROW_LENGTH)=0.0 APB0F401.911
DV_DLATITUDE2(START_POINT_NO_HALO)=0.0 APB0F401.912
! No need to do recalculations of end points, but just need to set first APB0F401.913
! point of the arrays. APB0F401.914
*ENDIF APB0F305.686
DIVDMP1A.182
C CALCULATE DIVERGENCES DIVDMP1A.183
DIVDMP1A.184
! Loop over field, missing top and bottom rows and North and South halos APB0F401.915
DO 250 J=START_POINT_NO_HALO,END_P_POINT_NO_HALO ASB1F404.247
D(J)= SEC_P_LATITUDE(J)*.5*(DU_DLONGITUDE(J) DIVDMP1A.186
* + DU_DLONGITUDE(J-ROW_LENGTH) DIVDMP1A.187
* + DV_DLATITUDE2(J)) DIVDMP1A.188
250 CONTINUE DIVDMP1A.189
*IF DEF,MPP GDS1F402.1843
call swapbounds
(d,row_length,tot_p_rows,1,1,1) GDS1F402.1844
*ENDIF GDS1F402.1845
*ELSE DIVDMP1A.190
! Set first point of top row to zero APB0F401.917
DU_DLONGITUDE(START_POINT_NO_HALO-ROW_LENGTH) = 0.0 APB0F401.918
DIVDMP1A.192
C CALCULATE DIVERGENCES DIVDMP1A.193
DIVDMP1A.194
DO 230 J=START_POINT_NO_HALO+1,END_P_POINT_NO_HALO APB0F401.919
D(J)= SEC_P_LATITUDE(J)*.5*(DU_DLONGITUDE(J) DIVDMP1A.196
* + DU_DLONGITUDE(J-ROW_LENGTH) DIVDMP1A.197
* + DV_DLATITUDE(J) + DV_DLATITUDE(J-1)) DIVDMP1A.198
230 CONTINUE DIVDMP1A.199
*IF DEF,MPP GDS1F402.1846
call swapbounds
(d,row_length,tot_p_rows,1,1,1) GDS1F402.1847
*ENDIF GDS1F402.1848
DIVDMP1A.200
C ZERO DIVERGENCES ON BOUNDARIES. DIVDMP1A.201
*IF DEF,MPP APB0F401.920
IF (at_top_of_LPG) THEN APB0F401.921
*ENDIF APB0F401.922
! Loop over Northern row APB0F401.923
DO J=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1 APB0F401.924
D(J)=0.0 APB0F401.925
ENDDO APB0F401.926
*IF DEF,MPP APB0F401.927
ENDIF APB0F401.928
APB0F401.929
IF (at_base_of_LPG) THEN APB0F401.930
*ENDIF APB0F401.931
! Loop over Southern row APB0F401.932
DO J=P_BOT_ROW_START,P_BOT_ROW_START+ROW_LENGTH-1 APB0F401.933
D(J)=0.0 APB0F401.934
ENDDO APB0F401.935
*IF DEF,MPP APB0F401.936
ENDIF APB0F401.937
APB0F401.938
IF (at_left_of_LPG) THEN APB0F401.939
*ENDIF APB0F401.940
! Loop over first point in each row APB0F401.941
DO J=START_POINT_NO_HALO+FIRST_ROW_PT-1, APB0F401.942
& END_P_POINT_NO_HALO,ROW_LENGTH APB0F401.943
D(J)=0.0 APB0F401.944
ENDDO APB0F401.945
*IF DEF,MPP APB0F401.946
ENDIF APB0F401.947
APB0F401.948
IF (at_right_of_LPG) THEN APB0F401.949
*ENDIF APB0F401.950
! Loop over last point in each row APB0F401.951
DO J=START_POINT_NO_HALO+LAST_ROW_PT-1, APB0F401.952
& END_P_POINT_NO_HALO,ROW_LENGTH APB0F401.953
D(J)=0.0 APB0F401.954
ENDDO APB0F401.955
*IF DEF,MPP APB0F401.956
ENDIF APB0F401.957
*ENDIF APB0F401.958
*ENDIF DIVDMP1A.210
DIVDMP1A.211
*IF DEF,GLOBAL DIVDMP1A.212
C CALCULATE DIVERGENCE AT POLES. DIVDMP1A.213
SCALAR = LATITUDE_STEP_INVERSE*SEC_P_LATITUDE(TOP_ROW_START)/ APB0F401.959
& GLOBAL_ROW_LENGTH APB0F401.960
APB0F401.961
SUM_N = 0.0 APB0F401.962
SUM_S = 0.0 APB0F401.963
APB0F401.964
! North Pole APB0F401.965
*IF -DEF,MPP APB0F401.966
! Loop over North Pole row APB0F401.967
DO I=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1 APB0F401.968
SUM_N=SUM_N-V_MW(I) APB0F401.969
ENDDO APB0F401.970
*ELSE APB0F401.971
IF (at_top_of_LPG) THEN APB0F401.972
CALL GCG_RVECSUMR(
U_FIELD,ROW_LENGTH-2*EW_Halo, APB0F401.973
& TOP_ROW_START+FIRST_ROW_PT-1,1, APB0F401.974
& V_MW,GC_ROW_GROUP,info,SUM_N) APB0F401.975
SUM_N=-SUM_N APB0F401.976
*ENDIF APB0F401.977
APB0F401.978
! Set all points on North Pole row to this value APB0F401.979
DO I=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1 APB0F401.980
D(I)=SUM_N APB0F401.981
ENDDO APB0F401.982
*IF DEF,MPP APB0F401.983
ENDIF APB0F401.984
*ENDIF APB0F401.985
APB0F401.986
! South Pole APB0F401.987
*IF -DEF,MPP APB0F401.988
! Loop over South Pole row APB0F401.989
DO I=U_BOT_ROW_START,U_BOT_ROW_START+ROW_LENGTH-1 APB0F401.990
SUM_S=SUM_S+V_MW(I) APB0F401.991
ENDDO APB0F401.992
*ELSE APB0F401.993
IF (at_base_of_LPG) THEN APB0F401.994
CALL GCG_RVECSUMR(
U_FIELD,ROW_LENGTH-2*EW_Halo, APB0F401.995
& U_BOT_ROW_START+FIRST_ROW_PT-1,1, APB0F401.996
& V_MW,GC_ROW_GROUP,info,SUM_S) APB0F401.997
*ENDIF APB0F401.998
APB0F401.999
! Set all points on South Pole row to this value APB0F401.1000
DO I=P_BOT_ROW_START,P_BOT_ROW_START+ROW_LENGTH-1 APB0F401.1001
D(I)=SUM_S APB0F401.1002
ENDDO APB0F401.1003
*IF DEF,MPP APB0F401.1004
ENDIF APB0F401.1005
*ENDIF APB0F401.1006
*ENDIF DIVDMP1A.236
DIVDMP1A.237
CL DIVDMP1A.238
CL--------------------------------------------------------------------- DIVDMP1A.239
CL SECTION 3. CALCULATE D(D)/D(LONGITUDE) DIVDMP1A.240
CL--------------------------------------------------------------------- DIVDMP1A.241
DIVDMP1A.242
! Loop over field, missing top and bottom rows and halos APB0F401.1007
DO 300 I=START_POINT_NO_HALO,END_P_POINT_INC_HALO-1 GDS1F402.1849
D_BY_DLONG(I) = (D(I+1) - D(I))*LONGITUDE_STEP_INVERSE DIVDMP1A.244
300 CONTINUE DIVDMP1A.245
DIVDMP1A.246
CL DIVDMP1A.247
CL--------------------------------------------------------------------- DIVDMP1A.248
CL SECTION 4. CALCULATE D(D)/D(LATITUDE) DIVDMP1A.249
CL UPDATE V FIELD WITH DIVERGENCE. DIVDMP1A.250
CL UPDATE U FIELD WITH DIVERGENCE DIVDMP1A.251
CL IF GLOBAL CALL POLAR_UV TO UPDATE U AND V AT POLE. DIVDMP1A.252
CL--------------------------------------------------------------------- DIVDMP1A.253
DIVDMP1A.254
C---------------------------------------------------------------------- DIVDMP1A.255
CL SECTION 4.1 CALCULATE D(D)/D(LATITUDE) DIVDMP1A.256
C---------------------------------------------------------------------- DIVDMP1A.257
DIVDMP1A.258
! Loop over field, including Northern row but missing Southern row and APB0F401.1009
! top and bottom halos APB0F401.1010
DO 410 I=START_POINT_NO_HALO-ROW_LENGTH, APB0F401.1011
& END_P_POINT_NO_HALO APB0F401.1012
D_BY_DLAT(I) = (D(I)-D(I+ROW_LENGTH))*LATITUDE_STEP_INVERSE DIVDMP1A.260
410 CONTINUE DIVDMP1A.261
DIVDMP1A.262
C---------------------------------------------------------------------- DIVDMP1A.263
CL SECTION 4.2 UPDATE V FIELD WITH DIVERGENCE DIVDMP1A.264
CL UPDATE U FIELD WITH DIVERGENCE DIVDMP1A.265
C---------------------------------------------------------------------- DIVDMP1A.266
DIVDMP1A.267
*IF DEF,GLOBAL DIVDMP1A.268
C GLOBAL MODEL, CALCULATE SECOND V TERM IN EQUATION. DIVDMP1A.269
! Loop over field, including Northern row, but missing Southern row, and APB0F401.1013
! last point of last row, and top and bottom halos APB0F401.1014
DO 420 I=START_POINT_NO_HALO-ROW_LENGTH, APB0F401.1015
& END_P_POINT_NO_HALO-1 APB0F401.1016
D_BY_DLAT2(I) = KD(K)*.5*(D_BY_DLAT(I)+D_BY_DLAT(I+1)) DIVDMP1A.271
* *ADVECTION_TIMESTEP DIVDMP1A.272
420 CONTINUE DIVDMP1A.273
DIVDMP1A.274
C NOW DO END POINTS. DIVDMP1A.275
*IF -DEF,MPP APB0F305.743
! Loop over last point of each row APB0F401.1017
DO 424 I=START_POINT_NO_HALO+LAST_ROW_PT-1, APB0F401.1018
& END_P_POINT_NO_HALO,ROW_LENGTH APB0F401.1019
D_BY_DLAT2(I)= KD(K)*.5*(D_BY_DLAT(I)+ DIVDMP1A.277
* D_BY_DLAT(I+1-ROW_LENGTH))*ADVECTION_TIMESTEP DIVDMP1A.278
C DO END POINTS FOR SECTION 3.1 DIVDMP1A.279
D_BY_DLONG(I)=(D(I+1-ROW_LENGTH)-D(I))*LONGITUDE_STEP_INVERSE DIVDMP1A.280
424 CONTINUE DIVDMP1A.281
DIVDMP1A.282
C DO FIRST END POINT OF SECTION 4.1. DIVDMP1A.283
D_BY_DLAT2(TOP_ROW_START+LAST_ROW_PT-1)= KD(K)*.5* APB0F401.1020
& (D_BY_DLAT(TOP_ROW_START)+ APB0F401.1021
& D_BY_DLAT(TOP_ROW_START+LAST_ROW_PT-1))*ADVECTION_TIMESTEP APB0F401.1022
*ELSE APB0F305.744
D_BY_DLAT2(END_P_POINT_NO_HALO)= APB0F401.1023
& D_BY_DLAT2(END_P_POINT_NO_HALO-1) APB0F401.1024
! MPP Code : No need to do recalculations of end points because cyclic APB0F305.746
! boundary conditions means that halos do this for us automatically APB0F305.747
APB0F305.748
*ENDIF APB0F305.749
DIVDMP1A.286
C UPDATE U AND V FIELDS WITH DIVERGENCE DIVDMP1A.287
DIVDMP1A.288
C UPDATE ALL POINTS. DIVDMP1A.289
! Loop over U field, missing Northern and Southern rows and top and APB0F401.1025
! bottom halos. APB0F401.1026
DO 426 I=START_POINT_NO_HALO,END_U_POINT_NO_HALO-1 GDS1F402.1850
SCALAR=1./(RS_U_GRID(I)*RS_U_GRID(I)*RS_U_GRID(I) DIVDMP1A.291
* *(DELTA_AK(K)+DELTA_BK(K)*PSTAR_OLD(I))) DIVDMP1A.292
U(I,K) = U(I,K) + KD(K)*.5*(D_BY_DLONG(I)+ DIVDMP1A.293
* D_BY_DLONG(I+ROW_LENGTH)) DIVDMP1A.294
* *SEC_U_LATITUDE(I)*ADVECTION_TIMESTEP*SCALAR DIVDMP1A.295
V(I,K) = V(I,K) + D_BY_DLAT2(I)*SCALAR DIVDMP1A.296
426 CONTINUE DIVDMP1A.297
*ELSE DIVDMP1A.298
CL LIMITED AREA MODEL. FIRST,PENULTIMATE AND LAST V VALUES ON A ROW DIVDMP1A.299
CL NOT UPDATED. DIVDMP1A.300
*IF DEF,MPP APB0F401.1028
! For the MPP code this requires a little more code. Only processors APB0F401.1029
! at the left and right of the LPG need to miss points out. APB0F401.1030
! We can also be sneaky and use the code structure to avoid duplicate APB0F401.1031
! calculations by avoiding the halo areas. APB0F401.1032
IF (at_left_of_LPG) THEN APB0F401.1033
row_start_offset=EW_Halo+1 ! Miss halo and first point APB0F401.1034
ELSE APB0F401.1035
row_start_offset=EW_Halo ! Miss halo only APB0F401.1036
ENDIF APB0F401.1037
APB0F401.1038
IF (at_right_of_LPG) THEN APB0F401.1039
row_end_offset=ROW_LENGTH-EW_Halo-2-1 ! Miss last two APB0F401.1040
! ! points and halo APB0F401.1041
ELSE APB0F401.1042
row_end_offset=ROW_LENGTH-EW_Halo-1 ! Miss out halo only APB0F401.1043
ENDIF APB0F401.1044
*ENDIF APB0F401.1045
DO 420 J=START_POINT_NO_HALO,END_U_POINT_NO_HALO,ROW_LENGTH APB0F401.1046
*IF -DEF,MPP APB0F305.750
DO 422 I=J+1,J+ROW_LENGTH-3 DIVDMP1A.302
*ELSE APB0F305.751
DO 422 I=J+row_start_offset,J+row_end_offset APB0F401.1047
*ENDIF APB0F305.763
SCALAR=1./(RS_U_GRID(I)*RS_U_GRID(I)*RS_U_GRID(I) DIVDMP1A.303
* *(DELTA_AK(K)+DELTA_BK(K)*PSTAR_OLD(I))) DIVDMP1A.304
U(I,K) = U(I,K) + KD(K)*.5*(D_BY_DLONG(I)+ DIVDMP1A.305
* D_BY_DLONG(I+ROW_LENGTH)) DIVDMP1A.306
* *SEC_U_LATITUDE(I)*ADVECTION_TIMESTEP*SCALAR DIVDMP1A.307
V(I,K)=V(I,K)+KD(K)*.5*(D_BY_DLAT(I)+ DIVDMP1A.308
* D_BY_DLAT(I+1))*ADVECTION_TIMESTEP*SCALAR DIVDMP1A.309
422 CONTINUE DIVDMP1A.310
420 CONTINUE DIVDMP1A.311
*ENDIF DIVDMP1A.312
*IF DEF,MPP GDS1F402.1851
call swapbounds
(u,row_length,tot_u_rows,1,1,p_levels) GDS1F402.1852
call swapbounds
(v,row_length,tot_u_rows,1,1,p_levels) GDS1F402.1853
*ENDIF GDS1F402.1854
DIVDMP1A.313
C---------------------------------------------------------------------- DIVDMP1A.314
CL SECTION 4.3 GLOBAL MODEL POLAR UPDATE OF U AND V. DIVDMP1A.315
C---------------------------------------------------------------------- DIVDMP1A.316
DIVDMP1A.317
*IF DEF,GLOBAL DIVDMP1A.318
DIVDMP1A.319
CL CALL POLAR_UV TO UPDATE U AND V. DIVDMP1A.320
DIVDMP1A.321
CALL POLAR_UV
(U(1,K),V(1,K),ROW_LENGTH,U_FIELD,1, APB2F401.201
*CALL ARGFLDPT
APB2F401.202
& COS_U_LONGITUDE,SIN_U_LONGITUDE) APB2F401.203
DIVDMP1A.324
*ENDIF DIVDMP1A.325
DIVDMP1A.326
END IF DIVDMP1A.327
CL END LOOP OVER LEVELS DIVDMP1A.328
DIVDMP1A.329
100 CONTINUE DIVDMP1A.330
DIVDMP1A.331
CL END OF ROUTINE DIV_DAMP DIVDMP1A.332
DIVDMP1A.333
RETURN DIVDMP1A.334
END DIVDMP1A.335
*ENDIF DIVDMP1A.336