*IF DEF,C92_1A VINTTH1A.2 C ******************************COPYRIGHT****************************** GTS2F400.11665 C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.11666 C GTS2F400.11667 C Use, duplication or disclosure of this code is subject to the GTS2F400.11668 C restrictions as set forth in the contract. GTS2F400.11669 C GTS2F400.11670 C Meteorological Office GTS2F400.11671 C London Road GTS2F400.11672 C BRACKNELL GTS2F400.11673 C Berkshire UK GTS2F400.11674 C RG12 2SZ GTS2F400.11675 C GTS2F400.11676 C If no contract has been raised with this copy of the code, the use, GTS2F400.11677 C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.11678 C to do so must first be obtained in writing from the Head of Numerical GTS2F400.11679 C Modelling at the above address. GTS2F400.11680 C ******************************COPYRIGHT****************************** GTS2F400.11681 C GTS2F400.11682 CLL SUBROUTINE V_INT_TH---------------------------------------------- VINTTH1A.3 CLL VINTTH1A.4 CLL Purpose: Calculates potential temperature of model layers using VINTTH1A.5 CLL temperatures input on an arbitray set of pressure levels VINTTH1A.6 CLL VINTTH1A.7 CLL R.Swinbank <- programmer of some or all of previous code or changes VINTTH1A.8 CLL D.Robinson <- programmer of some or all of previous code or changes VINTTH1A.9 CLL VINTTH1A.10 CLL Model Modification history from model version 3.0: VINTTH1A.11 CLL version Date VINTTH1A.12 CLL VINTTH1A.13 CLL 4.2 01/08/96 *DEF CRAY removed. Use of 32-bit log and exp GSS5F402.200 CLL for CRAY shared memory computers no longer GSS5F402.201 CLL supported. GSS5F402.202 CLL GSS5F402.203 CLL Author: A. Dickinson Reviewer: R. Rawlins GSS5F402.204 CLL GSS5F402.205 CLL Programming standard : VINTTH1A.14 CLL VINTTH1A.15 CLL Logical components covered : S113 VINTTH1A.16 CLL VINTTH1A.17 CLL Project task : VINTTH1A.18 CLL VINTTH1A.19 CLL Documentation: The interpolation formulae are described in VINTTH1A.20 CLL unified model on-line documentation paper S1. VINTTH1A.21 CLL VINTTH1A.22 CLLEND ----------------------------------------------------------------- VINTTH1A.23 C VINTTH1A.24 C*L Arguments:------------------------------------------------------- VINTTH1A.25SUBROUTINE V_INT_TH VINTTH1A.26 *(P_HALF,P_EXNER_HALF,THETA,T_SRCE,POINTS,P_SRCE,P_LEVELS, VINTTH1A.27 * SRCE_LEVELS,PSTAR,AKH,BKH) VINTTH1A.28 VINTTH1A.29 IMPLICIT NONE VINTTH1A.30 VINTTH1A.31 INTEGER VINTTH1A.32 * POINTS !IN Number of points to be processed VINTTH1A.33 *,P_LEVELS !IN Number of model levels VINTTH1A.34 *,SRCE_LEVELS !IN Number of input levels VINTTH1A.35 VINTTH1A.36 REAL VINTTH1A.37 * P_HALF(POINTS,P_LEVELS+1) !IN Pressure of model half levels VINTTH1A.38 *,P_EXNER_HALF(POINTS,P_LEVELS+1) !IN Exner pressure at model VINTTH1A.39 * ! half levels VINTTH1A.40 *,PSTAR(POINTS) !IN surface pressure VINTTH1A.41 *,AKH(P_LEVELS+1) !IN Hybrid coord. A at half levels VINTTH1A.42 *,BKH(P_LEVELS+1) !IN Hybrid coord. B at half levels VINTTH1A.43 *,THETA(POINTS,P_LEVELS) !OUT Potential temperature at full levels VINTTH1A.44 *,T_SRCE(POINTS,SRCE_LEVELS) !IN Input temperature fields VINTTH1A.45 *,P_SRCE(POINTS,SRCE_LEVELS) !IN Pressure of input temperature VINTTH1A.46 * ! fields VINTTH1A.47 VINTTH1A.48 C Workspace usage:----------------------------------------------------- VINTTH1A.49 REAL TL(POINTS),PL(POINTS) VINTTH1A.50 INTEGER KI(POINTS) VINTTH1A.51 C External subroutines called:----------------------------------------- VINTTH1A.52 C None GSS5F402.206 C*--------------------------------------------------------------------- VINTTH1A.54 C Define local variables:---------------------------------------------- VINTTH1A.55 INTEGER I,J,K,JK,JI VINTTH1A.56 REAL PUB ! Pressure at top of layer VINTTH1A.57 REAL PLB ! Pressure at bottom of layer VINTTH1A.58 REAL P_EXNER_FULL ! Exner pressure at full model levels VINTTH1A.59 REAL PKPH,TKPH,THICK,PJ,PJM1,TJ,TJM1 VINTTH1A.60 C---------------------------------------------------------------------- VINTTH1A.64 C Constants from comdecks:--------------------------------------------- VINTTH1A.65 *CALL C_G
VINTTH1A.66 *CALL C_R_CP
VINTTH1A.67 *CALL C_LAPSE
VINTTH1A.68 REAL LAPSE_R_OVER_G VINTTH1A.69 PARAMETER(LAPSE_R_OVER_G=LAPSE*R/G) VINTTH1A.70 C---------------------------------------------------------------------- VINTTH1A.71 VINTTH1A.72 *CALL P_EXNERC
VINTTH1A.73 VINTTH1A.74 CL 1. Initialise arrays PL,TL,KI and THETA VINTTH1A.75 VINTTH1A.76 DO I=1,POINTS VINTTH1A.77 KI(I)=1 VINTTH1A.78 TL(I)=0.0 VINTTH1A.79 PL(I)=P_HALF(I,1) VINTTH1A.80 ENDDO VINTTH1A.81 VINTTH1A.82 C THETA is used to accumulate model layer thicknesses (x2) in section 2 VINTTH1A.83 C The values are converted to potential temperatures in section 3. VINTTH1A.84 DO J=1,P_LEVELS VINTTH1A.85 DO I=1,POINTS VINTTH1A.86 THETA(I,J)=0.0 VINTTH1A.87 ENDDO VINTTH1A.88 ENDDO VINTTH1A.89 VINTTH1A.90 CL 2. Loop over JK. Each time around we either increment one input VINTTH1A.91 CL level (J) or one model level (K), as appropriate; JK=J+K. VINTTH1A.92 CL For each combination j,k we calculate the thickness of the VINTTH1A.93 CL overlap between the interval P_SRCE(j-1 to j) and model layer VINTTH1A.94 CL k (i.e. P_HALF(k to k+1)). VINTTH1A.95 VINTTH1A.96 DO 100 JK=2,P_LEVELS+SRCE_LEVELS+1 VINTTH1A.97 VINTTH1A.98 CDIR$ IVDEP VINTTH1A.99 ! Fujitsu vectorization directive GRB0F405.557 !OCL NOVREC GRB0F405.558 DO I=1,POINTS VINTTH1A.100 VINTTH1A.101 C Get J (input level) VINTTH1A.102 C Max. value of J is SRCE_LEVELS+1 (above top input level). VINTTH1A.103 C JI is J value for interpolation - limited to SRCE_LEVELS, since VINTTH1A.104 C we extrapolate above top level. VINTTH1A.105 VINTTH1A.106 K=KI(I) VINTTH1A.107 J=MIN(JK-K,SRCE_LEVELS+1) VINTTH1A.108 JI=MIN(J,SRCE_LEVELS) VINTTH1A.109 VINTTH1A.110 C Gather P,T values for interpolation VINTTH1A.111 PJ=P_SRCE(I,JI) VINTTH1A.112 TJ=T_SRCE(I,JI) VINTTH1A.113 PJM1=P_SRCE(I,JI-1) VINTTH1A.114 TJM1=T_SRCE(I,J-1) VINTTH1A.115 VINTTH1A.116 C If K>P_LEVELS integration is complete; VINTTH1A.117 C if input pressure is greater than range of model levels integration is VINTTH1A.118 C not yet started. VINTTH1A.119 C In both cases no action is required. VINTTH1A.120 IF (K.LE.P_LEVELS .AND. PJ.LT.P_HALF(I,1)) THEN VINTTH1A.121 VINTTH1A.122 C If TL is not set, integration has just started, so we require T at VINTTH1A.123 C model level 1/2 (P_HALF(1)), which must be in current input pressure VINTTH1A.124 C interval. VINTTH1A.125 VINTTH1A.126 IF(TL(I).EQ.0.0) THEN VINTTH1A.127 IF(J.EQ.1) THEN VINTTH1A.128 C If J=1, extrapolate below input level 1 VINTTH1A.129 TL(I)=TJ*(P_HALF(I,1)/PJ)**LAPSE_R_OVER_G GSS5F402.207 ELSE VINTTH1A.135 C Otherwise interpolate between levels J-1 and J VINTTH1A.136 TL(I)=TJM1+ALOG(P_HALF(I,1)/PJM1)*(TJ-TJM1) VINTTH1A.141 * /ALOG(PJ/PJM1) VINTTH1A.142 END IF VINTTH1A.144 END IF VINTTH1A.145 VINTTH1A.146 PKPH=P_HALF(I,K+1) VINTTH1A.147 VINTTH1A.148 C Check whether next level up (from PL) is a model layer boundary, or VINTTH1A.149 C an input level; then integrate from PL to this level. VINTTH1A.150 VINTTH1A.151 IF(PJ.GE.PKPH.AND.J.LE.SRCE_LEVELS) THEN VINTTH1A.152 C Integrate from PL to input level J VINTTH1A.153 GSS5F402.208 THICK=(TL(I)+TJ)*ALOG(PL(I)/PJ) VINTTH1A.157 GSS5F402.209 C Save P & T values at current level VINTTH1A.159 PL(I)=PJ VINTTH1A.160 TL(I)=TJ VINTTH1A.161 VINTTH1A.162 ELSE VINTTH1A.163 C Get T at model level K+1/2 VINTTH1A.164 IF(J.EQ.1) THEN VINTTH1A.165 C If J=1, extrapolate below input level 1 VINTTH1A.166 GSS5F402.210 TKPH=TJ*(PKPH/PJ)**LAPSE_R_OVER_G VINTTH1A.170 GSS5F402.211 ELSE VINTTH1A.172 C Otherwise interpolate between levels J-1 and J VINTTH1A.173 GSS5F402.212 TKPH=TJM1+ALOG(PKPH/PJM1)*(TJ-TJM1)/ALOG(PJ/PJM1) VINTTH1A.177 GSS5F402.213 END IF VINTTH1A.179 VINTTH1A.180 C Integrate from PL to model level k+1/2 VINTTH1A.181 GSS5F402.214 THICK=(TL(I)+TKPH)*ALOG(PL(I)/PKPH) GSS5F402.215 C Save P & T values and increment K, so next model level is used VINTTH1A.187 C on next iteration of JK VINTTH1A.188 PL(I)=PKPH VINTTH1A.189 TL(I)=TKPH VINTTH1A.190 KI(I)=K+1 VINTTH1A.191 END IF VINTTH1A.192 VINTTH1A.193 C Integration results are accumulated in THETA; they are converted VINTTH1A.194 C to theta values in section 3. VINTTH1A.195 THETA(I,K)=THETA(I,K)+THICK VINTTH1A.196 VINTTH1A.197 END IF VINTTH1A.198 VINTTH1A.199 ENDDO VINTTH1A.200 100 CONTINUE VINTTH1A.201 VINTTH1A.202 VINTTH1A.203 CL 3. Convert thickness values to potential temperature values. VINTTH1A.204 VINTTH1A.205 DO J=1,P_LEVELS VINTTH1A.206 DO I=1,POINTS VINTTH1A.207 VINTTH1A.208 C Model layer above source data coverage: equation (3.28) VINTTH1A.209 IF(P_HALF(I,J).LE.P_SRCE(I,SRCE_LEVELS))THEN VINTTH1A.210 PUB=PSTAR(I)*BKH(J+1) + AKH(J+1) VINTTH1A.211 PLB=PSTAR(I)*BKH(J) + AKH(J) VINTTH1A.212 THETA(I,J)=T_SRCE(I,SRCE_LEVELS)/ VINTTH1A.213 & P_EXNER_C( P_EXNER_HALF(I,J+1),P_EXNER_HALF(I,J), VINTTH1A.214 & PUB,PLB,KAPPA ) VINTTH1A.215 VINTTH1A.216 ELSE VINTTH1A.217 C Convert layer thickness to theta: finalise equation (3.27) VINTTH1A.218 THETA(I,J)=KAPPA*THETA(I,J) VINTTH1A.219 * /(2.*(P_EXNER_HALF(I,J)-P_EXNER_HALF(I,J+1))) VINTTH1A.220 ENDIF VINTTH1A.221 VINTTH1A.222 C If model layer straddles top srce level and interpolated temperature VINTTH1A.223 C falls outside the range of the top two source level temperatures, VINTTH1A.224 C then use equ 3.28 VINTTH1A.225 VINTTH1A.226 IF((P_HALF(I,J).GT.P_SRCE(I,SRCE_LEVELS)).AND. VINTTH1A.227 * (P_HALF(I,J+1).LE.P_SRCE(I,SRCE_LEVELS)))THEN VINTTH1A.228 VINTTH1A.229 PUB = PSTAR(I)*BKH(J+1) + AKH(J+1) VINTTH1A.230 PLB = PSTAR(I)*BKH(J) + AKH(J) VINTTH1A.231 P_EXNER_FULL = P_EXNER_C VINTTH1A.232 * ( P_EXNER_HALF(I,J+1),P_EXNER_HALF(I,J),PUB,PLB,KAPPA ) VINTTH1A.233 TJ=THETA(I,J)*P_EXNER_FULL VINTTH1A.234 IF((TJ.GT.T_SRCE(I,SRCE_LEVELS).AND. VINTTH1A.235 * TJ.GT.T_SRCE(I,SRCE_LEVELS-1)).OR. VINTTH1A.236 * (TJ.LT.T_SRCE(I,SRCE_LEVELS).AND. VINTTH1A.237 * TJ.LT.T_SRCE(I,SRCE_LEVELS-1)))THEN VINTTH1A.238 THETA(I,J)=T_SRCE(I,SRCE_LEVELS)/P_EXNER_FULL VINTTH1A.239 ENDIF VINTTH1A.240 VINTTH1A.241 ENDIF VINTTH1A.242 ENDDO VINTTH1A.243 ENDDO VINTTH1A.244 VINTTH1A.245 RETURN VINTTH1A.246 END VINTTH1A.247 *ENDIF VINTTH1A.248