*IF DEF,A10_1A,OR,DEF,A10_1B ATJ0F402.3
C ******************************COPYRIGHT****************************** GTS2F400.10873
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.10874
C GTS2F400.10875
C Use, duplication or disclosure of this code is subject to the GTS2F400.10876
C restrictions as set forth in the contract. GTS2F400.10877
C GTS2F400.10878
C Meteorological Office GTS2F400.10879
C London Road GTS2F400.10880
C BRACKNELL GTS2F400.10881
C Berkshire UK GTS2F400.10882
C RG12 2SZ GTS2F400.10883
C GTS2F400.10884
C If no contract has been raised with this copy of the code, the use, GTS2F400.10885
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.10886
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.10887
C Modelling at the above address. GTS2F400.10888
C ******************************COPYRIGHT****************************** GTS2F400.10889
C GTS2F400.10890
CLL SUBROUTINE UV_ADJ --------------------------------------------- UVADJ1A.3
CLL UVADJ1A.4
CLL PURPOSE: CALCULATES AND ADDS INCREMENTS TO U AND V USING UVADJ1A.5
CLL EQUATIONS 23 TO 26. UVADJ1A.6
CLL NOT SUITABLE FOR SINGLE COLUMN USE. UVADJ1A.7
CLL UVADJ1A.8
CLL VERSION FOR CRAY Y-MP UVADJ1A.9
CLL UVADJ1A.10
CLL MM, DR <- PROGRAMMER OF SOME OR ALL OF PREVIOUS CODE OR CHANGES UVADJ1A.11
CLL UVADJ1A.12
CLL MODEL MODIFICATION HISTORY FROM MODEL VERSION 3.0: UVADJ1A.13
CLL VERSION DATE UVADJ1A.14
CLL 3.1 24/02/93 Tidy code to remove QA Fortran messages. MM240293.7
CLL 3.4 23/06/94 Argument LLINTS added and passed to CALC_TS GSS1F304.925
CLL DEF NOWHBR replaced by LOGICAL LWHITBROM GSS1F304.926
CLL S.J.Swarbrick GSS1F304.927
CLL UVADJ1A.15
CLL 3.4 06/08/94 Micro tasking directives inserted and code AAD2F304.32
CLL restructured to improve parallel efficiency AAD2F304.33
CLL on C90. AAD2F304.34
CLL Authors: A. Dickinson, D. Salmond AAD2F304.35
CLL Reviewer: M. Mawson AAD2F304.36
! 3.5 28/03/95 MPP code: Change updateable area P.Burton APB0F305.202
! 4.1 02/04/96 Added TYPFLDPT arguments to dynamics routines APB0F401.268
! which allows many of the differences between APB0F401.269
! MPP and "normal" code to be at top level APB0F401.270
! P.Burton APB0F401.271
!LL 4.2 25/10/96 Initialise RECIP_RS_UV before use P.Burton APB1F402.8
!LL 4.2 25/11/96 Corrections to allow LAM to run in MPP mode. ARB2F402.35
!LL RTHBarnes. ARB2F402.36
!LL 4.3 17/01/97 Initialise PHI_OUT diagnostic so that halos GPB1F403.270
!LL contain real data P.Burton GPB1F403.271
C vn4.3 Mar. 97 T3E migration : optimisation changes GSS1F403.744
C D.Salmond GSS1F403.745
!LL 4.4 10/10/97 Correct loop bounds for u_field array GPB1F404.145
!LL P.Burton GPB1F404.146
CLL AAD2F304.37
CLL PROGRAMMING STANDARD: UNIFIED MODEL DOCUMENTATION PAPER NO. 4, UVADJ1A.16
CLL STANDARD B. VERSION 2, DATED 18/01/90 UVADJ1A.17
CLL SYSTEM COMPONENTS COVERED: P111 UVADJ1A.18
CLL UVADJ1A.19
CLL SYSTEM TASK: P1 UVADJ1A.20
CLL UVADJ1A.21
CLL DOCUMENTATION: THE EQUATIONS USED ARE (23) TO (26) UVADJ1A.22
CLL IN UNIFIED MODEL DOCUMENTATION PAPER NO. 10 UVADJ1A.23
CLL M.J.P. CULLEN,T.DAVIES, AND M.H.MAWSON UVADJ1A.24
CLLEND------------------------------------------------------------- UVADJ1A.25
UVADJ1A.26
C UVADJ1A.27
C*L ARGUMENTS:--------------------------------------------------- UVADJ1A.28
SUBROUTINE UV_ADJ 2,14UVADJ1A.29
1 (U,V,THETA,Q,OROG_HEIGHT,PSTAR,F1, MM240293.8
2 F2,F3,SEC_U_LATITUDE,TAN_U_LATITUDE,AK,BK,DELTA_AK, UVADJ1A.31
3 DELTA_BK,LATITUDE_STEP_INVERSE,ADJUSTMENT_TIMESTEP, UVADJ1A.32
4 LONGITUDE_STEP_INVERSE,RS, UVADJ1A.33
*CALL ARGFLDPT
APB0F401.272
5 U_FIELD,P_FIELD,ROW_LENGTH,P_LEVELS, APB0F401.273
6 Q_LEVELS,CALL_NUMBER,AKH,BKH,P_EXNER,
MM240293.9
8 ADJUSTMENT_STEPS,L_PHI_OUT,PHI_OUT,LLINTS, GSS1F304.928
9 LWHITBROM) GSS1F304.929
UVADJ1A.38
IMPLICIT NONE UVADJ1A.39
UVADJ1A.40
LOGICAL UVADJ1A.41
* L_PHI_OUT !IN. TRUE IF PHI OUTPUT REQUIRED AS UVADJ1A.42
* ! DIAGNOSTIC. UVADJ1A.43
*,LLINTS !Switch for linear TS calc in CALC_TS GSS1F304.930
*,LWHITBROM !Switch for White & Bromley terms GSS1F304.931
UVADJ1A.44
INTEGER UVADJ1A.45
* P_FIELD !IN DIMENSION OF FIELDS ON PRESSSURE GRID UVADJ1A.46
*, U_FIELD !IN DIMENSION OF FIELDS ON VELOCITY GRID UVADJ1A.47
*, P_LEVELS !IN NUMBER OF PRESSURE LEVELS. UVADJ1A.49
*, Q_LEVELS !IN NUMBER OF MOIST LEVELS. UVADJ1A.50
*, ROW_LENGTH !IN NUMBER OF POINTS PER ROW UVADJ1A.52
*, CALL_NUMBER
!IN ADJUSTMENT STEP NUMBER UVADJ1A.53
*, ADJUSTMENT_STEPS !IN NUMBER OF ADJUSTMENT STEPS UVADJ1A.54
! All TYPFLDPT arguments are intent IN APB0F401.274
*CALL TYPFLDPT
APB0F401.275
UVADJ1A.55
REAL UVADJ1A.56
* THETA(P_FIELD,P_LEVELS)!INOUT THETA FIELD UVADJ1A.57
*,Q(P_FIELD,Q_LEVELS) !INOUT Q FIELD UVADJ1A.58
*,PSTAR(P_FIELD) !INOUT PSTAR FIELD UVADJ1A.59
*,RS(P_FIELD,P_LEVELS) !INOUT PRIMARY MODEL ARRAY FOR RS FIELD UVADJ1A.60
*,U(U_FIELD,P_LEVELS) !INOUT U FIELD UVADJ1A.61
*,V(U_FIELD,P_LEVELS) !INOUT V FIELD UVADJ1A.62
UVADJ1A.63
REAL UVADJ1A.64
* P_EXNER(P_FIELD,P_LEVELS+1) !IN HOLDS EXNER PRESSURE AT HALF UVADJ1A.65
* ! LEVELS UVADJ1A.66
*,OROG_HEIGHT(P_FIELD) !IN OROGRAPHIC HEIGHT FIELD UVADJ1A.67
UVADJ1A.68
REAL UVADJ1A.69
* DELTA_AK(P_LEVELS) !IN LAYER THICKNESS UVADJ1A.70
*,DELTA_BK(P_LEVELS) !IN LAYER THICKNESS UVADJ1A.71
*,AK(P_LEVELS) !IN VALUE OF A AT P POINTS UVADJ1A.72
*,BK(P_LEVELS) !IN VALUE OF B AT P POINTS UVADJ1A.73
*,AKH(P_LEVELS+1) !IN VALUE OF A AT HALF LEVELS. UVADJ1A.74
*,BKH(P_LEVELS+1) !IN VALUE OF B AT HALF LEVELS. UVADJ1A.75
*,SEC_U_LATITUDE(U_FIELD) !IN 1/COS(LAT) AT U POINTS (2-D ARRAY) UVADJ1A.77
*,TAN_U_LATITUDE(U_FIELD) !IN TAN(LAT) AT U POINTS (2-D ARRAY) UVADJ1A.79
UVADJ1A.82
REAL UVADJ1A.83
* F1(U_FIELD) !IN A CORIOLIS TERM SEE DOCUMENTATION UVADJ1A.84
*,F2(U_FIELD) !IN A CORIOLIS TERM SEE DOCUMENTATION UVADJ1A.85
*,F3(U_FIELD) !IN A CORIOLIS TERM SEE DOCUMENTATION UVADJ1A.86
*,LONGITUDE_STEP_INVERSE !IN 1/LONGITUDE INCREMENT UVADJ1A.87
*,LATITUDE_STEP_INVERSE !IN 1/LATITUDE INCREMENT UVADJ1A.88
*,ADJUSTMENT_TIMESTEP !IN UVADJ1A.89
UVADJ1A.90
REAL UVADJ1A.91
* PHI_OUT(P_FIELD,P_LEVELS) !OUT. PHI DIAGNOSTIC UVADJ1A.92
REAL RECIP GSS1F403.746
UVADJ1A.93
C*--------------------------------------------------------------------- UVADJ1A.94
UVADJ1A.95
C*L DEFINE ARRAYS AND VARIABLES USED IN THIS ROUTINE----------------- UVADJ1A.96
C DEFINE LOCAL ARRAYS: 15 ARE REQUIRED UVADJ1A.97
UVADJ1A.98
REAL UVADJ1A.99
* DPHI_BY_DLATITUDE !HOLDS HORIZONTAL PRESSURE GRADIENT GSS1F403.747
* !IN X-DIRECTION AT U POINTS UVADJ1A.101
*,DPHI_BY_DLONGITUDE !HOLDS HORIZONTAL PRESSURE GRADIENT GSS1F403.748
* !IN Y-DIRECTION AT U POINTS UVADJ1A.103
*,P(P_FIELD) !HOLDS PRESSURE AT A MODEL LEVEL UVADJ1A.104
*,RECIP_RS_UV(U_FIELD,P_LEVELS) !HOLDS 1/RS AT U POINTS AAD2F304.38
*,PHI_FULL_LEVEL(P_FIELD) !HOLDS GEOPOTENTIAL AT A FULL LEVEL UVADJ1A.106
*,PHI_HALF_LEVEL(P_FIELD,P_LEVELS) !HOLDS GEOPOT AT A HALF LEVEL AAD2F304.39
*,DELTA_P_P_EXNER_BY_DELTAP(P_FIELD) ! UVADJ1A.108
UVADJ1A.109
REAL UVADJ1A.110
* THETAS(P_FIELD,P_LEVELS) !HOLDS THETAV + MU*THETAS AAD2F304.40
*,TS(P_FIELD) !HOLDS STANDARD TEMPERATURE UVADJ1A.128
*,WORK_U(U_FIELD) !GENERAL WORKSPACE FOR VARIABLES UVADJ1A.129
* !AT U POINTS UVADJ1A.130
*,WORK_P(P_FIELD) !GENERAL WORKSPACE FOR VARIABLES UVADJ1A.131
* !AT P POINTS UVADJ1A.132
*,U_TEMP_R(U_FIELD),V_TEMP_R(U_FIELD) GSS1F403.749
*,U_TEMP_L(U_FIELD),V_TEMP_L(U_FIELD) GSS1F403.750
INTEGER IP,IJP GSS1F403.751
UVADJ1A.133
C*--------------------------------------------------------------------- UVADJ1A.134
C DEFINE LOCAL VARIABLES UVADJ1A.135
INTEGER POINTS ! Number of points with valid part of field APB0F401.276
UVADJ1A.145
*IF DEF,MPP APB0F305.207
*IF DEF,GLOBAL APB0F305.208
INTEGER info APB0F401.277
*ELSE APB0F305.211
INTEGER row_start_offset,row_end_offset APB0F401.278
! offsets required to mark out the updatable area for LAM MPP code APB0F401.279
*ENDIF APB0F305.213
*ENDIF APB0F305.215
REAL UVADJ1A.146
* HALF_ADJUSTMENT_TIMESTEP UVADJ1A.147
*, RECIP_G UVADJ1A.148
*IF DEF,GLOBAL APB0F401.280
INTEGER np,sp ! points in field refering to poles APB0F401.281
REAL APB0F401.282
& MU_NORTH_POLE(P_LEVELS) ! MU at North Pole APB0F401.283
&, MU_SOUTH_POLE(P_LEVELS) ! MU at South Pole APB0F401.284
*ENDIF UVADJ1A.153
UVADJ1A.154
C COUNT VARIABLES FOR DO LOOPS ETC. UVADJ1A.155
INTEGER UVADJ1A.156
* I,IJ,IK,K UVADJ1A.157
C WORK-SPACE SCALARS UVADJ1A.158
REAL UVADJ1A.159
* TEMP1,TEMP2 UVADJ1A.160
* ,PKP1,PK ! Pressures at half levels k+1 and k UVADJ1A.161
* ,c1,c2,WORK_V GSS1F403.752
C LOGICAL VARIABLE UVADJ1A.162
LOGICAL UVADJ1A.163
* CONSTANT_PRESSURE ! TRUE IF ON A CONSTANT PRESSURE SURFACE UVADJ1A.164
UVADJ1A.165
C*L EXTERNAL SUBROUTINE CALLS:--------------------------------------- UVADJ1A.166
UVADJ1A.167
EXTERNAL P_TO_UV,POLAR_UV,UV_TO_P UVADJ1A.168
* ,CALC_TS,CALC_RS GSS1F304.932
C*--------------------------------------------------------------------- UVADJ1A.172
CL CALL COMDECK TO OBTAIN CONSTANTS USED. UVADJ1A.173
UVADJ1A.174
*CALL C_UVADJ
UVADJ1A.175
UVADJ1A.176
CL MAXIMUM VECTOR LENGTH ASSUMED IS P_FIELD UVADJ1A.177
CL--------------------------------------------------------------------- UVADJ1A.178
CL INTERNAL STRUCTURE INCLUDING SUBROUTINE CALLS: UVADJ1A.179
CL--------------------------------------------------------------------- UVADJ1A.180
CL UVADJ1A.181
*CALL P_EXNERC
UVADJ1A.182
UVADJ1A.183
CL--------------------------------------------------------------------- UVADJ1A.184
CL SECTION 1. INITIALISATION UVADJ1A.185
CL--------------------------------------------------------------------- UVADJ1A.186
C INCLUDE LOCAL CONSTANTS FROM GENERAL CONSTANTS BLOCK UVADJ1A.187
UVADJ1A.188
POINTS=LAST_P_VALID_PT-FIRST_VALID_PT+1 APB0F401.285
! Number of points to be processed by CALC_RS/TS. For non-MPP runs APB0F401.286
! this is simply P_FIELD, for MPP, it is all the points, minus any APB0F401.287
! unused halo areas (ie. the halo above North pole row, and beneath APB0F401.288
! South pole row) APB0F401.289
APB0F401.290
HALF_ADJUSTMENT_TIMESTEP = ADJUSTMENT_TIMESTEP*.5 UVADJ1A.195
RECIP_G = 1./G UVADJ1A.196
UVADJ1A.197
CL SET PHI_HALF_LEVEL FOR LEVEL 1/2 = OROG_HEIGHT * G UVADJ1A.198
! loop over all points, including valid halos APB0F401.291
DO 100 I=FIRST_VALID_PT,LAST_P_VALID_PT APB0F401.292
PHI_HALF_LEVEL(I,1) = OROG_HEIGHT(I) * G AAD2F304.41
100 CONTINUE UVADJ1A.201
UVADJ1A.202
CL LOOP OVER ALL PRESSURE LEVELS. UVADJ1A.203
UVADJ1A.204
DO K=1,P_LEVELS AAD2F304.42
UVADJ1A.206
CL--------------------------------------------------------------------- UVADJ1A.207
CL IF (.NOT.LWHITBROM) THEN GSS1F304.933
CL SECTION 2. STORE RADIUS OF EARTH IN HORIZONTAL FIELD. UVADJ1A.209
CL ELSE GSS1F304.934
CL SECTION 2. CALCULATE RS AT LEVEL K. UVADJ1A.211
CL END IF GSS1F304.935
CL--------------------------------------------------------------------- UVADJ1A.213
UVADJ1A.214
C---------------------------------------------------------------------- UVADJ1A.215
CL IF (.NOT.LWHITBROM) THEN GSS1F304.936
CL SECTION 2.1. STORE RADIUS OF EARTH IN HORIZONTAL FIELD. UVADJ1A.217
CL ELSE GSS1F304.937
CL SECTION 2.1. CALL CALC_RS TO GET RS ON FIRST CALL ONLY. UVADJ1A.219
CL ALSO RETURNS TS SAVING CALL TO CALC_TS IN 3.4 UVADJ1A.220
CL END IF GSS1F304.938
C---------------------------------------------------------------------- UVADJ1A.222
UVADJ1A.223
IF (.NOT.LWHITBROM) THEN GSS1F304.939
! loop over all points, including valid halos APB0F401.293
DO 210 I=1,P_FIELD APB0F401.294
RS(I,K) = A UVADJ1A.226
210 CONTINUE UVADJ1A.227
DO I=1,U_FIELD GPB1F404.147
RECIP_RS_UV(I,K)=1.0 GPB1F404.148
ENDDO GPB1F404.149
ELSE GSS1F304.940
IF(CALL_NUMBER.EQ.1) THEN
UVADJ1A.229
! QAN fix APB0F401.295
DO I=1,P_FIELD APB0F401.296
RS(I,K)=1.0 APB0F401.297
ENDDO APB0F401.298
DO I=1,U_FIELD GPB1F404.150
RECIP_RS_UV(I,K)=1.0 GPB1F404.151
ENDDO GPB1F404.152
IF(K.NE.1) THEN UVADJ1A.230
CALL CALC_RS
(PSTAR(FIRST_VALID_PT),AK,BK,TS(FIRST_VALID_PT), APB0F401.299
& RS(FIRST_VALID_PT,K-1), APB0F401.300
& RS(FIRST_VALID_PT,K), APB0F401.301
& POINTS,K,P_LEVELS,LLINTS) APB0F401.302
ELSE UVADJ1A.233
C IF LEVEL 1 CALC_RS NEEDS A DUMMY ARRAY IN PLACE OF RS( ,K-1) UVADJ1A.234
CALL CALC_RS
(PSTAR(FIRST_VALID_PT),AK,BK,TS(FIRST_VALID_PT), APB0F401.303
& RS(FIRST_VALID_PT,K+1), APB0F401.304
& RS(FIRST_VALID_PT,K), APB0F401.305
& POINTS,K,P_LEVELS,LLINTS) APB0F401.306
END IF UVADJ1A.237
END IF UVADJ1A.238
ENDIF ! LWHITBROM GSS1F304.943
UVADJ1A.240
C---------------------------------------------------------------------- UVADJ1A.241
CL IF (.NOT.LWHITBROM) THEN GSS1F304.944
CL SECTION 2.2. STORE 1./RADIUS OF EARTH IN HORIZONTAL FIELD. UVADJ1A.243
CL ELSE GSS1F304.945
CL SECTION 2.2. CALL P_TO_UV TO GET RS AT U POINTS. UVADJ1A.245
CL END IF GSS1F304.946
C---------------------------------------------------------------------- UVADJ1A.247
UVADJ1A.248
IF (.NOT.LWHITBROM) THEN GSS1F304.947
! loop over all points, including valid halos APB0F401.307
DO 220 I=FIRST_VALID_PT,LAST_U_VALID_PT APB0F401.308
RECIP_RS_UV(I,K) = 1./A AAD2F304.43
220 CONTINUE UVADJ1A.252
ELSE GSS1F304.948
C STORE RS AT U POINTS IN RECIP_RS_UV UVADJ1A.254
UVADJ1A.255
CALL P_TO_UV
(RS(1,K),RECIP_RS_UV(1,K),P_FIELD, AAD2F304.44
& U_FIELD,ROW_LENGTH,tot_P_ROWS) APB0F401.309
! loop over "local" points - not including top and bottom halos APB0F401.310
DO I=FIRST_FLD_PT,LAST_U_FLD_PT APB0F401.311
RECIP_RS_UV(I,K) = 1./RECIP_RS_UV(I,K) AAD2F304.46
ENDDO AAD2F304.47
UVADJ1A.258
ENDIF GSS1F304.949
ENDDO AAD2F304.48
*IF DEF,MPP APB0F401.312
IF (LWHITBROM) THEN APB0F401.313
CALL SWAPBOUNDS
(RECIP_RS_UV,ROW_LENGTH,tot_P_ROWS, APB0F401.314
& EW_Halo,NS_Halo,P_LEVELS) APB0F401.315
ENDIF APB0F401.316
*ENDIF APB0F401.317
CL--------------------------------------------------------------------- UVADJ1A.260
CL SECTION 3. CALCULATE PHI AT LEVEL K-1/2, EXNER AT LEVEL K, UVADJ1A.261
CL IF (.NOT.LWHITBROM) THEN GSS1F304.950
CL AND THETAV. UVADJ1A.263
CL ELSE GSS1F304.951
CL AND THETAV + MU * THETAS AT LEVEL K. UVADJ1A.265
CL END IF GSS1F304.952
CL--------------------------------------------------------------------- UVADJ1A.267
*IF DEF,GLOBAL APB0F401.318
! Set up array of MU values at poles for use in section 3.5 APB0F305.232
! put into north_pole_mu(level) and south_pole_mu(level) APB0F305.233
IF (LWHITBROM) THEN APB0F401.319
! North Pole first APB0F401.320
*IF DEF,MPP APB0F401.321
IF (MY_PROC_ID .EQ. NP_PROC_ID) THEN APB0F401.322
*ENDIF APB0F401.323
np=TOP_ROW_START+FIRST_ROW_PT-1 APB0F401.324
DO K=1,P_LEVELS APB0F401.325
MU_NORTH_POLE(K)=(U(np,K)*U(np,K)+V(np,K)*V(np,K))/ APB0F401.326
& RS(np,K)*RECIP_G APB0F401.327
ENDDO APB0F401.328
*IF DEF,MPP APB0F401.329
ENDIF APB0F401.330
IF (at_top_of_LPG) THEN APB0F401.331
! Send this array to everyone on top processor row APB0F401.332
CALL GCG_RBCAST(
123,P_LEVELS,NP_PROC_ID, APB0F401.333
& GC_ROW_GROUP,info,MU_NORTH_POLE) APB0F401.334
ENDIF APB0F401.335
*ENDIF APB0F401.336
APB0F401.337
! And now the South Pole APB0F401.338
*IF DEF,MPP APB0F401.339
IF (MY_PROC_ID .EQ. SP_PROC_ID) THEN APB0F401.340
*ENDIF APB0F401.341
sp=U_BOT_ROW_START+LAST_ROW_PT-1 APB0F401.342
DO K=1,P_LEVELS APB0F401.343
MU_SOUTH_POLE(K)=(U(sp,K)*U(sp,K)+V(sp,K)*V(sp,K))/ APB0F401.344
& RS(sp+ROW_LENGTH,K)*RECIP_G APB0F401.345
ENDDO APB0F401.346
*IF DEF,MPP APB0F401.347
ENDIF APB0F401.348
IF (at_base_of_LPG) THEN APB0F401.349
! Send this array to everyone on bottom processor row APB0F401.350
CALL GCG_RBCAST(
321,P_LEVELS,SP_PROC_ID, APB0F401.351
& GC_ROW_GROUP,info,MU_SOUTH_POLE) APB0F401.352
ENDIF APB0F401.353
*ENDIF APB0F401.354
ENDIF ! IF (LWHITBROM) APB0F401.355
*ENDIF APB0F305.259
UVADJ1A.268
cmic$ do all shared (adjustment_timestep, ak, akh, bk, bkh, c_virtual) AAD2F304.49
cmic$* shared (cp, delta_ak, delta_bk) APB0F401.356
cmic$* shared (epsilon, f1, f2, f3, half_adjustment_timestep) AAD2F304.51
cmic$* shared ( kappa) AAD2F304.52
cmic$* shared (longitude_step_inverse, p_exner, p_field) AAD2F304.53
cmic$* shared (p_levels, phi_half_level, phi_out) APB0F401.357
cmic$* shared (pstar, q, q_levels, r, recip_g, row_length) APB0F401.358
cmic$* shared (rs, sec_u_latitude, points) APB0F401.359
cmic$* shared (tan_u_latitude, theta, thetas, u, u_field, v) AAD2F304.57
cmic$* shared (call_number, lwhitbrom, llints) AAD2F304.58
*CALL CMICFLD
APB0F401.360
cmic$* private (constant_pressure, delta_p_p_exner_by_deltap) AAD2F304.59
cmic$* private (dphi_by_dlatitude, dphi_by_dlatitude_p) AAD2F304.60
cmic$* private (dphi_by_dlongitude, dphi_by_dlongitude_p) AAD2F304.61
cmic$* private(dppebd_by_dlatitude_p,dppebd_by_dlongitude_p,i,ij) AAD2F304.62
cmic$* private (k, kappa_dum, p, p_exl_dum, p_exu_dum) AAD2F304.63
cmic$* private (phi_full_level, pk, pkp1, pl_dum, pu_dum) AAD2F304.64
cmic$* shared (recip_rs_uv) AAD2F304.65
cmic$* private (temp1, temp2, ts, work_p, work_u) AAD2F304.66
cmic$* shared (MU_NORTH_POLE, MU_SOUTH_POLE) APB3F402.1
DO K=1,P_LEVELS AAD2F304.68
UVADJ1A.279
C---------------------------------------------------------------------- UVADJ1A.280
CL SECTION 3.2. CALCULATE EXNER AT LEVEL K. UVADJ1A.281
C---------------------------------------------------------------------- UVADJ1A.282
C STORE EXNER AT LEVEL K IN WORK_P UVADJ1A.283
! loop over all points, including valid halos APB0F401.361
DO 320 I= FIRST_VALID_PT,LAST_P_VALID_PT APB0F401.362
PKP1 = AKH(K+1) + BKH(K+1)*PSTAR(I) UVADJ1A.285
PK = AKH(K) + BKH(K) *PSTAR(I) UVADJ1A.286
WORK_P(I) = P_EXNER_C UVADJ1A.287
+ (P_EXNER(I,K+1),P_EXNER(I,K),PKP1,PK,KAPPA) UVADJ1A.288
320 CONTINUE UVADJ1A.289
UVADJ1A.290
IF (LWHITBROM) THEN GSS1F304.953
C---------------------------------------------------------------------- UVADJ1A.293
CL SECTION 3.3. CALCULATES PRESSURE AT LEVEL K NEEDED FOR CALL UVADJ1A.294
CL TO CALC_TS. PERFORMED ONLY IF CALL_NUMBER > 1. UVADJ1A.295
C---------------------------------------------------------------------- UVADJ1A.296
UVADJ1A.297
IF(BK(K).EQ.0.) THEN UVADJ1A.298
C SET CONSTANT_PRESSURE BEFORE CALL TO TS AND P AT START ADDRESS AS UVADJ1A.299
C THIS IS ALL TS NEEDS IN THIS CASE. UVADJ1A.300
CONSTANT_PRESSURE = .TRUE. UVADJ1A.301
P(FIRST_VALID_PT) = AK(K) APB0F401.363
ELSE UVADJ1A.303
C SET CONSTANT_PRESSURE BEFORE CALL TO TS AND P. UVADJ1A.304
! loop over all points, including valid halos APB0F401.364
DO 330 I=FIRST_VALID_PT,LAST_P_VALID_PT APB0F401.365
P(I) = AK(K) + BK(K)*PSTAR(I) UVADJ1A.306
330 CONTINUE UVADJ1A.307
CONSTANT_PRESSURE = .FALSE. UVADJ1A.308
END IF UVADJ1A.309
UVADJ1A.310
C---------------------------------------------------------------------- UVADJ1A.311
CL SECTION 3.4. CALL CALC_TS TO GET STANDARD TEMPERATURE. UVADJ1A.312
CL ONLY CALLED IF CALL_NUMBER GREATER THAN 1 UVADJ1A.313
CL AS TS CALCULATED IN SECTION 2.1 ON CALL_NUMBER 1. UVADJ1A.314
CL THEN CALCULATE THETAS BY DIVIDING BY EXNER. UVADJ1A.315
C---------------------------------------------------------------------- UVADJ1A.316
C EXNER AT LEVEL K IS IN WORK_P UVADJ1A.317
UVADJ1A.318
CALL CALC_TS
(P(FIRST_VALID_PT),TS(FIRST_VALID_PT),POINTS, APB0F401.366
& CONSTANT_PRESSURE,LLINTS) APB0F401.367
UVADJ1A.321
C Convert TS to THETAS UVADJ1A.322
! loop over all valid points - including top and bottom halos APB0F401.368
DO 340 I=FIRST_VALID_PT,LAST_P_VALID_PT APB0F401.369
THETAS(I,K) = TS(I)/WORK_P(I) AAD2F304.69
340 CONTINUE UVADJ1A.325
UVADJ1A.326
C---------------------------------------------------------------------- UVADJ1A.327
CL SECTION 3.5. CALCULATE MU UVADJ1A.328
CL CALCULATE 1/RS AT U POINTS. UVADJ1A.329
C---------------------------------------------------------------------- UVADJ1A.330
UVADJ1A.331
C MU IS CALCULATED AT U POINTS AND HELD IN WORK_U UVADJ1A.332
! QAN fix APB0F401.370
DO I=1,U_FIELD APB0F401.371
WORK_U(I)=0.0 APB0F401.372
ENDDO APB0F401.373
! loop over all points, including valid halos APB0F401.374
DO 350 I=FIRST_VALID_PT,LAST_U_VALID_PT APB0F401.375
WORK_U(I) = (F2(I)*U(I,K) - F1(I)*V(I,K) + UVADJ1A.336
* (U(I,K)*U(I,K)+V(I,K)*V(I,K))*RECIP_RS_UV(I,K))* AAD2F304.70
* RECIP_G UVADJ1A.338
350 CONTINUE UVADJ1A.339
C CALL UV_TO_P TO INTERPOLATE MU ONTO P-GRID HELD IN WORK_P UVADJ1A.340
UVADJ1A.341
CALL UV_TO_P
(WORK_U(START_POINT_NO_HALO-ROW_LENGTH), APB0F401.376
& WORK_P(START_POINT_NO_HALO), APB0F401.377
& U_FIELD-(START_POINT_NO_HALO-ROW_LENGTH)+1, APB0F401.378
& P_FIELD-START_POINT_NO_HALO+1, APB0F401.379
& ROW_LENGTH,upd_P_ROWS+1) APB0F401.380
UVADJ1A.344
*IF DEF,GLOBAL UVADJ1A.345
! Set WORK at poles to MU APB0F401.381
*ELSE APB0F401.382
! Set WORK at North and South edges to one row in APB0F401.383
*ENDIF APB0F401.384
*IF DEF,MPP APB0F401.385
IF (at_top_of_LPG) THEN APB0F401.386
*ENDIF APB0F401.387
DO I=TOP_ROW_START,TOP_ROW_START+ROW_LENGTH-1 APB0F401.388
*IF DEF,GLOBAL APB0F401.389
WORK_P(I) = MU_NORTH_POLE(K) APB0F401.390
*ELSE APB0F401.391
WORK_P(I) = WORK_P(I+ROW_LENGTH) APB0F401.392
*ENDIF APB0F401.393
ENDDO APB0F401.394
*IF DEF,MPP APB0F401.395
ENDIF APB0F401.396
IF (at_base_of_LPG) THEN APB0F401.397
*ENDIF APB0F401.398
DO I=P_BOT_ROW_START,P_BOT_ROW_START+ROW_LENGTH-1 APB0F401.399
*IF DEF,GLOBAL APB0F401.400
WORK_P(I) = MU_SOUTH_POLE(K) APB0F401.401
*ELSE APB0F401.402
WORK_P(I) = WORK_P(I-ROW_LENGTH) APB0F401.403
*ENDIF APB0F401.404
ENDDO APB0F401.405
*IF DEF,MPP APB0F401.406
ENDIF APB0F401.407
*ENDIF APB0F401.408
UVADJ1A.366
C---------------------------------------------------------------------- UVADJ1A.367
CL SECTION 3.6. CALCULATE THETAV + MU * THETAS UVADJ1A.368
C---------------------------------------------------------------------- UVADJ1A.369
UVADJ1A.370
IF(K.LE.Q_LEVELS) THEN UVADJ1A.371
! loop over all points - including top and bottom halos APB0F401.409
DO 360 I=FIRST_VALID_PT,LAST_P_VALID_PT APB0F401.410
THETAS(I,K) = THETA(I,K)*(1.+ C_VIRTUAL AAD2F304.71
* *Q(I,K))+ WORK_P(I)*THETAS(I,K) AAD2F304.72
360 CONTINUE UVADJ1A.375
ELSE UVADJ1A.376
! loop over all points - including top and bottom halos APB0F401.411
DO 362 I=FIRST_VALID_PT,LAST_P_VALID_PT APB0F401.412
THETAS(I,K) = THETA(I,K) + WORK_P(I)*THETAS(I,K) AAD2F304.73
362 CONTINUE UVADJ1A.379
END IF UVADJ1A.380
GSS1F304.955
ELSE ! LWHITBROM GSS1F304.956
UVADJ1A.382
C---------------------------------------------------------------------- UVADJ1A.383
CL SECTION 3.3. CALCULATE THETAV UVADJ1A.384
C---------------------------------------------------------------------- UVADJ1A.385
UVADJ1A.386
IF(K.LE.Q_LEVELS) THEN UVADJ1A.387
! loop over all points, including valid halos APB0F401.413
DO 460 I=FIRST_VALID_PT,LAST_P_VALID_PT APB0F401.414
THETAS(I,K) = THETA(I,K)*(1.+ C_VIRTUAL AAD2F304.74
* *Q(I,K)) UVADJ1A.390
460 CONTINUE GSS1F304.958
ELSE UVADJ1A.392
! loop over all points, including valid halos APB0F401.415
DO 462 I=FIRST_VALID_PT,LAST_P_VALID_PT APB0F401.416
THETAS(I,K) = THETA(I,K) AAD2F304.75
462 CONTINUE GSS1F304.960
END IF UVADJ1A.396
GSS1F304.961
END IF ! LWHITBROM GSS1F304.962
UVADJ1A.398
AAD2F304.82
ENDDO AAD2F304.83
APB0F401.417
*IF DEF,MPP APB0F401.418
IF (LWHITBROM) THEN APB0F401.419
CALL SWAPBOUNDS
(THETAS,ROW_LENGTH,tot_P_ROWS, APB0F401.420
& EW_Halo,NS_Halo,P_LEVELS) APB0F401.421
ENDIF APB0F401.422
*ENDIF APB0F401.423
APB0F401.424
c1=.5*LONGITUDE_STEP_INVERSE*ADJUSTMENT_TIMESTEP GSS1F403.753
c2=.5*LATITUDE_STEP_INVERSE*ADJUSTMENT_TIMESTEP GSS1F403.754
AAD2F304.84
cmic$ do all shared (adjustment_timestep, ak, akh, bk, bkh, c_virtual) AAD2F304.91
cmic$* shared (cp, delta_ak, delta_bk) APB0F401.433
cmic$* shared (epsilon, f1, f2, f3, half_adjustment_timestep) AAD2F304.93
cmic$* shared ( kappa) AAD2F304.94
cmic$* shared (l_phi_out, latitude_step_inverse) AAD2F304.95
cmic$* shared (longitude_step_inverse, p_exner, p_field) AAD2F304.96
cmic$* shared (p_levels, phi_half_level, phi_out) APB0F401.434
cmic$* shared (pstar, q, q_levels, r, recip_g, row_length) APB0F401.435
cmic$* shared (rs, sec_u_latitude) APB0F401.436
*CALL CMICFLD
APB0F401.437
cmic$* shared (tan_u_latitude, theta, thetas, u, u_field, v) AAD2F304.100
cmic$* private (constant_pressure, delta_p_p_exner_by_deltap) AAD2F304.101
cmic$* private (dphi_by_dlatitude, dphi_by_dlatitude_p) AAD2F304.102
cmic$* private (dphi_by_dlongitude, dphi_by_dlongitude_p) AAD2F304.103
cmic$* private(dppebd_by_dlatitude_p,dppebd_by_dlongitude_p,i,ij) AAD2F304.104
cmic$* private (k, kappa_dum, p, p_exl_dum, p_exu_dum) AAD2F304.105
cmic$* private (phi_full_level, pk, pkp1, pl_dum, pu_dum) AAD2F304.106
cmic$* shared (recip_rs_uv) AAD2F304.107
cmic$* private (ik,temp1, temp2, ts, work_p, work_u) AAD2F304.108
cmic$* shared (c1,c2) GSS1F403.755
cmic$* private (work_v,u_temp,v_temp) GSS1F403.756
DO 110 K=1,P_LEVELS AAD2F304.109
UVADJ1A.406
CL--------------------------------------------------------------------- GSS1F403.757
CL SECTION 4. CALCULATE PHI AT LEVEL K, EQUATION (26). GSS1F403.758
CL--------------------------------------------------------------------- GSS1F403.759
C---------------------------------------------------------------------- GSS1F403.760
CL SECTION 4.1. CALCULATE PHI AT LEVEL K GSS1F403.761
C---------------------------------------------------------------------- GSS1F403.762
TEMP2 = 1./(KAPPA+1.) UVADJ1A.407
GSS1F403.763
if(k.ne.p_levels.and.k.ne.1)then GSS1F403.764
GSS1F403.765
cdir$ nosplit GSS1F403.766
! loop over all points, including valid halos APB0F401.438
DO I=FIRST_VALID_PT,LAST_P_VALID_PT GSS1F403.767
PHI_HALF_LEVEL(I,K) = PHI_HALF_LEVEL(I,K)+PHI_HALF_LEVEL(I,K-1) GSS1F403.768
PHI_HALF_LEVEL(I,K+1) = -CP*THETAS(I,K)* GSS1F403.769
& (P_EXNER(I,K+1) - P_EXNER(I,K) ) GSS1F403.770
DELTA_P_P_EXNER_BY_DELTAP(I) = (P_EXNER(I,K+1)* UVADJ1A.410
* (AKH(K+1)+BKH(K+1)*PSTAR(I)) - UVADJ1A.411
* P_EXNER(I,K)*(AKH(K)+BKH(K)*PSTAR(I))) UVADJ1A.412
* / (DELTA_AK(K)+DELTA_BK(K)*PSTAR(I))*TEMP2 UVADJ1A.413
PHI_FULL_LEVEL(I) = PHI_HALF_LEVEL(I,K) + CP*THETAS(I,K)* GSS1F403.771
* (P_EXNER(I,K) - DELTA_P_P_EXNER_BY_DELTAP(I)) GSS1F403.772
ENDDO GSS1F403.773
GSS1F403.774
else if(k.eq.1)then GSS1F403.775
GSS1F403.776
cdir$ nosplit GSS1F403.777
! loop over all points, including valid halos GSS1F403.778
DO I=FIRST_VALID_PT,LAST_P_VALID_PT GSS1F403.779
PHI_HALF_LEVEL(I,K+1) = -CP*THETAS(I,K)* GSS1F403.780
& (P_EXNER(I,K+1) - P_EXNER(I,K) ) GSS1F403.781
DELTA_P_P_EXNER_BY_DELTAP(I) = (P_EXNER(I,K+1)* GSS1F403.782
* (AKH(K+1)+BKH(K+1)*PSTAR(I)) - GSS1F403.783
* P_EXNER(I,K)*(AKH(K)+BKH(K)*PSTAR(I))) GSS1F403.784
* / (DELTA_AK(K)+DELTA_BK(K)*PSTAR(I))*TEMP2 GSS1F403.785
PHI_FULL_LEVEL(I) = PHI_HALF_LEVEL(I,K) + CP*THETAS(I,K)* GSS1F403.786
* (P_EXNER(I,K) - DELTA_P_P_EXNER_BY_DELTAP(I)) GSS1F403.787
ENDDO GSS1F403.788
GSS1F403.789
else if(k.eq.p_levels)then GSS1F403.790
GSS1F403.791
cdir$ nosplit GSS1F403.792
! loop over all points, including valid halos GSS1F403.793
DO I=FIRST_VALID_PT,LAST_P_VALID_PT GSS1F403.794
PHI_HALF_LEVEL(I,K) = PHI_HALF_LEVEL(I,K)+PHI_HALF_LEVEL(I,K-1) GSS1F403.795
DELTA_P_P_EXNER_BY_DELTAP(I) = (P_EXNER(I,K+1)* GSS1F403.796
* (AKH(K+1)+BKH(K+1)*PSTAR(I)) - GSS1F403.797
* P_EXNER(I,K)*(AKH(K)+BKH(K)*PSTAR(I))) GSS1F403.798
* / (DELTA_AK(K)+DELTA_BK(K)*PSTAR(I))*TEMP2 GSS1F403.799
C CALCULATE PHI AT LEVEL K UVADJ1A.414
PHI_FULL_LEVEL(I) = PHI_HALF_LEVEL(I,K) + CP*THETAS(I,K)* AAD2F304.110
* (P_EXNER(I,K) - DELTA_P_P_EXNER_BY_DELTAP(I)) UVADJ1A.416
ENDDO GSS1F403.800
UVADJ1A.418
endif GSS1F403.801
GSS1F403.802
CL COPY PHI_FULL_LEVEL INTO OUTPUT ARRAY IF DIAGNOSTIC REQUIRED. UVADJ1A.419
UVADJ1A.420
IF(L_PHI_OUT) THEN UVADJ1A.421
! loop over all points, including valid halos APB0F401.440
DO I=FIRST_VALID_PT,LAST_P_VALID_PT APB0F401.441
PHI_OUT(I,K) = PHI_FULL_LEVEL(I) UVADJ1A.423
END DO UVADJ1A.424
*IF DEF,MPP GPB1F403.272
! Initialise whole array so there are no NaNs for STASH to fall GPB1F403.273
! over on GPB1F403.274
DO I=1,FIRST_VALID_PT-1 GPB1F403.275
PHI_OUT(I,K)=PHI_OUT(FIRST_VALID_PT,K) GPB1F403.276
ENDDO GPB1F403.277
DO I=LAST_P_VALID_PT+1,P_FIELD GPB1F403.278
PHI_OUT(I,K)=PHI_OUT(LAST_P_VALID_PT,K) GPB1F403.279
ENDDO GPB1F403.280
*ENDIF GPB1F403.281
END IF UVADJ1A.425
UVADJ1A.426
CL--------------------------------------------------------------------- UVADJ1A.427
CL SECTION 5. CALCULATE HORIZONTAL PRESSURE GRADIENTS. UVADJ1A.428
CL THEN CALCULATE CORIOLIS TERM AND IMPLICITLY UPDATE UVADJ1A.429
CL U AND V. EQUATIONS (23) TO (25). UVADJ1A.430
CL--------------------------------------------------------------------- UVADJ1A.431
C---------------------------------------------------------------------- UVADJ1A.433
CL SECTION 5.1. CALCULATE HORIZONTAL PRESSURE GRADIENT, UVADJ1A.434
CL D(PHI)/D(LONGITUDE). UVADJ1A.435
C---------------------------------------------------------------------- UVADJ1A.436
C---------------------------------------------------------------------- GSS1F403.803
CL SECTION 5.2. CALCULATE HORIZONTAL PRESSURE GRADIENT, GSS1F403.804
CL D(PHI)/D(LATITUDE). GSS1F403.805
C---------------------------------------------------------------------- GSS1F403.806
C---------------------------------------------------------------------- GSS1F403.807
CL SECTION 5.3. UPDATE U AND V USING IMPLICIT GSS1F403.808
CL TREATMENT OF CORIOLIS TERMS. GSS1F403.809
C---------------------------------------------------------------------- GSS1F403.810
UVADJ1A.437
*IF -DEF,GLOBAL GSS1F403.811
*IF DEF,MPP APB0F401.445
IF (at_left_of_LPG) THEN GSS1F403.812
*ENDIF APB0F401.453
DO I=START_POINT_NO_HALO + FIRST_ROW_PT-1, GSS1F403.813
& END_U_POINT_NO_HALO,ROW_LENGTH GSS1F403.814
U_TEMP_L(I)=U(I,K) GSS1F403.815
V_TEMP_L(I)=V(I,K) GSS1F403.816
ENDDO GSS1F403.817
*IF DEF,MPP APB0F401.456
ENDIF GSS1F403.818
IF (at_right_of_LPG) THEN APB0F401.457
*ENDIF APB0F401.458
DO I=START_POINT_NO_HALO + LAST_ROW_PT-1, GSS1F403.819
& END_U_POINT_NO_HALO,ROW_LENGTH GSS1F403.820
U_TEMP_R(I)=U(I,K) GSS1F403.821
V_TEMP_R(I)=V(I,K) GSS1F403.822
U_TEMP_R(I-1)=U(I-1,K) GSS1F403.823
V_TEMP_R(I-1)=V(I-1,K) GSS1F403.824
ENDDO APB0F401.463
*IF DEF,MPP APB0F401.464
ENDIF APB0F401.465
*ENDIF APB0F401.466
*ENDIF UVADJ1A.464
UVADJ1A.465
UVADJ1A.476
*IF DEF,GLOBAL GSS1F403.825
*IF -DEF,MPP GSS1F403.826
DO I=START_POINT_NO_HALO + LAST_ROW_PT-1, GSS1F403.827
& END_U_POINT_NO_HALO,ROW_LENGTH GSS1F403.828
U_TEMP_R(I)=U(I,K) GSS1F403.829
V_TEMP_R(I)=V(I,K) GSS1F403.830
ENDDO GSS1F403.831
*ENDIF GSS1F403.832
*ENDIF GSS1F403.833
C LOOP OVER ALL POINTS TO BE UPDATED. GSS1F403.834
UVADJ1A.481
cdir$ nosplit GSS1F403.835
cdir$ nounroll GSS1F403.836
GSS1F403.837
DO 530 I=START_POINT_NO_HALO,END_U_POINT_NO_HALO-1 GSS1F403.838
GSS1F403.839
TEMP1 = HALF_ADJUSTMENT_TIMESTEP* GSS1F403.840
* (F3(I)+U(I,K)*TAN_U_LATITUDE(I)*RECIP_RS_UV(I,K)) GSS1F403.841
TEMP2 = TEMP1 * TEMP1 GSS1F403.842
RECIP=1.0/(1.+TEMP2) GSS1F403.843
GSS1F403.844
IJ = I + ROW_LENGTH UVADJ1A.483
DPHI_BY_DLONGITUDE = c1*( GSS1F403.845
* (PHI_FULL_LEVEL(I+1)-PHI_FULL_LEVEL(I))+ GSS1F403.846
* (PHI_FULL_LEVEL(IJ+1)-PHI_FULL_LEVEL(IJ))+ GSS1F403.847
* .5*CP*(THETAS(I+1,K)+THETAS(I,K)) GSS1F403.848
* *(DELTA_P_P_EXNER_BY_DELTAP(I+1) - GSS1F403.849
* DELTA_P_P_EXNER_BY_DELTAP(I))+ GSS1F403.850
* .5*CP*(THETAS(IJ+1,K)+THETAS(IJ,K)) GSS1F403.851
* *(DELTA_P_P_EXNER_BY_DELTAP(IJ+1) - GSS1F403.852
* DELTA_P_P_EXNER_BY_DELTAP(IJ)))* GSS1F403.853
* SEC_U_LATITUDE(I)*RECIP_RS_UV(I,K) GSS1F403.854
DPHI_BY_DLATITUDE = c2*( GSS1F403.855
* (PHI_FULL_LEVEL(I)-PHI_FULL_LEVEL(IJ))+ GSS1F403.856
* (PHI_FULL_LEVEL(I+1)-PHI_FULL_LEVEL(IJ+1))+ GSS1F403.857
* .5*CP*(THETAS(I,K)+THETAS(IJ,K)) GSS1F403.858
* *(DELTA_P_P_EXNER_BY_DELTAP(I) - UVADJ1A.487
* DELTA_P_P_EXNER_BY_DELTAP(IJ))+ GSS1F403.859
* .5*CP*(THETAS(I+1,K)+THETAS(IJ+1,K)) GSS1F403.860
* *(DELTA_P_P_EXNER_BY_DELTAP(I+1) - GSS1F403.861
* DELTA_P_P_EXNER_BY_DELTAP(IJ+1)))* GSS1F403.862
* RECIP_RS_UV(I,K) AAD2F304.115
UVADJ1A.498
C CALCULATE V AT NEW TIME LEVEL. GSS1F403.863
C WORK_V HOLDS V AT NEW TIME-LEVEL. GSS1F403.864
UVADJ1A.512
WORK_V= (V(I,K)*(1.-TEMP2) GSS1F403.865
* - TEMP1*(2.*U(I,K)-DPHI_BY_DLONGITUDE) GSS1F403.866
* - DPHI_BY_DLATITUDE)*RECIP GSS1F403.867
UVADJ1A.517
C CALCULATE U AT NEW TIME-LEVEL. GSS1F403.868
UVADJ1A.519
U(I,K) = U(I,K) + TEMP1*(V(I,K)+WORK_V) - GSS1F403.869
* DPHI_BY_DLONGITUDE GSS1F403.870
GSS1F403.871
C SET V EQUAL TO V AT NEW TIME-LEVEL. GSS1F403.872
GSS1F403.873
V(I,K) = WORK_V GSS1F403.874
GSS1F403.875
530 CONTINUE GSS1F403.876
*IF DEF,GLOBAL GSS1F403.877
*IF -DEF,MPP GSS1F403.878
C Redo last point of each row with correct wraparound for nonMPP code GSS1F403.879
GSS1F403.880
cdir$ nosplit GSS1F403.881
cdir$ nounroll GSS1F403.882
GSS1F403.883
DO I=START_POINT_NO_HALO + LAST_ROW_PT-1, GSS1F403.884
& END_U_POINT_NO_HALO,ROW_LENGTH GSS1F403.885
GSS1F403.886
TEMP1 = HALF_ADJUSTMENT_TIMESTEP* GSS1F403.887
* (F3(I)+U_TEMP_R(I)*TAN_U_LATITUDE(I)* GSS1F403.888
& RECIP_RS_UV(I,K)) GSS1F403.889
TEMP2 = TEMP1 * TEMP1 GSS1F403.890
RECIP=1.0/(1.+TEMP2) GSS1F403.891
GSS1F403.892
IP = I + 1 - ROW_LENGTH GSS1F403.893
IJ = I + ROW_LENGTH GSS1F403.894
IJP = IJ + 1 - ROW_LENGTH GSS1F403.895
GSS1F403.896
DPHI_BY_DLONGITUDE = c1*( GSS1F403.897
* (PHI_FULL_LEVEL(IP )-PHI_FULL_LEVEL(I))+ GSS1F403.898
* (PHI_FULL_LEVEL(IJP )-PHI_FULL_LEVEL(IJ))+ GSS1F403.899
* .5*CP*(THETAS(IP ,K)+THETAS(I,K)) GSS1F403.900
* *(DELTA_P_P_EXNER_BY_DELTAP(IP ) - GSS1F403.901
* DELTA_P_P_EXNER_BY_DELTAP(I))+ GSS1F403.902
* .5*CP*(THETAS(IJP ,K)+THETAS(IJ,K)) GSS1F403.903
* *(DELTA_P_P_EXNER_BY_DELTAP(IJP ) - GSS1F403.904
* DELTA_P_P_EXNER_BY_DELTAP(IJ)))* GSS1F403.905
* SEC_U_LATITUDE(I)*RECIP_RS_UV(I,K) GSS1F403.906
DPHI_BY_DLATITUDE = c2*( GSS1F403.907
* (PHI_FULL_LEVEL(I)-PHI_FULL_LEVEL(IJ))+ GSS1F403.908
* (PHI_FULL_LEVEL(IP )-PHI_FULL_LEVEL(IJP ))+ GSS1F403.909
* .5*CP*(THETAS(I,K)+THETAS(IJ,K)) GSS1F403.910
* *(DELTA_P_P_EXNER_BY_DELTAP(I) - GSS1F403.911
* DELTA_P_P_EXNER_BY_DELTAP(IJ))+ GSS1F403.912
* .5*CP*(THETAS(IP ,K)+THETAS(IJP ,K)) GSS1F403.913
* *(DELTA_P_P_EXNER_BY_DELTAP(IP ) - GSS1F403.914
* DELTA_P_P_EXNER_BY_DELTAP(IJP )))* GSS1F403.915
* RECIP_RS_UV(I,K) GSS1F403.916
GSS1F403.917
C CALCULATE V AT NEW TIME LEVEL. GSS1F403.918
C WORK_V HOLDS V AT NEW TIME-LEVEL. GSS1F403.919
GSS1F403.920
WORK_V= (V_TEMP_R(I)*(1.-TEMP2) GSS1F403.921
* - TEMP1*(2.*U_TEMP_R(I)-DPHI_BY_DLONGITUDE) GSS1F403.922
* - DPHI_BY_DLATITUDE)*RECIP GSS1F403.923
GSS1F403.924
C CALCULATE U AT NEW TIME-LEVEL. GSS1F403.925
GSS1F403.926
U(I,K) = U_TEMP_R(I) + TEMP1*(V_TEMP_R(I)+WORK_V) - GSS1F403.927
* DPHI_BY_DLONGITUDE GSS1F403.928
GSS1F403.929
C SET V EQUAL TO V AT NEW TIME-LEVEL. GSS1F403.930
GSS1F403.931
V(I,K) = WORK_V GSS1F403.932
GSS1F403.933
ENDDO GSS1F403.934
GSS1F403.935
*ENDIF GSS1F403.936
*ENDIF GSS1F403.937
GSS1F403.938
GSS1F403.939
C END LOOP OVER ALL POINTS TO BE UPDATED. GSS1F403.940
GSS1F403.941
*IF -DEF,GLOBAL GSS1F403.942
*IF DEF,MPP GSS1F403.943
IF (at_left_of_LPG) THEN APB0F401.484
*ENDIF GSS1F403.944
DO I=START_POINT_NO_HALO + FIRST_ROW_PT-1, GSS1F403.945
& END_U_POINT_NO_HALO,ROW_LENGTH GSS1F403.946
U(I,K)=U_TEMP_L(I) GSS1F403.947
V(I,K)=V_TEMP_L(I) GSS1F403.948
ENDDO GSS1F403.949
*IF DEF,MPP GSS1F403.950
ENDIF APB0F401.488
IF (at_right_of_LPG) THEN APB0F401.490
*ENDIF GSS1F403.951
DO I=START_POINT_NO_HALO + LAST_ROW_PT-1, GSS1F403.952
& END_U_POINT_NO_HALO,ROW_LENGTH GSS1F403.953
U(I,K)=U_TEMP_R(I) GSS1F403.954
V(I,K)=V_TEMP_R(I) GSS1F403.955
U(I-1,K)=U_TEMP_R(I-1) GSS1F403.956
V(I-1,K)=V_TEMP_R(I-1) GSS1F403.957
ENDDO GSS1F403.958
*IF DEF,MPP GSS1F403.959
ENDIF APB0F401.495
*ENDIF APB0F305.350
*ENDIF UVADJ1A.525
UVADJ1A.547
CL END LOOP OVER P_LEVELS UVADJ1A.548
110 CONTINUE UVADJ1A.549
UVADJ1A.550
CL END OF ROUTINE UV_ADJ UVADJ1A.551
UVADJ1A.552
RETURN UVADJ1A.553
END UVADJ1A.554
*ENDIF UVADJ1A.555