! ! $Id: so2_to_h2so4.F90 5098 2024-07-22 16:53:44Z abarral $ ! SUBROUTINE SO2_TO_H2SO4(pdtphys,tr_seri,t_seri,pplay,paprs,is_strato) USE dimphy, ONLY : klon,klev USE aerophys USE infotrac_phy USE lmdz_yomcst, ONLY : RG, RD ! lifetime (sec) et O3_clim (VMR) USE phys_local_var_mod, ONLY : SO2_lifetime, H2SO4_lifetime, O3_clim, budg_3D_so2_to_h2so4, budg_so2_to_h2so4 USE strataer_local_var_mod, ONLY : flag_OH_reduced, flag_H2SO4_photolysis, flag_min_rreduce IMPLICIT NONE !-------------------------------------------------------- ! transfer variables when calling this routine REAL,INTENT(IN) :: pdtphys ! Pas d'integration pour la physique (seconde) REAL,DIMENSION(klon,klev,nbtr),INTENT(INOUT) :: tr_seri ! Concentration Traceur [U/KgA] REAL,DIMENSION(klon,klev),INTENT(IN) :: t_seri ! Temperature REAL,DIMENSION(klon,klev),INTENT(IN) :: pplay ! pression pour le mileu de chaque couche (en Pa) REAL,DIMENSION(klon,klev+1),INTENT(IN) :: paprs ! pression pour chaque inter-couche (en Pa) LOGICAL,DIMENSION(klon,klev),INTENT(IN) :: is_strato ! stratospheric flag ! local variables in coagulation routine INTEGER :: i,j,k,nb,ilon,ilev REAL :: dummyso4toso2,rkho2o3,rkoho3,rkso2oh REAL :: rmairdens,rrak0,rrak1,rrate,rreduce !--convert SO2 to H2SO4 budg_3D_so2_to_h2so4(:,:)=0.0 budg_so2_to_h2so4(:)=0.0 DO ilon=1, klon DO ilev=1, klev !only in the stratosphere IF (is_strato(ilon,ilev)) THEN IF (SO2_lifetime(ilon,ilev)>0.0 .AND. SO2_lifetime(ilon,ilev)<1.E10) THEN IF (flag_OH_reduced) THEN !--convert SO2 to H2SO4 (slimane) ! Reduce OH because of SO2 ! d[OH]/dt = k1[HO2][O] +k2[HO2][O3] +k3[HO2][NO] ! − (k4[O] +k5[O3] +k6[CO] +ks[SO2])[OH] ! In steady-state: d[OH]/dt = 0, so the ratio [OH]/[HO2] = ! (k1[O] +k2[O3] +k3[NO]) / (k4[O] +k5[O3] +k6[CO] +ks[SO2]) ! In the lower and middle stratosphere, ! [OH]/[HO2] ~(k2[O3] +k3[NO]) / (k5[O3] +k6[CO] +ks[SO2]) ! CO is only important near the tropopause. NO should not dominate over O3. ! So when consideringthe big terms: [OH]/[HO2] ~ ~ k2[O3] / (k5[O3] +ks[SO2]) ! For c: control run c (no effect of SO2), [OHc]/[HO2c] ~ ~ k2[O3] / k5[O3] = 1/ Rc ! For p: perturbed run (high SO2), [OHp]/[HO2p] ~ ~ k2[O3] / (k5[O3] +ks[SO2]) =1/Rp ! If HOx = OH + HO2 = constante, ! OHc + HO2c = OHp + HO2p ! OHc (1+Rc) = OHp (1+Rp) ! OHp = OHc (1+Rc) / (1+Rp) ! 1+Rc = (k2[O3] +k5[O3] ) / k2[O3] ! 1+Rp = (k2[O3] +k5[O3] +ks[SO2]) / k2[O3] ! (1+Rc) / (1+Rp)= (k2[O3] +k5[O3] )/ (k2[O3] +k5[O3] +ks[SO2]) ! OHp = OHc * (k(HO2+OH)*[O3] +k(OH+O3)[O3] ) / ! (k(HO2+OH)*[O3] +k(OH+O3)[O3] +k(SO2+OH)[SO2]) ! Final: OHp = OHc * (k(HO2+O3)*[O3] +k(OH+O3)[O3] ) / ! (k(HO2+O3)*[O3] +k(OH+O3)[O3] +k(SO2+OH)[SO2]) ! latest jpl 2020 rkho2o3 = 1.0e-14*exp( -490./t_seri(ilon,ilev) ) rkoho3 = 1.7e-12*exp( -940./t_seri(ilon,ilev) ) ! rkso2oh= so2 + oh + m ->hso3 + m-> h2so4 + m ! air density M(molecule/cm3) = Pa/(K*1.38e-19) rmairdens = pplay(ilon,ilev)/(t_seri(ilon,ilev)*1.38e-19) ! JPL 2020 rrak0 = 3.3e-31*( (300./t_seri(ilon,ilev))**4.3 ) rrak1 = 1.6e-12 rrate = (rrak0*rmairdens) / ( 1. + rrak0*rmairdens/rrak1 ) rreduce = 1./( 1. + log10((rrak0*rmairdens)/rrak1)**2 ) rkso2oh = rrate*(0.6**rreduce) ! O3 (molec/cm3): O3_clim in vmr rrak0 = O3_clim(ilon,ilev)*rmairdens ! SO2 (molec/cm3): convert from kg/kgA rrak1 = tr_seri(ilon,ilev,id_SO2_strat) & *pplay(ilon,ilev)/t_seri(ilon,ilev)/RD/1.E6/mSO2mol IF (rrak1 >= 0.0) THEN rreduce =( (rkho2o3+rkoho3)*rrak0 + rkso2oh*rrak1 ) / & ( (rkho2o3+rkoho3)*rrak0 ) ! reduce OH, so extend SO2 lifetime rreduce = rreduce*SO2_lifetime(ilon,ilev) ELSE rreduce = SO2_lifetime(ilon,ilev) ENDIF ! end of IF (rrak1) THEN ELSE rreduce = SO2_lifetime(ilon,ilev) ENDIF ! end of IF (flag_OH_reduced) THEN ! Check lifetime rreduce < timestep*1.5 (such as SO2 loss > 0.5*SO2) with exp(-1/1.5)=0.52 ! Check lifetime rreduce < timestep*3 (such as SO2 loss > 0.28*SO2) with exp(-1/3)=0.72 IF(flag_min_rreduce) THEN IF (rreduce < (3.*pdtphys)) rreduce = 3.*pdtphys ENDIF budg_3D_so2_to_h2so4(ilon,ilev)=tr_seri(ilon,ilev,id_SO2_strat)*(1.0-exp(-pdtphys/rreduce)) tr_seri(ilon,ilev,id_SO2_strat)=tr_seri(ilon,ilev,id_SO2_strat) - budg_3D_so2_to_h2so4(ilon,ilev) tr_seri(ilon,ilev,id_H2SO4_strat)=tr_seri(ilon,ilev,id_H2SO4_strat) + mH2SO4mol/mSO2mol*budg_3D_so2_to_h2so4(ilon,ilev) ENDIF ! IF (SO2_lifetime(ilon,ilev).GT.0.0 .AND. SO2_lifetime(ilon,ilev).LT.1.E10) THEN IF (flag_H2SO4_photolysis) THEN !--convert H2SO4 to SO2 using HCl photolysis (Rinsland et al, 1995) ! 4.6e-8 sec-1: J strato taken from Feierabend, et al., Chem. Phys. Lett., 2006. ! error before: ...exp(-pdtphys/4.6e-8) so negligible photolysis, ! should have been exp(-pdtphys*4.6e-8) ! Also: Lane and Kjaergaard: ,J. Phys. Chem. A, 2008 ! We find that the dominant photodissociation mechanism of H2SO4 ! below 70 km is absorption in the visible region by OH stretching overtone ! transitions, whereas above 70 km, absorption of Lyman-R ... ! In 2D model, 0.3 Rinsland et al, 1995 but Burkholder, Mills and McKeen say 0.016 ! JH2SO4=JHCL*0.3 (*0.016 would be too slow) ! test: quick sequential integration for SO2 to H2SO4 and reverse IF (H2SO4_lifetime(ilon,ilev)>0.0 .AND. H2SO4_lifetime(ilon,ilev)<1.E10) THEN rreduce = H2SO4_lifetime(ilon,ilev) dummyso4toso2 = 0.0 ! Check lifetime rreduce < timestep*1.5 (such as H2SO4 loss > 0.5*H2SO4) with exp(-1/1.5)=0.52 ! Check lifetime rreduce < timestep*3 (such as H2SO4 loss > 0.28*H2SO4) with exp(-1/3)=0.72 IF(flag_min_rreduce) THEN IF (rreduce < (3.*pdtphys)) rreduce = 3.*pdtphys ENDIF dummyso4toso2 = (mSO2mol/mH2SO4mol)*tr_seri(ilon,ilev,id_H2SO4_strat)*(1.0-exp(-pdtphys/rreduce)) budg_3D_so2_to_h2so4(ilon,ilev) = budg_3D_so2_to_h2so4(ilon,ilev) + dummyso4toso2 tr_seri(ilon,ilev,id_SO2_strat)=tr_seri(ilon,ilev,id_SO2_strat) + dummyso4toso2 tr_seri(ilon,ilev,id_H2SO4_strat)=tr_seri(ilon,ilev,id_H2SO4_strat) - (mH2SO4mol/mSO2mol)*dummyso4toso2 ENDIF ! IF (H2SO4_lifetime(ilon,ilev).GT.0.0 .AND. H2SO4_lifetime(ilon,ilev).LT.1.E10) THEN ENDIF ! end of IF (flag_H2SO4_photolysis) THEN !convert budget from kg(SO2)/kgA to kg(S)/m2/layer/s for saving as diagnostic budg_3D_so2_to_h2so4(ilon,ilev)=budg_3D_so2_to_h2so4(ilon,ilev)*mSatom/mSO2mol* & (paprs(ilon,ilev)-paprs(ilon,ilev+1))/RG/pdtphys budg_so2_to_h2so4(ilon)=budg_so2_to_h2so4(ilon)+budg_3D_so2_to_h2so4(ilon,ilev) ENDIF ! IF (is_strato(ilon,ilev)) THEN ENDDO ! DO (klev) ENDDO ! DO (klon) END SUBROUTINE SO2_TO_H2SO4