*IF DEF,A06_2A GWLINP2A.2 C ******************************COPYRIGHT****************************** GTS2F400.3619 C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.3620 C GTS2F400.3621 C Use, duplication or disclosure of this code is subject to the GTS2F400.3622 C restrictions as set forth in the contract. GTS2F400.3623 C GTS2F400.3624 C Meteorological Office GTS2F400.3625 C London Road GTS2F400.3626 C BRACKNELL GTS2F400.3627 C Berkshire UK GTS2F400.3628 C RG12 2SZ GTS2F400.3629 C GTS2F400.3630 C If no contract has been raised with this copy of the code, the use, GTS2F400.3631 C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.3632 C to do so must first be obtained in writing from the Head of Numerical GTS2F400.3633 C Modelling at the above address. GTS2F400.3634 C ******************************COPYRIGHT****************************** GTS2F400.3635 C GTS2F400.3636 CLL SUBROUTINE GW_LIN_P----------------------------------------- GWLINP2A.3 CLL GWLINP2A.4 CLL PURPOSE: TO CALCULATE STRESS PROFILE DUE TO SUBGRID-SCALE GWLINP2A.5 CLL OROGRAPHIC GRAVITY WAVES AND HENCE DRAG ON MEAN FLOW. GWLINP2A.6 CLL THE WAVES PROPOGATE VERTICALLY WITH STRESS DECREASING GWLINP2A.7 CLL WITH PRESSURE;IF A CRITICAL LEVEL IS GWLINP2A.8 CLL DIAGNOSED THE STRESS IS SET TO ZERO> GWLINP2A.9 CLL SUITABLE FOR SINGLE COLUMN USE GWLINP2A.10 CLL GWLINP2A.11 CLL SUITABLE FOR ROTATED GRIDS GWLINP2A.12 CLL GWLINP2A.13 CLL ORIGINAL VERSION FOR CRAY Y-MP GWLINP2A.14 CLL WRITTEN BY C. WILSON GWLINP2A.15 CLL FURTHER ALTERATIONS MAY BE REQUIRED FOR AUTOTASKING EFFICIENCY GWLINP2A.16 CLL PROGRAMMING STANDARD: UNIFIED MODEL DOCUMENTATION PAPER NO. 4, GWLINP2A.17 CLL GWLINP2A.18 CLL MODEL MODIFICATION HISTORY FROM MODEL VERSION 3.0: GWLINP2A.19 CLL VERSION DATE GWLINP2A.20 CLL GWLINP2A.21 CLL 3.3 25/10/93 Removal of DIAG06 directive. New arguments to DR251093.134 CLL dimension diagnostic arrays. D. Robinson. DR251093.135 CLL 4.4 19/09/97 Remove *IF -DEF,CRAY compile options. S.Webster ASW1F404.5 CLL DR251093.136 CLL LOGICAL COMPONENTS COVERED: P22 GWLINP2A.22 CLL GWLINP2A.23 CLL SYSTEM TASK: PART OF P22 GWLINP2A.24 CLL GWLINP2A.25 CLL DOCUMENTATION: THE EQUATIONS USED ARE (???) TO (???) GWLINP2A.26 CLL IN UNIFIED MODEL DOCUMENTATION PAPER NO 22 GWLINP2A.27 CLL C. A. WILSON AND R. SWINBANK GWLINP2A.28 CLL VERSION ?,DATED ??/??/91 GWLINP2A.29 CLLEND------------------------------------------------------------- GWLINP2A.30 GWLINP2A.31 C GWLINP2A.32 C*L ARGUMENTS:--------------------------------------------------- GWLINP2A.33SUBROUTINE GW_LIN_P 1GWLINP2A.34 1 (PSTAR,PEXNER,THETA,U,V,S_STRESS,START_L,LEVELS,POINTS, GWLINP2A.35 2 AKH,BKH,DELTA_AK,DELTA_BK,SIN_A,COS_A, GWLINP2A.36 3 DU_DT,DV_DT, DR251093.137 4 STRESS_UD_LAND,LAND_POINTS_UD,STRESS_UD_ON, DR251093.138 5 STRESS_VD_LAND,LAND_POINTS_VD,STRESS_VD_ON) DR251093.139 GWLINP2A.48 IMPLICIT NONE GWLINP2A.49 GWLINP2A.50 INTEGER GWLINP2A.51 * LEVELS !IN NUMBER OF MODEL LEVELS GWLINP2A.52 *,START_L !IN START LEVEL FOR WAVE-BREAKING TEST GWLINP2A.53 *,POINTS !IN NUMBER OF POINTS GWLINP2A.54 *,LAND_POINTS_UD !IN ) No of land points of diagnostic DR251093.140 *,LAND_POINTS_VD !IN ) arrays for GW stress - u and v DR251093.141 GWLINP2A.56 REAL GWLINP2A.57 * PSTAR(POINTS) !IN PSTAR FIELD GWLINP2A.58 *,PEXNER(POINTS,LEVELS+1) !IN PEXNER GWLINP2A.59 *,THETA(POINTS,LEVELS) !IN THETA FIELD GWLINP2A.60 *,U(POINTS,LEVELS) !IN U FIELD GWLINP2A.61 *,V(POINTS,LEVELS) !IN V FIELD GWLINP2A.62 *,S_STRESS(POINTS) !IN 'SURFACE' STRESS GWLINP2A.63 C AKH,BKH DEFINE HYBRID VERTICAL COORDINATES P=A+BP*-LAYER EDGES, GWLINP2A.64 C DELTA_AK,DELTA_BK DEFINE PRESSURE DIFFERENCES ACROSS LAYERS GWLINP2A.65 REAL GWLINP2A.66 * AKH(LEVELS+1) !IN VALUE AT LAYER BOUNDARY GWLINP2A.67 *,BKH(LEVELS+1) !IN VALUE AT LAYER BOUMDARY GWLINP2A.68 *,DELTA_AK (LEVELS) !IN DIFFERENCE ACROSS LAYER GWLINP2A.69 *,DELTA_BK (LEVELS) !IN DIFFERENCE ACROSS LAYER GWLINP2A.70 *,SIN_A(POINTS) !IN SIN (STRESS DIRECTION FROM NORTH) GWLINP2A.71 *,COS_A(POINTS) !IN COS (STRESS DIRECTION FROM NORTH) GWLINP2A.72 *,DU_DT(POINTS,LEVELS) !OUT U-ACCELERATION GWLINP2A.73 *,DV_DT(POINTS,LEVELS) !OUT V-ACCELERATION GWLINP2A.74 GWLINP2A.75 REAL DR251093.142 * STRESS_UD_LAND(LAND_POINTS_UD,LEVELS+1) !U STRESS DIAGNOSTIC DR251093.143 *,STRESS_VD_LAND(LAND_POINTS_VD,LEVELS+1) !V STRESS DIAGNOSTIC DR251093.144 GWLINP2A.77 LOGICAL DR251093.145 * STRESS_UD_ON ! ) Diagnostic switches for GW stress - DR251093.146 *,STRESS_VD_ON ! ) u and v (Item Nos 201 and 202) DR251093.147 GWLINP2A.83 C*--------------------------------------------------------------------- GWLINP2A.84 GWLINP2A.85 C*L WORKSPACE USAGE:------------------------------------------------- GWLINP2A.86 C DEFINE LOCAL WORKSPACE ARRAYS: GWLINP2A.87 C 9 REAL ARRAYS OF FULL FIELD LENGTH REQUIRED GWLINP2A.88 C GWLINP2A.89 GWLINP2A.95 REAL GWLINP2A.96 * DZ(POINTS,3) ! HEIGHT DIFFERENCES IN EACH HALF LAYER GWLINP2A.97 *,SPEED(POINTS,2) ! WIND SPEEDS (LEVELS) GWLINP2A.98 *,STRESS(POINTS,2) ! STRESSES (LAYER BOUNDARIES) GWLINP2A.99 *,D_STRESS_DP(POINTS) ! STRESS GRADIENT GWLINP2A.100 *,DRAG(POINTS) ! DRAG EXERTED ON LAYER(IN DIRECTION OF GWLINP2A.101 * ! SURFACE STRESS GWLINP2A.102 GWLINP2A.104 C*--------------------------------------------------------------------- GWLINP2A.105 C GWLINP2A.106 C*L EXTERNAL SUBROUTINES CALLED--------------------------------------- GWLINP2A.107 C NONE GWLINP2A.108 C*------------------------------------------------------------------ GWLINP2A.109 CL MAXIMUM VECTOR LENGTH ASSUMED = POINTS GWLINP2A.110 CL--------------------------------------------------------------------- GWLINP2A.111 C---------------------------------------------------------------------- GWLINP2A.112 C GWLINP2A.113 C DEFINE LOCAL VARIABLES GWLINP2A.114 C LOCAL VARIABLES: GWLINP2A.115 C GWLINP2A.116 REAL GWLINP2A.117 * SPEEDB ! WIND SPEEDS AT LAYER BOUNDARY GWLINP2A.118 *,DZB ! HEIGHT DIFFERENCE ACROSS LAYER BOUNDARY GWLINP2A.119 *,DELTA_P ! DIFFERENCE IN PRESSURE ACROSS LAYER GWLINP2A.120 REAL GWLINP2A.121 * DELTA_AK_SUM ! DELTA_AK SUMMED OVER LOWEST LAYERS UP TO START_L GWLINP2A.122 *,DELTA_BK_SUM ! DELTA_BK SUMMED OVER LOWEST LAYERS UP TO START_L GWLINP2A.123 INTEGER I,K ! LOOP COUNTER IN ROUTINE GWLINP2A.124 INTEGER KK,KL,KU,KT ! LEVEL COUNTERS IN ROUTINE GWLINP2A.125 C GWLINP2A.126 C INCLUDE PHYSICAL CONSTANTS GWLINP2A.127 *CALL C_G
GWLINP2A.128 *CALL C_R_CP
GWLINP2A.129 GWLINP2A.130 C LOCAL CONSTANTS GWLINP2A.131 *CALL C_GWAVE
GWLINP2A.132 GWLINP2A.133 REAL CPBYG GWLINP2A.134 PARAMETER(CPBYG=CP/G) GWLINP2A.135 GWLINP2A.136 REAL GWLINP2A.137 & PU,PL,P_EXNER_CENTRE GWLINP2A.138 *CALL P_EXNERC
GWLINP2A.139 GWLINP2A.140 C------------------------------------------------------------------- GWLINP2A.141 CL INTERNAL STRUCTURE INCLUDING SUBROUTINE CALLS: GWLINP2A.142 CL 1. START LEVEL PRELIMINARIES GWLINP2A.143 C------------------------------------------ GWLINP2A.144 GWLINP2A.145 CFPP$ NOCONCUR L GWLINP2A.146 C TREAT LAYERS BELOW AND INCLUDING START_L AS ONE LAYER GWLINP2A.147 DELTA_AK_SUM = 0.0 GWLINP2A.148 DELTA_BK_SUM = 0.0 GWLINP2A.149 DO K=1,START_L GWLINP2A.150 DELTA_AK_SUM = DELTA_AK_SUM + DELTA_AK(K) GWLINP2A.151 DELTA_BK_SUM = DELTA_BK_SUM + DELTA_BK(K) GWLINP2A.152 END DO GWLINP2A.153 CFPP$ CONCUR GWLINP2A.154 GWLINP2A.155 KL=1 GWLINP2A.156 KU=2 GWLINP2A.157 KT=3 GWLINP2A.158 GWLINP2A.159 DO I=1,POINTS GWLINP2A.160 GWLINP2A.161 SPEED(I,KL) = U(I,START_L)*SIN_A(I) + V(I,START_L)*COS_A(I) GWLINP2A.162 STRESS(I,KL) = S_STRESS(I) GWLINP2A.163 D_STRESS_DP(I) = S_STRESS(I)/ PSTAR(I) GWLINP2A.164 GWLINP2A.165 PU=PSTAR(I)*BKH(START_L+1) + AKH(START_L+1) GWLINP2A.166 PL=PSTAR(I)*BKH(START_L) + AKH(START_L) GWLINP2A.167 P_EXNER_CENTRE= GWLINP2A.168 & P_EXNER_C( PEXNER(I,START_L+1),PEXNER(I,START_L),PU,PL,KAPPA) GWLINP2A.169 GWLINP2A.170 DZ(I,KL) = (P_EXNER_CENTRE - PEXNER(I,START_L+1)) GWLINP2A.171 * *THETA(I,START_L)*CPBYG GWLINP2A.172 GWLINP2A.179 END DO GWLINP2A.180 DR251093.148 IF (STRESS_UD_ON) THEN DR251093.149 DO I=1,POINTS DR251093.150 STRESS_UD_LAND(I,START_L) = STRESS(I,KL)*SIN_A(I) DR251093.151 END DO DR251093.152 ENDIF DR251093.153 IF (STRESS_VD_ON) THEN DR251093.154 DO I=1,POINTS DR251093.155 STRESS_VD_LAND(I,START_L) = STRESS(I,KL)*COS_A(I) DR251093.156 END DO DR251093.157 ENDIF DR251093.158 GWLINP2A.181 C------------------------------------------------------------------ GWLINP2A.182 CL 2 LOOP LEVELS GWLINP2A.183 C------------------------------------------------------------------ GWLINP2A.184 GWLINP2A.185 DO K=START_L+1,LEVELS GWLINP2A.186 GWLINP2A.187 DO I=1,POINTS GWLINP2A.189 DELTA_P = DELTA_AK(K-1)+DELTA_BK(K-1)*PSTAR(I) GWLINP2A.190 STRESS(I,KU) = STRESS(I,KL) GWLINP2A.191 IF(STRESS(I,KL) .GT. 0.0) THEN GWLINP2A.192 SPEED(I,KU) = U(I,K)*SIN_A(I) + V(I,K)*COS_A(I) GWLINP2A.193 GWLINP2A.194 PU=PSTAR(I)*BKH(K+1) + AKH(K+1) GWLINP2A.195 PL=PSTAR(I)*BKH(K) + AKH(K) GWLINP2A.196 P_EXNER_CENTRE= GWLINP2A.197 & P_EXNER_C( PEXNER(I,K+1),PEXNER(I,K),PU,PL,KAPPA) GWLINP2A.198 GWLINP2A.199 C lower half height of upper layer GWLINP2A.200 DZ(I,KU) = (PEXNER(I,K) - P_EXNER_CENTRE)*THETA(I,K) GWLINP2A.201 * *CPBYG GWLINP2A.202 C upper half height of upper layer GWLINP2A.203 DZ(I,KT) = (P_EXNER_CENTRE - PEXNER(I,K+1))*THETA(I,K) GWLINP2A.204 * *CPBYG GWLINP2A.205 C model level height difference GWLINP2A.206 DZB = DZ(I,KU) + DZ(I,KL) GWLINP2A.207 SPEEDB = (DZ(I,KU)*SPEED(I,KL)+DZ(I,KL)*SPEED(I,KU))/ GWLINP2A.208 * DZB GWLINP2A.209 GWLINP2A.210 C------------------------------------------------------------------ GWLINP2A.211 CL 2.1 TEST FOR CRITICAL LEVEL V < or = 0 GWLINP2A.212 C------------------------------------------------------------------ GWLINP2A.213 GWLINP2A.214 IF( SPEEDB .LE. 0.0) THEN GWLINP2A.215 STRESS(I,KU) = 0.0 GWLINP2A.216 ELSE GWLINP2A.217 GWLINP2A.218 C------------------------------------------------------------------ GWLINP2A.219 CL 2.2 CALCULATE STRESS AT UPPER BOUNDARY ASSUMING GWLINP2A.220 CL UNIFORM PROFILE (WITH PRESSURE) GWLINP2A.221 CL N.B. DELTA_P IS -VE GWLINP2A.222 C------------------------------------------------------------------ GWLINP2A.223 GWLINP2A.224 STRESS(I,KU) = STRESS(I,KL)+D_STRESS_DP(I)*DELTA_P GWLINP2A.225 GWLINP2A.226 END IF ! SPEED < 0 ELSE SPEED >0 GWLINP2A.227 GWLINP2A.228 END IF ! STRESS >0 GWLINP2A.229 GWLINP2A.230 IF( K .EQ. START_L+1 ) THEN GWLINP2A.231 DELTA_P = DELTA_AK_SUM+DELTA_BK_SUM*PSTAR(I) GWLINP2A.232 END IF GWLINP2A.233 GWLINP2A.234 C------------------------------------------------------------------ GWLINP2A.235 CL 2.4 CALCULATE DRAG FROM VERTICAL STRESS CONVERGENCE GWLINP2A.236 CL AND ACCELERATIONS FOR WIND COMPONENTS GWLINP2A.237 CL EQN 2.1 GWLINP2A.238 C------------------------------------------------------------------ GWLINP2A.239 GWLINP2A.240 DRAG(I) = G*(STRESS(I,KU) - STRESS(I,KL) )/DELTA_P GWLINP2A.241 DU_DT(I,K-1) = -DRAG(I)*SIN_A(I) GWLINP2A.242 DV_DT(I,K-1) = -DRAG(I)*COS_A(I) GWLINP2A.243 GWLINP2A.244 END DO GWLINP2A.251 GWLINP2A.252 IF (STRESS_UD_ON) THEN DR251093.159 DO I=1,POINTS DR251093.160 STRESS_UD_LAND(I,K) = STRESS(I,KU)*SIN_A(I) DR251093.161 END DO DR251093.162 ENDIF DR251093.163 IF (STRESS_VD_ON) THEN DR251093.164 DO I=1,POINTS DR251093.165 STRESS_VD_LAND(I,K) = STRESS(I,KU)*COS_A(I) DR251093.166 END DO DR251093.167 ENDIF DR251093.168 GWLINP2A.253 IF( K .EQ. START_L+1 .AND. START_L .GT.1 ) THEN GWLINP2A.254 C SET ACCELERATION SAME IN ALL LAYERS UP TO START_L GWLINP2A.255 DO KK=1,START_L-1 GWLINP2A.256 DO I=1,POINTS GWLINP2A.257 DU_DT(I,KK) = DU_DT(I,START_L) GWLINP2A.258 DV_DT(I,KK) = DV_DT(I,START_L) GWLINP2A.259 END DO GWLINP2A.260 END DO GWLINP2A.261 END IF GWLINP2A.262 GWLINP2A.263 C Swap storage for lower and upper layers GWLINP2A.264 KK=KL GWLINP2A.265 KL=KU GWLINP2A.266 KU=KK GWLINP2A.267 GWLINP2A.268 C Replace top half height of lower layer ready for next pass GWLINP2A.269 DO I=1,POINTS GWLINP2A.270 DZ(I,KL)=DZ(I,KT) GWLINP2A.271 ENDDO GWLINP2A.272 GWLINP2A.273 END DO GWLINP2A.274 CL END LOOP LEVELS GWLINP2A.275 GWLINP2A.276 C------------------------------------------------------------------ GWLINP2A.277 CL 3 TOP OF MODEL. SET ACCELERATION SAME AS PENULTIMATE LAYER GWLINP2A.278 CL WITH PROVISO THAT STRESS >= 0 GWLINP2A.279 C------------------------------------------------------------------ GWLINP2A.280 GWLINP2A.281 DO I=1,POINTS GWLINP2A.282 DELTA_P = DELTA_AK(LEVELS) + DELTA_BK(LEVELS)*PSTAR(I) GWLINP2A.283 STRESS(I,KU) = STRESS(I,KL) + DRAG(I)*DELTA_P/G GWLINP2A.284 IF( STRESS(I,KU) .LT. 0.0) STRESS(I,KU) = 0.0 GWLINP2A.285 DRAG(I) = G*(STRESS(I,KU) - STRESS(I,KL) )/DELTA_P GWLINP2A.286 DU_DT(I,LEVELS) = -DRAG(I)*SIN_A(I) GWLINP2A.287 DV_DT(I,LEVELS) = -DRAG(I)*COS_A(I) GWLINP2A.288 END DO DR251093.169 GWLINP2A.289 IF (STRESS_UD_ON) THEN DR251093.170 DO I=1,POINTS DR251093.171 STRESS_UD_LAND(I,LEVELS+1) = STRESS(I,KU)*SIN_A(I) DR251093.172 ENDDO DR251093.173 ENDIF DR251093.174 IF (STRESS_VD_ON) THEN DR251093.175 DO I=1,POINTS DR251093.176 STRESS_VD_LAND(I,LEVELS+1) = STRESS(I,KU)*COS_A(I) DR251093.177 ENDDO DR251093.178 ENDIF DR251093.179 GWLINP2A.297 RETURN GWLINP2A.298 END GWLINP2A.299 GWLINP2A.300 *ENDIF GWLINP2A.301