!copyright (C) 2002 MSC-RPN COMM %%%RPNPHY%%%
***S/P LIN_ADJTQ
*
#include "phy_macros_f.h"
SUBROUTINE LIN_ADJTQ ( T, Q, P, NI ) 2
#include "impnone.cdk"
*
C
INTEGER NI
REAL T(NI), Q(NI), P(NI)
*
*Author
* J.-F. Mahfouf (Sept 2002)
*
*Revision
*
*Object
* To calculate wet bulb temperature
* and associated specific humidity at saturation
* for an air parcel characterized by T and Q at pressure P
* Newton method with two iterations
*
* For an unsaturated parcel : final values = initial values
*
*Arguments
*
* - Outputs/inputs -
* T Temperature (K)
* Q Specific Humidity (kg/kg)
*
* - Inputs -
* P Pressure (Pa)
* NI Horizontal Dimension
*
C
LOGICAL LO
INTEGER jl
REAL ZA1, CHLS, DELTA2
*
************************************************************************
* AUTOMATIC ARRAYS
************************************************************************
*
AUTOMATIC ( LO1 , LOGICAL , (NI ))
*
AUTOMATIC ( ZA3 , REAL , (NI ))
AUTOMATIC ( ZA4 , REAL , (NI ))
AUTOMATIC ( ZLDCP , REAL , (NI ))
AUTOMATIC ( ZT_0 , REAL , (NI ))
AUTOMATIC ( ZT_1 , REAL , (NI ))
AUTOMATIC ( ZQ_0 , REAL , (NI ))
AUTOMATIC ( ZQ_1 , REAL , (NI ))
AUTOMATIC ( ZESC_0 , REAL , (NI ))
AUTOMATIC ( ZESC_1 , REAL , (NI ))
AUTOMATIC ( ZQSC_0 , REAL , (NI ))
AUTOMATIC ( ZQSC_1 , REAL , (NI ))
AUTOMATIC ( ZDESC_0, REAL , (NI ))
AUTOMATIC ( ZDESC_1, REAL , (NI ))
AUTOMATIC ( ZCOR_0 , REAL , (NI ))
AUTOMATIC ( ZCOR_1 , REAL , (NI ))
AUTOMATIC ( ZQCD_0 , REAL , (NI ))
AUTOMATIC ( ZQCD_1 , REAL , (NI ))
*
************************************************************************
C
C* PHYSICAL CONSTANTS.
C -------- ----------
C
#include "consphy.cdk"
#include "dintern.cdk"
#include "fintern.cdk"
C
DELTA2 = CPV/CPD - 1.
CHLS = CHLC + CHLF
ZA1 = 610.78
C
DO jl=1,NI
IF ( T(jl) > TRPL ) THEN
ZA3(jl)=17.269
ZA4(jl)=35.860
ZLDCP(jl) = CHLC / (CPD*(1.+DELTA2*Q(jl)))
ELSE
ZA3(jl)=21.875
ZA4(jl)= 7.660
ZLDCP(jl) = CHLS / (CPD*(1.+DELTA2*Q(jl)))
ENDIF
END DO
C
C* Set-up initial values for Newton iterations
C
DO jl=1,NI
ZT_0(jl) = T(jl)
ZQ_0(jl) = Q(jl)
END DO
C
C* First iteration
C
DO jl=1,NI
ZESC_0(jl) = ZA1*EXP(ZA3(jl)*(ZT_0(jl)-TRPL)/
* (ZT_0(jl)-ZA4(jl)))
ZQSC_0(jl) = EPS1*ZESC_0(jl)/(P(jl)-EPS2*ZESC_0(jl))
ZDESC_0(jl) = ZA3(jl)*(TRPL-ZA4(jl))*ZESC_0(jl)/
* ((ZT_0(jl)-ZA4(jl))**2)
ZCOR_0(jl) = ZLDCP(jl)*EPS1*P(jl)*ZDESC_0(jl)/
* ((P(jl)-EPS2*ZESC_0(jl))**2)
ZQCD_0(jl) = (ZQ_0(jl)-ZQSC_0(jl))/(1.0+ZCOR_0(jl))
IF ( ZQ_0(jl) < ZQSC_0(jl) ) THEN
ZQCD_0(jl) = 0.0
ENDIF
ZQ_1(jl) = ZQ_0(jl) - ZQCD_0(jl)
ZT_1(jl) = ZT_0(jl) + ZQCD_0(jl)*ZLDCP(jl)
LO1(jl) = ZQCD_0(jl) /= 0.0
END DO
C
LO=.FALSE.
DO jl=1,NI
LO=LO.OR.LO1(jl)
END DO
C
IF (.NOT.LO) RETURN
C
C* Second iteration
C
DO jl=1,NI
ZESC_1(jl) = ZA1*EXP(ZA3(jl)*(ZT_1(jl)-TRPL)/
* (ZT_1(jl)-ZA4(jl)))
ZQSC_1(jl) = EPS1*ZESC_1(jl)/(P(jl)-EPS2*ZESC_1(jl))
ZDESC_1(jl) = ZA3(jl)*(TRPL-ZA4(jl))*ZESC_1(jl)/
* ((ZT_1(jl)-ZA4(jl))**2)
ZCOR_1(jl) = ZLDCP(jl)*EPS1*P(jl)*ZDESC_1(jl)/
* ((P(jl)-EPS2*ZESC_1(jl))**2)
ZQCD_1(jl) = (ZQ_1(jl)-ZQSC_1(jl))/(1.0+ZCOR_1(jl))
IF ( ZQ_0(jl) < ZQSC_0(jl) ) THEN
ZQCD_1(jl) = 0.0
ENDIF
Q(jl) = ZQ_1(jl) - ZQCD_1(jl)
T(jl) = ZT_1(jl) + ZQCD_1(jl)*ZLDCP(jl)
END DO
C
RETURN
END SUBROUTINE LIN_ADJTQ