chem_rates.F90 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771
  1. #define TRACEBACK write (gol,'("in ",a," (",a,i6,")")') rname, __FILE__, __LINE__ ; call goErr
  2. #define IF_NOTOK_RETURN(action) if (status/=0) then; TRACEBACK; action; return; end if
  3. #define IF_ERROR_RETURN(action) if (status> 0) then; TRACEBACK; action; return; end if
  4. !
  5. #include "tm5.inc"
  6. !
  7. !------------------------------------------------------------------------------
  8. ! TM5 !
  9. !------------------------------------------------------------------------------
  10. !BOP
  11. !
  12. ! !MODULE: CHEM_RATES
  13. !
  14. ! !DESCRIPTION: routines that calculate rates. Also used if there is no
  15. ! chemistry (without_chemistry) to calculate Henry coefficients
  16. ! for wet deposition.
  17. !\
  18. !\
  19. ! !INTERFACE:
  20. !
  21. MODULE CHEM_RATES
  22. !
  23. ! !USES:
  24. !
  25. use GO, only : gol, goPr, goErr
  26. IMPLICIT NONE
  27. PRIVATE
  28. !
  29. ! !PUBLIC MEMBER FUNCTIONS:
  30. !
  31. public :: rates ! rate constants & Henry law
  32. #ifndef without_chemistry
  33. public :: calrates
  34. #endif
  35. !
  36. ! !PRIVATE DATA MEMBERS:
  37. !
  38. character(len=*), parameter :: mname = 'chem_rates'
  39. !
  40. ! !REVISION HISTORY:
  41. ! 26 Mar 2010 - P. Le Sager - took off NO+XO2 three rates
  42. ! 15 Mar 2012 - P. Le Sager - adapted for lon-lat MPI domain decomposition
  43. !
  44. ! !REMARKS:
  45. !
  46. !EOP
  47. !------------------------------------------------------------------------------
  48. contains
  49. !------------------------------------------------------------------------------
  50. ! TM5 !
  51. !------------------------------------------------------------------------------
  52. !BOP
  53. !
  54. ! !IROUTINE: RATES
  55. !
  56. ! !DESCRIPTION:
  57. !
  58. ! calculation of look up tables rate constants/henry coefficients
  59. !
  60. ! method
  61. ! ------
  62. ! use known array of temperatures (integers) to calculate rate constants
  63. ! 3 body reactions are explicitly calculated in chemistry
  64. !\
  65. !\
  66. ! !INTERFACE:
  67. !
  68. SUBROUTINE RATES( status )
  69. !
  70. ! !USES:
  71. !
  72. use toolbox, only : zfarr
  73. use chem_param
  74. !
  75. ! !OUTPUT PARAMETERS:
  76. !
  77. integer, intent(out) :: status
  78. !
  79. ! !REVISION HISTORY:
  80. ! 26 Mar 2010 - P. Le Sager - added protex
  81. ! 16 Nov 2010 - P. Le Sager - bug fix : kh1 & kh2 are real now.
  82. !
  83. ! !REMARKS:
  84. !
  85. !EOP
  86. !------------------------------------------------------------------------------
  87. !BOC
  88. integer :: itemp, k, i
  89. real :: kh1, kh2
  90. real :: ztrec, zt3rec, temp
  91. ! --- const ------------------------------
  92. character(len=*), parameter :: rname = mname//'/rates'
  93. ! start
  94. ! JEW : updated rates JPL(2006), incl. Evaluation Number 15 (March, 2006)
  95. !
  96. do k=1,ntemp
  97. itemp=k+ntlow
  98. temp=float(itemp)
  99. ztrec=1./float(itemp)
  100. zt3rec=300./float(itemp)
  101. !JEW: changed to JPL2006
  102. rates_lut(knoo3,k)=zfarr(3.e-12,-1500.,ztrec)
  103. !JEW: changed to JPL2006
  104. rates_lut(kho2no,k)=zfarr(3.5e-12,250.,ztrec)
  105. !JEW: changed to JPL2006
  106. rates_lut(kno2oha,k)=1.8e-30*zt3rec**3.0
  107. rates_lut(kno2ohb,k)=2.8e-11
  108. rates_lut(kohhno3a,k)=zfarr(2.41e-14,460.,ztrec) !!!wp!!! new ravi
  109. rates_lut(kohhno3b,k)=zfarr(6.51e-34,1335.,ztrec) !!!wp!!! new ravi
  110. rates_lut(kohhno3c,k)=zfarr(2.69e-17,2199.,ztrec) !!!wp!!! new ravi
  111. rates_lut(kno2o3,k)=zfarr(1.2e-13,-2450.,ztrec)
  112. rates_lut(knono3,k)=zfarr(1.5e-11,170.,ztrec)
  113. !JEW: changed to JPL2006
  114. rates_lut(kno2no3a,k)=2.0e-30*zt3rec**4.4
  115. rates_lut(kno2no3b,k)=1.4e-12*zt3rec**0.7
  116. !JEW: changed to JPL2006
  117. rates_lut(kn2o5,k)=zfarr(2.7e-27,11000.,ztrec)
  118. rates_lut(khno4oh,k)=zfarr(1.3e-12,380.,ztrec)
  119. !JEW: changed to JPL2006
  120. rates_lut(kno2ho2a,k)=2.0e-31*zt3rec**3.4
  121. rates_lut(kno2ho2b,k)=2.9e-12*zt3rec**1.1
  122. rates_lut(khno4m,k)=zfarr(2.1e-27,10900.,ztrec)
  123. !JEW: changed to JPL2006
  124. rates_lut(kodm,k)=.2095*zfarr(3.3e-11,55.,ztrec)+ &
  125. .7808*zfarr(2.15e-11,110.,ztrec)
  126. !JEW: changed to JPL2006
  127. rates_lut(kh2ood,k)=zfarr(1.63e-10,60.,ztrec)
  128. rates_lut(ko3ho2,k)=zfarr(1.0e-14,-490.,ztrec)
  129. rates_lut(ko3oh,k)=zfarr(1.7e-12,-940.,ztrec)
  130. !JEW: changed to JPL2006
  131. rates_lut(khpoh,k)=1.8e-12
  132. !JEW: changed to JPL2006
  133. rates_lut(kfrmoh,k)=zfarr(5.5e-12,125.,ztrec)
  134. !JEW: changed to JPL2006
  135. rates_lut(kch4oh,k)=zfarr(2.45e-12,-1775.,ztrec)
  136. rates_lut(kcooha,k)=5.9e-33*zt3rec**1.4
  137. rates_lut(kcoohb,k)=1.1e-12*zt3rec**(-1.3)
  138. rates_lut(kcoohc,k)=1.5e-13*zt3rec**(-0.6)
  139. rates_lut(kcoohd,k)=2.1e9*zt3rec**(-6.1)
  140. !JEW: changed to JPL2006
  141. rates_lut(kohmper,k)=zfarr(3.8e-12,200.,ztrec)
  142. rates_lut(kohrooh,k)=zfarr(3.01e-12,190.,ztrec) ! CB05
  143. rates_lut(kho2oh,k)=zfarr(4.8e-11,250.,ztrec)
  144. rates_lut(kh2oh,k)=zfarr(2.8e-12,-1800.,ztrec)
  145. !JEW: changed to JPL2006
  146. rates_lut(kmo2ho2,k)=zfarr(4.1e-13,750.,ztrec)
  147. rates_lut(kmo2no,k)=zfarr(2.8e-12,300.,ztrec)
  148. rates_lut(kmo2mo2,k)=zfarr(9.5e-14,390.,ztrec)
  149. !JEW: changed to JPL2006
  150. rates_lut(kho2ho2a,k)=zfarr(3.5e-13,430.,ztrec)
  151. rates_lut(kho2ho2b,k)=zfarr(1.7e-33,1000.,ztrec)
  152. rates_lut(kho2ho2c,k)=zfarr(1.4e-21,2200.,ztrec)
  153. rates_lut(kc41,k)=5.8e-16
  154. rates_lut(kc46,k)=zfarr(8.1e-12,270.,ztrec)
  155. ! from IUPAC (Atkinson et al, 2006)
  156. rates_lut(kc47a,k)=2.7e-28*zt3rec**7.1
  157. rates_lut(kc47b,k)=1.2e-11*zt3rec**0.9
  158. rates_lut(kc48a,k)=zfarr(4.9e-3,-12100.,ztrec)
  159. rates_lut(kc48b,k)=zfarr(5.4e16,-13830.,ztrec)
  160. !JEW: changed to JPL2006
  161. rates_lut(kc49,k)=zfarr(2.9e-12,500.,ztrec)
  162. rates_lut(kc50,k)=zfarr(4.3e-13,1040.,ztrec)
  163. !------------------------------------------------------
  164. rates_lut(kc52,k)=8.1e-13
  165. rates_lut(kc53,k)=zfarr(1.e15,-8000.,ztrec)
  166. rates_lut(kc54,k)=1.6e3
  167. !JEW: changed to JPL2006
  168. rates_lut(kc57,k)=zfarr(5.4e-12,-610.,ztrec)
  169. !JEW: changed to JPL2006
  170. rates_lut(kc58,k)=zfarr(8.5e-16,1520.,ztrec)
  171. rates_lut(kc59,k)=zfarr(4.6e-14,400.,ztrec)
  172. !JEW: changed to JPL2006
  173. rates_lut(kc61a,k)=1.e-28*zt3rec**4.5
  174. rates_lut(kc61b,k)=8.8e-12*zt3rec**0.85
  175. !JEW: changed to JPL2006
  176. rates_lut(kc62,k)=zfarr(1.2e-14,-2630.,ztrec)
  177. !JEW: changed to IUPAC2004
  178. rates_lut(kc73,k)=1.5e-11 ! IUPAC
  179. rates_lut(kc76,k)=zfarr(2.7e-11,390.,ztrec) ! IUPAC
  180. rates_lut(kc77,k)=zfarr(1.04e-14,-1995.,ztrec) ! IUPAC
  181. rates_lut(kc78,k)=zfarr(3.15e-12,-450.,ztrec) ! IUPAC
  182. !JEW: changed to JPL2006
  183. rates_lut(kc79,k)=zfarr(2.6e-12,365.,ztrec)
  184. rates_lut(kc80,k)=zfarr(1.6e-12,-2200.,ztrec)
  185. rates_lut(kc81,k)=zfarr(2.6e-12,365.,ztrec) ! bug
  186. rates_lut(kc82,k)=zfarr(7.5e-13,700.,ztrec) ! CB05
  187. rates_lut(kc83,k)=8.e-11
  188. rates_lut(kc84,k)=zfarr(5.9e-13,-360.,ztrec) ! CB05 temp dep
  189. rates_lut(kc85,k)=zfarr(7.5e-13,700.,ztrec) ! CB05
  190. rates_lut(KO3PO2,k)=6.0e-34*zt3rec**2.4
  191. rates_lut(KO3PO3,k)=zfarr(8.0e-12,-2060.,ztrec)
  192. rates_lut(KXO2XO2N,k)=6.8e-14
  193. rates_lut(KXO2N,k)=6.8e-14
  194. ! sulfur and ammonia gas phase reactions
  195. ! the hynes et al. parameterisation is replaced by chin et al. 1996
  196. !JEW: changed to JPL2006
  197. rates_lut(kdmsoha,k)= 1.11e-11*exp(-253./temp)
  198. rates_lut(kdmsohb,k)=1.0e-39*exp(5820./temp)
  199. rates_lut(kdmsohc,k)=5.0e-30*exp(6280./temp)
  200. rates_lut(kdmsno3,k)=zfarr(1.9e-13,500.,ztrec)!at 298 1.01e-12
  201. !JEW: changed to JPL2006
  202. rates_lut(kso2oha,k)=3.3e-31*zt3rec**4.3
  203. rates_lut(kso2ohb,k)= 1.6e-12
  204. !
  205. ! fate of ammonia
  206. !
  207. rates_lut(knh3oh,k)= zfarr(1.7e-12,-710.,ztrec)!1.56e-13 at 298k
  208. rates_lut(knh2no,k)= zfarr(4.0e-12,+450.,ztrec)!1.72e-11
  209. rates_lut(knh2no2,k)= zfarr(2.1e-12,650.,ztrec)!1.86e-11
  210. rates_lut(knh2ho2,k)= 3.4e-11
  211. rates_lut(knh2o2,k)= 6.0e-21
  212. rates_lut(knh2o3,k)= zfarr(4.3e-12,-930.,ztrec)!1.89e-13 at 298k
  213. !
  214. ! for higher organics
  215. rates_lut(kohmcho,k) = zfarr(4.4e-12,365.,ztrec) ! IUPAC
  216. rates_lut(kohmch2cho,k) = zfarr(4.9e-12,405.,ztrec)
  217. rates_lut(kno3mcho,k) = zfarr(1.4e-12,-1860.,ztrec)
  218. rates_lut(kno3mch2cho,k) = 6.5e-15
  219. rates_lut(kohmvk,k) = zfarr(1.86e-11,175.,ztrec) ! IUPAC
  220. rates_lut(kohole,k) = zfarr(8.2e-12,610.,ztrec) ! IUPAC
  221. rates_lut(kohmacr,k) = zfarr(2.6e-12,610.,ztrec) ! IUPAC
  222. rates_lut(ko3mvk,k) = zfarr(8.5e-16,-1520.,ztrec) ! Poesch et al 2000
  223. rates_lut(ko3ole,k) = 1.0e-17
  224. rates_lut(ko3macr,k) = zfarr(1.4e-15,-2100.,ztrec)! IUPAC
  225. rates_lut(kno3ole,k) = zfarr(4.0e-14,-400.,ztrec)
  226. !
  227. ! **** solubility Henry equilibrium
  228. ! HNO3/so4/nh4 just a very high number to take H and
  229. ! dissociation into account
  230. !
  231. henry(:,k)=0.
  232. henry(ih2o2,k)=1.0e5*exp(6300*ztrec)*6.656e-10
  233. henry(ihno3,k)=1e7
  234. henry(ich3o2h,k)=310.*exp(5200*ztrec)*2.664e-8
  235. henry(ich2o,k)=3000.*exp(7200*ztrec)*3.253e-11
  236. henry(irooh,k)=340.*exp(6000.*ztrec)*1.821e-9
  237. henry(ich2o,k)=henry(ich2o,k)*37
  238. henry(iorgntr,k)=zfarr(1.8e-6,6000.,ztrec)
  239. henry(iso4,k)=1.e7
  240. henry(inh4,k)=1.e7
  241. henry(imsa,k)=1.e7
  242. henry(iso2,k) =1.2*exp(3120.*ztrec)*2.85e-5
  243. henry(inh3,k) =75.0*exp(3400.*ztrec)*1.10e-5
  244. henry(io3,k)=1.1e-2*exp(2300.*ztrec)*4.45e-4
  245. ! JEW add two new scavenging rates for CH3COCHO and ALD2
  246. ! need KH(eff) due to hydration steps for both species
  247. henry(imgly,k) = 3.2e4*48.6
  248. kh1=17.*exp(5000.*ztrec)*exp(-5000.*(1/298.15))
  249. kh2=13.*exp(5700.*ztrec)*exp(-5700.*(1/298.15))
  250. henry(iald2,k) = ((kh1+kh2)/2.)*1.0246
  251. end do !k temperature loop
  252. !
  253. ! marked tracers:
  254. !
  255. henry(io3s,:) = henry(io3,:)
  256. !ok
  257. status = 0
  258. end subroutine rates
  259. !EOC
  260. #ifndef without_chemistry
  261. !------------------------------------------------------------------------------
  262. ! TM5 !
  263. !------------------------------------------------------------------------------
  264. !BOP
  265. !
  266. ! !IROUTINE: calrates
  267. !
  268. ! !DESCRIPTION:
  269. ! calculate rate constants using lookup table rates_lut
  270. ! calculate third bodies
  271. ! calculate heterogeneous removal on aerosols
  272. !
  273. ! External: CALCHET
  274. !
  275. !\
  276. !\
  277. ! !INTERFACE:
  278. !
  279. SUBROUTINE CALRATES( region, level, is, js, rjx, rr, reff_cloud, ye, dt_chem, sad_cld_out, sad_ice_out, sad_aer_out, status )
  280. !
  281. ! !USES:
  282. !
  283. use global_data, only : region_dat, mass_dat
  284. use Dims, only : CheckShape
  285. use chem_param
  286. use binas, only : Avog, pi
  287. use tm5_distgrid, only : dgrid, Get_DistGrid
  288. use reaction_data, only : nreac
  289. #ifdef with_m7
  290. use m7_data, only : rw_mode, dens_mode
  291. use mo_aero_m7, only : nmod, cmr2ras
  292. #endif
  293. !
  294. ! !INPUT PARAMETERS:
  295. !
  296. integer, intent(in) :: region, level, is, js
  297. real, intent(in) :: reff_cloud(is:,js:)
  298. real, intent(in) :: dt_chem
  299. !
  300. ! !OUTPUT PARAMETERS:
  301. !
  302. real, intent(out) :: rr(is:,js:,:) ! reaction rates
  303. integer, intent(out) :: status
  304. real, intent(out) :: sad_cld_out(is:,js:), sad_ice_out(is:,js:), sad_aer_out(is:,js:)
  305. !
  306. ! !INPUT/OUTPUT PARAMETERS:
  307. !
  308. real, intent(inout) :: rjx(is:,js:,:) ! photolysis rate
  309. real, intent(inout) :: ye(is:,js:,:) ! extra 2D fields
  310. !
  311. ! !REVISION HISTORY:
  312. ! 26 Mar 2010 - P. Le Sager - added protex
  313. ! 16 Jun 2011 - P. Le Sager - bug fix from JEW : g_n2o5 values
  314. ! 15 Mar 2012 - P. Le Sager - adapted for lon-lat MPI domain decomposition
  315. ! 12 Jun 2012 - P. Le Sager - fix O3 concentration
  316. !
  317. ! !REMARKS:
  318. !
  319. !EOP
  320. !------------------------------------------------------------------------------
  321. !BOC
  322. character(len=*), parameter :: rname = mname//'/calc_rates'
  323. real, dimension(:,:,:,:), pointer :: rm ! tracer mass
  324. ! help variables
  325. integer :: itemp,i,j, i1, j1, i2, j2, imode, iaer
  326. real :: tr, temp, wv, airp, rx1, rx2, rx3
  327. real :: dum, h2ox, aird, air_vol, o2, o3
  328. real :: x1, x2, xice, xliq
  329. !
  330. ! cloud chemistry of n2o5
  331. real :: dg, kt_liq_n2o5, kt_ice_n2o5, kt_liq_ho2, kt_ice_ho2
  332. real :: g_n2o5_l_temp
  333. real :: r_ice, r_cloud ! cm
  334. real :: sad_ice, sad_cloud, iwc, lwc, o3_p
  335. ! Aerosol heterogeneous chemistry
  336. real :: kt_aer_n2o5, kt_aer_no3, kt_aer_ho2
  337. real :: sad_aer, sad_aert, aer_conc, aer_dens, aer_rad
  338. real :: smr_aer
  339. real, parameter :: sad_factor = 4.*pi*1.e-3 ! 4*pi as prefactor for area, 1e-3 to convert air_vol to cm3
  340. ! Standard aerosol properties density and radius for NO3_A, MSA,NH4, and -if not with_m7- SO4
  341. real, parameter :: aer_dens_ref = 1.7 ! assumed particle density [gr/cm3]
  342. real, parameter :: aer_rad_ref = 0.18e-4 ! assumed particle radius [cm]
  343. ! Parameters to describe subgrid scale mixing
  344. real :: zcc
  345. ! --- begin --------------------------------
  346. CALL GET_DISTGRID( DGRID(region), I_STRT=i1, I_STOP=i2, J_STRT=j1, J_STOP=j2 )
  347. call CheckShape( (/i2-i1+1, j2-j1+1, nj /), shape(rjx), status )
  348. IF_ERROR_RETURN(status = 1)
  349. call CheckShape( (/i2-i1+1, j2-j1+1, nreac /), shape(rr ), status )
  350. IF_ERROR_RETURN(status = 1)
  351. call CheckShape( (/i2-i1+1, j2-j1+1, n_extra/), shape(ye ), status )
  352. IF_ERROR_RETURN(status = 1)
  353. rm => mass_dat(region)%rm
  354. !$OMP parallel &
  355. !$OMP default (none) &
  356. !$OMP shared (level, jsr, jer, isr, ier, region, ye, rates_lut, rr, rjx, rm, fscale) &
  357. !$OMP private (i, j, jss, jee, rx3, temp, itemp, airp, h2ox, aird, &
  358. !$OMP tr, wv, o2, o3, o3_p, rx1, rx2)
  359. rx3=0.6
  360. rr(i1:i2,j1:j2,1:nreac)=0.0
  361. do j=j1,j2
  362. do i=i1,i2
  363. temp=ye(i,j,i_temp)
  364. itemp=nint(temp-float(ntlow))
  365. itemp=min(max(itemp,1),ntemp) !limit temperatures in loop-up table range
  366. airp=ye(i,j,i_pres)
  367. !
  368. ! Calculation of relative humidity [%]
  369. ! Richardson's approximation for water vapor pressure
  370. ! should be calculated in subroutine rates
  371. !
  372. h2ox = ye(i,j,ih2on)
  373. aird = ye(i,j,iairn)
  374. tr=1.-373.15/temp
  375. wv=exp((((-.1299*tr-.6445)*tr-1.976)*tr+13.3185)*tr)
  376. ye(i,j,irh)=h2ox*temp/(1013.25*wv*7.24291e16)
  377. ye(i,j,irh) = max(min(ye(i,j,irh),100.0),0.0) !limit rh between 0-100%
  378. o2=0.209476*aird
  379. !------ Fix O3 conc (PLS, June 12, 2012)
  380. !PREV
  381. ! o3=y(i,j,io3)
  382. !NOW
  383. o3 = rm(i,j,level,io3) / ye(i,j,iairm) * aird * fscale(io3) !kg ----> #/cm3
  384. !------
  385. !
  386. !**** calculate three body reaction rates
  387. !
  388. rx1=rates_lut(KNO2OHA,itemp)*aird
  389. rx2=rates_lut(KNO2OHB,itemp)
  390. rr(i,j,kno2oh)=RX1/(1.+RX1/RX2)*RX3**(1./(1.+LOG10(RX1/RX2)**2))
  391. rx1=rates_lut(KOHHNO3C,itemp)
  392. rx2=rates_lut(KOHHNO3B,itemp)*aird
  393. rr(i,j,kohhno3)=rates_lut(KOHHNO3A,itemp)+rx1*rx2/(rx1+rx2)
  394. rx1=rates_lut(KNO2NO3A,itemp)*aird
  395. rx2=rates_lut(KNO2NO3B,itemp)
  396. rr(i,j,kno2no3)=RX1/(1.+RX1/RX2)*RX3**(1./(1.+LOG10(RX1/RX2)**2))
  397. rx1=rates_lut(KNO2HO2A,itemp)*aird
  398. rx2=rates_lut(KNO2HO2B,itemp)
  399. rr(i,j,kno2ho2)=RX1/(1.+RX1/RX2)*RX3**(1./(1.+LOG10(RX1/RX2)**2))
  400. rx1=rates_lut(kcooha,itemp)*aird
  401. rx2=rates_lut(kcoohb,itemp)
  402. rr(i,j,kcooh)=rx1/(1.+rx1/rx2)*rx3**(1./(1.+log10(rx1/rx2)**2))
  403. !JEW: now add the second term for CO + OH
  404. rx1=rates_lut(kcoohc,itemp)
  405. rx2=rates_lut(kcoohd,itemp)/aird
  406. rr(i,j,kcooh)=rr(i,j,kcooh)+(rx1/(1.+rx1/rx2)*rx3**(1./(1.+log10(rx1/rx2)**2)))
  407. rx1=rates_lut(KC61A,itemp)*aird
  408. rx2=rates_lut(KC61B,itemp)
  409. rr(i,j,kc61)=RX1/(1.+RX1/RX2)*RX3**(1./(1.+LOG10(RX1/RX2)**2))
  410. !
  411. ! photolysis rates and 2 body reactions
  412. !
  413. rr(i,j,knoo3)=rates_lut(KNOO3,itemp)
  414. rr(i,j,kho2no)=rates_lut(KHO2NO,itemp)
  415. rr(i,j,kmo2no)=rates_lut(Kmo2NO,itemp)
  416. rr(i,j,kno2o3)=rates_lut(KNO2O3,itemp)
  417. rr(i,j,knono3)=rates_lut(KNONO3,itemp)
  418. rr(i,j,kn2o5)=rr(i,j,kno2no3)/rates_lut(KN2O5,itemp)
  419. rr(i,j,khno4oh)=rates_lut(KHNO4OH,itemp)
  420. rr(i,j,khno4m)=rr(i,j,kno2ho2)/rates_lut(KHNO4M,itemp)
  421. rr(i,j,kodm)=rates_lut(KODM,itemp)
  422. rr(i,j,kh2ood)=rates_lut(KH2OOD,itemp)
  423. rr(i,j,ko3ho2)=rates_lut(KO3HO2,itemp)
  424. !old formulation rr(i,j,kcooh)=1.5E-13+9E-14*airp/101325.
  425. rr(i,j,ko3oh)=rates_lut(KO3OH,itemp)
  426. rr(i,j,khpoh)=rates_lut(KHPOH,itemp)
  427. rr(i,j,kfrmoh)=rates_lut(KFRMOH,itemp)
  428. rr(i,j,kch4oh)=rates_lut(KCH4OH,itemp)
  429. rr(i,j,kh2oh)=rates_lut(kh2oh,itemp)*550.e-9*aird !h2=550ppbv JEW update
  430. rr(i,j,kohmper)=rates_lut(KOHMPER,itemp)
  431. rr(i,j,kohrooh)=rates_lut(KOHROOH,itemp)
  432. rr(i,j,kmo2ho2)=rates_lut(KMO2HO2,itemp)
  433. rr(i,j,kmo2mo2)=rates_lut(KMO2MO2,itemp)
  434. rr(i,j,kho2oh)=rates_lut(KHO2OH,itemp)
  435. rr(i,j,kho2ho2)=(rates_lut(KHO2HO2A,itemp) + &
  436. rates_lut(KHO2HO2B,itemp)*aird)*(1.+rates_lut(KHO2HO2C,itemp)*h2ox)
  437. rr(i,j,kc41)=rates_lut(kc41,itemp)
  438. ! JEW for ALD take the average of the C2 and C3 rate co-efficients; measurements suggest
  439. ! that CH3CHO only comprises 50% of [higher aldehydes] - grossman et al, JGR, 2003.
  440. rr(i,j,kc43)=(rates_lut(kohmcho,itemp)+rates_lut(kohmch2cho,itemp))/2.
  441. rr(i,j,kc44)=(rates_lut(kno3mcho,itemp)+ rates_lut(kno3mch2cho,itemp))/2.
  442. rr(i,j,kc46)=rates_lut(KC46,itemp)
  443. rx1=rates_lut(KC47A,itemp)*aird
  444. rx2=rates_lut(KC47B,itemp)
  445. rr(i,j,kc47)=RX1/(1.+RX1/RX2)*0.3**(1./(1.+LOG10(RX1/RX2)**2))
  446. rx1=rates_lut(KC48A,itemp)*aird
  447. rx2=rates_lut(KC48B,itemp)
  448. rr(i,j,kc48)=RX1/(1.+RX1/RX2)*0.3**(1./(1.+LOG10(RX1/RX2)**2))
  449. rr(i,j,kc49)=rates_lut(KC49,itemp)
  450. rr(i,j,kc50)=rates_lut(KC50,itemp)
  451. rr(i,j,kc52)=rates_lut(KC52,itemp)
  452. rr(i,j,kc53)=rates_lut(KC53,itemp)
  453. rr(i,j,kc54)=rates_lut(KC54,itemp)
  454. ! JEW updated average for OLE oxidation reactions
  455. rr(i,j,kc57)=(rates_lut(kohmvk,itemp)+rates_lut(kohole,itemp)+rates_lut(kohmacr,itemp))/3.
  456. rr(i,j,kc58)=(rates_lut(ko3mvk,itemp)+rates_lut(ko3ole,itemp)+rates_lut(ko3macr,itemp))/3.
  457. rr(i,j,kc59)=(rates_lut(kno3ole,itemp)+6.0e-16+3.5e-15)/3.
  458. rr(i,j,kc62)=rates_lut(KC62,itemp)
  459. rr(i,j,kc73)=rates_lut(KC73,itemp)
  460. rr(i,j,kc76)=rates_lut(KC76,itemp)
  461. rr(i,j,kc77)=rates_lut(KC77,itemp)
  462. rr(i,j,kc78)=rates_lut(KC78,itemp)
  463. ! JEW use rates in cb05 for XO2 reactions
  464. rr(i,j,kc79)=rates_lut(KC79,itemp)
  465. rr(i,j,kc80)=rates_lut(KC80,itemp)
  466. rr(i,j,kc81)=rates_lut(KC81,itemp)
  467. rr(i,j,kc82)=rates_lut(KC82,itemp)
  468. rr(i,j,kc83)=rates_lut(KC83,itemp)
  469. rr(i,j,kc84)=rates_lut(kc84,itemp)
  470. rr(i,j,kc85)=rates_lut(kc85,itemp)
  471. #ifndef without_photolysis
  472. rjx(i,j,jo3d)=rjx(i,j,jo3d)*rr(i,j,kh2ood)*h2ox / &
  473. ( rr(i,j,kodm)*aird + rr(i,j,kh2ood)*h2ox )
  474. ! this is fraction rjo3d=>OH
  475. #endif
  476. RX1=rates_lut(kso2oha,itemp)*aird
  477. RX2=rates_lut(kso2ohb,itemp)
  478. rr(i,j,kso2oh)=RX1/(1.+RX1/RX2)*0.6**(1./(1.+LOG10(RX1/RX2)**2))
  479. !
  480. ! dmsoha => so2
  481. ! dmsohb => 0.75 SO2 + 0.25 MSA
  482. !
  483. rr(i,j,kdmsoha)=rates_lut(kdmsoha,itemp)
  484. rr(i,j,kdmsohb)=rates_lut(kdmsohb,itemp)*o2/ &
  485. (1.+rates_lut(kdmsohc,itemp)*o2)
  486. rr(i,j,kdmsno3)=rates_lut(kdmsno3,itemp)
  487. ! ammonia chemistry
  488. rr(i,j,knh3oh)=rates_lut(knh3oh,itemp)
  489. rr(i,j,knh2no)=rates_lut(knh2no,itemp)
  490. rr(i,j,knh2no2)=rates_lut(knh2no2,itemp)
  491. rr(i,j,knh2ho2)=rates_lut(knh2ho2,itemp)
  492. rr(i,j,knh2o2)=rates_lut(knh2o2,itemp)*o2
  493. rr(i,j,knh2o3)=rates_lut(knh2o3,itemp)
  494. rr(i,j,krn222)=2.11e-6 ! s-1 decay time Rn222 to Pb210
  495. ! - BEFORE - 25 Jun 2012 - P. Le Sager
  496. ! rr(i,j,ko3po2)=rates_lut(ko3po2,itemp)*o2
  497. ! rr(i,j,ko3po3)=rates_lut(ko3po3,itemp)
  498. ! rr(i,j,kxo2xo2n)=6.8e-14
  499. ! rr(i,j,kxo2n)=6.8e-14
  500. ! rjx(i,j,jo2)=(2*rjx(i,j,jo2)*o2)*rr(i,j,ko3po2)/ &
  501. ! (rr(i,j,ko3po2) + rr(i,j,ko3po3)*o3)
  502. !
  503. ! - NOW -
  504. rr(i,j,ko3po2) = rates_lut(ko3po2,itemp)*aird
  505. rr(i,j,ko3po3) = rates_lut(ko3po3,itemp)
  506. rr(i,j,kxo2xo2n) = 6.8e-14
  507. rr(i,j,kxo2n) = 6.8e-14
  508. !
  509. ! O3P in molecules cm3
  510. !
  511. ! JEW: Reformulated June 2012
  512. !
  513. ! Runaway O3 above 50 hPa due to missing stratopsheric chemistry
  514. ! therefore use pressure as an index
  515. !
  516. o3_p=0.
  517. if(airp/100 > 50. .and. airp/100. < 350.) o3_p=(2*rjx(i,j,jo2)*o2)
  518. !
  519. ! [O2] not used in the ebi
  520. !
  521. rjx(i,j,jo2)=(o3_p/(rr(i,j,ko3po2)*o2+rr(i,j,ko3po3)*o3)) * o2 * rr(i,j,ko3po2)
  522. rr(i,j,ko3po3)=rr(i,j,ko3po3)*o3_p
  523. ! - -
  524. end do
  525. end do !_lat/lon loop
  526. !$OMP END PARALLEL
  527. !
  528. ! heterogeneous reaction of N2O5 and H2O -> 2 HNO3 on cloud and aerosol
  529. ! included in gas phase chemistry.
  530. ! VH, August-December 2013: Methodology updated, and extended with reactions for NO3 and HO2.
  531. ! rw_mode and dens_mode contain the average radius [m] and density [kg/m3] for each modes,
  532. ! as computed in subroutine m7_averageproperties (pm6rp and prhop)
  533. !
  534. !$OMP PARALLEL &
  535. !$OMP default (none) &
  536. !$OMP shared (jsr, jer, isr, ier, region, ye, rr, reff_cloud,level, &
  537. !$OMP g_ho2,g_n2o5,g_no3, sad_cld_out, sad_ice_out,sad_aer_out, &
  538. !$OMP mode_nm, mode_tracers, rm,dt_chem) &
  539. !$OMP private (i, j, jss, jee, airp, dg, aird, xliq, xice, &
  540. !$OMP temp, sad_ice,sad_cloud,iwc,lwc,r_ice, zcc,&
  541. !$OMP r_cloud, sad_aer,sad_aert, aer_conc, air_vol, &
  542. !$OMP g_n2o5_l_temp,kt_aer_n2o5, kt_aer_ho2,kt_aer_no3, &
  543. !$OMP kt_liq_n2o5, kt_ice_n2o5, kt_liq_ho2, kt_ice_ho2 ) &
  544. #ifdef with_m7
  545. !$OMP shared (rw_mode, dens_mode) &
  546. !$OMP private (aer_rad, aer_dens)
  547. #endif
  548. do j = j1, j2
  549. do i=i1, i2
  550. sad_cloud = 0.
  551. sad_ice = 0.
  552. aird = ye(i,j,iairn) ! #/cm3
  553. ! typically the optical reff is somewhat larger than the physical r by 1-2um
  554. ! therefore downsize reff by 2.0uM for droplets 9-13uM and 1.0 for those between
  555. ! 6-9um
  556. ! http://www-das.uwyo.edu/~geerts/cwx/notes/chap08/moist_cloud.html
  557. ! set cloud droplet radius [cm]
  558. if(reff_cloud(i,j)>=9.0) then
  559. r_cloud = (reff_cloud(i,j)-2.0)/1e4
  560. elseif(reff_cloud(i,j)>=6.0) then
  561. r_cloud = (reff_cloud(i,j)-1.0)/1e4
  562. elseif(reff_cloud(i,j)>= 4.0) then
  563. r_cloud = (reff_cloud(i,j)-0.25)/1e4
  564. else
  565. r_cloud = 4.0e-4 ! ensure a minimum - sometime reff_cloud is zero, i.e. not defined...
  566. endif
  567. ! SAD for ice particles
  568. ! JEW: The surface area density for ice particles in now linked to
  569. ! the IWC by the parameterization of Heymsfield and McFarquar (1996)
  570. ! and the effective radii from Fu (1996)
  571. ! VH the computation of sad_ice and r_ice is optimized, taking account of units.
  572. ! VH compute SAD representative for cloudy part only (scale with cloud cover)
  573. r_ice=5e-3 ! adopt as the default [cm]
  574. if(ye(i,j,iciwc)>1.0e-15 .and. ye(i,j,icc) > 1e-5) then
  575. ! convert iwc from units [kg/kg] to [gr/m3]
  576. iwc=(ye(i,j,iciwc)*aird*xmair*1e6/avog) / ye(i,j,icc)
  577. sad_ice=1.0e-4*iwc**0.9 ! [cm2/cm3]
  578. ! calculate the r_eff using the relationship of Fu (1996)
  579. ! r_ice=(1.73205/(3*0.917))*((iwc/1e6)/sad_ice) filling constants:
  580. !
  581. ! Bug fix by VH: corrected 3/(4*rho_ice)
  582. !
  583. r_ice=0.8179*((iwc/1e6)/sad_ice) ! [cm]
  584. ! the value adopted in von Kuhlmann and Lawrence is too low
  585. sad_ice=10*sad_ice ! [cm2/cm3]
  586. endif
  587. if(ye(i,j,iclwc)>1.0e-15 .and. ye(i,j,icc)>1e-5 ) then
  588. ! lwc convert from units [kg/kg] to [kg/m3]
  589. lwc=( ye(i,j,iclwc)*aird*xmair*1e3/avog ) / ye(i,j,icc)
  590. lwc=lwc*1e-3 ! convert [kg/m3] to [gr/cm3]
  591. !VH no_cloud=lwc/sphere_vol
  592. !VH sad_cloud=4*pi*r_cloud**2*no_cloud
  593. sad_cloud=3.*lwc/(r_cloud)
  594. endif
  595. ! Assume that loss on cloud particles is not dominating the full loss budget which can
  596. ! remove the full trace gas concentration within one time step, within grid cel that is
  597. ! partly covered with cloud
  598. zcc = min(0.99,ye(i,j,icc))
  599. !
  600. ! We use the original formulation in dentener and crutzen
  601. ! of : kt=(r/Dg + 4/vgamma)-1 * A(cm2/cm3)
  602. airp=ye(i,j,i_pres)
  603. dg=0.1*1e5/airp !simple approximation for diffusion coeff. [cm2/s]
  604. !n2o5... (see IUPAC)
  605. temp=ye(i,j,i_temp)
  606. g_n2o5_l_temp = 2.7e-5*exp(1800./temp)
  607. kt_liq_n2o5=1./((r_cloud/dg)+(4./(2.4e4*g_n2o5_l_temp)))
  608. kt_ice_n2o5=1./((r_ice/dg) +(4./(2.4e4*g_n2o5_i)))
  609. rr(i,j,kn2o5l)=(kt_liq_n2o5*sad_cloud+kt_ice_n2o5*sad_ice)*zcc !liquid cloud & ice n2o5
  610. ! ho2...
  611. kt_liq_ho2=1./((r_cloud/dg)+(4./(2.4e4*g_ho2_l)))
  612. kt_ice_ho2=1./((r_ice/dg) +(4./(2.4e4*g_ho2_i)))
  613. ! HO2 uptake on clouds (set to 0 until a better description is available)
  614. !rr(i,j,kho2_l) =(kt_liq_ho2*sad_cloud +kt_ice_ho2*sad_ice)*zcc !liquid cloud and ice ho2
  615. rr(i,j,kho2_l) = 0.
  616. ! output
  617. sad_cld_out(i,j)=sad_cloud
  618. sad_ice_out(i,j)=sad_ice
  619. ! Aerosol uptake
  620. rr(i,j,kn2o5_aer)=0.
  621. rr(i,j,kno3_aer) =0.
  622. rr(i,j,kho2_aer) =0.
  623. air_vol=ye(i,j,iairm)*Avog / (aird * xmair) !air mass [kg] / air density in units 1e-3[kg/m3] -> volume (units) 1e-3[cm3]
  624. sad_aert=0.
  625. #ifdef with_m7
  626. do imode=1,nmod
  627. aer_conc = 0.
  628. ! Total concentration of aerosol within this mode. Changed to units: [kg]/1e-3[cm3] -> [gr/cm3]
  629. do iaer=1,mode_nm(imode)
  630. aer_conc=aer_conc+rm(i,j,level,mode_tracers(iaer,imode)) / air_vol
  631. enddo
  632. if (aer_conc .gt.1e-15) then
  633. !>>> TvN
  634. ! Avoid using dens_mode, since it does not account for the presence of
  635. ! ammonium nitrate and associated water, and MSA- in the soluble accumulation mode.
  636. ! Since these components are taken into account in rw_mode,
  637. ! the use of dens_mode would introduce inconsistencies.
  638. !aer_dens=max(1.0,dens_mode(region,imode)%d3(i,j,level)) *1.e-3 ! particle density [kg/m3] -> [gr/cm3]
  639. aer_rad =max(1e-10,rw_mode (region,imode)%d3(i,j,level)) *1e2 ! particle median radius [m] -> [cm]
  640. ! To calculate the surface area of each mode,
  641. ! first convert the number median radius to the surface mean radius:
  642. smr_aer = aer_rad * cmr2ras(imode)
  643. ! The suface area can then be calculated as the mean surface area per particle
  644. ! times the number of particles in the mode:
  645. !sad_aer=max(3.0 * aer_conc / ( aer_dens * aer_rad ),1.e-15) ! units [cm2/cm3]
  646. sad_aer = rm(i,j,level,mode_start(imode)) * sad_factor * smr_aer**2 / air_vol
  647. sad_aert=sad_aert+sad_aer ! total aerosol SAD for evaluation purposes
  648. ! In principle one should average the full expression for
  649. ! the rate constant over the lognormal size distributions.
  650. ! In practice, an effective value for the radius is used
  651. ! in the expression for kt (see Jacob, Atm. Env., 2000),
  652. ! in our case the number median radius.
  653. ! <<< TvN
  654. ! Ensure that g_xxx > 0. !!!
  655. kt_aer_n2o5=1./((aer_rad/dg)+(4./(2.4e4 * g_n2o5(imode))))
  656. kt_aer_no3 =1./((aer_rad/dg)+(4./(2.4e4 * g_no3 (imode))))
  657. kt_aer_ho2 =1./((aer_rad/dg)+(4./(2.4e4 * g_ho2 (imode))))
  658. ! Fill reaction rates
  659. rr(i,j,kn2o5_aer)=rr(i,j,kn2o5_aer)+kt_aer_n2o5 * sad_aer
  660. rr(i,j,kno3_aer) =rr(i,j,kno3_aer) +kt_aer_no3 * sad_aer
  661. rr(i,j,kho2_aer) =rr(i,j,kho2_aer) +kt_aer_ho2 * sad_aer
  662. ! aer_rad_max(imode)=max(aer_rad_max(imode),aer_rad)
  663. endif
  664. enddo
  665. !>>> TvN
  666. ! Commented the part below,
  667. ! because rw_mode already accounts for the presence of NO3_a, NH4, MSA, and aerosol water
  668. ! in the soluble accumulation mode (see chemistry.F90).
  669. !
  670. ! simple treatment for NO3_a, NH4 and MSA
  671. !imode = nmod+1
  672. !aer_conc=(rm(i,j,level,inh4)+rm(i,j,level,ino3_a)+rm(i,j,level,imsa)) / air_vol
  673. !if (aer_conc.gt.1e-15) then
  674. ! sad_aer=max(3.0 * aer_conc / ( aer_dens_ref * aer_rad_ref ),1.e-15) ! units [cm2/cm3]
  675. ! sad_aert=sad_aert+sad_aer ! total aerosol SAD for evaluation purposes
  676. ! Ensure that g_xxx > 0. !!!
  677. ! kt_aer_n2o5=1./((aer_rad_ref/dg)+(4./(2.4e4 * g_n2o5(imode))))
  678. ! kt_aer_no3 =1./((aer_rad_ref/dg)+(4./(2.4e4 * g_no3 (imode))))
  679. ! kt_aer_ho2 =1./((aer_rad_ref/dg)+(4./(2.4e4 * g_ho2 (imode))))
  680. ! Fill reaction rates
  681. ! rr(i,j,kn2o5_aer)=rr(i,j,kn2o5_aer)+kt_aer_n2o5 * sad_aer
  682. ! rr(i,j,kno3_aer) =rr(i,j,kno3_aer) +kt_aer_no3 * sad_aer
  683. ! rr(i,j,kho2_aer) =rr(i,j,kho2_aer) +kt_aer_ho2 * sad_aer
  684. !endif
  685. !<<< TvN
  686. #else
  687. ! Uptake on on available aerosol: SO4, NO3, NH4, and MSA.
  688. ! Total concentration of sulfate aerosol (include others) [gr/cm3]
  689. aer_conc=(rm(i,j,level,iso4)+rm(i,j,level,inh4)+rm(i,j,level,ino3_a)+rm(i,j,level,imsa)) / air_vol
  690. if (aer_conc.gt.1e-20) then
  691. sad_aer = 3.0 * aer_conc / ( aer_dens_ref * aer_rad_ref ) ! units [cm2/cm3]
  692. sad_aert=sad_aer
  693. ! Ensure that g_xxx > 0. !!!
  694. kt_aer_n2o5=1./((aer_rad_ref/dg)+(4./(2.4e4 * g_n2o5_aer)))
  695. kt_aer_no3 =1./((aer_rad_ref/dg)+(4./(2.4e4 * g_no3_aer)))
  696. kt_aer_ho2 =1./((aer_rad_ref/dg)+(4./(2.4e4 * g_ho2_aer)))
  697. ! Fill reaction rates
  698. rr(i,j,kn2o5_aer)=kt_aer_n2o5 * sad_aer
  699. rr(i,j,kno3_aer) =kt_aer_no3 * sad_aer
  700. rr(i,j,kho2_aer) =kt_aer_ho2 * sad_aer
  701. endif
  702. #endif /* M7 */
  703. ! output
  704. sad_aer_out(i,j)=sad_aert
  705. end do
  706. end do
  707. !$OMP END PARALLEL
  708. nullify(rm)
  709. ! ok
  710. status = 0
  711. end subroutine calrates
  712. !EOC
  713. #endif /*CHEM*/
  714. END MODULE CHEM_RATES