LCOV - code coverage report
Current view: top level - chemistry/mozart - mo_usrrxt.F90 (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 1120 0.0 %
Date: 2025-04-28 18:57:11 Functions: 0 6 0.0 %

          Line data    Source code
       1             : module mo_usrrxt
       2             : 
       3             :   use shr_kind_mod,     only : r8 => shr_kind_r8
       4             :   use cam_logfile,      only : iulog
       5             :   use ppgrid,           only : pver, pcols
       6             :   use cam_abortutils,   only : endrun
       7             : 
       8             :   implicit none
       9             : 
      10             :   private
      11             :   public :: usrrxt, usrrxt_inti, usrrxt_hrates
      12             : 
      13             :   save
      14             : 
      15             :   integer :: usr_O_O2_ndx
      16             :   integer :: usr_HO2_HO2_ndx
      17             :   integer :: usr_N2O5_M_ndx
      18             :   integer :: usr_HNO3_OH_ndx
      19             :   integer :: usr_HO2NO2_M_ndx
      20             :   integer :: usr_N2O5_aer_ndx
      21             :   integer :: usr_NO3_aer_ndx
      22             :   integer :: usr_NO2_aer_ndx
      23             :   integer :: usr_CO_OH_ndx
      24             :   integer :: usr_CO_OH_a_ndx
      25             :   integer :: usr_CO_OH_b_ndx
      26             :   integer :: usr_PAN_M_ndx
      27             :   integer :: usr_CH3COCH3_OH_ndx
      28             :   integer :: usr_MCO3_NO2_ndx
      29             :   integer :: usr_MPAN_M_ndx
      30             :   integer :: usr_XOOH_OH_ndx
      31             :   integer :: usr_SO2_OH_ndx
      32             :   integer :: usr_DMS_OH_ndx
      33             :   integer :: usr_HO2_aer_ndx
      34             :   integer :: usr_GLYOXAL_aer_ndx
      35             :   integer :: usr_N_O2_ndx
      36             :   integer :: usr_N2D_O2_ndx
      37             :   integer :: usr_N2D_e_ndx
      38             : 
      39             :   integer :: tag_NO2_NO3_ndx
      40             :   integer :: tag_NO2_OH_ndx
      41             :   integer :: tag_NO2_HO2_ndx
      42             :   integer :: tag_C2H4_OH_ndx
      43             :   integer :: tag_C3H6_OH_ndx
      44             :   integer :: tag_CH3CO3_NO2_ndx
      45             : 
      46             : !lke-TS1
      47             :   integer :: usr_PBZNIT_M_ndx
      48             :   integer :: tag_ACBZO2_NO2_ndx
      49             :   integer :: usr_ISOPNITA_aer_ndx
      50             :   integer :: usr_ISOPNITB_aer_ndx
      51             :   integer :: usr_ONITR_aer_ndx
      52             :   integer :: usr_HONITR_aer_ndx
      53             :   integer :: usr_TERPNIT_aer_ndx
      54             :   integer :: usr_NTERPOOH_aer_ndx
      55             :   integer :: usr_NC4CHO_aer_ndx
      56             :   integer :: usr_NC4CH2OH_aer_ndx
      57             : !TS2
      58             :  integer :: usr_ISOPZD1O2_ndx
      59             :  integer :: usr_ISOPZD4O2_ndx
      60             :  integer :: usr_ISOPFDN_aer_ndx
      61             :  integer :: usr_ISOPFNP_aer_ndx
      62             :  integer :: usr_ISOPN2B_aer_ndx
      63             :  integer :: usr_ISOPN1D_aer_ndx
      64             :  integer :: usr_ISOPN4D_aer_ndx
      65             :  integer :: usr_INOOHD_aer_ndx
      66             :  integer :: usr_INHEB_aer_ndx
      67             :  integer :: usr_INHED_aer_ndx
      68             :  integer :: usr_MACRN_aer_ndx
      69             :  integer :: usr_ISOPHFP_aer_ndx
      70             :  integer :: usr_IEPOX_aer_ndx
      71             :  integer :: usr_DHPMPAL_aer_ndx
      72             :  integer :: usr_ICHE_aer_ndx
      73             :  integer :: usr_ISOPFNC_aer_ndx
      74             :  integer :: usr_ISOPFDNC_aer_ndx
      75             :  integer :: usr_ISOPB1O2_NOn_ndx
      76             :  integer :: usr_ISOPB1O2_NOa_ndx
      77             :  integer :: usr_ISOPB4O2_NOn_ndx
      78             :  integer :: usr_ISOPB4O2_NOa_ndx
      79             :  integer :: usr_ISOPED1O2_NOn_ndx
      80             :  integer :: usr_ISOPED1O2_NOa_ndx
      81             :  integer :: usr_ISOPED4O2_NOn_ndx
      82             :  integer :: usr_ISOPED4O2_NOa_ndx
      83             :  integer :: usr_ISOPZD1O2_NOn_ndx
      84             :  integer :: usr_ISOPZD1O2_NOa_ndx
      85             :  integer :: usr_ISOPZD4O2_NOn_ndx
      86             :  integer :: usr_ISOPZD4O2_NOa_ndx
      87             :  integer :: usr_ISOPNO3_NOn_ndx
      88             :  integer :: usr_ISOPNO3_NOa_ndx
      89             :  integer :: usr_MVKO2_NOn_ndx
      90             :  integer :: usr_MVKO2_NOa_ndx
      91             :  integer :: usr_MACRO2_NOn_ndx
      92             :  integer :: usr_MACRO2_NOa_ndx
      93             :  integer :: usr_IEPOXOO_NOn_ndx
      94             :  integer :: usr_IEPOXOO_NOa_ndx
      95             :  integer :: usr_ISOPN1DO2_NOn_ndx
      96             :  integer :: usr_ISOPN1DO2_NOa_ndx
      97             :  integer :: usr_ISOPN2BO2_NOn_ndx
      98             :  integer :: usr_ISOPN2BO2_NOa_ndx
      99             :  integer :: usr_ISOPN3BO2_NOn_ndx
     100             :  integer :: usr_ISOPN3BO2_NOa_ndx
     101             :  integer :: usr_ISOPN4DO2_NOn_ndx
     102             :  integer :: usr_ISOPN4DO2_NOa_ndx
     103             :  integer :: usr_ISOPNBNO3O2_NOn_ndx
     104             :  integer :: usr_ISOPNBNO3O2_NOa_ndx
     105             :  integer :: usr_ISOPNOOHBO2_NOn_ndx
     106             :  integer :: usr_ISOPNOOHBO2_NOa_ndx
     107             :  integer :: usr_ISOPNOOHDO2_NOn_ndx
     108             :  integer :: usr_ISOPNOOHDO2_NOa_ndx
     109             :  integer :: usr_NC4CHOO2_NOn_ndx
     110             :  integer :: usr_NC4CHOO2_NOa_ndx
     111             :  integer :: tag_MCO3_NO2_ndx
     112             :  integer :: tag_TERPACO3_NO2_ndx
     113             :  integer :: usr_TERPAPAN_M_ndx
     114             :  integer :: tag_TERPA2CO3_NO2_ndx
     115             :  integer :: usr_TERPA2PAN_M_ndx
     116             :  integer :: tag_TERPA3CO3_NO2_ndx
     117             :  integer :: usr_TERPA3PAN_M_ndx
     118             :  integer :: usr_TERPNT_aer_ndx
     119             :  integer :: usr_TERPNT1_aer_ndx
     120             :  integer :: usr_TERPNPT_aer_ndx
     121             :  integer :: usr_TERPNPT1_aer_ndx
     122             :  integer :: usr_TERPFDN_aer_ndx
     123             :  integer :: usr_SQTN_aer_ndx
     124             :  integer :: usr_TERPHFN_aer_ndx
     125             :  integer :: usr_TERPDHDP_aer_ndx
     126             :  integer :: usr_TERPACID_aer_ndx
     127             : !
     128             :   integer :: usr_OA_O2_NDX
     129             :   integer :: usr_XNO2NO3_M_ndx
     130             :   integer :: usr_NO2XNO3_M_ndx
     131             :   integer :: usr_XHNO3_OH_ndx
     132             :   integer :: usr_XHO2NO2_M_ndx
     133             :   integer :: usr_XNO2NO3_aer_ndx
     134             :   integer :: usr_NO2XNO3_aer_ndx
     135             :   integer :: usr_XNO3_aer_ndx
     136             :   integer :: usr_XNO2_aer_ndx
     137             :   integer :: usr_XPAN_M_ndx
     138             :   integer :: usr_XMPAN_M_ndx
     139             :   integer :: usr_MCO3_XNO2_ndx
     140             : 
     141             :   integer :: usr_C2O3_NO2_ndx
     142             :   integer :: usr_C2H4_OH_ndx
     143             :   integer :: usr_XO2N_HO2_ndx
     144             :   integer :: usr_C2O3_XNO2_ndx
     145             : 
     146             :   integer :: tag_XO2N_NO_ndx
     147             :   integer :: tag_XO2_HO2_ndx
     148             :   integer :: tag_XO2_NO_ndx
     149             : 
     150             :   integer :: usr_O_O_ndx
     151             :   integer :: usr_CL2O2_M_ndx
     152             :   integer :: usr_SO3_H2O_ndx
     153             :   integer :: tag_CLO_CLO_M_ndx
     154             : 
     155             :   integer :: ion1_ndx, ion2_ndx, ion3_ndx, ion11_ndx
     156             :   integer :: elec1_ndx, elec2_ndx, elec3_ndx
     157             :   integer :: elec4_ndx, elec5_ndx, elec6_ndx
     158             :   integer :: het1_ndx
     159             : 
     160             :   integer, parameter :: nean = 3
     161             :   integer :: ean_ndx(nean)
     162             :   integer, parameter :: nrpe = 5
     163             :   integer :: rpe_ndx(nrpe)
     164             :   integer, parameter :: npir = 16
     165             :   integer :: pir_ndx(npir)
     166             :   integer, parameter :: nedn = 2
     167             :   integer :: edn_ndx(nedn)
     168             :   integer, parameter :: nnir = 13
     169             :   integer :: nir_ndx(nnir)
     170             :   integer, parameter :: niira = 112
     171             :   integer :: iira_ndx(niira)
     172             :   integer, parameter :: niirb = 14
     173             :   integer :: iirb_ndx(niirb)
     174             : 
     175             :   integer :: usr_clm_h2o_m_ndx, usr_clm_hcl_m_ndx
     176             :   integer :: usr_oh_co_ndx, het_no2_h2o_ndx, usr_oh_dms_ndx, aq_so2_h2o2_ndx, aq_so2_o3_ndx
     177             : 
     178             :   integer :: h2o_ndx
     179             : !
     180             : ! jfl
     181             : !
     182             :   integer, parameter :: num_strat_tau = 22
     183             :   integer :: usr_strat_tau_ndx(num_strat_tau)
     184             : !
     185             : !lke++
     186             :   integer :: usr_COhc_OH_ndx
     187             :   integer :: usr_COme_OH_ndx
     188             :   integer :: usr_CO01_OH_ndx
     189             :   integer :: usr_CO02_OH_ndx
     190             :   integer :: usr_CO03_OH_ndx
     191             :   integer :: usr_CO04_OH_ndx
     192             :   integer :: usr_CO05_OH_ndx
     193             :   integer :: usr_CO06_OH_ndx
     194             :   integer :: usr_CO07_OH_ndx
     195             :   integer :: usr_CO08_OH_ndx
     196             :   integer :: usr_CO09_OH_ndx
     197             :   integer :: usr_CO10_OH_ndx
     198             :   integer :: usr_CO11_OH_ndx
     199             :   integer :: usr_CO12_OH_ndx
     200             :   integer :: usr_CO13_OH_ndx
     201             :   integer :: usr_CO14_OH_ndx
     202             :   integer :: usr_CO15_OH_ndx
     203             :   integer :: usr_CO16_OH_ndx
     204             :   integer :: usr_CO17_OH_ndx
     205             :   integer :: usr_CO18_OH_ndx
     206             :   integer :: usr_CO19_OH_ndx
     207             :   integer :: usr_CO20_OH_ndx
     208             :   integer :: usr_CO21_OH_ndx
     209             :   integer :: usr_CO22_OH_ndx
     210             :   integer :: usr_CO23_OH_ndx
     211             :   integer :: usr_CO24_OH_ndx
     212             :   integer :: usr_CO25_OH_ndx
     213             :   integer :: usr_CO26_OH_ndx
     214             :   integer :: usr_CO27_OH_ndx
     215             :   integer :: usr_CO28_OH_ndx
     216             :   integer :: usr_CO29_OH_ndx
     217             :   integer :: usr_CO30_OH_ndx
     218             :   integer :: usr_CO31_OH_ndx
     219             :   integer :: usr_CO32_OH_ndx
     220             :   integer :: usr_CO33_OH_ndx
     221             :   integer :: usr_CO34_OH_ndx
     222             :   integer :: usr_CO35_OH_ndx
     223             :   integer :: usr_CO36_OH_ndx
     224             :   integer :: usr_CO37_OH_ndx
     225             :   integer :: usr_CO38_OH_ndx
     226             :   integer :: usr_CO39_OH_ndx
     227             :   integer :: usr_CO40_OH_ndx
     228             :   integer :: usr_CO41_OH_ndx
     229             :   integer :: usr_CO42_OH_ndx
     230             : !lke--
     231             : 
     232             :   real(r8), parameter :: t0     = 300._r8                ! K
     233             :   real(r8), parameter :: trlim2 = 17._r8/3._r8           ! K
     234             :   real(r8), parameter :: trlim3 = 15._r8/3._r8           ! K
     235             : 
     236             :   logical :: has_ion_rxts, has_d_chem
     237             : 
     238             : contains
     239             : 
     240           0 :   subroutine usrrxt_inti
     241             :     !-----------------------------------------------------------------
     242             :     !        ... intialize the user reaction constants module
     243             :     !-----------------------------------------------------------------
     244             : 
     245             :     use mo_chem_utls,   only : get_rxt_ndx, get_spc_ndx
     246             :     use spmd_utils,     only : masterproc
     247             : 
     248             :     implicit none
     249             : 
     250             :     character(len=4) :: xchar
     251             :     character(len=32) :: rxtname
     252             :     integer :: i
     253             : 
     254             : !
     255             : ! full tropospheric chemistry
     256             : !
     257           0 :     usr_O_O2_ndx         = get_rxt_ndx( 'usr_O_O2' )
     258           0 :     usr_HO2_HO2_ndx      = get_rxt_ndx( 'usr_HO2_HO2' )
     259           0 :     usr_N2O5_M_ndx       = get_rxt_ndx( 'usr_N2O5_M' )
     260           0 :     usr_HNO3_OH_ndx      = get_rxt_ndx( 'usr_HNO3_OH' )
     261           0 :     usr_HO2NO2_M_ndx     = get_rxt_ndx( 'usr_HO2NO2_M' )
     262           0 :     usr_N2O5_aer_ndx     = get_rxt_ndx( 'usr_N2O5_aer' )
     263           0 :     usr_NO3_aer_ndx      = get_rxt_ndx( 'usr_NO3_aer' )
     264           0 :     usr_NO2_aer_ndx      = get_rxt_ndx( 'usr_NO2_aer' )
     265           0 :     usr_CO_OH_ndx        = get_rxt_ndx( 'usr_CO_OH' )
     266           0 :     usr_CO_OH_a_ndx      = get_rxt_ndx( 'usr_CO_OH_a' )
     267           0 :     usr_CO_OH_b_ndx      = get_rxt_ndx( 'usr_CO_OH_b' )
     268           0 :     usr_PAN_M_ndx        = get_rxt_ndx( 'usr_PAN_M' )
     269           0 :     usr_CH3COCH3_OH_ndx  = get_rxt_ndx( 'usr_CH3COCH3_OH' )
     270           0 :     usr_MCO3_NO2_ndx     = get_rxt_ndx( 'usr_MCO3_NO2' )
     271           0 :     tag_MCO3_NO2_ndx     = get_rxt_ndx( 'tag_MCO3_NO2' )
     272           0 :     if( tag_MCO3_NO2_ndx<0 .and. usr_MCO3_NO2_ndx>0 ) then
     273           0 :        tag_MCO3_NO2_ndx = usr_MCO3_NO2_ndx
     274             :     endif
     275             : 
     276           0 :     usr_MPAN_M_ndx       = get_rxt_ndx( 'usr_MPAN_M' )
     277           0 :     usr_XOOH_OH_ndx      = get_rxt_ndx( 'usr_XOOH_OH' )
     278           0 :     usr_SO2_OH_ndx       = get_rxt_ndx( 'usr_SO2_OH' )
     279           0 :     usr_N_O2_ndx         = get_rxt_ndx( 'usr_N_O2' )
     280           0 :     usr_N2D_O2_ndx       = get_rxt_ndx( 'usr_N2D_O2' )
     281           0 :     usr_N2D_e_ndx        = get_rxt_ndx( 'usr_N2D_e' )
     282           0 :     usr_DMS_OH_ndx       = get_rxt_ndx( 'usr_DMS_OH' )
     283           0 :     usr_HO2_aer_ndx      = get_rxt_ndx( 'usr_HO2_aer' )
     284           0 :     usr_GLYOXAL_aer_ndx  = get_rxt_ndx( 'usr_GLYOXAL_aer' )
     285             :  !
     286           0 :     tag_NO2_NO3_ndx      = get_rxt_ndx( 'tag_NO2_NO3' )
     287           0 :     tag_NO2_OH_ndx       = get_rxt_ndx( 'tag_NO2_OH' )
     288           0 :     tag_NO2_HO2_ndx      = get_rxt_ndx( 'tag_NO2_HO2' )
     289           0 :     tag_C2H4_OH_ndx      = get_rxt_ndx( 'tag_C2H4_OH' )
     290           0 :     tag_C3H6_OH_ndx      = get_rxt_ndx( 'tag_C3H6_OH' )
     291           0 :     tag_CH3CO3_NO2_ndx   = get_rxt_ndx( 'tag_CH3CO3_NO2' )
     292             : !lke-TS1
     293           0 :     usr_PBZNIT_M_ndx     = get_rxt_ndx( 'usr_PBZNIT_M' )
     294           0 :     tag_ACBZO2_NO2_ndx   = get_rxt_ndx( 'tag_ACBZO2_NO2' )
     295           0 :     usr_ISOPNITA_aer_ndx = get_rxt_ndx( 'usr_ISOPNITA_aer' )
     296           0 :     usr_ISOPNITB_aer_ndx = get_rxt_ndx( 'usr_ISOPNITB_aer' )
     297           0 :     usr_ONITR_aer_ndx    = get_rxt_ndx( 'usr_ONITR_aer' )
     298           0 :     usr_HONITR_aer_ndx   = get_rxt_ndx( 'usr_HONITR_aer' )
     299           0 :     usr_TERPNIT_aer_ndx  = get_rxt_ndx( 'usr_TERPNIT_aer' )
     300           0 :     usr_NTERPOOH_aer_ndx = get_rxt_ndx( 'usr_NTERPOOH_aer' )
     301           0 :     usr_NC4CHO_aer_ndx   = get_rxt_ndx( 'usr_NC4CHO_aer' )
     302           0 :     usr_NC4CH2OH_aer_ndx = get_rxt_ndx( 'usr_NC4CH2OH_aer' )
     303             : !TS2
     304           0 :     usr_ISOPZD1O2_ndx        = get_rxt_ndx( 'usr_ISOPZD1O2' )
     305           0 :     usr_ISOPZD4O2_ndx        = get_rxt_ndx( 'usr_ISOPZD4O2' )
     306           0 :     usr_ISOPFDN_aer_ndx      = get_rxt_ndx( 'usr_ISOPFDN_aer' )
     307           0 :     usr_ISOPFNP_aer_ndx      = get_rxt_ndx( 'usr_ISOPFNP_aer' )
     308           0 :     usr_ISOPN2B_aer_ndx      = get_rxt_ndx( 'usr_ISOPN2B_aer' )
     309           0 :     usr_ISOPN1D_aer_ndx      = get_rxt_ndx( 'usr_ISOPN1D_aer' )
     310           0 :     usr_ISOPN4D_aer_ndx      = get_rxt_ndx( 'usr_ISOPN4D_aer' )
     311           0 :     usr_INOOHD_aer_ndx       = get_rxt_ndx( 'usr_INOOHD_aer' )
     312           0 :     usr_INHEB_aer_ndx        = get_rxt_ndx( 'usr_INHEB_aer' )
     313           0 :     usr_INHED_aer_ndx        = get_rxt_ndx( 'usr_INHED_aer' )
     314           0 :     usr_MACRN_aer_ndx        = get_rxt_ndx( 'usr_MACRN_aer' )
     315           0 :     usr_ISOPHFP_aer_ndx      = get_rxt_ndx( 'usr_ISOPHFP_aer' )
     316           0 :     usr_IEPOX_aer_ndx        = get_rxt_ndx( 'usr_IEPOX_aer' )
     317           0 :     usr_DHPMPAL_aer_ndx      = get_rxt_ndx( 'usr_DHPMPAL_aer' )
     318           0 :     usr_ICHE_aer_ndx         = get_rxt_ndx( 'usr_ICHE_aer' )
     319           0 :     usr_ISOPFNC_aer_ndx      = get_rxt_ndx( 'usr_ISOPFNC_aer' )
     320           0 :     usr_ISOPFDNC_aer_ndx     = get_rxt_ndx( 'usr_ISOPFDNC_aer' )
     321           0 :     usr_ISOPB1O2_NOn_ndx     = get_rxt_ndx( 'usr_ISOPB1O2_NOn' )
     322           0 :     usr_ISOPB1O2_NOa_ndx     = get_rxt_ndx( 'usr_ISOPB1O2_NOa' )
     323           0 :     usr_ISOPB4O2_NOn_ndx     = get_rxt_ndx( 'usr_ISOPB4O2_NOn' )
     324           0 :     usr_ISOPB4O2_NOa_ndx     = get_rxt_ndx( 'usr_ISOPB4O2_NOa' )
     325           0 :     usr_ISOPED1O2_NOn_ndx    = get_rxt_ndx( 'usr_ISOPED1O2_NOn' )
     326           0 :     usr_ISOPED1O2_NOa_ndx    = get_rxt_ndx( 'usr_ISOPED1O2_NOa' )
     327           0 :     usr_ISOPED4O2_NOn_ndx    = get_rxt_ndx( 'usr_ISOPED4O2_NOn' )
     328           0 :     usr_ISOPED4O2_NOa_ndx    = get_rxt_ndx( 'usr_ISOPED4O2_NOa' )
     329           0 :     usr_ISOPZD1O2_NOn_ndx    = get_rxt_ndx( 'usr_ISOPZD1O2_NOn' )
     330           0 :     usr_ISOPZD1O2_NOa_ndx    = get_rxt_ndx( 'usr_ISOPZD1O2_NOa' )
     331           0 :     usr_ISOPZD4O2_NOn_ndx    = get_rxt_ndx( 'usr_ISOPZD4O2_NOn' )
     332           0 :     usr_ISOPZD4O2_NOa_ndx    = get_rxt_ndx( 'usr_ISOPZD4O2_NOa' )
     333           0 :     usr_ISOPNO3_NOn_ndx      = get_rxt_ndx( 'usr_ISOPNO3_NOn' )
     334           0 :     usr_ISOPNO3_NOa_ndx      = get_rxt_ndx( 'usr_ISOPNO3_NOa' )
     335           0 :     usr_MVKO2_NOn_ndx        = get_rxt_ndx( 'usr_MVKO2_NOn' )
     336           0 :     usr_MVKO2_NOa_ndx        = get_rxt_ndx( 'usr_MVKO2_NOa' )
     337           0 :     usr_MACRO2_NOn_ndx       = get_rxt_ndx( 'usr_MACRO2_NOn' )
     338           0 :     usr_MACRO2_NOa_ndx       = get_rxt_ndx( 'usr_MACRO2_NOa' )
     339           0 :     usr_IEPOXOO_NOn_ndx     = get_rxt_ndx( 'usr_IEPOXOO_NOn' )
     340           0 :     usr_IEPOXOO_NOa_ndx     = get_rxt_ndx( 'usr_IEPOXOO_NOa' )
     341           0 :     usr_ISOPN1DO2_NOn_ndx     = get_rxt_ndx( 'usr_ISOPN1DO2_NOn' )
     342           0 :     usr_ISOPN1DO2_NOa_ndx     = get_rxt_ndx( 'usr_ISOPN1DO2_NOa' )
     343           0 :     usr_ISOPN2BO2_NOn_ndx     = get_rxt_ndx( 'usr_ISOPN2BO2_NOn' )
     344           0 :     usr_ISOPN2BO2_NOa_ndx     = get_rxt_ndx( 'usr_ISOPN2BO2_NOa' )
     345           0 :     usr_ISOPN3BO2_NOn_ndx     = get_rxt_ndx( 'usr_ISOPN3BO2_NOn' )
     346           0 :     usr_ISOPN3BO2_NOa_ndx     = get_rxt_ndx( 'usr_ISOPN3BO2_NOa' )
     347           0 :     usr_ISOPN4DO2_NOn_ndx     = get_rxt_ndx( 'usr_ISOPN4DO2_NOn' )
     348           0 :     usr_ISOPN4DO2_NOa_ndx     = get_rxt_ndx( 'usr_ISOPN4DO2_NOa' )
     349           0 :     usr_ISOPNBNO3O2_NOn_ndx     = get_rxt_ndx( 'usr_ISOPNBNO3O2_NOn' )
     350           0 :     usr_ISOPNBNO3O2_NOa_ndx     = get_rxt_ndx( 'usr_ISOPNBNO3O2_NOa' )
     351           0 :     usr_ISOPNOOHBO2_NOn_ndx     = get_rxt_ndx( 'usr_ISOPNOOHBO2_NOn' )
     352           0 :     usr_ISOPNOOHBO2_NOa_ndx     = get_rxt_ndx( 'usr_ISOPNOOHBO2_NOa' )
     353           0 :     usr_ISOPNOOHDO2_NOn_ndx     = get_rxt_ndx( 'usr_ISOPNOOHDO2_NOn' )
     354           0 :     usr_ISOPNOOHDO2_NOa_ndx     = get_rxt_ndx( 'usr_ISOPNOOHDO2_NOa' )
     355           0 :     usr_NC4CHOO2_NOn_ndx     = get_rxt_ndx( 'usr_NC4CHOO2_NOn' )
     356           0 :     usr_NC4CHOO2_NOa_ndx     = get_rxt_ndx( 'usr_NC4CHOO2_NOa' )
     357           0 :     tag_TERPACO3_NO2_ndx  = get_rxt_ndx( 'tag_TERPACO3_NO2' )
     358           0 :     usr_TERPAPAN_M_ndx     = get_rxt_ndx( 'usr_TERPAPAN_M' )
     359           0 :     tag_TERPA2CO3_NO2_ndx  = get_rxt_ndx( 'tag_TERPA2CO3_NO2' )
     360           0 :     usr_TERPA2PAN_M_ndx     = get_rxt_ndx( 'usr_TERPA2PAN_M' )
     361           0 :     tag_TERPA3CO3_NO2_ndx  = get_rxt_ndx( 'tag_TERPA3CO3_NO2' )
     362           0 :     usr_TERPA3PAN_M_ndx     = get_rxt_ndx( 'usr_TERPA3PAN_M' )
     363           0 :     usr_TERPNT_aer_ndx       = get_rxt_ndx( 'usr_TERPNT_aer' )
     364           0 :     usr_TERPNT1_aer_ndx      = get_rxt_ndx( 'usr_TERPNT1_aer' )
     365           0 :     usr_TERPNPT_aer_ndx      = get_rxt_ndx( 'usr_TERPNPT_aer' )
     366           0 :     usr_TERPNPT1_aer_ndx     = get_rxt_ndx( 'usr_TERPNPT1_aer' )
     367           0 :     usr_TERPFDN_aer_ndx        = get_rxt_ndx( 'usr_TERPFDN_aer' )
     368           0 :     usr_SQTN_aer_ndx        = get_rxt_ndx( 'usr_SQTN_aer' )
     369           0 :     usr_TERPHFN_aer_ndx        = get_rxt_ndx( 'usr_TERPHFN_aer' )
     370           0 :     usr_TERPDHDP_aer_ndx        = get_rxt_ndx( 'usr_TERPDHDP_aer' )
     371           0 :     usr_TERPACID_aer_ndx        = get_rxt_ndx( 'usr_TERPACID_aer' )
     372             :  !
     373             :  ! additional reactions for O3A/XNO
     374             :  !
     375           0 :     usr_OA_O2_ndx        = get_rxt_ndx( 'usr_OA_O2' )
     376           0 :     usr_XNO2NO3_M_ndx    = get_rxt_ndx( 'usr_XNO2NO3_M' )
     377           0 :     usr_NO2XNO3_M_ndx    = get_rxt_ndx( 'usr_NO2XNO3_M' )
     378           0 :     usr_XNO2NO3_aer_ndx  = get_rxt_ndx( 'usr_XNO2NO3_aer' )
     379           0 :     usr_NO2XNO3_aer_ndx  = get_rxt_ndx( 'usr_NO2XNO3_aer' )
     380           0 :     usr_XHNO3_OH_ndx     = get_rxt_ndx( 'usr_XHNO3_OH' )
     381           0 :     usr_XNO3_aer_ndx     = get_rxt_ndx( 'usr_XNO3_aer' )
     382           0 :     usr_XNO2_aer_ndx     = get_rxt_ndx( 'usr_XNO2_aer' )
     383           0 :     usr_MCO3_XNO2_ndx    = get_rxt_ndx( 'usr_MCO3_XNO2' )
     384           0 :     usr_XPAN_M_ndx       = get_rxt_ndx( 'usr_XPAN_M' )
     385           0 :     usr_XMPAN_M_ndx      = get_rxt_ndx( 'usr_XMPAN_M' )
     386           0 :     usr_XHO2NO2_M_ndx    = get_rxt_ndx( 'usr_XHO2NO2_M' )
     387             : !
     388             : ! reduced hydrocarbon chemistry
     389             : !
     390           0 :     usr_C2O3_NO2_ndx     = get_rxt_ndx( 'usr_C2O3_NO2' )
     391           0 :     usr_C2H4_OH_ndx      = get_rxt_ndx( 'usr_C2H4_OH' )
     392           0 :     usr_XO2N_HO2_ndx     = get_rxt_ndx( 'usr_XO2N_HO2' )
     393           0 :     usr_C2O3_XNO2_ndx    = get_rxt_ndx( 'usr_C2O3_XNO2' )
     394             : !
     395           0 :     tag_XO2N_NO_ndx      = get_rxt_ndx( 'tag_XO2N_NO' )
     396           0 :     tag_XO2_HO2_ndx      = get_rxt_ndx( 'tag_XO2_HO2' )
     397           0 :     tag_XO2_NO_ndx       = get_rxt_ndx( 'tag_XO2_NO' )
     398             : !
     399             : ! stratospheric chemistry
     400             : !
     401           0 :     usr_O_O_ndx          = get_rxt_ndx( 'usr_O_O' )
     402           0 :     usr_CL2O2_M_ndx      = get_rxt_ndx( 'usr_CL2O2_M' )
     403           0 :     usr_SO3_H2O_ndx      = get_rxt_ndx( 'usr_SO3_H2O' )
     404             : !
     405           0 :     tag_CLO_CLO_M_ndx      = get_rxt_ndx( 'tag_CLO_CLO_M' )
     406           0 :     if (tag_CLO_CLO_M_ndx<0) then ! for backwards compatibility
     407           0 :        tag_CLO_CLO_M_ndx   = get_rxt_ndx( 'tag_CLO_CLO' )
     408             :     endif
     409             : !
     410             : ! reactions to remove BAM aerosols in the stratosphere
     411             : !
     412           0 :     usr_strat_tau_ndx( 1) = get_rxt_ndx( 'usr_CB1_strat_tau' )
     413           0 :     usr_strat_tau_ndx( 2) = get_rxt_ndx( 'usr_CB2_strat_tau' )
     414           0 :     usr_strat_tau_ndx( 3) = get_rxt_ndx( 'usr_OC1_strat_tau' )
     415           0 :     usr_strat_tau_ndx( 4) = get_rxt_ndx( 'usr_OC2_strat_tau' )
     416           0 :     usr_strat_tau_ndx( 5) = get_rxt_ndx( 'usr_SO4_strat_tau' )
     417           0 :     usr_strat_tau_ndx( 6) = get_rxt_ndx( 'usr_SOA_strat_tau' )
     418           0 :     usr_strat_tau_ndx( 7) = get_rxt_ndx( 'usr_NH4_strat_tau' )
     419           0 :     usr_strat_tau_ndx( 8) = get_rxt_ndx( 'usr_NH4NO3_strat_tau' )
     420           0 :     usr_strat_tau_ndx( 9) = get_rxt_ndx( 'usr_SSLT01_strat_tau' )
     421           0 :     usr_strat_tau_ndx(10) = get_rxt_ndx( 'usr_SSLT02_strat_tau' )
     422           0 :     usr_strat_tau_ndx(11) = get_rxt_ndx( 'usr_SSLT03_strat_tau' )
     423           0 :     usr_strat_tau_ndx(12) = get_rxt_ndx( 'usr_SSLT04_strat_tau' )
     424           0 :     usr_strat_tau_ndx(13) = get_rxt_ndx( 'usr_DST01_strat_tau' )
     425           0 :     usr_strat_tau_ndx(14) = get_rxt_ndx( 'usr_DST02_strat_tau' )
     426           0 :     usr_strat_tau_ndx(15) = get_rxt_ndx( 'usr_DST03_strat_tau' )
     427           0 :     usr_strat_tau_ndx(16) = get_rxt_ndx( 'usr_DST04_strat_tau' )
     428           0 :     usr_strat_tau_ndx(17) = get_rxt_ndx( 'usr_SO2t_strat_tau' )
     429           0 :     usr_strat_tau_ndx(18) = get_rxt_ndx( 'usr_SOAI_strat_tau' )
     430           0 :     usr_strat_tau_ndx(19) = get_rxt_ndx( 'usr_SOAM_strat_tau' )
     431           0 :     usr_strat_tau_ndx(20) = get_rxt_ndx( 'usr_SOAB_strat_tau' )
     432           0 :     usr_strat_tau_ndx(21) = get_rxt_ndx( 'usr_SOAT_strat_tau' )
     433           0 :     usr_strat_tau_ndx(22) = get_rxt_ndx( 'usr_SOAX_strat_tau' )
     434             : !
     435             : ! stratospheric aerosol chemistry
     436             : !
     437           0 :     het1_ndx             = get_rxt_ndx( 'het1' )
     438             : !
     439             : ! ion chemistry
     440             : !
     441           0 :     ion1_ndx  = get_rxt_ndx( 'ion_Op_O2' )
     442           0 :     ion2_ndx  = get_rxt_ndx( 'ion_Op_N2' )
     443           0 :     ion3_ndx  = get_rxt_ndx( 'ion_N2p_Oa' )
     444           0 :     ion11_ndx = get_rxt_ndx( 'ion_N2p_Ob' )
     445             : 
     446           0 :     elec1_ndx  = get_rxt_ndx( 'elec1' )
     447           0 :     elec2_ndx  = get_rxt_ndx( 'elec2' )
     448           0 :     elec3_ndx  = get_rxt_ndx( 'elec3' )
     449             : 
     450           0 :     do i = 1,nean
     451           0 :       write (xchar,'(i4)') i
     452           0 :       rxtname = 'ean'//trim(adjustl(xchar))
     453           0 :       ean_ndx(i) = get_rxt_ndx(trim(rxtname))
     454             :     enddo
     455             : 
     456           0 :     do i = 1,nrpe
     457           0 :       write (xchar,'(i4)') i
     458           0 :       rxtname = 'rpe'//trim(adjustl(xchar))
     459           0 :       rpe_ndx(i) = get_rxt_ndx(trim(rxtname))
     460             :     enddo
     461             : 
     462           0 :     do i = 1,npir
     463           0 :       write (xchar,'(i4)') i
     464           0 :       rxtname = 'pir'//trim(adjustl(xchar))
     465           0 :       pir_ndx(i) = get_rxt_ndx(trim(rxtname))
     466             :     enddo
     467             : 
     468           0 :     do i = 1,nedn
     469           0 :       write (xchar,'(i4)') i
     470           0 :       rxtname = 'edn'//trim(adjustl(xchar))
     471           0 :       edn_ndx(i) = get_rxt_ndx(trim(rxtname))
     472             :     enddo
     473             : 
     474           0 :     do i = 1,nnir
     475           0 :       write (xchar,'(i4)') i
     476           0 :       rxtname = 'nir'//trim(adjustl(xchar))
     477           0 :       nir_ndx(i) = get_rxt_ndx(trim(rxtname))
     478             :     enddo
     479             : 
     480           0 :     do i = 1,niira
     481           0 :       write (xchar,'(i4)') i
     482           0 :       rxtname = 'iira'//trim(adjustl(xchar))
     483           0 :       iira_ndx(i) = get_rxt_ndx(trim(rxtname))
     484             :     enddo
     485             : 
     486           0 :     do i = 1,niirb
     487           0 :       write (xchar,'(i4)') i
     488           0 :       rxtname = 'iirb'//trim(adjustl(xchar))
     489           0 :       iirb_ndx(i) = get_rxt_ndx(trim(rxtname))
     490             :     enddo
     491             : 
     492           0 :     usr_clm_h2o_m_ndx = get_rxt_ndx( 'usr_CLm_H2O_M' )
     493           0 :     usr_clm_hcl_m_ndx = get_rxt_ndx( 'usr_CLm_HCL_M' )
     494             : 
     495           0 :     elec4_ndx  = get_rxt_ndx( 'Op2P_ea' )
     496           0 :     elec5_ndx  = get_rxt_ndx( 'Op2P_eb' )
     497           0 :     elec6_ndx  = get_rxt_ndx( 'Op2D_e' )
     498             : 
     499             :     has_ion_rxts = ion1_ndx>0 .and. ion2_ndx>0 .and. ion3_ndx>0 .and. elec1_ndx>0 &
     500           0 :                  .and. elec2_ndx>0 .and. elec3_ndx>0
     501             : 
     502             :     has_d_chem = &
     503             :          all(ean_ndx>0) .and. &
     504             :          all(rpe_ndx>0) .and. &
     505             :          all(pir_ndx>0) .and. &
     506             :          all(edn_ndx>0) .and. &
     507             :          all(nir_ndx>0) .and. &
     508             :          all(iira_ndx>0) .and. &
     509             :          all(iirb_ndx>0) .and. &
     510           0 :          usr_clm_h2o_m_ndx>0 .and. usr_clm_hcl_m_ndx>0
     511             : 
     512           0 :     h2o_ndx    = get_spc_ndx( 'H2O' )
     513             : 
     514             :     !
     515             :     ! llnl super fast
     516             :     !
     517           0 :     usr_oh_co_ndx  = get_rxt_ndx( 'usr_oh_co' )
     518           0 :     het_no2_h2o_ndx  = get_rxt_ndx( 'het_no2_h2o' )
     519           0 :     usr_oh_dms_ndx  = get_rxt_ndx( 'usr_oh_dms' )
     520           0 :     aq_so2_h2o2_ndx  = get_rxt_ndx( 'aq_so2_h2o2' )
     521           0 :     aq_so2_o3_ndx  = get_rxt_ndx( 'aq_so2_o3' )
     522             : 
     523             : !lke++
     524             : ! CO tags
     525             : !
     526           0 :     usr_COhc_OH_ndx      = get_rxt_ndx( 'usr_COhc_OH' )
     527           0 :     usr_COme_OH_ndx      = get_rxt_ndx( 'usr_COme_OH' )
     528           0 :     usr_CO01_OH_ndx      = get_rxt_ndx( 'usr_CO01_OH' )
     529           0 :     usr_CO02_OH_ndx      = get_rxt_ndx( 'usr_CO02_OH' )
     530           0 :     usr_CO03_OH_ndx      = get_rxt_ndx( 'usr_CO03_OH' )
     531           0 :     usr_CO04_OH_ndx      = get_rxt_ndx( 'usr_CO04_OH' )
     532           0 :     usr_CO05_OH_ndx      = get_rxt_ndx( 'usr_CO05_OH' )
     533           0 :     usr_CO06_OH_ndx      = get_rxt_ndx( 'usr_CO06_OH' )
     534           0 :     usr_CO07_OH_ndx      = get_rxt_ndx( 'usr_CO07_OH' )
     535           0 :     usr_CO08_OH_ndx      = get_rxt_ndx( 'usr_CO08_OH' )
     536           0 :     usr_CO09_OH_ndx      = get_rxt_ndx( 'usr_CO09_OH' )
     537           0 :     usr_CO10_OH_ndx      = get_rxt_ndx( 'usr_CO10_OH' )
     538           0 :     usr_CO11_OH_ndx      = get_rxt_ndx( 'usr_CO11_OH' )
     539           0 :     usr_CO12_OH_ndx      = get_rxt_ndx( 'usr_CO12_OH' )
     540           0 :     usr_CO13_OH_ndx      = get_rxt_ndx( 'usr_CO13_OH' )
     541           0 :     usr_CO14_OH_ndx      = get_rxt_ndx( 'usr_CO14_OH' )
     542           0 :     usr_CO15_OH_ndx      = get_rxt_ndx( 'usr_CO15_OH' )
     543           0 :     usr_CO16_OH_ndx      = get_rxt_ndx( 'usr_CO16_OH' )
     544           0 :     usr_CO17_OH_ndx      = get_rxt_ndx( 'usr_CO17_OH' )
     545           0 :     usr_CO18_OH_ndx      = get_rxt_ndx( 'usr_CO18_OH' )
     546           0 :     usr_CO19_OH_ndx      = get_rxt_ndx( 'usr_CO19_OH' )
     547           0 :     usr_CO20_OH_ndx      = get_rxt_ndx( 'usr_CO20_OH' )
     548           0 :     usr_CO21_OH_ndx      = get_rxt_ndx( 'usr_CO21_OH' )
     549           0 :     usr_CO22_OH_ndx      = get_rxt_ndx( 'usr_CO22_OH' )
     550           0 :     usr_CO23_OH_ndx      = get_rxt_ndx( 'usr_CO23_OH' )
     551           0 :     usr_CO24_OH_ndx      = get_rxt_ndx( 'usr_CO24_OH' )
     552           0 :     usr_CO25_OH_ndx      = get_rxt_ndx( 'usr_CO25_OH' )
     553           0 :     usr_CO26_OH_ndx      = get_rxt_ndx( 'usr_CO26_OH' )
     554           0 :     usr_CO27_OH_ndx      = get_rxt_ndx( 'usr_CO27_OH' )
     555           0 :     usr_CO28_OH_ndx      = get_rxt_ndx( 'usr_CO28_OH' )
     556           0 :     usr_CO29_OH_ndx      = get_rxt_ndx( 'usr_CO29_OH' )
     557           0 :     usr_CO30_OH_ndx      = get_rxt_ndx( 'usr_CO30_OH' )
     558           0 :     usr_CO31_OH_ndx      = get_rxt_ndx( 'usr_CO31_OH' )
     559           0 :     usr_CO32_OH_ndx      = get_rxt_ndx( 'usr_CO32_OH' )
     560           0 :     usr_CO33_OH_ndx      = get_rxt_ndx( 'usr_CO33_OH' )
     561           0 :     usr_CO34_OH_ndx      = get_rxt_ndx( 'usr_CO34_OH' )
     562           0 :     usr_CO35_OH_ndx      = get_rxt_ndx( 'usr_CO35_OH' )
     563           0 :     usr_CO36_OH_ndx      = get_rxt_ndx( 'usr_CO36_OH' )
     564           0 :     usr_CO37_OH_ndx      = get_rxt_ndx( 'usr_CO37_OH' )
     565           0 :     usr_CO38_OH_ndx      = get_rxt_ndx( 'usr_CO38_OH' )
     566           0 :     usr_CO39_OH_ndx      = get_rxt_ndx( 'usr_CO39_OH' )
     567           0 :     usr_CO40_OH_ndx      = get_rxt_ndx( 'usr_CO40_OH' )
     568           0 :     usr_CO41_OH_ndx      = get_rxt_ndx( 'usr_CO41_OH' )
     569           0 :     usr_CO42_OH_ndx      = get_rxt_ndx( 'usr_CO42_OH' )
     570             : !lke--
     571             : 
     572           0 :     if (masterproc) then
     573           0 :        write(iulog,*) ' '
     574           0 :        write(iulog,*) 'usrrxt_inti: diagnostics '
     575           0 :        write(iulog,'(10i5)') usr_O_O2_ndx,usr_HO2_HO2_ndx,tag_NO2_NO3_ndx,usr_N2O5_M_ndx,tag_NO2_OH_ndx,usr_HNO3_OH_ndx &
     576           0 :                             ,tag_NO2_HO2_ndx,usr_HO2NO2_M_ndx,usr_N2O5_aer_ndx,usr_NO3_aer_ndx,usr_NO2_aer_ndx &
     577           0 :                             ,usr_CO_OH_b_ndx,tag_C2H4_OH_ndx,tag_C3H6_OH_ndx,tag_CH3CO3_NO2_ndx,usr_PAN_M_ndx,usr_CH3COCH3_OH_ndx &
     578           0 :                             ,usr_MCO3_NO2_ndx,usr_MPAN_M_ndx,usr_XOOH_OH_ndx,usr_SO2_OH_ndx,usr_N2D_O2_ndx,usr_N2D_e_ndx,usr_N_O2_ndx,usr_DMS_OH_ndx,usr_HO2_aer_ndx &
     579           0 :                             ,usr_GLYOXAL_aer_ndx,usr_ISOPNITA_aer_ndx,usr_ISOPNITB_aer_ndx,usr_ONITR_aer_ndx,usr_HONITR_aer_ndx &
     580           0 :                             ,usr_TERPNIT_aer_ndx,usr_NTERPOOH_aer_ndx,usr_NC4CHO_aer_ndx,usr_NC4CH2OH_aer_ndx,usr_ISOPZD1O2_ndx &
     581           0 :                             ,usr_ISOPZD4O2_ndx,usr_ISOPFDN_aer_ndx,usr_ISOPFNP_aer_ndx,usr_ISOPN2B_aer_ndx,usr_ISOPN1D_aer_ndx &
     582           0 :                             ,usr_ISOPN4D_aer_ndx,usr_INOOHD_aer_ndx,usr_INHEB_aer_ndx,usr_INHED_aer_ndx,usr_MACRN_aer_ndx &
     583           0 :                             ,usr_ISOPHFP_aer_ndx,usr_IEPOX_aer_ndx,usr_DHPMPAL_aer_ndx,usr_ISOPB1O2_NOn_ndx,usr_ISOPB1O2_NOa_ndx &
     584           0 :                             ,usr_ISOPB4O2_NOn_ndx,usr_ISOPB4O2_NOa_ndx,usr_ISOPED1O2_NOn_ndx,usr_ISOPED1O2_NOa_ndx &
     585           0 :                             ,usr_ISOPED4O2_NOn_ndx,usr_ISOPED4O2_NOa_ndx,usr_ISOPZD1O2_NOn_ndx,usr_ISOPZD1O2_NOa_ndx &
     586           0 :                             ,usr_ISOPZD4O2_NOn_ndx,usr_ISOPZD4O2_NOa_ndx,usr_ISOPNO3_NOn_ndx,usr_ISOPNO3_NOa_ndx &
     587           0 :                             ,usr_MVKO2_NOn_ndx,usr_MVKO2_NOa_ndx,usr_MACRO2_NOn_ndx,usr_MACRO2_NOa_ndx &
     588           0 :                             ,usr_IEPOXOO_NOn_ndx,usr_IEPOXOO_NOa_ndx,usr_ISOPN1DO2_NOn_ndx,usr_ISOPN1DO2_NOa_ndx &
     589           0 :                             ,usr_ISOPN2BO2_NOn_ndx,usr_ISOPN2BO2_NOa_ndx,usr_ISOPN3BO2_NOn_ndx,usr_ISOPN3BO2_NOa_ndx &
     590           0 :                             ,usr_ISOPN4DO2_NOn_ndx,usr_ISOPN4DO2_NOa_ndx,usr_ISOPNBNO3O2_NOn_ndx,usr_ISOPNBNO3O2_NOa_ndx &
     591           0 :                             ,usr_ISOPNOOHBO2_NOn_ndx,usr_ISOPNOOHBO2_NOa_ndx,usr_ISOPNOOHDO2_NOn_ndx,usr_ISOPNOOHDO2_NOa_ndx &
     592           0 :                             ,usr_NC4CHOO2_NOn_ndx,usr_NC4CHOO2_NOa_ndx,tag_MCO3_NO2_ndx &
     593           0 :                             ,usr_TERPNT_aer_ndx,tag_TERPA2CO3_NO2_ndx,usr_TERPA2PAN_M_ndx &
     594           0 :                             ,usr_TERPNT1_aer_ndx,usr_TERPNPT_aer_ndx,usr_TERPNPT1_aer_ndx,usr_TERPFDN_aer_ndx,usr_SQTN_aer_ndx &
     595           0 :                             ,usr_TERPHFN_aer_ndx,usr_TERPDHDP_aer_ndx,usr_TERPACID_aer_ndx,tag_TERPACO3_NO2_ndx &
     596           0 :                             ,usr_TERPAPAN_M_ndx,tag_TERPA3CO3_NO2_ndx, usr_TERPA3PAN_M_ndx,usr_ICHE_aer_ndx,usr_ISOPFNC_aer_ndx &
     597           0 :                             ,usr_ISOPFDNC_aer_ndx
     598             : 
     599             :     end if
     600             : 
     601           0 :   end subroutine usrrxt_inti
     602             : 
     603           0 :   subroutine usrrxt( state, rxt, temp, tempi, tempe, invariants, h2ovmr,  &
     604           0 :                      pmid, m, sulfate, mmr, relhum, strato_sad, &
     605           0 :                      tropchemlev, dlat, ncol, sad_trop, reff_trop, cwat, mbar, pbuf )
     606             : 
     607             : !-----------------------------------------------------------------
     608             : !        ... set the user specified reaction rates
     609             : !-----------------------------------------------------------------
     610             : 
     611             :     use mo_constants,    only : pi, avo => avogadro, boltz_cgs, rgas
     612             :     use chem_mods,       only : nfs, rxntot, gas_pcnst, inv_m_ndx=>indexm
     613             :     use mo_setinv,       only : inv_o2_ndx=>o2_ndx, inv_h2o_ndx=>h2o_ndx
     614             :     use physics_buffer,  only : physics_buffer_desc
     615             :     use physics_types,   only : physics_state
     616             :     use carma_flags_mod, only : carma_hetchem_feedback
     617             :     use aero_model,      only : aero_model_surfarea
     618             :     use rad_constituents,only : rad_cnst_get_info
     619             : 
     620             :     implicit none
     621             : 
     622             : !-----------------------------------------------------------------
     623             : !        ... dummy arguments
     624             : !-----------------------------------------------------------------
     625             :     integer, intent(in)     :: ncol
     626             :     integer, intent(in)     :: tropchemlev(pcols)         ! trop/strat reaction separation vertical index
     627             :     real(r8), intent(in)    :: dlat(:)                    ! degrees latitude
     628             :     real(r8), intent(in)    :: temp(pcols,pver)           ! temperature (K); neutral temperature
     629             :     real(r8), intent(in)    :: tempi(pcols,pver)          ! ionic temperature (K); only used if ion chemistry
     630             :     real(r8), intent(in)    :: tempe(pcols,pver)          ! electronic temperature (K); only used if ion chemistry
     631             :     real(r8), intent(in)    :: m(ncol,pver)               ! total atm density (/cm^3)
     632             :     real(r8), intent(in)    :: sulfate(ncol,pver)         ! sulfate aerosol (mol/mol)
     633             :     real(r8), intent(in)    :: strato_sad(pcols,pver)     ! stratospheric aerosol sad (1/cm)
     634             :     real(r8), intent(in)    :: h2ovmr(ncol,pver)          ! water vapor (mol/mol)
     635             :     real(r8), intent(in)    :: relhum(ncol,pver)          ! relative humidity
     636             :     real(r8), intent(in)    :: pmid(pcols,pver)           ! midpoint pressure (Pa)
     637             :     real(r8), intent(in)    :: invariants(ncol,pver,nfs)  ! invariants density (/cm^3)
     638             :     real(r8), intent(in)    :: mmr(pcols,pver,gas_pcnst)  ! species concentrations (kg/kg)
     639             :     real(r8), intent(in)    :: cwat(ncol,pver) !PJC Condensed Water (liquid+ice) (kg/kg)
     640             :     real(r8), intent(in)    :: mbar(ncol,pver) !PJC Molar mass of air (g/mol)
     641             :     real(r8), intent(inout) :: rxt(ncol,pver,rxntot)      ! gas phase rates
     642             :     real(r8), intent(out)   :: sad_trop(pcols,pver)       ! tropospheric surface area density (cm2/cm3)
     643             :     real(r8), intent(out)   :: reff_trop(pcols,pver)      ! tropospheric effective radius (cm)
     644             :     type(physics_state),    intent(in) :: state           ! Physics state variables
     645             :     type(physics_buffer_desc), pointer :: pbuf(:)
     646             : 
     647             : !-----------------------------------------------------------------
     648             : !        ... local variables
     649             : !-----------------------------------------------------------------
     650             : 
     651             :     real(r8), parameter :: dg = 0.1_r8            ! mole diffusion =0.1 cm2/s (Dentener, 1993)
     652             : 
     653             : !-----------------------------------------------------------------
     654             : !       ... reaction probabilities for heterogeneous reactions
     655             : !-----------------------------------------------------------------
     656             :     real(r8), parameter :: gamma_n2o5 = 0.02_r8         ! JPL19
     657             :     real(r8), parameter :: gamma_ho2  = 0.10_r8         ! Gaubert et al., https://doi.org/10.5194/acp-20-14617-2020
     658             :     real(r8), parameter :: gamma_no2  = 8.0e-6_r8       ! Liu et al., Environ.Sci.&Tech, 53, 3517, 2019 doi:10.1021/acs.est.8b06367
     659             :     real(r8), parameter :: gamma_no3  = 0.002_r8        ! JPL19
     660             :     real(r8), parameter :: gamma_glyoxal  = 2.0e-4_r8   !  Washenfelder et al, JGR, 2011
     661             : !TS1 species
     662             :     real(r8), parameter :: gamma_isopnita  = 0.005_r8        ! from Fisher et al., ACP, 2016
     663             :     real(r8), parameter :: gamma_isopnitb  = 0.005_r8        !
     664             :     real(r8), parameter :: gamma_onitr     = 0.005_r8        !
     665             :     real(r8), parameter :: gamma_honitr    = 0.005_r8        !
     666             :     real(r8), parameter :: gamma_terpnit   = 0.01_r8         !
     667             :     real(r8), parameter :: gamma_nterpooh  = 0.01_r8         !
     668             :     real(r8), parameter :: gamma_nc4cho    = 0.02_r8        !
     669             :     real(r8), parameter :: gamma_nc4ch2oh  = 0.005_r8        !
     670             : !TS2 species
     671             :     real(r8), parameter :: gamma_isopfdn  = 0.1_r8          ! Marais 2015 for C5-LVOC
     672             :     real(r8), parameter :: gamma_isopfnp  = 0.1_r8          ! Marais 2015 for C5-LVOC
     673             :     real(r8), parameter :: gamma_isopn2b  = 0.02_r8        ! All isoprene nitrates Wolfe
     674             :     real(r8), parameter :: gamma_isopn1d  = 0.02_r8        !
     675             :     real(r8), parameter :: gamma_isopn4d  = 0.02_r8        !
     676             :     real(r8), parameter :: gamma_inoohd   = 0.02_r8        !
     677             :     real(r8), parameter :: gamma_inheb    = 0.02_r8       !Marais 2015 for IEPOX
     678             :     real(r8), parameter :: gamma_inhed    = 0.02_r8       !Marais 2015 for IEPOX
     679             :     real(r8), parameter :: gamma_macrn    = 0.02_r8        !
     680             :     real(r8), parameter :: gamma_isophfp  = 0.1_r8          !Marais 2015 for C5-LVOC
     681             :     real(r8), parameter :: gamma_iepox    = 0.0042_r8       !Marais 2015 for IEPOX
     682             :     real(r8), parameter :: gamma_dhpmpal  = 0.1_r8          !Marais 2015 for C5-LVOC
     683             :     real(r8), parameter :: gamma_iche     = 0.0042_r8       !Marais 2015 for IEPOX
     684             :     real(r8), parameter :: gamma_isopfnc  = 0.1_r8          ! Marais 2015 for C5-LVOC
     685             :     real(r8), parameter :: gamma_isopfdnc = 0.1_r8          ! Marais 2015 for C5-LVOC
     686             :     real(r8), parameter :: gamma_terpnt   = 0.02_r8        !
     687             :     real(r8), parameter :: gamma_terpnt1  = 0.02_r8        !
     688             :     real(r8), parameter :: gamma_terpnpt  = 0.02_r8        !
     689             :     real(r8), parameter :: gamma_terpnpt1 = 0.02_r8        !
     690             :     real(r8), parameter :: gamma_terpfdn  = 0.1_r8        !
     691             :     real(r8), parameter :: gamma_sqtn     = 0.1_r8        !
     692             :     real(r8), parameter :: gamma_terphfn  = 0.1_r8        !
     693             :     real(r8), parameter :: gamma_terpdhdp = 0.1_r8        !
     694             :     real(r8), parameter :: gamma_terpacid = 0.01_r8        !
     695             : 
     696             :     integer  ::  i, k
     697             :     integer  ::  l
     698           0 :     real(r8) ::  tp(ncol)                       ! 300/t
     699           0 :     real(r8) ::  tinv(ncol)                     ! 1/t
     700           0 :     real(r8) ::  ko(ncol)
     701           0 :     real(r8) ::  term1(ncol)
     702           0 :     real(r8) ::  term2(ncol)
     703           0 :     real(r8) ::  kinf(ncol)
     704           0 :     real(r8) ::  fc(ncol)
     705           0 :     real(r8) ::  xr(ncol)
     706           0 :     real(r8) ::  sur(ncol)
     707           0 :     real(r8) ::  sqrt_t(ncol)                   ! sqrt( temp )
     708           0 :     real(r8) ::  sqrt_t_58(ncol)                ! sqrt( temp / 58.)
     709           0 :     real(r8) ::  exp_fac(ncol)                  ! vector exponential
     710           0 :     real(r8) ::  lwc(ncol)
     711           0 :     real(r8) ::  ko_m(ncol)
     712           0 :     real(r8) ::  k0(ncol)
     713           0 :     real(r8) ::  kinf_m(ncol)
     714           0 :     real(r8) ::  o2(ncol)
     715             :     real(r8) ::  c_n2o5, c_ho2, c_no2, c_no3, c_glyoxal
     716             : !TS1 species
     717             :     real(r8) ::  c_isopnita, c_isopnitb, c_onitr, c_honitr, c_terpnit, c_nterpooh
     718             :     real(r8) ::  c_nc4cho, c_nc4ch2oh
     719             : !T2 species
     720             :     real(r8) ::  c_isopfdn, c_isopfnp, c_isopn2b, c_isopn1d, c_isopn4d, c_inoohd
     721             :     real(r8) ::  c_inheb, c_inhed, c_macrn, c_isophfp, c_iepox, c_dhpmpal
     722             :     real(r8) ::  c_iche, c_isopfnc, c_isopfdnc
     723             :     real(r8) ::  c_terpnt, c_terpnt1, c_terpnpt, c_terpnpt1, c_terpfdn, c_sqtn, c_terphfn, c_terpdhdp, c_terpacid
     724             : 
     725             :     real(r8) ::  amas
     726             :     !-----------------------------------------------------------------
     727             :     !   ... density of sulfate aerosol
     728             :     !-----------------------------------------------------------------
     729             :     real(r8), parameter :: gam1 = 0.04_r8                 ! N2O5+SUL ->2HNO3
     730             :     real(r8), parameter :: wso4 = 98._r8
     731             :     real(r8), parameter :: den  = 1.15_r8                 ! each molecule of SO4(aer) density g/cm3
     732             :     !-------------------------------------------------
     733             :     !   ... volume of sulfate particles
     734             :     !           assuming mean rm
     735             :     !           continient 0.05um  0.07um  0.09um
     736             :     !           ocean      0.09um  0.25um  0.37um
     737             :     !                      0.16um                  Blake JGR,7195, 1995
     738             :     !-------------------------------------------------
     739             :     real(r8), parameter :: rm1  = 0.16_r8*1.e-4_r8             ! mean radii in cm
     740             :     real(r8), parameter :: fare = 4._r8*pi*rm1*rm1             ! each mean particle(r=0.1u) area   cm2/cm3
     741             : 
     742             :     !-----------------------------------------------------------------------
     743             :     !        ... Aqueous phase sulfur quantities for SO2 + H2O2 and SO2 + O3
     744             :     !-----------------------------------------------------------------------
     745             :     real(r8), parameter  :: HENRY298_H2O2 =  7.45e+04_r8
     746             :     real(r8), parameter  :: H298_H2O2     = -1.45e+04_r8
     747             :     real(r8), parameter  :: HENRY298_SO2  =  1.23e+00_r8
     748             :     real(r8), parameter  :: H298_SO2      = -6.25e+03_r8
     749             :     real(r8), parameter  :: K298_SO2_HSO3 =  1.3e-02_r8
     750             :     real(r8), parameter  :: H298_SO2_HSO3 = -4.16e+03_r8
     751             :     real(r8), parameter  :: R_CONC        =  82.05e+00_r8 / avo
     752             :     real(r8), parameter  :: R_CAL         =  rgas * 0.239006e+00_r8
     753             :     real(r8), parameter  :: K_AQ          =  7.57e+07_r8
     754             :     real(r8), parameter  :: ER_AQ         =  4.43e+03_r8
     755             : 
     756             :     real(r8), parameter  :: HENRY298_O3   =  1.13e-02_r8
     757             :     real(r8), parameter  :: H298_O3       = -5.04e+03_r8
     758             :     real(r8), parameter  :: K298_HSO3_SO3 =  6.6e-08_r8
     759             :     real(r8), parameter  :: H298_HSO3_SO3 = -2.23e+03_r8
     760             :     real(r8), parameter  :: K0_AQ         =  2.4e+04_r8
     761             :     real(r8), parameter  :: ER0_AQ        =  0.0e+00_r8
     762             :     real(r8), parameter  :: K1_AQ         =  3.7e+05_r8
     763             :     real(r8), parameter  :: ER1_AQ        =  5.53e+03_r8
     764             :     real(r8), parameter  :: K2_AQ         =  1.5e+09_r8
     765             :     real(r8), parameter  :: ER2_AQ        =  5.28e+03_r8
     766             : 
     767             :     real(r8), parameter  :: pH            =  4.5e+00_r8
     768             : 
     769           0 :     real(r8), pointer :: sfc(:), dm_aer(:)
     770             :     integer :: ntot_amode, nbins
     771             : 
     772           0 :     real(r8), pointer :: sfc_array(:,:,:), dm_array(:,:,:)
     773             :  !TS2
     774           0 :     real(r8) ::  aterm(ncol)
     775             :     real(r8) ::  natom
     776             :     real(r8) ::  nyield
     777             :     real(r8) ::  acorr
     778             :     real(r8) ::  exp_natom
     779             :     character(len=*), parameter :: subname = 'usrrxt'
     780             : 
     781             :     ! get info about the modal aerosols
     782             :     ! get ntot_amode
     783           0 :     call rad_cnst_get_info(0, nmodes=ntot_amode)
     784           0 :     call rad_cnst_get_info(0, nbins=nbins)
     785             : 
     786           0 :     if (ntot_amode>0.and.nbins>0) then
     787           0 :       call endrun(subname // ':: ERROR running with MAM and CARMA simultaneously not supported.')
     788             :     end if
     789             : 
     790           0 :     if (ntot_amode>0) then
     791           0 :        allocate(sfc_array(pcols,pver,ntot_amode), dm_array(pcols,pver,ntot_amode) )
     792           0 :     else if (nbins>0) then
     793           0 :        allocate(sfc_array(pcols,pver,nbins), dm_array(pcols,pver,nbins) )
     794             :     else
     795           0 :        allocate(sfc_array(pcols,pver,5), dm_array(pcols,pver,5) )
     796             :     endif
     797             : 
     798           0 :     sfc_array(:,:,:) = 0._r8
     799           0 :     dm_array(:,:,:) = 0._r8
     800           0 :     sad_trop(:,:) = 0._r8
     801           0 :     reff_trop(:,:) = 0._r8
     802             : 
     803           0 :     if( usr_NO2_aer_ndx > 0 .or. usr_NO3_aer_ndx > 0 .or. usr_N2O5_aer_ndx > 0 .or. usr_HO2_aer_ndx > 0 ) then
     804             : 
     805             : ! sad_trop should be set outside of usrrxt ??
     806           0 :        if( carma_hetchem_feedback ) then
     807           0 :           sad_trop(:ncol,:pver)=strato_sad(:ncol,:pver)
     808             :        else
     809             : 
     810             :           call aero_model_surfarea( &
     811           0 :                state, mmr, rm1, relhum, pmid, temp, strato_sad, sulfate, m, tropchemlev, dlat, &
     812           0 :                het1_ndx, pbuf, ncol, sfc_array, dm_array, sad_trop, reff_trop )
     813             : 
     814             :        endif
     815             :     endif
     816             : 
     817           0 :     level_loop : do k = 1,pver
     818           0 :        tinv(:)           = 1._r8 / temp(:ncol,k)
     819           0 :        tp(:)             = 300._r8 * tinv(:)
     820           0 :        sqrt_t(:)         = sqrt( temp(:ncol,k) )
     821           0 :        sqrt_t_58(:)      = sqrt( temp(:ncol,k) / 58.0_r8 )
     822             : 
     823             : !-----------------------------------------------------------------
     824             : !       ... o + o2 + m --> o3 + m (JPL15-10)
     825             : !-----------------------------------------------------------------
     826           0 :        if( usr_O_O2_ndx > 0 ) then
     827           0 :           rxt(:,k,usr_O_O2_ndx) = 6.e-34_r8 * tp(:)**2.4_r8
     828             :        end if
     829           0 :        if( usr_OA_O2_ndx > 0 ) then
     830           0 :           rxt(:,k,usr_OA_O2_ndx) = 6.e-34_r8 * tp(:)**2.4_r8
     831             :        end if
     832             : 
     833             : !-----------------------------------------------------------------
     834             : !       ... o + o + m -> o2 + m
     835             : !-----------------------------------------------------------------
     836           0 :        if ( usr_O_O_ndx > 0 ) then
     837           0 :           rxt(:,k,usr_O_O_ndx) = 2.76e-34_r8 * exp( 720.0_r8*tinv(:) )
     838             :        end if
     839             : 
     840             : !-----------------------------------------------------------------
     841             : !       ... cl2o2 + m -> 2*clo + m  (JPL15-10)
     842             : !-----------------------------------------------------------------
     843           0 :        if ( usr_CL2O2_M_ndx > 0 ) then
     844           0 :           if ( tag_CLO_CLO_M_ndx > 0 ) then
     845           0 :              ko(:)            = 2.16e-27_r8 * exp( 8537.0_r8* tinv(:) )
     846           0 :              rxt(:,k,usr_CL2O2_M_ndx) = rxt(:,k,tag_CLO_CLO_M_ndx)/ko(:)
     847             :           else
     848           0 :              rxt(:,k,usr_CL2O2_M_ndx) = 0._r8
     849             :           end if
     850             :        end if
     851             : 
     852             : !-----------------------------------------------------------------
     853             : !       ... so3 + 2*h2o --> h2so4 + h2o
     854             : !       Note: this reaction proceeds by the 2 intermediate steps below
     855             : !           so3 + h2o --> adduct
     856             : !           adduct + h2o --> h2so4 + h2o
     857             : !               (Lovejoy et al., JCP, pp. 19911-19916, 1996)
     858             : !       The first order rate constant used here is recommended by JPL 2011.
     859             : !       This rate involves the water vapor number density.
     860             : !-----------------------------------------------------------------
     861             : 
     862           0 :        if ( usr_SO3_H2O_ndx > 0 ) then
     863           0 :           call comp_exp( exp_fac, 6540.0_r8*tinv(:), ncol )
     864           0 :           if( h2o_ndx > 0 ) then
     865           0 :              fc(:) = 8.5e-21_r8 * m(:,k) * h2ovmr(:,k) * exp_fac(:)
     866             :           else
     867           0 :              fc(:) = 8.5e-21_r8 * invariants(:,k,inv_h2o_ndx) * exp_fac(:)
     868             :           end if
     869           0 :           rxt(:,k,usr_SO3_H2O_ndx) = 1.0e-20_r8 * fc(:)
     870             :        end if
     871             : 
     872             : !-----------------------------------------------------------------
     873             : !       ... n2o5 + m --> no2 + no3 + m (JPL15-10)
     874             : !-----------------------------------------------------------------
     875           0 :        if( usr_N2O5_M_ndx > 0 ) then
     876           0 :           if( tag_NO2_NO3_ndx > 0 ) then
     877           0 :              call comp_exp( exp_fac, -10840.0_r8*tinv, ncol )
     878           0 :              rxt(:,k,usr_N2O5_M_ndx) = rxt(:,k,tag_NO2_NO3_ndx) * 1.724138e26_r8 * exp_fac(:)
     879             :           else
     880           0 :              rxt(:,k,usr_N2O5_M_ndx) = 0._r8
     881             :           end if
     882             :        end if
     883           0 :        if( usr_XNO2NO3_M_ndx > 0 ) then
     884           0 :           if( tag_NO2_NO3_ndx > 0 ) then
     885           0 :              call comp_exp( exp_fac, -10840.0_r8*tinv, ncol )
     886           0 :              rxt(:,k,usr_XNO2NO3_M_ndx) = rxt(:,k,tag_NO2_NO3_ndx) *1.724138e26_r8 * exp_fac(:)
     887             :           else
     888           0 :              rxt(:,k,usr_XNO2NO3_M_ndx) = 0._r8
     889             :           end if
     890             :        end if
     891           0 :        if( usr_NO2XNO3_M_ndx > 0 ) then
     892           0 :           if( tag_NO2_NO3_ndx > 0 ) then
     893           0 :              call comp_exp( exp_fac, -10840.0_r8*tinv, ncol )
     894           0 :              rxt(:,k,usr_NO2XNO3_M_ndx) = rxt(:,k,tag_NO2_NO3_ndx) * 1.734138e26_r8 * exp_fac(:)
     895             :           else
     896           0 :              rxt(:,k,usr_NO2XNO3_M_ndx) = 0._r8
     897             :           end if
     898             :        end if
     899             : 
     900             : !-----------------------------------------------------------------
     901             : !       set rates for:
     902             : !       ... hno3 + oh --> no3 + h2o
     903             : !           ho2no2 + m --> ho2 + no2 + m
     904             : !-----------------------------------------------------------------
     905           0 :        if( usr_HNO3_OH_ndx > 0 ) then
     906           0 :           call comp_exp( exp_fac, 1335._r8*tinv, ncol )
     907           0 :           ko(:) = m(:,k) * 6.5e-34_r8 * exp_fac(:)
     908           0 :           call comp_exp( exp_fac, 2199._r8*tinv, ncol )
     909           0 :           ko(:) = ko(:) / (1._r8 + ko(:)/(2.7e-17_r8*exp_fac(:)))
     910           0 :           call comp_exp( exp_fac, 460._r8*tinv, ncol )
     911           0 :           rxt(:,k,usr_HNO3_OH_ndx) = ko(:) + 2.4e-14_r8*exp_fac(:)
     912             :        end if
     913           0 :        if( usr_XHNO3_OH_ndx > 0 ) then
     914           0 :           call comp_exp( exp_fac, 1335._r8*tinv, ncol )
     915           0 :           ko(:) = m(:,k) * 6.5e-34_r8 * exp_fac(:)
     916           0 :           call comp_exp( exp_fac, 2199._r8*tinv, ncol )
     917           0 :           ko(:) = ko(:) / (1._r8 + ko(:)/(2.7e-17_r8*exp_fac(:)))
     918           0 :           call comp_exp( exp_fac, 460._r8*tinv, ncol )
     919           0 :           rxt(:,k,usr_XHNO3_OH_ndx) = ko(:) + 2.4e-14_r8*exp_fac(:)
     920             :        end if
     921           0 :        if( usr_HO2NO2_M_ndx > 0 ) then
     922           0 :           if( tag_NO2_HO2_ndx > 0 ) then
     923           0 :              call comp_exp( exp_fac, -10900._r8*tinv, ncol )
     924           0 :              rxt(:,k,usr_HO2NO2_M_ndx) = rxt(:,k,tag_NO2_HO2_ndx) * exp_fac(:) / 2.1e-27_r8
     925             :           else
     926           0 :              rxt(:,k,usr_HO2NO2_M_ndx) = 0._r8
     927             :           end if
     928             :        end if
     929           0 :        if( usr_XHO2NO2_M_ndx > 0 ) then
     930           0 :           if( tag_NO2_HO2_ndx > 0 ) then
     931           0 :              call comp_exp( exp_fac, -10900._r8*tinv, ncol )
     932           0 :              rxt(:,k,usr_XHO2NO2_M_ndx) = rxt(:,k,tag_NO2_HO2_ndx) * exp_fac(:) / 2.1e-27_r8
     933             :           else
     934           0 :              rxt(:,k,usr_XHO2NO2_M_ndx) = 0._r8
     935             :           end if
     936             :        end if
     937             : !-----------------------------------------------------------------
     938             : !       ... co + oh --> co2 + ho2 (new single reaction for combined branches [JPL19])
     939             : !-----------------------------------------------------------------
     940           0 :        if( usr_CO_OH_ndx > 0 ) then
     941           0 :          ko  (:)  = 6.9e-33_r8 * ( 298._r8 / temp(:ncol,k) )**(2.1_r8)
     942           0 :          kinf(:)  = 1.1e-12_r8 * ( 298._r8 / temp(:ncol,k) )**(-1.3_r8)
     943             : 
     944           0 :          term2(:) = (1 + (log10( ko(:)*m(:,k) / kinf(:) ))**2)**(-1)
     945             : 
     946           0 :          term1(:) = (kinf(:) * ko(:)*m(:,k)) / (kinf(:) + ko(:)*m(:,k)) * (0.6_r8)**term2(:)
     947             : 
     948           0 :          rxt(:ncol,k,usr_CO_OH_ndx) = term1(:) + 1.85e-13_r8 * exp(-65._r8/temp(:ncol,k)) * (1._r8 - term1(:)/kinf(:))
     949             : 
     950             :        end if
     951             : !-----------------------------------------------------------------
     952             : !       ... co + oh --> co2 + ho2     (combined branches - do not use with CO_OH_b)
     953             : !       note: for mechanisms prior to Dec 2022
     954             : !-----------------------------------------------------------------
     955           0 :        if( usr_CO_OH_a_ndx > 0 ) then
     956           0 :           rxt(:,k,usr_CO_OH_a_ndx) = 1.5e-13_r8 * &
     957           0 :                (1._r8 + 6.e-7_r8*boltz_cgs*m(:,k)*temp(:ncol,k))
     958             :        end if
     959             : !-----------------------------------------------------------------
     960             : !       ... co + oh --> co2 + h (second branch JPL15-10, with CO+OH+M)
     961             : !       note: for mechanisms prior to Dec 2022
     962             : !-----------------------------------------------------------------
     963           0 :        if( usr_CO_OH_b_ndx > 0 ) then
     964           0 :          kinf(:)  = 2.1e+09_r8 * (temp(:ncol,k)/ t0)**(6.1_r8)
     965           0 :          ko  (:)  = 1.5e-13_r8
     966             : 
     967           0 :          term1(:) = ko(:) / ( (kinf(:) / m(:,k)) )
     968           0 :          term2(:) = ko(:) / (1._r8 + term1(:))
     969             : 
     970           0 :          term1(:) = log10( term1(:) )
     971           0 :          term1(:) = 1.0_r8 / (1.0_r8 + term1(:)*term1(:))
     972             : 
     973           0 :          rxt(:ncol,k,usr_CO_OH_b_ndx) = term2(:) * (0.6_r8)**term1(:)
     974             :        end if
     975             : 
     976             : !-----------------------------------------------------------------
     977             : !       ... ho2 + ho2 --> h2o2
     978             : !       note: this rate involves the water vapor number density
     979             : !-----------------------------------------------------------------
     980           0 :        if( usr_HO2_HO2_ndx > 0 ) then
     981             : 
     982           0 :           call comp_exp( exp_fac, 460._r8*tinv, ncol )
     983           0 :           ko(:)   = 3.0e-13_r8 * exp_fac(:)
     984           0 :           call comp_exp( exp_fac, 920._r8*tinv, ncol )
     985           0 :           kinf(:) = 2.1e-33_r8 * m(:,k) * exp_fac(:)
     986           0 :           call comp_exp( exp_fac, 2200._r8*tinv, ncol )
     987             : 
     988           0 :           if( h2o_ndx > 0 ) then
     989           0 :              fc(:) = 1._r8 + 1.4e-21_r8 * m(:,k) * h2ovmr(:,k) * exp_fac(:)
     990             :           else
     991           0 :              fc(:) = 1._r8 + 1.4e-21_r8 * invariants(:,k,inv_h2o_ndx) * exp_fac(:)
     992             :           end if
     993           0 :           rxt(:,k,usr_HO2_HO2_ndx) = (ko(:) + kinf(:)) * fc(:)
     994             : 
     995             :        end if
     996             : 
     997             : !-----------------------------------------------------------------
     998             : !       ... mco3 + no2 -> mpan
     999             : !-----------------------------------------------------------------
    1000           0 :        if( usr_MCO3_NO2_ndx > 0 ) then
    1001           0 :           rxt(:,k,usr_MCO3_NO2_ndx) = 1.1e-11_r8 * tp(:) / m(:,k)
    1002             :        end if
    1003           0 :        if( usr_MCO3_XNO2_ndx > 0 ) then
    1004           0 :           rxt(:,k,usr_MCO3_XNO2_ndx) = 1.1e-11_r8 * tp(:) / m(:,k)
    1005             :        end if
    1006             : 
    1007             : !-----------------------------------------------------------------
    1008             : !       ... pan + m --> ch3co3 + no2 + m (JPL15-10)
    1009             : !-----------------------------------------------------------------
    1010           0 :        call comp_exp( exp_fac, -14000._r8*tinv, ncol )
    1011           0 :        if( usr_PAN_M_ndx > 0 ) then
    1012           0 :           if( tag_CH3CO3_NO2_ndx > 0 ) then
    1013           0 :              rxt(:,k,usr_PAN_M_ndx) = rxt(:,k,tag_CH3CO3_NO2_ndx) * 1.111e28_r8 * exp_fac(:)
    1014             :           else
    1015           0 :              rxt(:,k,usr_PAN_M_ndx) = 0._r8
    1016             :           end if
    1017             :        end if
    1018           0 :        if( usr_XPAN_M_ndx > 0 ) then
    1019           0 :           if( tag_CH3CO3_NO2_ndx > 0 ) then
    1020           0 :              rxt(:,k,usr_XPAN_M_ndx) = rxt(:,k,tag_CH3CO3_NO2_ndx) * 1.111e28_r8 * exp_fac(:)
    1021             :           else
    1022           0 :              rxt(:,k,usr_XPAN_M_ndx) = 0._r8
    1023             :           end if
    1024             :        end if
    1025             : 
    1026             : !-----------------------------------------------------------------
    1027             : !       ... mpan + m --> mco3 + no2 + m (JPL15-10)
    1028             : !-----------------------------------------------------------------
    1029           0 :        if( usr_MPAN_M_ndx > 0 ) then
    1030           0 :           if( tag_MCO3_NO2_ndx > 0 ) then
    1031           0 :              rxt(:,k,usr_MPAN_M_ndx) = rxt(:,k,tag_MCO3_NO2_ndx) * 1.111e28_r8 * exp_fac(:)
    1032             :           else
    1033           0 :              rxt(:,k,usr_MPAN_M_ndx) = 0._r8
    1034             :           end if
    1035             :        end if
    1036           0 :        if( usr_XMPAN_M_ndx > 0 ) then
    1037           0 :           if( tag_MCO3_NO2_ndx > 0 ) then
    1038           0 :              rxt(:,k,usr_XMPAN_M_ndx) = rxt(:,k,tag_MCO3_NO2_ndx) * 1.111e28_r8 * exp_fac(:)
    1039             :           else
    1040           0 :              rxt(:,k,usr_XMPAN_M_ndx) = 0._r8
    1041             :           end if
    1042             :        end if
    1043             : 
    1044             : !lke-TS1
    1045             : !-----------------------------------------------------------------
    1046             : !       ... pbznit + m --> acbzo2 + no2 + m
    1047             : !-----------------------------------------------------------------
    1048           0 :        if( usr_PBZNIT_M_ndx > 0 ) then
    1049           0 :           if( tag_ACBZO2_NO2_ndx > 0 ) then
    1050           0 :              rxt(:,k,usr_PBZNIT_M_ndx) = rxt(:,k,tag_ACBZO2_NO2_ndx) * 1.111e28_r8 * exp_fac(:)
    1051             :           else
    1052           0 :              rxt(:,k,usr_PBZNIT_M_ndx) = 0._r8
    1053             :           end if
    1054             :        end if
    1055             : !-----------------------------------------------------------------
    1056             : !       ... TERPAPAN + m --> TERPACO3 + no2 + m
    1057             : !-----------------------------------------------------------------
    1058           0 :        if( usr_TERPAPAN_M_ndx > 0 ) then
    1059           0 :           if( tag_TERPACO3_NO2_ndx > 0 ) then
    1060           0 :              rxt(:,k,usr_TERPAPAN_M_ndx) = rxt(:,k,tag_TERPACO3_NO2_ndx) * 1.111e28_r8 * exp_fac(:)
    1061             :           else
    1062           0 :              rxt(:,k,usr_TERPAPAN_M_ndx) = 0._r8
    1063             :           end if
    1064             :        end if
    1065             : !-----------------------------------------------------------------
    1066             : !       ... TERPA2PAN + m --> TERPA2CO3 + no2 + m
    1067             : !-----------------------------------------------------------------
    1068           0 :        if( usr_TERPA2PAN_M_ndx > 0 ) then
    1069           0 :           if( tag_TERPA2CO3_NO2_ndx > 0 ) then
    1070           0 :              rxt(:,k,usr_TERPA2PAN_M_ndx) = rxt(:,k,tag_TERPA2CO3_NO2_ndx) * 1.111e28_r8 * exp_fac(:)
    1071             :           else
    1072           0 :              rxt(:,k,usr_TERPA2PAN_M_ndx) = 0._r8
    1073             :           end if
    1074             :        end if
    1075             : !-----------------------------------------------------------------
    1076             : !       ... TERPA3PAN + m --> TERPA3CO3 + no2 + m
    1077             : !-----------------------------------------------------------------
    1078           0 :        if( usr_TERPA3PAN_M_ndx > 0 ) then
    1079           0 :           if( tag_TERPA3CO3_NO2_ndx > 0 ) then
    1080           0 :              rxt(:,k,usr_TERPA3PAN_M_ndx) = rxt(:,k,tag_TERPA3CO3_NO2_ndx) * 1.111e28_r8 * exp_fac(:)
    1081             :           else
    1082           0 :              rxt(:,k,usr_TERPA3PAN_M_ndx) = 0._r8
    1083             :           end if
    1084             :        end if
    1085             : !-----------------------------------------------------------------
    1086             : !       ... xooh + oh -> h2o + oh
    1087             : !-----------------------------------------------------------------
    1088           0 :        if( usr_XOOH_OH_ndx > 0 ) then
    1089           0 :           call comp_exp( exp_fac, 253._r8*tinv, ncol )
    1090           0 :           rxt(:,k,usr_XOOH_OH_ndx) = temp(:ncol,k)**2._r8 * 7.69e-17_r8 * exp_fac(:)
    1091             :        end if
    1092             : 
    1093             : !-----------------------------------------------------------------
    1094             : !       ... ch3coch3 + oh -> ro2 + h2o
    1095             : !-----------------------------------------------------------------
    1096           0 :        if( usr_CH3COCH3_OH_ndx > 0 ) then
    1097           0 :           call comp_exp( exp_fac, -2000._r8*tinv, ncol )
    1098           0 :           rxt(:,k,usr_CH3COCH3_OH_ndx) = 3.82e-11_r8 * exp_fac(:) + 1.33e-13_r8
    1099             :        end if
    1100             : 
    1101             : !-----------------------------------------------------------------
    1102             : !       ... N + O2 -> NO + O
    1103             : ! Rate coefficients calculated by J. Orlando, D. Kinnison, and J. Zhang (2024)
    1104             : ! from data published in:
    1105             : ! "Kinetics of the Reactions of N(4S) Atoms with O2 and CO2 over Wide Temperatures Ranges"
    1106             : ! Abel Fernandez, A. Goumri, and Arthur Fontijn, 1998
    1107             : ! https://doi.org/10.1021/jp972365k
    1108             : !-----------------------------------------------------------------
    1109           0 :        if( usr_N_O2_ndx > 0 ) then
    1110           0 :           call comp_exp( exp_fac, -2557._r8*tinv, ncol )
    1111           0 :           rxt(:,k,usr_N_O2_ndx) = 2.0e-18_r8 * temp(:ncol,k)**2.15_r8 * exp_fac(:)
    1112             :        end if
    1113             :        
    1114             : !-----------------------------------------------------------------
    1115             : !       ... N2D + O2 -> NO + O
    1116             : ! "On the rate coefficient of the N(2D)+O2->NO+O reaction in the terrestrial thermosphere"
    1117             : ! Duff, J.W., H. Dothe, and R. D. Sharma, 2003
    1118             : ! https://doi.org/10.1029/2002GL016720
    1119             : !-----------------------------------------------------------------
    1120           0 :        if( usr_N2D_O2_ndx > 0 ) then
    1121           0 :           rxt(:,k,usr_N2D_O2_ndx) = 6.2e-12_r8 * temp(:ncol,k)/300.0_r8
    1122             :        end if
    1123             : 
    1124             : !-----------------------------------------------------------------
    1125             : !       ... N2D + e -> N + e  Roble, 1995
    1126             : ! "Energetics of the Mesosphere and Thermosphere"
    1127             : ! R. Roble, 1995
    1128             : ! https://doi.org/10.1029/GM087p0001
    1129             : !-----------------------------------------------------------------
    1130           0 :        if( usr_N2D_e_ndx > 0 ) then
    1131           0 :           rxt(:,k,usr_N2D_e_ndx) = 3.6e-10_r8 * sqrt(tempe(:ncol,k)/300.0_r8)
    1132             :        end if
    1133             :        
    1134             : !-----------------------------------------------------------------
    1135             : !       ... DMS + OH  --> .5 * SO2
    1136             : !       JPL15-10 (use [O2] = 0.21*[M])
    1137             : !       k = 8.2E-39 * exp(5376/T) * [O2] / (1 + 1.05E-5 *([O2]/[M]) * exp(3644/T))
    1138             : !-----------------------------------------------------------------
    1139           0 :        if( usr_DMS_OH_ndx > 0 ) then
    1140           0 :           call comp_exp( exp_fac, 3644._r8*tinv, ncol )
    1141           0 :           ko(:) = 1._r8 + 1.05e-5_r8 * exp_fac * 0.21_r8
    1142           0 :           call comp_exp( exp_fac, 5376._r8*tinv, ncol )
    1143           0 :           rxt(:,k,usr_DMS_OH_ndx) = 8.2e-39_r8 * exp_fac * m(:,k) * 0.21_r8 / ko(:)
    1144             :        end if
    1145             : 
    1146             : !-----------------------------------------------------------------
    1147             : !       ... SO2 + OH  --> SO4  (REFERENCE?? - not Liao)
    1148             : !-----------------------------------------------------------------
    1149           0 :        if( usr_SO2_OH_ndx > 0 ) then
    1150           0 :           fc(:) = 3.0e-31_r8 *(300._r8*tinv(:))**3.3_r8
    1151           0 :           ko(:) = fc(:)*m(:,k)/(1._r8 + fc(:)*m(:,k)/1.5e-12_r8)
    1152           0 :           rxt(:,k,usr_SO2_OH_ndx) = ko(:)*.6_r8**(1._r8 + (log10(fc(:)*m(:,k)/1.5e-12_r8))**2._r8)**(-1._r8)
    1153             :        end if
    1154             : !RHS TS2
    1155             : !-----------------------------------------------------------------
    1156             : !       ... ISOPZD1O2 --> HPALD etc. Wennberg 2018 for rate
    1157             : !-----------------------------------------------------------------
    1158           0 :        if( usr_ISOPZD1O2_ndx > 0 ) then
    1159           0 :           call comp_exp( exp_fac, -12200._r8*tinv, ncol )
    1160           0 :           ko(:) = 5.05e15_r8 * exp_fac(:)
    1161           0 :           call comp_exp( exp_fac, 1.e8_r8*tinv**3._r8, ncol )
    1162           0 :           rxt(:,k,usr_ISOPZD1O2_ndx) = ko(:)*exp_fac(:)
    1163             :        end if
    1164             : !-----------------------------------------------------------------
    1165             : !       ... ISOPZD4O2 --> HPALD etc. Wennberg 2018 for rate
    1166             : !-----------------------------------------------------------------
    1167           0 :        if( usr_ISOPZD4O2_ndx > 0 ) then
    1168           0 :           call comp_exp( exp_fac, -7160._r8*tinv, ncol )
    1169           0 :           ko(:) = 2.22e9_r8 * exp_fac(:)
    1170           0 :           call comp_exp( exp_fac, 1.e8_r8*tinv**3._r8, ncol )
    1171           0 :           rxt(:,k,usr_ISOPZD4O2_ndx) = ko(:)*exp_fac(:)
    1172             :        end if
    1173             : !-----------------------------------------------------------------
    1174             : !       ... ISOPB1O2_NOn Temp/Pressure Dependent Nitrate Yield
    1175             : !-----------------------------------------------------------------
    1176           0 :        if( usr_ISOPB1O2_NOn_ndx > 0 ) then
    1177           0 :           nyield = (1._r8-0.14_r8)/0.14_r8
    1178           0 :           natom = 6.0_r8
    1179           0 :           exp_natom = exp( natom )
    1180             :           acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
    1181             :                       exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
    1182             :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
    1183           0 :                       (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
    1184           0 :           aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
    1185           0 :                       exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
    1186           0 :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
    1187           0 :                       (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
    1188           0 :           call comp_exp( exp_fac, 360._r8*tinv, ncol )
    1189           0 :           rxt(:,k,usr_ISOPB1O2_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
    1190           0 :           rxt(:,k,usr_ISOPB1O2_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
    1191             :        end if
    1192             : !-----------------------------------------------------------------
    1193             : !       ... ISOPB4O2_NOn Temp/Pressure Dependent Nitrate Yield
    1194             : !-----------------------------------------------------------------
    1195           0 :        if( usr_ISOPB4O2_NOn_ndx > 0 ) then
    1196           0 :           nyield = (1._r8-0.13_r8)/0.13_r8
    1197           0 :           natom = 6.0_r8
    1198           0 :           exp_natom = exp( natom )
    1199             :           acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
    1200             :                       exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
    1201             :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
    1202           0 :                       (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
    1203           0 :           aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
    1204           0 :                       exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
    1205           0 :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
    1206           0 :                       (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
    1207           0 :           call comp_exp( exp_fac, 360._r8*tinv, ncol )
    1208           0 :           rxt(:,k,usr_ISOPB4O2_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
    1209           0 :           rxt(:,k,usr_ISOPB4O2_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
    1210             :        end if
    1211             : !-----------------------------------------------------------------
    1212             : !       ... ISOPED1O2_NOn Temp/Pressure Dependent Nitrate Yield
    1213             : !-----------------------------------------------------------------
    1214           0 :        if( usr_ISOPED1O2_NOn_ndx > 0 ) then
    1215           0 :           nyield = (1._r8-0.12_r8)/0.12_r8
    1216           0 :           natom = 6.0_r8
    1217           0 :           exp_natom = exp( natom )
    1218             :           acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
    1219             :                       exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
    1220             :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
    1221           0 :                       (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
    1222           0 :           aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
    1223           0 :                       exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
    1224           0 :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
    1225           0 :                       (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
    1226           0 :           call comp_exp( exp_fac, 360._r8*tinv, ncol )
    1227           0 :         rxt(:,k,usr_ISOPED1O2_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
    1228           0 :         rxt(:,k,usr_ISOPED1O2_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
    1229             :        end if
    1230             : !-----------------------------------------------------------------
    1231             : !       ... ISOPED4O2_NOn Temp/Pressure Dependent Nitrate Yield
    1232             : !-----------------------------------------------------------------
    1233           0 :        if( usr_ISOPED4O2_NOn_ndx > 0 ) then
    1234           0 :           nyield = (1._r8-0.12_r8)/0.12_r8
    1235           0 :           natom = 6.0_r8
    1236           0 :           exp_natom = exp( natom )
    1237             :           acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
    1238             :                       exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
    1239             :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
    1240           0 :                       (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
    1241           0 :           aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
    1242           0 :                       exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
    1243           0 :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
    1244           0 :                       (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
    1245           0 :           call comp_exp( exp_fac, 360._r8*tinv, ncol )
    1246           0 :           rxt(:,k,usr_ISOPED4O2_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
    1247           0 :           rxt(:,k,usr_ISOPED4O2_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
    1248             :        end if
    1249             : !-----------------------------------------------------------------
    1250             : !       ... ISOPZD1O2_NOn Temp/Pressure Dependent Nitrate Yield
    1251             : !-----------------------------------------------------------------
    1252           0 :        if( usr_ISOPZD1O2_NOn_ndx > 0 ) then
    1253           0 :           nyield = (1._r8-0.12_r8)/0.12_r8
    1254           0 :           natom = 6.0_r8
    1255           0 :           exp_natom = exp( natom )
    1256             :           acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
    1257             :                       exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
    1258             :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
    1259           0 :                       (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
    1260           0 :           aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
    1261           0 :                       exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
    1262           0 :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
    1263           0 :                       (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
    1264           0 :           call comp_exp( exp_fac, 360._r8*tinv, ncol )
    1265           0 :           rxt(:,k,usr_ISOPZD1O2_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
    1266           0 :           rxt(:,k,usr_ISOPZD1O2_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
    1267             :        end if
    1268             : !-----------------------------------------------------------------
    1269             : !       ... ISOPZD4O2_NOn Temp/Pressure Dependent Nitrate Yield
    1270             : !-----------------------------------------------------------------
    1271           0 :        if( usr_ISOPZD4O2_NOn_ndx > 0 ) then
    1272           0 :           nyield = (1._r8-0.12_r8)/0.12_r8
    1273           0 :           natom = 6.0_r8
    1274           0 :           exp_natom = exp( natom )
    1275             :           acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
    1276             :                       exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
    1277             :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
    1278           0 :                       (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
    1279           0 :           aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
    1280           0 :                       exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
    1281           0 :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
    1282           0 :                       (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
    1283           0 :           call comp_exp( exp_fac, 360._r8*tinv, ncol )
    1284           0 :           rxt(:,k,usr_ISOPZD4O2_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
    1285           0 :           rxt(:,k,usr_ISOPZD4O2_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
    1286             :        end if
    1287             : !-----------------------------------------------------------------
    1288             : !       ... ISOPNO3_NOn Temp/Pressure Dependent Nitrate Yield
    1289             : !-----------------------------------------------------------------
    1290           0 :        if( usr_ISOPNO3_NOn_ndx > 0 ) then
    1291           0 :           nyield = (1._r8-0.135_r8)/0.135_r8
    1292           0 :           natom = 9.0_r8
    1293           0 :           exp_natom = exp( natom )
    1294             :           acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
    1295             :                       exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
    1296             :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
    1297           0 :                       (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
    1298           0 :           aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
    1299           0 :                       exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
    1300           0 :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
    1301           0 :                       (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
    1302           0 :           call comp_exp( exp_fac, 360._r8*tinv, ncol )
    1303           0 :           rxt(:,k,usr_ISOPNO3_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
    1304           0 :           rxt(:,k,usr_ISOPNO3_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
    1305             :        end if
    1306             : !-----------------------------------------------------------------
    1307             : !       ... MVKO2_NOn Temp/Pressure Dependent Nitrate Yield
    1308             : !-----------------------------------------------------------------
    1309           0 :        if( usr_MVKO2_NOn_ndx > 0 ) then
    1310           0 :           nyield = (1._r8-0.04_r8)/0.04_r8
    1311           0 :           natom = 6.0_r8
    1312           0 :           exp_natom = exp( natom )
    1313             :           acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
    1314             :                       exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
    1315             :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
    1316           0 :                       (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
    1317           0 :           aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
    1318           0 :                       exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
    1319           0 :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
    1320           0 :                       (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
    1321           0 :           call comp_exp( exp_fac, 360._r8*tinv, ncol )
    1322           0 :           rxt(:,k,usr_MVKO2_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
    1323           0 :           rxt(:,k,usr_MVKO2_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
    1324             :        end if
    1325             : !-----------------------------------------------------------------
    1326             : !       ... MACRO2_NOn Temp/Pressure Dependent Nitrate Yield
    1327             : !-----------------------------------------------------------------
    1328           0 :        if( usr_MACRO2_NOn_ndx > 0 ) then
    1329           0 :           nyield = (1._r8-0.06_r8)/0.06_r8
    1330           0 :           natom = 6.0_r8
    1331           0 :           exp_natom = exp( natom )
    1332             :           acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
    1333             :                       exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
    1334             :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
    1335           0 :                       (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
    1336           0 :           aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
    1337           0 :                       exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
    1338           0 :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
    1339           0 :                       (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
    1340           0 :           call comp_exp( exp_fac, 360._r8*tinv, ncol )
    1341           0 :         rxt(:,k,usr_MACRO2_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
    1342           0 :         rxt(:,k,usr_MACRO2_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
    1343             :        end if
    1344             : !-----------------------------------------------------------------
    1345             : !       ... IEPOXOO_NOn Temp/Pressure Dependent Nitrate Yield
    1346             : !-----------------------------------------------------------------
    1347           0 :        if( usr_IEPOXOO_NOn_ndx > 0 ) then
    1348           0 :           nyield = (1._r8-0.025_r8)/0.025_r8
    1349           0 :           natom = 8.0_r8
    1350           0 :           exp_natom = exp( natom )
    1351             :           acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
    1352             :                       exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
    1353             :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
    1354           0 :                       (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
    1355           0 :           aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
    1356           0 :                       exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
    1357           0 :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
    1358           0 :                       (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
    1359           0 :           call comp_exp( exp_fac, 360._r8*tinv, ncol )
    1360           0 :           rxt(:,k,usr_IEPOXOO_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
    1361           0 :           rxt(:,k,usr_IEPOXOO_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
    1362             :        end if
    1363             : !-----------------------------------------------------------------
    1364             : !       ... ISOPN1DO2_NOn Temp/Pressure Dependent Nitrate Yield
    1365             : !-----------------------------------------------------------------
    1366           0 :        if( usr_ISOPN1DO2_NOn_ndx > 0 ) then
    1367           0 :           nyield = (1._r8-0.084_r8)/0.084_r8
    1368           0 :           natom = 11.0_r8
    1369           0 :           exp_natom = exp( natom )
    1370             :           acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
    1371             :                       exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
    1372             :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
    1373           0 :                       (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
    1374           0 :           aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
    1375           0 :                       exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
    1376           0 :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
    1377           0 :                       (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
    1378           0 :           call comp_exp( exp_fac, 360._r8*tinv, ncol )
    1379           0 :           rxt(:,k,usr_ISOPN1DO2_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
    1380           0 :           rxt(:,k,usr_ISOPN1DO2_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
    1381             :        end if
    1382             : !-----------------------------------------------------------------
    1383             : !       ... ISOPN2BO2_NOn Temp/Pressure Dependent Nitrate Yield
    1384             : !-----------------------------------------------------------------
    1385           0 :        if( usr_ISOPN2BO2_NOn_ndx > 0 ) then
    1386           0 :           nyield = (1._r8-0.065_r8)/0.065_r8
    1387           0 :           natom = 11.0_r8
    1388           0 :           exp_natom = exp( natom )
    1389             :           acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
    1390             :                       exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
    1391             :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
    1392           0 :                       (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
    1393           0 :           aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
    1394           0 :                       exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
    1395           0 :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
    1396           0 :                       (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
    1397           0 :           call comp_exp( exp_fac, 360._r8*tinv, ncol )
    1398           0 :         rxt(:,k,usr_ISOPN2BO2_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
    1399           0 :         rxt(:,k,usr_ISOPN2BO2_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
    1400             :        end if
    1401             : !-----------------------------------------------------------------
    1402             : !       ... ISOPN3BO2_NOn Temp/Pressure Dependent Nitrate Yield
    1403             : !-----------------------------------------------------------------
    1404           0 :        if( usr_ISOPN3BO2_NOn_ndx > 0 ) then
    1405           0 :           nyield = (1._r8-0.053_r8)/0.053_r8
    1406           0 :           natom = 11.0_r8
    1407           0 :           exp_natom = exp( natom )
    1408             :           acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
    1409             :                       exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
    1410             :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
    1411           0 :                       (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
    1412           0 :           aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
    1413           0 :                       exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
    1414           0 :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
    1415           0 :                       (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
    1416           0 :           call comp_exp( exp_fac, 360._r8*tinv, ncol )
    1417           0 :           rxt(:,k,usr_ISOPN3BO2_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
    1418           0 :           rxt(:,k,usr_ISOPN3BO2_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
    1419             :        end if
    1420             : !-----------------------------------------------------------------
    1421             : !       ... ISOPN4DO2_NOn Temp/Pressure Dependent Nitrate Yield
    1422             : !-----------------------------------------------------------------
    1423           0 :        if( usr_ISOPN4DO2_NOn_ndx > 0 ) then
    1424           0 :           nyield = (1._r8-0.165_r8)/0.165_r8
    1425           0 :           natom = 11.0_r8
    1426           0 :           exp_natom = exp( natom )
    1427             :           acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
    1428             :                       exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
    1429             :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
    1430           0 :                       (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
    1431           0 :           aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
    1432           0 :                       exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
    1433           0 :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
    1434           0 :                       (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
    1435           0 :           call comp_exp( exp_fac, 360._r8*tinv, ncol )
    1436           0 :           rxt(:,k,usr_ISOPN4DO2_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
    1437           0 :           rxt(:,k,usr_ISOPN4DO2_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
    1438             :        end if
    1439             : !-----------------------------------------------------------------
    1440             : !       ... ISOPNBNO3O2_NOn Temp/Pressure Dependent Nitrate Yield
    1441             : !-----------------------------------------------------------------
    1442           0 :        if( usr_ISOPNBNO3O2_NOn_ndx > 0 ) then
    1443           0 :           nyield = (1._r8-0.203_r8)/0.203_r8
    1444           0 :           natom = 11.0_r8
    1445           0 :           exp_natom = exp( natom )
    1446             :           acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
    1447             :                       exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
    1448             :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
    1449           0 :                       (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
    1450           0 :           aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
    1451           0 :                       exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
    1452           0 :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
    1453           0 :                       (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
    1454           0 :           call comp_exp( exp_fac, 360._r8*tinv, ncol )
    1455           0 :           rxt(:,k,usr_ISOPNBNO3O2_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
    1456           0 :           rxt(:,k,usr_ISOPNBNO3O2_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
    1457             :        end if
    1458             : !-----------------------------------------------------------------
    1459             : !       ... ISOPNOOHBO2_NOn Temp/Pressure Dependent Nitrate Yield
    1460             : !-----------------------------------------------------------------
    1461           0 :        if( usr_ISOPNOOHBO2_NOn_ndx > 0 ) then
    1462           0 :           nyield = (1._r8-0.141_r8)/0.141_r8
    1463           0 :           natom = 12.0_r8
    1464           0 :           exp_natom = exp( natom )
    1465             :           acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
    1466             :                       exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
    1467             :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
    1468           0 :                       (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
    1469           0 :           aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
    1470           0 :                       exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
    1471           0 :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
    1472           0 :                       (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
    1473           0 :           call comp_exp( exp_fac, 360._r8*tinv, ncol )
    1474           0 :           rxt(:,k,usr_ISOPNOOHBO2_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
    1475           0 :           rxt(:,k,usr_ISOPNOOHBO2_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
    1476             :        end if
    1477             : !-----------------------------------------------------------------
    1478             : !       ... ISOPNOOHDO2_NOn Temp/Pressure Dependent Nitrate Yield
    1479             : !-----------------------------------------------------------------
    1480           0 :        if( usr_ISOPNOOHDO2_NOn_ndx > 0 ) then
    1481           0 :           nyield = (1._r8-0.045_r8)/0.045_r8
    1482           0 :           natom = 12.0_r8
    1483           0 :           exp_natom = exp( natom )
    1484             :           acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
    1485             :                       exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
    1486             :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
    1487           0 :                       (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
    1488           0 :           aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
    1489           0 :                       exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
    1490           0 :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
    1491           0 :                       (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
    1492           0 :           call comp_exp( exp_fac, 360._r8*tinv, ncol )
    1493           0 :           rxt(:,k,usr_ISOPNOOHDO2_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
    1494           0 :           rxt(:,k,usr_ISOPNOOHDO2_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
    1495             :        end if
    1496             : !-----------------------------------------------------------------
    1497             : !       ... NC4CHOO2_NOn Temp/Pressure Dependent Nitrate Yield
    1498             : !-----------------------------------------------------------------
    1499           0 :        if( usr_NC4CHOO2_NOn_ndx > 0 ) then
    1500           0 :           nyield = (1._r8-0.021_r8)/0.021_r8
    1501           0 :           natom = 11.0_r8
    1502           0 :           exp_natom = exp( natom )
    1503             :           acorr = (2.0e-22_r8*exp_natom*2.45e19_r8)/(1._r8+((2.0e-22_r8* &
    1504             :                       exp_natom*2.45e19_r8)/(0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))* &
    1505             :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*2.45e19_r8)/ &
    1506           0 :                       (0.43_r8*(298._r8*(1._r8/293._r8))**8._r8)))**2._r8))
    1507           0 :           aterm(:) = (2.0e-22_r8*exp_natom*m(:,k))/(1._r8+((2.0e-22_r8* &
    1508           0 :                       exp_natom*m(:,k))/(0.43_r8*(298._r8*tinv(:))**8._r8)))* &
    1509           0 :                       0.41_r8**(1._r8/(1._r8+(log10((2.0e-22_r8*exp_natom*m(:,k))/ &
    1510           0 :                       (0.43_r8*(298._r8*tinv(:))**8._r8)))**2._r8))
    1511           0 :           call comp_exp( exp_fac, 360._r8*tinv, ncol )
    1512           0 :           rxt(:,k,usr_NC4CHOO2_NOn_ndx) = 2.7e-12_r8 * exp_fac(:)*aterm(:)/(aterm(:)+acorr*nyield)
    1513           0 :           rxt(:,k,usr_NC4CHOO2_NOa_ndx) = 2.7e-12_r8 * exp_fac(:)*acorr*nyield/(aterm(:)+acorr*nyield)
    1514             :        end if
    1515             : !
    1516             : ! reduced hydrocarbon scheme
    1517             : !
    1518           0 :        if ( usr_C2O3_NO2_ndx > 0 ) then
    1519           0 :           ko(:)   = 2.6e-28_r8 * m(:,k)
    1520           0 :           kinf(:) = 1.2e-11_r8
    1521           0 :           rxt(:,k,usr_C2O3_NO2_ndx) = (ko/(1._r8+ko/kinf)) * 0.6_r8**(1._r8/(1._r8+(log10(ko/kinf))**2))
    1522             :        end if
    1523           0 :        if ( usr_C2O3_XNO2_ndx > 0 ) then
    1524           0 :           ko(:)   = 2.6e-28_r8 * m(:,k)
    1525           0 :           kinf(:) = 1.2e-11_r8
    1526           0 :           rxt(:,k,usr_C2O3_XNO2_ndx) = (ko/(1._r8+ko/kinf)) * 0.6_r8**(1._r8/(1._r8+(log10(ko/kinf))**2))
    1527             :        end if
    1528           0 :        if ( usr_C2H4_OH_ndx > 0 ) then
    1529           0 :           ko(:)   = 1.0e-28_r8 * m(:,k)
    1530           0 :           kinf(:) = 8.8e-12_r8
    1531           0 :           rxt(:,k,usr_C2H4_OH_ndx) = (ko/(1._r8+ko/kinf)) * 0.6_r8**(1._r8/(1._r8+(log(ko/kinf))**2))
    1532             :        end if
    1533           0 :        if ( usr_XO2N_HO2_ndx > 0 ) then
    1534           0 :           rxt(:,k,usr_XO2N_HO2_ndx) = rxt(:,k,tag_XO2N_NO_ndx)*rxt(:,k,tag_XO2_HO2_ndx)/(rxt(:,k,tag_XO2_NO_ndx)+1.e-36_r8)
    1535             :        end if
    1536             : 
    1537             : !
    1538             : ! hydrolysis reactions on wetted aerosols
    1539             : !
    1540             :        if( usr_NO2_aer_ndx > 0 .or. usr_NO3_aer_ndx > 0 .or. usr_N2O5_aer_ndx > 0 .or. usr_HO2_aer_ndx > 0 &
    1541           0 :          .or. usr_GLYOXAL_aer_ndx > 0 ) then
    1542             : 
    1543           0 :           long_loop : do i = 1,ncol
    1544             : 
    1545           0 :              sfc    => sfc_array(i,k,:)
    1546           0 :              dm_aer => dm_array(i,k,:)
    1547             : 
    1548           0 :              c_n2o5 = 1.40e3_r8 * sqrt_t(i)         ! mean molecular speed of n2o5
    1549           0 :              c_no3  = 1.85e3_r8 * sqrt_t(i)         ! mean molecular speed of no3
    1550           0 :              c_no2  = 2.15e3_r8 * sqrt_t(i)         ! mean molecular speed of no2
    1551           0 :              c_ho2  = 2.53e3_r8 * sqrt_t(i)         ! mean molecular speed of ho2
    1552           0 :              c_glyoxal = 1.455e4_r8 * sqrt_t_58(i)  ! mean molecular speed of ho2
    1553           0 :              c_isopnita = 1.20e3_r8 * sqrt_t(i)         ! mean molecular speed of isopnita
    1554           0 :              c_isopnitb = 1.20e3_r8 * sqrt_t(i)         ! mean molecular speed of isopnitb
    1555           0 :              c_onitr    = 1.20e3_r8 * sqrt_t(i)         ! mean molecular speed of onitr
    1556           0 :              c_honitr   = 1.26e3_r8 * sqrt_t(i)         ! mean molecular speed of honitr
    1557           0 :              c_terpnit  = 0.992e3_r8 * sqrt_t(i)        ! mean molecular speed of terpnit
    1558           0 :              c_nterpooh = 0.957e3_r8 * sqrt_t(i)        ! mean molecular speed of nterpooh
    1559           0 :              c_nc4cho   = 1.21e3_r8 * sqrt_t(i)         ! mean molecular speed of nc4cho
    1560           0 :              c_nc4ch2oh = 1.20e3_r8 * sqrt_t(i)         ! mean molecular speed of nc4ch2oh
    1561           0 :              c_isopfdn  = 9.68e2_r8 * sqrt_t(i)         ! mean molecular speed of isopfdn
    1562           0 :              c_isopfnp  = 1.04e3_r8 * sqrt_t(i)         ! mean molecular speed of isopfnp
    1563           0 :              c_isopn2b  = 1.20e3_r8 * sqrt_t(i)         ! mean molecular speed of isopn2
    1564           0 :              c_isopn1d  = 1.20e3_r8 * sqrt_t(i)         ! mean molecular speed of isopn1d
    1565           0 :              c_isopn4d  = 1.20e3_r8 * sqrt_t(i)         ! mean molecular speed of isopn4d
    1566           0 :              c_inoohd   = 1.14e3_r8 * sqrt_t(i)         ! mean molecular speed of inoohd
    1567           0 :              c_inheb    = 1.14e3_r8 * sqrt_t(i)         ! mean molecular speed of inheb
    1568           0 :              c_inhed    = 1.14e3_r8 * sqrt_t(i)         ! mean molecular speed of inhed
    1569           0 :              c_macrn    = 1.19e3_r8 * sqrt_t(i)         ! mean molecular speed of macrn
    1570           0 :              c_isophfp  = 1.19e3_r8 * sqrt_t(i)         ! mean molecular speed of isophfp
    1571           0 :              c_iepox    = 1.34e3_r8 * sqrt_t(i)         ! mean molecular speed of iepox
    1572           0 :              c_dhpmpal  = 1.24e3_r8 * sqrt_t(i)         ! mean molecular speed of dhpmpal
    1573           0 :              c_iche     = 1.35e3_r8 * sqrt_t(i)         ! mean molecular speed of iche
    1574           0 :              c_isopfnc  = 1.04e3_r8 * sqrt_t(i)         ! mean molecular speed of isopfnc
    1575           0 :              c_isopfdnc = 9.72e2_r8 * sqrt_t(i)         ! mean molecular speed of isopfdnc
    1576           0 :              c_terpnt   = 9.92e2_r8 * sqrt_t(i)         ! mean molecular speed of terpnt
    1577           0 :              c_terpnt1  = 9.92e2_r8 * sqrt_t(i)         ! mean molecular speed of terpnt1
    1578           0 :              c_terpnpt  = 9.57e2_r8 * sqrt_t(i)         ! mean molecular speed of terpnpt
    1579           0 :              c_terpnpt1 = 9.57e2_r8 * sqrt_t(i)         ! mean molecular speed of terpnpt1
    1580           0 :              c_terpfdn  = 8.48e2_r8 * sqrt_t(i)         ! mean molecular speed of terpfdn
    1581           0 :              c_sqtn     = 8.64e2_r8 * sqrt_t(i)         ! mean molecular speed of sqtn
    1582           0 :              c_terphfn  = 8.93e2_r8 * sqrt_t(i)         ! mean molecular speed of terphfn
    1583           0 :              c_terpdhdp = 9.47e2_r8 * sqrt_t(i)         ! mean molecular speed of terpdhdp
    1584           0 :              c_terpacid = 1.07e3_r8 * sqrt_t(i)         ! mean molecular speed of terpacid
    1585             :              !-------------------------------------------------------------------------
    1586             :              !  Heterogeneous reaction rates for uptake of a gas on an aerosol:
    1587             :              !    rxt = sfc / ( (rad_aer/Dg_gas) + (4/(c_gas*gamma_gas)))
    1588             :              !-------------------------------------------------------------------------
    1589             :              !-------------------------------------------------------------------------
    1590             :              !  ... n2o5 -> 2 hno3  (on sulfate, nh4no3, oc2, soa)
    1591             :              !-------------------------------------------------------------------------
    1592           0 :              if( usr_N2O5_aer_ndx > 0 ) then
    1593           0 :                 rxt(i,k,usr_N2O5_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_n2o5, gamma_n2o5 )
    1594             :              end if
    1595           0 :              if( usr_XNO2NO3_aer_ndx > 0 ) then
    1596           0 :                 rxt(i,k,usr_XNO2NO3_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_n2o5, gamma_n2o5 )
    1597             :              end if
    1598           0 :              if( usr_NO2XNO3_aer_ndx > 0 ) then
    1599           0 :                 rxt(i,k,usr_NO2XNO3_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_n2o5, gamma_n2o5 )
    1600             :              end if
    1601             :              !-------------------------------------------------------------------------
    1602             :              !  ... no3 -> hno3  (on sulfate, nh4no3, oc, soa)
    1603             :              !-------------------------------------------------------------------------
    1604           0 :              if( usr_NO3_aer_ndx > 0 ) then
    1605           0 :                 rxt(i,k,usr_NO3_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_no3, gamma_no3 )
    1606             :              end if
    1607           0 :              if( usr_XNO3_aer_ndx > 0 ) then
    1608           0 :                 rxt(i,k,usr_XNO3_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_no3, gamma_no3 )
    1609             :              end if
    1610             :              !-------------------------------------------------------------------------
    1611             :              !  ... no2 -> 0.5 * (ho+no+hno3)  (on sulfate, nh4no3, oc2, soa)
    1612             :              !-------------------------------------------------------------------------
    1613           0 :              if( usr_NO2_aer_ndx > 0 ) then
    1614           0 :                 rxt(i,k,usr_NO2_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_no2, gamma_no2 )
    1615             :              end if
    1616           0 :              if( usr_XNO2_aer_ndx > 0 ) then
    1617           0 :                 rxt(i,k,usr_XNO2_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_no2, gamma_no2 )
    1618             :              end if
    1619             : 
    1620             :              !-------------------------------------------------------------------------
    1621             :              !  ... ho2 -> 0.5 * h2o2  (on sulfate, nh4no3, oc2, soa)
    1622             :              !-------------------------------------------------------------------------
    1623           0 :              if( usr_HO2_aer_ndx > 0 ) then
    1624           0 :                 rxt(i,k,usr_HO2_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_ho2, gamma_ho2 )
    1625             :              end if
    1626             :              !-------------------------------------------------------------------------
    1627             :              !  ... glyoxal ->  soag1  (on sulfate, nh4no3, oc2, soa)
    1628             :              ! first order uptake, Fuchs and Sutugin, 1971,  dCg = 1/4 * gamma * ! A * |v_mol| * Cg * dt
    1629             :              !-------------------------------------------------------------------------
    1630           0 :              if( usr_GLYOXAL_aer_ndx > 0 ) then
    1631           0 :                 rxt(i,k,usr_GLYOXAL_aer_ndx) = hetrxtrate_gly( sfc, c_glyoxal, gamma_glyoxal )
    1632             :              end if
    1633             :              !-------------------------------------------------------------------------
    1634             :              !  ... ISOPNITA -> HNO3  (on sulfate, nh4no3, oc2, soa)
    1635             :              !-------------------------------------------------------------------------
    1636           0 :              if( usr_ISOPNITA_aer_ndx > 0 ) then
    1637           0 :                 rxt(i,k,usr_ISOPNITA_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_isopnita, gamma_isopnita )
    1638             :              end if
    1639             :              !-------------------------------------------------------------------------
    1640             :              !  ... ISOPNITB -> HNO3  (on sulfate, nh4no3, oc2, soa)
    1641             :              !-------------------------------------------------------------------------
    1642           0 :              if( usr_ISOPNITB_aer_ndx > 0 ) then
    1643           0 :                 rxt(i,k,usr_ISOPNITB_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_isopnitb, gamma_isopnitb )
    1644             :              end if
    1645             :              !-------------------------------------------------------------------------
    1646             :              !  ...  ONITR -> HNO3 (on sulfate, nh4no3, oc2, soa)
    1647             :              !-------------------------------------------------------------------------
    1648           0 :              if( usr_ONITR_aer_ndx > 0 ) then
    1649           0 :                 rxt(i,k,usr_ONITR_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_onitr, gamma_onitr )
    1650             :              end if
    1651             :              !-------------------------------------------------------------------------
    1652             :              !  ... HONITR -> HNO3  (on sulfate, nh4no3, oc2, soa)
    1653             :              !-------------------------------------------------------------------------
    1654           0 :              if( usr_HONITR_aer_ndx > 0 ) then
    1655           0 :                 rxt(i,k,usr_HONITR_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_honitr, gamma_honitr )
    1656             :              end if
    1657             :              !-------------------------------------------------------------------------
    1658             :              !  ... TERPNIT -> HNO3  (on sulfate, nh4no3, oc2, soa)
    1659             :              !-------------------------------------------------------------------------
    1660           0 :              if( usr_TERPNIT_aer_ndx > 0 ) then
    1661           0 :                 rxt(i,k,usr_TERPNIT_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_terpnit, gamma_terpnit )
    1662             :              end if
    1663             :              !-------------------------------------------------------------------------
    1664             :              !  ...  NTERPOOH -> HNO3 (on sulfate, nh4no3, oc2, soa)
    1665             :              !-------------------------------------------------------------------------
    1666           0 :              if( usr_NTERPOOH_aer_ndx > 0 ) then
    1667           0 :                 rxt(i,k,usr_NTERPOOH_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_nterpooh, gamma_nterpooh )
    1668             :              end if
    1669             :              !-------------------------------------------------------------------------
    1670             :              !  ...  NC4CHO -> HNO3 (on sulfate, nh4no3, oc2, soa)
    1671             :              !-------------------------------------------------------------------------
    1672           0 :              if( usr_NC4CHO_aer_ndx > 0 ) then
    1673           0 :                 rxt(i,k,usr_NC4CHO_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_nc4cho, gamma_nc4cho )
    1674             :              end if
    1675             :              !-------------------------------------------------------------------------
    1676             :              !  ...  NC4CH2OH -> HNO3 (on sulfate, nh4no3, oc2, soa)
    1677             :              !-------------------------------------------------------------------------
    1678           0 :              if( usr_NC4CH2OH_aer_ndx > 0 ) then
    1679           0 :                 rxt(i,k,usr_NC4CH2OH_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_nc4ch2oh, gamma_nc4ch2oh )
    1680             :              end if
    1681             :              !-------------------------------------------------------------------------
    1682             :              !  ...  ISOPFDN -> HNO3 (on sulfate, nh4no3, oc2, soa)
    1683             :              !-------------------------------------------------------------------------
    1684           0 :              if( usr_ISOPFDN_aer_ndx > 0 ) then
    1685           0 :                 rxt(i,k,usr_ISOPFDN_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_isopfdn, gamma_isopfdn )
    1686             :              end if
    1687             :              !-------------------------------------------------------------------------
    1688             :              !  ...  ISOPFNP ->  (on sulfate, nh4no3, oc2, soa)
    1689             :              !-------------------------------------------------------------------------
    1690           0 :              if( usr_ISOPFNP_aer_ndx > 0 ) then
    1691           0 :                 rxt(i,k,usr_ISOPFNP_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_isopfnp, gamma_isopfnp )
    1692             :              end if
    1693             :              !-------------------------------------------------------------------------
    1694             :              !  ...  ISOPN2B -> HNO3 (on sulfate, nh4no3, oc2, soa)
    1695             :              !-------------------------------------------------------------------------
    1696           0 :              if( usr_ISOPN2B_aer_ndx > 0 ) then
    1697           0 :                 rxt(i,k,usr_ISOPN2B_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_isopn2b, gamma_isopn2b )
    1698             :              end if
    1699             :              !-------------------------------------------------------------------------
    1700             :              !  ...  ISOPN1D -> HNO3 (on sulfate, nh4no3, oc2, soa)
    1701             :              !-------------------------------------------------------------------------
    1702           0 :              if( usr_ISOPN1D_aer_ndx > 0 ) then
    1703           0 :                 rxt(i,k,usr_ISOPN1D_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_isopn1d, gamma_isopn1d )
    1704             :              end if
    1705             :              !-------------------------------------------------------------------------
    1706             :              !  ...  ISOPN4D -> HNO3 (on sulfate, nh4no3, oc2, soa)
    1707             :              !-------------------------------------------------------------------------
    1708           0 :              if( usr_ISOPN4D_aer_ndx > 0 ) then
    1709           0 :                 rxt(i,k,usr_ISOPN4D_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_isopn4d, gamma_isopn4d )
    1710             :              end if
    1711             :              !-------------------------------------------------------------------------
    1712             :              !  ...  INOOHD -> HNO3 (on sulfate, nh4no3, oc2, soa)
    1713             :              !-------------------------------------------------------------------------
    1714           0 :              if( usr_INOOHD_aer_ndx > 0 ) then
    1715           0 :                 rxt(i,k,usr_INOOHD_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_inoohd, gamma_inoohd )
    1716             :              end if
    1717             :              !-------------------------------------------------------------------------
    1718             :              !  ...  INHEB -> HNO3 (on sulfate, nh4no3, oc2, soa)
    1719             :              !-------------------------------------------------------------------------
    1720           0 :              if( usr_INHEB_aer_ndx > 0 ) then
    1721           0 :                 rxt(i,k,usr_INHEB_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_inheb, gamma_inheb )
    1722             :              end if
    1723             :              !-------------------------------------------------------------------------
    1724             :              !  ...  INHED -> HNO3 (on sulfate, nh4no3, oc2, soa)
    1725             :              !-------------------------------------------------------------------------
    1726           0 :              if( usr_INHED_aer_ndx > 0 ) then
    1727           0 :                 rxt(i,k,usr_INHED_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_inhed, gamma_inhed )
    1728             :              end if
    1729             :              !-------------------------------------------------------------------------
    1730             :              !  ...  MACRN -> HNO3 (on sulfate, nh4no3, oc2, soa)
    1731             :              !-------------------------------------------------------------------------
    1732           0 :              if( usr_MACRN_aer_ndx > 0 ) then
    1733           0 :                 rxt(i,k,usr_MACRN_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_macrn, gamma_macrn )
    1734             :              end if
    1735             :              !-------------------------------------------------------------------------
    1736             :              !  ...  ISOPHFP ->  (on sulfate, nh4no3, oc2, soa)
    1737             :              !-------------------------------------------------------------------------
    1738           0 :              if( usr_ISOPHFP_aer_ndx > 0 ) then
    1739           0 :                 rxt(i,k,usr_ISOPHFP_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_isophfp, gamma_isophfp )
    1740             :              end if
    1741             :              !-------------------------------------------------------------------------
    1742             :              !  ...  IEPOX ->  (on sulfate, nh4no3, oc2, soa)
    1743             :              !-------------------------------------------------------------------------
    1744           0 :              if( usr_IEPOX_aer_ndx > 0 ) then
    1745           0 :                 rxt(i,k,usr_IEPOX_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_iepox, gamma_iepox )
    1746             :              end if
    1747             :              !-------------------------------------------------------------------------
    1748             :              !  ...  DHPMPAL ->  (on sulfate, nh4no3, oc2, soa)
    1749             :              !-------------------------------------------------------------------------
    1750           0 :              if( usr_DHPMPAL_aer_ndx > 0 ) then
    1751           0 :                 rxt(i,k,usr_DHPMPAL_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_dhpmpal, gamma_dhpmpal )
    1752             :              end if
    1753             :              !-------------------------------------------------------------------------
    1754             :              !  ...  ICHE ->  (on sulfate, nh4no3, oc2, soa)
    1755             :              !-------------------------------------------------------------------------
    1756           0 :              if( usr_ICHE_aer_ndx > 0 ) then
    1757           0 :                 rxt(i,k,usr_ICHE_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_iche, gamma_iche )
    1758             :              end if
    1759             :              !-------------------------------------------------------------------------
    1760             :              !  ...  ISOPFNC ->  (on sulfate, nh4no3, oc2, soa)
    1761             :              !-------------------------------------------------------------------------
    1762           0 :              if( usr_ISOPFNC_aer_ndx > 0 ) then
    1763           0 :                 rxt(i,k,usr_ISOPFNC_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_isopfnc, gamma_isopfnc )
    1764             :              end if
    1765             :              !-------------------------------------------------------------------------
    1766             :              !  ...  ISOPFDNC ->  (on sulfate, nh4no3, oc2, soa)
    1767             :              !-------------------------------------------------------------------------
    1768           0 :              if( usr_ISOPFDNC_aer_ndx > 0 ) then
    1769           0 :                 rxt(i,k,usr_ISOPFDNC_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_isopfdnc, gamma_isopfdnc )
    1770             :              end if
    1771             :              !-------------------------------------------------------------------------
    1772             :              !  ...  TERPNT -> HNO3 (on sulfate, nh4no3, oc2, soa)
    1773             :              !-------------------------------------------------------------------------
    1774           0 :              if( usr_TERPNT_aer_ndx > 0 ) then
    1775           0 :                 rxt(i,k,usr_TERPNT_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_terpnt, gamma_terpnt )
    1776             :              end if
    1777             :              !-------------------------------------------------------------------------
    1778             :              !  ...  TERPNT1 -> HNO3 (on sulfate, nh4no3, oc2, soa)
    1779             :              !-------------------------------------------------------------------------
    1780           0 :              if( usr_TERPNT1_aer_ndx > 0 ) then
    1781           0 :                 rxt(i,k,usr_TERPNT1_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_terpnt1, gamma_terpnt1 )
    1782             :              end if
    1783             :              !-------------------------------------------------------------------------
    1784             :              !  ...  TERPNPT -> HNO3 (on sulfate, nh4no3, oc2, soa)
    1785             :              !-------------------------------------------------------------------------
    1786           0 :              if( usr_TERPNPT_aer_ndx > 0 ) then
    1787           0 :                 rxt(i,k,usr_TERPNPT_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_terpnpt, gamma_terpnpt )
    1788             :              end if
    1789             :              !-------------------------------------------------------------------------
    1790             :              !  ...  TERPNPT1 -> HNO3 (on sulfate, nh4no3, oc2, soa)
    1791             :              !-------------------------------------------------------------------------
    1792           0 :              if( usr_TERPNPT1_aer_ndx > 0 ) then
    1793           0 :                 rxt(i,k,usr_TERPNPT1_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_terpnpt1, gamma_terpnpt1 )
    1794             :              end if
    1795             :              !-------------------------------------------------------------------------
    1796             :              !  ...  TERPFDN -> HNO3 (on sulfate, nh4no3, oc2, soa)
    1797             :              !-------------------------------------------------------------------------
    1798           0 :              if( usr_TERPFDN_aer_ndx > 0 ) then
    1799           0 :                 rxt(i,k,usr_TERPFDN_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_terpfdn, gamma_terpfdn )
    1800             :              end if
    1801             :              !-------------------------------------------------------------------------
    1802             :              !  ...  SQTN ->  (on sulfate, nh4no3, oc2, soa)
    1803             :              !-------------------------------------------------------------------------
    1804           0 :              if( usr_SQTN_aer_ndx > 0 ) then
    1805           0 :                 rxt(i,k,usr_SQTN_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_sqtn, gamma_sqtn )
    1806             :              end if
    1807             :              !-------------------------------------------------------------------------
    1808             :              !  ...  TERPHFN ->  (on sulfate, nh4no3, oc2, soa)
    1809             :              !-------------------------------------------------------------------------
    1810           0 :              if( usr_TERPHFN_aer_ndx > 0 ) then
    1811           0 :                 rxt(i,k,usr_TERPHFN_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_terphfn, gamma_terphfn )
    1812             :              end if
    1813             :              !-------------------------------------------------------------------------
    1814             :              !  ...  TERPDHDP ->  (on sulfate, nh4no3, oc2, soa)
    1815             :              !-------------------------------------------------------------------------
    1816           0 :              if( usr_TERPDHDP_aer_ndx > 0 ) then
    1817           0 :                 rxt(i,k,usr_TERPDHDP_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_terpdhdp, gamma_terpdhdp )
    1818             :              end if
    1819             :              !-------------------------------------------------------------------------
    1820             :              !  ...  TERPACID ->  (on sulfate, nh4no3, oc2, soa)
    1821             :              !-------------------------------------------------------------------------
    1822           0 :              if( usr_TERPACID_aer_ndx > 0 ) then
    1823           0 :                 rxt(i,k,usr_TERPACID_aer_ndx) = hetrxtrate( sfc, dm_aer, dg, c_terpacid, gamma_terpacid )
    1824             :              end if
    1825             : 
    1826             :           end do long_loop
    1827             :        end if
    1828             : 
    1829             :        ! LLNL super fast chem reaction rates
    1830             : 
    1831             :        !-----------------------------------------------------------------------
    1832             :        !     ... CO + OH --> CO2 + HO2
    1833             :        !-----------------------------------------------------------------------
    1834           0 :        if ( usr_oh_co_ndx > 0 ) then
    1835           0 :           ko(:)     = 5.9e-33_r8 * tp(:)**1.4_r8
    1836           0 :           kinf(:)   = 1.1e-12_r8 * (temp(:ncol,k) / 300._r8)**1.3_r8
    1837           0 :           ko_m(:)   = ko(:) * m(:,k)
    1838           0 :           k0(:)     = 1.5e-13_r8 * (temp(:ncol,k) / 300._r8)**0.6_r8
    1839           0 :           kinf_m(:) = (2.1e+09_r8 * (temp(:ncol,k) / 300._r8)**6.1_r8) / m(:,k)
    1840           0 :           rxt(:,k,usr_oh_co_ndx) = (ko_m(:)/(1._r8+(ko_m(:)/kinf(:)))) * &
    1841           0 :                0.6_r8**(1._r8/(1._r8+(log10(ko_m(:)/kinf(:)))**2._r8)) + &
    1842           0 :                (k0(:)/(1._r8+(k0(:)/kinf_m(:)))) * &
    1843           0 :                0.6_r8**(1._r8/(1._r8+(log10(k0(:)/kinf_m(:)))**2._r8))
    1844             :        endif
    1845             :        !-----------------------------------------------------------------------
    1846             :        !     ... NO2 + H2O --> 0.5 HONO + 0.5 HNO3
    1847             :        !-----------------------------------------------------------------------
    1848           0 :        if ( het_no2_h2o_ndx > 0 ) then
    1849           0 :           rxt(:,k,het_no2_h2o_ndx) = 4.0e-24_r8
    1850             :        endif
    1851             :        !-----------------------------------------------------------------------
    1852             :        !     ... DMS + OH --> 0.75 SO2 + 0.25 MSA
    1853             :        !-----------------------------------------------------------------------
    1854           0 :        if ( usr_oh_dms_ndx > 0 ) then
    1855           0 :           o2(:ncol) = invariants(:ncol,k,inv_o2_ndx)
    1856           0 :           rxt(:,k,usr_oh_dms_ndx) = 2.000e-10_r8 * exp(5820.0_r8 * tinv(:)) / &
    1857           0 :                ((2.000e29_r8 / o2(:)) + exp(6280.0_r8 * tinv(:)))
    1858             :        endif
    1859           0 :        if ( aq_so2_h2o2_ndx > 0 .or. aq_so2_o3_ndx > 0 ) then
    1860           0 :           lwc(:) = cwat(:ncol,k) * invariants(:ncol,k,inv_m_ndx) * mbar(:ncol,k) /avo !PJC convert kg/kg to g/cm3
    1861             :           !-----------------------------------------------------------------------
    1862             :           !     ... SO2 + H2O2 --> S(VI)
    1863             :           !-----------------------------------------------------------------------
    1864           0 :           if ( aq_so2_h2o2_ndx > 0 ) then
    1865           0 :              rxt(:,k,aq_so2_h2o2_ndx) = lwc(:) * 1.0e-03_r8 * avo * &
    1866             :                   K_AQ * &
    1867             : 
    1868           0 :                   exp(ER_AQ * ((1.0e+00_r8 / 298.0e+00_r8) - tinv(:))) * &
    1869             :                   HENRY298_SO2 * &
    1870             :                   K298_SO2_HSO3 * &
    1871             :                   HENRY298_H2O2 * &
    1872             :                   exp(((H298_SO2 + H298_SO2_HSO3 + H298_H2O2) / R_CAL) * &
    1873           0 :                   ((1.0e+00_r8 / 298.0e+00_r8) - tinv(:))) * &
    1874           0 :                   (R_CONC * temp(:ncol,k))**2.0e+00_r8 / &
    1875             : 
    1876           0 :                   (1.0e+00_r8 + 13.0e+00_r8 * 10.0e+00_r8**(-pH))
    1877             :           endif
    1878             :           !-----------------------------------------------------------------------
    1879             :           !     ... SO2 + O3 --> S(VI)
    1880             :           !-----------------------------------------------------------------------
    1881           0 :           if (aq_so2_o3_ndx >0) then
    1882           0 :              rxt(:,k,aq_so2_o3_ndx) = lwc(:) * 1.0e-03_r8 * avo * &
    1883             :                   HENRY298_SO2 * exp((H298_SO2 / R_CAL) * &
    1884           0 :                   ((1.0e+00_r8 / 298.0e+00_r8) - tinv(:))) * &
    1885             :                   (K0_AQ * exp(ER0_AQ * &
    1886           0 :                   ((1.0e+00_r8 / 298.0e+00_r8) - tinv(:))) + &
    1887             :                   K298_SO2_HSO3 * exp((H298_SO2_HSO3 / R_CAL) * &
    1888           0 :                   ((1.0e+00_r8 / 298.0e+00_r8) - tinv(:))) * &
    1889             :                   (K1_AQ * exp(ER1_AQ * &
    1890           0 :                   ((1.0e+00_r8 / 298.0e+00_r8) - tinv(:))) / &
    1891             :                   10.0e+00_r8**(-pH) + K2_AQ * exp(ER2_AQ * &
    1892           0 :                   ((1.0e+00_r8 / 298.0e+00_r8) - tinv(:))) * &
    1893             :                   K298_HSO3_SO3 * exp((H298_HSO3_SO3 / R_CAL) * &
    1894           0 :                   ((1.0e+00_r8 / 298.0e+00_r8) - tinv(:))) / &
    1895             :                   (10.0e+00_r8**(-pH))**2.0e+00_r8) ) * &
    1896             :                   HENRY298_O3 * exp((H298_O3 / R_CAL) * &
    1897           0 :                   ((1.0e+00_r8 / 298.0e+00_r8) - tinv(:))) * &
    1898           0 :                   (R_CONC * temp(:ncol,k))**2.0e+00_r8
    1899             :           endif
    1900             :        endif
    1901             : 
    1902           0 :     if ( has_d_chem ) then
    1903             : 
    1904           0 :         call comp_exp( exp_fac, -600._r8 * tinv, ncol )
    1905           0 :         rxt(:,k,ean_ndx(1))  = 1.e-31_r8 * tp(:) * exp_fac(:)
    1906           0 :         rxt(:,k,ean_ndx(2))  = 9.1e-12_r8 * tp(:)**(-1.46_r8)
    1907           0 :         call comp_exp( exp_fac, -193._r8 * tinv, ncol )
    1908           0 :         rxt(:,k,ean_ndx(3))  = (4.e-30_r8 * exp_fac(:)) * 0.21_r8
    1909             : 
    1910           0 :         rxt(:,k,rpe_ndx(1))  = 4.2e-6_r8 * tp(:)**0.5_r8
    1911           0 :         rxt(:,k,rpe_ndx(2))  = 6.3e-7_r8 * tp(:)**0.5_r8
    1912           0 :         rxt(:,k,rpe_ndx(3))  = 2.5e-6_r8 * tp(:)**0.1_r8
    1913           0 :         rxt(:,k,rpe_ndx(4))  = 2.48e-6_r8 * tp(:)**0.76_r8
    1914           0 :         rxt(:,k,rpe_ndx(5))  = 1.4e-6_r8 * tp(:)**0.4_r8
    1915             : 
    1916           0 :         rxt(:,k,pir_ndx(1)) = 4.e-30_r8 * tp(:)**2.93_r8
    1917           0 :         rxt(:,k,pir_ndx(2))  = 4.6e-27_r8 * tp(:)**4._r8
    1918             : 
    1919           0 :         call comp_exp( exp_fac, -15900._r8 * tinv, ncol )
    1920           0 :         rxt(:,k,pir_ndx(3))  = (2.5e-2_r8 * tp(:)**5._r8) * exp_fac(:)
    1921           0 :         rxt(:,k,pir_ndx(4))  = 2.3e-27_r8 * tp(:)**7.5_r8
    1922             : 
    1923           0 :         call comp_exp( exp_fac, -10272._r8 * tinv, ncol )
    1924           0 :         rxt(:,k,pir_ndx(5))  = (2.6e-3_r8 * tp(:)**8.5_r8) * exp_fac(:)
    1925           0 :         rxt(:,k,pir_ndx(6))  = 3.6e-27_r8 * tp(:)**8.1_r8
    1926             : 
    1927           0 :         call comp_exp( exp_fac, -9000._r8 * tinv, ncol )
    1928           0 :         rxt(:,k,pir_ndx(7))  = (1.5e-1_r8 * tp(:)**9.1_r8) * exp_fac(:)
    1929           0 :         rxt(:,k,pir_ndx(8))  = 4.6e-28_r8 * tp(:)**14._r8
    1930             : 
    1931           0 :         call comp_exp( exp_fac, -6400._r8 * tinv, ncol )
    1932           0 :         rxt(:,k,pir_ndx(9))  = (1.7e-3_r8 * tp(:)**15._r8) * exp_fac(:)
    1933           0 :         rxt(:,k,pir_ndx(10)) = 1.35e-28_r8 * tp(:)**2.83_r8
    1934             : 
    1935           0 :         rxt(:,k,pir_ndx(11)) = 1.e-27_r8 * (308._r8 * tinv(:))**4.7_r8
    1936           0 :         rxt(:,k,pir_ndx(12)) = rxt(:,k,pir_ndx(11))
    1937           0 :         rxt(:,k,pir_ndx(13)) = 1.4e-29_r8 * tp(:)**4._r8
    1938             : 
    1939           0 :         call comp_exp( exp_fac, -3872._r8 * tinv, ncol )
    1940           0 :         rxt(:,k,pir_ndx(14)) = (3.4e-7_r8 * tp(:)**5._r8) * exp_fac(:)
    1941             : 
    1942           0 :         rxt(:,k,pir_ndx(15)) = 3.0e-31_r8 * tp(:)**4.3_r8
    1943           0 :         call comp_exp( exp_fac, -2093._r8 * tinv, ncol )
    1944           0 :         rxt(:,k,pir_ndx(16)) = (1.5e-8_r8 * tp(:)**4.3_r8) * exp_fac(:)
    1945             : 
    1946           0 :         rxt(:,k,edn_ndx(1)) = 3.1e-10_r8 * tp(:)**0.83_r8
    1947           0 :         call comp_exp( exp_fac, -4990._r8 * tinv, ncol )
    1948           0 :         rxt(:,k,edn_ndx(2)) = (1.9e-12_r8 * tp(:)**(-1.5_r8)) * exp_fac(:)
    1949             : 
    1950           0 :         rxt(:,k,nir_ndx(1)) = 1.05e-12_r8 * tp(:)**2.15_r8
    1951           0 :         rxt(:,k,nir_ndx(2)) = 2.5e-11_r8 * tp(:)**0.79_r8
    1952           0 :         rxt(:,k,nir_ndx(3)) = 7.5e-11_r8 * tp(:)**0.79_r8
    1953           0 :         rxt(:,k,nir_ndx(4)) = rxt(:,k,nir_ndx(1))
    1954           0 :         rxt(:,k,nir_ndx(5)) = 1.3e-11_r8 * tp(:)**1.64_r8
    1955           0 :         rxt(:,k,nir_ndx(6)) = 3.3e-11_r8 * tp(:)**2.38_r8
    1956             : 
    1957           0 :         call comp_exp( exp_fac, -7300_r8 * tinv, ncol )
    1958           0 :         rxt(:,k,nir_ndx(7)) = (1.0e-3_r8 * tp(:)) * exp_fac(:)
    1959           0 :         call comp_exp( exp_fac, -7050_r8 * tinv, ncol )
    1960           0 :         rxt(:,k,nir_ndx(8)) = (7.2e-4_r8 * tp(:)) * exp_fac(:)
    1961           0 :         call comp_exp( exp_fac, -6800_r8 * tinv, ncol )
    1962           0 :         rxt(:,k,nir_ndx(9)) = (6.5e-3_r8 * tp(:)) * exp_fac(:)
    1963           0 :         call comp_exp( exp_fac, -7600_r8 * tinv, ncol )
    1964           0 :         rxt(:,k,nir_ndx(10)) = (5.7e-4_r8 * tp(:)) * exp_fac(:)
    1965             : 
    1966           0 :         call comp_exp( exp_fac, -7150_r8 * tinv, ncol )
    1967           0 :         rxt(:,k,nir_ndx(11)) = (1.5e-2_r8 * tp(:)) * exp_fac(:)
    1968             : 
    1969           0 :         call comp_exp( exp_fac, -13130_r8 * tinv, ncol )
    1970           0 :         rxt(:,k,nir_ndx(12)) = (6.0e-3_r8 * tp(:)) * exp_fac(:)
    1971           0 :         rxt(:,k,nir_ndx(13)) = 5.22e-28_r8 * tp(:)**2.62_r8
    1972             : 
    1973           0 :         rxt(:,k,iira_ndx(1)) = 6.0e-8_r8 * tp(:)**.5_r8
    1974           0 :         do i = 2,niira
    1975           0 :           rxt(:,k,iira_ndx(i)) = rxt(:,k,iira_ndx(i-1))
    1976             :         enddo
    1977             : 
    1978           0 :         rxt(:,k,iirb_ndx(1)) = 1.25e-25_r8 * tp(:)**4._r8
    1979           0 :         do i = 2,niirb
    1980           0 :           rxt(:,k,iirb_ndx(i)) = rxt(:,k,iirb_ndx(i-1))
    1981             :         enddo
    1982             : 
    1983           0 :         call comp_exp( exp_fac, -6600._r8 * tinv, ncol )
    1984           0 :         rxt(:,k,usr_clm_h2o_m_ndx) = 2.e-8_r8 * exp_fac(:)
    1985             : 
    1986           0 :         call comp_exp( exp_fac, -11926._r8 * tinv, ncol )
    1987           0 :         rxt(:,k,usr_clm_hcl_m_ndx) =  tinv(:) * exp_fac(:)
    1988             : 
    1989             :      endif
    1990             :     end do level_loop
    1991             : 
    1992             : !-----------------------------------------------------------------
    1993             : !       ... the ionic rates
    1994             : !-----------------------------------------------------------------
    1995           0 :     if ( has_ion_rxts ) then
    1996           0 :        level_loop2 : do k = 1,pver
    1997           0 :            tp(:ncol)         = (2._r8*tempi(:ncol,k) + temp(:ncol,k)) / ( 3._r8 * t0 )
    1998           0 :            tp(:)             = max( min( tp(:),20._r8 ),1._r8 )
    1999           0 :            rxt(:,k,ion1_ndx) = 2.82e-11_r8 + tp(:)*(-7.74e-12_r8 + tp(:)*(1.073e-12_r8  &
    2000           0 :                          + tp(:)*(-5.17e-14_r8 + 9.65e-16_r8*tp(:))))
    2001           0 :            tp(:ncol)         = (.6363_r8*tempi(:ncol,k) + .3637_r8*temp(:ncol,k)) / t0
    2002           0 :            tp(:)             = max( min( tp(:),trlim2 ),1._r8 )
    2003           0 :            rxt(:,k,ion2_ndx) = 1.533e-12_r8 + tp(:)*(-5.92e-13_r8 + tp(:)*8.6e-14_r8)
    2004           0 :            tp(:ncol)         = 2._r8 * t0 /(tempi(:ncol,k) + temp(:ncol,k))
    2005           0 :            where( tp(:ncol) < trlim3 )
    2006           0 :                   rxt(:,k,ion3_ndx)  = 1.4e-10_r8 * tp(:)**.44_r8
    2007           0 :                   rxt(:,k,ion11_ndx) = 1.e-11_r8 * tp(:)**.23_r8
    2008             :            elsewhere
    2009           0 :                   rxt(:,k,ion3_ndx)  = 5.2e-11_r8 / tp(:)**.2_r8
    2010           0 :               rxt(:,k,ion11_ndx) = 3.6e-12_r8 / tp(:)**.41_r8
    2011             :            end where
    2012           0 :            tp(:ncol)          = t0 / tempe(:ncol,k)
    2013           0 :            rxt(:,k,elec1_ndx) = 4.e-7_r8 * tp(:)**.85_r8
    2014           0 :            rxt(:,k,elec3_ndx) = 1.8e-7_r8 * tp(:)**.39_r8
    2015           0 :            where( tp(:ncol) < 4._r8 )
    2016           0 :               rxt(:,k,elec2_ndx) = 2.7e-7_r8 * tp(:)**.7_r8
    2017             :            elsewhere
    2018           0 :               rxt(:,k,elec2_ndx) = 1.6e-7_r8 * tp(:)**.55_r8
    2019             :            end where
    2020             :         end do level_loop2
    2021             :      endif
    2022             : 
    2023             :      ! quenching of O+(2P) and O+(2D) by e to produce O+
    2024             :      ! See TABLE 1 of Roble (1995)
    2025             :      ! drm 2015-07-27
    2026           0 :      if (elec4_ndx > 0 .and. elec5_ndx > 0 .and. elec6_ndx > 0) then
    2027           0 :          do k=1,pver
    2028           0 :             tp(:ncol)          = sqrt(300._r8 / tempe(:ncol,k))
    2029           0 :             rxt(:,k,elec4_ndx) = 1.5e-7_r8 * tp(:)
    2030           0 :             rxt(:,k,elec5_ndx) = 4.0e-8_r8 * tp(:)
    2031           0 :             rxt(:,k,elec6_ndx) = 6.6e-8_r8 * tp(:)
    2032             :          end do
    2033             :      endif
    2034             : 
    2035             : !-----------------------------------------------------------------
    2036             : !       ... tropospheric "aerosol" rate constants
    2037             : !-----------------------------------------------------------------
    2038           0 :      if ( het1_ndx > 0 .AND. (.NOT. usr_N2O5_aer_ndx > 0) ) then
    2039           0 :          amas = 4._r8*pi*rm1**3*den/3._r8            ! each mean particle(r=0.1u) mass (g)
    2040           0 :          do k = 1,pver
    2041             : !-------------------------------------------------------------------------
    2042             : !       ... estimate humidity effect on aerosols (from Shettle and Fenn, 1979)
    2043             : !           xr is a factor of the increase aerosol radii with hum (hum=0., factor=1)
    2044             : !-------------------------------------------------------------------------
    2045           0 :             xr(:)     = .999151_r8 + relhum(:ncol,k)*(1.90445_r8 + relhum(:ncol,k)*(-6.35204_r8 + relhum(:ncol,k)*5.32061_r8))
    2046             : !-------------------------------------------------------------------------
    2047             : !       ... estimate sulfate particles surface area (cm2/cm3) in each grid
    2048             : !-------------------------------------------------------------------------
    2049           0 :             if ( carma_hetchem_feedback ) then
    2050           0 :                sur(:ncol) = strato_sad(:ncol,k)
    2051             :             else
    2052           0 :                sur(:) = sulfate(:,k)*m(:,k)/avo*wso4 &              ! xform mixing ratio to g/cm3
    2053             :                         / amas &                                    ! xform g/cm3 to num particles/cm3
    2054             :                         * fare &                                    ! xform num particles/cm3 to cm2/cm3
    2055           0 :                         * xr(:)*xr(:)                               ! humidity factor
    2056             :             endif
    2057             : !-----------------------------------------------------------------
    2058             : !       ... compute the "aerosol" reaction rates
    2059             : !-----------------------------------------------------------------
    2060             : !             k = gam * A * velo/4
    2061             : !
    2062             : !       where velo = sqrt[ 8*bk*T/pi/(w/av) ]
    2063             : !             bk = 1.381e-16
    2064             : !             av = 6.02e23
    2065             : !             w  = 108 (n2o5)  HO2(33)  CH2O (30)  NH3(15)
    2066             : !
    2067             : !       so that velo = 1.40e3*sqrt(T)  (n2o5)   gama=0.1
    2068             : !       so that velo = 2.53e3*sqrt(T)  (HO2)    gama>0.2
    2069             : !       so that velo = 2.65e3*sqrt(T)  (CH2O)   gama>0.022
    2070             : !       so that velo = 3.75e3*sqrt(T)  (NH3)    gama=0.4
    2071             : !--------------------------------------------------------
    2072             : !-----------------------------------------------------------------
    2073             : !       ... use this n2o5 -> 2*hno3 only in troposphere
    2074             : !-----------------------------------------------------------------
    2075           0 :             rxt(:,k,het1_ndx) = rxt(:,k,het1_ndx) &
    2076           0 :                                 +.25_r8 * gam1 * sur(:) * 1.40e3_r8 * sqrt( temp(:ncol,k) )
    2077             :          end do
    2078             :       end if
    2079             : 
    2080             : !lke++
    2081             : !-----------------------------------------------------------------
    2082             : !      ... CO tags
    2083             : !-----------------------------------------------------------------
    2084           0 :       if( usr_CO_OH_b_ndx > 0 .and. usr_CO_OH_ndx < 0 ) then
    2085           0 :          usr_CO_OH_ndx = usr_CO_OH_b_ndx
    2086             :       end if
    2087           0 :       if( usr_CO_OH_ndx > 0 ) then
    2088           0 :          if( usr_COhc_OH_ndx > 0 ) then
    2089           0 :             rxt(:ncol,:,usr_COhc_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2090             :          end if
    2091           0 :          if( usr_COme_OH_ndx > 0 ) then
    2092           0 :             rxt(:ncol,:,usr_COme_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2093             :          end if
    2094           0 :          if( usr_CO01_OH_ndx > 0 ) then
    2095           0 :             rxt(:ncol,:,usr_CO01_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2096             :          end if
    2097           0 :          if( usr_CO02_OH_ndx > 0 ) then
    2098           0 :             rxt(:ncol,:,usr_CO02_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2099             :          end if
    2100           0 :          if( usr_CO03_OH_ndx > 0 ) then
    2101           0 :             rxt(:ncol,:,usr_CO03_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2102             :          end if
    2103           0 :          if( usr_CO04_OH_ndx > 0 ) then
    2104           0 :             rxt(:ncol,:,usr_CO04_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2105             :          end if
    2106           0 :          if( usr_CO05_OH_ndx > 0 ) then
    2107           0 :             rxt(:ncol,:,usr_CO05_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2108             :          end if
    2109           0 :          if( usr_CO06_OH_ndx > 0 ) then
    2110           0 :             rxt(:ncol,:,usr_CO06_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2111             :          end if
    2112           0 :          if( usr_CO07_OH_ndx > 0 ) then
    2113           0 :             rxt(:ncol,:,usr_CO07_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2114             :          end if
    2115           0 :          if( usr_CO08_OH_ndx > 0 ) then
    2116           0 :             rxt(:ncol,:,usr_CO08_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2117             :          end if
    2118           0 :          if( usr_CO09_OH_ndx > 0 ) then
    2119           0 :             rxt(:ncol,:,usr_CO09_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2120             :          end if
    2121           0 :          if( usr_CO10_OH_ndx > 0 ) then
    2122           0 :             rxt(:ncol,:,usr_CO10_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2123             :          end if
    2124           0 :          if( usr_CO11_OH_ndx > 0 ) then
    2125           0 :             rxt(:ncol,:,usr_CO11_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2126             :          end if
    2127           0 :          if( usr_CO12_OH_ndx > 0 ) then
    2128           0 :             rxt(:ncol,:,usr_CO12_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2129             :          end if
    2130           0 :          if( usr_CO13_OH_ndx > 0 ) then
    2131           0 :             rxt(:ncol,:,usr_CO13_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2132             :          end if
    2133           0 :          if( usr_CO14_OH_ndx > 0 ) then
    2134           0 :             rxt(:ncol,:,usr_CO14_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2135             :          end if
    2136           0 :          if( usr_CO15_OH_ndx > 0 ) then
    2137           0 :             rxt(:ncol,:,usr_CO15_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2138             :          end if
    2139           0 :          if( usr_CO16_OH_ndx > 0 ) then
    2140           0 :             rxt(:ncol,:,usr_CO16_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2141             :          end if
    2142           0 :          if( usr_CO17_OH_ndx > 0 ) then
    2143           0 :             rxt(:ncol,:,usr_CO17_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2144             :          end if
    2145           0 :          if( usr_CO18_OH_ndx > 0 ) then
    2146           0 :             rxt(:ncol,:,usr_CO18_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2147             :          end if
    2148           0 :          if( usr_CO19_OH_ndx > 0 ) then
    2149           0 :             rxt(:ncol,:,usr_CO19_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2150             :          end if
    2151           0 :          if( usr_CO20_OH_ndx > 0 ) then
    2152           0 :             rxt(:ncol,:,usr_CO20_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2153             :          end if
    2154           0 :          if( usr_CO21_OH_ndx > 0 ) then
    2155           0 :             rxt(:ncol,:,usr_CO21_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2156             :          end if
    2157           0 :          if( usr_CO22_OH_ndx > 0 ) then
    2158           0 :             rxt(:ncol,:,usr_CO22_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2159             :          end if
    2160           0 :          if( usr_CO23_OH_ndx > 0 ) then
    2161           0 :             rxt(:ncol,:,usr_CO23_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2162             :          end if
    2163           0 :          if( usr_CO24_OH_ndx > 0 ) then
    2164           0 :             rxt(:ncol,:,usr_CO24_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2165             :          end if
    2166           0 :          if( usr_CO25_OH_ndx > 0 ) then
    2167           0 :             rxt(:ncol,:,usr_CO25_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2168             :          end if
    2169           0 :          if( usr_CO26_OH_ndx > 0 ) then
    2170           0 :             rxt(:ncol,:,usr_CO26_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2171             :          end if
    2172           0 :          if( usr_CO27_OH_ndx > 0 ) then
    2173           0 :             rxt(:ncol,:,usr_CO27_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2174             :          end if
    2175           0 :          if( usr_CO28_OH_ndx > 0 ) then
    2176           0 :             rxt(:ncol,:,usr_CO28_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2177             :          end if
    2178           0 :          if( usr_CO29_OH_ndx > 0 ) then
    2179           0 :             rxt(:ncol,:,usr_CO29_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2180             :          end if
    2181           0 :          if( usr_CO30_OH_ndx > 0 ) then
    2182           0 :             rxt(:ncol,:,usr_CO30_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2183             :          end if
    2184           0 :          if( usr_CO31_OH_ndx > 0 ) then
    2185           0 :             rxt(:ncol,:,usr_CO31_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2186             :          end if
    2187           0 :          if( usr_CO32_OH_ndx > 0 ) then
    2188           0 :             rxt(:ncol,:,usr_CO32_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2189             :          end if
    2190           0 :          if( usr_CO33_OH_ndx > 0 ) then
    2191           0 :             rxt(:ncol,:,usr_CO33_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2192             :          end if
    2193           0 :          if( usr_CO34_OH_ndx > 0 ) then
    2194           0 :             rxt(:ncol,:,usr_CO34_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2195             :          end if
    2196           0 :          if( usr_CO35_OH_ndx > 0 ) then
    2197           0 :             rxt(:ncol,:,usr_CO35_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2198             :          end if
    2199           0 :          if( usr_CO36_OH_ndx > 0 ) then
    2200           0 :             rxt(:ncol,:,usr_CO36_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2201             :          end if
    2202           0 :          if( usr_CO37_OH_ndx > 0 ) then
    2203           0 :             rxt(:ncol,:,usr_CO37_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2204             :          end if
    2205           0 :          if( usr_CO38_OH_ndx > 0 ) then
    2206           0 :             rxt(:ncol,:,usr_CO38_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2207             :          end if
    2208           0 :          if( usr_CO39_OH_ndx > 0 ) then
    2209           0 :             rxt(:ncol,:,usr_CO39_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2210             :          end if
    2211           0 :          if( usr_CO40_OH_ndx > 0 ) then
    2212           0 :             rxt(:ncol,:,usr_CO40_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2213             :          end if
    2214           0 :          if( usr_CO41_OH_ndx > 0 ) then
    2215           0 :             rxt(:ncol,:,usr_CO41_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2216             :          end if
    2217           0 :          if( usr_CO42_OH_ndx > 0 ) then
    2218           0 :             rxt(:ncol,:,usr_CO42_OH_ndx) = rxt(:ncol,:,usr_CO_OH_ndx)
    2219             :          end if
    2220             :       end if
    2221             : !lke--
    2222             : !
    2223             : ! jfl : additional BAM removal reactions.  Zero out below the tropopause
    2224             : !
    2225           0 :       do l=1,num_strat_tau
    2226             : !
    2227           0 :          if ( usr_strat_tau_ndx(l) > 0 ) then
    2228           0 :             do i=1,ncol
    2229           0 :                rxt(i,tropchemlev(i)+1:pver,usr_strat_tau_ndx(l)) = 0._r8
    2230             :             end do
    2231             :          end if
    2232             : !
    2233             :       end do
    2234             : !
    2235             : 
    2236           0 :       deallocate( sfc_array, dm_array )
    2237             : 
    2238           0 :   end subroutine usrrxt
    2239             : 
    2240           0 :       subroutine usrrxt_hrates( rxt, tempn, tempi, tempe, &
    2241           0 :                                 h2ovmr, m, ncol, kbot )
    2242             : !-----------------------------------------------------------------
    2243             : !        ... set the user specified reaction rates for heating
    2244             : !-----------------------------------------------------------------
    2245             : 
    2246           0 :       use shr_kind_mod,  only : r8 => shr_kind_r8
    2247             :       use chem_mods,     only : rxntot
    2248             :       use ppgrid,        only : pver, pcols
    2249             : 
    2250             :       implicit none
    2251             : 
    2252             : !-----------------------------------------------------------------
    2253             : !        ... dummy arguments
    2254             : !-----------------------------------------------------------------
    2255             :       integer, intent(in)     :: ncol                         ! number columns in chunk
    2256             :       integer, intent(in)     :: kbot                         ! heating levels
    2257             :       real(r8), intent(in)    :: tempn(pcols,pver)            ! neutral temperature (K)
    2258             :       real(r8), intent(in)    :: tempi(pcols,pver)            ! ion temperature (K)
    2259             :       real(r8), intent(in)    :: tempe(pcols,pver)            ! electron temperature (K)
    2260             :       real(r8), intent(in)    :: m(ncol,pver)                 ! total atm density (1/cm^3)
    2261             :       real(r8), intent(in)    :: h2ovmr(ncol,pver)            ! water vapor (vmr)
    2262             :       real(r8), intent(inout) :: rxt(ncol,pver,rxntot)        ! gas phase rates
    2263             : 
    2264             : !-----------------------------------------------------------------
    2265             : !        ... local variables
    2266             : !-----------------------------------------------------------------
    2267             : 
    2268             :       integer  ::  k
    2269             :       real(r8), dimension(ncol) :: &
    2270           0 :                    tp, &
    2271           0 :                    tinv, &
    2272           0 :                    ko, &
    2273           0 :                    kinf, &
    2274           0 :                    fc
    2275             : 
    2276             : !-----------------------------------------------------------------
    2277             : !       ... o + o2 + m --> o3 + m
    2278             : !-----------------------------------------------------------------
    2279           0 :       do k = 1,kbot
    2280           0 :          tinv(:ncol)       = 1._r8 / tempn(:ncol,k)
    2281           0 :          tp(:)             = 300._r8 * tinv(:)
    2282           0 :          rxt(:,k,usr_O_O2_ndx) = 6.e-34_r8 * tp(:)**2.4_r8
    2283             : 
    2284             : !-----------------------------------------------------------------
    2285             : !       ... o + o + m -> o2 + m
    2286             : !-----------------------------------------------------------------
    2287           0 :          rxt(:,k,usr_O_O_ndx) = 2.76e-34_r8 * exp( 720.0_r8*tinv(:) )
    2288             : 
    2289             : !-----------------------------------------------------------------
    2290             : !       ... ho2 + ho2 --> h2o2
    2291             : !       Note: this rate involves the water vapor number density
    2292             : !-----------------------------------------------------------------
    2293           0 :          ko(:)   = 3.0e-13_r8  * exp( 460._r8*tinv(:) )
    2294           0 :          kinf(:) = 2.1e-33_r8 * m(:,k) * exp( 920._r8*tinv(:) )
    2295           0 :          fc(:)   = 1._r8 + 1.4e-21_r8 * m(:,k) * h2ovmr(:,k) * exp( 2200._r8*tinv(:) )
    2296           0 :          rxt(:,k,usr_HO2_HO2_ndx) = (ko(:) + kinf(:)) * fc(:)
    2297             : 
    2298             :       end do
    2299             : 
    2300             : !-----------------------------------------------------------------
    2301             : !       ... the ionic rates
    2302             : !-----------------------------------------------------------------
    2303           0 :       if ( has_ion_rxts ) then
    2304           0 :          level_loop2 :  do k = 1,kbot
    2305           0 :             tp(:ncol)         = (2._r8*tempi(:ncol,k) + tempn(:ncol,k)) / ( 3._r8 * t0 )
    2306           0 :             tp(:)             = max( min( tp(:),20._r8 ),1._r8 )
    2307           0 :             rxt(:,k,ion1_ndx) = 2.82e-11_r8 + tp(:)*(-7.74e-12_r8 + tp(:)*(1.073e-12_r8  &
    2308           0 :                  + tp(:)*(-5.17e-14_r8 + 9.65e-16_r8*tp(:))))
    2309           0 :             tp(:ncol)         = (.6363_r8*tempi(:ncol,k) + .3637_r8*tempn(:ncol,k)) / t0
    2310           0 :             tp(:)             = max( min( tp(:),trlim2 ),1._r8 )
    2311           0 :             rxt(:,k,ion2_ndx) = 1.533e-12_r8 + tp(:)*(-5.92e-13_r8 + tp(:)*8.6e-14_r8)
    2312           0 :             tp(:ncol)         = 2._r8 * t0 /(tempi(:ncol,k) + tempn(:ncol,k))
    2313           0 :             where( tp(:ncol) < trlim3 )
    2314           0 :                rxt(:,k,ion3_ndx)  = 1.4e-10_r8 * tp(:)**.44_r8
    2315             :             elsewhere
    2316           0 :                rxt(:,k,ion3_ndx)  = 5.2e-11_r8 / tp(:)**.2_r8
    2317             :             endwhere
    2318           0 :             tp(:ncol)          = t0 / tempe(:ncol,k)
    2319           0 :             rxt(:,k,elec1_ndx) = 4.e-7_r8 * tp(:)**.85_r8
    2320           0 :             rxt(:,k,elec3_ndx) = 1.8e-7_r8 * tp(:)**.39_r8
    2321           0 :             where( tp(:ncol) < 4._r8 )
    2322           0 :                rxt(:,k,elec2_ndx) = 2.7e-7_r8 * tp(:)**.7_r8
    2323             :             elsewhere
    2324           0 :                rxt(:,k,elec2_ndx) = 1.6e-7_r8 * tp(:)**.55_r8
    2325             :             endwhere
    2326             :          end do level_loop2
    2327             :       endif
    2328           0 :       end subroutine usrrxt_hrates
    2329             : 
    2330             : !-------------------------------------------------------------------------
    2331             : !-------------------------------------------------------------------------
    2332           0 :   subroutine comp_exp( x, y, n )
    2333             : 
    2334             :     implicit none
    2335             : 
    2336             :     real(r8), intent(out) :: x(:)
    2337             :     real(r8), intent(in)  :: y(:)
    2338             :     integer,  intent(in)  :: n
    2339             : 
    2340             : #ifdef IBM
    2341             :     call vexp( x, y, n )
    2342             : #else
    2343           0 :     x(:n) = exp( y(:n) )
    2344             : #endif
    2345             : 
    2346           0 :   end subroutine comp_exp
    2347             : 
    2348             :   !-------------------------------------------------------------------------
    2349             :   !  Heterogeneous reaction rates for uptake of a gas on an aerosol:
    2350             :   !-------------------------------------------------------------------------
    2351           0 :   function hetrxtrate( sfc, dm_aer, dg_gas, c_gas, gamma_gas ) result(rate)
    2352             : 
    2353             :     real(r8), intent(in) :: sfc(:)
    2354             :     real(r8), intent(in) :: dm_aer(:)
    2355             :     real(r8), intent(in) :: dg_gas
    2356             :     real(r8), intent(in) :: c_gas
    2357             :     real(r8), intent(in) :: gamma_gas
    2358             :     real(r8) :: rate
    2359             : 
    2360           0 :     real(r8),allocatable :: rxt(:)
    2361             :     integer :: n, i
    2362             : 
    2363           0 :     n = size(sfc)
    2364             : 
    2365           0 :     allocate(rxt(n))
    2366           0 :     do i=1,n
    2367           0 :        rxt(i) = sfc(i) / (0.5_r8*dm_aer(i)/dg_gas + (4._r8/(c_gas*gamma_gas)))
    2368             :     enddo
    2369             : 
    2370           0 :     rate = sum(rxt)
    2371             : 
    2372           0 :     deallocate(rxt)
    2373             : 
    2374           0 :   endfunction hetrxtrate
    2375             : 
    2376             :   !-------------------------------------------------------------------------
    2377             :   !  Heterogeneous reaction rates for uptake of a glyoxal gas on an aerosol:
    2378             :   !-------------------------------------------------------------------------
    2379           0 :   function hetrxtrate_gly( sfc, c_gas, gamma_gas ) result(rate)
    2380             : 
    2381             :     real(r8), intent(in) :: sfc(:)
    2382             :     real(r8), intent(in) :: c_gas
    2383             :     real(r8), intent(in) :: gamma_gas
    2384             :     real(r8) :: rate
    2385             : 
    2386           0 :     real(r8),allocatable :: rxt(:)
    2387             :     integer :: n, i
    2388             : 
    2389           0 :     n = size(sfc)
    2390             : 
    2391           0 :     allocate(rxt(n))
    2392           0 :     do i=1,n
    2393           0 :        rxt(i) =  0.25_r8 * c_gas * sfc(i) * gamma_gas
    2394             :     enddo
    2395             : 
    2396           0 :     rate = sum(rxt)
    2397             : 
    2398           0 :     deallocate(rxt)
    2399             : 
    2400           0 :   endfunction hetrxtrate_gly
    2401             : 
    2402             : 
    2403             : end module mo_usrrxt

Generated by: LCOV version 1.14