*IF DEF,C90_1A,OR,DEF,C90_2A,OR,DEF,C90_2B AAD2F404.298
C ******************************COPYRIGHT****************************** GTS2F400.10711
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.10712
C GTS2F400.10713
C Use, duplication or disclosure of this code is subject to the GTS2F400.10714
C restrictions as set forth in the contract. GTS2F400.10715
C GTS2F400.10716
C Meteorological Office GTS2F400.10717
C London Road GTS2F400.10718
C BRACKNELL GTS2F400.10719
C Berkshire UK GTS2F400.10720
C RG12 2SZ GTS2F400.10721
C GTS2F400.10722
C If no contract has been raised with this copy of the code, the use, GTS2F400.10723
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.10724
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.10725
C Modelling at the above address. GTS2F400.10726
C ******************************COPYRIGHT****************************** GTS2F400.10727
C GTS2F400.10728
CLL Subroutine TWBULB-------------------------------------------------- TWBULB1A.3
CLL TWBULB1A.4
CLL Purpose: To calculate from temperatures,humidities the wet bulb TWBULB1A.5
CLL potential temperature on model levels and output the wet bulb TWBULB1A.6
CCL freezing level height. TWBULB1A.7
CLL TWBULB1A.8
CLL TWBULB1A.9
CLL Model Modification history from model version 3.0: TWBULB1A.10
CLL version Date TWBULB1A.11
CLL 3.2 10/06/94 Written by S.A.Woltering TWBULB1A.12
CLL 4.0 08/09/95 Speed up by vectorising. RTHBarnes. ARB1F400.1
!LL 4.3 26/02/97 Add first & last points to arg.list. RTHBarnes. ARB2F403.137
CLL TWBULB1A.13
CLL Programming standard : UM Doc Paper no 3 TWBULB1A.14
CLL TWBULB1A.15
CLL External documentation : UMDP no TWBULB1A.16
CLL TWBULB1A.17
CLLEND ----------------------------------------------------------------- TWBULB1A.18
C TWBULB1A.19
C*L ARGUMENTS:---------------------------------------------------------- TWBULB1A.20
SUBROUTINE TWBULB 1,1TWBULB1A.21
1 (Q,PSTAR,T, ! IN Model field array. TWBULB1A.22
2 AK,BK, ! IN AK/BK array. TWBULB1A.23
3 P_FIELD,P_LEVELS,Q_LEVELS, ! IN Field scalars. TWBULB1A.24
4 TW ! OUT WBT array. TWBULB1A.25
5 ,FIRST_POINT,LAST_POINT) ! IN loop start & end ARB2F403.138
C TWBULB1A.27
IMPLICIT NONE TWBULB1A.28
C TWBULB1A.29
INTEGER TWBULB1A.30
* P_FIELD ! IN No of points on a field. TWBULB1A.31
*,P_LEVELS ! IN No of model levels. TWBULB1A.32
*,Q_LEVELS ! IN No of humidity levels. TWBULB1A.33
*,FIRST_POINT,LAST_POINT ! IN 1st & last pts for calc ARB2F403.139
C TWBULB1A.34
REAL TWBULB1A.35
* T(P_FIELD,P_LEVELS) ! IN Intial temperature at all points. TWBULB1A.36
*,PSTAR(P_FIELD) ! IN Surface pressure. TWBULB1A.37
*,Q(P_FIELD,Q_LEVELS) ! IN Specific humidity at full levels. TWBULB1A.38
*,AK(P_LEVELS) ! IN Value of "A" at model level. TWBULB1A.39
*,BK(P_LEVELS) ! IN Value of "B" at model level. TWBULB1A.40
C TWBULB1A.41
REAL TWBULB1A.42
* TW(P_FIELD,Q_LEVELS) ! OUT The WET BULB temperature at all TWBULB1A.43
C levels and points. TWBULB1A.44
C DEFINE LOCAL WORKSPACE ARRAYS----------------------------------------- TWBULB1A.45
REAL TWBULB1A.47
* P(P_FIELD) ! Pressure at each point. TWBULB1A.48
*,LATENT_HEAT(P_FIELD) ! Latent heat of evaporation (fn(T)). TWBULB1A.49
*,GG(P_FIELD) ! The 'G' used in equation (1.3). TWBULB1A.50
*,Q_SAT(P_FIELD) ! Saturation specific humidity ARB1F400.2
*,DIFF(P_FIELD) ! The difference between G(Tw) & G(Ti). ARB1F400.3
C*---------------------------------------------------------------------- TWBULB1A.59
C*L EXTERNAL SUBROUTINES CALLED----------------------------------------- TWBULB1A.60
EXTERNAL QSAT TWBULB1A.61
C*---------------------------------------------------------------------- TWBULB1A.62
C CALL COMDECKS. TWBULB1A.63
C----------------------------------------------------------------------- TWBULB1A.64
*CALL C_R_CP
TWBULB1A.65
*CALL C_G
TWBULB1A.66
*CALL C_0_DG_C
TWBULB1A.67
*CALL C_LHEAT
TWBULB1A.68
*CALL C_EPSLON
TWBULB1A.69
C TWBULB1A.71
C----------------------------------------------------------------------- TWBULB1A.72
C DEFINE LOCAL SCALAR VARIABLES. TWBULB1A.73
C----------------------------------------------------------------------- TWBULB1A.74
INTEGER TWBULB1A.75
* I,K,L ! Loop counters. TWBULB1A.76
*,LOOP TWBULB1A.77
C TWBULB1A.78
REAL TWBULB1A.79
* COEFF ! Coeff used in latent heat calculation. TWBULB1A.80
*,CPV ! Specific heat for water vapour. TWBULB1A.81
*,MV ! Mol wt of water vapour. TWBULB1A.84
*,RSTAR ! Universal gas constant. TWBULB1A.85
*,GS ! The 'G' used in equation (1.3). TWBULB1A.86
*,DGBYDT ! The function DG/DT Eqn (1.6). TWBULB1A.87
*,TEMP1 ! TWBULB1A.88
*,TEMP2 ! TWBULB1A.89
C----------------------------------------------------------------------- TWBULB1A.90
C DEFINE PARAMETER STATEMENTS TWBULB1A.91
C COEFF - Used in the calculation of LATENT_H. TWBULB1A.92
C CPV - Specific heat of water vapour. TWBULB1A.93
C MV - Mol wt of water vapour KG/MOL. TWBULB1A.94
C RSTAR - Universal gas constant. TWBULB1A.95
C----------------------------------------------------------------------- TWBULB1A.96
PARAMETER (COEFF=2.34E3, CPV=1850.0, MV=0.01801, RSTAR=8.314) TWBULB1A.97
C----------------------------------------------------------------------- TWBULB1A.98
C Begin by looping over the wet-levels. TWBULB1A.99
C----------------------------------------------------------------------- TWBULB1A.100
DO L=1,Q_LEVELS ! Loop over all wet-levels. TWBULB1A.101
C----------------------------------------------------------------------- TWBULB1A.102
C Calculate pressure for all points on that wet-level. ARB1F400.4
C----------------------------------------------------------------------- TWBULB1A.104
DO I=1,P_FIELD ! Loop over points. TWBULB1A.105
P(I) = AK(L) + BK(L)*PSTAR(I) TWBULB1A.106
CL-------------------- SECTION 1 --------------------------------------- TWBULB1A.107
CL Calculate the function G for TA and QA (see eqn 3) doc no TWBULB1A.108
C G(Tw)=Qa(Ta)*L(Ta)+Ta(Cp+QaCpv) TWBULB1A.109
C Subscript a indicates initial values. TWBULB1A.110
C----------------------------------------------------------------------- TWBULB1A.111
LATENT_HEAT(I)=LC-COEFF*(T(I,L)-ZERODEGC) TWBULB1A.112
GG(I)=Q(I,L)*LATENT_HEAT(I)+T(I,L)*(CP+Q(I,L)*CPV) ! Eqn 1.2 TWBULB1A.113
C----------------------------------------------------------------------- TWBULB1A.114
TW(I,L)=T(I,L) ! Initialise TW. TWBULB1A.115
ENDDO ! End of points loop. TWBULB1A.116
CL-------------------- SECTION 2 --------------------------------------- TWBULB1A.117
CL Calculate the function DG/DT TWBULB1A.118
CL G'(T)=(Mv*L(Ta)**2*Qs(T)/R*T**2) +Cp+Qa*Cpv TWBULB1A.119
CL Iterate to find the Tw TWBULB1A.120
CL T(i+1)=T(i)+(G(Tw)-G(Ti))/DG/DT(i) TWBULB1A.121
C----------------------------------------------------------------------- TWBULB1A.122
CL---- Set loop counter. ARB1F400.5
LOOP=1 ARB1F400.6
1000 CONTINUE ARB1F400.7
C ARB1F400.8
CALL QSAT
(Q_SAT,TW(1,L),P(1),P_FIELD) ARB1F400.9
C ARB1F400.10
DO I=FIRST_POINT,LAST_POINT ARB2F403.140
GS=Q_SAT(I)*LATENT_HEAT(I)+TW(I,L)*(CP+Q(I,L)*CPV) ! Eqn 1.3 ARB1F400.11
ARB1F400.12
CL--------------------- SECTION 2.1 ------------------------------------ TWBULB1A.132
CL Find the difference between G(Tw)-G(Ti) TWBULB1A.133
C----------------------------------------------------------------------- TWBULB1A.134
DIFF(I) = ABS(GG(I)-GS) ! Eqn 1.8 ARB1F400.13
IF (DIFF(I).GT.1.0) THEN ARB1F400.14
ARB1F400.15
CL--------------------- SECTION 2.2 ------------------------------------ TWBULB1A.138
CL Calculate the function DG/DT TWBULB1A.139
C----------------------------------------------------------------------- TWBULB1A.140
TEMP1 = RSTAR*TW(I,L)*TW(I,L) ARB1F400.16
TEMP2 = Q_SAT(I)*MV*LATENT_HEAT(I)*LATENT_HEAT(I) ARB1F400.17
DGBYDT = TEMP2/TEMP1 + CP + CPV*Q(I,L) ! Eqn 1.6 TWBULB1A.146
ARB1F400.18
CL--------------------- SECTION 2.3 ------------------------------------ TWBULB1A.151
CL Using the function DG/DT calculate an updated Temperature Tw TWBULB1A.152
C----------------------------------------------------------------------- TWBULB1A.153
TW(I,L) = TW(I,L) - (GS-GG(I)) / DGBYDT ! Eqn 1.7 TWBULB1A.154
ARB1F400.19
CL--------------------- SECTION 2.4 ------------------------------------ TWBULB1A.156
CL Using the new temperature Tw re-calculate GS First update LATENT_H TWBULB1A.157
C----------------------------------------------------------------------- TWBULB1A.158
LATENT_HEAT(I)=LC-COEFF*(TW(I,L)-ZERODEGC) TWBULB1A.159
ENDIF TWBULB1A.160
END DO ! I ARB1F400.20
ARB1F400.21
CL----Increment iteration loop counter. TWBULB1A.161
LOOP=LOOP+1 TWBULB1A.162
CL----Test for convergence. TWBULB1A.163
IF(LOOP.GT.10) THEN TWBULB1A.164
WRITE(6,*)'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>' TWBULB1A.166
WRITE(6,*)'>>> TWBULB - Convergence failure, level ',L ARB1F400.22
WRITE(6,*)'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>' TWBULB1A.169
GOTO 9999 TWBULB1A.170
ENDIF TWBULB1A.171
CL----Difference test. TWBULB1A.172
DO I=FIRST_POINT,LAST_POINT ARB2F403.141
IF (DIFF(I).GT.1.0) GOTO 1000 ARB1F400.24
ENDDO ! I ARB1F400.25
9999 CONTINUE ARB1F400.26
! Set points outside calculation range to sensible values. ARB2F403.142
DO I=1,FIRST_POINT-1 ARB2F403.143
TW(I,L) = TW(FIRST_POINT,L) ARB2F403.144
END DO ARB2F403.145
DO I=LAST_POINT+1,P_FIELD ARB2F403.146
TW(I,L) = TW(LAST_POINT,L) ARB2F403.147
END DO ARB2F403.148
ENDDO ! End of loop over levels. TWBULB1A.176
RETURN TWBULB1A.177
END TWBULB1A.178
*ENDIF TWBULB1A.179