*IF DEF,A11_1A SETTRA1A.2
C ******************************COPYRIGHT****************************** GTS2F400.8731
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.8732
C GTS2F400.8733
C Use, duplication or disclosure of this code is subject to the GTS2F400.8734
C restrictions as set forth in the contract. GTS2F400.8735
C GTS2F400.8736
C Meteorological Office GTS2F400.8737
C London Road GTS2F400.8738
C BRACKNELL GTS2F400.8739
C Berkshire UK GTS2F400.8740
C RG12 2SZ GTS2F400.8741
C GTS2F400.8742
C If no contract has been raised with this copy of the code, the use, GTS2F400.8743
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.8744
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.8745
C Modelling at the above address. GTS2F400.8746
C ******************************COPYRIGHT****************************** GTS2F400.8747
C GTS2F400.8748
CLL SUBROUTINE SET_TRAC --------------------------------------------- SETTRA1A.3
CLL SETTRA1A.4
CLL PURPOSE: CALCULATES NUMBER OF EAST-WEST SWEEPS OF HORIZONTAL SETTRA1A.5
CLL ADVECTION REQUIRED ON EACH ROW TO MAINTAIN A CFL SETTRA1A.6
CLL NUMBER LESS THAN 0.5. SETTRA1A.7
CLL NOT SUITABLE FOR SINGLE COLUMN USE. SETTRA1A.8
CLL VERSION FOR CRAY Y-MP, CRAY T3E, and Workstations. ARB1F402.271
CLL SETTRA1A.10
CLL WRITTEN BY M.H. MAWSON SETTRA1A.11
CLL SETTRA1A.12
CLL MODEL MODIFICATION HISTORY FROM MODEL VERSION 3.0: SETTRA1A.13
CLL VERSION DATE SETTRA1A.14
CLL 4.2 Oct. 96 T3E migration: *DEF CRAY removed (was used to GSS2F402.281
CLL switch on ISAMAX,ISAMIN - for PVP systems only). GSS2F402.282
CLL S.J.Swarbrick GSS2F402.283
CLL 4.2 15/08/96 MPP code added. Loop structure modified. RTHBarnes. ARB1F402.272
!LL 4.3 17/03/97 Remove print statement. RTHBarnes. ARB1F403.7
CLL SETTRA1A.15
CLL PROGRAMMING STANDARD: UNIFIED MODEL DOCUMENTATION PAPER NO. 4, SETTRA1A.16
CLL STANDARD B. SETTRA1A.17
CLL SETTRA1A.18
CLL SYSTEM COMPONENTS COVERED: P123 SETTRA1A.19
CLL SETTRA1A.20
CLL SYSTEM TASK: P1 SETTRA1A.21
CLL SETTRA1A.22
CLL DOCUMENTATION: U.M. Doc. Paper 11, by M.J.P. Cullen SETTRA1A.23
CLL SETTRA1A.24
CLLEND----------------------------------------------------------------- SETTRA1A.25
SETTRA1A.26
C SETTRA1A.27
C*L ARGUMENTS:------------------------------------------------------- SETTRA1A.28
SETTRA1A.29
SUBROUTINE SET_TRAC 1,2SETTRA1A.30
& (TRACER_EW_SWEEPS,U,P_FIELD,U_FIELD, SETTRA1A.31
& P_LEVELS,ROW_LENGTH, ARB1F402.273
*CALL ARGFLDPT
ARB1F402.274
& LONGITUDE_STEP_INVERSE, ARB1F402.275
& SEC_P_LATITUDE,ADVECTION_TIMESTEP, SETTRA1A.33
& PSTAR,DELTA_AK,DELTA_BK,RS) SETTRA1A.34
SETTRA1A.35
IMPLICIT NONE SETTRA1A.36
SETTRA1A.37
INTEGER SETTRA1A.38
& P_FIELD !IN DIMENSION OF FIELDS ON PRESSURE GRID. SETTRA1A.39
&,U_FIELD !IN DIMENSION OF FIELDS ON VELOCITY GRID. SETTRA1A.40
&,ROW_LENGTH !IN NUMBER OF POINTS PER ROW. SETTRA1A.41
&,P_LEVELS !IN NUMBER OF PRESSURE LEVELS. SETTRA1A.42
! All TYPFLDPT arguments are intent IN ARB1F402.276
*CALL TYPFLDPT
ARB1F402.277
*IF DEF,MPP ARB1F402.278
! Common blocks and parameters for MPP code ARB1F402.279
*CALL PARVARS
ARB1F402.280
*ENDIF ARB1F402.281
SETTRA1A.43
INTEGER SETTRA1A.44
*IF DEF,MPP ARB1F402.282
& TRACER_EW_SWEEPS(glsize(2),P_LEVELS) ! OUT. ARB1F402.283
! Number of East-West sweeps required for each row (of global field) ARB1F402.284
*ELSE ARB1F402.285
& TRACER_EW_SWEEPS(P_FIELD/ROW_LENGTH,P_LEVELS) ! OUT. SETTRA1A.45
& ! Number of sweeps to be done in SETTRA1A.46
& ! East West calculation for each row. SETTRA1A.47
*ENDIF ARB1F402.286
SETTRA1A.48
REAL SETTRA1A.49
& U(U_FIELD,P_LEVELS) !IN ADVECTING U FIELD, MASS-WEIGHTED. SETTRA1A.50
&,SEC_P_LATITUDE(P_FIELD) !IN 1/COS(LAT) AT P POINTS SETTRA1A.51
&,RS(P_FIELD,P_LEVELS) !IN EFFECTIVE RADIUS OF EARTH SETTRA1A.52
SETTRA1A.53
REAL SETTRA1A.54
& LONGITUDE_STEP_INVERSE !IN 1/(DELTA LAMDA) SETTRA1A.55
&,ADVECTION_TIMESTEP !IN SETTRA1A.56
&,PSTAR(P_FIELD) !IN SETTRA1A.57
&,DELTA_AK(P_LEVELS) !IN SETTRA1A.58
&,DELTA_BK(P_LEVELS) !IN SETTRA1A.59
SETTRA1A.60
C*--------------------------------------------------------------------- SETTRA1A.61
SETTRA1A.62
C*L DEFINE ARRAYS AND VARIABLES USED IN THIS ROUTINE----------------- SETTRA1A.63
C DEFINE LOCAL ARRAYS: 4 ARE REQUIRED SETTRA1A.64
SETTRA1A.65
REAL SETTRA1A.66
& U_WORK(U_FIELD) SETTRA1A.67
&, COURANT_NUMBER(P_FIELD) SETTRA1A.68
&, PSTAR_UV(U_FIELD) SETTRA1A.69
&, RS_UV(U_FIELD) SETTRA1A.70
*IF DEF,MPP ARB1F402.287
INTEGER ARB1F402.288
& info ! Return code from GCom routines. ARB1F402.289
&,LOCAL_EW_SWEEPS(P_LEVELS,P_FIELD/ROW_LENGTH) ! for this PE ARB1F402.290
&,ALL_EW_SWEEPS(P_LEVELS,glsize(2)) ! to hold values from all PEs ARB1F402.291
! N.B. so that data are contiguous for inter-PE message passing routines ARB1F402.292
! GCG_IMAX & GC_IBCAST, these arrays are declared (levels,rows) ARB1F402.293
*ENDIF ARB1F402.294
C*--------------------------------------------------------------------- SETTRA1A.72
C DEFINE LOCAL VARIABLES SETTRA1A.73
INTEGER SETTRA1A.74
& I,J,K ! Do loop counters. SETTRA1A.75
&, I_START SETTRA1A.76
&, I_MAX SETTRA1A.77
&, P_ROWS SETTRA1A.78
*IF DEF,MPP ARB1F402.295
&, global_row ! row number in global array ALL_EW_SWEEPS ARB1F402.296
&, HALF_P_ROWS ! half of total no. of rows in global array ARB1F402.297
*ENDIF ARB1F402.298
SETTRA1A.79
REAL SETTRA1A.80
& MAX_COURANT SETTRA1A.81
SETTRA1A.82
C*L EXTERNAL SUBROUTINE CALLS:------------------------------------ SETTRA1A.83
SETTRA1A.84
EXTERNAL SETTRA1A.92
& P_TO_UV SETTRA1A.93
SETTRA1A.94
C*--------------------------------------------------------------------- SETTRA1A.95
SETTRA1A.96
CL MAXIMUM VECTOR LENGTH ASSUMED IS U_FIELD SETTRA1A.97
CL--------------------------------------------------------------------- SETTRA1A.98
CL INTERNAL STRUCTURE. SETTRA1A.99
CL--------------------------------------------------------------------- SETTRA1A.100
CL SETTRA1A.101
CL--------------------------------------------------------------------- SETTRA1A.102
CL SECTION 0. INITIALISATION SETTRA1A.103
CL--------------------------------------------------------------------- SETTRA1A.104
SETTRA1A.105
P_ROWS = P_FIELD/ROW_LENGTH SETTRA1A.106
*IF DEF,MPP ARB1F402.299
HALF_P_ROWS=glsize(2)/2 ! half total number of rows ARB1F402.300
*ENDIF ARB1F402.301
CL SETTRA1A.108
CL--------------------------------------------------------------------- SETTRA1A.109
CL SECTION 1. CALCULATE NUMBER OF SWEEPS REQUIRED ON EACH ROW. SETTRA1A.110
CL--------------------------------------------------------------------- SETTRA1A.111
SETTRA1A.112
CL Interpolate pressure field to velocity points. SETTRA1A.113
SETTRA1A.114
CALL P_TO_UV
(PSTAR,PSTAR_UV,P_FIELD,U_FIELD,ROW_LENGTH,P_ROWS) SETTRA1A.115
SETTRA1A.116
CL Loop over all levels. SETTRA1A.117
SETTRA1A.118
DO K=1,P_LEVELS SETTRA1A.119
*IF DEF,MPP ARB1F402.302
! Initialise polar/North- & South-most rows. ARB1F402.303
ALL_EW_SWEEPS(K,1) = 1 ARB1F402.304
ALL_EW_SWEEPS(K,glsize(2)) = 1 ARB1F402.305
LOCAL_EW_SWEEPS(K,1) = 1 ARB1F402.306
LOCAL_EW_SWEEPS(K,P_ROWS) = 1 ARB1F402.307
IF (at_top_of_LPG) LOCAL_EW_SWEEPS(K,2) = 1 ARB1F402.308
IF (at_base_of_LPG) LOCAL_EW_SWEEPS(K,P_ROWS-1) = 1 ARB1F402.309
*ELSE ARB1F402.310
TRACER_EW_SWEEPS(1,K) = 1 SETTRA1A.120
TRACER_EW_SWEEPS(P_ROWS,K) = 1 SETTRA1A.121
*ENDIF ARB1F402.311
SETTRA1A.122
CL Interpolate RS field to velocity points. SETTRA1A.123
SETTRA1A.124
CALL P_TO_UV
(RS(1,K),RS_UV,P_FIELD,U_FIELD,ROW_LENGTH,P_ROWS) SETTRA1A.125
SETTRA1A.126
CL Remove mass-weight from U. SETTRA1A.127
SETTRA1A.128
!!! DO I=1,U_FIELD ARB1F402.312
DO I = FIRST_VALID_PT,LAST_U_FLD_PT ARB1F402.313
U_WORK(I) = U(I,K)/ SETTRA1A.130
& (RS_UV(I)*(DELTA_AK(K)+DELTA_BK(K)*PSTAR_UV(I))) SETTRA1A.131
END DO SETTRA1A.132
SETTRA1A.133
CL Calculate Courant number on each interior P_ROW. SETTRA1A.134
SETTRA1A.135
!!! DO I=ROW_LENGTH+1,P_FIELD-ROW_LENGTH ARB1F402.314
DO I = START_POINT_NO_HALO,END_P_POINT_NO_HALO ARB1F402.315
COURANT_NUMBER(I) = .5*(U_WORK(I) + U_WORK(I-ROW_LENGTH)) SETTRA1A.137
& *ADVECTION_TIMESTEP*SEC_P_LATITUDE(I) SETTRA1A.138
& *LONGITUDE_STEP_INVERSE/RS(I,K) SETTRA1A.139
END DO SETTRA1A.140
SETTRA1A.141
CL Loop over all rows. SETTRA1A.142
SETTRA1A.143
!!! DO J=2,P_ROWS-1 ARB1F402.316
DO J = FIRST_ROW,P_LAST_ROW ARB1F402.317
CL Calculate maximum absolute courant number. SETTRA1A.145
SETTRA1A.146
*IF -DEF,MPP ARB1F402.318
I_START = (J-1)*ROW_LENGTH+1 SETTRA1A.147
I_MAX = I_START SETTRA1A.152
DO I=1,ROW_LENGTH-1 SETTRA1A.153
IF(ABS(COURANT_NUMBER(I+I_START)).GT. SETTRA1A.154
& ABS(COURANT_NUMBER(I_MAX))) I_MAX = I_START+I GSS2F402.284
END DO SETTRA1A.157
MAX_COURANT = ABS(COURANT_NUMBER(I_MAX)) SETTRA1A.158
*ELSE ARB1F402.319
MAX_COURANT = 0.0 ARB1F402.320
DO I = (J-1)*ROW_LENGTH+Offx+1,J*ROW_LENGTH-Offx ARB1F402.321
MAX_COURANT = MAX(ABS(COURANT_NUMBER(I)),MAX_COURANT) ARB1F402.322
END DO ARB1F402.323
*ENDIF ARB1F402.324
CL Set number of sweeps so that maximum courant number on each row SETTRA1A.160
Cl is less than 0.25 SETTRA1A.161
SETTRA1A.162
*IF -DEF,MPP ARB1F402.325
TRACER_EW_SWEEPS(J,K) = 1 + 4*MAX_COURANT SETTRA1A.163
*ELSE ARB1F402.326
LOCAL_EW_SWEEPS(K,J) = 1 + 4*MAX_COURANT ARB1F402.327
*ENDIF ARB1F402.328
SETTRA1A.164
CL End loop over rows. SETTRA1A.165
END DO SETTRA1A.166
CL End loop over levels. ARB1F402.329
END DO ARB1F402.330
SETTRA1A.167
*IF DEF,MPP ARB1F402.331
! Find max value of local_ew_sweeps for each row along all processors ARB1F402.332
! in group gc_proc_row_group ARB1F402.333
CALL GCG_IMAX(
(P_ROWS-2*Offy)*P_LEVELS,gc_proc_row_group,info, ARB1F402.334
& LOCAL_EW_SWEEPS(1,1+Offy)) ARB1F402.335
! Copy to correct place in global array all_ew_sweeps ARB1F402.336
DO J = FIRST_ROW,P_LAST_ROW ARB1F402.337
global_row = J+datastart(2)-Offy-1 ARB1F402.338
DO K = 1,P_LEVELS ARB1F402.339
ALL_EW_SWEEPS(K,global_row) = LOCAL_EW_SWEEPS(K,J) ARB1F402.340
END DO ARB1F402.341
END DO ARB1F402.342
! Broadcast section of global array from this processor to all others ARB1F402.343
! - only needs to be done by one processor per row. ARB1F402.344
DO I = 0,nproc-1,nproc_x ARB1F402.345
CALL GC_IBCAST(
I,P_LEVELS*g_blsizep(2,I),I,nproc,info, ARB1F402.346
& ALL_EW_SWEEPS(1,g_datastart(2,I))) ARB1F402.347
END DO ARB1F402.348
*ENDIF ARB1F402.349
ARB1F402.350
CL Loop over all levels. ARB1F402.351
DO K=1,P_LEVELS ARB1F402.352
ARB1F402.353
CL Make number of sweeps in each hemisphere monotonic increasing SETTRA1A.168
Cl as you go towards the pole. SETTRA1A.169
*IF -DEF,MPP ARB1F402.354
DO J=P_ROWS/2,2,-1 SETTRA1A.171
IF(TRACER_EW_SWEEPS(J,K).LT.TRACER_EW_SWEEPS(J+1,K)) SETTRA1A.172
& TRACER_EW_SWEEPS(J,K) = TRACER_EW_SWEEPS(J+1,K) SETTRA1A.173
END DO SETTRA1A.174
SETTRA1A.175
DO J=P_ROWS/2+1,P_ROWS-1 SETTRA1A.176
IF(TRACER_EW_SWEEPS(J,K).LT.TRACER_EW_SWEEPS(J-1,K)) SETTRA1A.177
& TRACER_EW_SWEEPS(J,K) = TRACER_EW_SWEEPS(J-1,K) SETTRA1A.178
END DO SETTRA1A.179
*ELSE ARB1F402.355
DO J = HALF_P_ROWS,2,-1 ARB1F402.356
IF (ALL_EW_SWEEPS(K,J) .lt. ALL_EW_SWEEPS(K,J+1)) THEN ARB1F402.357
ALL_EW_SWEEPS(K,J) = ALL_EW_SWEEPS(K,J+1) ARB1F402.358
END IF ARB1F402.359
END DO ARB1F402.360
DO J = HALF_P_ROWS+1,glsize(2)-1 ARB1F402.361
IF (ALL_EW_SWEEPS(K,J) .lt. ALL_EW_SWEEPS(K,J-1)) THEN ARB1F402.362
ALL_EW_SWEEPS(K,J) = ALL_EW_SWEEPS(K,J-1) ARB1F402.363
END IF ARB1F402.364
END DO ARB1F402.365
! Initialise North- & South-most values ARB1F402.366
ALL_EW_SWEEPS(K,1) = 1 ARB1F402.367
ALL_EW_SWEEPS(K,glsize(2)) = 1 ARB1F402.368
! Copy from local global array all_ew_sweeps to array tracer_ew_sweeps ARB1F402.369
! that will be passed to TRAC_ADV. ARB1F402.370
DO J = 1,glsize(2) ARB1F402.371
TRACER_EW_SWEEPS(J,K) = ALL_EW_SWEEPS(K,J) ARB1F402.372
END DO ARB1F402.373
*ENDIF ARB1F402.376
SETTRA1A.180
CL End loop over levels. SETTRA1A.181
END DO SETTRA1A.182
SETTRA1A.183
CL END OF ROUTINE SET_TRAC SETTRA1A.184
SETTRA1A.185
RETURN SETTRA1A.186
END SETTRA1A.187
*ENDIF SETTRA1A.188