*IF DEF,A06_3B GWJUMP3B.2 C ******************************COPYRIGHT****************************** GWJUMP3B.3 C (c) CROWN COPYRIGHT 1998, METEOROLOGICAL OFFICE, All Rights Reserved. GWJUMP3B.4 C GWJUMP3B.5 C Use, duplication or disclosure of this code is subject to the GWJUMP3B.6 C restrictions as set forth in the contract. GWJUMP3B.7 C GWJUMP3B.8 C Meteorological Office GWJUMP3B.9 C London Road GWJUMP3B.10 C BRACKNELL GWJUMP3B.11 C Berkshire UK GWJUMP3B.12 C RG12 2SZ GWJUMP3B.13 C GWJUMP3B.14 C If no contract has been raised with this copy of the code, the use, GWJUMP3B.15 C duplication or disclosure of it is strictly prohibited. Permission GWJUMP3B.16 C to do so must first be obtained in writing from the Head of Numerical GWJUMP3B.17 C Modelling at the above address. GWJUMP3B.18 C ******************************COPYRIGHT****************************** GWJUMP3B.19 C GWJUMP3B.20 ! SUBROUTINE GW_JUMP TO CALCULATE VERT DISTRIBUTION BELOW A JUMP HEIGHT GWJUMP3B.21 ! GWJUMP3B.22SUBROUTINE GW_JUMP 2GWJUMP3B.23 1 (PSTAR,PEXNER,S_X_STRESS,S_Y_STRESS,START_L,LEVELS GWJUMP3B.24 2 ,POINTS,AKH,BKH,DELTA_AK,DELTA_BK,H_O_LEV,H_JUMP GWJUMP3B.25 3 ,H_CRIT,DU_DT,DV_DT GWJUMP3B.26 ! Diagnostics GWJUMP3B.27 4 ,STRESS_UD,POINTS_STRESS_UD,STRESS_UD_ON GWJUMP3B.28 5 ,STRESS_VD,POINTS_STRESS_VD,STRESS_VD_ON GWJUMP3B.29 6 ,DU_DT_JUMP,POINTS_DU_DT_JUMP,DU_DT_JUMP_ON GWJUMP3B.30 7 ,DV_DT_JUMP,POINTS_DV_DT_JUMP,DV_DT_JUMP_ON ) GWJUMP3B.31 GWJUMP3B.32 IMPLICIT NONE GWJUMP3B.33 ! Description: GWJUMP3B.34 ! TO CALCULATE STRESS PROFILE DUE TO SUBGRID-SCALE GWJUMP3B.35 ! OROGRAPHIC GRAVITY WAVES FOR HIGH DRAG HYDRAULIC JUMP GWJUMP3B.36 ! STATES OR IF CRITICAL LAYER FOUND WITHIN JUMP. GWJUMP3B.37 ! STRESS AND DRAG LINEARISED WITH PRESSURE UPTO JUMP/ GWJUMP3B.38 ! CRITICAL HEIGHT FROM STARTING LEVEL. GWJUMP3B.39 ! GWJUMP3B.40 ! Method: UNIFIED MODEL DOCUMENTATION PAPER NO. ? GWJUMP3B.41 ! THE EQUATIONS USED ARE (???) TO (???) GWJUMP3B.42 ! GWJUMP3B.43 ! Current code owner: S.Webster GWJUMP3B.44 ! GWJUMP3B.45 ! History: GWJUMP3B.46 ! Version Date Comment GWJUMP3B.47 ! 4.5 03/06/98 Original Code. Copy of 4.4 GWJUMP3A with operational GWJUMP3B.48 ! changes. GWJUMP3B.49 ! Equal acceleration in bottom 3 layers. Ratio for GWJUMP3B.50 ! Hydraulic Jump Stress increased to 0.833. GWJUMP3B.51 ! D. Robinson GWJUMP3B.52 ! GWJUMP3B.53 ! Code Description: GWJUMP3B.54 ! Language: Fortran 77 + common extensions GWJUMP3B.55 ! This code is written to UMDP3 v6 programming standards. GWJUMP3B.56 ! System component covered: ORIGINAL VERSION FOR CRAY Y-MP GWJUMP3B.57 ! System task covered: PART OF P22 GWJUMP3B.58 ! SUITABLE FOR SINGLE COLUMN USE,ROTATED GRIDS GWJUMP3B.59 ! FURTHER ALTERATIONS MAY BE REQUIRED FOR AUTOTASKING EFFICIENCY GWJUMP3B.60 GWJUMP3B.61 ! Global Variables GWJUMP3B.62 *CALL C_G
GWJUMP3B.63 *CALL C_R_CP
GWJUMP3B.64 ! Local constants GWJUMP3B.65 *CALL C_GWAVE
GWJUMP3B.66 ! Subroutine arguements; GWJUMP3B.67 INTEGER GWJUMP3B.68 * LEVELS !IN NUMBER OF MODEL LEVELS GWJUMP3B.69 *,START_L !IN START LEVEL FOR WAVE-BREAKING TEST GWJUMP3B.70 *,POINTS !IN NUMBER OF POINTS GWJUMP3B.71 *,POINTS_STRESS_UD !IN ) No of land points in diagnostic GWJUMP3B.72 *,POINTS_STRESS_VD !IN ) arrays for GW stress - u and v GWJUMP3B.73 *,POINTS_DU_DT_JUMP !IN ) No of land points in diagnostic GWJUMP3B.74 *,POINTS_DV_DT_JUMP !IN ) arrays for GW satn - du and dv GWJUMP3B.75 *,H_O_LEV(POINTS) !IN LEVEL OF CRITICAL/JUMP HEIGHT GWJUMP3B.76 GWJUMP3B.77 LOGICAL GWJUMP3B.78 * H_JUMP(POINTS) !IN TRUE IF POINT IS TO BE LINEARIZED GWJUMP3B.79 *,H_CRIT(POINTS) !IN TRUE IF CRITICAL HEIGHT BEFORE JUMP GWJUMP3B.80 *,STRESS_UD_ON !U stress diagnostic switch GWJUMP3B.81 *,STRESS_VD_ON !V stress diagnostic switch GWJUMP3B.82 *,DU_DT_JUMP_ON !U accel (hydr jump) diagnostic switch GWJUMP3B.83 *,DV_DT_JUMP_ON !V accel (hydr jump) diagnostic switch GWJUMP3B.84 GWJUMP3B.85 REAL GWJUMP3B.86 * PSTAR(POINTS) !IN PSTAR FIELD GWJUMP3B.87 *,PEXNER(POINTS,LEVELS+1) !IN PEXNER GWJUMP3B.88 *,S_X_STRESS(POINTS) !IN 'SURFACE' X_STRESS GWJUMP3B.89 *,S_Y_STRESS(POINTS) !IN 'SURFACE' Y_STRESS GWJUMP3B.90 ! AKH,BKH DEFINE HYBRID VERTICAL COORDINATES P=A+BP*-LAYER EDGES, GWJUMP3B.91 ! DELTA_AK,DELTA_BK DEFINE PRESSURE DIFFERENCES ACROSS LAYERS GWJUMP3B.92 *,AKH(LEVELS+1) !IN VALUE AT LAYER BOUNDARY GWJUMP3B.93 *,BKH(LEVELS+1) !IN VALUE AT LAYER BOUMDARY GWJUMP3B.94 *,DELTA_AK(LEVELS) !IN DIFFERENCE ACROSS LAYER GWJUMP3B.95 *,DELTA_BK(LEVELS) !IN DIFFERENCE ACROSS LAYER GWJUMP3B.96 *,DU_DT(POINTS,LEVELS) !OUT U-ACCELERATION GWJUMP3B.97 *,DV_DT(POINTS,LEVELS) !OUT V-ACCELERATION GWJUMP3B.98 ! Diagnostics GWJUMP3B.99 REAL GWJUMP3B.100 * DU_DT_JUMP(POINTS_DU_DT_JUMP,LEVELS) !U-ACCELN DIAGNOSTIC GWJUMP3B.101 *,DV_DT_JUMP(POINTS_DV_DT_JUMP,LEVELS) !V-ACCELN DIAGNOSTIC GWJUMP3B.102 *,STRESS_UD(POINTS_STRESS_UD,LEVELS+1) !U STRESS DIAGNOSTIC GWJUMP3B.103 *,STRESS_VD(POINTS_STRESS_VD,LEVELS+1) !V STRESS DIAGNOSTIC GWJUMP3B.104 GWJUMP3B.105 ! Local parameters GWJUMP3B.106 REAL CPBYG GWJUMP3B.107 PARAMETER(CPBYG=CP/G) GWJUMP3B.108 GWJUMP3B.109 ! Local scalers GWJUMP3B.110 REAL GWJUMP3B.111 * DELTA_P ! DIFFERENCE IN PRESSURE ACROSS LAYER(S) GWJUMP3B.112 *,DELTA_AK_SUM ! DELTA_AK SUMMED OVER LOWEST LAYERS UP TO START_L GWJUMP3B.113 *,DELTA_BK_SUM ! DELTA_BK SUMMED OVER LOWEST LAYERS UP TO START_L GWJUMP3B.114 *,PU,PL GWJUMP3B.115 INTEGER I,K ! LOOP COUNTER IN ROUTINE GWJUMP3B.116 INTEGER KK,KL,KU,KT ! LEVEL COUNTERS IN ROUTINE GWJUMP3B.117 GWJUMP3B.118 ! Local dynamic arrays GWJUMP3B.119 ! LOCAL WORKSPACE ARRAYS: 6 ARRAYS OF FULL FIELD LENGTH GWJUMP3B.120 ! GWJUMP3B.121 GWJUMP3B.122 REAL GWJUMP3B.123 * X_STRESS(POINTS,2) ! X_STRESSES (LAYER BOUNDARIES) GWJUMP3B.124 *,Y_STRESS(POINTS,2) ! Y_STRESSES (LAYER BOUNDARIES) GWJUMP3B.125 *,DP_X_STRESS(POINTS) ! STRESS GRADIENT GWJUMP3B.126 * ! SURFACE X_STRESS GWJUMP3B.127 *,DP_Y_STRESS(POINTS) ! STRESS GRADIENT GWJUMP3B.128 * ! SURFACE Y_STRESS GWJUMP3B.129 GWJUMP3B.130 ! Function and subroutine calls GWJUMP3B.131 *CALL P_EXNERC
GWJUMP3B.132 GWJUMP3B.133 !------------------------------------------------------------------- GWJUMP3B.134 ! 1. START LEVEL PRELIMINARIES GWJUMP3B.135 !------------------------------------------------------------------- GWJUMP3B.136 GWJUMP3B.137 CFPP$ NOCONCUR L GWJUMP3B.138 ! TREAT LAYERS BELOW AND INCLUDING START_L AS ONE LAYER GWJUMP3B.139 DELTA_AK_SUM = 0.0 GWJUMP3B.140 DELTA_BK_SUM = 0.0 GWJUMP3B.141 DO K=1,START_L GWJUMP3B.142 DELTA_AK_SUM = DELTA_AK_SUM + DELTA_AK(K) GWJUMP3B.143 DELTA_BK_SUM = DELTA_BK_SUM + DELTA_BK(K) GWJUMP3B.144 END DO GWJUMP3B.145 CFPP$ CONCUR GWJUMP3B.146 GWJUMP3B.147 KL=1 GWJUMP3B.148 KU=2 GWJUMP3B.149 KT=3 GWJUMP3B.150 GWJUMP3B.151 DO I=1,POINTS GWJUMP3B.152 IF( H_JUMP(I) ) THEN GWJUMP3B.153 GWJUMP3B.154 PU=PSTAR(I)*BKH(H_O_LEV(I)) + AKH(H_O_LEV(I)) GWJUMP3B.155 PL=PSTAR(I)*BKH(START_L) + AKH(START_L) GWJUMP3B.156 DELTA_P= PL - PU GWJUMP3B.157 GWJUMP3B.158 IF( H_CRIT(I) ) THEN GWJUMP3B.159 DP_X_STRESS(I) = S_X_STRESS(I)/ ( DELTA_P ) GWJUMP3B.160 DP_Y_STRESS(I) = S_Y_STRESS(I)/ ( DELTA_P ) GWJUMP3B.161 ELSE GWJUMP3B.162 DP_X_STRESS(I) = 0.83333333*S_X_STRESS(I)/ GWJUMP3B.163 & ( DELTA_P ) GWJUMP3B.164 DP_Y_STRESS(I) = 0.83333333*S_Y_STRESS(I)/ GWJUMP3B.165 & ( DELTA_P ) GWJUMP3B.166 ENDIF GWJUMP3B.167 GWJUMP3B.168 ENDIF ! if H_JUMP GWJUMP3B.169 GWJUMP3B.170 END DO ! Points GWJUMP3B.171 GWJUMP3B.172 IF( STRESS_UD_ON ) THEN GWJUMP3B.173 DO I=1,POINTS GWJUMP3B.174 IF( H_JUMP(I) ) THEN GWJUMP3B.175 X_STRESS(I,KL) = S_X_STRESS(I) GWJUMP3B.176 STRESS_UD(I,START_L) = X_STRESS(I,KL) GWJUMP3B.177 ENDIF GWJUMP3B.178 END DO GWJUMP3B.179 ENDIF GWJUMP3B.180 GWJUMP3B.181 IF( STRESS_VD_ON ) THEN GWJUMP3B.182 DO I=1,POINTS GWJUMP3B.183 IF( H_JUMP(I) ) THEN GWJUMP3B.184 Y_STRESS(I,KL) = S_Y_STRESS(I) GWJUMP3B.185 STRESS_VD(I,START_L) = Y_STRESS(I,KL) GWJUMP3B.186 ENDIF GWJUMP3B.187 END DO GWJUMP3B.188 ENDIF GWJUMP3B.189 GWJUMP3B.190 !------------------------------------------------------------------ GWJUMP3B.191 ! 2 LOOP LEVELS GWJUMP3B.192 !------------------------------------------------------------------ GWJUMP3B.193 GWJUMP3B.194 DO K=START_L+1,LEVELS GWJUMP3B.195 GWJUMP3B.196 GWJUMP3B.197 DO I=1,POINTS GWJUMP3B.198 IF( H_JUMP(I) .AND. K.LE.H_O_LEV(I) ) THEN GWJUMP3B.199 GWJUMP3B.200 IF( K .EQ. START_L+1 ) THEN GWJUMP3B.201 DELTA_P =(DELTA_AK(START_L)+DELTA_BK(START_L)*PSTAR(I)) GWJUMP3B.202 & /( DELTA_AK_SUM +DELTA_BK_SUM*PSTAR(I) ) GWJUMP3B.203 DU_DT(I,START_L) = - G*DP_X_STRESS(I)*DELTA_P GWJUMP3B.204 DV_DT(I,START_L) = - G*DP_Y_STRESS(I)*DELTA_P GWJUMP3B.205 ELSE GWJUMP3B.206 DU_DT(I,K-1) = - G*DP_X_STRESS(I) GWJUMP3B.207 DV_DT(I,K-1) = - G*DP_Y_STRESS(I) GWJUMP3B.208 ENDIF GWJUMP3B.209 GWJUMP3B.210 ENDIF ! if H_JUMP(I) .and. K<=H_O_LEV(I) GWJUMP3B.211 GWJUMP3B.212 END DO ! points GWJUMP3B.213 GWJUMP3B.214 ! Diagnostics GWJUMP3B.215 IF( DU_DT_JUMP_ON ) THEN GWJUMP3B.216 DO I=1,POINTS GWJUMP3B.217 IF( H_JUMP(I) .AND. K.LE.H_O_LEV(I) ) THEN GWJUMP3B.218 DU_DT_JUMP(I,K-1) = DU_DT(I,K-1) GWJUMP3B.219 ENDIF GWJUMP3B.220 END DO GWJUMP3B.221 ENDIF GWJUMP3B.222 GWJUMP3B.223 IF( DV_DT_JUMP_ON ) THEN GWJUMP3B.224 DO I=1,POINTS GWJUMP3B.225 IF( H_JUMP(I) .AND. K.LE.H_O_LEV(I) ) THEN GWJUMP3B.226 DV_DT_JUMP(I,K-1) = DV_DT(I,K-1) GWJUMP3B.227 ENDIF GWJUMP3B.228 END DO GWJUMP3B.229 ENDIF GWJUMP3B.230 GWJUMP3B.231 IF( STRESS_UD_ON ) THEN GWJUMP3B.232 DO I=1,POINTS GWJUMP3B.233 IF( H_JUMP(I) .AND. K.LE.H_O_LEV(I) ) THEN GWJUMP3B.234 DELTA_P = DELTA_AK(K-1)+DELTA_BK(K-1)*PSTAR(I) GWJUMP3B.235 X_STRESS(I,KU) = X_STRESS(I,KL) GWJUMP3B.236 ! Stress at upper boundary N.B. DELTA_P is -VE GWJUMP3B.237 X_STRESS(I,KU) = X_STRESS(I,KL)+DP_X_STRESS(I)*DELTA_P GWJUMP3B.238 STRESS_UD(I,K) = X_STRESS(I,KU) GWJUMP3B.239 ! Top of model. Set acceln same as penultimate layer if stress >0 GWJUMP3B.240 ! FOR COMPLETION- TOP LEVEL NEVER REACHED IN H_JUMP GWJUMP3B.241 IF( K .EQ. LEVELS ) THEN GWJUMP3B.242 DELTA_P = DELTA_AK(LEVELS) + DELTA_BK(LEVELS)*PSTAR(I) GWJUMP3B.243 X_STRESS(I,KL) = X_STRESS(I,KU) - DU_DT(I,LEVELS-1) GWJUMP3B.244 * *DELTA_P/G GWJUMP3B.245 IF( X_STRESS(I,KL) .LT. 0.0) X_STRESS(I,KL) = 0.0 GWJUMP3B.246 DU_DT(I,LEVELS) = G*(X_STRESS(I,KU) - X_STRESS(I,KL)) GWJUMP3B.247 * /DELTA_P GWJUMP3B.248 STRESS_UD(I,LEVELS+1) = X_STRESS(I,KL) GWJUMP3B.249 ENDIF ! top of model GWJUMP3B.250 ENDIF ! H_Jump & K < H_O_Lev GWJUMP3B.251 END DO GWJUMP3B.252 ENDIF ! Stress_ud on GWJUMP3B.253 GWJUMP3B.254 IF( STRESS_VD_ON ) THEN GWJUMP3B.255 DO I=1,POINTS GWJUMP3B.256 IF( H_JUMP(I) .AND. K.LE.H_O_LEV(I) ) THEN GWJUMP3B.257 DELTA_P = DELTA_AK(K-1)+DELTA_BK(K-1)*PSTAR(I) GWJUMP3B.258 Y_STRESS(I,KU) = Y_STRESS(I,KL) GWJUMP3B.259 ! Stress at upper boundary N.B. DELTA_P is -VE GWJUMP3B.260 Y_STRESS(I,KU) = Y_STRESS(I,KL)+DP_Y_STRESS(I)*DELTA_P GWJUMP3B.261 STRESS_VD(I,K) = Y_STRESS(I,KU) GWJUMP3B.262 ! Top of model. Set acceln same as penultimate layer if stress >0 GWJUMP3B.263 ! FOR COMPLETION- TOP LEVEL NEVER REACHED IN H_JUMP GWJUMP3B.264 IF( K .EQ. LEVELS ) THEN GWJUMP3B.265 DELTA_P = DELTA_AK(LEVELS) + DELTA_BK(LEVELS)*PSTAR(I) GWJUMP3B.266 Y_STRESS(I,KL) = Y_STRESS(I,KU) - DV_DT(I,LEVELS-1) GWJUMP3B.267 * *DELTA_P/G GWJUMP3B.268 IF( Y_STRESS(I,KL) .LT. 0.0) Y_STRESS(I,KL) = 0.0 GWJUMP3B.269 DV_DT(I,LEVELS) = G*(Y_STRESS(I,KU) - Y_STRESS(I,KL)) GWJUMP3B.270 * /DELTA_P GWJUMP3B.271 STRESS_VD(I,LEVELS+1) = Y_STRESS(I,KL) GWJUMP3B.272 ENDIF ! top of model GWJUMP3B.273 ENDIF ! H_Jump & K < H_O_Lev GWJUMP3B.274 END DO GWJUMP3B.275 ENDIF ! Stress_vd on GWJUMP3B.276 GWJUMP3B.277 ! Swap storage for lower and upper layers GWJUMP3B.278 KK=KL GWJUMP3B.279 KL=KU GWJUMP3B.280 KU=KK GWJUMP3B.281 GWJUMP3B.282 END DO GWJUMP3B.283 ! END LOOP LEVELS GWJUMP3B.284 GWJUMP3B.285 RETURN GWJUMP3B.286 END GWJUMP3B.287 *ENDIF GWJUMP3B.288