*IF DEF,C92_1A VINTZ1A.2
C ******************************COPYRIGHT****************************** GTS2F400.11701
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.11702
C GTS2F400.11703
C Use, duplication or disclosure of this code is subject to the GTS2F400.11704
C restrictions as set forth in the contract. GTS2F400.11705
C GTS2F400.11706
C Meteorological Office GTS2F400.11707
C London Road GTS2F400.11708
C BRACKNELL GTS2F400.11709
C Berkshire UK GTS2F400.11710
C RG12 2SZ GTS2F400.11711
C GTS2F400.11712
C If no contract has been raised with this copy of the code, the use, GTS2F400.11713
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.11714
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.11715
C Modelling at the above address. GTS2F400.11716
C ******************************COPYRIGHT****************************** GTS2F400.11717
C GTS2F400.11718
CLL SUBROUTINE V_INT_Z----------------------------------------------- VINTZ1A.3
CLL VINTZ1A.4
CLL Purpose: Calculates the height of an arbitrary pressure VINTZ1A.5
CLL surface. Since version 2, the top model level is VINTZ1A.6
CLL ignored in making the calculation. VINTZ1A.7
CLL VINTZ1A.8
CLL 28/04/92 calculation of P_EXNER_FULL consistent with VINTZ1A.9
CLL the geopotential eqn. New arguments AKH and BKH. VINTZ1A.10
CLL VINTZ1A.11
CLL RR, DR, AD <- programmer of some or all of previous code or changes VINTZ1A.12
CLL VINTZ1A.13
CLL Model Modification history from model version 3.0: VINTZ1A.14
CLL version Date VINTZ1A.15
CLL VINTZ1A.16
CLL 4.2 01/08/96 GSS5F402.282
CLL : *DEF CRAY removed. alogh and exph 32-bit functions GSS5F402.283
CLL : no longer required. GSS5F402.284
CLL : New arguments START and END introduced to GSS5F402.285
CLL : facilitate the removal of duplicate calculations GSS5F402.286
CLL : when using domain decomposition in MPP mode. GSS5F402.287
CLL : New variable IC introduced to remove superfluous GSS5F402.288
CLL : tests over levels. GSS5F402.289
CLL GSS5F402.290
CLL Author: A. Dickinson Reviewer: R. Rawlins GSS5F402.291
!LL 4.5 15/07/98 GSM1F405.208
!LL Use assumption that neighbouring points are GSM1F405.209
!LL likely to be on or near same level. Jump out GSM1F405.210
!LL of loop-over-levels once level found. Results GSM1F405.211
!LL in a 30 percent speedup on 19 levels for GSM1F405.212
!LL non-vector machines. S.D.Mullerworth GSM1F405.213
CLL 4.5 09/01/98 CRAY T3E optimisation: replace rtor_v by powr_v GDR8F405.26
CLL Deborah Salmond GDR8F405.27
CLL GSS5F402.292
CLL Programming standard : VINTZ1A.17
CLL VINTZ1A.18
CLL Logical components covered : D471 VINTZ1A.19
CLL VINTZ1A.20
CLL Project task : VINTZ1A.21
CLL VINTZ1A.22
CLL Documentation: The interpolation formulae are described in VINTZ1A.23
CLL unified model on-line documentation paper S1. VINTZ1A.24
CLL VINTZ1A.25
CLLEND---------------------------------------------------------------- VINTZ1A.26
C VINTZ1A.27
C*L Arguments:------------------------------------------------------- VINTZ1A.28
SUBROUTINE V_INT_Z(P,PL,PSTAR,P_EXNER_HALF,THETA,Q,ZH,Z,POINTS 8VINTZ1A.29
* ,P_LEVELS_MODEL,Q_LEVELS_MODEL,L,AKH,BKH GSM1F405.214
& ,START,END) GSM1F405.215
VINTZ1A.31
IMPLICIT NONE VINTZ1A.32
VINTZ1A.33
INTEGER VINTZ1A.34
* POINTS !IN Number of points to be processed VINTZ1A.35
*,P_LEVELS_MODEL !IN Number of model levels VINTZ1A.36
*,Q_LEVELS_MODEL !IN Number of model wet levels VINTZ1A.37
*,L !IN Reference level for below surface T extrapolation. VINTZ1A.38
* ! = No of B.L. levels plus one VINTZ1A.39
*,START !IN First point to be processed in POINTS dimension GSS5F402.295
*,END !IN Last point to be processed in POINTS dimension GSS5F402.296
GSS5F402.297
VINTZ1A.40
REAL VINTZ1A.41
* P(POINTS) !IN Pressure surface on which results required VINTZ1A.42
*,PL(POINTS) !IN Pressure at reference level L VINTZ1A.43
*,PSTAR(POINTS) !IN Surface pressure VINTZ1A.44
*,P_EXNER_HALF(POINTS,P_LEVELS_MODEL+1) !IN Exner pressure at VINTZ1A.45
* ! model half levels VINTZ1A.46
*,Z(POINTS) !OUT Height of pressure surface P VINTZ1A.47
*,ZH(POINTS,P_LEVELS_MODEL) !IN Height of model half levels VINTZ1A.48
*,THETA(POINTS,P_LEVELS_MODEL)!IN Potential temp at full levels VINTZ1A.49
*,Q(POINTS,Q_LEVELS_MODEL) !IN Specific humidity at full levels VINTZ1A.50
*,AKH(P_LEVELS_MODEL+1) !IN Hybrid coord. A at half levels VINTZ1A.51
*,BKH(P_LEVELS_MODEL+1) !IN Hybrid coord. B at half levels VINTZ1A.52
VINTZ1A.53
C Local arrays:-------------------------------------------------------- VINTZ1A.54
REAL P_EXNER(POINTS) ! Exner pressure at required pressure level VINTZ1A.55
C --------------------------------------------------------------------- VINTZ1A.56
C External subroutines called:----------------------------------------- VINTZ1A.57
C None GSS5F402.299
C*--------------------------------------------------------------------- VINTZ1A.59
C Define local variables:---------------------------------------------- VINTZ1A.60
INTEGER I,K !DO loop indices VINTZ1A.61
*,K_BELOW !K-1 or bottom level VINTZ1A.62
*,P_LEVELS !No of model levels minus one VINTZ1A.63
*,Q_LEVELS !No of wet levels (minus one if same as P_LEVELS) VINTZ1A.64
*,LAST !Stores level of preceding point GSM1F405.216
GSM1F405.217
VINTZ1A.65
REAL VINTZ1A.66
* P_EXNER_FULL ! Exner pressure on full level nearest P VINTZ1A.67
*,P_EXNER_FULL_UP ! Exner pressure on full level above VINTZ1A.68
*,P_EXNER_FULL_LOW ! Exner pressure on full level below VINTZ1A.69
*,DEL_EXNER ! Vertical difference of exner pressure VINTZ1A.70
*,THETAV ! Virtual potential temperature VINTZ1A.71
*,LOCAL_GRADIENT ! Local potential temperature gradient VINTZ1A.72
*,T_GRADIENT ! Temperature gradient VINTZ1A.73
*,SECOND_ORDER_TERM ! 2nd order correction to hydrostatic integral VINTZ1A.74
*,P_EXNER_FULL_L ! Full level exner on level L VINTZ1A.75
*,TS ! Surface temperature VINTZ1A.76
C---------------------------------------------------------------------- VINTZ1A.80
C Constants from comdecks:--------------------------------------------- VINTZ1A.81
*CALL C_EPSLON
VINTZ1A.82
*CALL C_G
VINTZ1A.83
*CALL C_R_CP
VINTZ1A.84
*CALL C_LAPSE
VINTZ1A.85
C---------------------------------------------------------------------- VINTZ1A.86
VINTZ1A.87
CL 1. Define local constants VINTZ1A.88
VINTZ1A.89
REAL LAPSE_R_OVER_G,CP_OVER_G VINTZ1A.90
PARAMETER(LAPSE_R_OVER_G=LAPSE*R/G) VINTZ1A.91
PARAMETER(CP_OVER_G=CP/G) VINTZ1A.92
VINTZ1A.93
REAL VINTZ1A.94
& PUP1,PUP,PLOW,PLOW11,PLOW1 VINTZ1A.95
VINTZ1A.96
*CALL P_EXNERC
VINTZ1A.97
VINTZ1A.98
C SET TOP LEVEL FOR INTERPOLATION EQUAL TO TOP MODEL LAYER VINTZ1A.99
C (CAUTION! THIS HAS BEEN OF DOUBTFUL QUALITY IN THE PAST FOR 20-LEV M) VINTZ1A.100
P_LEVELS=P_LEVELS_MODEL VINTZ1A.101
Q_LEVELS=MIN(P_LEVELS,Q_LEVELS_MODEL) VINTZ1A.102
VINTZ1A.103
!L 2. Special cases (i) Below ground GSM1F405.218
!L (ii) Top layer GSM1F405.219
VINTZ1A.106
DO I=START,END GSS5F402.306
VINTZ1A.108
! Convert target pressure to Exner pressure GSM1F405.220
! ie P_EXNER(I)=(P(I)/PREF)**KAPPA GSM1F405.221
VINTZ1A.111
P_EXNER(I)=P(I)/PREF GSM1F405.222
*IF -DEF,VECTLIB PXVECTLB.157
P_EXNER(I)=P_EXNER(I)**KAPPA GSM1F405.224
*ENDIF GSM1F405.225
VINTZ1A.117
ENDDO GSS5F402.310
GSS5F402.311
*IF DEF,VECTLIB PXVECTLB.158
CALL POWR_V(
END-START+1,P_EXNER(START),KAPPA,P_EXNER(START)) GDR8F405.28
*ENDIF GSS5F402.314
GSS5F402.315
LAST=2 ! Arbitrary initialisation GSM1F405.226
DO I=START,END GSM1F405.227
! Start from level of last point. First check whether this point GSM1F405.228
! is above or below, then continue search in appropriate direction GSM1F405.229
IF(P_EXNER(I).LT.P_EXNER_HALF(I,LAST))THEN GSM1F405.230
DO K=LAST,P_LEVELS-1 GSM1F405.231
IF(P_EXNER(I).GE.P_EXNER_HALF(I,K+1))THEN GSM1F405.232
GOTO 210 GSM1F405.233
ENDIF GSM1F405.234
ENDDO GSM1F405.235
ELSE GSM1F405.236
DO K=LAST-1,1,-1 GSM1F405.237
IF(P_EXNER(I).LT.P_EXNER_HALF(I,K))THEN GSM1F405.238
GOTO 210 GSM1F405.239
ENDIF GSM1F405.240
ENDDO GSM1F405.241
ENDIF GSM1F405.242
210 CONTINUE GSM1F405.243
! Here, K=0 for below level 1. K=P_LEVELS for above top level GSM1F405.244
! Otherwise K is set to level in range 1 to P_LEVELS-1 just below point. GSM1F405.245
VINTZ1A.118
IF (K.EQ.0)THEN GSM1F405.246
!L (i) Below ground: equation (3.11). GSM1F405.247
!L A lapse rate of 6.5 deg/km is assumed. L is a GSM1F405.248
!L reference level - usually the first level above the model GSM1F405.249
!L boundary layer. GSM1F405.250
! Test for P>P* using Exner, for consistency with other sections GSM1F405.251
IF(P_EXNER(I).GE.P_EXNER_HALF(I,1))THEN GSM1F405.252
PUP=PSTAR(I)*BKH(L+1) + AKH(L+1) GSM1F405.253
PLOW=PSTAR(I)*BKH(L) + AKH(L) GSM1F405.254
P_EXNER_FULL_L= P_EXNER_C( GSM1F405.255
& P_EXNER_HALF(I,L+1),P_EXNER_HALF(I,L),PUP,PLOW,KAPPA) GSM1F405.256
TS=THETA(I,L)*P_EXNER_FULL_L GSM1F405.257
& *(PSTAR(I)/PL(I))**LAPSE_R_OVER_G GSM1F405.258
TS=TS*(1.0+C_VIRTUAL*Q(I,1)) GSM1F405.259
Z(I)=ZH(I,1)+(TS/LAPSE) GSM1F405.260
& *(1.-(P(I)/PSTAR(I))**LAPSE_R_OVER_G) GSM1F405.261
GSM1F405.262
ENDIF GSM1F405.263
VINTZ1A.123
VINTZ1A.124
LAST=1 ! Start from bottom level next time GSM1F405.264
GSS5F402.318
ELSEIF(K.EQ.P_LEVELS)THEN GSM1F405.265
!L (iii) Top layer and above: equation (3.6) with local gradient of GSM1F405.266
!L theta given by equation (3.7) with k=top. GSM1F405.267
IF(P_LEVELS.GT.Q_LEVELS)THEN GSM1F405.268
VINTZ1A.144
PUP1=PSTAR(I)*BKH(P_LEVELS+1) + AKH(P_LEVELS+1) GSM1F405.269
PUP =PSTAR(I)*BKH(P_LEVELS) + AKH(P_LEVELS) GSM1F405.270
PLOW=PSTAR(I)*BKH(P_LEVELS-1) + AKH(P_LEVELS-1) GSM1F405.271
P_EXNER_FULL_UP= P_EXNER_C( GSM1F405.272
& P_EXNER_HALF(I,P_LEVELS+1),P_EXNER_HALF(I,P_LEVELS), GSM1F405.273
& PUP1,PUP,KAPPA) GSM1F405.274
P_EXNER_FULL= P_EXNER_C( GSM1F405.275
& P_EXNER_HALF(I,P_LEVELS),P_EXNER_HALF(I,P_LEVELS-1), GSM1F405.276
& PUP,PLOW,KAPPA) GSM1F405.277
GSM1F405.278
T_GRADIENT=( THETA(I,P_LEVELS)*P_EXNER_FULL_UP GSM1F405.279
& -THETA(I,P_LEVELS-1)*P_EXNER_FULL )/ GSM1F405.280
& ( P_EXNER_FULL_UP-P_EXNER_FULL ) GSM1F405.281
GSM1F405.282
LOCAL_GRADIENT=(T_GRADIENT-THETA(I,P_LEVELS))/ GSM1F405.283
& P_EXNER_FULL_UP GSM1F405.284
GSM1F405.285
SECOND_ORDER_TERM=.5*LOCAL_GRADIENT*( P_EXNER(I)*(P_EXNER(I) GSM1F405.286
& -2.*P_EXNER_FULL_UP) GSM1F405.287
& -P_EXNER_HALF(I,P_LEVELS)*(P_EXNER_HALF(I,P_LEVELS) GSM1F405.288
& -2.*P_EXNER_FULL_UP) ) GSM1F405.289
GSM1F405.290
DEL_EXNER=P_EXNER_HALF(I,P_LEVELS)-P_EXNER(I) GSM1F405.291
THETAV=THETA(I,P_LEVELS) GSM1F405.292
Z(I)=ZH(I,P_LEVELS)+ GSM1F405.293
& CP_OVER_G*(THETAV*DEL_EXNER-SECOND_ORDER_TERM) GSM1F405.294
GSM1F405.295
ELSE GSM1F405.296
GSM1F405.297
PUP1=PSTAR(I)*BKH(P_LEVELS+1) + AKH(P_LEVELS+1) GSM1F405.298
PUP =PSTAR(I)*BKH(P_LEVELS) + AKH(P_LEVELS) GSM1F405.299
PLOW=PSTAR(I)*BKH(P_LEVELS-1) + AKH(P_LEVELS-1) GSM1F405.300
P_EXNER_FULL_UP= P_EXNER_C( GSM1F405.301
& P_EXNER_HALF(I,P_LEVELS+1),P_EXNER_HALF(I,P_LEVELS), GSM1F405.302
& PUP1,PUP,KAPPA) GSM1F405.303
P_EXNER_FULL= P_EXNER_C( GSM1F405.304
& P_EXNER_HALF(I,P_LEVELS),P_EXNER_HALF(I,P_LEVELS-1), GSM1F405.305
& PUP,PLOW,KAPPA) GSM1F405.306
GSM1F405.307
T_GRADIENT=( THETA(I,P_LEVELS)*P_EXNER_FULL_UP GSM1F405.308
& -THETA(I,P_LEVELS-1)*P_EXNER_FULL )/ GSM1F405.309
& ( P_EXNER_FULL_UP-P_EXNER_FULL ) GSM1F405.310
GSM1F405.311
LOCAL_GRADIENT=(T_GRADIENT-THETA(I,P_LEVELS))/ GSM1F405.312
& P_EXNER_FULL_UP GSM1F405.313
GSM1F405.314
SECOND_ORDER_TERM=.5*LOCAL_GRADIENT*(P_EXNER(I)*(P_EXNER(I) GSM1F405.315
& -2.*P_EXNER_FULL_UP) GSM1F405.316
& -P_EXNER_HALF(I,P_LEVELS)*(P_EXNER_HALF(I,P_LEVELS) GSM1F405.317
& -2.*P_EXNER_FULL_UP) ) GSM1F405.318
GSM1F405.319
DEL_EXNER=P_EXNER_HALF(I,P_LEVELS)-P_EXNER(I) GSM1F405.320
THETAV=THETA(I,P_LEVELS)*(1.0+C_VIRTUAL*Q(I,P_LEVELS)) GSM1F405.321
Z(I)=ZH(I,P_LEVELS)+ GSM1F405.322
& CP_OVER_G*(THETAV*DEL_EXNER-SECOND_ORDER_TERM) GSM1F405.323
GSM1F405.324
ENDIF GSM1F405.325
GSM1F405.326
LAST=P_LEVELS ! Start from top level next point GSM1F405.327
ELSE GSM1F405.328
!L 3. Middle layers: equation (3.6) with local theta gradient given by GSM1F405.329
!L equation (3.7) with 1 <= k < top. GSM1F405.330
K_BELOW=MAX(1,K-1) GSM1F405.331
GSM1F405.332
IF(K.GT.Q_LEVELS)THEN GSM1F405.333
GSM1F405.334
PUP1 = PSTAR(I)*BKH(K+2) + AKH(K+2) GSM1F405.335
PUP = PSTAR(I)*BKH(K+1) + AKH(K+1) GSM1F405.336
PLOW = PSTAR(I)*BKH(K) + AKH(K) GSM1F405.337
PLOW11 = PSTAR(I)*BKH(K_BELOW+1) + AKH(K_BELOW+1) GSM1F405.338
PLOW1 = PSTAR(I)*BKH(K_BELOW) + AKH(K_BELOW) GSM1F405.339
GSM1F405.340
P_EXNER_FULL_UP= P_EXNER_C( GSM1F405.341
& P_EXNER_HALF(I,K+2),P_EXNER_HALF(I,K+1), GSM1F405.342
& PUP1,PUP,KAPPA) GSM1F405.343
P_EXNER_FULL= P_EXNER_C( GSM1F405.344
& P_EXNER_HALF(I,K+1),P_EXNER_HALF(I,K), GSM1F405.345
& PUP,PLOW,KAPPA) GSM1F405.346
P_EXNER_FULL_LOW= P_EXNER_C( GSM1F405.347
& P_EXNER_HALF(I,K_BELOW+1),P_EXNER_HALF(I,K_BELOW), GSM1F405.348
& PLOW11,PLOW1,KAPPA) GSM1F405.349
GSM1F405.350
T_GRADIENT=( THETA(I,K+1)*P_EXNER_FULL_UP GSM1F405.351
& -THETA(I,K_BELOW)*P_EXNER_FULL_LOW )/ GSM1F405.352
& ( P_EXNER_FULL_UP-P_EXNER_FULL_LOW ) GSM1F405.353
GSM1F405.354
LOCAL_GRADIENT=(T_GRADIENT-THETA(I,K))/P_EXNER_FULL GSM1F405.355
GSM1F405.356
SECOND_ORDER_TERM=0.5*LOCAL_GRADIENT GSM1F405.357
& *( P_EXNER(I)*(P_EXNER(I)-2.*P_EXNER_FULL) GSM1F405.358
& -P_EXNER_HALF(I,K)*(P_EXNER_HALF(I,K)-2.*P_EXNER_FULL)) GSM1F405.359
GSM1F405.360
DEL_EXNER=P_EXNER_HALF(I,K)-P_EXNER(I) GSM1F405.361
THETAV=THETA(I,K) GSM1F405.362
Z(I)=ZH(I,K)+CP_OVER_G*(THETAV*DEL_EXNER-SECOND_ORDER_TERM) GSM1F405.363
GSM1F405.364
ELSE GSM1F405.365
GSM1F405.366
! Calculation using virtual potential temperature GSM1F405.367
GSM1F405.368
PUP1 = PSTAR(I)*BKH(K+2) + AKH(K+2) GSM1F405.369
PUP = PSTAR(I)*BKH(K+1) + AKH(K+1) GSM1F405.370
PLOW = PSTAR(I)*BKH(K) + AKH(K) GSM1F405.371
PLOW11 = PSTAR(I)*BKH(K_BELOW+1) + AKH(K_BELOW+1) GSM1F405.372
PLOW1 = PSTAR(I)*BKH(K_BELOW) + AKH(K_BELOW) GSM1F405.373
GSM1F405.374
P_EXNER_FULL_UP= P_EXNER_C( GSM1F405.375
& P_EXNER_HALF(I,K+2),P_EXNER_HALF(I,K+1), GSM1F405.376
& PUP1,PUP,KAPPA) GSM1F405.377
P_EXNER_FULL= P_EXNER_C( GSM1F405.378
& P_EXNER_HALF(I,K+1),P_EXNER_HALF(I,K), GSM1F405.379
& PUP,PLOW,KAPPA) GSM1F405.380
P_EXNER_FULL_LOW= P_EXNER_C( GSM1F405.381
& P_EXNER_HALF(I,K_BELOW+1),P_EXNER_HALF(I,K_BELOW), GSM1F405.382
& PLOW11,PLOW1,KAPPA) GSM1F405.383
GSM1F405.384
T_GRADIENT=( THETA(I,K+1)*P_EXNER_FULL_UP GSM1F405.385
& -THETA(I,K_BELOW)*P_EXNER_FULL_LOW )/ GSM1F405.386
& ( P_EXNER_FULL_UP-P_EXNER_FULL_LOW ) GSM1F405.387
GSM1F405.388
LOCAL_GRADIENT=(T_GRADIENT-THETA(I,K))/P_EXNER_FULL GSM1F405.389
GSM1F405.390
SECOND_ORDER_TERM=0.5*LOCAL_GRADIENT GSM1F405.391
& *(P_EXNER(I)*(P_EXNER(I)-2.*P_EXNER_FULL) GSM1F405.392
& -P_EXNER_HALF(I,K)*(P_EXNER_HALF(I,K)-2.*P_EXNER_FULL) ) GSM1F405.393
GSM1F405.394
DEL_EXNER=P_EXNER_HALF(I,K)-P_EXNER(I) GSM1F405.395
THETAV=THETA(I,K)*(1.0+C_VIRTUAL*Q(I,K)) GSM1F405.396
Z(I)=ZH(I,K)+CP_OVER_G*(THETAV*DEL_EXNER-SECOND_ORDER_TERM) GSM1F405.397
GSM1F405.398
ENDIF GSM1F405.399
LAST=K ! Start from level K next point GSM1F405.400
ENDIF VINTZ1A.145
ENDDO ! DO I=START,END GSM1F405.401
VINTZ1A.320
RETURN VINTZ1A.321
END VINTZ1A.322
*ENDIF VINTZ1A.323