!copyright (C) 2001 MSC-RPN COMM %%%RPNPHY%%% ***S/R MESAHU - PASSAGE DE ES A HU * #include "phy_macros_f.h"![]()
SUBROUTINE MESAHU(HU,ES,TX,PX,LNPS,MODP,SWTT,SWPH, 1 $ NI,NK,N) #include "impnone.cdk"
* INTEGER NI, NK, N, MODP REAL HU(NI,NK), ES(NI,NK), TX(NI,NK) REAL PX(NK), LNPS(NI,*) * LOGICAL SWTT, SWPH * *Author * N. Brunet (Jan91) * *Revision * 001 B. Bilodeau (August 1991)- Adaptation to UNIX * 002 N. Brunet (May 1994) - Improved iteration for tx = tv * 003 B. Bilodeau (January 2001) - Automatic arrays * *Object * to calculate specific humidity from dew point depressions, * temperature and pressure * *Arguments * * - Output - * HU specific humidity in kg/kg * * - Input - * ES (T-TD) in degrees Celsius; T(temperature), TD(dew point * temperature) * TX temperature or virtual temperature in Kelvins * PX see MODP * LNPS see MODP * MODP pressure mode (SI units only): * =0; pressure level in PX * =1; sigma level in PX and PS(surface pressure) in LNPS * =2; sigma level in PX and logarithm of sigma level in * LNPS * =3; all points of pressure in LNPS(NI,*) in Pascals * =4; sigma level in PX and logarithm of sigma level in * LNPS(in millibars unless using SI units) * =5; logarithm of pressure level in PX(in millibars unless * using SI units) * SWTT .TRUE. to pass TT for argument * .FALSE. to pass TV for argument * SWPH .TRUE. to consider water and ice phase * .FALSE. to consider water phase only * NI horizontal dimension * NK vertical dimension * N number of treated points * * *IMPLICITES #include "consphy.cdk"
*MODULES EXTERNAL INCTPHY * ** *-------------------------------------------------------------------- * ************************************************************************ * AUTOMATIC ARRAYS ************************************************************************ * AUTOMATIC ( PN , REAL , (N) ) * ************************************************************************ * REAL E, TD REAL TP, TG, HUS REAL EPSIL INTEGER K, I, ITER, NITER * #include "dintern.cdk"
#include "fintern.cdk"
*-------------------------------------------------------------------- #include "initcph.cdk"
* * * NITER = 25 EPSIL = 0.001 * DO 10 K=1,NK * #include "modpr2.cdk"
* DO 100 I=1,N TP = TX(I,K) TD = TP - ES(I,K) IF(SWPH)THEN E = FOEW(TD) ELSE E = FOEWA(TD) END IF HUS = FOQFE(E,PN(I)) TP = FOTTV(TX(I,K),HUS) IF(SWTT)THEN HU(I,K) = HUS GO TO 100 END IF TG = 0.5*(TX(I,K)+TP) * DO 200 ITER=1,NITER TD = TG - ES(I,K) IF(SWPH)THEN E = FOEW(TD) ELSE E = FOEWA(TD) END IF HUS = FOQFE(E,PN(I)) TP = FOTTV(TX(I,K),HUS) IF(ABS(TP-TG) .LT. EPSIL)THEN HU(I,K) = HUS GO TO 100 END IF TG = 0.5*(TG + TP) 200 CONTINUE * HU(I,K) = HUS * 100 CONTINUE 10 CONTINUE * * RETURN END