MODULE sulfate_aer_mod ! microphysical routines based on UPMC aerosol model by Slimane Bekki ! adapted for stratospheric sulfate aerosol in LMDZ by Christoph Kleinschmitt CONTAINS !******************************************************************* SUBROUTINE STRACOMP_KELVIN(sh,t_seri,pplay) ! ! Aerosol H2SO4 weight fraction as a function of PH2O and temperature ! INPUT: ! sh: MMR of H2O ! t_seri: temperature (K) ! pplay: middle layer pression (Pa) ! ! Modified in modules: ! R2SO4: aerosol H2SO4 weight fraction (percent) ! R2SO4B: aerosol H2SO4 weight fraction (percent) for each aerosol bin ! DENSO4: aerosol density (gr/cm3) ! DENSO4B: aerosol density (gr/cm3)for each aerosol bin ! f_r_wet: factor for converting dry to wet radius ! assuming 'flat surface' composition (does not depend on aerosol size) ! f_r_wetB: factor for converting dry to wet radius ! assuming 'curved surface' composition (depends on aerosol size) USE dimphy, ONLY : klon,klev ! nb of longitude and altitude bands USE infotrac_phy, ONLY : nbtr_bin USE aerophys USE phys_local_var_mod, ONLY: R2SO4, R2SO4B, DENSO4, DENSO4B, f_r_wet, f_r_wetB USE strataer_local_var_mod, ONLY: RRSI ! WARNING: in phys_local_var_mod R2SO4B, DENSO4B, f_r_wetB (klon,klev,nbtr_bin) ! and dens_aer_dry must be declared somewhere IMPLICIT NONE REAL,DIMENSION(klon,klev),INTENT(IN) :: t_seri ! Temperature REAL,DIMENSION(klon,klev),INTENT(IN) :: pplay ! pression in the middle of each layer (Pa) REAL,DIMENSION(klon,klev),INTENT(IN) :: sh ! specific humidity (kg h2o/kg air) ! local variables integer :: ilon,ilev,ik real, parameter :: rath2oair = mAIRmol/mH2Omol real, parameter :: third = 1./3. real :: pph2ogas(klon,klev) real :: temp, wpp, xa, surtens, mvh2o, radwet, fkelvin, pph2okel, r2so4ik, denso4ik !---------------------------------------- ! gas-phase h2o partial pressure (Pa) ! vmr=sh*rath2oair pph2ogas(:,:) = pplay(:,:)*sh(:,:)*rath2oair DO ilon=1,klon DO ilev=1,klev temp = max(t_seri(ilon,ilev),190.) temp = min(temp,300.) ! *** H2SO4-H2O flat surface *** !! equilibrium H2O pressure over pure flat liquid water (Pa) !! pflath2o=psh2o(temp) ! h2so4 weight percent(%) = f(P_h2o(Pa),T) R2SO4(ilon,ilev)=wph2so4(pph2ogas(ilon,ilev),temp) ! h2so4 mass fraction (0Ayers et.al. (1980), GRL (7) pp 433-436 ! plus corrections for lower temperatures by Kulmala and Laaksonen (1990) ! and Noppel et al. (1990) implicit none real, intent(in) :: T real, parameter :: & & b1=1.01325e5, & & b2=11.5, & & b3=1.0156e4, & & b4=0.38/545., & & tref=360.15 ! saturation vapor pressure ( N/m2 = Pa = kg/(m.s2) ) psh2so4_out=b1*exp( -b2 +b3*( 1./tref-1./T & & +b4*(1.+log(tref/T)-tref/T) ) ) return end function psh2so4 !----------------------------------------------------------------------- real function ndsh2so4(T) result(ndsh2so4_out) ! equilibrium H2SO4 number density over pure H2SO4 (molec/cm3) implicit none real, intent(in) :: T real :: presat ! Boltzmann constant ( 1.38065e-23 J/K = m2⋅kg/(s2⋅K) ) ! akb idem in cm2⋅g/(s2⋅K) real, parameter :: akb=1.38065e-16 ! pure h2so4 saturation vapor pressure (Pa) presat=psh2so4(T) ! saturation number density (1/cm3) - (molec/cm3) ndsh2so4_out=presat*10./(akb*T) return end function ndsh2so4 !----------------------------------------------------------------------- real function psh2o(T) result(psh2o_out) ! equilibrium H2O pressure over pure liquid water (Pa) ! implicit none real, intent(in) :: T if(T.gt.229.) then ! Preining et al., 1981 (from Kulmala et al., 1998) ! saturation vapor pressure (N/m2 = 1 Pa = 1 kg/(m·s2)) psh2o_out=exp( 77.34491296 -7235.424651/T & & -8.2*log(T) + 5.7133e-3*T ) else ! Tabazadeh et al., 1997, parameterization for 185Vehkamaeki et al. (2002) implicit none real, intent(in) :: T, so4mfrac real, parameter :: & & a1= 0.7681724,& & a2= 2.184714, & & a3= 7.163002, & & a4=-44.31447, & & a5= 88.74606, & & a6=-75.73729, & & a7= 23.43228 real, parameter :: & & b1= 1.808225e-3, & & b2=-9.294656e-3, & & b3=-3.742148e-2, & & b4= 2.565321e-1, & & b5=-5.362872e-1, & & b6= 4.857736e-1, & & b7=-1.629592e-1 real, parameter :: & & c1=-3.478524e-6, & & c2= 1.335867e-5, & & c3= 5.195706e-5, & & c4=-3.717636e-4, & & c5= 7.990811e-4, & & c6=-7.458060e-4, & & c7= 2.581390e-4 real :: a,b,c,so4m2,so4m3,so4m4,so4m5,so4m6 so4m2=so4mfrac*so4mfrac so4m3=so4mfrac*so4m2 so4m4=so4mfrac*so4m3 so4m5=so4mfrac*so4m4 so4m6=so4mfrac*so4m5 a=+a1+a2*so4mfrac+a3*so4m2+a4*so4m3 & & +a5*so4m4+a6*so4m5+a7*so4m6 b=+b1+b2*so4mfrac+b3*so4m2+b4*so4m3 & & +b5*so4m4+b6*so4m5+b7*so4m6 c=+c1+c2*so4mfrac+c3*so4m2+c4*so4m3 & & +c5*so4m4+c6*so4m5+c7*so4m6 density_out=(a+b*T+c*T*T) ! units are gm/cm**3 return end function density !----------------------------------------------------------------------- real function surftension(T,so4frac) result(surftension_out) ! calculation of surface tension (mN/meter) ! requires Temperature (T) and acid mole fraction (so4frac) !---->Vehkamaeki et al. (2002) implicit none real,intent(in) :: T, so4frac real :: a,b,so4mfrac,so4m2,so4m3,so4m4,so4m5,so4sig real, parameter :: & & a1= 0.11864, & & a2=-0.11651, & & a3= 0.76852, & & a4=-2.40909, & & a5= 2.95434, & & a6=-1.25852 real, parameter :: & & b1=-1.5709e-4, & & b2= 4.0102e-4, & & b3=-2.3995e-3, & & b4= 7.611235e-3, & & b5=-9.37386e-3, & & b6= 3.89722e-3 real, parameter :: convfac=1.e3 ! convert from newton/m to dyne/cm real, parameter :: Mw=18.01528, Ma=98.079 ! so4 mass fraction so4mfrac=Ma*so4frac/( Ma*so4frac+Mw*(1.-so4frac) ) so4m2=so4mfrac*so4mfrac so4m3=so4mfrac*so4m2 so4m4=so4mfrac*so4m3 so4m5=so4mfrac*so4m4 a=+a1+a2*so4mfrac+a3*so4m2+a4*so4m3+a5*so4m4+a6*so4m5 b=+b1+b2*so4mfrac+b3*so4m2+b4*so4m3+b5*so4m4+b6*so4m5 so4sig=a+b*T surftension_out=so4sig*convfac return end function surftension !----------------------------------------------------------------------- real function wph2so4(pph2o,T) result(wph2so4_out) ! Calculates the equilibrium composition of h2so4 aerosols ! as a function of temperature and H2O pressure, using ! the parameterization of Tabazadeh et al., GRL, p1931, 1997. ! ! Parameters ! ! input: ! T.....temperature (K) ! pph2o..... amhbiant 2o pressure (Pa) ! ! output: ! wph2so4......sulfuric acid composition (weight percent wt % h2so4) ! = h2so4 mass fraction*100. ! implicit none real, intent(in) :: pph2o, T real :: aw, rh, y1, y2, sulfmolal ! psh2o(T): equilibrium H2O pressure over pure liquid water (Pa) ! relative humidity rh=pph2o/psh2o(T) ! water activity ! aw=min( 0.999,max(1.e-3,rh) ) aw=min( 0.999999999,max(1.e-8,rh) ) ! composition ! calculation of h2so4 molality if(aw .le. 0.05 .and. aw .gt. 0.) then y1=12.372089320*aw**(-0.16125516114) & & -30.490657554*aw -2.1133114241 y2=13.455394705*aw**(-0.19213122550) & & -34.285174607*aw -1.7620073078 else if(aw .le. 0.85 .and. aw .gt. 0.05) then y1=11.820654354*aw**(-0.20786404244) & & -4.8073063730*aw -5.1727540348 y2=12.891938068*aw**(-0.23233847708) & & -6.4261237757*aw -4.9005471319 else y1=-180.06541028*aw**(-0.38601102592) & & -93.317846778*aw +273.88132245 y2=-176.95814097*aw**(-0.36257048154) & & -90.469744201*aw +267.45509988 end if ! h2so4 molality (m=moles of h2so4 (solute)/ kg of h2o(solvent)) sulfmolal = y1+((T-190.)*(y2-y1)/70.) ! for a solution containing mh2so4 and mh2o: ! sulfmolal = (mh2so4(gr)/h2so4_molar_mass(gr/mole)) / (mh2o(gr)*1.e-3) ! mh2o=1.e3*(mh2so4/Mh2so4)/sulfmolal=1.e3*mh2so4/(Mh2so4*sulfmolal) ! h2so4_mass_fraction = mfh2so4 = mh2so4/(mh2o + mh2so4) ! mh2o=mh2so4*(1-mfh2so4)/mfh2so4 ! combining the 2 equations ! 1.e3*mh2so4/(Mh2so4*sulfmolal) = mh2so4*(1-mfh2so4)/mfh2so4 ! 1.e3/(Mh2so4*sulfmolal) = (1-mfh2so4)/mfh2so4 ! 1000*mfh2so4 = (1-mfh2so4)*Mh2so4*sulfmolal ! mfh2so4*(1000.+Mh2so4*sulfmolal) = Mh2so4*sulfmolal ! mfh2so4 = Mh2so4*sulfmolal / (1000.+Mh2so4*sulfmolal) ! wph2so4 (% mass fraction)= 100.*Mh2so4*sulfmolal / (1000.+Mh2so4*sulfmolal) ! recall activity of i = a_i = P_i/P_pure_i and ! activity coefficient of i = gamma_i = a_i/X_i (X_i: mole fraction of i) ! so P_i = gamma_i*X_i*P_pure_i ! if ideal solution, gamma_i=1, P_i = X_i*P_pure_i ! h2so4 weight precent wph2so4_out = 9800.*sulfmolal/(98.*sulfmolal+1000.) ! print*,rh,pph2o,psh2o(T),vpice(T) ! print*,T,aw,sulfmolal,wph2so4_out wph2so4_out = max(wph2so4_out,15.) wph2so4_out = min(wph2so4_out,99.999) return end function wph2so4 !----------------------------------------------------------------------- real function solh2so4(T,xa) result(solh2so4_out) ! equilibrium h2so4 number density over H2SO4/H2O solution (molec/cm3) implicit none real, intent(in) :: T, xa ! T(K) xa(H2SO4 mass fraction) real :: xw, a12,b12, cacta, presat xw=1.0-xa ! pure h2so4 saturation number density (molec/cm3) presat=ndsh2so4(T) ! compute activity of acid a12=5.672E3 -4.074E6/T +4.421E8/(T*T) b12=1./0.527 cacta=10.**(a12*xw*xw/(xw+b12*xa)**2/T) ! h2so4 saturation number density over H2SO4/H2O solution (molec/cm3) solh2so4_out=cacta*xa*presat return end function solh2so4 !----------------------------------------------------------------------- real function rpmvh2so4(T,ws) result(rpmvh2so4_out) ! partial molar volume of h2so4 in h2so4/h2o solution (cm3/mole) implicit none real, intent(in) :: T, ws real, dimension(22),parameter :: x=(/ & & 2.393284E-02,-4.359335E-05,7.961181E-08,0.0,-0.198716351, & & 1.39564574E-03,-2.020633E-06,0.51684706,-3.0539E-03,4.505475E-06, & & -0.30119511,1.840408E-03,-2.7221253742E-06,-0.11331674116, & & 8.47763E-04,-1.22336185E-06,0.3455282,-2.2111E-03,3.503768245E-06, & & -0.2315332,1.60074E-03,-2.5827835E-06/) real :: w w=ws*0.01 rpmvh2so4_out=x(5)+x(6)*T+x(7)*T*T+(x(8)+x(9)*T+x(10)*T*T)*w & +(x(11)+x(12)*T+x(13)*T*T)*w*w ! h2so4 partial molar volume in h2so4/h2o solution (cm3/mole) rpmvh2so4_out=rpmvh2so4_out*1000. return end function rpmvh2so4 !----------------------------------------------------------------------- real function rmvh2o(T) result(rmvh2o_out) ! molar volume of pure h2o (cm3/mole) implicit none real, intent(in) :: T real, parameter :: x1=2.393284E-02,x2=-4.359335E-05,x3=7.961181E-08 ! 1000: L/mole -> cm3/mole ! pure h2o molar volume (cm3/mole) rmvh2o_out=(x1+x2*T+x3*T*T)*1000. return end function rmvh2o ! END MODULE sulfate_aer_mod