mo_strato_rates.F90       coverage:  0.00 %func     0.00 %block


     1) 
     2)       module mo_strato_rates
     3) !=======================================================================
     4) ! ROUTINE
     5) !   ratecon_sfstrat.f
     6) !
     7) !  Date...
     8) !  15 August 2002
     9) !  11 April  2008
    10) !
    11) !  Programmed by...
    12) !   Douglas E. Kinnison
    13) !
    14) ! DESCRIPTION
    15) !
    16) ! Derivation of the rate constant for reactions on
    17) !   sulfate, NAT, and ICE aerosols.
    18) !
    19) !
    20) ! Sulfate Aerosol Reactions               Rxn#   Gamma
    21) !   N2O5   + H2O(l)     =>  2HNO3         (1)    f(wt%)
    22) !   ClONO2 + H2O(l)     =>  HOCl + HNO3   (2)    f(T,P,HCl,H2O,r)
    23) !   BrONO2 + H2O(l)     =>  HOBr + HNO3   (3)    f(T,P,H2O,r)
    24) !   ClONO2 + HCl(l)     =>  Cl2  + HNO3   (4)    f(T,P,HCl,H2O,r)
    25) !   HOCl   + HCl(l)     =>  Cl2  + H2O    (5)    f(T,P,HCl,HOCl,H2O,r)
    26) !   HOBr   + HCl(l)     =>  BrCl + H2O    (6)    f(T,P,HCl,HOBr,H2O,r)
    27) !
    28) ! Nitric Acid Di-hydrate Reactions        Rxn#    Gamma   Reference
    29) !   N2O5   + H2O(s)     =>  2HNO3         (7)     4e-4   JPL06-2
    30) !   ClONO2 + H2O(s)     =>  HOCl + HNO3   (8)     4e-3   JPL06-2
    31) !   ClONO2 + HCl(s)     =>  Cl2  + HNO3   (9)     0.2    JPL06-2
    32) !   HOCl   + HCl(s)     =>  Cl2  + H2O    (10)    0.1    JPL06-2
    33) !   BrONO2 + H2O(s)     =>  HOBr + HNO3   (11)    0.3    David Hanson PC
    34) !
    35) ! ICE Aersol Reactions                    Rxn#    Gamma
    36) !   N2O5   + H2O(s)     =>  2HNO3         (12)     0.02   JPL06-2
    37) !   ClONO2 + H2O(s)     =>  HOCl + HNO3   (13)     0.3    JPL06-2
    38) !   BrONO2 + H2O(s)     =>  HOBr + HNO3   (14)     0.3    JPL06-2
    39) !   ClONO2 + HCl(s)     =>  Cl2  + HNO3   (15)     0.3    JPL06-2
    40) !   HOCl   + HCl(s)     =>  Cl2  + H2O    (16)     0.2    JPL06-2
    41) !   HOBr   + HCl(s)     =>  BrCl + H2O    (17)     0.3    JPL06-2
    42) !
    43) ! NOTE: The rate constants derived from species reacting with H2O are
    44) !       first order (i.e., sec-1 units) - an example is N2O5 + H2O = 2HNO3.
    45) !       Other reactions, e.g., ClONO2 + HCl have rate constants that
    46) !       are second order (i.e., cm+3 molecules-1 sec-1 units). In all
    47) !       of these types of reactions the derived first order rate constant
    48) !       {0.25*(mean Velocity)*SAD*gamma} is divided by the HCl abundance
    49) !       to derive the correct second order units.
    50) !
    51) ! NOTE: Liquid Sulfate Aerosols...
    52) !       See coding for references on how the Sulfate Aerosols were handled.
    53) !       Data was used that was more recent than JPL00.
    54) !
    55) !
    56) ! INPUT:
    57) !  ad      .    .... air density, molec. cm-3
    58) !  pmid        ..... pressures, hPa
    59) !  temp        ..... temperatures, K
    60) !  rad_sulfate ..... Surface area density, cm2 cm-3
    61) !  sad_sulfate ..... Surface area density, cm2 cm-3
    62) !  sad_nat     ..... Surface area density, cm2 cm-3
    63) !  sad_ice     ..... Surface area density, cm2 cm-3
    64) !  brono2mv    ..... BrONO2 Volume Mixing Ratio
    65) !  clono2mvr   ..... ClONO2 Volume Mixing Ratio
    66) !  h2omvr      ..... H2O Volume Mixing Ratio
    67) !  hclmvr      ..... HCl Volume Mixing Ratio
    68) !  hobrmvr     ..... HOBr Volume Mixing Ratio
    69) !  hoclmvr     ..... HOCl Volume Mixing Ratio
    70) !  n2o5mvr     ..... N2O5 Volume Mixing Ratio
    71) !
    72) ! OUTPUT:
    73) !
    74) !  rxt         ..... Rate constant (s-1 and cm3 sec-1 molec-1)
    75) !=======================================================================
    76) 
    77)       private
    78)       public :: ratecon_sfstrat, init_strato_rates, has_strato_chem
    79) 
    80)       integer :: id_brono2, id_clono2, id_hcl, id_hocl, &
    81)            id_hobr, id_n2o5
    82)       integer :: rid_het1,  rid_het2,  rid_het3,  rid_het4,  rid_het5, &
    83)            rid_het6,  rid_het7,  rid_het8,  rid_het9,  rid_het10, &
    84)            rid_het11, rid_het12, rid_het13, rid_het14, rid_het15, &
    85)            rid_het16, rid_het17
    86) 
    87)       logical :: has_strato_chem 
    88) 
    89)       contains
    90) 
    91)         subroutine init_strato_rates
    92) 
    93)           use mo_chem_utls, only : get_rxt_ndx, get_spc_ndx
    94)           use mo_aero_settling, only: strat_aer_settl_init
    95)           implicit none
    96) 
    97)           integer :: ids(23)
    98) 
    99)           rid_het1  = get_rxt_ndx( 'het1' )
   100)           rid_het2  = get_rxt_ndx( 'het2' )
   101)           rid_het3  = get_rxt_ndx( 'het3' )
   102)           rid_het4  = get_rxt_ndx( 'het4' )
   103)           rid_het5  = get_rxt_ndx( 'het5' )
   104)           rid_het6  = get_rxt_ndx( 'het6' )
   105)           rid_het7  = get_rxt_ndx( 'het7' )
   106)           rid_het8  = get_rxt_ndx( 'het8' )
   107)           rid_het9  = get_rxt_ndx( 'het9' )
   108)           rid_het10 = get_rxt_ndx( 'het10' )
   109)           rid_het11 = get_rxt_ndx( 'het11' )
   110)           rid_het12 = get_rxt_ndx( 'het12' )
   111)           rid_het13 = get_rxt_ndx( 'het13' )
   112)           rid_het14 = get_rxt_ndx( 'het14' )
   113)           rid_het15 = get_rxt_ndx( 'het15' )
   114)           rid_het16 = get_rxt_ndx( 'het16' )
   115)           rid_het17 = get_rxt_ndx( 'het17' )
   116) 
   117)           id_brono2 = get_spc_ndx( 'BRONO2' )
   118)           id_clono2 = get_spc_ndx( 'CLONO2' )
   119)           id_hcl    = get_spc_ndx( 'HCL' )
   120)           id_hocl   = get_spc_ndx( 'HOCL' )
   121)           id_hobr   = get_spc_ndx( 'HOBR' )
   122)           id_n2o5   = get_spc_ndx( 'N2O5' )
   123) 
   124)           ids(:) = (/ rid_het1, rid_het2, rid_het3, rid_het4, rid_het5, rid_het6, rid_het7, rid_het8, &
   125)                rid_het9, rid_het10, rid_het11, rid_het12, rid_het13, rid_het14, rid_het15, &
   126)                rid_het16, rid_het17, id_brono2, id_clono2, id_hcl, id_hocl, id_hobr, id_n2o5 /)
   127) 
   128)           has_strato_chem = all( ids(:) > 0 )
   129) 
   130)           if (.not. has_strato_chem) return
   131) 
   132)           call strat_aer_settl_init
   133) 
   134)         endsubroutine init_strato_rates
   135) 
   136)       subroutine ratecon_sfstrat( ad, pmid, temp, rad_sulfate, sad_sulfate, &
   137)                                   sad_nat, sad_ice, h2ovmr, vmr, rxt, ncol )
   138) 
   139)       use shr_kind_mod, only : r8 => shr_kind_r8
   140)       use chem_mods,    only : adv_mass, rxntot, gas_pcnst
   141)       use ppgrid,       only : pcols, pver
   142)       use mo_sad,       only : sad_top
   143)       use cam_logfile,  only : iulog
   144) 
   145)       implicit none
   146) 
   147) !-----------------------------------------------------------------------
   148) !	... dummy arguments
   149) !-----------------------------------------------------------------------
   150)       integer, intent(in) :: ncol                                 ! columns in chunk
   151)       real(r8), dimension(ncol,pver,gas_pcnst), intent(in) :: &   ! species concentrations (mol/mol)
   152)         vmr
   153)       real(r8), dimension(ncol,pver), intent(in) :: &
   154)         ad, &                                                     ! Air Density (molec. cm-3)
   155)         rad_sulfate, &                                            ! Radius of Sulfate Aerosol (cm)
   156)         sad_ice, &                                                ! ICE Surface Area Density (cm-1)
   157)         sad_nat, &                                                ! NAT Surface Area Density (cm-1)
   158)         sad_sulfate, &                                            ! Sulfate Surface Area Density (cm-1)
   159)         h2ovmr                                                    ! water vapor volume mixing ratio( gas phase )
   160)       real(r8), dimension(pcols,pver), intent(in) :: &
   161)         pmid, &                                                   ! pressure (Pa)
   162)         temp                                                      ! temperature (K)
   163) 
   164)       real(r8), intent(out) :: &
   165)         rxt(ncol,pver,rxntot)                                     ! rate constants
   166) 
   167) !-----------------------------------------------------------------------
   168) !  	... local variables
   169) !-----------------------------------------------------------------------
   170) 	real(r8), parameter :: small_conc = 1.e-30_r8
   171) 	real(r8), parameter :: av_const   = 2.117265e4_r8  ! (8*8.31448*1000 / PI)
   172) 	real(r8), parameter :: pa2mb      = 1.e-2_r8       ! Pa to mb
   173) 	real(r8), parameter :: m2cm       = 100._r8        ! meters to cms
   174) 
   175)       integer :: &
   176)         i, &                      ! altitude loop index
   177)         k, &                      ! level loop index
   178)         m                         ! species index
   179) 
   180) !-----------------------------------------------------------------------
   181) !   	... variables for gamma calculations
   182) !-----------------------------------------------------------------------
   183)       real(r8) :: &
   184)         brono2vmr, &                            ! BrONO2 Volume Mixing Ratio
   185)         clono2vmr, &                            ! ClONO2 Volume Mixing Ratio
   186)         hclvmr, &                               ! HCl Volume Mixing Ratio
   187)         hcldeni, &                              ! inverse of HCl density
   188)         cntdeni, &                              ! inverse of ClONO2 density
   189)         hocldeni, &                             ! inverse of HOCl density
   190)         hobrdeni, &                             ! inverse of HOBr density
   191)         hoclvmr, &                              ! HOCl Volume Mixing Ratio
   192)         hobrvmr, &                              ! HOBr Volume Mixing Ratio
   193)         n2o5vmr                                 ! N2O5 Volume Mixing Ratio
   194) 
   195)         real(r8) :: &
   196)         av_n2o5, &                              ! N2O5 Mean Velocity (cm s-1)
   197)         av_clono2, &                            ! ClONO2 Mean Velocity (cm s-1)
   198)         av_brono2, &                            ! BrONO2Mean Velocity (cm s-1)
   199)         av_hocl, &                              ! HOCl Mean Velocity (cm s-1)
   200)         av_hobr                                 ! HOBr Mean Velocity (cm s-1)
   201) 
   202)       real(r8) :: &
   203)         pzero_h2o, &                            ! H2O sat vapor press (mbar)
   204)         e0, e1, e2, e3, &                       ! coefficients for H2O sat vapor press.
   205)         aw, &                                   ! Water activity
   206)         m_h2so4, &                              ! H2SO4 molality (mol/kg)
   207)         wt, &                                   ! wt % H2SO4
   208)         y1, y2, &                               ! used in H2SO4 molality
   209)         &  a1, b1, c1, d1, &                    ! used in H2SO4 molality
   210)         a2, b2, c2, d2                          ! used in H2SO4 molality
   211) 
   212)         real(r8) :: &
   213)         z1, z2, z3, &                           ! used in H2SO4 soln density
   214)         den_h2so4, &                            ! H2SO4 soln density, g/cm3
   215)         mol_h2so4, &                            ! Molality of H2SO4, mol / kg
   216)         molar_h2so4, &                          ! Molarity of H2SO4, mol / l
   217)         x_h2so4, &                              ! H2SO4 mole fraction
   218)         aconst, tzero, &                        ! used in viscosity of H2SO4
   219)         vis_h2so4, &                            ! H2SO4 viscosity
   220)         ah, &                                   ! Acid activity, molarity units
   221)         term1,term2,term3,term4, &              ! used in ah
   222)         term5,term6,term7,term0, &
   223)         T_limit, &                              ! temporary variable for temp (185-260K range)
   224)         T_limiti, &                             ! 1./T_limit
   225)         T_limitsq, &                            ! sqrt( T_limit )
   226)         rad_sulf, &                             ! temporary variable for sulfate radius (cm)
   227)         sadsulf, &                              ! temporary variable for sulfate radius (cm)
   228)         sadice, &                               ! temporary variable for sulfate radius (cm)
   229)         sadnat                                  ! temporary variable for sulfate radius (cm)
   230) 
   231)       real(r8) :: &
   232)         C_cnt, S_cnt, &                         ! used in H_cnt
   233)         H_cnt, &                                ! Henry's law coeff. for ClONO2
   234)         H_hcl, &                                ! Henry's law coeff. for HCl
   235)         D_cnt, &
   236)         k_hydr, &
   237)         k_h2o, &
   238)         k_h, &
   239)         k_hcl, &
   240)         rdl_cnt, &
   241)         f_cnt, &
   242)         M_hcl, &
   243)         atmos
   244) 
   245)       real(r8) :: &
   246)         Gamma_b_h2o, &
   247)         Gamma_cnt_rxn, &
   248)         Gamma_b_hcl, &
   249)         Gamma_s, &
   250)         Fhcl, &
   251)         Gamma_s_prime, &
   252)         Gamma_b_hcl_prime, &
   253)         Gamma_b, &
   254)         gprob_n2o5, &
   255)         gprob_rxn, &
   256)         gprob_tot, &
   257)         gprob_cnt, &
   258)         gprob_cnt_hcl, &
   259)         gprob_cnt_h2o
   260) 
   261)         real(r8) :: &
   262)         D_hocl, &
   263)         k_hocl_hcl, &
   264)         C_hocl, &
   265)         S_hocl, &
   266)         H_hocl, &
   267)         Gamma_hocl_rxn, &
   268)         rdl_hocl, &
   269)         f_hocl, &
   270)         gprob_hocl_hcl
   271) 
   272)         real(r8) :: &
   273)         h1, h2, h3, &
   274)         alpha, &
   275)         gprob_bnt_h2o
   276) 
   277)       real(r8) :: &
   278)         C_hobr, &
   279)         D_hobr, &
   280)         aa, bb, cc, dd, &
   281)         k_hobr_hcl, &
   282)         k_dl, &
   283)         k_wasch, &
   284)         H_hobr, &
   285)         rdl_hobr, &
   286)         Gamma_hobr_rxn, &
   287)         f_hobr, &
   288)         gprob_hobr_hcl
   289) 
   290)       real(r8) :: &
   291)         pmb,&					! Pressure, mbar (hPa)
   292)         pH2O_atm,&				! Partial press. H2O (atm)
   293)         pH2O_hPa,&				! Partial press. H2O (hPa)
   294)         pHCl_atm,&				! Partial press. HCl (atm)
   295)         pCNT_atm                                ! Partial press. ClONO2 (atm)
   296) 
   297) !-----------------------------------------------------------------------
   298) !     	... Used in pzero h2o calculation
   299) !-----------------------------------------------------------------------
   300)       real(r8), parameter :: wt_e0 = 18.452406985_r8
   301)       real(r8), parameter :: wt_e1 = 3505.1578807_r8
   302)       real(r8), parameter :: wt_e2 = 330918.55082_r8
   303)       real(r8), parameter :: wt_e3 = 12725068.262_r8
   304) 
   305)       real(r8) :: &
   306)         wrk, tmp
   307) 
   308)       real(r8), parameter :: small = 1.e-16_r8
   309) 
   310)       if (.not. has_strato_chem) return
   311) 
   312) !-----------------------------------------------------------------------
   313) !     	... intialize rate constants
   314) !-----------------------------------------------------------------------
   315)       do k = 1,pver
   316)          rxt(:,k,rid_het1) = 0._r8
   317)          rxt(:,k,rid_het2) = 0._r8
   318)          rxt(:,k,rid_het3) = 0._r8
   319)          rxt(:,k,rid_het4) = 0._r8
   320)          rxt(:,k,rid_het5) = 0._r8
   321)          rxt(:,k,rid_het6) = 0._r8
   322)          rxt(:,k,rid_het7) = 0._r8
   323)          rxt(:,k,rid_het8) = 0._r8
   324)          rxt(:,k,rid_het9) = 0._r8
   325)          rxt(:,k,rid_het10) = 0._r8
   326)          rxt(:,k,rid_het11) = 0._r8
   327)          rxt(:,k,rid_het12) = 0._r8
   328)          rxt(:,k,rid_het13) = 0._r8
   329)          rxt(:,k,rid_het14) = 0._r8
   330)          rxt(:,k,rid_het15) = 0._r8
   331)          rxt(:,k,rid_het16) = 0._r8
   332)          rxt(:,k,rid_het17) = 0._r8
   333)       end do
   334) 
   335) !-----------------------------------------------------------------------
   336) !     	... set rate constants
   337) !-----------------------------------------------------------------------
   338) Level_loop : &
   339)       do k = sad_top+1,pver
   340) column_loop : &
   341)          do i = 1,ncol
   342) !-----------------------------------------------------------------------
   343) !	... set species, pmb, and atmos
   344) !-----------------------------------------------------------------------
   345) 	    brono2vmr = vmr(i,k,id_brono2)
   346) 	    clono2vmr = vmr(i,k,id_clono2)
   347) 	    hclvmr    = vmr(i,k,id_hcl)
   348) 	    hoclvmr      = vmr(i,k,id_hocl)
   349) 	    hobrvmr      = vmr(i,k,id_hobr)
   350) 	    if( hclvmr > 0._r8 ) then
   351) 	       hcldeni  = 1._r8/(hclvmr*ad(i,k))
   352) 	    end if
   353) 	    if( clono2vmr > 0._r8 ) then
   354) 	       cntdeni  = 1._r8/(clono2vmr*ad(i,k))
   355) 	    end if
   356) 	    if( hoclvmr > 0._r8 ) then
   357) 	       hocldeni  = 1._r8/(hoclvmr*ad(i,k))
   358) 	    end if
   359) 	    if( hobrvmr > 0._r8 ) then
   360) 	       hobrdeni  = 1._r8/(hobrvmr*ad(i,k))
   361) 	    end if
   362) 	    n2o5vmr      = vmr(i,k,id_n2o5)
   363)             sadsulf      = sad_sulfate(i,k)
   364)             sadnat       = sad_nat(i,k)
   365) 	    sadice       = sad_ice(i,k)
   366)             pmb          = pa2mb*pmid(i,k)
   367)             atmos        = pmb/1013.25_r8
   368) 
   369) !-----------------------------------------------------------------------
   370) !  	... setup for stratospheric aerosols
   371) !           data range set: 185K - 240K;    GRL, 24, 1931, 1997
   372) !-----------------------------------------------------------------------
   373)             T_limit   = max( temp(i,k),185._r8 )
   374)             T_limit   = min( T_limit,240._r8 )
   375)             T_limiti  = 1._r8/T_limit
   376)             T_limitsq = sqrt( T_limit )
   377) 
   378) !-----------------------------------------------------------------------
   379) !     .... Average velocity (8RT*1000/(PI*MW))**1/2 * 100.(units cm s-1)
   380) !     .... or (av_const*T/M2)**1/2
   381) !-----------------------------------------------------------------------
   382) 	    wrk       = av_const*T_limit
   383)             av_n2o5   = sqrt( wrk/adv_mass(id_n2o5) )*m2cm
   384)             av_clono2 = sqrt( wrk/adv_mass(id_clono2) )*m2cm
   385)             av_brono2 = sqrt( wrk/adv_mass(id_brono2) )*m2cm
   386)             av_hocl   = sqrt( wrk/adv_mass(id_hocl) )*m2cm
   387)             av_hobr   = sqrt( wrk/adv_mass(id_hobr) )*m2cm
   388) has_sadsulf : &
   389)             if( sadsulf > 0._r8 ) then
   390) !-----------------------------------------------------------------------
   391) !     .... Partial Pressure of H2O, ClONO2, and HCl in atmospheres
   392) !-----------------------------------------------------------------------
   393)                if( hclvmr > 0._r8 ) then
   394)                   pHCl_atm  = hclvmr*atmos
   395)                else
   396)                   pHCl_atm  = 0._r8
   397)                end if
   398) 
   399)                if( clono2vmr > 0._r8 ) then
   400)                   pCNT_atm  = clono2vmr*atmos
   401)                else
   402)                   pCNT_atm  = 0._r8
   403)                end if
   404) 
   405)                if( h2ovmr(i,k) > 0._r8 ) then
   406)                   pH2O_atm  = h2ovmr(i,k)*atmos
   407)                else
   408)                   pH2O_atm  = 0._r8
   409)                end if
   410) 
   411) !-----------------------------------------------------------------------
   412) !     .... Partial Pressure of H2O in hPa
   413) !-----------------------------------------------------------------------
   414)                pH2O_hpa = h2ovmr(i,k)*pmb
   415) !-----------------------------------------------------------------------
   416) !     .... Calculate the h2so4 Wt% and Activity of H2O - 
   417) !-----------------------------------------------------------------------
   418) !-----------------------------------------------------------------------
   419) !     ... Saturation Water Vapor Pressure (mbar)
   420) !-----------------------------------------------------------------------
   421)                pzero_h2o = exp( wt_e0 - T_limiti*(wt_e1 + T_limiti*(wt_e2 - T_limiti*wt_e3)) )
   422) !-----------------------------------------------------------------------
   423) !     ... H2O activity
   424) !     ... if the activity of H2O goes above 1.0, wt% can go negative
   425) !-----------------------------------------------------------------------
   426)                aw = ph2o_hpa / pzero_h2o
   427)                aw = min( aw,1._r8 )
   428)                aw = max( aw,.001_r8 )
   429) !-----------------------------------------------------------------------
   430) !     ... h2so4 Molality (mol/kg)
   431) !-----------------------------------------------------------------------
   432)                if( aw <= .05_r8 ) then
   433)                   a1 = 12.37208932_r8
   434)                   b1 = -0.16125516114_r8
   435)                   c1 = -30.490657554_r8
   436)                   d1 = -2.1133114241_r8
   437)                   a2 = 13.455394705_r8
   438)                   b2 = -0.1921312255_r8
   439)                   c2 = -34.285174607_r8
   440)                   d2 = -1.7620073078_r8
   441)                else if( aw > .05_r8 .and. aw < .85_r8 ) then
   442)                   a1 = 11.820654354_r8
   443)                   b1 = -0.20786404244_r8
   444)                   c1 = -4.807306373_r8
   445)                   d1 = -5.1727540348_r8
   446)                   a2 = 12.891938068_r8
   447)                   b2 = -0.23233847708_r8
   448)                   c2 = -6.4261237757_r8
   449)                   d2 = -4.9005471319_r8
   450)                else
   451)                   a1 = -180.06541028_r8
   452)                   b1 = -0.38601102592_r8
   453)                   c1 = -93.317846778_r8
   454)                   d1 = 273.88132245_r8
   455)                   a2 = -176.95814097_r8
   456)                   b2 = -0.36257048154_r8
   457)                   c2 = -90.469744201_r8
   458)                   d2 = 267.45509988_r8
   459)                end if
   460) !-----------------------------------------------------------------------
   461) !     ... h2so4 mole fraction
   462) !-----------------------------------------------------------------------
   463)                y1       = a1*(aw**b1) + c1*aw + d1
   464)                y2       = a2*(aw**b2) + c2*aw + d2
   465)                m_h2so4  = y1 + ((T_limit - 190._r8)*(y2 - y1)) / 70._r8
   466) !-----------------------------------------------------------------------
   467) !     ... h2so4 Weight Percent
   468) !-----------------------------------------------------------------------
   469)                wt = 9800._r8*m_h2so4 / (98._r8*m_h2so4  + 1000._r8)
   470) !-----------------------------------------------------------------------
   471) !     .... Parameters for h2so4 Solution, JPL-00
   472) !-----------------------------------------------------------------------
   473) !     ... h2so4 Solution Density (g/cm3)
   474) !-----------------------------------------------------------------------
   475) 	       wrk = T_limit*T_limit
   476)                z1 =  .12364_r8  - 5.6e-7_r8*wrk
   477)                z2 = -.02954_r8  + 1.814e-7_r8*wrk
   478)                z3 =  2.343e-3_r8 - T_limit*1.487e-6_r8 - 1.324e-8_r8*wrk
   479) !-----------------------------------------------------------------------
   480) !     ... where mol_h2so4 is molality in mol/kg
   481) !-----------------------------------------------------------------------
   482)                den_h2so4 = 1._r8 + m_h2so4*(z1 + z2*sqrt(m_h2so4) + z3*m_h2so4)
   483) !-----------------------------------------------------------------------
   484) !     ... h2so4 Molarity, mol / l
   485) !-----------------------------------------------------------------------
   486)                molar_h2so4 = den_h2so4*wt/9.8_r8
   487) !-----------------------------------------------------------------------
   488) !     ... h2so4 Mole fraction
   489) !-----------------------------------------------------------------------
   490)                x_h2so4   = wt / (wt + ((100._r8 - wt)*98._r8/18._r8))
   491)                term1     = .094_r8 - x_h2so4*(.61_r8 - 1.2_r8*x_h2so4)
   492)                term2     = (8515._r8 - 10718._r8*(x_h2so4**.7_r8))*T_limiti
   493)                H_hcl     = term1 * exp( -8.68_r8 + term2 )
   494)                M_hcl     = H_hcl*pHCl_atm
   495) 
   496) !-----------------------------------------------------------------------
   497) !     ... h2so4 solution viscosity
   498) !-----------------------------------------------------------------------
   499)                aconst    = 169.5_r8 + wt*(5.18_r8 - wt*(.0825_r8 - 3.27e-3_r8*wt))
   500)                tzero     = 144.11_r8 + wt*(.166_r8 - wt*(.015_r8 - 2.18e-4_r8*wt))
   501)                vis_h2so4 = aconst/(T_limit**1.43_r8) * exp( 448._r8/(T_limit - tzero) )
   502) 
   503) !-----------------------------------------------------------------------
   504) !     ... Acid activity in molarity
   505) !-----------------------------------------------------------------------
   506)                term1 = 60.51_r8
   507)                term2 = .095_r8*wt
   508) 	       wrk   = wt*wt
   509)                term3 = .0077_r8*wrk
   510)                term4 = 1.61e-5_r8*wt*wrk
   511)                term5 = (1.76_r8 + 2.52e-4_r8*wrk) * T_limitsq
   512)                term6 = -805.89_r8 + (253.05_r8*(wt**.076_r8))
   513)                term7 = T_limitsq
   514)                ah    = exp( term1 - term2 + term3 - term4 - term5 + term6/term7 )
   515) 	       if( ah <= 0._r8 ) then
   516) 	          write(iulog,*) 'ratecon: ah <= 0 at i,k, = ',i,k
   517) 	          write(iulog,*) 'ratecon: term1,term2,term3,term4,term5,term6,term7,wt,T_limit,ah = ', &
   518) 	                               term1,term2,term3,term4,term5,term6,term7,wt,T_limit,ah 
   519) 	       end if
   520) 
   521) 	       wrk      = .25_r8*sadsulf
   522)                rad_sulf = max( rad_sulfate(i,k),1.e-7_r8 )
   523) !-----------------------------------------------------------------------
   524) !     N2O5 + H2O(liq) =>  2.00*HNO3  Sulfate Aerosol Reaction
   525) !-----------------------------------------------------------------------
   526)                if( n2o5vmr > small ) then
   527)                   term0 = -25.5265_r8 - wt*(.133188_r8 - wt*(.00930846_r8 - 9.0194e-5_r8*wt))
   528)                   term1 = 9283.76_r8 + wt*(115.345_r8 - wt*(5.19258_r8 - .0483464_r8*wt))
   529)                   term2 = -851801._r8 - wt*(22191.2_r8 - wt*(766.916_r8 - 6.85427_r8*wt))
   530)                   gprob_n2o5 = exp( term0 + T_limiti*(term1 + term2*T_limiti) )
   531)                   rxt(i,k,rid_het1) = max( 0._r8,wrk*av_n2o5*gprob_n2o5 )
   532)                end if
   533) 
   534) !-----------------------------------------------------------------------
   535) !     ClONO2 + H2O(liq) =  HOCl + HNO3   Sulfate Aerosol Reaction
   536) !-----------------------------------------------------------------------
   537) ! 	... NOTE: Aerosol radius in units of cm.
   538) !-----------------------------------------------------------------------
   539) !-----------------------------------------------------------------------
   540) !     	... Radius sulfate set (from sad module)
   541) !           Set min radius to 0.001 microns (1e-7 cm)
   542) !           Typical radius is 0.1 microns (1e-5 cm)
   543) !           f_cnt may go negative under if not set.
   544) !-----------------------------------------------------------------------
   545)                   C_cnt         = 1474._r8*T_limitsq
   546)                   S_cnt         = .306_r8 + 24._r8*T_limiti
   547)                   term1         = exp( -S_cnt*molar_h2so4 )
   548)                   H_cnt         = 1.6e-6_r8 * exp( 4710._r8*T_limiti )*term1
   549)                   D_cnt         = 5.e-8_r8*T_limit / vis_h2so4
   550)                   k_h           = 1.22e12_r8*exp( -6200._r8*T_limiti )
   551)                   k_h2o         = 1.95e10_r8*exp( -2800._r8*T_limiti )
   552)                   k_hydr        = (k_h2o + k_h*ah)*aw
   553)                   k_hcl         = 7.9e11_r8*ah*D_cnt*M_hcl
   554)                   rdl_cnt       = sqrt( D_cnt/(k_hydr + k_hcl) )
   555)                   term1         = 1._r8/tanh( rad_sulf/rdl_cnt )
   556)                   term2         = rdl_cnt/rad_sulf
   557)                   f_cnt         = term1 - term2
   558)                   if( f_cnt > 0._r8 ) then
   559)                      term1         = 4._r8*H_cnt*.082_r8*T_limit
   560)                      term2         = sqrt( D_cnt*k_hydr )
   561)                      Gamma_b_h2o   = term1*term2/C_cnt
   562)                      term1         = sqrt( 1._r8 + k_hcl/k_hydr )
   563)                      Gamma_cnt_rxn = f_cnt*Gamma_b_h2o*term1
   564)                      Gamma_b_hcl   = Gamma_cnt_rxn*k_hcl/(k_hcl + k_hydr)
   565)                      term1         = exp( -1374._r8*T_limiti )
   566)                      Gamma_s       = 66.12_r8*H_cnt*M_hcl*term1
   567) 		     if( pHCl_atm > 0._r8 ) then
   568)                         term1      = .612_r8*(Gamma_s+Gamma_b_hcl)* pCNT_atm/pHCl_atm
   569)                         Fhcl       = 1._r8/(1._r8 + term1)
   570) 		     else
   571)                         Fhcl       = 1._r8
   572) 		     end if
   573)                      Gamma_s_prime     = Fhcl*Gamma_s
   574)                      Gamma_b_hcl_prime = Fhcl*Gamma_b_hcl
   575)                      term1         = Gamma_cnt_rxn*k_hydr
   576)                      term2         = k_hcl + k_hydr
   577)                      Gamma_b       = Gamma_b_hcl_prime + (term1/term2)
   578)                      term1         = 1._r8 / (Gamma_s_prime + Gamma_b)
   579)                      gprob_cnt     = 1._r8 / (1._r8 + term1)
   580)                      term1         = Gamma_s_prime + Gamma_b_hcl_prime
   581)                      term2         = Gamma_s_prime + Gamma_b
   582)                      gprob_cnt_hcl = gprob_cnt * term1/term2
   583)                      gprob_cnt_h2o = gprob_cnt - gprob_cnt_hcl
   584)                   else
   585)                      gprob_cnt_h2o = 0._r8
   586)                      gprob_cnt_hcl = 0._r8
   587)                      Fhcl          = 1._r8
   588)                   end if
   589)                   if( clono2vmr > small ) then
   590)                      rxt(i,k,rid_het2) = max( 0._r8,wrk*av_clono2*gprob_cnt_h2o )
   591)                   end if
   592) 
   593) !-----------------------------------------------------------------------
   594) !  	... BrONO2 + H2O(liq) =  HOBr + HNO3   Sulfate Aerosol Reaction
   595) !-----------------------------------------------------------------------
   596)                if( brono2vmr > small ) then
   597)                   h1    = 29.24_r8
   598)                   h2    = -.396_r8
   599)                   h3    = .114_r8
   600)                   alpha = .805_r8
   601)                   gprob_rxn = exp( h1 + h2*wt ) + h3
   602)                   term1     = 1._r8/alpha
   603)                   term2     = 1._r8/gprob_rxn
   604)                   gprob_bnt_h2o = 1._r8 / (term1 + term2)
   605)                   rxt(i,k,rid_het3) = max( 0._r8,wrk*av_brono2*gprob_bnt_h2o )
   606)                end if
   607) 
   608) !-----------------------------------------------------------------------
   609) !     	... ClONO2 + HCl(liq) =  Cl2  + HNO3  Sulfate Aerosol Reaction
   610) !-----------------------------------------------------------------------
   611)                if( hclvmr > small .and. clono2vmr > small ) then
   612)                  if ( hclvmr > clono2vmr ) then
   613)                     rxt(i,k,rid_het4) = max( 0._r8,wrk*av_clono2*gprob_cnt_hcl )*hcldeni
   614)                  else
   615)                     rxt(i,k,rid_het4) = max( 0._r8,wrk*av_clono2*gprob_cnt_hcl )*cntdeni
   616)                  end if
   617)                end if
   618) 
   619) !-----------------------------------------------------------------------
   620) !     	... HOCl + HCl(liq) =  Cl2 + H2O   Sulfate Aerosol Reaction
   621) !-----------------------------------------------------------------------
   622)                if( hclvmr > small .and. hoclvmr > small ) then
   623) !-----------------------------------------------------------------------
   624) !     	... Radius sulfate set (from sad module)
   625) !           Set min radius to 0.001 microns (1e-7 cm)
   626) !           Typical radius is 0.1 microns (1e-5 cm)
   627) !           f_hocl may go negative under if not set.
   628) !-----------------------------------------------------------------------
   629) 	          if( pCNT_atm > 0._r8 ) then
   630)                      D_hocl          = 6.4e-8_r8*T_limit/vis_h2so4
   631)                      k_hocl_hcl      = 1.25e9_r8*ah*D_hocl*M_hcl
   632)                      C_hocl          = 2009._r8*T_limitsq
   633)                      S_hocl          = .0776_r8 + 59.18_r8*T_limiti
   634)                      term1           = exp( -S_hocl*molar_h2so4 )
   635)                      H_hocl          = 1.91e-6_r8 * exp( 5862.4_r8*T_limiti )*term1
   636)                      term1           = 4._r8*H_hocl*.082_r8*T_limit
   637)                      term2           = sqrt( D_hocl*k_hocl_hcl )
   638)                      Gamma_hocl_rxn  = term1*term2/C_hocl
   639)                      rdl_hocl        = sqrt( D_hocl/k_hocl_hcl )
   640)                      term1           = 1._r8/tanh( rad_sulf/rdl_hocl )
   641)                      term2           = rdl_hocl/rad_sulf
   642)                      f_hocl          = term1 - term2
   643)                      if( f_hocl > 0._r8 ) then
   644)                         term1           = 1._r8 / (f_hocl*Gamma_hocl_rxn*Fhcl)
   645)                         gprob_hocl_hcl  = 1._r8 / (1._r8 + term1)
   646)                      else
   647)                         gprob_hocl_hcl  = 0._r8
   648)                      end if
   649) 
   650)                      if ( hclvmr > hoclvmr ) then
   651)                        rxt(i,k,rid_het5) = max( 0._r8,wrk*av_hocl*gprob_hocl_hcl )*hcldeni
   652)                      else
   653)                        rxt(i,k,rid_het5) = max( 0._r8,wrk*av_hocl*gprob_hocl_hcl )*hocldeni
   654)                      end if
   655) 
   656) 	          end if
   657)                end if
   658) 
   659) !-----------------------------------------------------------------------
   660) !     	... HOBr + HCl(liq) =  BrCl + H2O  Sulfate Aerosol Reaction
   661) !-----------------------------------------------------------------------
   662)                if( hclvmr > small .and. hobrvmr > small ) then
   663) !-----------------------------------------------------------------------
   664) !   	... Radius sulfate set (from sad module)
   665) !           Set min radius to 0.001 microns (1e-7 cm)
   666) !           Typical radius is 0.1 microns (1e-5 cm)
   667) !           f_hobr may go negative under if not set.
   668) !-----------------------------------------------------------------------
   669)                   C_hobr          = 1477._r8*T_limitsq
   670)                   D_hobr          = 9.e-9_r8
   671) !-----------------------------------------------------------------------
   672) !     	...  Taken from Waschewsky and Abbat
   673) !            Dave Hanson (PC) suggested we divide this rc by eight to agee
   674) !            with his data (Hanson, in press, 2002).
   675) !            k1=k2*Mhcl for gamma(HOBr)
   676) !-----------------------------------------------------------------------
   677)                   k_wasch         = .125_r8 * exp( .542_r8*wt - 6440._r8*T_limiti + 10.3_r8)
   678) !-----------------------------------------------------------------------
   679) !     	... Taken from Hanson 2002.
   680) !-----------------------------------------------------------------------
   681)                   H_hobr          = exp( -9.86_r8 + 5427._r8*T_limiti )
   682)                   k_dl            = 7.5e14_r8*D_hobr*2._r8                        ! or  7.5e14*D *(2nm)
   683) !-----------------------------------------------------------------------
   684) !  	... If k_wasch is GE than the diffusion limit...
   685) !-----------------------------------------------------------------------
   686) 		  if( M_hcl > 0._r8 ) then
   687)                      if( k_wasch >= k_dl ) then
   688)                         k_hobr_hcl   = k_dl * M_hcl
   689)                      else
   690)                         k_hobr_hcl   = k_wasch * M_hcl
   691)                      end if
   692)                      term1           = 4._r8*H_hobr*.082_r8*T_limit
   693)                      term2           = sqrt( D_hobr*k_hobr_hcl )
   694)                      tmp             = rad_sulf/term2
   695)                      Gamma_hobr_rxn  = term1*term2/C_hobr
   696)                      rdl_hobr        = sqrt( D_hobr/k_hobr_hcl )
   697) 		     if( tmp < 1.e2_r8 ) then
   698)                         term1           = 1._r8/tanh( rad_sulf/rdl_hobr )
   699) 		     else
   700)                         term1           = 1._r8
   701) 		     end if
   702)                      term2           = rdl_hobr/rad_sulf
   703)                      f_hobr          = term1 - term2
   704)                      if( f_hobr > 0._r8 ) then
   705)                         term1            = 1._r8 / (f_hobr*Gamma_hobr_rxn)
   706)                         gprob_hobr_hcl   = 1._r8 / (1._r8 + term1)
   707)                      else
   708)                          gprob_hobr_hcl  = 0._r8
   709)                      end if
   710) 
   711)                      if ( hclvmr > hobrvmr ) then
   712)                         rxt(i,k,rid_het6) = max( 0._r8,wrk*av_hobr*gprob_hobr_hcl )*hcldeni
   713)                      else
   714)                         rxt(i,k,rid_het6) = max( 0._r8,wrk*av_hobr*gprob_hobr_hcl )*hobrdeni    
   715)                      end if           
   716) 
   717) 		  end if
   718)                end if
   719)             end if has_sadsulf
   720) 
   721) has_sadnat : &
   722) 	    if( sadnat > 0._r8 ) then
   723) 	       wrk = .25_r8*sadnat
   724) !-----------------------------------------------------------------------
   725) !     	... N2O5 + H2O(s) => 2HNO3  NAT Aerosol Reaction
   726) !-----------------------------------------------------------------------
   727)                if( n2o5vmr > small ) then
   728) !-----------------------------------------------------------------------
   729) !     ... gprob based on JPL06-2 for NAT.
   730) !         also see Hanson and Ravi, JPC, 97, 2802-2803, 1993.
   731) !                 gprob_tot     = 4.e-4
   732) !-----------------------------------------------------------------------
   733)                   rxt(i,k,rid_het7)  = wrk*av_n2o5*4.e-4_r8
   734) 	       end if
   735) 
   736) !-----------------------------------------------------------------------
   737) !     ClONO2 + H2O(s) => HNO3 + HOCl  NAT Aerosol Reaction
   738) !-----------------------------------------------------------------------
   739)                if( clono2vmr > small ) then
   740) !-----------------------------------------------------------------------
   741) !     ... gprob based on JPL06-2 for NAT.
   742) !         also see Hanson and Ravi, JPC, 97, 2802-2803, 1993.
   743) !                 gprob_tot    = 0.004
   744) !-----------------------------------------------------------------------
   745)                   rxt(i,k,rid_het8) = wrk*av_clono2*4.0e-3_r8
   746)    	       end if
   747) 
   748) !-----------------------------------------------------------------------
   749) !     	... ClONO2 + HCl(s) => HNO3 + Cl2, NAT Aerosol Reaction
   750) !-----------------------------------------------------------------------
   751)                if( hclvmr > small ) then
   752)                   if( clono2vmr > small ) then
   753) !-----------------------------------------------------------------------
   754) !     ... gprob based on JPL06-2 for NAT.
   755) !         also see Hanson and Ravi, JPC, 96, 2682-2691, 1992.
   756) !                 gprob_tot   = 0.2
   757) !-----------------------------------------------------------------------
   758)                      if ( hclvmr > clono2vmr ) then
   759)                         rxt(i,k,rid_het9) = wrk*av_clono2*0.2_r8*hcldeni
   760)                      else
   761)                         rxt(i,k,rid_het9) = wrk*av_clono2*0.2_r8*cntdeni  
   762)                      end if
   763)                   end if
   764) 
   765) !-----------------------------------------------------------------------
   766) !     	... HOCl + HCl(s) => H2O + Cl2  NAT Aerosol Reaction
   767) !-----------------------------------------------------------------------
   768)                   if( hoclvmr > small ) then
   769) !-----------------------------------------------------------------------
   770) !     ... gprob based on JPL06-2 for NAT.
   771) !         see Hanson and Ravi, JPC, 96, 2682-2691, 1992.
   772) !         and      Abbatt and Molina, GRL, 19, 461-464, 1992.
   773) !                 gprob_tot   = 0.1
   774) !-----------------------------------------------------------------------
   775)                      if ( hclvmr > hoclvmr ) then
   776)                         rxt(i,k,rid_het10) = wrk*av_hocl*0.1_r8*hcldeni
   777)                      else
   778)                         rxt(i,k,rid_het10) = wrk*av_hocl*0.1_r8*hocldeni
   779)                      end if
   780)                   end if
   781)                end if
   782) 
   783) !-----------------------------------------------------------------------
   784) !     	... BrONO2 + H2O(s) => HOBr + HNO3  NAT Aerosol Reaction
   785) !-----------------------------------------------------------------------
   786)                if( brono2vmr > small ) then
   787) !-----------------------------------------------------------------------
   788) !       ... Personel Communication, 11/4/99, David Hanson
   789) !                 gprob_tot   = 0.3
   790) !-----------------------------------------------------------------------
   791)                   rxt(i,k,rid_het11) = wrk*av_brono2*0.3_r8
   792)                end if
   793)             end if has_sadnat
   794) 
   795) has_sadice : &
   796) 	    if( sadice > 0._r8 ) then
   797) 	       wrk = .25_r8*sadice
   798) !-----------------------------------------------------------------------
   799) !     N2O5 + H2O(s) => 2HNO3  ICE Aerosol Reaction
   800) !-----------------------------------------------------------------------
   801)                if( n2o5vmr > small ) then
   802) !-----------------------------------------------------------------------
   803) !       ... gprob based on JPL06-2 for ICE.
   804) !           also see Hanson and Ravi, JPC, 97, 2802-2803, 1993.
   805) !                 gprob_tot    = .02
   806) !-----------------------------------------------------------------------
   807)                   rxt(i,k,rid_het12) = wrk*av_n2o5*0.02_r8
   808)  	       end if
   809) !-----------------------------------------------------------------------
   810) !     	... ClONO2 + H2O(s) => HNO3 + HOCl  ICE Aerosol Reaction
   811) !-----------------------------------------------------------------------
   812)                if( clono2vmr > small ) then
   813) !-----------------------------------------------------------------------
   814) !     	... gprob based on JPL06-2 for ICE.
   815) !     	    also see Hanson and Ravi, JGR, 96, 17307-17314, 1991.
   816) !                 gprob_tot    = .3
   817) !-----------------------------------------------------------------------
   818)                   rxt(i,k,rid_het13) = wrk*av_clono2*0.3_r8
   819) 	       end if
   820) 
   821) !-----------------------------------------------------------------------
   822) !     	... BrONO2 + H2O(s) => HNO3 + HOBr  ICE Aerosol Reaction
   823) !-----------------------------------------------------------------------
   824)                if( brono2vmr > small ) then
   825) !-----------------------------------------------------------------------
   826) !     	... gprob based on JPL06-2 for ICE.
   827) !           also see Hanson and Ravi, JPC, 97, 2802-2803, 1993.
   828) !           could be as high as 1.0
   829) !                 gprob_tot    = .3
   830) !-----------------------------------------------------------------------
   831)                   rxt(i,k,rid_het14) = wrk*av_brono2*0.3_r8
   832)       	       end if
   833) 
   834) !-----------------------------------------------------------------------
   835) !     ClONO2 + HCl(s) => HNO3 + Cl2, ICE Aerosol Reaction
   836) !-----------------------------------------------------------------------
   837)                if( hclvmr > small ) then
   838)                   if( clono2vmr > small ) then
   839) !-----------------------------------------------------------------------
   840) !       ... gprob based on JPL06-2 for ICE.
   841) !           also see Hanson and Ravi, GRL, 15, 17-20, 1988.
   842) !           also see Lue et al.,
   843) !                 gprob_tot    = .3
   844) !-----------------------------------------------------------------------
   845)                      if ( hclvmr > clono2vmr ) then
   846)                         rxt(i,k,rid_het15) = wrk*av_clono2*0.3_r8*hcldeni
   847)                      else
   848)                         rxt(i,k,rid_het15) = wrk*av_clono2*0.3_r8*cntdeni
   849)                      end if
   850) 
   851)                   end if
   852) !
   853) !-----------------------------------------------------------------------
   854) !     	... HOCl + HCl(s) => H2O + Cl2, ICE Aerosol Reaction
   855) !-----------------------------------------------------------------------
   856)                   if( hoclvmr > small .and. hclvmr > small ) then
   857) !-----------------------------------------------------------------------
   858) !       ... gprob based on JPL06-2 for ICE.
   859) !           also see Hanson and Ravi, JPC, 96, 2682-2691, 1992.
   860) !           also see Abbatt and Molina, GRL, 19, 461-464, 1992.
   861) !                 gprob_tot   = .2
   862) !-----------------------------------------------------------------------
   863)                      if ( hclvmr > hoclvmr ) then
   864)                         rxt(i,k,rid_het16) = wrk*av_hocl*0.2_r8*hcldeni
   865)                      else
   866)                         rxt(i,k,rid_het16) = wrk*av_hocl*0.2_r8*hocldeni
   867)                      end if
   868) 
   869)                   end if
   870) 
   871) !-----------------------------------------------------------------------
   872) !     HOBr + HCl(s) => H2O + BrCl, ICE Aerosol Reaction
   873) !-----------------------------------------------------------------------
   874)                   if( hobrvmr > small .and. hclvmr > small ) then
   875) !-----------------------------------------------------------------------
   876) !       ... gprob based on JPL06-2 for ICE.
   877) !           Abbatt GRL, 21, 665-668, 1994.
   878) !                    gprob_tot   = .3
   879) !-----------------------------------------------------------------------
   880)                     if ( hclvmr > hobrvmr ) then
   881)                        rxt(i,k,rid_het17) = wrk*av_hobr*0.3_r8*hcldeni
   882)                     else
   883)                        rxt(i,k,rid_het17) = wrk*av_hobr*0.3_r8*hobrdeni
   884)                     end if
   885)                   end if
   886) 	       end if
   887)             end if has_sadice
   888)          end do column_loop
   889)       end do Level_loop
   890) 
   891)       end subroutine ratecon_sfstrat
   892) 
   893)       end module mo_strato_rates

generated by
Intel(R) C++/Fortran Compiler code-coverage tool
Web-Page Owner: Nobody