*IF DEF,C90_1A,OR,DEF,C90_2A,OR,DEF,C90_2B AAD2F404.287
C ******************************COPYRIGHT****************************** GTS2F400.7327
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.7328
C GTS2F400.7329
C Use, duplication or disclosure of this code is subject to the GTS2F400.7330
C restrictions as set forth in the contract. GTS2F400.7331
C GTS2F400.7332
C Meteorological Office GTS2F400.7333
C London Road GTS2F400.7334
C BRACKNELL GTS2F400.7335
C Berkshire UK GTS2F400.7336
C RG12 2SZ GTS2F400.7337
C GTS2F400.7338
C If no contract has been raised with this copy of the code, the use, GTS2F400.7339
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.7340
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.7341
C Modelling at the above address. GTS2F400.7342
C ******************************COPYRIGHT****************************** GTS2F400.7343
C GTS2F400.7344
CLL SUBROUTINE POLAR_UV---------------------------------------------- POLAUV1A.3
CLL POLAUV1A.4
CLL Purpose: POLAUV1A.5
CLL This routine updates the polar values of u and v POLAUV1A.6
CLL stored a half-grid length from the poles by vectorially POLAUV1A.7
CLL averaging the input fields from the adjacent equatorwards POLAUV1A.8
CLL row to obtain mean cartesian winds and also calculates a POLAUV1A.9
CLL mean u and v for this row. POLAUV1A.10
CLL The polar row is set to have the same mean vorticity and POLAUV1A.11
CLL divergence as the adjacent row by COS(LATITUDE) scaling. POLAUV1A.12
CLL POLAUV1A.13
CLL M.Mawson <- programmer of some or all of previous code or changes POLAUV1A.14
CLL POLAUV1A.15
CLL Model Modification history from model version 3.0: POLAUV1A.16
CLL version Date POLAUV1A.17
! 4.1 19/06/95 Rewritten to allow multiple levels to be APB2F401.235
! processed and added MPP code. P.Burton APB2F401.236
!LL 4.4 12/08/97 Faster non-reproducible sums added. P.Burton GPB3F404.10
CLL POLAUV1A.18
CLL System components covered: P196 POLAUV1A.19
CLL POLAUV1A.20
CLL Documentation: POLAUV1A.21
CLL Section 3.6 of Unified Model Documention Paper No 10. POLAUV1A.22
CLL POLAUV1A.23
CLL ----------------------------------------------------------------- POLAUV1A.24
C POLAUV1A.25
C*L ARGUMENTS:------------------------------------------------------- POLAUV1A.26
SUBROUTINE POLAR_UV(U,V,ROW_LENGTH,U_POINTS,LEVELS, 14APB2F401.237
*CALL ARGFLDPT
APB2F401.238
& COS_LAMBDA,SIN_LAMBDA) APB2F401.239
APB2F401.240
IMPLICIT NONE APB2F401.241
APB2F401.242
INTEGER APB2F401.243
& ROW_LENGTH ! IN Number of points per row APB2F401.244
&, U_POINTS ! IN Horizontal size of fields on U grid APB2F401.245
&, LEVELS ! IN Number of levels to process APB2F401.246
APB2F401.247
! All TYPFLDPT arguments are intent IN APB2F401.248
*CALL TYPFLDPT
APB2F401.249
APB2F401.250
REAL APB2F401.251
& U(U_POINTS,LEVELS) ! INOUT U field to process APB2F401.252
&, V(U_POINTS,LEVELS) ! INOUT V field to process APB2F401.253
&, SIN_LAMBDA(ROW_LENGTH) ! IN Sine longitude APB2F401.254
&, COS_LAMBDA(ROW_LENGTH) ! IN Cosine longitude APB2F401.255
APB2F401.256
! Local arrays APB2F401.257
! 4 arrays containing cartesian components of polar fluxes APB2F401.258
APB2F401.259
REAL APB2F401.260
& CART_U_NP(ROW_LENGTH,LEVELS) APB2F401.261
&, CART_U_SP(ROW_LENGTH,LEVELS) APB2F401.262
&, CART_V_NP(ROW_LENGTH,LEVELS) APB2F401.263
&, CART_V_SP(ROW_LENGTH,LEVELS) APB2F401.264
APB2F401.265
! 8 arrays containing the calculated means APB2F401.266
APB2F401.267
REAL APB2F401.268
& MEAN_U_NP(LEVELS) APB2F401.269
&, MEAN_U_SP(LEVELS) APB2F401.270
&, MEAN_V_NP(LEVELS) APB2F401.271
&, MEAN_V_SP(LEVELS) APB2F401.272
&, MEAN_CARTESIAN_U_NP(LEVELS) APB2F401.273
&, MEAN_CARTESIAN_U_SP(LEVELS) APB2F401.274
&, MEAN_CARTESIAN_V_NP(LEVELS) APB2F401.275
&, MEAN_CARTESIAN_V_SP(LEVELS) APB2F401.276
APB2F401.277
! Local variables APB2F401.278
INTEGER APB2F401.279
& K,I,I_NP,I_SP ! loop counters and indexes APB2F401.280
&, NP_ADJACENT_ROW_START ! start of row below NP row APB2F401.281
&, SP_ADJACENT_ROW_START ! start of row above SP row APB2F401.282
*IF DEF,MPP APB2F401.283
&, LOCAL_ROW_PTS ! number of non-halo points in row APB2F401.284
&, info ! return code from GC routines APB2F401.285
*ENDIF APB2F401.286
APB2F401.287
REAL ROW_LENGTH_RECIP,ONE_THIRD APB2F401.288
APB2F401.289
!----------------------------------------------------------------------- APB2F401.290
APB2F401.291
APB2F401.292
NP_ADJACENT_ROW_START=TOP_ROW_START+ROW_LENGTH APB2F401.293
SP_ADJACENT_ROW_START=U_BOT_ROW_START-ROW_LENGTH APB2F401.294
*IF DEF,MPP APB2F401.295
LOCAL_ROW_PTS=LAST_ROW_PT-FIRST_ROW_PT+1 APB2F401.296
*ENDIF APB2F401.297
APB2F401.298
ROW_LENGTH_RECIP=1.0/GLOBAL_ROW_LENGTH APB2F401.299
ONE_THIRD=1.0/3.0 APB2F401.300
APB2F401.301
! 1. Resolve u and v vectorially onto cartesian grid APB2F401.302
APB2F401.303
! North Pole APB2F401.304
*IF DEF,MPP APB2F401.305
IF (at_top_of_LPG) THEN APB2F401.306
*ENDIF APB2F401.307
DO K=1,LEVELS APB2F401.308
DO I=FIRST_ROW_PT,LAST_ROW_PT APB2F401.309
I_NP=I+NP_ADJACENT_ROW_START-1 APB2F401.310
! I_NP index points to points along row beneath North Pole APB2F401.311
CART_U_NP(I,K)= APB2F401.312
& U(I_NP,K)*COS_LAMBDA(I)-V(I_NP,K)*SIN_LAMBDA(I) APB2F401.313
CART_V_NP(I,K)= APB2F401.314
& V(I_NP,K)*COS_LAMBDA(I)+U(I_NP,K)*SIN_LAMBDA(I) APB2F401.315
ENDDO APB2F401.316
ENDDO APB2F401.317
*IF DEF,MPP APB2F401.318
ENDIF APB2F401.319
*ENDIF APB2F401.320
APB2F401.321
! South Pole APB2F401.322
*IF DEF,MPP APB2F401.323
IF (at_base_of_LPG) THEN APB2F401.324
*ENDIF APB2F401.325
DO K=1,LEVELS APB2F401.326
DO I=FIRST_ROW_PT,LAST_ROW_PT APB2F401.327
I_SP=I+SP_ADJACENT_ROW_START-1 APB2F401.328
! I_SP index points to points along row above South Pole APB2F401.329
CART_U_SP(I,K)= APB2F401.330
& U(I_SP,K)*COS_LAMBDA(I)+V(I_SP,K)*SIN_LAMBDA(I) APB2F401.331
CART_V_SP(I,K)= APB2F401.332
& V(I_SP,K)*COS_LAMBDA(I)-U(I_SP,K)*SIN_LAMBDA(I) APB2F401.333
ENDDO APB2F401.334
ENDDO APB2F401.335
*IF DEF,MPP APB2F401.336
ENDIF APB2F401.337
*ENDIF APB2F401.338
APB2F401.339
! 2. Compute mean cartesian values at poles, and mean u and v APB2F401.340
APB2F401.341
DO K=1,LEVELS APB2F401.342
MEAN_CARTESIAN_U_NP(K)=0.0 APB2F401.343
MEAN_CARTESIAN_U_SP(K)=0.0 APB2F401.344
MEAN_CARTESIAN_V_NP(K)=0.0 APB2F401.345
MEAN_CARTESIAN_V_SP(K)=0.0 APB2F401.346
MEAN_U_NP(K)=0.0 APB2F401.347
MEAN_U_SP(K)=0.0 APB2F401.348
MEAN_V_NP(K)=0.0 APB2F401.349
MEAN_V_SP(K)=0.0 APB2F401.350
APB2F401.351
*IF -DEF,MPP APB2F401.352
DO I=FIRST_ROW_PT,LAST_ROW_PT APB2F401.353
APB2F401.354
I_NP=I+NP_ADJACENT_ROW_START-1 APB2F401.355
I_SP=I+SP_ADJACENT_ROW_START-1 APB2F401.356
APB2F401.357
MEAN_CARTESIAN_U_NP(K)= APB2F401.358
& MEAN_CARTESIAN_U_NP(K)+CART_U_NP(I,K) APB2F401.359
MEAN_CARTESIAN_U_SP(K)= APB2F401.360
& MEAN_CARTESIAN_U_SP(K)+CART_U_SP(I,K) APB2F401.361
MEAN_CARTESIAN_V_NP(K)= APB2F401.362
& MEAN_CARTESIAN_V_NP(K)+CART_V_NP(I,K) APB2F401.363
MEAN_CARTESIAN_V_SP(K)= APB2F401.364
& MEAN_CARTESIAN_V_SP(K)+CART_V_SP(I,K) APB2F401.365
APB2F401.366
MEAN_U_NP(K) = MEAN_U_NP(K) + U(I_NP,K) APB2F401.367
MEAN_U_SP(K) = MEAN_U_SP(K) + U(I_SP,K) APB2F401.368
MEAN_V_NP(K) = MEAN_V_NP(K) + V(I_NP,K) APB2F401.369
MEAN_V_SP(K) = MEAN_V_SP(K) + V(I_SP,K) APB2F401.370
APB2F401.371
ENDDO ! I: loop over points on row APB2F401.372
ENDDO ! K: loop over levels APB2F401.373
*ELSE APB2F401.374
ENDDO ! K : loop over levels APB2F401.375
APB2F401.376
IF (at_top_of_LPG) THEN APB2F401.377
*IF DEF,REPROD GPB3F404.11
CALL GCG_RVECSUMR(
ROW_LENGTH,LOCAL_ROW_PTS,FIRST_ROW_PT, APB2F401.378
*ELSE GPB3F404.12
CALL GCG_RVECSUMF(
ROW_LENGTH,LOCAL_ROW_PTS,FIRST_ROW_PT, GPB3F404.13
*ENDIF GPB3F404.14
& LEVELS,CART_U_NP,GC_ROW_GROUP, APB2F401.379
& info,MEAN_CARTESIAN_U_NP) APB2F401.380
*IF DEF,REPROD GPB3F404.15
CALL GCG_RVECSUMR(
ROW_LENGTH,LOCAL_ROW_PTS,FIRST_ROW_PT, APB2F401.381
*ELSE GPB3F404.16
CALL GCG_RVECSUMF(
ROW_LENGTH,LOCAL_ROW_PTS,FIRST_ROW_PT, GPB3F404.17
*ENDIF GPB3F404.18
& LEVELS,CART_V_NP,GC_ROW_GROUP, APB2F401.382
& info,MEAN_CARTESIAN_V_NP) APB2F401.383
APB2F401.384
*IF DEF,REPROD GPB3F404.19
CALL GCG_RVECSUMR(
U_POINTS,LOCAL_ROW_PTS, APB2F401.385
*ELSE GPB3F404.20
CALL GCG_RVECSUMF(
U_POINTS,LOCAL_ROW_PTS, GPB3F404.21
*ENDIF GPB3F404.22
& NP_ADJACENT_ROW_START+FIRST_ROW_PT-1, APB2F401.386
& LEVELS,U,GC_ROW_GROUP,info,MEAN_U_NP) APB2F401.387
*IF DEF,REPROD GPB3F404.23
CALL GCG_RVECSUMR(
U_POINTS,LOCAL_ROW_PTS, APB2F401.388
*ELSE GPB3F404.24
CALL GCG_RVECSUMF(
U_POINTS,LOCAL_ROW_PTS, GPB3F404.25
*ENDIF GPB3F404.26
& NP_ADJACENT_ROW_START+FIRST_ROW_PT-1, APB2F401.389
& LEVELS,V,GC_ROW_GROUP,info,MEAN_V_NP) APB2F401.390
ENDIF APB2F401.391
APB2F401.392
IF (at_base_of_LPG) THEN APB2F401.393
*IF DEF,REPROD GPB3F404.27
CALL GCG_RVECSUMR(
ROW_LENGTH,LOCAL_ROW_PTS,FIRST_ROW_PT, APB2F401.394
*ELSE GPB3F404.28
CALL GCG_RVECSUMF(
ROW_LENGTH,LOCAL_ROW_PTS,FIRST_ROW_PT, GPB3F404.29
*ENDIF GPB3F404.30
& LEVELS,CART_U_SP,GC_ROW_GROUP, APB2F401.395
& info,MEAN_CARTESIAN_U_SP) APB2F401.396
*IF DEF,REPROD GPB3F404.31
CALL GCG_RVECSUMR(
ROW_LENGTH,LOCAL_ROW_PTS,FIRST_ROW_PT, APB2F401.397
*ELSE GPB3F404.32
CALL GCG_RVECSUMF(
ROW_LENGTH,LOCAL_ROW_PTS,FIRST_ROW_PT, GPB3F404.33
*ENDIF GPB3F404.34
& LEVELS,CART_V_SP,GC_ROW_GROUP, APB2F401.398
& info,MEAN_CARTESIAN_V_SP) APB2F401.399
APB2F401.400
*IF DEF,REPROD GPB3F404.35
CALL GCG_RVECSUMR(
U_POINTS,LOCAL_ROW_PTS, APB2F401.401
*ELSE GPB3F404.36
CALL GCG_RVECSUMF(
U_POINTS,LOCAL_ROW_PTS, GPB3F404.37
*ENDIF GPB3F404.38
& SP_ADJACENT_ROW_START+FIRST_ROW_PT-1, APB2F401.402
& LEVELS,U,GC_ROW_GROUP,info,MEAN_U_SP) APB2F401.403
*IF DEF,REPROD GPB3F404.39
CALL GCG_RVECSUMR(
U_POINTS,LOCAL_ROW_PTS, APB2F401.404
*ELSE GPB3F404.40
CALL GCG_RVECSUMF(
U_POINTS,LOCAL_ROW_PTS, GPB3F404.41
*ENDIF GPB3F404.42
& SP_ADJACENT_ROW_START+FIRST_ROW_PT-1, APB2F401.405
& LEVELS,V,GC_ROW_GROUP,info,MEAN_V_SP) APB2F401.406
ENDIF APB2F401.407
*ENDIF APB2F401.408
APB2F401.409
DO K=1,LEVELS APB2F401.410
MEAN_CARTESIAN_U_NP(K)= APB2F401.411
& MEAN_CARTESIAN_U_NP(K)*ROW_LENGTH_RECIP APB2F401.412
MEAN_CARTESIAN_U_SP(K)= APB2F401.413
& MEAN_CARTESIAN_U_SP(K)*ROW_LENGTH_RECIP APB2F401.414
MEAN_CARTESIAN_V_NP(K)= APB2F401.415
& MEAN_CARTESIAN_V_NP(K)*ROW_LENGTH_RECIP APB2F401.416
MEAN_CARTESIAN_V_SP(K)= APB2F401.417
& MEAN_CARTESIAN_V_SP(K)*ROW_LENGTH_RECIP APB2F401.418
MEAN_U_NP(K) = MEAN_U_NP(K)*ROW_LENGTH_RECIP APB2F401.419
MEAN_U_SP(K) = MEAN_U_SP(K)*ROW_LENGTH_RECIP APB2F401.420
MEAN_V_NP(K) = MEAN_V_NP(K)*ROW_LENGTH_RECIP APB2F401.421
MEAN_V_SP(K) = MEAN_V_SP(K)*ROW_LENGTH_RECIP APB2F401.422
ENDDO APB2F401.423
APB2F401.424
! 3. Resolve mean values back to lat-lon grid and add in fluxes APB2F401.425
! Scale MEAN_U and MEAN_V by 1/3 to give uniform vorticity and APB2F401.426
! divergence. APB2F401.427
APB2F401.428
! North Pole APB2F401.429
*IF DEF,MPP APB2F401.430
IF (at_top_of_LPG) THEN APB2F401.431
*ENDIF APB2F401.432
DO K=1,LEVELS APB2F401.433
DO I=FIRST_ROW_PT,LAST_ROW_PT APB2F401.434
APB2F401.435
I_NP=TOP_ROW_START+I-1 APB2F401.436
! This points to the real North Pole row. APB2F401.437
APB2F401.438
U(I_NP,K) = MEAN_CARTESIAN_U_NP(K)*COS_LAMBDA(I)+ APB2F401.439
& MEAN_CARTESIAN_V_NP(K)*SIN_LAMBDA(I)+ APB2F401.440
& MEAN_U_NP(K)*ONE_THIRD APB2F401.441
V(I_NP,K) = MEAN_CARTESIAN_V_NP(K)*COS_LAMBDA(I)- APB2F401.442
& MEAN_CARTESIAN_U_NP(K)*SIN_LAMBDA(I)+ APB2F401.443
& MEAN_V_NP(K)*ONE_THIRD APB2F401.444
ENDDO APB2F401.445
ENDDO APB2F401.446
*IF DEF,MPP APB2F401.447
ENDIF APB2F401.448
*ENDIF APB2F401.449
APB2F401.450
! South Pole APB2F401.451
*IF DEF,MPP APB2F401.452
IF (at_base_of_LPG) THEN APB2F401.453
*ENDIF APB2F401.454
DO K=1,LEVELS APB2F401.455
DO I=FIRST_ROW_PT,LAST_ROW_PT APB2F401.456
APB2F401.457
I_SP=U_BOT_ROW_START+I-1 APB2F401.458
! This points to the real South Pole row. APB2F401.459
APB2F401.460
U(I_SP,K) = MEAN_U_SP(K)*ONE_THIRD + APB2F401.461
& MEAN_CARTESIAN_U_SP(K)*COS_LAMBDA(I)- APB2F401.462
& MEAN_CARTESIAN_V_SP(K)*SIN_LAMBDA(I) APB2F401.463
V(I_SP,K) = MEAN_V_SP(K)*ONE_THIRD + APB2F401.464
& MEAN_CARTESIAN_V_SP(K)*COS_LAMBDA(I)+ APB2F401.465
& MEAN_CARTESIAN_U_SP(K)*SIN_LAMBDA(I) APB2F401.466
ENDDO APB2F401.467
ENDDO APB2F401.468
*IF DEF,MPP APB2F401.469
ENDIF APB2F401.470
*ENDIF APB2F401.471
POLAUV1A.121
RETURN POLAUV1A.122
END POLAUV1A.123
*ENDIF POLAUV1A.124