*IF DEF,A12_1C,OR,DEF,A12_1D ATJ0F402.20 *IF DEF,MPP ATJ0F402.21 C *****************************COPYRIGHT****************************** ADVUGD1C.3 C (c) CROWN COPYRIGHT 1996, METEOROLOGICAL OFFICE, All Rights Reserved. ADVUGD1C.4 C ADVUGD1C.5 C Use, duplication or disclosure of this code is subject to the ADVUGD1C.6 C restrictions as set forth in the contract. ADVUGD1C.7 C ADVUGD1C.8 C Meteorological Office ADVUGD1C.9 C London Road ADVUGD1C.10 C BRACKNELL ADVUGD1C.11 C Berkshire UK ADVUGD1C.12 C RG12 2SZ ADVUGD1C.13 C ADVUGD1C.14 C If no contract has been raised with this copy of the code, the use, ADVUGD1C.15 C duplication or disclosure of it is strictly prohibited. Permission ADVUGD1C.16 C to do so must first be obtained in writing from the Head of Numerical ADVUGD1C.17 C Modelling at the above address. ADVUGD1C.18 C ******************************COPYRIGHT****************************** ADVUGD1C.19 CLL SUBROUTINE ADV_U_GD ------------------------------------------- ADVUGD1C.20 CLL ADVUGD1C.21 CLL PURPOSE: CALCULATES ADVECTION INCREMENTS TO A FIELD AT A ADVUGD1C.22 CLL SINGLE MODEL LEVEL USING AN EQUATION OF THE FORM(38). ADVUGD1C.23 CLL NOT SUITABLE FOR SINGLE COLUMN USE. ADVUGD1C.24 CLL ADVUGD1C.25 CLL VERSION FOR CRAY Y-MP ADVUGD1C.26 CLL ADVUGD1C.27 CLL WRITTEN BY M.H MAWSON. ADVUGD1C.28 CLL MPP CODE ADDED BY P.BURTON ADVUGD1C.29 CLL ADVUGD1C.30 CLL Model Modification history from model version 3.0: ADVUGD1C.31 CLL version Date ADVUGD1C.32 CLL 4.1 29/11/95 New version of routine specifically for MPP ADVUGD1C.33 CLL Fourth order MPP code by Roar Skalin ADVUGD1C.34 CLL P.Burton ADVUGD1C.35 !LL 4.2 10/01/97 Amend calculation to prevent different answers ADR2F402.38 !LL with different compiler options. D. Robinson. ADR2F402.39 !LL 4.4 24/04/97 Removed QAN fix. P.Burton GPB5F403.1 C vn4.3 Mar. 97 T3E migration : optimisation changes GSS1F403.739 C D.Salmond GSS1F403.740 CLL ADVUGD1C.36 CLL PROGRAMMING STANDARD: UNIFIED MODEL DOCUMENTATION PAPER NO. 4, ADVUGD1C.37 CLL STANDARD B. VERSION 2, DATED 18/01/90 ADVUGD1C.38 CLL ADVUGD1C.39 CLL LOGICAL COMPONENTS COVERED: P122 ADVUGD1C.40 CLL ADVUGD1C.41 CLL PROJECT TASK: P1 ADVUGD1C.42 CLL ADVUGD1C.43 CLL DOCUMENTATION: THE EQUATION USED IS (37) ADVUGD1C.44 CLL IN UNIFIED MODEL DOCUMENTATION PAPER NO. 10 ADVUGD1C.45 CLL M.J.P. CULLEN,T.DAVIES AND M.H.MAWSON ADVUGD1C.46 CLLEND------------------------------------------------------------- ADVUGD1C.47 CLL ADVUGD1C.48 C*L ARGUMENTS:--------------------------------------------------- ADVUGD1C.49SUBROUTINE ADV_U_GD 12ADVUGD1C.50 1 (FIELD_LOWER,FIELD,FIELD_UPPER,U,V, ADVUGD1C.51 1 ETADOT_LOWER,ETADOT_UPPER, ADVUGD1C.52 2 SEC_U_LATITUDE,FIELD_INC,NUX,NUY,U_FIELD, ADVUGD1C.53 3 ROW_LENGTH, ADVUGD1C.54 *CALL ARGFLDPT
ADVUGD1C.55 4 ADVECTION_TIMESTEP, ADVUGD1C.56 5 LATITUDE_STEP_INVERSE,LONGITUDE_STEP_INVERSE, ADVUGD1C.57 6 SEC_P_LATITUDE,BRSP, ADVUGD1C.58 7 L_SECOND,LWHITBROM, ADVUGD1C.59 & extended_FIELD,extended_U_FIELD, GSS1F403.741 & extended_address) GSS1F403.742 ADVUGD1C.61 IMPLICIT NONE ADVUGD1C.62 ADVUGD1C.63 INTEGER ADVUGD1C.64 * U_FIELD !IN DIMENSION OF FIELDS ON VELOCITY GRID ADVUGD1C.65 &, extended_U_FIELD !IN DIMENSION of U fields with extra halo ADVUGD1C.66 *, ROW_LENGTH !IN NUMBER OF POINTS PER ROW ADVUGD1C.67 ADVUGD1C.68 ! All TYPFLDPT arguments are intent IN ADVUGD1C.69 *CALL TYPFLDPT
ADVUGD1C.70 ADVUGD1C.71 REAL ADVUGD1C.72 * U(extended_U_FIELD) !IN ADVECTING U FIELD MASS-WEIGHTED AND ADVUGD1C.73 * ! HELD AT P POINTS. FIRST POINT OF FIELD ADVUGD1C.74 * ! IS FIRST P POINT ON SECOND ROW OF P-GRID. ADVUGD1C.75 *,V(extended_U_FIELD) !IN ADVECTING V FIELD MASS-WEIGHTED AND ADVUGD1C.76 * ! HELD AT P POINTS. FIRST POINT OF FIELD ADVUGD1C.77 * ! IS FIRST P POINT ON SECOND ROW OF P-GRID. ADVUGD1C.78 *,ETADOT_UPPER(U_FIELD)!IN ADVECTING VERTICAL VELOC AT K+1/2, ADVUGD1C.79 * ! MASS-WEIGHTED. ADVUGD1C.80 *,ETADOT_LOWER(U_FIELD)!IN ADVECTING VERTICAL VELOC AT K-1/2, ADVUGD1C.81 * ! MASS-WEIGHTED. ADVUGD1C.82 *,FIELD(U_FIELD) !IN FIELD TO BE ADVECTED. ADVUGD1C.83 *,FIELD_UPPER(U_FIELD) !IN FIELD TO BE ADVECTED AT LEVEL + 1 . ADVUGD1C.84 *,FIELD_LOWER(U_FIELD) !IN FIELD TO BE ADVECTED AT LEVEL - 1 . ADVUGD1C.85 *,NUX(U_FIELD) !IN HOLDS PARAMETER NU FOR EAST-WEST ADVECTION. ADVUGD1C.86 *,NUY(U_FIELD) !IN HOLDS PARAMETER NU FOR NORTH-SOUTH ADVECTION. ADVUGD1C.87 *,SEC_U_LATITUDE(U_FIELD) !IN HOLDS 1/COS(PHI) AT U POINTS. ADVUGD1C.88 *,SEC_P_LATITUDE(U_FIELD) !IN HOLDS 1/COS(PHI) AT P POINTS. ADVUGD1C.89 *,ADVECTION_TIMESTEP !IN ADVUGD1C.90 *,LATITUDE_STEP_INVERSE !IN 1/(DELTA PHI) ADVUGD1C.91 *,LONGITUDE_STEP_INVERSE !IN 1/(DELTA LAMDA) ADVUGD1C.92 ADVUGD1C.93 REAL ADVUGD1C.94 * BRSP(U_FIELD) !IN BRSP TERM AT LEVEL+1/2 (SEE DOC.PAPER ADVUGD1C.95 * ! NO 10) ADVUGD1C.96 ADVUGD1C.97 REAL ADVUGD1C.98 * FIELD_INC(U_FIELD) !OUT HOLDS INCREMENT TO FIELD. ADVUGD1C.99 ADVUGD1C.100 REAL ADVUGD1C.101 * VERTICAL_FLUX(U_FIELD) !INOUT HOLDS VERTICAL FLUX OF FIELD ADVUGD1C.102 * ! BETWEEN TWO LEVELS. ADVUGD1C.103 ADVUGD1C.104 REAL ADVUGD1C.105 & extended_FIELD(extended_U_FIELD) ! IN field to be advected with ADVUGD1C.106 ! ! extra halos for 4th order ADVUGD1C.107 INTEGER extended_address(U_FIELD) GSS1F403.743 ADVUGD1C.108 C LOGICAL VARIABLE ADVUGD1C.109 LOGICAL ADVUGD1C.110 * L_SECOND ! SET TO TRUE IF NU_BASIC IS ZERO. ADVUGD1C.111 * ,LWHITBROM ! Switch for White & Bromley terms ADVUGD1C.112 C ADVUGD1C.113 ADVUGD1C.114 C*L DEFINE ARRAYS AND VARIABLES USED IN THIS ROUTINE----------------- ADVUGD1C.115 C DEFINE LOCAL ARRAYS: 3 ARE REQUIRED ADVUGD1C.116 ADVUGD1C.117 REAL ADVUGD1C.118 * WORK(U_FIELD) ! GENERAL WORK-SPACE. ADVUGD1C.119 *,U_TERM(U_FIELD) ! HOLDS U ADVECTION TERM FROM EQUATION (37) ADVUGD1C.120 *,V_TERM(U_FIELD) ! HOLDS V ADVECTION TERM FROM EQUATION (37) ADVUGD1C.121 C*--------------------------------------------------------------------- ADVUGD1C.122 C DEFINE LOCAL VARIABLES ADVUGD1C.123 ADVUGD1C.124 C REAL SCALARS ADVUGD1C.125 REAL ADVUGD1C.126 * SCALAR1,SCALAR2 ADVUGD1C.127 ADVUGD1C.128 C COUNT VARIABLES FOR DO LOOPS ETC. ADVUGD1C.129 INTEGER ADVUGD1C.130 * I,J ADVUGD1C.131 ADVUGD1C.132 ! Work space and scalars for the MPP Fourth Order Advection ADVUGD1C.133 INTEGER extended_index, ! index for position in extended array ADVUGD1C.134 & extended_START_POINT_NO_HALO, ADVUGD1C.135 ! ! start pos in extended array ADVUGD1C.136 & extended_END_U_POINT_NO_HALO, ADVUGD1C.137 ! ! end pos in extended array ADVUGD1C.138 & extended_ROW_LENGTH,! row length of extended array ADVUGD1C.139 & I_start,I_end ! loop bounds for 4th order advection ADVUGD1C.140 ADVUGD1C.141 REAL ADR2F402.40 & extended_WORK(extended_U_FIELD) ! extended work space ADVUGD1C.143 ADVUGD1C.144 ADVUGD1C.148 C*L NO EXTERNAL SUBROUTINE CALLS:------------------------------------ ADVUGD1C.149 C*--------------------------------------------------------------------- ADVUGD1C.150 ADVUGD1C.151 CL MAXIMUM VECTOR LENGTH ASSUMED IS ADVUGD1C.152 CL END_U_POINT_NO_HALO-START_U_UPDATE+1 ADVUGD1C.153 CL--------------------------------------------------------------------- ADVUGD1C.154 ADVUGD1C.155 IF (.NOT. L_SECOND) THEN ADVUGD1C.156 ! Calculate indexes in extended_arrays ADVUGD1C.157 ADVUGD1C.158 extended_ROW_LENGTH=ROW_LENGTH+2*extra_EW_Halo ADVUGD1C.160 ADVUGD1C.176 extended_START_POINT_NO_HALO= ADVUGD1C.177 & extended_address(START_POINT_NO_HALO) ADVUGD1C.178 ADVUGD1C.179 extended_END_U_POINT_NO_HALO= ADVUGD1C.180 & extended_address(END_U_POINT_NO_HALO) ADVUGD1C.181 ADVUGD1C.182 ENDIF ADVUGD1C.183 ADVUGD1C.184 CL--------------------------------------------------------------------- ADVUGD1C.185 CL SECTION 1. CALCULATE U_TERM IN EQUATION (37). ADVUGD1C.186 CL--------------------------------------------------------------------- ADVUGD1C.187 ADVUGD1C.188 C---------------------------------------------------------------------- ADVUGD1C.189 CL SECTION 1.1 CALCULATE TERM U D(FIELD)/D(LAMDA). ADVUGD1C.190 C---------------------------------------------------------------------- ADVUGD1C.191 ADVUGD1C.192 C CALCULATE TERM AT ALL POINTS EXCEPT LAST AND STORE IN WORK. ADVUGD1C.193 ADVUGD1C.194 IF (L_SECOND) THEN ADVUGD1C.195 ! Loop over field, missing top and bottom rows, halos and last point ADVUGD1C.196 DO 110 I=START_POINT_NO_HALO,END_U_POINT_NO_HALO-1 ADVUGD1C.197 WORK(I) = .5*(U(I+1)+U(I+1-ROW_LENGTH))* ADVUGD1C.198 & LONGITUDE_STEP_INVERSE*(FIELD(I+1) - FIELD(I)) ADVUGD1C.199 110 CONTINUE ADVUGD1C.200 ADVUGD1C.201 *IF DEF,GLOBAL ADVUGD1C.202 WORK(END_U_POINT_NO_HALO)=WORK(END_U_POINT_NO_HALO-1) ADVUGD1C.203 *ENDIF ADVUGD1C.204 ADVUGD1C.205 ELSE ! fourth order ADVUGD1C.206 ! Loop over extended field, missing top and bottom rows and halos rows ADVUGD1C.207 DO I=extended_START_POINT_NO_HALO-1, ADVUGD1C.208 & extended_END_U_POINT_NO_HALO+1 ADVUGD1C.209 extended_WORK(I) = 0.5*(U(I+1)+U(I+1-extended_ROW_LENGTH))* ADVUGD1C.210 & LONGITUDE_STEP_INVERSE* ADVUGD1C.211 & (extended_FIELD(I+1)-extended_FIELD(I)) ADVUGD1C.212 ENDDO ADVUGD1C.213 ADVUGD1C.214 ENDIF ! IF (L_SECOND) ADVUGD1C.215 ADVUGD1C.216 ADVUGD1C.217 C---------------------------------------------------------------------- ADVUGD1C.218 CL SECTION 1.2 CALCULATE U ADVECTION TERM IN EQUATION (37). ADVUGD1C.219 CL IF L_SECOND=TRUE ONLY DO SECOND ORDER ADVECTION. ADVUGD1C.220 C---------------------------------------------------------------------- ADVUGD1C.221 ADVUGD1C.222 IF(L_SECOND) THEN ADVUGD1C.223 *IF DEF,GLOBAL ADVUGD1C.224 ! Loop over field, missing top and bottom rows and halos, and ADVUGD1C.225 ! first point. ADVUGD1C.226 DO J=START_POINT_NO_HALO+1,END_U_POINT_NO_HALO ADVUGD1C.227 U_TERM(J) = .5*(WORK(J)+WORK(J-1)) ADVUGD1C.228 END DO ADVUGD1C.229 ADVUGD1C.230 C CALCULATE VALUES AT FIRST POINTS ON A ROW. ADVUGD1C.231 U_TERM(START_POINT_NO_HALO)=U_TERM(START_POINT_NO_HALO+1) ADVUGD1C.232 ! MPP Code : No need to do recalculations of end points because cyclic ADVUGD1C.233 ! boundary conditions means that halos do this for us automatically ADVUGD1C.234 ADVUGD1C.235 *ELSE ADVUGD1C.236 C LIMITED AREA MODEL. VALUES NOT CALCULATED AT FIRST,SECOND,NEXT TO LAST ADVUGD1C.237 C AND LAST ON A ROW. ADVUGD1C.238 ADVUGD1C.239 ! Loop over field, missing top and bottom rows and halos, and ADVUGD1C.240 ! first and last points. ADVUGD1C.241 DO J=START_POINT_NO_HALO+1,END_U_POINT_NO_HALO-1 ADVUGD1C.242 U_TERM(J) = .5*(WORK(J)+WORK(J-1)) ADVUGD1C.243 END DO ADVUGD1C.244 ADVUGD1C.245 C CORNER VALUES ADVUGD1C.246 U_TERM(START_POINT_NO_HALO)=0.0 ADVUGD1C.247 U_TERM(END_U_POINT_NO_HALO)=0.0 ADVUGD1C.248 *ENDIF ADVUGD1C.249 ELSE ! Fourth order ADVUGD1C.250 ADVUGD1C.251 C LOOP OVER ALL POINTS BUT DON'T DO FIRST,SECOND AND LAST ON A ROW AS ADVUGD1C.252 C THEY NEED SPECIAL TREATMENT DUE TO FOURTH ORDER SCHEME. ADVUGD1C.253 ADVUGD1C.254 ! Loop over field, missing top and bottom rows and halos, and ADVUGD1C.255 ! first point. ADVUGD1C.256 DO 120 J=START_POINT_NO_HALO+1,END_U_POINT_NO_HALO ADVUGD1C.257 ! DO 120 J=START_POINT_NO_HALO+2,END_U_POINT_NO_HALO-1 ADVUGD1C.258 extended_index=extended_address(J) ADVUGD1C.259 ADVUGD1C.260 U_TERM(J) = (1.+NUX(J))*.5*(extended_WORK(extended_index)+ ADVUGD1C.261 & extended_WORK(extended_index-1)) ADVUGD1C.262 & -NUX(J) *.5*(extended_WORK(extended_index+1)+ ADVUGD1C.263 & extended_WORK(extended_index-2)) ADVUGD1C.264 120 CONTINUE ADVUGD1C.265 ADVUGD1C.266 *IF DEF,GLOBAL ADVUGD1C.267 U_TERM(START_POINT_NO_HALO)= U_TERM(START_POINT_NO_HALO+2) ADVUGD1C.268 ! U_TERM(START_POINT_NO_HALO+1)= U_TERM(START_POINT_NO_HALO+2) ADVUGD1C.269 ! U_TERM(END_U_POINT_NO_HALO)= U_TERM(END_U_POINT_NO_HALO-1) ADVUGD1C.270 ADVUGD1C.271 *ELSE ADVUGD1C.272 C LIMITED AREA MODEL. ADVUGD1C.273 C CALCULATE VALUES AT SECOND AND NEXT TO LAST POINTS ON A ROW. ADVUGD1C.274 C THESE VALUES ARE JUST SECOND ORDER. ADVUGD1C.275 ADVUGD1C.276 IF (at_left_of_LPG) THEN ADVUGD1C.277 ! Do second point along each row ADVUGD1C.278 DO I=START_POINT_NO_HALO+FIRST_ROW_PT,END_U_POINT_NO_HALO, ADVUGD1C.279 & ROW_LENGTH ADVUGD1C.280 extended_index=extended_address(I) ADVUGD1C.281 ADVUGD1C.282 U_TERM(I)= 0.5*(extended_WORK(extended_index)+ ADVUGD1C.283 & extended_WORK(extended_index-1)) ADVUGD1C.284 ENDDO ADVUGD1C.285 ENDIF ADVUGD1C.286 ADVUGD1C.287 ! Do penultimate point along each row ADVUGD1C.288 ADVUGD1C.289 IF (at_right_of_LPG) THEN ADVUGD1C.290 DO I=START_POINT_NO_HALO+LAST_ROW_PT-2,END_U_POINT_NO_HALO, ADVUGD1C.291 & ROW_LENGTH ADVUGD1C.292 extended_index=extended_address(I) ADVUGD1C.293 ADVUGD1C.294 U_TERM(I)= 0.5*(extended_WORK(extended_index)+ ADVUGD1C.295 & extended_WORK(extended_index-1)) ADVUGD1C.296 ENDDO ADVUGD1C.297 ENDIF ADVUGD1C.298 ADVUGD1C.299 U_TERM(START_POINT_NO_HALO)=0 ADVUGD1C.300 U_TERM(END_U_POINT_NO_HALO)=0 ADVUGD1C.301 ADVUGD1C.302 *ENDIF ADVUGD1C.303 END IF ! IF (L_SECOND) ADVUGD1C.304 ADVUGD1C.305 CL ADVUGD1C.306 CL--------------------------------------------------------------------- ADVUGD1C.307 CL SECTION 2. CALCULATE V_TERM IN EQUATION (37). ADVUGD1C.308 CL--------------------------------------------------------------------- ADVUGD1C.309 ADVUGD1C.310 C---------------------------------------------------------------------- ADVUGD1C.311 CL SECTION 2.1 CALCULATE TERM V D(FIELD)/D(PHI). ADVUGD1C.312 C---------------------------------------------------------------------- ADVUGD1C.313 ADVUGD1C.314 C CALCULATE TERM AT ALL POINTS EXCEPT LAST AND STORE IN WORK. ADVUGD1C.315 ADVUGD1C.316 IF (L_SECOND) THEN ADVUGD1C.317 ADVUGD1C.318 ! Loop over field, mssing bottom row and top and bottom halos and last ADVUGD1C.319 ! point. ADVUGD1C.320 DO 210 I=START_POINT_NO_HALO-ROW_LENGTH, ADVUGD1C.321 & END_U_POINT_NO_HALO-1 ADVUGD1C.322 WORK(I) = .5*(V(I)+V(I+1))*LATITUDE_STEP_INVERSE* ADVUGD1C.323 * (FIELD(I) - FIELD(I+ROW_LENGTH)) ADVUGD1C.324 210 CONTINUE ADVUGD1C.325 ADVUGD1C.326 *IF DEF,GLOBAL ADVUGD1C.327 C IF GLOBAL MODEL RECALCULATE END-POINT VALUE. ADVUGD1C.328 WORK(END_U_POINT_NO_HALO)=WORK(END_U_POINT_NO_HALO-1) ADVUGD1C.329 *ENDIF ADVUGD1C.330 ADVUGD1C.331 ELSE ! Fourth order ADVUGD1C.332 ! Calculate WORK at the Southern halo too. This is needed for the ADVUGD1C.333 ! computation of the Southern row ADVUGD1C.334 ADVUGD1C.335 ! DO I=extended_START_POINT_NO_HALO-2*extended_ROW_LENGTH, ADVUGD1C.336 ! & extended_END_U_POINT_NO_HALO+extended_ROW_LENGTH ADVUGD1C.337 IF (at_top_of_LPG) THEN ADVUGD1C.338 I_start=extended_address(TOP_ROW_START) ADVUGD1C.339 ELSE ADVUGD1C.340 I_start=extended_START_POINT_NO_HALO-2*extended_ROW_LENGTH ADVUGD1C.341 ENDIF ADVUGD1C.342 IF (at_base_of_LPG) THEN ADVUGD1C.343 I_end=extended_END_U_POINT_NO_HALO-1 ADVUGD1C.344 ELSE ADVUGD1C.345 I_end=extended_END_U_POINT_NO_HALO-1+extended_ROW_LENGTH ADVUGD1C.346 ENDIF ADVUGD1C.347 DO I=I_start,I_end ADVUGD1C.348 extended_WORK(I)=0.5*(V(I)+V(I+1))*LATITUDE_STEP_INVERSE* ADVUGD1C.349 & (extended_FIELD(I)-extended_FIELD(I+extended_ROW_LENGTH)) ADVUGD1C.350 ENDDO ADVUGD1C.351 extended_WORK(I_end+1)=extended_WORK(I_end) GPB5F403.2 ADVUGD1C.352 ENDIF ! L_SECOND ADVUGD1C.353 ADVUGD1C.354 ADVUGD1C.355 C---------------------------------------------------------------------- ADVUGD1C.356 CL SECTION 2.2 CALCULATE V ADVECTION TERM IN EQUATION (37). ADVUGD1C.357 CL IF L_SECOND=TRUE ONLY DO SECOND ORDER ADVECTION. ADVUGD1C.358 C---------------------------------------------------------------------- ADVUGD1C.359 ADVUGD1C.360 IF(L_SECOND) THEN ADVUGD1C.361 *IF DEF,GLOBAL ADVUGD1C.362 C GLOBAL MODEL. ADVUGD1C.363 C CALCULATE ALL VALUES EXCEPT ON ROWS NEXT TO POLES. ADVUGD1C.364 ADVUGD1C.365 ! Loop over field, missing top and bottom rows and halos ADVUGD1C.366 DO I=START_POINT_NO_HALO,END_U_POINT_NO_HALO ADVUGD1C.367 V_TERM(I) = .5*(WORK(I-ROW_LENGTH)+WORK(I)) ADVUGD1C.368 END DO ADVUGD1C.369 ADVUGD1C.370 *ELSE ADVUGD1C.371 C LIMITED AREA MODEL. ADVUGD1C.372 C CALCULATE ALL VALUES EXCEPT ON ROWS NEXT TO BOUNDARIES. ADVUGD1C.373 ADVUGD1C.374 ! Loop over field, missing top and bottom rows and halos, and ADVUGD1C.375 ! first and last points. ADVUGD1C.376 DO I=START_POINT_NO_HALO+1,END_U_POINT_NO_HALO-1 ADVUGD1C.377 V_TERM(I) = .5*(WORK(I-ROW_LENGTH)+WORK(I)) ADVUGD1C.378 END DO ADVUGD1C.379 ADVUGD1C.380 C SET LAST POINT OF LOOP TO ZERO. ADVUGD1C.381 V_TERM(END_U_POINT_NO_HALO-ROW_LENGTH) = 0.0 ADVUGD1C.382 ADVUGD1C.383 C CORNER VALUES ADVUGD1C.384 ADVUGD1C.385 V_TERM(START_POINT_NO_HALO)=0.0 ADVUGD1C.386 V_TERM(END_U_POINT_NO_HALO)=0.0 ADVUGD1C.387 ADVUGD1C.388 *ENDIF ADVUGD1C.389 ELSE ! Fourth order ADVUGD1C.390 *IF DEF,GLOBAL ADVUGD1C.391 C GLOBAL MODEL. ADVUGD1C.392 ! Calculate all values except on rows next to poles and next to the ADVUGD1C.393 ! processor interfaces ADVUGD1C.394 ADVUGD1C.395 ! Loop over field, missing top and bottom rows and halos ADVUGD1C.396 IF (at_top_of_LPG) THEN ADVUGD1C.397 I_start=START_POINT_NO_HALO+ROW_LENGTH ADVUGD1C.398 ELSE ADVUGD1C.399 I_start=START_POINT_NO_HALO ADVUGD1C.400 ENDIF ADVUGD1C.401 IF (at_base_of_LPG) THEN ADVUGD1C.402 I_end=END_U_POINT_NO_HALO-ROW_LENGTH ADVUGD1C.403 ELSE ADVUGD1C.404 I_end=END_U_POINT_NO_HALO ADVUGD1C.405 ENDIF ADVUGD1C.406 ! DO I=START_POINT_NO_HALO,END_U_POINT_NO_HALO ADVUGD1C.407 DO I=I_start,I_end ADVUGD1C.408 extended_index=extended_address(I) ADVUGD1C.409 ADVUGD1C.410 V_TERM(I) = (1.0+NUY(I))*0.5* ADVUGD1C.411 & (extended_WORK(extended_index-extended_ROW_LENGTH) ADVUGD1C.412 & + extended_WORK(extended_index)) ADVUGD1C.413 & - NUY(I) *0.5* ADVUGD1C.414 & (extended_WORK(extended_index+extended_ROW_LENGTH) ADVUGD1C.415 & + extended_WORK(extended_index-2*extended_ROW_LENGTH)) ADVUGD1C.416 ENDDO ADVUGD1C.417 ADVUGD1C.418 C CALCULATE VALUES ON SLICES NEXT TO POLES AND POLAR MERIDIONAL FLUXES. ADVUGD1C.419 C THESE TERMS ARE DIFFERENT TO THE ONES IN LOOP 220 SO AS TO ENSURE ADVUGD1C.420 C CONSERVATION OF FOURTH ORDER SCHEME WITHOUT USING VALUES FROM THE ADVUGD1C.421 C OTHER SIDE OF THE POLE. ADVUGD1C.422 ADVUGD1C.423 IF (at_top_of_LPG) THEN ADVUGD1C.424 ! Loop over row beneath pole ADVUGD1C.425 DO I=START_POINT_NO_HALO,START_POINT_NO_HALO+ROW_LENGTH-1 ADVUGD1C.426 extended_index=extended_address(I) ADVUGD1C.427 ADVUGD1C.428 V_TERM(I)=0.5*((1.0+NUY(I))* ADVUGD1C.429 & extended_WORK(extended_index-extended_ROW_LENGTH) + ADVUGD1C.430 & extended_WORK(extended_index)) ADVUGD1C.431 & - NUY(I)*0.5* ADVUGD1C.432 & extended_WORK(extended_index+extended_ROW_LENGTH) ADVUGD1C.433 ENDDO ADVUGD1C.434 ENDIF ADVUGD1C.435 ADVUGD1C.436 IF (at_base_of_LPG) THEN ADVUGD1C.437 ! Loop over row above pole ADVUGD1C.438 DO I=END_U_POINT_NO_HALO-ROW_LENGTH+1,END_U_POINT_NO_HALO ADVUGD1C.439 extended_index=extended_address(I) ADVUGD1C.440 ADVUGD1C.441 V_TERM(I)= ADVUGD1C.442 & 0.5*(extended_WORK(extended_index-extended_ROW_LENGTH) ADVUGD1C.443 & + (1.0+NUY(I))*extended_WORK(extended_index)) ADVUGD1C.444 & - NUY(I)*0.5* ADVUGD1C.445 & extended_WORK(extended_index-2*extended_ROW_LENGTH) ADVUGD1C.446 ADVUGD1C.447 ENDDO ADVUGD1C.448 ENDIF ADVUGD1C.449 ADVUGD1C.450 *ELSE ADVUGD1C.451 C LIMITED AREA MODEL. ADVUGD1C.452 C CALCULATE ALL VALUES EXCEPT ON ROWS NEXT TO BOUNDARIES. ADVUGD1C.453 ADVUGD1C.454 ! Loop over field, missing top and bottom rows and halos ADVUGD1C.455 IF (at_top_of_LPG) THEN ADVUGD1C.456 I_start=START_POINT_NO_HALO+ROW_LENGTH ADVUGD1C.457 ELSE ADVUGD1C.458 I_start=START_POINT_NO_HALO ADVUGD1C.459 ENDIF ADVUGD1C.460 IF (at_base_of_LPG) THEN ADVUGD1C.461 I_end=END_U_POINT_NO_HALO-ROW_LENGTH ADVUGD1C.462 ELSE ADVUGD1C.463 I_end=END_U_POINT_NO_HALO ADVUGD1C.464 ENDIF ADVUGD1C.465 ! DO I=START_POINT_NO_HALO,END_U_POINT_NO_HALO ADVUGD1C.466 DO I=I_start,I_end ADVUGD1C.467 extended_index=extended_address(I) ADVUGD1C.468 ADVUGD1C.469 V_TERM(I) = (1.0+NUY(I))*0.5* ADVUGD1C.470 & (extended_WORK(extended_index-extended_ROW_LENGTH) ADVUGD1C.471 & + extended_WORK(extended_index)) ADVUGD1C.472 & - NUY(I) *0.5* ADVUGD1C.473 & (extended_WORK(extended_index+extended_ROW_LENGTH) ADVUGD1C.474 & + extended_WORK(extended_index-2*extended_ROW_LENGTH)) ADVUGD1C.475 ENDDO ADVUGD1C.476 ADVUGD1C.477 C CALCULATE VALUES ON SLICES NEXT TO BOUNDARIES AS SECOND ORDER. ADVUGD1C.478 IF (at_top_of_LPG) THEN ADVUGD1C.479 ! Loop over row beneath top row ADVUGD1C.480 DO I=START_POINT_NO_HALO+FIRST_ROW_PT-1, ADVUGD1C.481 & START_POINT_NO_HALO+LAST_ROW_PT-1 ADVUGD1C.482 extended_index=extended_address(I) ADVUGD1C.483 V_TERM(I)=0.5* ADVUGD1C.484 & (extended_WORK(extended_index-extended_ROW_LENGTH) ADVUGD1C.485 & + extended_WORK(extended_index)) ADVUGD1C.486 ENDDO ADVUGD1C.487 ENDIF ADVUGD1C.488 ADVUGD1C.489 IF (at_base_of_LPG) THEN ADVUGD1C.490 DO I=END_U_POINT_NO_HALO-ROW_LENGTH+FIRST_ROW_PT, ADVUGD1C.491 & END_U_POINT_NO_HALO-ROW_LENGTH+LAST_ROW_PT ADVUGD1C.492 extended_index=extended_address(I) ADVUGD1C.493 V_TERM(I)=0.5* ADVUGD1C.494 & (extended_WORK(extended_index-extended_ROW_LENGTH) ADVUGD1C.495 & + extended_WORK(extended_index)) ADVUGD1C.496 ENDDO ADVUGD1C.497 ENDIF ADVUGD1C.498 ADVUGD1C.499 C CORNER VALUES ADVUGD1C.500 C ADVUGD1C.501 V_TERM(START_POINT_NO_HALO)=0.0 ADVUGD1C.502 V_TERM(START_POINT_NO_HALO+ROW_LENGTH-1)=0.0 ADVUGD1C.503 V_TERM(END_U_POINT_NO_HALO-ROW_LENGTH+1)=0.0 ADVUGD1C.504 V_TERM(END_U_POINT_NO_HALO)=0.0 ADVUGD1C.505 ADVUGD1C.506 *ENDIF ADVUGD1C.507 END IF ADVUGD1C.508 ADVUGD1C.509 CL ADVUGD1C.510 CL--------------------------------------------------------------------- ADVUGD1C.511 CL SECTION 3. CALCULATE VERTICAL FLUX AND COMBINE WITH U AND V ADVUGD1C.512 CL TERMS TO FORM INCREMENT. ADVUGD1C.513 CL--------------------------------------------------------------------- ADVUGD1C.514 ADVUGD1C.515 CL VERTICAL FLUX ON INPUT IS .5*TIMESTEP*ETADOT*D(FIELD)/D(ETA) ADVUGD1C.516 CL AT LEVEL K-1/2. AT THE END OF THEIS SECTION IT IS THE SAME ADVUGD1C.517 CL QUANTITY BUT AT LEVEL K+1/2. ADVUGD1C.518 ADVUGD1C.519 ! Loop over field, missing top and bottom rows and halos ADVUGD1C.520 DO 300 I=START_POINT_NO_HALO,END_U_POINT_NO_HALO ADVUGD1C.521 SCALAR1 = .5 * ADVECTION_TIMESTEP * ADVUGD1C.522 * ETADOT_UPPER(I) * (FIELD_UPPER(I) - FIELD(I)) ADVUGD1C.523 SCALAR2 = .5 * ADVECTION_TIMESTEP * ADVUGD1C.524 * ETADOT_LOWER(I) * (FIELD(I) - FIELD_LOWER(I)) ADVUGD1C.525 FIELD_INC(I) = ADVECTION_TIMESTEP * SEC_U_LATITUDE(I) * ADVUGD1C.526 * (U_TERM(I)+V_TERM(I)) ADVUGD1C.527 & + SCALAR1+SCALAR2 ADVUGD1C.528 IF (LWHITBROM) THEN ADVUGD1C.529 FIELD_INC(I) = FIELD_INC(I) ADVUGD1C.530 * + FIELD(I)*BRSP(I) ADVUGD1C.531 END IF ADVUGD1C.532 300 CONTINUE ADVUGD1C.533 ADVUGD1C.534 *IF -DEF,GLOBAL ADVUGD1C.535 ADVUGD1C.536 CL LIMITED AREA MODEL SET BOUNDARY INCREMENTS TO ZERO. ADVUGD1C.537 ADVUGD1C.538 IF (at_left_of_LPG) THEN ADVUGD1C.539 DO I=START_POINT_NO_HALO+FIRST_ROW_PT-1, ADVUGD1C.540 & END_U_POINT_NO_HALO,ROW_LENGTH ADVUGD1C.541 FIELD_INC(I)=0.0 ADVUGD1C.542 ENDDO ADVUGD1C.543 ENDIF ADVUGD1C.544 ADVUGD1C.545 IF (at_right_of_LPG) THEN ADVUGD1C.546 DO I=START_POINT_NO_HALO+LAST_ROW_PT-2, ADVUGD1C.547 & END_U_POINT_NO_HALO,ROW_LENGTH ADVUGD1C.548 FIELD_INC(I)=0.0 ADVUGD1C.549 FIELD_INC(I+1)=0.0 ADVUGD1C.550 ENDDO ADVUGD1C.551 ENDIF ADVUGD1C.552 ADVUGD1C.553 *ENDIF ADVUGD1C.554 ADVUGD1C.555 CL END OF ROUTINE ADV_U_GD ADVUGD1C.556 ADVUGD1C.557 RETURN ADVUGD1C.558 END ADVUGD1C.559 *ENDIF ATJ0F402.22 *ENDIF ADVUGD1C.560