chem_rates.F90 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004
  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, br
  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 IUPAC 2013
  102. rates_lut(knoo3,k)=zfarr(2.07e-12,-1400.,ztrec)
  103. rates_lut(kho2no,k)=zfarr(3.45e-12,270.,ztrec)
  104. !JEW: changed to IUPAC 2012
  105. rates_lut(kno2oha,k)=3.2e-30*(temp/300.)**(-4.5)
  106. rates_lut(kno2ohb,k)=3.0e-11
  107. ! JEW : reference IUPAC
  108. rates_lut(kohhno3a,k)=zfarr(2.41e-14,460.,ztrec)
  109. rates_lut(kohhno3b,k)=zfarr(6.51e-34,1335.,ztrec)
  110. rates_lut(kohhno3c,k)=zfarr(2.69e-17,2199.,ztrec)
  111. rates_lut(kno2o3,k)=zfarr(1.4e-13,-2470.,ztrec)
  112. rates_lut(knono3,k)=zfarr(1.8e-11,110.,ztrec)
  113. !JEW: changed to IUPAC 2012
  114. rates_lut(kno2no3a,k)=3.6e-30*(temp/300.)**(-4.1)
  115. rates_lut(kno2no3b,k)=1.9e-12*(temp/300.)**0.2
  116. rates_lut(kn2o5a,k)=1.3e-3*(temp/300.)**(-3.5)
  117. rates_lut(kn2o5b,k)=9.7e14*(temp/300.)**0.1
  118. rates_lut(kohhono,k)=zfarr(2.5e-12,260.,ztrec)
  119. rates_lut(khno4oh,k)=zfarr(3.2e-12,690.,ztrec)
  120. rates_lut(kno2ho2a,k)=1.4e-31*(temp/300.)**(-3.1)
  121. rates_lut(kno2ho2b,k)=4.0e-12 ! independant of T
  122. rates_lut(khno4a,k)=zfarr(4.1e-5,-10650.,ztrec)
  123. rates_lut(khno4b,k)=zfarr(6.0e15,-11170.,ztrec)
  124. rates_lut(khonoa,k)=7.4e-31*(temp/300.)**(-2.4)
  125. rates_lut(khonob,k)=3.3e-11*(temp/300.)**(-0.3)
  126. !JEW: changed to JPL2006
  127. rates_lut(kodm,k)=.2095*zfarr(3.3e-11,55.,ztrec)+ &
  128. .7808*zfarr(2.15e-11,110.,ztrec)
  129. !JEW: changed to JPL2006
  130. rates_lut(kh2ood,k)=zfarr(1.63e-10,60.,ztrec)
  131. rates_lut(ko3ho2,k)=zfarr(1.0e-14,-490.,ztrec)
  132. rates_lut(ko3oh,k)=zfarr(1.7e-12,-940.,ztrec)
  133. !JEW: changed to JPL2006
  134. rates_lut(khpoh,k)=1.8e-12
  135. rates_lut(kfrmoh,k)=zfarr(5.5e-12,125.,ztrec)
  136. !JEW: changed to JPL2006
  137. rates_lut(kch4oh,k)=zfarr(2.45e-12,-1775.,ztrec)
  138. ! TvN: JPL2015 gives slightly different exponents:
  139. ! KCOOHA: 1.4 -> 1.0
  140. ! KCOOHC: -0.6 -> 0.0
  141. rates_lut(kcooha,k)=5.9e-33*zt3rec**1.4
  142. rates_lut(kcoohb,k)=1.1e-12*zt3rec**(-1.3)
  143. rates_lut(kcoohc,k)=1.5e-13*zt3rec**(-0.6)
  144. rates_lut(kcoohd,k)=2.1e9*zt3rec**(-6.1)
  145. !JEW: changed to JPL2006
  146. rates_lut(kohmper,k)=zfarr(3.8e-12,200.,ztrec)
  147. rates_lut(kohrooh,k)=zfarr(3.01e-12,190.,ztrec) ! CB05
  148. rates_lut(kho2oh,k)=zfarr(4.8e-11,250.,ztrec)
  149. rates_lut(kh2oh,k)=zfarr(2.8e-12,-1800.,ztrec)
  150. !JEW: changed to IUPAC 2009
  151. br=1./(1.+498.*exp(-1160./temp))
  152. rates_lut(kmo2ho2a,k)=zfarr(3.8e-13,750.,ztrec)
  153. rates_lut(kmo2ho2a,k)=rates_lut(kmo2ho2a,k)*(1.0-br)
  154. rates_lut(kmo2ho2b,k)=zfarr(3.8e-13,750.,ztrec)
  155. rates_lut(kmo2ho2b,k)=rates_lut(kmo2ho2b,k)*br
  156. rates_lut(kmo2no,k)=zfarr(2.3e-12,360.,ztrec)
  157. rates_lut(kmo2mo2,k)=zfarr(9.5e-14,390.,ztrec)
  158. !JEW: changed to JPL2006
  159. ! TvN: It looks like the first two reactions below
  160. ! have updated coefficients in JPL2015:
  161. rates_lut(kho2ho2a,k)=zfarr(3.5e-13,430.,ztrec)
  162. rates_lut(kho2ho2b,k)=zfarr(1.7e-33,1000.,ztrec)
  163. rates_lut(kho2ho2c,k)=zfarr(1.4e-21,2200.,ztrec)
  164. rates_lut(kc41,k)=5.8e-16
  165. rates_lut(kc46,k)=zfarr(8.1e-12,270.,ztrec)
  166. !
  167. ! Reformulated as defined in IUPAC recommendations
  168. !
  169. rates_lut(kc47a,k)=3.28e-28*(temp/300.)**(-6.87)
  170. rates_lut(kc47b,k)=1.125e-11*(temp/300.)**(-1.105)
  171. rates_lut(kc48a,k)=zfarr(1.1e-5,-10100.,ztrec)
  172. rates_lut(kc48b,k)=zfarr(1.9e17,-14100.,ztrec)
  173. !JEW: changed to JPL2006
  174. rates_lut(kc49,k)=zfarr(2.9e-12,500.,ztrec)
  175. rates_lut(kc50,k)=zfarr(4.3e-13,1040.,ztrec)
  176. !------------------------------------------------------
  177. rates_lut(kc52,k)=8.1e-13
  178. rates_lut(kc53,k)=zfarr(1.e15,-8000.,ztrec)
  179. rates_lut(kc54,k)=1.6e3
  180. !JEW: changed to JPL2006
  181. rates_lut(kc57,k)=zfarr(5.4e-12,-610.,ztrec)
  182. !JEW: changed to JPL2006
  183. rates_lut(kc58,k)=zfarr(8.5e-16,1520.,ztrec)
  184. rates_lut(kc59,k)=zfarr(4.6e-14,400.,ztrec)
  185. !JEW: changed to JPL2006
  186. ! TvN: JPL2015 recommends different coefficients
  187. ! for OH+C2H4 (KC61):
  188. ! (1.e-28,-4.5) -> (1.1e-28,-3.5)
  189. ! (8.8e-12,-0.85) -> (8.4e-12,-1.75)
  190. rates_lut(kc61a,k)=1.e-28*(temp/300.)**(-4.5)
  191. rates_lut(kc61b,k)=8.8e-12*(temp/300.)**(-0.85)
  192. !JEW: changed to JPL2006
  193. rates_lut(kc62,k)=zfarr(1.2e-14,-2630.,ztrec)
  194. !JEW: changed to IUPAC2004
  195. rates_lut(kc73,k)=1.5e-11 ! IUPAC
  196. rates_lut(kc76,k)=zfarr(2.7e-11,390.,ztrec) ! IUPAC
  197. rates_lut(kc77,k)=zfarr(1.03e-14,-1995.,ztrec) ! IUPAC
  198. rates_lut(kc78,k)=zfarr(3.15e-12,-450.,ztrec) ! IUPAC
  199. !JEW: changed to JPL2006
  200. rates_lut(kc79,k)=zfarr(2.6e-12,365.,ztrec)
  201. rates_lut(kc80,k)=zfarr(1.6e-12,-2200.,ztrec)
  202. rates_lut(kc81,k)=zfarr(2.6e-12,365.,ztrec) ! bug
  203. rates_lut(kc82,k)=zfarr(7.5e-13,700.,ztrec) ! CB05
  204. rates_lut(kc83,k)=8.e-11
  205. rates_lut(kc84,k)=zfarr(5.9e-13,-360.,ztrec) ! CB05 temp dep
  206. rates_lut(kc85,k)=zfarr(7.5e-13,700.,ztrec) ! CB05
  207. rates_lut(KO3PO2,k)=6.0e-34*(temp/300.)**(-2.4)
  208. rates_lut(KO3PO3,k)=zfarr(8.0e-12,-2060.,ztrec)
  209. rates_lut(KXO2XO2N,k)=6.8e-14
  210. rates_lut(KXO2N,k)=6.8e-14
  211. ! sulfur and ammonia gas phase reactions
  212. ! the hynes et al. parameterisation is replaced by chin et al. 1996
  213. !JEW: changed to JPL2006
  214. rates_lut(kdmsoha,k)= 1.11e-11*exp(-240./temp)
  215. rates_lut(kdmsohb,k)=1.0e-39*exp(5820./temp)
  216. rates_lut(kdmsohc,k)=5.0e-30*exp(6280./temp)
  217. rates_lut(kdmsno3,k)=zfarr(1.9e-13,520.,ztrec)!at 298 1.01e-12
  218. !JEW: changed to JPL2006
  219. rates_lut(kso2oha,k)=3.3e-31*(temp/300.)**(-4.3)
  220. rates_lut(kso2ohb,k)= 1.6e-12*(temp/300.)
  221. !
  222. ! fate of ammonia
  223. !
  224. rates_lut(knh3oh,k)= zfarr(1.7e-12,-710.,ztrec)!1.56e-13 at 298k
  225. rates_lut(knh2oh,k)= 3.4e-11
  226. rates_lut(knh2no,k)= zfarr(4.0e-12,450.,ztrec)!1.72e-11
  227. rates_lut(knh2no2,k)= zfarr(2.1e-12,650.,ztrec)!1.86e-11
  228. rates_lut(knh2ho2,k)= 3.4e-11
  229. ! TvN: JPL2015 only says value is smaller than 6.0e-21
  230. rates_lut(knh2o2,k)= 6.0e-21
  231. rates_lut(knh2o3,k)= zfarr(4.3e-12,-930.,ztrec)!1.89e-13 at 298k
  232. !
  233. ! duplicate rates for NH2O2
  234. !
  235. rates_lut(knh2o2o3,k)= rates_lut(knh2o3,k)
  236. rates_lut(knh2o2no,k)= rates_lut(knh2no,k)
  237. !
  238. ! for higher organics
  239. rates_lut(kohmcho,k) = zfarr(4.4e-12,365.,ztrec) ! IUPAC
  240. rates_lut(kohmch2cho,k) = zfarr(4.9e-12,405.,ztrec)
  241. rates_lut(kno3mcho,k) = zfarr(1.4e-12,-1860.,ztrec)
  242. rates_lut(kno3mch2cho,k) = 6.4e-15
  243. rates_lut(kohole,k) = zfarr(8.2e-12,610.,ztrec) ! IUPAC
  244. rates_lut(ko3ole,k) = 1.0e-17
  245. ! Corrected to expression in Williams et al. (ACP,2013)
  246. !rates_lut(kno3ole,k) = zfarr(4.0e-14,-400.,ztrec)
  247. rates_lut(kno3ole,k) = zfarr(4.6e-14,400.,ztrec)
  248. !
  249. ! the rates for additional BVOC's
  250. !
  251. ! TvN: JPL2015 only gives two digits: 2.9e-12
  252. rates_lut(kohch3oh,k) = zfarr(2.85e-12,-345.,ztrec)
  253. rates_lut(kohhcooh,k) = 4.0e-13
  254. rates_lut(kohmcooh,k) = zfarr(4.2e-14,855.,ztrec)
  255. ! TvN: JPL2015 recommends different coefficients:
  256. ! (6.9e-12,-1000.) -> (7.66e-12,-1020.)
  257. ! (3.0e-12,20.) -> (3.35e-12,0.)
  258. ! (7.6e-12,-585.) -> (8.7e-12,-615.)
  259. rates_lut(kohc2h6,k) = zfarr(6.9e-12,-1000.,ztrec)
  260. rates_lut(kohethoh,k) = zfarr(3.0e-12,20.,ztrec)
  261. rates_lut(kohc3h8,k) = zfarr(7.6e-12,-585.,ztrec)
  262. ! TvN: JPL2015 recommends different coefficients
  263. ! (8.0e-27,-3.5) -> (4.6e-27,-4.)
  264. ! (3.0e-11,-1.0) -> (2.6e-11,-1.3)
  265. rates_lut(kohc3h6a,k) = 8.0e-27*(temp/300.)**(-3.5)
  266. rates_lut(kohc3h6b,k) = 3.0e-11*(temp/300.) **(-1.0)
  267. rates_lut(ko3c3h6,k) = zfarr(5.5e-15,-1880.,ztrec) ! IUPAC
  268. rates_lut(kno3c3h6,k) = zfarr(4.6e-13,-1155.,ztrec) ! IUPAC
  269. !
  270. ! Terpenes
  271. !
  272. rates_lut(kohterp,k) = zfarr(1.2e-11,440.,ztrec) ! IUPAC
  273. rates_lut(ko3terp,k) = zfarr(6.3e-16,-580.,ztrec) ! IUPAC
  274. rates_lut(kno3terp,k) = zfarr(1.2e-12,490.,ztrec) ! IUPAC
  275. !
  276. ! Acetone
  277. !
  278. rates_lut(kohaceta,k) = zfarr(8.8e-12,-1320.,ztrec) ! IUPAC
  279. rates_lut(kohacetb,k) = zfarr(1.7e-14,423.,ztrec) ! IUPAC
  280. rates_lut(kaco2ho2,k) = 1.0e-11
  281. rates_lut(kaco2mo2,k) = 3.8e-12 ! IUPAC
  282. rates_lut(kaco2no,k) = 8.0e-12
  283. rates_lut(kaco2xo2,k) = 6.8e-14
  284. rates_lut(kxo2xo2n,k) = 6.8e-14
  285. rates_lut(kxo2n,k) = 6.8e-14
  286. !
  287. ! MACR, MVK
  288. !
  289. rates_lut(kohmvk,k)=zfarr(2.6e-12,610.,ztrec)
  290. rates_lut(kohmacr,k)=zfarr(8.0e-12,380.,ztrec)
  291. rates_lut(ko3mvk,k)=zfarr(8.5e-16,-1520.,ztrec)
  292. rates_lut(ko3macr,k)=zfarr(1.4e-15,-2100.,ztrec)
  293. !
  294. ! Additional peroxy from C3 VOC
  295. !
  296. rates_lut(kc3h7o2no,k)=zfarr(7.6e-12,-585.,ztrec)
  297. rates_lut(kc3h7o2ho2,k)=zfarr(7.5e-13,700.,ztrec)
  298. rates_lut(khypo2no,k)=zfarr(4.2e-12,180.,ztrec)
  299. rates_lut(khypo2ho2,k)=zfarr(7.5e-13,700.,ztrec)
  300. !
  301. ! methyl peroxy nitrate
  302. !
  303. rates_lut(kmo2no2a,k)=2.5e-30*(temp/300.)**(-5.5)
  304. rates_lut(kmo2no2b,k)=1.8e-11
  305. rates_lut(kch3o2no2a,k)=9.0E-5*exp(-9690./temp)
  306. rates_lut(kch3o2no2b,k)=1.1e16*exp(-10560./temp)
  307. !
  308. ! **** solubility Henry equilibrium
  309. ! HNO3/so4/nh4 just a very high number to take H and
  310. ! dissociation into account
  311. !
  312. henry(:,k)=0.
  313. henry(ih2o2,k)=1.0e5*exp(6300*ztrec)*6.656e-10
  314. henry(ihno3,k)=1e7
  315. henry(ich3o2h,k)=310.*exp(5200*ztrec)*2.664e-8
  316. henry(ich2o,k)=3000.*exp(7200*ztrec)*3.253e-11
  317. henry(irooh,k)=340.*exp(6000.*ztrec)*1.821e-9
  318. henry(ich2o,k)=henry(ich2o,k)*37
  319. henry(ich3o2no2,k)=2.0*exp(4700.*ztrec)*exp(-4700.*(1/298.15))
  320. henry(iorgntr,k)=zfarr(1.8e-6,6000.,ztrec)
  321. henry(iso4,k)=1.e7
  322. henry(inh4,k)=1.e7
  323. henry(imsa,k)=1.e7
  324. henry(iso2,k) =1.2*exp(3120.*ztrec)*2.85e-5
  325. henry(inh3,k) =75.0*exp(3400.*ztrec)*1.10e-5
  326. henry(io3,k)=1.1e-2*exp(2300.*ztrec)*4.45e-4
  327. ! JEW add two new scavenging rates for CH3COCHO and ALD2
  328. ! need KH(eff) due to hydration steps for both species
  329. henry(imgly,k) = 3.2e4*48.6
  330. kh1=17.*exp(5000.*ztrec)*exp(-5000.*(1/298.15))
  331. kh2=13.*exp(5700.*ztrec)*exp(-5700.*(1/298.15))
  332. henry(iald2,k) = ((kh1+kh2)/2.)*1.0246
  333. henry(ihcooh,k) = 8900.*exp(6100.*ztrec)*exp(-6100.*(1/298.15))
  334. henry(ich3oh,k) = 220.0*exp(5200.*ztrec)*2.66e-8
  335. henry(imcooh,k)= 4.1e3*exp(6300.*ztrec)*exp(-6300.*(1/298.15))
  336. henry(iethoh,k) = 190.0*exp(6600.*ztrec)*exp(-6600.*(1/298.15))
  337. henry(iacet,k) = 35.*exp(3800.*ztrec)*exp(-3800.*(1/298.15))
  338. end do !k temperature loop
  339. !
  340. ! marked tracers:
  341. !
  342. henry(io3s,:) = henry(io3,:)
  343. !ok
  344. status = 0
  345. end subroutine rates
  346. !EOC
  347. #ifndef without_chemistry
  348. !------------------------------------------------------------------------------
  349. ! TM5 !
  350. !------------------------------------------------------------------------------
  351. !BOP
  352. !
  353. ! !IROUTINE: calrates
  354. !
  355. ! !DESCRIPTION:
  356. ! calculate rate constants using lookup table rates_lut
  357. ! calculate third bodies
  358. ! calculate heterogeneous removal on aerosols
  359. !
  360. ! External: CALCHET
  361. !
  362. !\
  363. !\
  364. ! !INTERFACE:
  365. !
  366. SUBROUTINE CALRATES( region, level, is, js, rjx, rr, reff_cloud, ye, dt_chem, sad_cld_out, sad_ice_out, sad_aer_out, status )
  367. !
  368. ! !USES:
  369. !
  370. use global_data, only : region_dat, mass_dat
  371. use Dims, only : CheckShape, idate, jm
  372. use chem_param
  373. use binas, only : Avog, pi
  374. use tm5_distgrid, only : dgrid, Get_DistGrid
  375. use reaction_data, only : nreac
  376. #ifdef with_m7
  377. use m7_data, only : rw_mode, dens_mode
  378. use mo_aero_m7, only : nmod, cmr2ras
  379. #endif
  380. !
  381. ! !INPUT PARAMETERS:
  382. !
  383. integer, intent(in) :: region, level, is, js
  384. real, intent(in) :: reff_cloud(is:,js:)
  385. real, intent(in) :: dt_chem
  386. !
  387. ! !OUTPUT PARAMETERS:
  388. !
  389. real, intent(out) :: rr(is:,js:,:) ! reaction rates
  390. integer, intent(out) :: status
  391. real, intent(out) :: sad_cld_out(is:,js:), sad_ice_out(is:,js:), sad_aer_out(is:,js:)
  392. !
  393. ! !INPUT/OUTPUT PARAMETERS:
  394. !
  395. real, intent(inout) :: rjx(is:,js:,:) ! photolysis rate
  396. real, intent(inout) :: ye(is:,js:,:) ! extra 2D fields
  397. !
  398. ! !REVISION HISTORY:
  399. ! 26 Mar 2010 - P. Le Sager - added protex
  400. ! 16 Jun 2011 - P. Le Sager - bug fix from JEW : g_n2o5 values
  401. ! 15 Mar 2012 - P. Le Sager - adapted for lon-lat MPI domain decomposition
  402. ! 12 Jun 2012 - P. Le Sager - fix O3 concentration
  403. !
  404. ! !REMARKS:
  405. !
  406. !EOP
  407. !------------------------------------------------------------------------------
  408. !BOC
  409. character(len=*), parameter :: rname = mname//'/calc_rates'
  410. real, dimension(:,:,:,:), pointer :: rm ! tracer mass
  411. ! help variables
  412. integer :: itemp,i,j, i1, j1, i2, j2, imode, iaer,n,latindex
  413. real :: tr, temp, wv, airp, rx1, rx2, rx3
  414. real :: dum, h2ox, aird, air_vol, o2, o3
  415. real :: x1, x2, xice, xliq
  416. !
  417. ! cloud chemistry of n2o5
  418. real :: dg, kt_liq_n2o5, kt_ice_n2o5, kt_liq_ho2, kt_ice_ho2
  419. real :: g_n2o5_l_temp
  420. real :: r_ice, r_cloud ! cm
  421. real :: sad_ice, sad_cloud, iwc, lwc, o3_p
  422. ! Aerosol heterogeneous chemistry
  423. real :: kt_aer_n2o5, kt_aer_no3, kt_aer_ho2
  424. real :: sad_aer, sad_aert, aer_conc, aer_dens, aer_rad
  425. real :: smr_aer
  426. real, parameter :: sad_factor = 4.*pi*1.e-3 ! 4*pi as prefactor for area, 1e-3 to convert air_vol to cm3
  427. ! Standard aerosol properties density and radius for NO3_A, MSA,NH4, and -if not with_m7- SO4
  428. real, parameter :: aer_dens_ref = 1.7 ! assumed particle density [gr/cm3]
  429. real, parameter :: aer_rad_ref_so4_LRH = 0.18e-4 ! assumed particle radius [cm]
  430. real, parameter :: aer_rad_ref_no3_LRH = 0.2e-4 ! assumed particle radius [cm]
  431. real, parameter :: aer_rad_ref_so4_HRH = 0.25e-4 ! assumed particle radius accounting for abs. H2O[cm]
  432. real, parameter :: aer_rad_ref_no3_HRH = 0.27e-4 ! assumed particle radius accounting for abs. H2O[cm]
  433. ! Parameters to describe subgrid scale mixing
  434. real :: zcc,nn
  435. real, parameter :: M_HO2 = (1+2*16.)/Avog *1e-3 ! HO2 mass, kg/molec
  436. real, parameter :: M_N2O5 = (2*14+5*16.)/Avog *1e-3 ! N2O5 mass, kg/molec
  437. real, parameter :: M_NO3 = (14+3*16.)/Avog *1e-3 ! no3 mass, kg/molec
  438. real :: C_Thermal_N2O5, C_Thermal_HO2,C_Thermal_NO3, gamma, ttemp, factor, g_n2o5_aer_so4
  439. real :: aer_rad_ref, tot, no3frac, so4frac, r_no3, r_so4
  440. real :: zsgs_mix_n2o5
  441. real,dimension(180) :: h2_surface
  442. ! --- begin --------------------------------
  443. CALL GET_DISTGRID( DGRID(region), I_STRT=i1, I_STOP=i2, J_STRT=j1, J_STOP=j2 )
  444. call CheckShape( (/i2-i1+1, j2-j1+1, nj /), shape(rjx), status )
  445. IF_ERROR_RETURN(status = 1)
  446. call CheckShape( (/i2-i1+1, j2-j1+1, nreac /), shape(rr ), status )
  447. IF_ERROR_RETURN(status = 1)
  448. call CheckShape( (/i2-i1+1, j2-j1+1, n_extra/), shape(ye ), status )
  449. IF_ERROR_RETURN(status = 1)
  450. rm => mass_dat(region)%rm
  451. h2_surface(1:180)=h2_lat(1:180,idate(2))
  452. !$OMP parallel &
  453. !$OMP default (none) &
  454. !$OMP shared (level, jsr, jer, isr, ier, region, ye, rates_lut, rr, rjx, rm, fscale) &
  455. !$OMP private (i, j, jss, jee, rx3, temp, itemp, airp, h2ox, aird, &
  456. !$OMP tr, wv, o2, o3, o3_p, rx1, rx2)
  457. rx3=0.6
  458. rr(i1:i2,j1:j2,1:nreac)=0.0
  459. do j=j1,j2
  460. do i=i1,i2
  461. temp=ye(i,j,i_temp)
  462. itemp=nint(temp-float(ntlow))
  463. itemp=min(max(itemp,1),ntemp) !limit temperatures in loop-up table range
  464. airp=ye(i,j,i_pres)
  465. !
  466. ! Calculation of relative humidity [%]
  467. ! Richardson's approximation for water vapor pressure
  468. ! should be calculated in subroutine rates
  469. !
  470. h2ox = ye(i,j,ih2on)
  471. aird = ye(i,j,iairn)
  472. tr=1.-373.15/temp
  473. wv=exp((((-.1299*tr-.6445)*tr-1.976)*tr+13.3185)*tr)
  474. ye(i,j,irh)=h2ox*temp/(1013.25*wv*7.24291e16)
  475. ye(i,j,irh) = max(min(ye(i,j,irh),100.0),0.0) !limit rh between 0-100%
  476. o2=0.209476*aird
  477. o3 = rm(i,j,level,io3) / ye(i,j,iairm) * aird * fscale(io3) !kg ----> #/cm3
  478. !
  479. !**** calculate three body reaction rates
  480. nn=0.75-(1.27*LOG10(0.41)) !
  481. rx1=rates_lut(KNO2OHA,itemp)*aird
  482. rx2=rates_lut(KNO2OHB,itemp)
  483. rr(i,j,kno2oh)=(RX1*RX2)/(RX1+RX2)*10**(log10(0.41)/(1+(log10(RX1/RX2)/nn)**2))
  484. rx1=rates_lut(KOHHNO3C,itemp)
  485. rx2=rates_lut(KOHHNO3B,itemp)*aird
  486. rr(i,j,kohhno3)=rates_lut(KOHHNO3A,itemp)+rx1*rx2/(rx1+rx2)
  487. !
  488. ! reformulated following IUPAC 2013
  489. !
  490. nn=0.75-(1.27*LOG10(0.35))
  491. rx1=rates_lut(KNO2NO3A,itemp)*aird
  492. rx2=rates_lut(KNO2NO3B,itemp)
  493. rr(i,j,kno2no3)=(RX1*RX2)/(RX1+RX2)*10**(log10(0.35)/(1+(log10(RX1/RX2)/nn)**2))
  494. rx1=rates_lut(KN2O5A,itemp)*aird*exp(-11000/temp)
  495. rx2=rates_lut(KN2O5B,itemp)*exp(-11080/temp)
  496. rr(i,j,kn2o5)=(RX1*RX2)/(RX1+RX2)*10**(log10(0.35)/(1+(log10(RX1/RX2)/nn)**2))
  497. nn=0.75-(1.27*LOG10(0.4))
  498. rx1=rates_lut(KNO2HO2A,itemp)*aird
  499. rx2=rates_lut(KNO2HO2B,itemp)
  500. rr(i,j,kno2ho2)=(RX1*RX2)/(RX1+RX2)*10**(log10(0.4)/(1+(log10(RX1/RX2)/nn)**2))
  501. rx1=rates_lut(KHNO4A,itemp)*aird
  502. rx2=rates_lut(KHNO4B,itemp)
  503. !
  504. !=((4.1e-5*exp(-10650/T))*M*(6.0e15*exp(-11170/T)))/((4.1e-5*exp(-10650/T))*M+(6.0e15*exp(-11170/T)))*10^(log10(0.4)/(1+(log10((4.1e-5*exp(-10650/T))*M/(6.0e15*exp(-11170/T)))/(0.75-1.27*log10(0.4)))^2))
  505. !
  506. rr(i,j,khno4m)=(RX1*RX2)/(RX1+RX2)*10**(log10(0.4)/(1+(log10(RX1/RX2)/nn)**2))
  507. rx1=rates_lut(khonoa,itemp)*aird
  508. rx2=rates_lut(khonob,itemp)
  509. rr(i,j,khono)=rx1/(1.+rx1/rx2)*0.81**(1./(1.+log10(rx1/rx2)**2))
  510. nn=0.75-(1.27*LOG10(0.36))
  511. rx1=rates_lut(KMO2NO2A,itemp)*aird
  512. rx2=rates_lut(KMO2NO2B,itemp)
  513. rr(i,j,kmo2no2)=(RX1*RX2)/(RX1+RX2)*10**(log10(0.36)/(1+(log10(RX1/RX2)/nn)**2))
  514. rx1=rates_lut(KCH3O2NO2A,itemp)*aird
  515. rx2=rates_lut(KCH3O2NO2B,itemp)
  516. rr(i,j,kch3o2no2m)=(RX1*RX2)/(RX1+RX2)*10**(log10(0.36)/(1+(log10(RX1/RX2)/nn)**2))
  517. rx1=rates_lut(kcooha,itemp)*aird
  518. rx2=rates_lut(kcoohb,itemp)
  519. rr(i,j,kcooh)=rx1/(1.+rx1/rx2)*rx3**(1./(1.+log10(rx1/rx2)**2))
  520. !JEW: now add the second term for CO + OH
  521. rx1=rates_lut(kcoohc,itemp)
  522. rx2=rates_lut(kcoohd,itemp)/aird
  523. rr(i,j,kcooh)=rr(i,j,kcooh)+(rx1/(1.+rx1/rx2)*rx3**(1./(1.+log10(rx1/rx2)**2)))
  524. rx1=rates_lut(KC61A,itemp)*aird
  525. rx2=rates_lut(KC61B,itemp)
  526. rr(i,j,kc61)=RX1/(1.+RX1/RX2)*RX3**(1./(1.+LOG10(RX1/RX2)**2))
  527. rx1=rates_lut(kohc3h6a,itemp)*aird
  528. rx2=rates_lut(kohc3h6b,itemp)
  529. rr(i,j,kohc3h6)=rx1/(1.+rx1/rx2)*0.5**(1./(1.+log10(rx1/rx2)**2))
  530. !
  531. ! photolysis rates and 2 body reactions
  532. !
  533. rr(i,j,knoo3)=rates_lut(KNOO3,itemp)
  534. rr(i,j,kho2no)=rates_lut(KHO2NO,itemp)
  535. rr(i,j,kmo2no)=rates_lut(KMO2NO,itemp)
  536. rr(i,j,kno2o3)=rates_lut(KNO2O3,itemp)
  537. rr(i,j,knono3)=rates_lut(KNONO3,itemp)
  538. rr(i,j,khno4oh)=rates_lut(KHNO4OH,itemp)
  539. rr(i,j,kohhono)=rates_lut(KOHHONO,itemp)
  540. rr(i,j,kodm)=rates_lut(KODM,itemp)
  541. rr(i,j,kh2ood)=rates_lut(KH2OOD,itemp)
  542. rr(i,j,ko3ho2)=rates_lut(KO3HO2,itemp)
  543. !old formulation rr(i,j,kcooh)=1.5E-13+9E-14*airp/101325.
  544. rr(i,j,ko3oh)=rates_lut(KO3OH,itemp)
  545. rr(i,j,khpoh)=rates_lut(KHPOH,itemp)
  546. rr(i,j,kfrmoh)=rates_lut(KFRMOH,itemp)
  547. rr(i,j,kch4oh)=rates_lut(KCH4OH,itemp)
  548. latindex=j*180/jm(region)
  549. rr(i,j,kh2oh)=rates_lut(kh2oh,itemp)*h2_surface(latindex)*1.0e-9*aird !h2 latitudinal constraint JEW update
  550. rr(i,j,kohmper)=rates_lut(KOHMPER,itemp)
  551. rr(i,j,kohrooh)=rates_lut(KOHROOH,itemp)
  552. rr(i,j,kmo2ho2a)=rates_lut(KMO2HO2a,itemp)
  553. rr(i,j,kmo2ho2b)=rates_lut(KMO2HO2b,itemp)
  554. rr(i,j,kmo2mo2)=rates_lut(KMO2MO2,itemp)
  555. rr(i,j,kho2oh)=rates_lut(KHO2OH,itemp)
  556. rr(i,j,kho2ho2)=(rates_lut(KHO2HO2A,itemp) + &
  557. rates_lut(KHO2HO2B,itemp)*aird)*(1.+rates_lut(KHO2HO2C,itemp)*h2ox)
  558. rr(i,j,kc41)=rates_lut(kc41,itemp)
  559. ! JEW for ALD take the average of the C2 and C3 rate co-efficients; measurements suggest
  560. ! that CH3CHO only comprises 50% of [higher aldehydes] - grossman et al, JGR, 2003.
  561. rr(i,j,kc43)=(rates_lut(kohmcho,itemp)+rates_lut(kohmch2cho,itemp))/2.
  562. rr(i,j,kc44)=(rates_lut(kno3mcho,itemp)+ rates_lut(kno3mch2cho,itemp))/2.
  563. rr(i,j,kc46)=rates_lut(KC46,itemp)
  564. !
  565. ! PAN now reformulated (2014)
  566. !
  567. nn=0.75-(1.27*LOG10(0.3))
  568. rx1=rates_lut(KC47A,itemp)*aird
  569. rx2=rates_lut(KC47B,itemp)
  570. ! rr(i,j,kc47)=RX1/(1.+RX1/RX2)*0.3**(1./(1.+LOG10(RX1/RX2)**2))
  571. !
  572. rr(i,j,kc47)=(RX1*RX2)/(RX1+RX2)*10**(log10(0.3)/(1+(log10(RX1/RX2)/nn)**2))
  573. rx1=rates_lut(KC48A,itemp)*aird
  574. rx2=rates_lut(KC48B,itemp)
  575. ! rr(i,j,kc48)=RX1/(1.+RX1/RX2)*0.3**(1./(1.+LOG10(RX1/RX2)**2)
  576. !
  577. rr(i,j,kc48)=(RX1*RX2)/(RX1+RX2)*10**(log10(0.3)/(1+(log10(RX1/RX2)/nn)**2))
  578. rr(i,j,kc49)=rates_lut(KC49,itemp)
  579. rr(i,j,kc50)=rates_lut(KC50,itemp)
  580. rr(i,j,kc52)=rates_lut(KC52,itemp)
  581. rr(i,j,kc53)=rates_lut(KC53,itemp)
  582. rr(i,j,kc54)=rates_lut(KC54,itemp)
  583. ! JEW updated average for OLE oxidation reactions
  584. rr(i,j,kc57)=(rates_lut(kohmvk,itemp)+rates_lut(kohole,itemp)+rates_lut(kohmacr,itemp))/3.
  585. rr(i,j,kc58)=(rates_lut(ko3mvk,itemp)+rates_lut(ko3ole,itemp)+rates_lut(ko3macr,itemp))/3.
  586. rr(i,j,kc59)=(rates_lut(kno3ole,itemp)+6.0e-16+3.5e-15)/3.
  587. rr(i,j,kc62)=rates_lut(KC62,itemp)
  588. rr(i,j,kc73)=rates_lut(KC73,itemp)
  589. rr(i,j,kc76)=rates_lut(KC76,itemp)
  590. rr(i,j,kc77)=rates_lut(KC77,itemp)
  591. rr(i,j,kc78)=rates_lut(KC78,itemp)
  592. ! JEW use rates in cb05 for XO2 reactions
  593. rr(i,j,kc79)=rates_lut(KC79,itemp)
  594. rr(i,j,kc80)=rates_lut(KC80,itemp)
  595. rr(i,j,kc81)=rates_lut(KC81,itemp)
  596. rr(i,j,kc82)=rates_lut(KC82,itemp)
  597. rr(i,j,kc83)=rates_lut(KC83,itemp)
  598. rr(i,j,kc84)=rates_lut(kc84,itemp)
  599. rr(i,j,kc85)=rates_lut(kc85,itemp)
  600. #ifndef without_photolysis
  601. rjx(i,j,jo3d)=rjx(i,j,jo3d)*rr(i,j,kh2ood)*h2ox / &
  602. ( rr(i,j,kodm)*aird + rr(i,j,kh2ood)*h2ox )
  603. ! this is fraction rjo3d=>OH
  604. #endif
  605. RX1=rates_lut(kso2oha,itemp)*aird
  606. RX2=rates_lut(kso2ohb,itemp)
  607. rr(i,j,kso2oh)=RX1/(1.+RX1/RX2)*0.6**(1./(1.+LOG10(RX1/RX2)**2))
  608. !
  609. ! dmsoha => so2
  610. ! dmsohb => 0.75 SO2 + 0.25 MSA
  611. !
  612. rr(i,j,kdmsoha)=rates_lut(kdmsoha,itemp)
  613. rr(i,j,kdmsohb)=rates_lut(kdmsohb,itemp)*o2/ &
  614. (1.+rates_lut(kdmsohc,itemp)*o2)
  615. rr(i,j,kdmsno3)=rates_lut(kdmsno3,itemp)
  616. ! ammonia chemistry
  617. rr(i,j,knh3oh)=rates_lut(knh3oh,itemp)
  618. rr(i,j,knh2oh)=rates_lut(knh2oh,itemp)
  619. rr(i,j,knh2no)=rates_lut(knh2no,itemp)
  620. rr(i,j,knh2no2)=rates_lut(knh2no2,itemp)
  621. rr(i,j,knh2ho2)=rates_lut(knh2ho2,itemp)
  622. rr(i,j,knh2o2)=rates_lut(knh2o2,itemp)*o2
  623. rr(i,j,knh2o3)=rates_lut(knh2o3,itemp)
  624. rr(i,j,knh2o2no)=rates_lut(knh2no,itemp)
  625. rr(i,j,knh2o2o3)=rates_lut(knh2o3,itemp)
  626. rr(i,j,knh2o2ho2)=rates_lut(knh2ho2,itemp)
  627. rr(i,j,krn222)=2.11e-6 ! s-1 decay time Rn222 to Pb210
  628. rr(i,j,ko3po2) = rates_lut(ko3po2,itemp)*aird
  629. rr(i,j,ko3po3) = rates_lut(ko3po3,itemp)
  630. rr(i,j,kxo2xo2n) = 6.8e-14
  631. rr(i,j,kxo2n) = 6.8e-14
  632. !
  633. ! O3P in molecules cm3
  634. !
  635. ! JEW: Reformulated June 2012
  636. !
  637. ! Runaway O3 above 50 hPa due to missing stratopsheric chemistry
  638. ! therefore use pressure as an index
  639. !
  640. o3_p=0.
  641. if(airp/100 > 50. .and. airp/100. < 350.) o3_p=(2*rjx(i,j,jo2)*o2)
  642. !
  643. ! [O2] not used in the ebi
  644. !
  645. rjx(i,j,jo2)=(o3_p/(rr(i,j,ko3po2)*o2+rr(i,j,ko3po3)*o3)) * o2 * rr(i,j,ko3po2)
  646. rr(i,j,ko3po3)=rr(i,j,ko3po3)*o3_p
  647. !
  648. ! additional biogenic reactions
  649. rr(i,j,kohhcooh)=4.0e-13
  650. rr(i,j,kohch3oh)=rates_lut(kohch3oh,itemp)
  651. ! additional no3 peroxy reactions
  652. rr(i,j,kno3ho2)=4.0e-12
  653. rr(i,j,kno3mo2)=1.2e-12
  654. rr(i,j,kno3c2o3)=4.0e-12
  655. rr(i,j,kno3xo2)=2.5e-12 ! Zaveri and Peters
  656. ! additional C2 compounds
  657. rr(i,j,kohmcooh)=rates_lut(kohmcooh,itemp)
  658. rr(i,j,kohc2h6)=rates_lut(kohc2h6,itemp)
  659. rr(i,j,kohethoh)=rates_lut(kohethoh,itemp)
  660. rr(i,j,kohc3h8)=rates_lut(kohc3h8,itemp)
  661. rr(i,j,ko3c3h6)=rates_lut(ko3c3h6,itemp)
  662. rr(i,j,kno3c3h6)=rates_lut(kno3c3h6,itemp)
  663. !
  664. ! TERPENE reactions
  665. !
  666. rr(i,j,kohterp) = rates_lut(kohterp,itemp)
  667. rr(i,j,ko3terp) = rates_lut(ko3terp,itemp)
  668. rr(i,j,kno3terp) = rates_lut(kno3terp,itemp)
  669. !
  670. ! ISPD reactions
  671. !
  672. rr(i,j,kohispd)=(rates_lut(kohmvk,itemp)+rates_lut(kohmacr,itemp))/2
  673. rr(i,j,ko3ispd)=(rates_lut(ko3mvk,itemp)+rates_lut(ko3macr,itemp))/2
  674. rr(i,j,kno3ispd)=(6.0e-16+3.4e-15)/2
  675. !
  676. ! Radon decay
  677. rr(i,j,krn222)=2.11e-6 ! s-1 decay time Rn222 to Pb210
  678. !
  679. ! acetone
  680. rr(i,j,kohacet)=rates_lut(kohaceta,itemp)+rates_lut(kohacetb,itemp)
  681. rr(i,j,kaco2ho2)=1.0e-11
  682. rr(i,j,kaco2mo2)=3.8e-12
  683. rr(i,j,kaco2no)=8.0e-12
  684. rr(i,j,kaco2xo2)=6.8e-14 ! CB05 peroxy-loss
  685. rr(i,j,kxo2xo2n)=6.8e-14
  686. rr(i,j,kxo2n)=6.8e-14
  687. !
  688. !
  689. rr(i,j,kc3h7o2no)=rates_lut(kc3h7o2no,itemp)
  690. rr(i,j,kc3h7o2ho2)=rates_lut(kc3h7o2ho2,itemp)
  691. rr(i,j,khypo2no)=rates_lut(khypo2no,itemp)
  692. rr(i,j,khypo2ho2)=rates_lut(khypo2ho2,itemp)
  693. !
  694. !
  695. end do
  696. end do !_lat/lon loop
  697. !$OMP END PARALLEL
  698. !
  699. ! heterogeneous reaction of N2O5 and H2O -> 2 HNO3 on cloud and aerosol
  700. ! included in gas phase chemistry.
  701. ! VH, August-December 2013: Methodology updated, and extended with reactions for NO3 and HO2.
  702. ! rw_mode and dens_mode contain the average radius [m] and density [kg/m3] for each modes,
  703. ! as computed in subroutine m7_averageproperties (pm6rp and prhop)
  704. !
  705. !$OMP PARALLEL &
  706. !$OMP default (none) &
  707. !$OMP shared (jsr, jer, isr, ier, region, ye, rr, reff_cloud,level, &
  708. !$OMP g_ho2,g_n2o5,g_no3, sad_cld_out, sad_ice_out,sad_aer_out, &
  709. !$OMP mode_nm, mode_tracers, rm,dt_chem, m_n2o5, m_ho2, m_no3) &
  710. !$OMP private (i, j, jss, jee, airp, dg, aird, xliq, xice, &
  711. !$OMP temp, sad_ice,sad_cloud,iwc,lwc,r_ice, zcc,&
  712. !$OMP r_cloud, sad_aer,sad_aert, aer_conc, air_vol, &
  713. !$OMP g_n2o5_l_temp,kt_aer_n2o5, kt_aer_ho2,kt_aer_no3, &
  714. !$OMP kt_liq_n2o5, kt_ice_n2o5, kt_liq_ho2, kt_ice_ho2 ) &
  715. #ifdef with_m7
  716. !$OMP shared (rw_mode, dens_mode) &
  717. !$OMP private (aer_rad, aer_dens)
  718. #endif
  719. do j = j1, j2
  720. do i=i1, i2
  721. sad_cloud = 0.
  722. sad_ice = 0.
  723. aird = ye(i,j,iairn) ! #/cm3
  724. ! typically the optical reff is somewhat larger than the physical r by 1-2um
  725. ! therefore downsize reff by 2.0uM for droplets 9-13uM and 1.0 for those between
  726. ! 6-9um
  727. ! http://www-das.uwyo.edu/~geerts/cwx/notes/chap08/moist_cloud.html
  728. ! set cloud droplet radius [cm]
  729. if(reff_cloud(i,j)>=9.0) then
  730. r_cloud = (reff_cloud(i,j)-2.0)/1e4
  731. elseif(reff_cloud(i,j)>=6.0) then
  732. r_cloud = (reff_cloud(i,j)-1.0)/1e4
  733. elseif(reff_cloud(i,j)>= 4.0) then
  734. r_cloud = (reff_cloud(i,j)-0.25)/1e4
  735. else
  736. r_cloud = 4.0e-4 ! ensure a minimum - sometime reff_cloud is zero, i.e. not defined...
  737. endif
  738. ! SAD for ice particles
  739. ! JEW: The surface area density for ice particles in now linked to
  740. ! the IWC by the parameterization of Heymsfield and McFarquar (1996)
  741. ! and the effective radii from Fu (1996)
  742. ! VH the computation of sad_ice and r_ice is optimized, taking account of units.
  743. ! VH compute SAD representative for cloudy part only (scale with cloud cover)
  744. r_ice=5e-3 ! adopt as the default [cm]
  745. if(ye(i,j,iciwc)>1.0e-15 .and. ye(i,j,icc) > 1e-5) then
  746. ! convert iwc from units [kg/kg] to [gr/m3]
  747. iwc=(ye(i,j,iciwc)*aird*xmair*1e6/avog) / ye(i,j,icc)
  748. sad_ice=1.0e-4*iwc**0.9 ! [cm2/cm3]
  749. ! calculate the r_eff using the relationship of Fu (1996)
  750. ! r_ice=(1.73205/(3*0.917))*((iwc/1e6)/sad_ice) filling constants:
  751. !
  752. ! Bug fix by VH: corrected 3/(4*rho_ice)
  753. !
  754. r_ice=0.8179*((iwc/1e6)/sad_ice) ! [cm]
  755. ! the value adopted in von Kuhlmann and Lawrence is too low
  756. sad_ice=10*sad_ice ! [cm2/cm3]
  757. endif
  758. if(ye(i,j,iclwc)>1.0e-15 .and. ye(i,j,icc)>1e-5 ) then
  759. ! lwc convert from units [kg/kg] to [kg/m3]
  760. lwc=( ye(i,j,iclwc)*aird*xmair*1e3/avog ) / ye(i,j,icc)
  761. lwc=lwc*1e-3 ! convert [kg/m3] to [gr/cm3]
  762. !VH no_cloud=lwc/sphere_vol
  763. !VH sad_cloud=4*pi*r_cloud**2*no_cloud
  764. sad_cloud=3.*lwc/(r_cloud)
  765. endif
  766. ! Assume that loss on cloud particles is not dominating the full loss budget which can
  767. ! remove the full trace gas concentration within one time step, within grid cel that is
  768. ! partly covered with cloud
  769. zcc = min(0.99,ye(i,j,icc))
  770. !
  771. ! We use the original formulation in dentener and crutzen
  772. ! of : kt=(r/Dg + 4/vgamma)-1 * A(cm2/cm3)
  773. airp=ye(i,j,i_pres)
  774. dg=0.1*1e5/airp !simple approximation for diffusion coeff. [cm2/s]
  775. !n2o5... (see IUPAC)
  776. temp=ye(i,j,i_temp)
  777. C_Thermal_N2O5 = SQRT (8*1.38E-23 *temp / (PI*M_N2O5 ) ) * 1e2 ! m/s -> cm/sec
  778. C_Thermal_HO2 = SQRT (8*1.38E-23 *temp / (PI*M_HO2 ) ) * 1e2 ! m/s -> cm/sec
  779. C_Thermal_NO3 = SQRT (8*1.38E-23 *temp / (PI*M_NO3 ) ) * 1e2 ! m/s -> cm/sec
  780. !=====================================================================================
  781. !
  782. ! Full parameterization of gamma N2O5 variability of SO4= aerosols from Evans and Jacob, 2005
  783. ! Implemented by JEW July 2014
  784. !
  785. ! RH dependence from Kane et al., Heterogeneous uptake of gaseous N2O5 by (NH4)2SO4
  786. ! NH4HSO4 and H2SO4 aerosols, J. Phys. Chem A, 2001, 105, 6465-6470
  787. !
  788. !=====================================================================================
  789. gamma=2.79e-4 + ye(i,j,irh)*(1.3e-4 + ye(i,j,irh)*(-3.43e-6 + ye(i,j,irh)*7.52e-8))
  790. ttemp=MAX(temp, 282.)
  791. factor=10.**(-2.0-4.0e-2*(ttemp-294.0))/0.01
  792. g_n2o5_aer_so4=gamma*factor
  793. if(zcc > 0.0) then
  794. g_n2o5_l_temp = 2.7e-5*exp(1800./temp)
  795. kt_liq_n2o5=1./((r_cloud/dg)+(4./(C_Thermal_N2O5*g_n2o5_l_temp)))
  796. kt_ice_n2o5=1./((r_ice/dg) +(4./(C_Thermal_N2O5*g_n2o5_i)))
  797. !
  798. ! Scaling factor accounting for subgrid-scale mixing within time step
  799. ! Assume a lagrangian time scale ZDT_LAG of 3h (i.e.time scale for mixing)
  800. ! ZSGS_MIX=0 if CC=0, and 1 if CC=1; ZSGS_MIX is lower than CC for 0<CC<1 ,reducing the effective reaction rate
  801. zsgs_mix_n2o5=zcc*(1.-exp(-0.01/(1.-zcc)))
  802. !
  803. rr(i,j,kn2o5l)=(kt_liq_n2o5*sad_cloud+kt_ice_n2o5*sad_ice)*zsgs_mix_n2o5 !liquid cloud & ice n2o5
  804. ! ho2...
  805. kt_liq_ho2=1./((r_cloud/dg)+(4./(C_Thermal_HO2*g_ho2_l)))
  806. kt_ice_ho2=1./((r_ice/dg) +(4./(C_Thermal_HO2*g_ho2_i)))
  807. endif
  808. ! HO2 uptake on clouds (set to 0 until a better description is available)
  809. !rr(i,j,kho2_l) =(kt_liq_ho2*sad_cloud +kt_ice_ho2*sad_ice)*zcc !liquid cloud and ice ho2
  810. rr(i,j,kho2_l) = 0.
  811. ! output
  812. sad_cld_out(i,j)=sad_cloud
  813. sad_ice_out(i,j)=sad_ice
  814. ! Aerosol uptake
  815. rr(i,j,kn2o5_aer)=0.
  816. rr(i,j,kno3_aer) =0.
  817. rr(i,j,kho2_aer) =0.
  818. 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]
  819. sad_aert=0.
  820. #ifdef with_m7
  821. do imode=1,nmod
  822. aer_conc = 0.
  823. ! Total concentration of aerosol within this mode. Changed to units: [kg]/1e-3[cm3] -> [gr/cm3]
  824. do iaer=1,mode_nm(imode)
  825. aer_conc=aer_conc+rm(i,j,level,mode_tracers(iaer,imode)) / air_vol
  826. enddo
  827. if (aer_conc .gt.1e-15) then
  828. !>>> TvN
  829. ! Avoid using dens_mode, since it does not account for the presence of
  830. ! ammonium nitrate and associated water, and MSA- in the soluble accumulation mode.
  831. ! Since these components are taken into account in rw_mode,
  832. ! the use of dens_mode would introduce inconsistencies.
  833. !aer_dens=max(1.0,dens_mode(region,imode)%d3(i,j,level)) *1.e-3 ! particle density [kg/m3] -> [gr/cm3]
  834. aer_rad =max(1e-10,rw_mode (region,imode)%d3(i,j,level)) *1e2 ! particle median radius [m] -> [cm]
  835. ! To calculate the surface area of each mode,
  836. ! first convert the number median radius to the surface mean radius:
  837. smr_aer = aer_rad * cmr2ras(imode)
  838. ! The suface area can then be calculated as the mean surface area per particle
  839. ! times the number of particles in the mode:
  840. !sad_aer=max(3.0 * aer_conc / ( aer_dens * aer_rad ),1.e-15) ! units [cm2/cm3]
  841. sad_aer = rm(i,j,level,mode_start(imode)) * sad_factor * smr_aer**2 / air_vol
  842. sad_aert=sad_aert+sad_aer ! total aerosol SAD for evaluation purposes
  843. ! In principle one should average the full expression for
  844. ! the rate constant over the lognormal size distributions.
  845. ! In practice, an effective value for the radius is used
  846. ! in the expression for kt (see Jacob, Atm. Env., 2000),
  847. ! in our case the number median radius.
  848. ! <<< TvN
  849. ! Ensure that g_xxx > 0. !!!
  850. kt_aer_n2o5=1./((aer_rad/dg)+(4./(C_Thermal_N2O5 * g_n2o5(imode))))
  851. kt_aer_no3 =1./((aer_rad/dg)+(4./(C_Thermal_NO3 * g_no3 (imode))))
  852. kt_aer_ho2 =1./((aer_rad/dg)+(4./(C_Thermal_HO2 * g_ho2 (imode))))
  853. ! Fill reaction rates
  854. rr(i,j,kn2o5_aer)=rr(i,j,kn2o5_aer)+kt_aer_n2o5 * sad_aer
  855. rr(i,j,kno3_aer) =rr(i,j,kno3_aer) +kt_aer_no3 * sad_aer
  856. rr(i,j,kho2_aer) =rr(i,j,kho2_aer) +kt_aer_ho2 * sad_aer
  857. ! aer_rad_max(imode)=max(aer_rad_max(imode),aer_rad)
  858. endif
  859. enddo
  860. !>>> TvN
  861. ! Commented the part below,
  862. ! because rw_mode already accounts for the presence of NO3_a, NH4, MSA, and aerosol water
  863. ! in the soluble accumulation mode (see chemistry.F90).
  864. !
  865. ! simple treatment for NO3_a, NH4 and MSA
  866. !imode = nmod+1
  867. !aer_conc=(rm(i,j,level,inh4)+rm(i,j,level,ino3_a)+rm(i,j,level,imsa)) / air_vol
  868. !if (aer_conc.gt.1e-15) then
  869. ! FIXME - need to CHECK AER_RAD_REF - first iteration
  870. ! if(ye(i,j,irh) > 69.0) then
  871. ! aer_rad_ref = ( rm(i,j,level,ino3_a)*aer_rad_ref_no3_HRH + &
  872. ! rm(i,j,level,imsa )*aer_rad_ref_so4_HRH ) /&
  873. ! (rm(i,j,level,ino3_a) + rm(i,j,level,imsa))
  874. ! else
  875. ! aer_rad_ref = ( rm(i,j,level,ino3_a)*aer_rad_ref_no3_LRH + &
  876. ! rm(i,j,level,imsa )*aer_rad_ref_so4_LRH ) /&
  877. ! (rm(i,j,level,ino3_a) + rm(i,j,level,imsa))
  878. ! endif
  879. ! sad_aer=max(3.0 * aer_conc / ( aer_dens_ref * aer_rad_ref ),1.e-15) ! units [cm2/cm3]
  880. ! sad_aert=sad_aert+sad_aer ! total aerosol SAD for evaluation purposes
  881. ! Ensure that g_xxx > 0. !!!
  882. ! kt_aer_n2o5=1./((aer_rad_ref/dg)+(4./(C_Thermal_N2O5 * g_n2o5(imode))))
  883. ! kt_aer_no3 =1./((aer_rad_ref/dg)+(4./(C_Thermal_NO3 * g_no3 (imode))))
  884. ! kt_aer_ho2 =1./((aer_rad_ref/dg)+(4./(C_Thermal_HO2 * g_ho2 (imode))))
  885. ! Fill reaction rates
  886. ! rr(i,j,kn2o5_aer)=rr(i,j,kn2o5_aer)+kt_aer_n2o5 * sad_aer
  887. ! rr(i,j,kno3_aer) =rr(i,j,kno3_aer) +kt_aer_no3 * sad_aer
  888. ! rr(i,j,kho2_aer) =rr(i,j,kho2_aer) +kt_aer_ho2 * sad_aer
  889. !endif
  890. !<<< TvN
  891. #else
  892. ! Uptake on on available aerosol: SO4, NO3, NH4, and MSA.
  893. ! Total concentration of sulfate aerosol (include others) [gr/cm3]
  894. 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
  895. if (aer_conc.gt.1e-20) then
  896. no3frac=rm(i,j,level,ino3_a)/air_vol !IGNORE NH4?
  897. so4frac=(rm(i,j,level,iso4)+rm(i,j,level,imsa))/air_vol
  898. !
  899. ! JEW (2014) : Introduce a crude fix for swelling of particles at high RH
  900. ! NH4+ exists in either SO4-- or NO3- state, so don't double count
  901. ! for aerosol volumes.
  902. !
  903. if(ye(i,j,irh) < 70.0) then
  904. r_no3=(no3frac/aer_conc)*aer_rad_ref_no3_LRH
  905. r_so4=(so4frac/aer_conc)*aer_rad_ref_so4_LRH
  906. aer_rad_ref=r_no3+r_so4
  907. endif
  908. if(ye(i,j,irh) > 69.0) then
  909. r_no3=(no3frac/aer_conc)*aer_rad_ref_no3_HRH
  910. r_so4=(so4frac/aer_conc)*aer_rad_ref_so4_HRH
  911. aer_rad_ref=r_no3+r_so4
  912. endif
  913. sad_aer = 3.0 * aer_conc / ( aer_dens_ref * aer_rad_ref ) ! units [cm2/cm3]
  914. sad_aert=sad_aer
  915. ! Ensure that g_xxx > 0. !!!
  916. kt_aer_n2o5=1./((r_no3/dg)+(4./(C_Thermal_N2O5 * g_n2o5_aer)))
  917. kt_aer_n2o5=kt_aer_n2o5+(1./((r_so4/dg)+(4./(C_Thermal_N2O5 * g_n2o5_aer_so4))))
  918. kt_aer_no3 =1./((aer_rad_ref/dg)+(4./(C_Thermal_NO3 * g_no3_aer)))
  919. kt_aer_ho2 =1./((aer_rad_ref/dg)+(4./(C_Thermal_HO2 * g_ho2_aer)))
  920. ! Fill reaction rates
  921. rr(i,j,kn2o5_aer)=kt_aer_n2o5 * sad_aer
  922. rr(i,j,kno3_aer) =kt_aer_no3 * sad_aer
  923. rr(i,j,kho2_aer) =kt_aer_ho2 * sad_aer
  924. endif
  925. #endif /* M7 */
  926. ! output
  927. sad_aer_out(i,j)=sad_aert
  928. end do
  929. end do
  930. !$OMP END PARALLEL
  931. nullify(rm)
  932. status = 0
  933. end subroutine calrates
  934. !EOC
  935. #endif /*CHEM*/
  936. END MODULE CHEM_RATES