*IF DEF,C92_1A VINTT1A.2 C ******************************COPYRIGHT****************************** GTS2F400.11647 C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.11648 C GTS2F400.11649 C Use, duplication or disclosure of this code is subject to the GTS2F400.11650 C restrictions as set forth in the contract. GTS2F400.11651 C GTS2F400.11652 C Meteorological Office GTS2F400.11653 C London Road GTS2F400.11654 C BRACKNELL GTS2F400.11655 C Berkshire UK GTS2F400.11656 C RG12 2SZ GTS2F400.11657 C GTS2F400.11658 C If no contract has been raised with this copy of the code, the use, GTS2F400.11659 C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.11660 C to do so must first be obtained in writing from the Head of Numerical GTS2F400.11661 C Modelling at the above address. GTS2F400.11662 C ******************************COPYRIGHT****************************** GTS2F400.11663 C GTS2F400.11664 CLL SUBROUTINE V_INT_T----------------------------------------------- VINTT1A.3 CLL VINTT1A.4 CLL Purpose: To calculate the temperature along an VINTT1A.5 CLL arbitrary pressure level. Assumes input data is VINTT1A.6 CLL on model levels. VINTT1A.7 CLL VINTT1A.8 CLL A.Dickinson <- programmer of some or all of previous code or changes VINTT1A.9 CLL D.Robinson <- programmer of some or all of previous code or changes VINTT1A.10 CLL VINTT1A.11 CLL Model Modification history from model version 3.0: VINTT1A.12 CLL version Date VINTT1A.13 CLL 4.2 01/07/96 GSS5F402.149 CLL : Revised for CRAY T3E. IC introduced to force exit GSS5F402.150 CLL : from loop over levels when all points have processed. GSS5F402.151 CLL : New arguments START and END introduced to GSS5F402.152 CLL : facilitate the removal of duplicate calculations GSS5F402.153 CLL : when using domain decomposition in MPP mode. GSS5F402.154 CLL : Author: A. Dickinson Reviewer: F. Rawlins GSS5F402.155 !LL 4.5 15/07/98 GSM1F405.94 !LL Use assumption that neighbouring points are GSM1F405.95 !LL likely to be on or near same level. Jump out GSM1F405.96 !LL of loop-over-levels once level found. Results GSM1F405.97 !LL in a 40 percent speedup on 19 levels for GSM1F405.98 !LL non-vector machines. S.D.Mullerworth GSM1F405.99 CLL 4.5 09/01/98 CRAY T3E optimisation: replace rtor_v by powr_v GDR8F405.18 CLL Deborah Salmond GDR8F405.19 CLL VINTT1A.14 CLL Documentation: The interpolation formulae are described in VINTT1A.15 CLL unified model on-line documentation paper S1. VINTT1A.16 CLL VINTT1A.17 CLL ----------------------------------------------------------------- VINTT1A.18 C VINTT1A.19 C*L Arguments:------------------------------------------------------- VINTT1A.20SUBROUTINE V_INT_T 5VINTT1A.21 & (T,P,PL,PSTAR,P_EXNER_HALF,THETA,POINTS,P_LEVELS,L,AKH,BKH GSM1F405.100 & ,START,END) GSM1F405.101 VINTT1A.23 IMPLICIT NONE VINTT1A.24 VINTT1A.25 INTEGER VINTT1A.26 * POINTS !IN Number of points per level GSS5F402.158 *,P_LEVELS !IN Number of model levels VINTT1A.28 *,L !IN Reference level for below-surface T extrapolation VINTT1A.29 ! Use L=2 VINTT1A.30 *,START !IN First point to be processed in POINTS dimension GSS5F402.159 *,END !IN Last point to be processed in POINTS dimension GSS5F402.160 GSS5F402.161 REAL VINTT1A.31 * T(POINTS) !OUT Temperature along input pressure surface VINTT1A.32 *,P(POINTS) !IN Pressure surface on which results required VINTT1A.33 *,PL(POINTS) !IN Pressure at reference level L VINTT1A.34 *,PSTAR(POINTS) !IN Surface pressure VINTT1A.35 *,P_EXNER_HALF(POINTS,P_LEVELS+1) !IN Exner pressure at model VINTT1A.36 * ! half levels VINTT1A.37 *,THETA(POINTS,P_LEVELS) !IN Potential temperature at full levels VINTT1A.38 *,AKH(P_LEVELS+1) !IN Hybrid coords. A values at half levels. VINTT1A.39 *,BKH(P_LEVELS+1) !IN Hybrid coords. B values at half levels. VINTT1A.40 VINTT1A.41 C Workspace usage:----------------------------------------------------- VINTT1A.42 C VINTT1A.43 REAL P_EXNER(POINTS) VINTT1A.44 C External subroutines called:----------------------------------------- VINTT1A.45 C None GSS5F402.163 C*--------------------------------------------------------------------- VINTT1A.47 C Define local variables:---------------------------------------------- VINTT1A.48 REAL PTOP,PBOT,PKP2,PKP1,PK,PKM1,PPP1,PP,PPM1,P1,P2,P3 VINTT1A.49 INTEGER I,K GSM1F405.102 &,LAST ! Used to store level number of preceding point GSM1F405.103 GSM1F405.104 REAL P_EXNER_FULL_1,P_EXNER_FULL_2,TK,TERM1,TERM2, VINTT1A.51 * P_EXNER_FULL_K,P_EXNER_FULL_KP1,P_EXNER_FULL_KM1 VINTT1A.52 *,P_EXNER_FULL_L,P_EXNER_FULL_LM1 VINTT1A.53 C---------------------------------------------------------------------- VINTT1A.57 C Constants from comdecks:--------------------------------------------- VINTT1A.58 *CALL C_EPSLON
VINTT1A.59 *CALL C_G
VINTT1A.60 *CALL C_R_CP
VINTT1A.61 *CALL C_LAPSE
VINTT1A.62 C---------------------------------------------------------------------- VINTT1A.63 VINTT1A.64 CL 1. Define local constants VINTT1A.65 VINTT1A.66 REAL CP_OVER_G,LAPSE_R_OVER_G VINTT1A.67 PARAMETER(CP_OVER_G=CP/G) VINTT1A.68 PARAMETER(LAPSE_R_OVER_G=LAPSE*R/G) VINTT1A.69 VINTT1A.70 *CALL P_EXNERC
VINTT1A.71 VINTT1A.72 CL 2. Special cases (i) Below ground VINTT1A.73 CL (ii) Bottom of bottom layer VINTT1A.74 CL (iii) Top of top layer and above VINTT1A.75 VINTT1A.76 *IF DEF,VECTLIB PXVECTLB.153 C Convert target pressure to Exner pressure GSS5F402.171 VINTT1A.78 DO I=START,END GSS5F402.172 P_EXNER(I)=P(I)/PREF GSS5F402.174 ENDDO GSS5F402.175 CALL POWR_V
GDR8F405.20 &(END-START+1,P_EXNER(START),KAPPA,P_EXNER(START)) GDR8F405.21 *ENDIF GSS5F402.178 GSS5F402.179 GSM1F405.105 LAST=2 ! Arbitrary initialisation GSM1F405.106 DO I=START,END GSM1F405.107 GSS5F402.181 *IF -DEF,VECTLIB PXVECTLB.154 C Convert target pressure to Exner pressure VINTT1A.79 GSS5F402.183 P_EXNER(I)=(P(I)/PREF)**KAPPA GSM1F405.108 *ENDIF VINTT1A.86 VINTT1A.87 ! Start from same level as last point. First check whether this point GSM1F405.109 ! is above or below, then continue search in appropriate direction GSM1F405.110 IF(P_EXNER(I).GT.P_EXNER_HALF(I,LAST))THEN GSM1F405.111 GSM1F405.112 ! These next two loops exit immediately once level found. GSM1F405.113 ! GOTO cuts out needless looping once level is found, reducing the GSM1F405.114 ! cost of the routine by about 40 percent for 19 level runs. GSM1F405.115 DO K=LAST,3,-1 GSM1F405.116 IF(P_EXNER(I).LE.P_EXNER_HALF(I,K-1))THEN GSM1F405.117 GOTO 240 GSM1F405.118 ENDIF GSM1F405.119 ENDDO GSM1F405.120 ELSE GSM1F405.121 DO K=LAST+1,P_LEVELS GSM1F405.122 IF(P_EXNER(I).GT.P_EXNER_HALF(I,K))THEN GSM1F405.123 GOTO 240 GSM1F405.124 ENDIF GSM1F405.125 ENDDO GSM1F405.126 ENDIF GSM1F405.127 240 CONTINUE GSM1F405.128 GSM1F405.129 ! At this point, K is: GSM1F405.130 ! 2 for below bottom level. GSM1F405.131 ! P_LEVELS+1 for above top level GSM1F405.132 ! Otherwise K is the level just above the point GSM1F405.133 GSM1F405.134 GSM1F405.135 IF(K.EQ.2)THEN GSM1F405.136 CL (i) Below ground: equation (3.15) VINTT1A.88 CL A lapse rate of 6.5 deg/km is assumed. L is a VINTT1A.89 CL reference level - usually the first level above the model GSM1F405.137 CL boundary layer. VINTT1A.91 VINTT1A.92 IF(P(I).GT.PSTAR(I))THEN GSM1F405.138 VINTT1A.94 PTOP = AKH(L+1) + BKH(L+1)*PSTAR(I) GSM1F405.139 PBOT = AKH(L) + BKH(L) *PSTAR(I) GSM1F405.140 P_EXNER_FULL_L = P_EXNER_C GSM1F405.141 + (P_EXNER_HALF(I,L+1),P_EXNER_HALF(I,L),PTOP,PBOT,KAPPA) GSM1F405.142 T(I)=THETA(I,L)*P_EXNER_FULL_L GSM1F405.143 * *(P(I)/PL(I))**LAPSE_R_OVER_G GSM1F405.144 VINTT1A.105 CL (ii) Bottom layer: equation (3.14) VINTT1A.106 VINTT1A.107 ELSE GSM1F405.145 VINTT1A.109 P1 = AKH(1) + BKH(1)*PSTAR(I) GSM1F405.146 P2 = AKH(2) + BKH(2)*PSTAR(I) GSM1F405.147 P3 = AKH(3) + BKH(3)*PSTAR(I) GSM1F405.148 P_EXNER_FULL_1 = P_EXNER_C GSM1F405.149 + (P_EXNER_HALF(I,2),P_EXNER_HALF(I,1),P2,P1,KAPPA) GSM1F405.150 P_EXNER_FULL_2 = P_EXNER_C GSM1F405.151 + (P_EXNER_HALF(I,3),P_EXNER_HALF(I,2),P3,P2,KAPPA) GSM1F405.152 VINTT1A.117 TK=THETA(I,1)*P_EXNER_FULL_1 GSM1F405.153 VINTT1A.119 TERM1=(TK-THETA(I,2)*P_EXNER_FULL_2) GSM1F405.154 * *THETA(I,1)*(P_EXNER(I)-P_EXNER_FULL_1) GSM1F405.155 VINTT1A.122 TERM2=THETA(I,2)*(P_EXNER_HALF(I,2)-P_EXNER_FULL_2) GSM1F405.156 * +THETA(I,1)*(P_EXNER_FULL_1-P_EXNER_HALF(I,2)) GSM1F405.157 VINTT1A.125 T(I)=TK+TERM1/TERM2 GSM1F405.158 VINTT1A.127 ENDIF GSM1F405.159 VINTT1A.129 LAST=2 ! Next point, start from level 2 GSM1F405.160 CL (iii) Top layer and above: equation (3.13) GSM1F405.161 ELSEIF(K.EQ.P_LEVELS+1)THEN GSM1F405.162 PPP1 = AKH(P_LEVELS+1) + BKH(P_LEVELS+1)*PSTAR(I) GSM1F405.163 PP = AKH(P_LEVELS ) + BKH(P_LEVELS )*PSTAR(I) GSM1F405.164 PPM1 = AKH(P_LEVELS-1) + BKH(P_LEVELS-1)*PSTAR(I) GSM1F405.165 VINTT1A.130 P_EXNER_FULL_L = P_EXNER_C (P_EXNER_HALF(I,P_LEVELS+1), GSM1F405.166 + P_EXNER_HALF(I,P_LEVELS),PPP1,PP,KAPPA) GSM1F405.167 P_EXNER_FULL_LM1 = P_EXNER_C (P_EXNER_HALF(I,P_LEVELS), GSM1F405.168 + P_EXNER_HALF(I,P_LEVELS-1),PP,PPM1,KAPPA) GSM1F405.169 VINTT1A.132 TK=THETA(I,P_LEVELS)*P_EXNER_FULL_L GSM1F405.170 VINTT1A.134 TERM1=(TK-THETA(I,P_LEVELS-1)*P_EXNER_FULL_LM1) GSM1F405.171 * *THETA(I,P_LEVELS)*(P_EXNER_FULL_L-P_EXNER(I)) GSM1F405.172 VINTT1A.138 TERM2=THETA(I,P_LEVELS)*(P_EXNER_HALF(I,P_LEVELS) GSM1F405.173 & -P_EXNER_FULL_L)+THETA(I,P_LEVELS-1) GSM1F405.174 & *(P_EXNER_FULL_LM1-P_EXNER_HALF(I,P_LEVELS)) GSM1F405.175 VINTT1A.143 T(I)=TK+TERM1/TERM2 GSM1F405.176 LAST=P_LEVELS ! Next point, start from top GSM1F405.177 ELSE GSM1F405.178 CL 3. Middle levels: equation (3.12) VINTT1A.162 CL Two alternatives are used depending on whether P_EXNER(I) falls in VINTT1A.163 CL the top or bottom half of layer k. VINTT1A.164 VINTT1A.165 PKP1 = AKH(K) + BKH(K)*PSTAR(I) GSM1F405.179 PK = AKH(K-1) + BKH(K-1)*PSTAR(I) GSM1F405.180 VINTT1A.167 P_EXNER_FULL_K = P_EXNER_C (P_EXNER_HALF(I,K), GSM1F405.181 + P_EXNER_HALF(I,K-1),PKP1,PK,KAPPA) GSM1F405.182 VINTT1A.174 C Top half of layer k. VINTT1A.175 VINTT1A.176 IF(P_EXNER(I).LE.P_EXNER_FULL_K)THEN GSM1F405.183 VINTT1A.179 PKP2 = AKH(K+1) + BKH(K+1)*PSTAR(I) GSM1F405.184 P_EXNER_FULL_KP1 = P_EXNER_C (P_EXNER_HALF(I,K+1), GSM1F405.185 + P_EXNER_HALF(I,K),PKP2,PKP1,KAPPA) GSM1F405.186 VINTT1A.183 TK=THETA(I,K-1)*P_EXNER_FULL_K GSM1F405.187 VINTT1A.185 TERM1=(THETA(I,K)*P_EXNER_FULL_KP1-TK) GSM1F405.188 * *THETA(I,K-1)*(P_EXNER_FULL_K-P_EXNER(I)) GSM1F405.189 VINTT1A.188 TERM2=THETA(I,K-1)*(P_EXNER_FULL_K-P_EXNER_HALF(I,K)) GSM1F405.190 * +THETA(I,K)*(P_EXNER_HALF(I,K)-P_EXNER_FULL_KP1) GSM1F405.191 VINTT1A.191 T(I)=TK+TERM1/TERM2 GSM1F405.192 VINTT1A.193 ENDIF GSM1F405.193 VINTT1A.195 C Bottom half of layer k. VINTT1A.196 VINTT1A.197 IF(P_EXNER(I).GT.P_EXNER_FULL_K)THEN GSM1F405.194 VINTT1A.198 PKM1 = AKH(K-2) + BKH(K-2)*PSTAR(I) GSM1F405.195 P_EXNER_FULL_KM1 = P_EXNER_C (P_EXNER_HALF(I,K-1), GSM1F405.196 + P_EXNER_HALF(I,K-2),PK,PKM1,KAPPA) GSM1F405.197 VINTT1A.201 TK=THETA(I,K-1)*P_EXNER_FULL_K GSM1F405.198 VINTT1A.205 TERM1=(THETA(I,K-2)*P_EXNER_FULL_KM1-TK) GSM1F405.199 * *THETA(I,K-1)*(P_EXNER(I)-P_EXNER_FULL_K) GSM1F405.200 VINTT1A.207 TERM2=THETA(I,K-1)*(P_EXNER_HALF(I,K-1)-P_EXNER_FULL_K) GSM1F405.201 * +THETA(I,K-2)*(P_EXNER_FULL_KM1-P_EXNER_HALF(I,K-1)) GSM1F405.202 VINTT1A.210 T(I)=TK+TERM1/TERM2 GSM1F405.203 VINTT1A.213 ENDIF GSM1F405.204 LAST=K ! Next point, start from level K GSM1F405.205 VINTT1A.215 ENDIF ! IF(K.EQ.2)...ELSEIF...ELSE GSM1F405.206 VINTT1A.217 ENDDO ! DO I=START,END GSM1F405.207 VINTT1A.221 RETURN VINTT1A.222 END VINTT1A.223 VINTT1A.224 *ENDIF VINTT1A.225