ebischeme.F90 100 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202
  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: EBISCHEME
  13. !
  14. ! !DESCRIPTION: Eulerian Backward Iteration (EBI) is a chemistry solver for
  15. ! the modified CB05 scheme.
  16. !\\
  17. !\\
  18. ! !INTERFACE:
  19. !
  20. module EBISCHEME
  21. !
  22. ! !USES:
  23. !
  24. use GO, only : gol, goPr, goErr
  25. use dims, only : nregions
  26. use tm5_distgrid, only : dgrid, Get_DistGrid
  27. use chem_param
  28. #ifdef with_budgets
  29. use budget_global, only : nbudg, nbud_vg
  30. use reaction_data, only : nreac, nreacw
  31. use photolysis_data, only : nj
  32. #endif
  33. implicit none
  34. private
  35. !
  36. ! !PUBLIC MEMBER FUNCTIONS:
  37. !
  38. public :: EBI
  39. !
  40. ! !PUBLIC DATA MEMBERS:
  41. !
  42. #ifdef with_budgets
  43. real, dimension(nregions), public :: sum_wetchem
  44. real, dimension(nregions), public :: sum_chemistry
  45. real, dimension(nregions), public :: sum_deposition
  46. type, public :: buddep_data
  47. real, dimension(:,:,:), pointer :: dry ! i,j,ntrace
  48. end type buddep_data
  49. type(buddep_data), dimension(nregions), public :: buddep_dat
  50. real, dimension(nbudg, nbud_vg, nreac ), public :: budrrg
  51. real, dimension(nbudg, nbud_vg, nj ), public :: budrjg
  52. real, dimension(nbudg, nbud_vg, nreacw), public :: budrwg
  53. real, dimension(nbudg, nbud_vg, nmark ), public :: budmarkg
  54. !allow saving of production of aqueous, gas-phase sulfate, elvoc, svoc
  55. type,public :: production_data
  56. real, dimension(:,:,:,:),pointer :: prod !i,j,lev,nprod
  57. end type production_data
  58. integer,parameter,public :: nprod_AC_o3=2
  59. integer,parameter,public :: nprod=12
  60. type(production_data), dimension(nregions),public:: diag_prod
  61. !The chemical production container for AerChemMIP output, needs own container, since the variable is zeroed when
  62. ! writing out and could possibly conflict with the general output routine.
  63. integer,parameter,public :: nprod_AC=3 ! N=3: AQSO4, GASSO4, SOA
  64. type(production_data), dimension(nregions),public:: AC_diag_prod
  65. type(production_data), dimension(nregions),public:: AC_O3_lp
  66. real,dimension(:,:),pointer::temp_prod_so4
  67. real,dimension(:,:),pointer::temp_prod_vocs
  68. #endif
  69. logical, public::isoprene_on
  70. character(len=*), parameter :: mname = 'ebischeme'
  71. !
  72. ! !REVISION HISTORY:
  73. !
  74. ! Feb 2007 - Elisabetta Vignati - changed for inclusion of cloud chemistry on modes
  75. ! 22 Mar 2012 - Philippe Le Sager - adapted for lon-lat MPI domain decomposition
  76. ! 21 mar 2014 - Jason Williams - port the modified CB05 chemistry scheme
  77. !
  78. ! !REMARKS:
  79. ! (1) initializations are made in chemistry/chemistry_init
  80. !
  81. ! !TODO : FIXME check sum_chemistry and sum_deposition
  82. !
  83. !EOP
  84. !------------------------------------------------------------------------
  85. contains
  86. !--------------------------------------------------------------------------
  87. ! TM5 !
  88. !--------------------------------------------------------------------------
  89. !BOP
  90. !
  91. ! !IROUTINE: EBI
  92. !
  93. ! !DESCRIPTION: perform Eulerian backwards chemistry at one model layer
  94. ! level in one region
  95. !\\
  96. !\\
  97. ! !INTERFACE:
  98. !
  99. subroutine EBI( region, level, is, js, rj, rr, y, ye, status)
  100. !
  101. ! !USES:
  102. !
  103. use dims, only : im, jm, nchem, tref, okdebug
  104. use Dims, only : CheckShape
  105. use binas, only : avog
  106. use chem_param, only : xmso4
  107. use global_data, only : region_dat
  108. #ifndef without_dry_deposition
  109. use dry_deposition, only : vd
  110. #endif
  111. !
  112. ! !INPUT PARAMETERS:
  113. !
  114. integer, intent(in) :: region, level, is, js
  115. real, intent(in) :: rr(is:,js:,:) ! array of reaction rates
  116. real, intent(in) :: rj(is:,js:,:) ! array of photolysis rates
  117. !
  118. ! !INPUT/OUTPUT PARAMETERS:
  119. !
  120. real, intent(inout) :: y(is:,js:,:) ! array of concentration
  121. real, intent(inout) :: ye(is:,js:,:)
  122. !
  123. ! !OUTPUT PARAMETERS:
  124. !
  125. integer, intent(out) :: status
  126. !
  127. ! !REVISION HISTORY:
  128. ! 22 Mar 2012 - P. Le Sager - adapted for lon-lat MPI domain decomposition
  129. !
  130. !EOP
  131. !------------------------------------------------------------------------
  132. !BOC
  133. character(len=*), parameter :: rname = mname//'/ebi'
  134. #ifdef with_budgets
  135. real, dimension(:,:,:), allocatable :: cr2, cr3, cr4 ! reaction budgets
  136. #endif
  137. real, dimension(:,:,:), allocatable :: y0
  138. real :: dtime, dt, dt2, fnoy
  139. integer :: iterebi, i, j, ib, maxit
  140. integer :: io, sfstart, sfend
  141. !SOA parameters
  142. real,parameter :: total_soa_yield_isoprene=0.01
  143. real,parameter :: total_soa_yield_terpenes=0.15
  144. real,parameter :: y_oh_isop_elvoc=0.0003
  145. real,parameter :: y_o3_isop_elvoc=0.0001
  146. real,parameter :: y_oh_terp_elvoc=0.01
  147. real,parameter :: y_o3_terp_elvoc=0.05
  148. real :: y_oh_isop_svoc ! =0.01-0.0003
  149. real :: y_o3_isop_svoc ! =0.01-0.0001
  150. real :: y_oh_terp_svoc ! =0.15-0.01
  151. real :: y_o3_terp_svoc ! =0.15-0.05
  152. ! For vectorization/blocking ....
  153. ! npts can be varied to optimize cache memory management.
  154. integer, parameter :: npts=15
  155. integer, dimension(npts) :: ipts, jpts
  156. real, dimension(npts, nreac ) :: rrv
  157. real, dimension(npts, nj ) :: rjv
  158. real, dimension(npts, ntrace) :: vdv ! deposition velocities
  159. real, dimension(npts) :: emino
  160. real, dimension(npts, maxtrace) :: yv, y0v
  161. integer :: iv, itrace, ivt, n
  162. integer :: i1, j1, i2, j2
  163. ! --- BEGIN --------------------------------
  164. call Get_DistGrid( dgrid(region), I_STRT=i1, I_STOP=i2, J_STRT=j1, J_STOP=j2 )
  165. ! check arguments ...
  166. call CheckShape( (/i2-i1+1, j2-j1+1, nreac /), shape(rr), status )
  167. IF_NOTOK_RETURN(status=1)
  168. call CheckShape( (/i2-i1+1, j2-j1+1, nj /), shape(rj), status )
  169. IF_NOTOK_RETURN(status=1)
  170. call CheckShape( (/i2-i1+1, j2-j1+1, maxtrace/), shape(y ), status )
  171. IF_NOTOK_RETURN(status=1)
  172. call CheckShape( (/i2-i1+1, j2-j1+1, n_extra /), shape(ye), status )
  173. IF_NOTOK_RETURN(status=1)
  174. dtime=nchem/(2*tref(region))
  175. !CMK iterebi=max(1,nint(dtime/2400)) !needed if nchem <2400
  176. iterebi=max(1,nint(dtime/1350)) !needed if nchem <2400
  177. dt=dtime/iterebi
  178. ! define svoc yield as remainder total soa yield after elvoc yields
  179. ! total yields at present (to check see variable defs):
  180. ! 1% for isoprene
  181. ! 15% for terpenes
  182. y_oh_isop_svoc=total_soa_yield_isoprene - y_oh_isop_elvoc
  183. y_o3_isop_svoc=total_soa_yield_isoprene - y_o3_isop_elvoc
  184. y_oh_terp_svoc=total_soa_yield_terpenes - y_oh_terp_elvoc
  185. y_o3_terp_svoc=total_soa_yield_terpenes - y_o3_terp_elvoc
  186. allocate( y0 (i1:i2, j1:j2, maxtrace))
  187. #ifdef with_budgets
  188. allocate( cr2(i1:i2, j1:j2, nj ))
  189. allocate( cr3(i1:i2, j1:j2, nreac ))
  190. allocate( cr4(i1:i2, j1:j2, nreacw ))
  191. allocate( temp_prod_so4(npts,2))
  192. allocate( temp_prod_vocs(npts,8))
  193. #endif
  194. !*** SCALING OF NOx, which has changed due to transport/deposition
  195. ! This does not yet work. TODO: Make this working. (FIXME : ask VH what's this is about???)
  196. do j = j1, j2
  197. do i = i1, i2
  198. y(i,j,ino) =max(1e-3,y(i,j,ino))
  199. y(i,j,ino2) =max(1e-3,y(i,j,ino2))
  200. y(i,j,ino3) =max(1e-3,y(i,j,ino3))
  201. y(i,j,in2o5)=max(1e-3,y(i,j,in2o5))
  202. y(i,j,ihno4)=max(1e-3,y(i,j,ihno4))
  203. fnoy=y(i,j,ino)+y(i,j,ino2)+y(i,j,ino3)+2.*y(i,j,in2o5)+y(i,j,ihno4)
  204. fnoy=y(i,j,inox)/fnoy
  205. y(i,j,ino) =fnoy*y(i,j,ino)
  206. y(i,j,ino2) =fnoy*y(i,j,ino2)
  207. y(i,j,ino3) =fnoy*y(i,j,ino3)
  208. y(i,j,in2o5)=fnoy*y(i,j,in2o5)
  209. y(i,j,ihno4)=fnoy*y(i,j,ihno4)
  210. end do
  211. end do
  212. !
  213. ! set budget accumulators to zero
  214. !
  215. #ifdef with_budgets
  216. cr2 = 0.0
  217. cr3 = 0.0
  218. cr4 = 0.0
  219. temp_prod_so4 = 0.0
  220. temp_prod_vocs = 0.0
  221. #endif
  222. !===========================================================
  223. ! ** Start iterating over CHEMISTRY
  224. !===========================================================
  225. do ib=1,iterebi
  226. maxit=8 !CMKTEMP
  227. if(level<=3) maxit = maxit*2 ! lowest layers more iterations
  228. y0 = y
  229. !-------------------------------
  230. ! wet sulphur/ammonia chemistry
  231. !------------------------------
  232. #ifdef with_budgets
  233. call wetS(region, level, i1, j1, y0, dt, y, ye, cr4, status)
  234. #else
  235. call wetS(region, level, i1, j1, y0, dt, y, ye, status)
  236. #endif
  237. !-------------------------------------
  238. ! gasphase chemistry using EBI solver
  239. !-------------------------------------
  240. y0 = y ! reset initial concentrations
  241. ! ______do EBI solver_______
  242. dt2 = dt*dt
  243. ! block the input for EBI for efficiency:
  244. ! copy values with faster running index in inside loop
  245. iv = 0
  246. do j = j1, j2
  247. do i = i1, i2
  248. iv = iv+1
  249. ipts(iv) = i
  250. jpts(iv) = j
  251. if(iv==npts) then
  252. ! copy reaction rates...
  253. do itrace=1,nreac
  254. do ivt=1,npts
  255. rrv(ivt,itrace) = rr(ipts(ivt),jpts(ivt),itrace)
  256. end do
  257. end do
  258. ! copy photolysis rates....
  259. do itrace=1,nj
  260. do ivt=1,npts
  261. rjv(ivt,itrace) = rj(ipts(ivt),jpts(ivt),itrace)
  262. end do
  263. end do
  264. ! copy tracer concentrations ....
  265. do itrace=1,maxtrace
  266. do ivt=1,npts
  267. yv(ivt,itrace) = y(ipts(ivt),jpts(ivt),itrace)
  268. y0v(ivt,itrace) = y0(ipts(ivt),jpts(ivt),itrace)
  269. end do
  270. end do
  271. ! deposition ....
  272. #ifndef without_dry_deposition
  273. if(level == 1) then
  274. do itrace=1,ntrace
  275. do ivt=1,npts
  276. vdv(ivt,itrace) = &
  277. vd(region,itrace)%surf(ipts(ivt),jpts(ivt)) &
  278. / ye(ipts(ivt),jpts(ivt),idz) !1/s
  279. end do
  280. end do
  281. else
  282. vdv(:,:) = 0.0
  283. end if
  284. #endif
  285. ! copy nox emissions....
  286. do ivt=1,npts
  287. emino(ivt) = ye(ipts(ivt),jpts(ivt),ieno)
  288. end do
  289. ! do ebi solver....
  290. call DO_EBI(iv, npts, maxit, dt, dt2, rrv, rjv, vdv, emino, yv, y0v)
  291. do itrace=1,maxtrace
  292. do ivt=1,npts
  293. y(ipts(ivt),jpts(ivt),itrace)=yv(ivt,itrace)
  294. end do
  295. end do
  296. #ifdef with_budgets
  297. #ifdef with_m7
  298. do ivt=1,npts
  299. ! add change in gas-phase so4 production to diagnostic and change to molec->mass kg
  300. diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,1)=diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,1)+temp_prod_so4(ivt,1)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmso4
  301. AC_diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,1)=AC_diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,1)+temp_prod_so4(ivt,1)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmso4
  302. AC_diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,3)=AC_diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,3)&
  303. +temp_prod_vocs(ivt,1)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmelvoc&
  304. +temp_prod_vocs(ivt,2)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmelvoc&
  305. +temp_prod_vocs(ivt,3)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmelvoc&
  306. +temp_prod_vocs(ivt,4)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmelvoc&
  307. +temp_prod_vocs(ivt,5)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmsvoc&
  308. +temp_prod_vocs(ivt,6)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmsvoc&
  309. +temp_prod_vocs(ivt,7)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmsvoc&
  310. +temp_prod_vocs(ivt,8)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmsvoc
  311. diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,5)=diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,5)+temp_prod_vocs(ivt,1)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmelvoc
  312. diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,6)=diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,6)+temp_prod_vocs(ivt,2)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmelvoc
  313. diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,7)=diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,7)+temp_prod_vocs(ivt,3)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmelvoc
  314. diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,8)=diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,8)+temp_prod_vocs(ivt,4)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmelvoc
  315. diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,9)=diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,9)+temp_prod_vocs(ivt,5)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmsvoc
  316. diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,10)=diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,10)+temp_prod_vocs(ivt,6)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmsvoc
  317. diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,11)=diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,11)+temp_prod_vocs(ivt,7)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmsvoc
  318. diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,12)=diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,12)+temp_prod_vocs(ivt,8)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmsvoc
  319. end do
  320. #endif
  321. #endif
  322. iv=0
  323. end if
  324. end do
  325. end do
  326. ! do the 'remaining' points...
  327. if(iv > 0) then
  328. do itrace=1,nreac
  329. do ivt=1,iv
  330. rrv(ivt,itrace) = rr(ipts(ivt),jpts(ivt),itrace)
  331. end do
  332. end do
  333. do itrace=1,nj
  334. do ivt=1,iv
  335. rjv(ivt,itrace) = rj(ipts(ivt),jpts(ivt),itrace)
  336. end do
  337. end do
  338. do itrace=1,maxtrace
  339. do ivt=1,iv
  340. yv(ivt,itrace) = y(ipts(ivt),jpts(ivt),itrace)
  341. y0v(ivt,itrace) = y0(ipts(ivt),jpts(ivt),itrace)
  342. end do
  343. end do
  344. ! deposition ....
  345. #ifndef without_dry_deposition
  346. if(level == 1) then
  347. do itrace=1,ntrace
  348. do ivt=1,iv
  349. vdv(ivt,itrace) = &
  350. vd(region,itrace)%surf(ipts(ivt),jpts(ivt)) &
  351. / ye(ipts(ivt),jpts(ivt),idz) !1/s
  352. end do
  353. end do
  354. else
  355. vdv(:,:) = 0.0
  356. end if
  357. #endif
  358. do ivt=1,iv
  359. emino(ivt) = ye(ipts(ivt),jpts(ivt),ieno)
  360. end do
  361. !the actual EBI solver on remaining cells
  362. call DO_EBI(iv, npts, maxit, dt, dt2, rrv, rjv, vdv, emino, yv, y0v)
  363. do itrace=1,maxtrace
  364. do ivt=1,iv
  365. y(ipts(ivt),jpts(ivt),itrace)=yv(ivt,itrace)
  366. end do
  367. end do
  368. #ifdef with_budgets
  369. do ivt=1,iv
  370. ! add change in so4 production to diagnostic and change to molec->mass kg
  371. !
  372. diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,1)= diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,1)+temp_prod_so4(ivt,1)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmso4
  373. AC_diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,1)=AC_diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,1)+temp_prod_so4(ivt,1)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmso4
  374. !TOTAL SOA for AERCHEMMIP
  375. AC_diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,3)=AC_diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,3)&
  376. +temp_prod_vocs(ivt,1)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmelvoc&
  377. +temp_prod_vocs(ivt,2)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmelvoc&
  378. +temp_prod_vocs(ivt,3)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmelvoc&
  379. +temp_prod_vocs(ivt,4)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmelvoc&
  380. +temp_prod_vocs(ivt,5)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmsvoc&
  381. +temp_prod_vocs(ivt,6)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmsvoc&
  382. +temp_prod_vocs(ivt,7)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmsvoc&
  383. +temp_prod_vocs(ivt,8)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmsvoc
  384. diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,5)=diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,5)+temp_prod_vocs(ivt,1)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmso4
  385. diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,6)=diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,6)+temp_prod_vocs(ivt,2)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmso4
  386. diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,7)=diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,7)+temp_prod_vocs(ivt,3)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmso4
  387. diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,8)=diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,8)+temp_prod_vocs(ivt,4)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmso4
  388. diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,9)=diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,9)+temp_prod_vocs(ivt,5)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmso4
  389. diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,10)=diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,10)+temp_prod_vocs(ivt,6)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmso4
  390. diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,11)=diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,11)+temp_prod_vocs(ivt,7)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmso4
  391. diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,12)=diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,12)+temp_prod_vocs(ivt,8)/y(ipts(ivt),jpts(ivt),iair)*ye(ipts(ivt),jpts(ivt),iairm)/xmair*xmso4
  392. !*1e6*1e-3/avog*xmso4!yv(ivt,iso4)-y0v(ivt,iso4)
  393. ! add change in liquid so4 production to diagnostic
  394. !diag_prod(region)%prod(ipts(ivt),jpts(ivt),level,2)=temp_prod_so4(ivt,2)!yv(ivt,iso4)-y0v(ivt,iso4)
  395. end do
  396. #endif
  397. end if
  398. call NOYmass
  399. !-------------------------------------
  400. ! marked tracers
  401. ! apply after correction of nitrogen components
  402. !----------------------------------------------
  403. call MARK_TRAC(region, level, is, js, y, rr, rj, dt, ye)
  404. !------------------------------------------------------------
  405. ! increase budget accumulators cr2 and cr3 (cr4 is done in wetS)
  406. !------------------------------------------------------------
  407. #ifdef with_budgets
  408. call incc2c3
  409. #endif
  410. !===========================================================
  411. ! ** END iterating over CHEMISTRY
  412. !===========================================================
  413. end do !iterebi
  414. #ifdef with_budgets
  415. call REACBUD
  416. #endif
  417. deallocate(y0)
  418. #ifdef with_budgets
  419. deallocate(cr2)
  420. deallocate(cr3)
  421. deallocate(cr4)
  422. deallocate(temp_prod_so4)
  423. deallocate(temp_prod_vocs)
  424. #endif
  425. ! ok
  426. status = 0
  427. contains
  428. subroutine DO_EBI(lvec, npts, maxit, dt, dt2, rrv, rjv, vdv, emino, yv, y0v)
  429. ! INPUT/OUTPUT
  430. integer,intent(in) :: lvec, npts, maxit
  431. real, intent(in) :: dt, dt2, rrv(npts,nreac), rjv(npts,nj), &
  432. vdv(npts,ntrace), emino(npts), &
  433. y0v(npts,maxtrace)
  434. real, intent(out) :: yv(npts,maxtrace)
  435. ! Local
  436. integer :: ivec,iter
  437. real :: r57, r89, p1, r12, r21, xl1, p2, xl2, p3, p32, &
  438. xl3, x1, x2, x3, c1, c2, c3, y2, xjt,r21t, &
  439. r12t, acub, bcub,ccub,cubdet,dno2,r56, r65, r75,p5, &
  440. xl5, r66, x5, p6, xl6, x6, c6, x17, y1, c7, &
  441. r98, p8, xl8, x4, c5, xl9, r101,r102,xl7, &
  442. c8 , x101, r1920, r1919, p19, xl19,r2019, xl20, &
  443. xlhno3, ph2o2, xlh2o2, pch2o, pco, phno3, xlch2o, &
  444. pch3o2, xlch3o2, pch3o2h, xlch3o2h, pald2, &
  445. xlald2, pmgly, xlmgly, pole, xleth, xlole, &
  446. xlisop, prxpar, xlrxpar, ppar, xlpar, pror, &
  447. xlror, pxo2,xlxo2,pxo2n, xlxo2n, prooh,xlterp, &
  448. xlethooh,xlethp,phcooh,pmcooh,xlc3h6, xlrooh, &
  449. porgntr, xlorgntr, xlco, qdms, pso2, qso2, qso2d, &
  450. qnh3, qnh2o2, ppnh3, dnh3, pnh2, qnh2, qdms1, qdms2, &
  451. pmsa, pnh3, pispd,xlispd,xlacet,paco2,xlaco2, &
  452. pch3oh, pc3h7o2,phypro2,xlc3h7o2,xlhypro2,pacet, &
  453. pelvoc,psvoc!RM
  454. do iter=1,maxit
  455. do ivec=1,lvec
  456. ! --- Short living compounds & groups
  457. ! --- First group: NO NO2 O3
  458. P1=rjv(ivec,jbno3)*yv(ivec,ino3)+rjv(ivec,jn2o5b)*yv(ivec,in2o5)&
  459. +rjv(ivec,jhono)*yv(ivec,ihono)+rrv(ivec,knh2o2)*yv(ivec,inh2)+emino(ivec)
  460. R12=0.
  461. R21=rrv(ivec,kho2no)*yv(ivec,iho2)+rrv(ivec,kmo2no)*yv(ivec,ich3o2)&
  462. +rrv(ivec,kc79)*yv(ivec,ixo2)+rrv(ivec,kc46)*yv(ivec,ic2o3) &
  463. +rrv(ivec,kaco2no)*yv(ivec,iaco2)+rrv(ivec,kc3h7o2no)*yv(ivec,ic3h7o2)&
  464. +rrv(ivec,khypo2no)*yv(ivec,ihypro2)+rrv(ivec,knh2o2no)*yv(ivec,inh2o2)
  465. XL1=rrv(ivec,knono3)*yv(ivec,ino3)+rrv(ivec,kc81)*yv(ivec,ixo2n)&
  466. +rrv(ivec,knh2no)*yv(ivec,inh2)+rrv(ivec,khono)*yv(ivec,ioh)
  467. XL1 = XL1 + vdv(ivec,ino)
  468. P2=rjv(ivec,jhno3)*yv(ivec,ihno3)+rjv(ivec,jn2o5a)*yv(ivec,in2o5)&
  469. +rrv(ivec,kn2o5)*yv(ivec,in2o5)+rjv(ivec,jano3)*yv(ivec,ino3)&
  470. +yv(ivec,ihno4)*(rjv(ivec,jhno4)+rrv(ivec,khno4m)+rrv(ivec,khno4oh)*yv(ivec,ioh))&
  471. +rrv(ivec,kohhono)*yv(ivec,ioh)*yv(ivec,ihono)&
  472. +2.*rrv(ivec,knono3)*yv(ivec,ino3)*yv(ivec,ino)&
  473. +rrv(ivec,kc48)*yv(ivec,ipan)+rrv(ivec,kc59)*yv(ivec,iole)*yv(ivec,ino3)&
  474. +rjv(ivec,jorgn)*yv(ivec,iorgntr)&
  475. +rjv(ivec,jpana)*yv(ivec,ipan)&
  476. +0.2*rrv(ivec,kc78) *yv(ivec,iisop)*yv(ivec,ino3)&
  477. +rrv(ivec,kno3mo2)*yv(ivec,ich3o2)*yv(ivec,ino3)&
  478. +rrv(ivec,kno3c2o3)*yv(ivec,ic2o3)*yv(ivec,ino3)&
  479. +rrv(ivec,kno3xo2)*yv(ivec,ixo2)*yv(ivec,ino3)&
  480. +0.47*rrv(ivec,kno3terp)*yv(ivec,ino3)*yv(ivec,iterp)&
  481. +rjv(ivec,jmo2no2a)*yv(ivec,ich3o2no2)&
  482. +rrv(ivec,kch3o2no2m)*yv(ivec,ich3o2no2)
  483. XL2=rrv(ivec,kno2oh)*yv(ivec,ioh)+rrv(ivec,kno2no3)*yv(ivec,ino3)&
  484. +rrv(ivec,kno2ho2)*yv(ivec,iho2)+rrv(ivec,kno2o3)*yv(ivec,io3)&
  485. +rrv(ivec,kc47)*yv(ivec,ic2o3)+rrv(ivec,knh2no2)*yv(ivec,inh2)&
  486. +rrv(ivec,kmo2no2)*yv(ivec,ich3o2)
  487. XL2 = XL2 + vdv(ivec,ino2)
  488. P3=rjv(ivec,jano3)*yv(ivec,ino3)+rjv(ivec,jo2) ! JEW : O3P + O2 = O3
  489. XL3=rrv(ivec,ko3ho2)*yv(ivec,iho2)+rrv(ivec,ko3oh)*yv(ivec,ioh)&
  490. +rrv(ivec,kno2o3)*yv(ivec,ino2)+rjv(ivec,jo3d)+rrv(ivec,ko3po3)&
  491. +rrv(ivec,kc58)*yv(ivec,iole)&
  492. +rrv(ivec,kc62)*yv(ivec,ieth)&
  493. +rrv(ivec,kc77)*yv(ivec,iisop)&
  494. +rrv(ivec,ko3c3h6)*yv(ivec,ic3h6)&
  495. +rrv(ivec,ko3terp)*yv(ivec,iterp)&
  496. +rrv(ivec,ko3ispd)*yv(ivec,iispd)&
  497. +rrv(ivec,knh2o3)*yv(ivec,inh2)&
  498. +rrv(ivec,knh2o2o3)*yv(ivec,inh2o2)
  499. XL3 = XL3 + vdv(ivec,io3)
  500. X1=y0v(ivec,ino)+P1*DT
  501. X2=y0v(ivec,ino2)+P2*DT
  502. X3=y0v(ivec,io3)+P3*DT
  503. C1=1.+XL1*DT
  504. C2=1.+XL2*DT
  505. C3=1.+XL3*DT
  506. Y1=rrv(ivec,knoo3)*DT
  507. R21T=R21*DT
  508. R12T=R12*DT
  509. XJT=rjv(ivec,jno2)*DT
  510. P32=0.4*rrv(ivec,kc50)*yv(ivec,ic2o3)*yv(ivec,iho2)
  511. ! --- Solve unknown: x
  512. ACUB=-2.*Y1*(C2+R12T+C2*R21T/C1)
  513. BCUB=2.*C1*C2*C3+2.*C1*C3*(R12T+XJT)+2.*C2*C3*R21T+&
  514. 2.*Y1*(R12T*(X1-X2)+2.*C2*R21T*X1/C1+C2*(X1+X3))
  515. CCUB=2.*C1*C3*X2*(R12T+XJT)-2.*C2*C3*X1*R21T+2.*Y1*X1*&
  516. (X2*R12T-C2*X3-C2*R21T*X1/C1)
  517. CUBDET=BCUB*BCUB-4.*ACUB*CCUB
  518. DNO2=(-1.*BCUB+SQRT(CUBDET))/(2.*ACUB)
  519. dno2=min(x1,dno2)
  520. yv(ivec,ino2)=(X2+DNO2)/C2
  521. yv(ivec,ino)=(X1-DNO2)/C1
  522. yv(ivec,io3)=(X3+(P32*dt)+XJT*yv(ivec,ino2))/(C3+Y1*yv(ivec,ino))
  523. ! --- Second group: yv(ivec,iho2) yv(ivec,ioh) yv(ivec,ihno4) yv(ivec,ihono)
  524. R57=rjv(ivec,jhno4)+rrv(ivec,khno4m)
  525. R56=rrv(ivec,kcooh)*yv(ivec,ico)+rrv(ivec,ko3oh)*yv(ivec,io3)+rrv(ivec,khpoh)&
  526. *yv(ivec,ih2o2)+rrv(ivec,kfrmoh)*yv(ivec,ich2o)+rrv(ivec,kh2oh)&
  527. +rrv(ivec,kso2oh)*yv(ivec,iso2)
  528. p5=2.*rjv(ivec,jbch2o)*yv(ivec,ich2o)&
  529. +rrv(ivec,kmo2no)*yv(ivec,ich3o2)*yv(ivec,ino)&
  530. +rjv(ivec,jmepe)*yv(ivec,ich3o2h)&
  531. +2.0*rjv(ivec,jald2)*yv(ivec,iald2)&
  532. +rjv(ivec,jmgly)*yv(ivec,imgly)+0.11*rrv(ivec,kc52)*yv(ivec,ipar)*yv(ivec,ioh)&
  533. +0.94*rrv(ivec,kc53)*yv(ivec,iror)+rrv(ivec,kc54)*yv(ivec,iror)&
  534. +1.57*rrv(ivec,kc57)*yv(ivec,iole)*yv(ivec,ioh)&
  535. +0.76*rrv(ivec,kc58)*yv(ivec,io3)*yv(ivec,iole)&
  536. +0.56*rrv(ivec,kc59)*yv(ivec,ino3)*yv(ivec,iole)&
  537. +rrv(ivec,kc61)*yv(ivec,ieth)*yv(ivec,ioh)&
  538. +0.22*rrv(ivec,kc62)*yv(ivec,ieth)*yv(ivec,io3)&
  539. +0.066*rrv(ivec,kc77)*yv(ivec,iisop)*yv(ivec,io3)&
  540. +rrv(ivec,kc41)*yv(ivec,ich2o)*yv(ivec,ino3)&
  541. +0.9*rrv(ivec,kc84)*yv(ivec,ioh)*yv(ivec,iorgntr)&
  542. +0.9*rjv(ivec,jorgn)*yv(ivec,iorgntr)&
  543. +0.8*rrv(ivec,kc78)*yv(ivec,iisop)*yv(ivec,ino3)&
  544. +0.74*rrv(ivec,kmo2mo2)*yv(ivec,ich3o2)*yv(ivec,ich3o2)&
  545. +0.9*rjv(ivec,jrooh)*yv(ivec,irooh)&
  546. +rrv(ivec,kno3mo2)*yv(ivec,ich3o2)*yv(ivec,ino3)&
  547. +0.19*rrv(ivec,ko3c3h6)*yv(ivec,io3)*yv(ivec,ic3h6)&
  548. +0.28*rrv(ivec,ko3terp)*yv(ivec,io3)*yv(ivec,iterp)&
  549. +0.75*rrv(ivec,kno3terp)*yv(ivec,ino3)*yv(ivec,iterp)&
  550. +0.154*rrv(ivec,ko3ispd)*yv(ivec,io3)*yv(ivec,iispd)&
  551. +0.925*rrv(ivec,kno3ispd)*yv(ivec,ino3)*yv(ivec,iispd)&
  552. +1.033*rjv(ivec,jispd)*yv(ivec,iispd)&
  553. +rrv(ivec,kohch3oh)*yv(ivec,ich3oh)&
  554. +rrv(ivec,kohhcooh)*yv(ivec,ihcooh)&
  555. +rrv(ivec,kohethoh)*yv(ivec,iethoh)&
  556. +1.22*rrv(ivec,kohterp)*yv(ivec,iterp)&
  557. +rrv(ivec,kohc2h6)*yv(ivec,ic2h6)&
  558. +0.5*rrv(ivec,kc76)*yv(ivec,ioh)*yv(ivec,iisop)& ! reduced according to archibald et al, AE, 2011
  559. +0.503*rrv(ivec,kohispd)*yv(ivec,ioh)*yv(ivec,iispd)&
  560. +0.5*rrv(ivec,kaco2mo2)*yv(ivec,iaco2)*yv(ivec,ich3o2)&
  561. +rrv(ivec,kaco2no)*yv(ivec,iaco2)*yv(ivec,ino)&
  562. +rrv(ivec,kc3h7o2no)*yv(ivec,ic3h7o2)*yv(ivec,ino)&
  563. +rrv(ivec,kc3h7o2ho2)*yv(ivec,ihypro2)*yv(ivec,ino)&
  564. +rjv(ivec,jmo2no2b)*yv(ivec,ich3o2no2)
  565. XL5=rrv(ivec,kho2no) *yv(ivec,ino)&
  566. +rrv(ivec,kno2ho2) *yv(ivec,ino2)&
  567. +rrv(ivec,ko3ho2) *yv(ivec,io3)&
  568. +rrv(ivec,kmo2ho2a) *yv(ivec,ich3o2)&
  569. +rrv(ivec,kmo2ho2b) *yv(ivec,ich3o2)&
  570. +rrv(ivec,kc50) *yv(ivec,ic2o3)&
  571. +rrv(ivec,kho2oh) *yv(ivec,ioh)&
  572. +rrv(ivec,kc82) *yv(ivec,ixo2)&
  573. +rrv(ivec,kc85) *yv(ivec,ixo2n)&
  574. +rrv(ivec,kno3ho2) *yv(ivec,ino3)&
  575. +rrv(ivec,kaco2ho2)*yv(ivec,iaco2)&
  576. +rrv(ivec,knh2ho2)*yv(ivec,inh2)&
  577. +rrv(ivec,knh2o2ho2)*yv(ivec,inh2o2)&
  578. +rrv(ivec,kho2_aer) &
  579. +rrv(ivec,kho2_l)
  580. R66=2.*rrv(ivec,kho2ho2)
  581. X5=y0v(ivec,iho2)+P5*DT
  582. R65=rrv(ivec,kho2no)*yv(ivec,ino)+rrv(ivec,ko3ho2)*yv(ivec,io3)
  583. P6=rjv(ivec,jhno3)*yv(ivec,ihno3)&
  584. +2.*rjv(ivec,jo3d)*yv(ivec,io3)&
  585. +2.*rjv(ivec,jh2o2)*yv(ivec,ih2o2)&
  586. +rjv(ivec,jmepe)*yv(ivec,ich3o2h)&
  587. +0.1*rrv(ivec,kc58)*yv(ivec,io3)*yv(ivec,iole)&
  588. +0.266*rrv(ivec,kc77)*yv(ivec,iisop)*yv(ivec,io3)&
  589. +rjv(ivec,jrooh)*yv(ivec,irooh)&
  590. +0.12*rrv(ivec,kc62)*yv(ivec,ieth)*yv(ivec,io3)&
  591. +0.33*rrv(ivec,ko3c3h6)*yv(ivec,io3)*yv(ivec,ic3h6)&
  592. +0.57*rrv(ivec,ko3terp)*yv(ivec,iterp)*yv(ivec,io3)&
  593. +0.268*rrv(ivec,ko3ispd)*yv(ivec,io3)*yv(ivec,iispd)
  594. XL6=rrv(ivec,khno4oh)*yv(ivec,ihno4)&
  595. +rrv(ivec,kohhono)*yv(ivec,ihono)&
  596. +rrv(ivec,kho2oh)*yv(ivec,iho2)&
  597. +rrv(ivec,kno2oh)*yv(ivec,ino2)&
  598. +rrv(ivec,khono)*yv(ivec,ino)&
  599. +rrv(ivec,kohhno3)*yv(ivec,ihno3)&
  600. +rrv(ivec,kcooh)*yv(ivec,ico)&
  601. +rrv(ivec,ko3oh)*yv(ivec,io3)&
  602. +rrv(ivec,khpoh)*yv(ivec,ih2o2)&
  603. +rrv(ivec,kfrmoh)*yv(ivec,ich2o)&
  604. +rrv(ivec,kch4oh)*yv(ivec,ich4)&
  605. +0.7*rrv(ivec,kohmper)*yv(ivec,ich3o2h)&
  606. +rrv(ivec,kc43)*yv(ivec,iald2)&
  607. +rrv(ivec,kc73)*yv(ivec,imgly)&
  608. +rrv(ivec,kc52)*yv(ivec,ipar)&
  609. +rrv(ivec,kc57)*yv(ivec,iole)&
  610. +rrv(ivec,kc61)*yv(ivec,ieth)&
  611. +rrv(ivec,kc76)*yv(ivec,iisop)&
  612. +0.77*rrv(ivec,kohrooh)*yv(ivec,irooh)& ! note: change from '0.7' to '0.77'
  613. +rrv(ivec,kc84)*yv(ivec,iorgntr)&
  614. +rrv(ivec,kh2oh)&
  615. +rrv(ivec,kso2oh)*yv(ivec,iso2) & ! bug found by Jason 01/2008
  616. +(rrv(ivec,kdmsoha)+rrv(ivec,kdmsohb)) *yv(ivec,idms) &
  617. +rrv(ivec,knh3oh)*yv(ivec,inh3)&
  618. +rrv(ivec,knh2oh)*yv(ivec,inh2)&
  619. +rrv(ivec,kohch3oh)*yv(ivec,ich3oh)&
  620. +rrv(ivec,kohhcooh)*yv(ivec,ihcooh)&
  621. +rrv(ivec,kohethoh)*yv(ivec,iethoh)&
  622. +rrv(ivec,kohterp)*yv(ivec,iterp)&
  623. +rrv(ivec,kohispd)*yv(ivec,iispd)&
  624. +rrv(ivec,kohmcooh)*yv(ivec,imcooh)&
  625. +rrv(ivec,kohc2h6)*yv(ivec,ic2h6)&
  626. +rrv(ivec,kohc3h8)*yv(ivec,ic3h8)&
  627. +rrv(ivec,kohc3h6)*yv(ivec,ic3h6)&
  628. +rrv(ivec,kohacet)*yv(ivec,iacet)
  629. R101=rjv(ivec,jhono)
  630. X6=y0v(ivec,ioh)+(P6*DT)+(R101*y0v(ivec,ihono)*DT)
  631. C6=1.+XL6*DT
  632. R75=rrv(ivec,kno2ho2)*yv(ivec,ino2)
  633. R102=rrv(ivec,khono)*yv(ivec,ino)
  634. X101=rjv(ivec,jhono)+rrv(ivec,kohhono)*yv(ivec,ioh)
  635. X101= X101 + vdv(ivec,ihono)
  636. C8=1.+X101*DT
  637. XL7=rjv(ivec,jhno4)+rrv(ivec,khno4oh)*yv(ivec,ioh)+rrv(ivec,khno4m)
  638. XL7 = XL7 + vdv(ivec,ihno4)
  639. C7=1.+XL7*DT
  640. Y1=R57/C7
  641. Y2=R56/C6
  642. ACUB=R66*DT
  643. BCUB=1.+XL5*DT-DT2*(Y1*R75+Y2*R65)
  644. CCUB=-1.*X5-DT*(Y1*y0v(ivec,ihno4)+Y2*X6)
  645. CUBDET=BCUB*BCUB-4.*ACUB*CCUB
  646. CUBDET=MAX(CUBDET,1.E-20)
  647. yv(ivec,iho2)=max(0.1,(-1.*BCUB+SQRT(CUBDET))/(2.*ACUB))
  648. yv(ivec,ioh)=(X6+R65*yv(ivec,iho2)*DT)/C6
  649. yv(ivec,ihono)=(y0v(ivec,ihono)+R102*DT*yv(ivec,ioh))/C8
  650. yv(ivec,ihno4)=(y0v(ivec,ihno4)+R75*DT*yv(ivec,iho2))/C7
  651. !
  652. ! --- Third group: NO3 N2O5
  653. !
  654. R89=rjv(ivec,jn2o5a)+rjv(ivec,jn2o5b)+rrv(ivec,kn2o5)
  655. P8=rrv(ivec,kohhno3)*yv(ivec,ihno3)*yv(ivec,ioh)+rrv(ivec,kno2o3)*yv(ivec,ino2)*yv(ivec,io3)&
  656. +rjv(ivec,jmo2no2b)*yv(ivec,ich3o2no2)+rjv(ivec,jpanb)*yv(ivec,ipan)
  657. XL8=rjv(ivec,jbno3)+rjv(ivec,jano3)&
  658. +rrv(ivec,knono3)*yv(ivec,ino)&
  659. +rrv(ivec,kno2no3)*yv(ivec,ino2)&
  660. +rrv(ivec,kc44)*yv(ivec,iald2)&
  661. +rrv(ivec,kc59)*yv(ivec,iole)&
  662. +rrv(ivec,kc78)*yv(ivec,iisop)&
  663. +rrv(ivec,kc41)*yv(ivec,ich2o)&
  664. +rrv(ivec,kdmsno3)*yv(ivec,idms)&
  665. +rrv(ivec,kno3ho2)*yv(ivec,iho2)&
  666. +rrv(ivec,kno3mo2)*yv(ivec,ich3o2)&
  667. +rrv(ivec,kno3c2o3)*yv(ivec,ic2o3)&
  668. +rrv(ivec,kno3xo2)*yv(ivec,ixo2)&
  669. +rrv(ivec,kno3c3h6)*yv(ivec,ic3h6)&
  670. +rrv(ivec,kno3terp)*yv(ivec,iterp)&
  671. +rrv(ivec,kno3ispd)*yv(ivec,iispd)
  672. XL8 = XL8 + vdv(ivec,ino3)
  673. X4=y0v(ivec,ino3)+P8*DT
  674. C5=1.+XL8*DT
  675. R98=rrv(ivec,kno2no3)*yv(ivec,ino2)
  676. XL9=rjv(ivec,jn2o5a)+rjv(ivec,jn2o5b)+rrv(ivec,kn2o5)+rrv(ivec,kn2o5_aer)+rrv(ivec,kn2o5l) !cmk rates now idependent from y
  677. XL9 = XL9 + vdv(ivec,in2o5)
  678. C6=1.+XL9*DT
  679. C7=(C5*C6-R89*R98*DT2)
  680. yv(ivec,in2o5)=(C5*y0v(ivec,in2o5)+R98*DT*X4)/C7
  681. yv(ivec,ino3)=(C6*X4+R89*DT*y0v(ivec,in2o5))/C7
  682. !
  683. ! --- Fourth group: C2O3 PAN
  684. !
  685. R1920=rrv(ivec,kc48)+rjv(ivec,jpana)
  686. R1919=rrv(ivec,kc49)
  687. P19=rrv(ivec,kc43)*yv(ivec,iald2)*yv(ivec,ioh)&
  688. +rrv(ivec,kc44)*yv(ivec,iald2)*yv(ivec,ino3)&
  689. +rrv(ivec,kc73)*yv(ivec,imgly)*yv(ivec,ioh) &
  690. +rjv(ivec,jmgly)*yv(ivec,imgly)&
  691. +0.2*rrv(ivec,kc77)*yv(ivec,iisop)*yv(ivec,io3)&
  692. +0.74*rjv(ivec,jrooh)*yv(ivec,irooh)&
  693. +0.74*rrv(ivec,kc84)*yv(ivec,ioh)*yv(ivec,iorgntr)&
  694. +0.74*rjv(ivec,jorgn)*yv(ivec,iorgntr)&
  695. +0.39*rrv(ivec,ko3terp)*yv(ivec,io3)*yv(ivec,iterp)&
  696. +0.498*rrv(ivec,kohispd)*yv(ivec,ioh)*yv(ivec,iispd)&
  697. +0.114*rrv(ivec,ko3ispd)*yv(ivec,io3)*yv(ivec,iispd)&
  698. +0.075*rrv(ivec,kno3ispd)*yv(ivec,ino3)*yv(ivec,iispd)&
  699. +0.967*rjv(ivec,jispd)*yv(ivec,iispd)&
  700. +0.3*rrv(ivec,kaco2mo2)*yv(ivec,iaco2)*yv(ivec,ich3o2)&
  701. +rrv(ivec,kaco2no)*yv(ivec,iaco2)*yv(ivec,ino)&
  702. +rjv(ivec,jb_acet)*yv(ivec,iacet)&
  703. +rjv(ivec,jmo2no2b)*yv(ivec,ich3o2no2)
  704. XL19=rrv(ivec,kc46)*yv(ivec,ino)+rrv(ivec,kc50)*yv(ivec,iho2)&
  705. +rrv(ivec,kc47)*yv(ivec,ino2)&
  706. +rrv(ivec,kno3c2o3)*yv(ivec,ino3)
  707. XL19 = XL19 + vdv(ivec,ic2o3)
  708. R2019=rrv(ivec,kc47)*yv(ivec,ino2)
  709. XL20=rrv(ivec,kc48)+rjv(ivec,jpana)+rjv(ivec,jpanb)
  710. XL20 = XL20 + vdv(ivec,ipan)
  711. ACUB=2*R1919*DT*(1+XL20*DT)
  712. BCUB=(1+XL20*DT)*(1+XL19*DT)-R1920*DT*R2019*DT
  713. CCUB=(1+XL20*DT)*(y0v(ivec,ic2o3)+P19*DT)+R1920*DT*y0v(ivec,ipan)
  714. CUBDET=BCUB*BCUB+4.*ACUB*CCUB
  715. yv(ivec,ic2o3)=max(1e-8,(-1.*BCUB+SQRT(CUBDET))/(2.*ACUB)) !cmk put max here....
  716. yv(ivec,ipan)=(y0v(ivec,ipan)+R2019*yv(ivec,ic2o3)*DT)/(1.+XL20*DT)
  717. !
  718. ! ---- Fifth group : CH3O2 CH3O2NO2
  719. R1920=rrv(ivec,kch3o2no2m)+rjv(ivec,jmo2no2a)+rjv(ivec,jmo2no2b)
  720. R1919=rrv(ivec,kmo2mo2)
  721. P19=rrv(ivec,kch4oh)*yv(ivec,ich4)*yv(ivec,ioh) &
  722. +0.7*rrv(ivec,kohmper)*yv(ivec,ioh)*yv(ivec,ich3o2h)&
  723. +rrv(ivec,kno3c2o3)*yv(ivec,ino3)*yv(ivec,ic2o3)&
  724. +rrv(ivec,kc46)*yv(ivec,ino)*yv(ivec,ic2o3)&
  725. +2*rrv(ivec,kc49)*yv(ivec,ic2o3)*yv(ivec,ic2o3)&
  726. +rjv(ivec,jpanb)*yv(ivec,ipan)&
  727. +rjv(ivec,jald2)*yv(ivec,iald2)&
  728. +0.74*rjv(ivec,jrooh)*yv(ivec,irooh)&
  729. +0.74*rrv(ivec,kc84)*yv(ivec,iorgntr)&
  730. +0.74*rjv(ivec,jorgn)*yv(ivec,iorgntr)&
  731. +rrv(ivec,kohmcooh)*yv(ivec,ioh)*yv(ivec,imcooh)&
  732. +0.31*rrv(ivec,ko3c3h6)*yv(ivec,io3)*yv(ivec,ic3h6)&
  733. +0.39*rrv(ivec,ko3terp)*yv(ivec,iterp)*yv(ivec,io3)&
  734. +2.0*rjv(ivec,ja_acet)*yv(ivec,iacet)+rjv(ivec,jb_acet)*yv(ivec,iacet)
  735. XL19=rrv(ivec,kmo2no)*yv(ivec,ino)+rrv(ivec,kmo2ho2a)*yv(ivec,iho2)&
  736. +rrv(ivec,kmo2ho2b)*yv(ivec,iho2)+rrv(ivec,kno3mo2)*yv(ivec,ino3)&
  737. +rrv(ivec,kaco2mo2)*yv(ivec,iaco2)+rrv(ivec,kmo2no2)*yv(ivec,ino2)
  738. R2019=rrv(ivec,kmo2no2)*yv(ivec,ino2)
  739. XL20=rrv(ivec,kch3o2no2m)+rjv(ivec,jmo2no2a)+rjv(ivec,jmo2no2b)
  740. XL20 = XL20 + vdv(ivec,ich3o2no2)
  741. ACUB=2*R1919*DT*(1+XL20*DT)
  742. BCUB=(1+XL20*DT)*(1+XL19*DT)-R1920*DT*R2019*DT
  743. CCUB=(1+XL20*DT)*(y0v(ivec,ich3o2)+P19*DT)+R1920*DT*y0v(ivec,ich3o2no2)
  744. CUBDET=BCUB*BCUB+4.*ACUB*CCUB
  745. yv(ivec,ich3o2)=max(1e-8,(-1.*BCUB+SQRT(CUBDET))/(2.*ACUB)) !cmk put max here....
  746. yv(ivec,ich3o2no2)=(y0v(ivec,ich3o2no2)+R2019*yv(ivec,ich3o2)*DT)/(1.+XL20*DT)
  747. !
  748. ! -------- ISPD chemistry
  749. !
  750. pispd=0.912*rrv(ivec,kc76)*yv(ivec,ioh)*yv(ivec,iisop)&
  751. +0.65*rrv(ivec,kc77)*yv(ivec,io3)*yv(ivec,iisop)&
  752. +0.2*rrv(ivec,kc78)*yv(ivec,ino3)*yv(ivec,iisop)
  753. xlispd=rrv(ivec,kohispd)*yv(ivec,ioh)+rrv(ivec,ko3ispd)*yv(ivec,io3)&
  754. +rrv(ivec,kno3ispd)*yv(ivec,ino3)+rjv(ivec,jispd)+vdv(ivec,iispd)
  755. yv(ivec,iispd)=(y0v(ivec,iispd)+pispd*DT)/(1.+xlispd*DT)
  756. !
  757. ! -------- ACO2 chemistry
  758. !
  759. paco2=rrv(ivec,kohacet)*yv(ivec,iacet)*yv(ivec,ioh)
  760. xlaco2=rrv(ivec,kaco2ho2)*yv(ivec,iho2)+rrv(ivec,kaco2mo2)*yv(ivec,ich3o2)&
  761. +rrv(ivec,kaco2no)*yv(ivec,ino)+rrv(ivec,kaco2xo2)*yv(ivec,ixo2)
  762. yv(ivec,iaco2)=(y0v(ivec,iaco2)+paco2*DT)/(1.+xlaco2*DT)
  763. !
  764. ! -------- C3H7O2 chemistry
  765. !
  766. pc3h7o2=rrv(ivec,kohc3h8)*yv(ivec,ic3h8)*yv(ivec,ioh)
  767. xlc3h7o2=rrv(ivec,kc3h7o2no)*yv(ivec,ino)+rrv(ivec,kc3h7o2ho2)*yv(ivec,iho2)
  768. yv(ivec,ic3h7o2)=(y0v(ivec,ic3h7o2)+pc3h7o2*DT)/(1.+xlc3h7o2*DT)
  769. !
  770. ! -------- HYPRO2 chemistry
  771. !
  772. phypro2=rrv(ivec,kohc3h6)*yv(ivec,ic3h6)*yv(ivec,ioh)
  773. xlhypro2=rrv(ivec,khypo2no)*yv(ivec,ino)+rrv(ivec,khypo2ho2)*yv(ivec,iho2)
  774. yv(ivec,ihypro2)=(y0v(ivec,ihypro2)+phypro2*DT)/(1.+xlhypro2*DT)
  775. !
  776. !
  777. ! --- CBM4 chem.(short living compounds & operators)
  778. !
  779. PRXPAR=0.11*rrv(ivec,kc52)*yv(ivec,ioh)*yv(ivec,ipar)&
  780. +2.1*rrv(ivec,kc53)*yv(ivec,iror)&
  781. +0.7*rrv(ivec,kc57)*yv(ivec,iole)*yv(ivec,ioh)&
  782. +rrv(ivec,kc58)*yv(ivec,io3)*yv(ivec,iole)&
  783. +rrv(ivec,kc59)*yv(ivec,iole)*yv(ivec,ino3)&
  784. +rrv(ivec,kohrooh)*yv(ivec,ioh)*yv(ivec,irooh)&
  785. +1.98*rjv(ivec,jrooh)*yv(ivec,irooh)&
  786. +1.98*rrv(ivec,kc84)*yv(ivec,ioh)*yv(ivec,iorgntr)&
  787. +1.98*rjv(ivec,jorgn)*yv(ivec,iorgntr)
  788. XLRXPAR=rrv(ivec,kc83)*yv(ivec,ipar)
  789. yv(ivec,irxpar)=(y0v(ivec,irxpar)+PRXPAR*DT)/(1.+XLRXPAR*DT)
  790. XLISOP=rrv(ivec,kc76)*yv(ivec,ioh)+rrv(ivec,kc77)*yv(ivec,io3)+rrv(ivec,kc78)*yv(ivec,ino3)
  791. yv(ivec,iisop)=y0v(ivec,iisop)/(1.+XLISOP*DT)
  792. PROR=0.76*rrv(ivec,kc52)*yv(ivec,ipar)*yv(ivec,ioh)+0.02*rrv(ivec,kc53)*yv(ivec,iror)
  793. XLROR=rrv(ivec,kc53)+rrv(ivec,kc54)
  794. yv(ivec,iror)=(y0v(ivec,iror)+PROR*DT)/(1.+XLROR*DT)
  795. xlterp=rrv(ivec,kohterp)*yv(ivec,ioh)+rrv(ivec,ko3terp)*yv(ivec,io3)&
  796. +rrv(ivec,kno3terp)*yv(ivec,ino3)
  797. yv(ivec,iterp)=y0v(ivec,iterp)/(1.+xlterp*dt)
  798. #ifdef with_m7
  799. !ELVOC
  800. ! contribution from monoterpene
  801. pelvoc=y_oh_terp_elvoc*rrv(ivec,kohterp)*yv(ivec,ioh)*y0v(ivec,iterp)+y_o3_terp_elvoc*rrv(ivec,ko3terp)*yv(ivec,io3)*y0v(ivec,iterp)
  802. #ifdef with_budgets
  803. temp_prod_vocs(ivec,1)=y_oh_terp_elvoc * rrv(ivec,kohterp)*yv(ivec,ioh)*y0v(ivec,iterp)*DT
  804. temp_prod_vocs(ivec,2)=y_o3_terp_elvoc * rrv(ivec,ko3terp)*yv(ivec,io3)*y0v(ivec,iterp)*DT
  805. #endif
  806. !Contribution from isoprene
  807. if (isoprene_on)then
  808. pelvoc=pelvoc+ y_oh_isop_elvoc*rrv(ivec,kc76)*yv(ivec,ioh)*y0v(ivec,iisop)+y_o3_isop_elvoc*rrv(ivec,kc77)*yv(ivec,io3)*y0v(ivec,iisop)
  809. #ifdef with_budgets
  810. temp_prod_vocs(ivec,3) = y_oh_isop_elvoc*rrv(ivec,kc76)*yv(ivec,ioh)*y0v(ivec,iisop)*DT
  811. temp_prod_vocs(ivec,4) = y_o3_isop_elvoc*rrv(ivec,kc77)*yv(ivec,io3)*y0v(ivec,iisop)*DT
  812. #endif
  813. endif
  814. yv(ivec,ielvoc)=y0v(ivec,ielvoc)+pelvoc*dt
  815. !SVOC
  816. ! contribution from monoterpene
  817. psvoc=y_oh_terp_svoc*rrv(ivec,kohterp)*yv(ivec,ioh)*y0v(ivec,iterp)+0.10*rrv(ivec,ko3terp)*yv(ivec,io3)*y0v(ivec,iterp)
  818. #ifdef with_budgets
  819. temp_prod_vocs(ivec,5) = y_oh_terp_svoc*rrv(ivec,kohterp)*yv(ivec,ioh)*y0v(ivec,iterp)*DT
  820. temp_prod_vocs(ivec,6) = y_o3_terp_svoc*rrv(ivec,ko3terp)*yv(ivec,io3)*y0v(ivec,iterp)*DT
  821. #endif
  822. !Contribution from isoprene
  823. if (isoprene_on)then
  824. psvoc=psvoc + y_oh_isop_svoc*rrv(ivec,kc76)*yv(ivec,ioh)*y0v(ivec,iisop)+y_o3_isop_svoc*rrv(ivec,kc77)*yv(ivec,io3)*y0v(ivec,iisop)
  825. #ifdef with_budgets
  826. temp_prod_vocs(ivec,7)= y_oh_isop_svoc*rrv(ivec,kc76)*yv(ivec,ioh)*y0v(ivec,iisop)*DT
  827. temp_prod_vocs(ivec,8)= y_o3_isop_svoc*rrv(ivec,kc77)*yv(ivec,io3)*y0v(ivec,iisop)*DT
  828. #endif
  829. end if
  830. yv(ivec,isvoc)=y0v(ivec,isvoc)+psvoc*dt
  831. #endif
  832. pxo2=rrv(ivec,kc73)*yv(ivec,imgly)*yv(ivec,ioh)&
  833. +0.87*rrv(ivec,kc52)*yv(ivec,ipar)*yv(ivec,ioh)&
  834. +0.96*rrv(ivec,kc53)*yv(ivec,iror)&
  835. +0.8*rrv(ivec,kc57)*yv(ivec,iole)*yv(ivec,ioh)&
  836. +0.22*rrv(ivec,kc58)*yv(ivec,io3)*yv(ivec,iole)&
  837. +0.91*rrv(ivec,kc59)*yv(ivec,iole)*yv(ivec,ino3)&
  838. +rrv(ivec,kc61)*yv(ivec,ieth)*yv(ivec,ioh)&
  839. +0.991*rrv(ivec,kc76)*yv(ivec,iisop)*yv(ivec,ioh)&
  840. +rrv(ivec,kc78)*yv(ivec,iisop)*yv(ivec,ino3)&
  841. +0.77*rrv(ivec,kohrooh)*yv(ivec,irooh)*yv(ivec,ioh)&
  842. +0.5*rjv(ivec,jrooh)*yv(ivec,irooh)&
  843. +0.51*rrv(ivec,kc84)*yv(ivec,ioh)*yv(ivec,iorgntr)&
  844. +0.51*rjv(ivec,jorgn)*yv(ivec,iorgntr)&
  845. +0.2*rrv(ivec,kc77)*yv(ivec,iisop)*yv(ivec,io3)&
  846. +0.1*rrv(ivec,kohethoh)*yv(ivec,ioh)*yv(ivec,iethoh)&
  847. +0.991*rrv(ivec,kohc2h6)*yv(ivec,ioh)*yv(ivec,ic2h6)&
  848. +1.25*rrv(ivec,kohterp)*yv(ivec,ioh)*yv(ivec,iterp)&
  849. +0.76*rrv(ivec,ko3terp)*yv(ivec,io3)*yv(ivec,iterp)&
  850. +1.03*rrv(ivec,kno3terp)*yv(ivec,ino3)*yv(ivec,iterp)&
  851. +0.713*rrv(ivec,kohispd)*yv(ivec,ioh)*yv(ivec,iispd)&
  852. +0.064*rrv(ivec,ko3ispd)*yv(ivec,io3)*yv(ivec,iispd)&
  853. +0.075*rrv(ivec,kno3ispd)*yv(ivec,ino3)*yv(ivec,iispd)&
  854. +0.7*rjv(ivec,jispd)*yv(ivec,iispd)
  855. xlxo2=rrv(ivec,kc79)*yv(ivec,ino)+2.*rrv(ivec,kc80)*yv(ivec,ixo2)&
  856. +rrv(ivec,kc82)*yv(ivec,iho2)+rrv(ivec,kno3xo2)*yv(ivec,ino3)&
  857. +rrv(ivec,kaco2xo2)*yv(ivec,iaco2)+rrv(ivec,kxo2xo2n)*yv(ivec,ixo2n)
  858. yv(ivec,ixo2)=(y0v(ivec,ixo2)+pxo2*dt)/(1.+xlxo2*dt)
  859. pxo2n=0.13*rrv(ivec,kc52)*yv(ivec,ipar)*yv(ivec,ioh)&
  860. +0.04*rrv(ivec,kc53)*yv(ivec,iror)&
  861. +0.09*rrv(ivec,kc59)*yv(ivec,iole)*yv(ivec,ino3)&
  862. +0.009*rrv(ivec,kohc2h6)*yv(ivec,ioh)*yv(ivec,ic2h6)&
  863. +0.088*rrv(ivec,kc76)*yv(ivec,iisop)*yv(ivec,ioh)&
  864. +0.25*rrv(ivec,kohterp)*yv(ivec,ioh)*yv(ivec,iterp)&
  865. +0.18*rrv(ivec,ko3terp)*yv(ivec,io3)*yv(ivec,iterp)&
  866. +0.25*rrv(ivec,kno3terp)*yv(ivec,ino3)*yv(ivec,iterp)
  867. xlxo2n=rrv(ivec,kc81)*yv(ivec,ino)+rrv(ivec,kc85)*yv(ivec,iho2)&
  868. +rrv(ivec,kxo2xo2n)*yv(ivec,ixo2n)+rrv(ivec,kxo2n)*yv(ivec,ixo2n)
  869. yv(ivec,ixo2n)=(y0v(ivec,ixo2n)+pxo2n*dt)/(1.+xlxo2n*dt)
  870. end do !ivec
  871. if ( mod(iter,2) == 0 ) then
  872. do ivec=1,lvec
  873. ! --- Species with intermediate lifetimes
  874. ! --- Inorganic compounds (HNO3 H2O2)
  875. !
  876. PHNO3=rrv(ivec,kno2oh)*yv(ivec,ino2)*yv(ivec,ioh)&
  877. +2.*(rrv(ivec,kn2o5_aer)+rrv(ivec,kn2o5l))*yv(ivec,in2o5)&
  878. +rrv(ivec,kc44)*yv(ivec,iald2)*yv(ivec,ino3)&
  879. +rrv(ivec,kc41)*yv(ivec,ich2o)*yv(ivec,ino3)&
  880. +rrv(ivec,kc84)*yv(ivec,ioh)*yv(ivec,iorgntr)&
  881. +rrv(ivec,kno3ho2)*yv(ivec,ino3)*yv(ivec,iho2)&
  882. +0.15*rrv(ivec,kno3ispd)*yv(ivec,ino3)*yv(ivec,iispd)&
  883. +rrv(ivec,kdmsno3)*yv(ivec,ino3)*yv(ivec,idms)&
  884. +rrv(ivec,kno3_aer)*yv(ivec,ino3)
  885. XLHNO3=rjv(ivec,jhno3)+rrv(ivec,kohhno3)*yv(ivec,ioh)
  886. XLHNO3=XLHNO3 + vdv(ivec,ihno3)
  887. yv(ivec,ihno3)=(y0v(ivec,ihno3)+PHNO3*DT)/(1.+XLHNO3*DT)
  888. PH2O2=rrv(ivec,kho2ho2)*yv(ivec,iho2)*yv(ivec,iho2)&
  889. +0.5*rrv(ivec,kho2_aer)*yv(ivec,iho2)
  890. XLH2O2=rjv(ivec,jh2o2)+rrv(ivec,khpoh)*yv(ivec,ioh)
  891. XLH2O2=XLH2O2 + vdv(ivec,ih2o2)
  892. yv(ivec,ih2o2)=(y0v(ivec,ih2o2)+PH2O2*DT)/(1.+XLH2O2*DT)
  893. ! --- CH4-chemistry (methyl peroxide formaldehyde)
  894. PCH3O2H=rrv(ivec,kmo2ho2a)*yv(ivec,ich3o2)*yv(ivec,iho2)
  895. XLCH3O2H=rrv(ivec,kohmper)*yv(ivec,ioh)+rjv(ivec,jmepe)
  896. XLCH3O2H=XLCH3O2H + vdv(ivec,ich3o2h)
  897. yv(ivec,ich3o2h)=(y0v(ivec,ich3o2h)+PCH3O2H*DT)/(1.+XLCH3O2H*DT)
  898. pch2o=0.3*rrv(ivec,kohmper)*yv(ivec,ich3o2h)*yv(ivec,ioh)&
  899. +rrv(ivec,kmo2no)*yv(ivec,ich3o2)*yv(ivec,ino)&
  900. +rrv(ivec,kmo2ho2b)*yv(ivec,ich3o2)*yv(ivec,iho2)&
  901. +1.37*rrv(ivec,kmo2mo2)*yv(ivec,ich3o2)*yv(ivec,ich3o2)&
  902. +rjv(ivec,jmepe)*yv(ivec,ich3o2h)&
  903. +0.8*rrv(ivec,kc57)*yv(ivec,iole)*yv(ivec,ioh)&
  904. +0.74*rrv(ivec,kc58)*yv(ivec,iole)*yv(ivec,io3)&
  905. +rrv(ivec,kc59)*yv(ivec,iole)*yv(ivec,ino3)&
  906. +1.56*rrv(ivec,kc61)*yv(ivec,ieth)*yv(ivec,ioh)&
  907. +rrv(ivec,kc62)*yv(ivec,ieth)*yv(ivec,io3)&
  908. +0.629*rrv(ivec,kc76)*yv(ivec,iisop)*yv(ivec,ioh)&
  909. +0.6*rrv(ivec,kc77)*yv(ivec,iisop)*yv(ivec,io3)&
  910. +rrv(ivec,kohch3oh)*yv(ivec,ioh)*yv(ivec,ich3oh)&
  911. +rrv(ivec,kno3mo2)*yv(ivec,ino3)*yv(ivec,ich3o2)&
  912. +0.1*rrv(ivec,kohethoh)*yv(ivec,ioh)*yv(ivec,iethoh)&
  913. +0.54*rrv(ivec,ko3c3h6)*yv(ivec,io3)*yv(ivec,ic3h6)&
  914. +1.22*rrv(ivec,kohterp)*yv(ivec,ioh)*yv(ivec,iterp)&
  915. +1.8*rrv(ivec,ko3terp)*yv(ivec,io3)*yv(ivec,iterp)&
  916. +0.167*rrv(ivec,kohispd)*yv(ivec,ioh)*yv(ivec,iispd)&
  917. +0.15*rrv(ivec,ko3ispd)*yv(ivec,io3)*yv(ivec,iispd)&
  918. +0.282*rrv(ivec,kno3ispd)*yv(ivec,ino3)*yv(ivec,iispd)&
  919. +0.9*rjv(ivec,jispd)*yv(ivec,iispd)&
  920. +rrv(ivec,kaco2no)*yv(ivec,iaco2)*yv(ivec,ino)&
  921. +rrv(ivec,khypo2no)*yv(ivec,ino)*yv(ivec,ihypro2)&
  922. +rjv(ivec,jmo2no2b)*yv(ivec,ich3o2no2)
  923. XLCH2O=rjv(ivec,jach2o)+rjv(ivec,jbch2o)+yv(ivec,ioh)*rrv(ivec,kfrmoh)&
  924. +rrv(ivec,kc41)*yv(ivec,ino3)
  925. XLCH2O=XLCH2O + vdv(ivec,ich2o)
  926. yv(ivec,ich2o)=(y0v(ivec,ich2o)+PCH2O*DT)/(1.+XLCH2O*DT)
  927. ! --- CBIV-elements for higher HC-chemistry: ALD2 MGLY
  928. ! --- ETH OLE ISOP ROOH ORGNTR
  929. PALD2=0.11*rrv(ivec,kc52)*yv(ivec,ipar)*yv(ivec,ioh)&
  930. +1.1*rrv(ivec,kc53)*yv(ivec,iror)&
  931. +0.95*rrv(ivec,kc57)*yv(ivec,iole)*yv(ivec,ioh)&
  932. +0.5*rrv(ivec,kc58)*yv(ivec,iole)*yv(ivec,io3)&
  933. +0.91*rrv(ivec,kc59)*yv(ivec,iole)*yv(ivec,ino3)&
  934. +0.22*rrv(ivec,kc61)*yv(ivec,ieth)*yv(ivec,ioh)&
  935. +0.8*rrv(ivec,kc78)*yv(ivec,iisop)*yv(ivec,ino3)&
  936. +0.04*rrv(ivec,kohrooh)*yv(ivec,ioh)*yv(ivec,irooh)&
  937. +0.991*rrv(ivec,kohc2h6)*yv(ivec,ioh)*yv(ivec,ic2h6)&
  938. +0.3*rjv(ivec,jrooh)*yv(ivec,irooh)&
  939. +0.3*rrv(ivec,kc84)*yv(ivec,ioh)*yv(ivec,iorgntr)&
  940. +0.3*rjv(ivec,jorgn)*yv(ivec,iorgntr)&
  941. +rrv(ivec,kohethoh)*yv(ivec,ioh)*yv(ivec,iethoh)&
  942. +0.5*rrv(ivec,ko3c3h6)*yv(ivec,io3)*yv(ivec,ic3h6)&
  943. +0.47*rrv(ivec,kohterp)*yv(ivec,ioh)*yv(ivec,iterp)&
  944. +0.21*rrv(ivec,ko3terp)*yv(ivec,io3)*yv(ivec,iterp)&
  945. +0.47*rrv(ivec,kno3terp)*yv(ivec,ino3)*yv(ivec,iterp)&
  946. +0.273*rrv(ivec,kohispd)*yv(ivec,ioh)*yv(ivec,iispd)&
  947. +0.02*rrv(ivec,ko3ispd)*yv(ivec,io3)*yv(ivec,iispd)&
  948. +0.357*rrv(ivec,kno3ispd)*yv(ivec,ino3)*yv(ivec,iispd)&
  949. +0.067*rjv(ivec,jispd)*yv(ivec,iispd)&
  950. +0.7*rrv(ivec,kaco2mo2)*yv(ivec,iaco2)*yv(ivec,ich3o2)&
  951. +0.27*rrv(ivec,kc3h7o2no)*yv(ivec,ic3h7o2)*yv(ivec,ino)&
  952. +rrv(ivec,khypo2no)*yv(ivec,ihypro2)*yv(ivec,ino)
  953. XLALD2=rrv(ivec,kc43)*yv(ivec,ioh)+rrv(ivec,kc44)*yv(ivec,ino3)&
  954. +rjv(ivec,jald2)
  955. XLALD2=XLALD2 + vdv(ivec,iald2)
  956. yv(ivec,iald2)=(y0v(ivec,iald2)+PALD2*DT)/(1.+XLALD2*DT)
  957. PMGLY=0.19*rrv(ivec,kohrooh)*yv(ivec,ioh)*yv(ivec,irooh)&
  958. +0.168*rrv(ivec,kohispd)*yv(ivec,ioh)*yv(ivec,iispd)&
  959. +0.85*rrv(ivec,ko3ispd)*yv(ivec,io3)*yv(ivec,iispd)&
  960. +0.5*rrv(ivec,kaco2mo2)*yv(ivec,iaco2)*yv(ivec,ich3o2)
  961. XLMGLY=rrv(ivec,kc73)*yv(ivec,ioh)+rjv(ivec,jmgly)
  962. yv(ivec,imgly)=(y0v(ivec,imgly)+PMGLY*DT)/(1.+XLMGLY*DT)
  963. XLETH=rrv(ivec,kc61)*yv(ivec,ioh)+rrv(ivec,kc62)*yv(ivec,io3)
  964. yv(ivec,ieth)=y0v(ivec,ieth)/(1.+XLETH*DT)
  965. POLE=0.
  966. XLOLE=rrv(ivec,kc57)*yv(ivec,ioh)+rrv(ivec,kc58)*yv(ivec,io3)+rrv(ivec,kc59)*yv(ivec,ino3)
  967. yv(ivec,iole)=(y0v(ivec,iole)+POLE*DT)/(1.+XLOLE*DT)
  968. PROOH=rrv(ivec,kc82)*yv(ivec,ixo2)*yv(ivec,iho2)&
  969. +rrv(ivec,kc85)*yv(ivec,iho2)*yv(ivec,ixo2n)&
  970. +rrv(ivec,kaco2ho2)*yv(ivec,iaco2)*yv(ivec,iho2)&
  971. +rrv(ivec,kc3h7o2ho2)*yv(ivec,ic3h7o2)*yv(ivec,iho2)&
  972. +rrv(ivec,khypo2ho2)*yv(ivec,ihypro2)*yv(ivec,iho2)
  973. XLROOH=rjv(ivec,jrooh)+rrv(ivec,kohrooh)*yv(ivec,ioh)
  974. XLROOH = XLROOH + vdv(ivec,irooh)
  975. yv(ivec,irooh)=(y0v(ivec,irooh)+PROOH*DT)/(1.+XLROOH*DT)
  976. PORGNTR=rrv(ivec,kc81)*yv(ivec,ino)*yv(ivec,ixo2n)&
  977. +0.8*rrv(ivec,kc78)*yv(ivec,iisop)*yv(ivec,ino3)&
  978. +rrv(ivec,kno3c3h6)*yv(ivec,ic3h6)*yv(ivec,ino3)&
  979. +0.53*rrv(ivec,kno3terp)*yv(ivec,ino3)*yv(ivec,iterp)&
  980. +0.85*rrv(ivec,kno3ispd)*yv(ivec,ino3)*yv(ivec,iispd)
  981. XLORGNTR=rrv(ivec,kc84)*yv(ivec,ioh)+rjv(ivec,jorgn)
  982. XLORGNTR=XLORGNTR+vdv(ivec,iorgntr)
  983. yv(ivec,iorgntr)=(y0v(ivec,iorgntr)+PORGNTR*DT)/(1.+XLORGNTR*DT)
  984. PACET=0.82*rrv(ivec,kc3h7o2no)*yv(ivec,ino)*yv(ivec,ic3h7o2)
  985. XLACET=rjv(ivec,ja_acet)+rjv(ivec,jb_acet)+rrv(ivec,kohacet)*yv(ivec,ioh)
  986. XLACET=XLACET+vdv(ivec,iacet)
  987. yv(ivec,iacet)=(y0v(ivec,iacet)+PACET*DT)/(1.+XLACET*DT)
  988. ! gas phase sulfur & ammonia
  989. qdms1=rrv(ivec,kdmsoha)*yv(ivec,ioh)+rrv(ivec,kdmsno3)*yv(ivec,ino3)
  990. qdms2=rrv(ivec,kdmsohb)*yv(ivec,ioh)
  991. qdms=qdms1+qdms2
  992. yv(ivec,idms)=y0v(ivec,idms)/(1.+qdms*DT)
  993. pso2=yv(ivec,idms)*(qdms1+0.75*qdms2)
  994. pmsa=yv(ivec,idms)*0.25*qdms2
  995. qso2=rrv(ivec,kso2oh)*yv(ivec,ioh)
  996. qso2d=qso2 + vdv(ivec,iso2)
  997. yv(ivec,iso2)=(y0v(ivec,iso2)+pso2*DT) /(1.+qso2d*DT) !qso2d includes deposition
  998. yv(ivec,imsa)=(y0v(ivec,imsa)+pmsa*DT) /(1.+vdv(ivec,imsa)*DT)
  999. #ifdef with_m7
  1000. !VH: Do not apply dry deposition to H2SO4 : This deposition velocity represents aerosol deposition
  1001. yv(ivec,iso4)=(y0v(ivec,iso4)+qso2*yv(ivec,iso2)*DT)
  1002. #ifdef with_budgets
  1003. ! leave out dt to get s-1 values
  1004. temp_prod_so4(ivec,1)=qso2*yv(ivec,iso2)*DT
  1005. #endif
  1006. #else
  1007. !VH: Do apply dry deposition to SO4_A : This deposition velocity does represent aerosol deposition
  1008. !VH: Use the same aerosol deposition velocity for NO3_A deposition.
  1009. yv(ivec,iso4)=(y0v(ivec,iso4)+qso2*yv(ivec,iso2)*DT) /(1. + vdv(ivec,iso4)*DT) !corrected CMK qso2/qso2d
  1010. yv(ivec,ino3_a)=y0v(ivec,ino3_a) /(1.+vdv(ivec,ino3_a)*DT) ! VH/FD include dry dep for no3_a? (should be copy of so4)
  1011. #endif
  1012. yv(ivec,inh4)=y0v(ivec,inh4)/(1.+vdv(ivec,inh4)*DT) ! This is just deposition
  1013. pnh2=yv(ivec,inh2o2)*yv(ivec,ino)*rrv(ivec,knh2o2no)&
  1014. +yv(ivec,inh2o2)*yv(ivec,io3)*rrv(ivec,knh2o2o3)&
  1015. +yv(ivec,inh2o2)*yv(ivec,iho2)*rrv(ivec,knh2o2ho2)
  1016. pnh3=rrv(ivec,Knh2ho2)*yv(ivec,inh2)*yv(ivec,iho2)
  1017. dnh3=yv(ivec,ioh)*rrv(ivec,knh3oh) + vdv(ivec,inh3)
  1018. yv(ivec,inh3)=(y0v(ivec,inh3)+pnh3*DT)/(1.+dnh3*DT)
  1019. ppnh3=yv(ivec,ioh)*yv(ivec,inh3)*rrv(ivec,knh3oh)
  1020. qnh2= rrv(ivec,knh2oh)*yv(ivec,ioh)+rrv(ivec,knh2no)*yv(ivec,ino)&
  1021. +rrv(ivec,knh2no2)*yv(ivec,ino2)+rrv(ivec,knh2ho2)*yv(ivec,iho2)&
  1022. +rrv(ivec,knh2o3)*yv(ivec,io3)&
  1023. +rrv(ivec,knh2o2)
  1024. yv(ivec,inh2)=(y0v(ivec,inh2)+ppnh3*dt+pnh2*dt)/(1.+qnh2*dt)
  1025. !
  1026. ! Now nh2o2 radical
  1027. !
  1028. qnh2o2=rrv(ivec,knh2o2no)*yv(ivec,ino)+rrv(ivec,knh2o2o3)*yv(ivec,io3)+rrv(ivec,knh2o2ho2)*yv(ivec,iho2)
  1029. yv(ivec,inh2o2)=(y0v(ivec,inh2o2)+(rrv(ivec,knh2o3)*yv(ivec,io3)*yv(ivec,inh2)*DT))/(1.+qnh2o2*DT)
  1030. end do !ivec
  1031. end if
  1032. if ( mod(iter,maxit) == 0 ) then
  1033. ! --- Long living compounds
  1034. do ivec=1,lvec
  1035. yv(ivec,ich4)=y0v(ivec,ich4)/(1.+rrv(ivec,kch4oh)*yv(ivec,ioh)*DT)
  1036. ! ch4loss=1.0-1.0/((1.+rrv(ivec,kch4oh)*yv(ivec,ioh)*DT))
  1037. !methane loss?
  1038. PCO=yv(ivec,ich2o)*(rjv(ivec,jach2o)+rjv(ivec,jbch2o)&
  1039. +yv(ivec,ioh)*rrv(ivec,kfrmoh))&
  1040. +rjv(ivec,jald2)*yv(ivec,iald2)&
  1041. +rjv(ivec,jmgly)*yv(ivec,imgly)&
  1042. +0.62*rrv(ivec,kc57)*yv(ivec,iole)*yv(ivec,ioh)&
  1043. +0.65*rrv(ivec,kc58)*yv(ivec,iole)*yv(ivec,io3)&
  1044. +0.56*rrv(ivec,kc59)*yv(ivec,iole)*yv(ivec,ino3)&
  1045. +0.24*rrv(ivec,kc62)*yv(ivec,ieth)*yv(ivec,io3)&
  1046. +0.066*rrv(ivec,kc77)*yv(ivec,iisop)*yv(ivec,io3)&
  1047. +rrv(ivec,kc41)*yv(ivec,ich2o)*yv(ivec,ino3)&
  1048. +0.56*rrv(ivec,ko3c3h6)*yv(ivec,io3)*yv(ivec,ic3h6)&
  1049. +0.47*rrv(ivec,kohterp)*yv(ivec,ioh)*yv(ivec,iterp)&
  1050. +0.211*rrv(ivec,ko3terp)*yv(ivec,io3)*yv(ivec,iterp)&
  1051. +0.47*rrv(ivec,kno3terp)*yv(ivec,ino3)*yv(ivec,iterp)&
  1052. +0.334*rrv(ivec,kohispd)*yv(ivec,ioh)*yv(ivec,iispd)&
  1053. +0.225*rrv(ivec,ko3ispd)*yv(ivec,io3)*yv(ivec,iispd)&
  1054. +0.643*rrv(ivec,kno3ispd)*yv(ivec,ino3)*yv(ivec,iispd)&
  1055. +0.333*rjv(ivec,jispd)*yv(ivec,iispd)&
  1056. +rjv(ivec,ja_acet)*yv(ivec,iacet)
  1057. XLCO = rrv(ivec,kcooh)*yv(ivec,ioh)
  1058. XLCO = XLCO + vdv(ivec,ico)
  1059. yv(ivec,ico)=(y0v(ivec,ico)+PCO*DT)/(1.+XLCO*DT)
  1060. !carbon monoxide loss?
  1061. pch3oh=(0.63*rrv(ivec,kmo2mo2)*yv(ivec,ich3o2)*yv(ivec,ich3o2))+&
  1062. (0.5*rrv(ivec,kaco2mo2)*yv(ivec,ich3o2)*yv(ivec,iaco2))
  1063. yv(ivec,ich3oh)=(y0v(ivec,ich3oh)+pch3oh*dt)/&
  1064. (1.+(vdv(ivec,ich3oh)+rrv(ivec,kohch3oh)*yv(ivec,ioh))*dt)
  1065. phcooh=(0.52*rrv(ivec,kc62)*yv(ivec,io3)*yv(ivec,ieth)) +&
  1066. (0.25*rrv(ivec,ko3c3h6)*yv(ivec,io3)*yv(ivec,ic3h6))
  1067. yv(ivec,ihcooh)=(y0v(ivec,ihcooh)+(phcooh*dt))/&
  1068. (1.+rrv(ivec,kohhcooh)*yv(ivec,ioh)*dt)
  1069. pmcooh=0.4*rrv(ivec,kc50)*yv(ivec,ic2o3)*yv(ivec,iho2)
  1070. yv(ivec,imcooh)=(y0v(ivec,imcooh)+(pmcooh*dt))/&
  1071. (1.+(vdv(ivec,imcooh)+rrv(ivec,kohmcooh)*yv(ivec,ioh))*dt)
  1072. yv(ivec,ic2h6)=y0v(ivec,ic2h6)/(1.+rrv(ivec,kohc2h6)*yv(ivec,ioh)*dt)
  1073. yv(ivec,iethoh)=(y0v(ivec,iethoh)/(1.+(vdv(ivec,iethoh)+rrv(ivec,kohethoh)*yv(ivec,ioh))*dt))
  1074. yv(ivec,ic3h8)=(y0v(ivec,ic3h8)/(1.+rrv(ivec,kohc3h8)*yv(ivec,ioh)*dt))
  1075. xlc3h6=rrv(ivec,kohc3h6)*yv(ivec,ioh)&
  1076. +rrv(ivec,ko3c3h6)*yv(ivec,io3)&
  1077. +rrv(ivec,kno3c3h6)*yv(ivec,ino3)
  1078. yv(ivec,ic3h6)=(y0v(ivec,ic3h6)/(1.+xlc3h6*dt))
  1079. ppar=0.35*rrv(ivec,kc77)*yv(ivec,iisop)*yv(ivec,io3)&
  1080. +2.4*rrv(ivec,kc78)*yv(ivec,iisop)*yv(ivec,ino3)&
  1081. +5.0*rrv(ivec,kohterp)*yv(ivec,ioh)*yv(ivec,iterp)&
  1082. +6.0*rrv(ivec,ko3terp)*yv(ivec,io3)*yv(ivec,iterp)&
  1083. +6.0*rrv(ivec,kno3terp)*yv(ivec,ino3)*yv(ivec,iterp)&
  1084. +1.565*rrv(ivec,kohispd)*yv(ivec,ioh)*yv(ivec,iispd)&
  1085. +0.36*rrv(ivec,ko3ispd)*yv(ivec,io3)*yv(ivec,iispd)&
  1086. +1.282*rrv(ivec,kno3ispd)*yv(ivec,ino3)*yv(ivec,iispd)&
  1087. +0.832*rjv(ivec,jispd)*yv(ivec,iispd)&
  1088. +0.6*rrv(ivec,kaco2mo2)*yv(ivec,ich3o2)*yv(ivec,iaco2)
  1089. xlpar=rrv(ivec,kc52)*yv(ivec,ioh)+rrv(ivec,kc83)*yv(ivec,irxpar)
  1090. yv(ivec,ipar)=(y0v(ivec,ipar)+ppar*dt)/(1.+xlpar*dt)
  1091. !cmk ____added rn222 chemistry in EBI language
  1092. yv(ivec,irn222) = y0v(ivec,irn222)/(1.+rrv(ivec,krn222)*dt)
  1093. yv(ivec,ipb210) = y0v(ivec,ipb210)+y0v(ivec,irn222)-yv(ivec,irn222)
  1094. end do !ivec
  1095. end if
  1096. end do !ITER
  1097. end subroutine DO_EBI
  1098. subroutine NOYmass
  1099. integer i,j,imax
  1100. real :: ncormax,ncorav,totn,totn0,fnoy,fnoy1
  1101. real :: ncorr,ncorr1,ncorr2,ncorr3,ncorr4,ncorr5, totdep
  1102. logical :: nerr
  1103. ncormax=0.
  1104. ncorav=0.
  1105. nerr=.false.
  1106. imax = 0
  1107. do j=j1,j2
  1108. do i=i1,i2
  1109. imax = imax + 1
  1110. !
  1111. !** Guarantee exact mass conservation of NOY
  1112. ! (this may matter a few percent)
  1113. !
  1114. fnoy=y(i,j,ino)+y(i,j,ino2)+y(i,j,ino3)+2.*y(i,j,in2o5)+y(i,j,ihno4)
  1115. if (level == 1) then
  1116. #ifndef without_dry_deposition
  1117. totdep = (y(i,j,ino) *vd(region,ino )%surf(i,j) + &
  1118. y(i,j,ino2)*vd(region,ino2)%surf(i,j) + &
  1119. y(i,j,ino3)*vd(region,ino3)%surf(i,j) + &
  1120. y(i,j,ihno3)*vd(region,ihno3)%surf(i,j) + &
  1121. y(i,j,ipan)*vd(region,ipan)%surf(i,j) + &
  1122. y(i,j,iorgntr)*vd(region,iorgntr)%surf(i,j) + &
  1123. y(i,j,ich3o2no2)*vd(region,ich3o2no2)%surf(i,j) + &
  1124. 2*y(i,j,in2o5)*vd(region,in2o5)%surf(i,j) + &
  1125. y(i,j,ihno4)*vd(region,ihno4)%surf(i,j) + &
  1126. y(i,j,ihono)*vd(region,ihono)%surf(i,j))*dt/ye(i,j,idz)
  1127. #else
  1128. totdep = 0.0
  1129. #endif
  1130. else
  1131. totdep = 0.0
  1132. end if
  1133. totn0=y0(i,j,inox)+y0(i,j,ihno3)+y0(i,j,ipan)+y0(i,j,ihono)+ &
  1134. y0(i,j,iorgntr) + y0(i,j,ich3o2no2) + ye(i,j,ieno)*dt - totdep
  1135. ! note that emino is added here and the total deposition is subtracted
  1136. !
  1137. ! totn0 contains all nitrogen at beginning of timestep + nox emissions
  1138. !
  1139. !
  1140. ! totn contains all nitrogen at end of timestep
  1141. !
  1142. totn=fnoy+y(i,j,ihno3)+y(i,j,ipan)+y(i,j,iorgntr)+y(i,j,ihono)+ y(i,j,ich3o2no2)
  1143. ! correction factor for all nitrogen compounds
  1144. ncorr=totn-totn0
  1145. if ( totn < tiny(totn) ) cycle
  1146. if ( (abs(ncorr)/totn) > 0.05 ) then !CMK changed from 0.1 to 0.05
  1147. nerr=.true.
  1148. !AJS>>>
  1149. ! print *,'NOYmass: N-error....',region,level,i,j,totn0,totn
  1150. ! print *,'NOYmass: emino ',ye(i,j,ieno)*dt/y0(i,j,iair)*1e9
  1151. ! print *,'NOYmass: NO(0) ', &
  1152. ! y0(i,j,ino)/y0(i,j,iair)*1e9,y(i,j,ino)/y(i,j,iair)*1e9
  1153. ! print *,'NOYmass: NO2(0) ', &
  1154. ! y0(i,j,ino2)/y0(i,j,iair)*1e9,y(i,j,ino2)/y(i,j,iair)*1e9
  1155. ! print *,'NOYmass: O3(0) ', &
  1156. ! y0(i,j,io3)/y0(i,j,iair)*1e9,y(i,j,io3)/y(i,j,iair)*1e9
  1157. ! print *,'NOYmass: NO3(0) ', &
  1158. ! y0(i,j,ino3)/y0(i,j,iair)*1e9,y(i,j,ino3)/y(i,j,iair)*1e9
  1159. ! print *,'NOYmass: N2O5(0) ', &
  1160. ! y0(i,j,in2o5)/y0(i,j,iair)*1e9,y(i,j,in2o5)/y(i,j,iair)*1e9
  1161. ! print *,'NOYmass: HNO4(0) ', &
  1162. ! y0(i,j,ihno4)/y0(i,j,iair)*1e9,y(i,j,ihno4)/y(i,j,iair)*1e9
  1163. ! print *,'NOYmass: HNO3(0) ', &
  1164. ! y0(i,j,ihno3)/y0(i,j,iair)*1e9,y(i,j,ihno3)/y(i,j,iair)*1e9
  1165. ! print *,'NOYmass: PAN(0) ', &
  1166. ! y0(i,j,ipan)/y0(i,j,iair)*1e9,y(i,j,ipan)/y(i,j,iair)*1e9
  1167. ! print *,'NOYmass: ORGNT(0) ', &
  1168. ! y0(i,j,iorgntr)/y0(i,j,iair)*1e9,y(i,j,iorgntr)/y(i,j,iair)*1e9
  1169. ! print *,'NOYmass: NOx(0) ', &
  1170. ! y0(i,j,inox)/y0(i,j,iair)*1e9,y(i,j,inox)/y(i,j,iair)*1e9
  1171. ! print *,'NOYmass: ',rj(i,j,jhno3),rr(i,j,kohhno3)*y(i,j,ioh), &
  1172. ! y(i,j,ioh)/y(i,j,iair)*1e9
  1173. !<<<AJS
  1174. end if
  1175. ! maximum and average correction factor in this loop
  1176. ncormax=max(abs(ncormax),abs(ncorr/totn))
  1177. ncorav=ncorav+abs(ncorr/totn)
  1178. !
  1179. ! first correct hno3, pan and organic nitrates (added hono)
  1180. ! (as a group of reservoir tracers)
  1181. !
  1182. totn=y(i,j,ihno3)+y(i,j,ipan)+y(i,j,iorgntr)+y(i,j,ihono)+y(i,j,ich3o2no2)
  1183. if ( totn < tiny(totn) ) cycle
  1184. ncorr1=y(i,j,ihno3) *(1.-ncorr/totn)
  1185. ncorr2=y(i,j,ipan) *(1.-ncorr/totn)
  1186. ncorr3=y(i,j,iorgntr)*(1.-ncorr/totn)
  1187. ncorr4=y(i,j,ihono)*(1.-ncorr/totn)
  1188. ncorr5=y(i,j,ich3o2no2)*(1.-ncorr/totn)
  1189. y(i,j,ihno3) =max(0.,ncorr1)
  1190. y(i,j,ipan) =max(0.,ncorr2)
  1191. y(i,j,iorgntr) =max(0.,ncorr3)
  1192. y(i,j,ihono) =max(0.,ncorr4)
  1193. y(i,j,ich3o2no2)=max(0.,ncorr5)
  1194. ncorr=ncorr1+ncorr2+ncorr3+ncorr4+ncorr5-y(i,j,ihno3)-y(i,j,ipan)-y(i,j,iorgntr)-y(i,j,ihono)-y(i,j,ich3o2no2)
  1195. !
  1196. ! the remainder is used to scale the noy components
  1197. !
  1198. fnoy1=(fnoy+ncorr)/fnoy
  1199. y(i,j,ino) =fnoy1*y(i,j,ino)
  1200. y(i,j,ino2) =fnoy1*y(i,j,ino2)
  1201. y(i,j,ino3) =fnoy1*y(i,j,ino3)
  1202. y(i,j,in2o5)=fnoy1*y(i,j,in2o5)
  1203. y(i,j,ihno4)=fnoy1*y(i,j,ihno4)
  1204. y(i,j,inox) =y(i,j,ino)+y(i,j,ino2)+y(i,j,ino3)+2.*y(i,j,in2o5)+y(i,j,ihno4)
  1205. end do
  1206. end do
  1207. if ( nerr ) then
  1208. write (gol,'("NOYmass: N-mass balance error, ncorr>5% ")'); call goPr
  1209. write (gol,'(" Maximum correction : ",f8.2)') ncormax; call goPr
  1210. write (gol,'(" Average correction in this loop (imax) : ",f8.2," (",i6,")")') ncorav/imax, imax; call goPr
  1211. end if
  1212. end subroutine NOYmass
  1213. #ifdef with_budgets
  1214. !--------------------------------------------------------------------------
  1215. ! TM5 !
  1216. !--------------------------------------------------------------------------
  1217. !BOP
  1218. !
  1219. ! !IROUTINE:
  1220. !
  1221. ! !DESCRIPTION: increase reaction budgets for each reaction
  1222. ! arrays nrr and nrj determine which species are
  1223. ! involved in a reaction
  1224. !\\
  1225. !\\
  1226. ! !INTERFACE:
  1227. !
  1228. subroutine INCC2C3
  1229. !
  1230. #ifdef with_tendencies
  1231. use TRACER_DATA, only : PLC_AddValue, plc_ipr_lddep, plc_kg_from_tm
  1232. #endif
  1233. ! integer, intent(out) :: status
  1234. integer :: i01,n1,n2,jl,i,j
  1235. ! nrj and nrr used for reaction budget calculations
  1236. integer,dimension(nj),parameter :: nrj=(/io3,ino2,ih2o2,ihno3,ihno4,in2o5,in2o5,ich2o,ich2o, &
  1237. ich3o2h,ino3,ino3,ipan,ipan,iorgntr,iald2,imgly,irooh,io2,iispd,iacet,iacet, &
  1238. ihono,ich3o2no2,ich3o2no2/)
  1239. integer,dimension(nreac,2),parameter :: nrr = reshape((/ &
  1240. ino ,iho2 ,ich3o2,ino2 ,ioh ,ino2 ,ino ,ino2 ,in2o5, ihno4 , &
  1241. ino2 ,ihno4 ,iair ,ih2o ,io3 ,ico ,io3 ,ih2o2 ,ich2o, ich4 , &
  1242. ioh ,ioh ,ich3o2,ich3o2 ,ich3o2 ,iho2 ,iho2 ,in2o5 ,ioh , ich2o , &
  1243. iald2 ,iald2 ,ic2o3 ,ic2o3 ,ipan ,ic2o3 ,ic2o3 ,ipar ,iror , iror , &
  1244. ioh ,io3 ,ino3 ,ioh ,io3 ,ioh ,ioh ,io3 ,ino3 , ixo2 , &
  1245. ixo2 ,ixo2n ,ixo2 ,irxpar ,iorgntr,ixo2n ,idms ,idms ,idms , iso2 , &
  1246. inh3 ,inh3 ,inh2 ,inh2 ,inh2 ,inh2 ,inh2 ,inh2 ,ioh ,ioh , ino3 , &
  1247. ino3 ,ino3 ,ino3 ,ioh ,ioh ,ioh ,ioh ,ioh ,io3 , ino3 , &
  1248. ioh ,io3 ,ino3 ,ioh ,io3 ,ino3 ,irn222,io3 ,iair , iacet , &
  1249. iaco2 ,iaco2 ,iaco2 ,iaco2 ,ixo2 ,ixo2n ,ino ,iho2 ,ino , iho2 , &
  1250. in2o5 ,ino3 ,iho2 ,iho2 ,ino ,io3 ,iho2, ioh ,ioh ,ich3o2,ich3o2no2, &
  1251. !second reaction partner (if monmolecular = 0)
  1252. io3 ,ino ,ino ,ioh ,ihno3 ,io3 ,ino3 ,ino3 ,0 ,ioh , &
  1253. iho2 ,0 ,0 ,0 ,iho2 ,ioh ,ioh ,ioh ,ioh ,ioh , &
  1254. ich3o2h,irooh ,iho2 ,iho2 ,ich3o2 ,ioh ,iho2 ,0 ,0 ,ino3 , &
  1255. ioh ,ino3 ,ino ,ino2 ,0 ,ic2o3 ,iho2 ,ioh ,0 ,0 , &
  1256. iole ,iole ,iole ,ieth ,ieth ,imgly ,iisop ,iisop ,iisop ,ino , &
  1257. ixo2 ,ino ,iho2 ,ipar ,ioh ,iho2 ,ioh ,ioh ,ino3 ,ioh , &
  1258. iacid ,ioh ,ioh ,ino ,ino2 ,iho2 ,0 ,io3 ,ich3oh ,ihcooh ,iho2 , &
  1259. ich3o2 ,ic2o3 ,ixo2 ,imcooh ,ic2h6 ,iethoh,ic3h8 ,ic3h6 ,ic3h6 ,ic3h6 , &
  1260. iterp ,iterp ,iterp ,iispd ,iispd ,iispd ,0 ,iair ,0 ,ioh , &
  1261. iho2 ,ich3o2,ino ,ixo2 ,ixo2n ,ixo2n ,ic3h7o2,ic3h7o2,ihypro2,ihypro2, &
  1262. 0 ,0 ,0 ,0 ,inh2o2 ,inh2o2,inh2o2, ino ,ihono ,ino2 ,0/),(/nreac,2/))
  1263. real :: c1,xdep
  1264. c1=dt*1000./xmair !conversion to moles...
  1265. ! Reaction budgets
  1266. do i01=1,nj !photolysis rates
  1267. n1=nrj(i01)
  1268. do j=j1,j2
  1269. do i=i1,i2
  1270. if(n1 > 0) cr2(i,j,i01)=cr2(i,j,i01)+rj(i,j,i01)*y(i,j,n1)
  1271. end do
  1272. end do
  1273. end do!i01=1,nj
  1274. !
  1275. do i01=1,nreac !reactions
  1276. n1=nrr(i01,1) !make sure n1 > 0
  1277. n2=nrr(i01,2)
  1278. if (n2 > 0.) then
  1279. do j=j1,j2
  1280. do i=i1,i2
  1281. cr3(i,j,i01)= cr3(i,j,i01)+y(i,j,n1)*y(i,j,n2)*rr(i,j,i01)
  1282. end do
  1283. end do
  1284. else
  1285. do j=j1,j2
  1286. do i=i1,i2
  1287. cr3(i,j,i01)= cr3(i,j,i01)+y(i,j,n1)*rr(i,j,i01)
  1288. end do
  1289. end do
  1290. end if
  1291. end do !i01=1,nreac
  1292. if ( level == 1 ) then ! deposition budget
  1293. do i01=1,ntrace
  1294. if (fscale(i01) > 0) then
  1295. do j=j1,j2
  1296. do i=i1,i2
  1297. #ifndef without_dry_deposition
  1298. if (i01 .ne. inox) then
  1299. xdep = y(i,j,i01)*vd(region,i01)%surf(i,j)/ye(i,j,idz)* &
  1300. c1*ye(i,j,iairm)/y(i,j,iair) !from updated concentrations
  1301. else ! compute nox deposition from other contributors!
  1302. xdep = (y(i,j,ino) *vd(region,ino)%surf(i,j) + &
  1303. y(i,j,ino2 )*vd(region,ino2)%surf(i,j)+ &
  1304. y(i,j,ino3) *vd(region,ino3)%surf(i,j)+ &
  1305. y(i,j,ihno3)*vd(region,ihno3)%surf(i,j)+ &
  1306. 2*y(i,j,in2o5)*vd(region,in2o5)%surf(i,j) + &
  1307. y(i,j,ihono)*vd(region,ihono)%surf(i,j)) &
  1308. /ye(i,j,idz)* &
  1309. c1*ye(i,j,iairm)/y(i,j,iair) !from updated concentrations
  1310. endif
  1311. #else
  1312. xdep = 0.0
  1313. #endif
  1314. buddep_dat(region)%dry(i,j,i01) = &
  1315. buddep_dat(region)%dry(i,j,i01) + xdep
  1316. if ( i01 == 1 ) then !seperate deposition from 'other' chemistry
  1317. #ifndef without_dry_deposition
  1318. sum_deposition(region) = sum_deposition(region) - &
  1319. xdep*ra(1)*1e-3 ! in kg
  1320. #endif
  1321. sum_chemistry(region) = sum_chemistry(region) + &
  1322. (y(i,j,1)-y0(i,j,1))/y(i,j,iair)* &
  1323. ye(i,j,iairm)/xmair*ra(1) + xdep*ra(1)*1e-3
  1324. end if
  1325. ! FIXME TENDENCIES
  1326. #ifdef with_tendencies
  1327. ! Add deposition budget in kg to tendencies;
  1328. ! (mole tm tracer) * (g/mole) * (kg/g) = kg tm tracer
  1329. call PLC_AddValue( region, plc_ipr_lddep, i, j, 1, i01, &
  1330. xdep * ra(i01) * 1e-3 * plc_kg_from_tm(i01), & ! kg plc tracer
  1331. status )
  1332. ! IF_NOTOK_RETURN(status=1)
  1333. #endif
  1334. end do
  1335. end do
  1336. endif
  1337. end do !i01
  1338. else ! other layers
  1339. do j=j1,j2
  1340. do i=i1,i2
  1341. sum_chemistry(region) = sum_chemistry(region) + &
  1342. (y(i,j,1)-y0(i,j,1))/y(i,j,iair)*ye(i,j,iairm)/xmair*ra(1)
  1343. end do
  1344. end do
  1345. end if !level ==1
  1346. end subroutine INCC2C3
  1347. !--------------------------------------------------------------------------
  1348. ! TM5 !
  1349. !--------------------------------------------------------------------------
  1350. !BOP
  1351. !
  1352. ! !IROUTINE: REACBUD
  1353. !
  1354. ! !DESCRIPTION: accumulate budgets, o3 P/L
  1355. !\\
  1356. !\\
  1357. ! !INTERFACE:
  1358. !
  1359. SUBROUTINE REACBUD
  1360. !
  1361. ! !USES:
  1362. !
  1363. USE BUDGET_GLOBAL, ONLY : budg_dat, nzon_vg
  1364. !
  1365. !EOP
  1366. !------------------------------------------------------------------------
  1367. !BOC
  1368. integer :: i01, i, j, nzone, nzone_v
  1369. real :: c1
  1370. c1=dt*1000./xmair !conversion to moles
  1371. do j=j1,j2
  1372. do i=i1,i2
  1373. nzone=budg_dat(region)%nzong(i,j) !global budget
  1374. nzone_v=nzon_vg(level) !level is passed to ebi...
  1375. do i01=1,nj
  1376. budrjg(nzone,nzone_v,i01)=budrjg(nzone,nzone_v,i01)+ &
  1377. cr2(i,j,i01)*c1*ye(i,j,iairm)/y(i,j,iair) !units mole
  1378. end do !nj
  1379. ! ozone production on a 3D grid:
  1380. ! defined as: HO2 + NO, CH3O2 + NO, XO2 + NO, C2O3 + NO
  1381. o3p(region)%d3(i,j,level) = o3p(region)%d3(i,j,level) + &
  1382. (cr3(i,j,2) + cr3(i,j,3) + cr3(i,j,33) + cr3(i,j,50)) &
  1383. *c1*ye(i,j,iairm)/y(i,j,iair) ! acc. moles/gridbox
  1384. !AERCHEMMIP output
  1385. AC_O3_lp(region)%prod(i,j,level,1)=AC_O3_lp(region)%prod(i,j,level,1)+&
  1386. (cr3(i,j,2)+ cr3(i,j,3) + cr3(i,j,33) + cr3(i,j,50)) &
  1387. *c1*ye(i,j,iairm)/y(i,j,iair)
  1388. o3l(region)%d3(i,j,level) = o3l(region)%d3(i,j,level) + &
  1389. (cr3(i,j,4)-2*cr3(i,j,7) + 2*cr3(i,j,6) + cr3(i,j,8) - cr3(i,j,9) + &
  1390. cr3(i,j,15) + cr3(i,j,17) + cr3(i,j,42) - cr3(i,j,43) + &
  1391. cr3(i,j,45) + cr3(i,j,48) - 0.1*cr3(i,j,49) - cr3(i,j,55) + &
  1392. cr2(i,j,1) - cr2(i,j,4) - cr2(i,j,6) - cr2(i,j,13) - 2.*cr2(i,j,10)) &
  1393. *c1*ye(i,j,iairm)/y(i,j,iair) ! acc. moles/gridbox
  1394. !AERCHEMMIP output
  1395. AC_O3_lp(region)%prod(i,j,level,2)=AC_O3_lp(region)%prod(i,j,level,2)+&
  1396. (cr3(i,j,4)-2*cr3(i,j,7) + 2*cr3(i,j,6) + cr3(i,j,8) - cr3(i,j,9) + &
  1397. cr3(i,j,15) + cr3(i,j,17) + cr3(i,j,42) - cr3(i,j,43) + &
  1398. cr3(i,j,45) + cr3(i,j,48) - 0.1*cr3(i,j,49) - cr3(i,j,55) + &
  1399. cr2(i,j,1) - cr2(i,j,4) - cr2(i,j,6) - cr2(i,j,13) - 2.*cr2(i,j,10)) &
  1400. *c1*ye(i,j,iairm)/y(i,j,iair) ! acc. moles/gridbox
  1401. o3l(region)%d3(i,j,level) = o3l(region)%d3(i,j,level) - &
  1402. cr4(i,j,1)*(1000./xmair)*ye(i,j,iairm)/y(i,j,iair) !O3 + SO2 (note negative)
  1403. AC_O3_lp(region)%prod(i,j,level,2)=AC_O3_lp(region)%prod(i,j,level,2)+&
  1404. cr4(i,j,1)*(1000./xmair)*ye(i,j,iairm)/y(i,j,iair) !O3 + SO2 (note negative)
  1405. !write(4321,*) AC_O3_lp(region)%prod(i,j,level,2)
  1406. !write(4322,*) (cr3(i,j,2) + cr3(i,j,3) + cr3(i,j,33) + cr3(i,j,50)) &
  1407. ! *c1*ye(i,j,iairm)/y(i,j,iair)
  1408. !write(4323,*) (cr3(i,j,4)-2*cr3(i,j,7) + 2*cr3(i,j,6) + cr3(i,j,8) - cr3(i,j,9) + &
  1409. ! cr3(i,j,15) + cr3(i,j,17) + cr3(i,j,42) - cr3(i,j,43) + &
  1410. ! cr3(i,j,45) + cr3(i,j,48) - 0.1*cr3(i,j,49) - cr3(i,j,55) + &
  1411. ! cr2(i,j,1) - cr2(i,j,4) - cr2(i,j,6) - cr2(i,j,13) - 2.*cr2(i,j,10)) &
  1412. ! *c1*ye(i,j,iairm)/y(i,j,iair) ! acc. moles/gridbox
  1413. !write(4324,*) cr4(i,j,1)*(1000./xmair)*ye(i,j,iairm)/y(i,j,iair) !O3 + SO2 (note negative)
  1414. !PLS ! ch4+oh
  1415. !PLS ch4oh(region)%d3(i,j,level) = ch4oh(region)%d3(i,j,level) + &
  1416. !PLS cr3(i,j,20)*c1*ye(i,j,iairm)/y(i,j,iair) ! acc. moles/gridbox
  1417. !PLS ! S gas phase production (OH + SO2---> SO4, OH + DMS = 0.25 MSA)
  1418. !PLS so4pg(region)%d3(i,j,level) = so4pg(region)%d3(i,j,level) + &
  1419. !PLS (0.25*cr3(i,j,58) + cr3(i,j,60))*c1*ye(i,j,iairm)/y(i,j,iair) ! acc. moles/gridbox OH + SO2
  1420. !PLS ! SO4 wet production
  1421. !PLS so4pa(region)%d3(i,j,level) = so4pa(region)%d3(i,j,level) - &
  1422. !PLS (cr4(i,j,1)+cr4(i,j,2))*(1000./xmair)*ye(i,j,iairm)/y(i,j,iair) ! acc. moles/gridbox note neg.
  1423. do i01=1,nreac
  1424. budrrg(nzone,nzone_v,i01)=budrrg(nzone,nzone_v,i01)+ &
  1425. cr3(i,j,i01)*c1*ye(i,j,iairm)/y(i,j,iair) !units mole
  1426. end do
  1427. do i01=1,nreacw
  1428. budrwg(nzone,nzone_v,i01)=budrwg(nzone,nzone_v,i01)- &
  1429. cr4(i,j,i01)*(1000./xmair)*ye(i,j,iairm)/y(i,j,iair) ! mole
  1430. !note: changed sign to get 'positive' budget, just a
  1431. ! matter of definition, !CMK
  1432. end do
  1433. end do
  1434. end do
  1435. !sum up global budgets (done in chemistry/chemistry_done)
  1436. end subroutine REACBUD
  1437. !EOC
  1438. #endif
  1439. end subroutine EBI
  1440. !EOC
  1441. !--------------------------------------------------------------------------
  1442. ! TM5 !
  1443. !--------------------------------------------------------------------------
  1444. !BOP
  1445. !
  1446. ! !IROUTINE: WETS
  1447. !
  1448. ! !DESCRIPTION: aqueous phase chemistry of sulfur (and other): oxidation of
  1449. ! SO2 and uptake of other gases in the aqueous phase
  1450. ! Method : implicit solution of oxidation of SO2
  1451. !\\
  1452. !\\
  1453. ! !INTERFACE:
  1454. !
  1455. #ifdef with_budgets
  1456. subroutine wetS(region, level, is, js, y0, dt, y, ye, c4, status)
  1457. #else
  1458. subroutine wetS(region, level, is, js, y0, dt, y, ye, status)
  1459. #endif
  1460. !
  1461. ! !USES:
  1462. !
  1463. use Dims, only: CheckShape, idatei
  1464. use global_data, only: region_dat
  1465. use reaction_data, only: nreacw, ntlow, kso2hp, kso2o3
  1466. use chem_param
  1467. use dims, only: im, jm
  1468. use Binas, only: Avog
  1469. use boundary, only: LCMIP6_CO2, co2_glob
  1470. !
  1471. ! !INPUT PARAMETERS:
  1472. !
  1473. integer,intent(in) :: region !region region under operation (provides im,jm,lm via chemistry.mod)
  1474. integer,intent(in) :: level, is, js ! vertical level, tile start indices
  1475. real, intent(in) :: dt ! chemistry timestep
  1476. real, intent(in) :: y0(is:,js:,:) ! initial concentration
  1477. !
  1478. ! !OUTPUT PARAMETERS:
  1479. !
  1480. real, intent(out) :: y(is:,js:,:) ! concentrations at time is t
  1481. integer,intent(out) :: status
  1482. !
  1483. ! !INPUT/OUTPUT PARAMETERS:
  1484. !
  1485. real, intent(inout) :: ye(is:,js:,:) ! extra fields (temp, cc, pH)
  1486. #ifdef with_budgets
  1487. real, intent(inout) :: c4(is:,js:,:) ! budget accumulatior
  1488. #endif
  1489. !
  1490. ! !REVISION HISTORY:
  1491. ! ???? - Ad Jeuken (KNMI) and Frank Dentener (IMAU) - v0
  1492. ! Jan 2002 - Maarten Krol (IMAU) - adapted for TM5
  1493. ! Feb 2007 - Elisabetta Vignati (JRC) - adapted for TM5/M7
  1494. ! 22 Mar 2012 - P. Le Sager - adapted for lon-lat MPI domain decomposition
  1495. !
  1496. !EOP
  1497. !------------------------------------------------------------------------
  1498. !BOC
  1499. character(len=*), parameter :: rname = mname//'/Wets'
  1500. integer n,i,j,l,itemp,iter
  1501. real x1,x2,x3,b1,b2,so2x,dh2o2,dso2,disc,dnh3,dn2o5,xso2o3a,xso2o3b,co2
  1502. real,parameter :: rg=0.08314
  1503. real,dimension(:,:),allocatable :: hkso2 ! Henry's constant for sulfur dioxide
  1504. real,dimension(:,:),allocatable :: hkh2o2 ! Henry's constant for hydroperoxide
  1505. real,dimension(:,:),allocatable :: hko3 ! Henry's constant for ozone
  1506. real,dimension(:,:),allocatable :: dkso2 ! Dissociation constant for SO2
  1507. real,dimension(:,:),allocatable :: dkhso3 ! Dissociation constant for HSO3-
  1508. real,dimension(:,:),allocatable :: dkh2o ! dissociation constant water
  1509. real,dimension(:,:),allocatable :: dknh3 ! dissociation constant ammonia
  1510. real,dimension(:,:),allocatable :: hknh3 ! Henry's constant ammonia
  1511. real,dimension(:,:),allocatable :: hkco2 ! Henry's constant CO2
  1512. real,dimension(:,:),allocatable :: dkco2 ! Dissociation constant CO2
  1513. real phs4 ! effective dissolvation of S(IV)
  1514. real phso2 ! effective dissolvation of SO2
  1515. real phh2o2 ! effective dissolvation of H2O2
  1516. real phozone ! effective dissolvation of O3
  1517. real,dimension(:,:),allocatable :: hplus !concentration h+
  1518. real,dimension(:,:),allocatable :: sulph !accumul+coarse mode sulphate
  1519. real a1,a2,a,b,c,z,ft ! help variables
  1520. real xcov,xliq,xl,temp,rt,ztr,h2o,air,press ! meteo
  1521. real,dimension(:,:,:),allocatable :: rw ! reaction rates
  1522. logical,dimension(:,:),allocatable :: cloudy
  1523. integer :: i1, i2, j1, j2
  1524. real :: l_sum_wet
  1525. ! --- begin --------------------------------
  1526. call Get_DistGrid( dgrid(region), I_STRT=i1, I_STOP=i2, J_STRT=j1, J_STOP=j2 )
  1527. ! check arguments ...
  1528. call CheckShape( (/i2-i1+1, j2-j1+1, maxtrace/), shape(y0), status )
  1529. IF_NOTOK_RETURN(status=1)
  1530. call CheckShape( (/i2-i1+1, j2-j1+1, maxtrace/), shape(y ), status )
  1531. IF_NOTOK_RETURN(status=1)
  1532. call CheckShape( (/i2-i1+1, j2-j1+1, n_extra /), shape(ye), status )
  1533. IF_NOTOK_RETURN(status=1)
  1534. #ifdef with_budgets
  1535. call CheckShape( (/i2-i1+1, j2-j1+1, nreacw /), shape(c4), status )
  1536. IF_NOTOK_RETURN(status=1)
  1537. #endif
  1538. allocate(hkso2 (i1:i2, j1:j2))
  1539. allocate(hkh2o2 (i1:i2, j1:j2))
  1540. allocate(hko3 (i1:i2, j1:j2))
  1541. allocate(dkso2 (i1:i2, j1:j2))
  1542. allocate(dkhso3 (i1:i2, j1:j2))
  1543. allocate(dkh2o (i1:i2, j1:j2))
  1544. allocate(dknh3 (i1:i2, j1:j2))
  1545. allocate(hknh3 (i1:i2, j1:j2))
  1546. allocate(hkco2 (i1:i2, j1:j2))
  1547. allocate(dkco2 (i1:i2, j1:j2))
  1548. allocate(hplus (i1:i2, j1:j2))
  1549. allocate(rw (i1:i2, j1:j2, nreacw))
  1550. allocate(cloudy (i1:i2, j1:j2))
  1551. allocate(sulph (i1:i2, j1:j2))
  1552. !-----------------------------
  1553. ! wet phase reactions
  1554. !-----------------------------
  1555. rw =0.0
  1556. hplus=0.0
  1557. if (LCMIP6_CO2) then
  1558. co2=co2_glob
  1559. else
  1560. !
  1561. ! JEW: now scaled to 2000 to account for annual growth of ~2ppbv/yr-1
  1562. !
  1563. co2=3.69e-4 ! was parameter co2=3.75e-4,
  1564. endif
  1565. #if defined (with_budgets)
  1566. l_sum_wet = 0.0
  1567. #endif
  1568. do j = j1, j2
  1569. do i = i1, i2
  1570. cloudy(i,j)=.false.
  1571. ! lwc is dimensionless
  1572. if ((ye(i,j,ilwc) > 1e-10).and.(ye(i,j,icc) > 0.02)) then
  1573. cloudy(i,j)=.true.
  1574. TEMP=ye(i,j,i_temp)
  1575. ZTR=(1./TEMP-1./298)
  1576. RT=TEMP*rg
  1577. ITEMP=nint(TEMP-float(ntlow))
  1578. !
  1579. !CEV sulph is the initial total sulphate content in accumulation+
  1580. !coarse mode, the incloud production is calculated on bulk
  1581. !characteristics, and redistributed on the modes depending on their
  1582. !particle numbers
  1583. #ifdef with_m7
  1584. !Stelios: small contributions from nucleation and Aitken mode
  1585. ! as well as gas-phase should be added for pH calculation
  1586. sulph(i,j)=y0(i,j,iso4acs)+y0(i,j,iso4cos)+&
  1587. y0(i,j,iso4nus)+y0(i,j,iso4ais)+y0(i,j,iso4)
  1588. #else
  1589. sulph(i,j)=y0(i,j,iso4)
  1590. #endif
  1591. !
  1592. ! Henry and dissociation equilibria
  1593. !
  1594. dkh2o(i,j) =1.01e-14*exp(-6706.0 *ztr) !h2o<=>hplus+so3--
  1595. !bug hkco2(i,j) =3.4e-2*(2420.*ztr) ! is already dimensionless
  1596. hkco2(i,j) =3.4e-2*exp(2420.*ztr) ! is already dimensionless
  1597. dkco2(i,j) =4.5E-7*exp(-1000.*ztr) !co2aq<=>hco3- + hplus
  1598. hkso2(i,j) =henry(iso2,itemp)*rt !dimensionless
  1599. dknh3(i,j) =1.8e-5*exp(-450.*ztr) !nh3<=>nh4+ + OH-
  1600. hknh3(i,j) =henry(inh3,itemp)*rt !dimensionless
  1601. hkh2o2(i,j)=henry(ih2o2,itemp)*rt !dimensionless
  1602. hko3(i,j) =henry(io3,itemp)*rt !dimensionless
  1603. dkso2(i,j) =1.7e-2*exp(2090.*ztr) !so2<=>hso3m+hplus
  1604. dkhso3(i,j)=6.6e-8*exp(1510.*ztr) !hso3m<=>so3-- + hplus
  1605. !
  1606. ! calculate H+ from initial sulfate, ammonium, hno3, and nh3
  1607. ! if solution is strongly acidic no further calculations are performed
  1608. !
  1609. xl=ye(i,j,ilwc)*Avog*1e-3/ye(i,j,icc)
  1610. !x1 is initial strong acidity from SO4 and NO3
  1611. !
  1612. !acidity from strong acids alone
  1613. !
  1614. !CMK hplus(i,j)=(2.*y0(i,j,iso4)+y0(i,j,imsa)-y0(i,j,inh4)+ &
  1615. !CMK y0(i,j,ihno3)+y0(i,j,ino3_a))/xl
  1616. hplus(i,j)=(2.*sulph(i,j) + &
  1617. y0(i,j,imsa)-y0(i,j,inh4)+ &
  1618. y0(i,j,ihno3)+y0(i,j,ino3_a))/xl
  1619. end if
  1620. end do
  1621. end do
  1622. do iter=1,10
  1623. do j=j1, j2
  1624. do i=i1, i2
  1625. ! only if solution pH>4.5
  1626. if ( cloudy(i,j) .and. hplus(i,j) < 3e-5 ) then
  1627. xl=ye(i,j,ilwc)*Avog*1e-3/ye(i,j,icc)
  1628. !CEV y0(i,j,iso4)---> sulph(i,j)
  1629. x1=(2.*sulph(i,j)+y0(i,j,imsa)+y0(i,j,ihno3)+ &
  1630. y0(i,j,ino3_a))/xl
  1631. !x2 is initial total NHx
  1632. x2=(y0(i,j,inh3)+y0(i,j,inh4))/xl
  1633. !x3 is combined dissolution and solubility const for CO2
  1634. x3=dkco2(i,j)*hkco2(i,j)*co2
  1635. a1=dkh2o(i,j)/dknh3(i,j)*(1.+1./hknh3(i,j)) ! integration constant
  1636. a2=y0(i,j,iso2)/xl !initial SO2
  1637. ! trap division by zero ...
  1638. if ( hplus(i,j) == 0.0 ) then
  1639. z = 0.0
  1640. else
  1641. z = a2/( hplus(i,j)/dkso2(i,j)*(1.0+1.0/hkso2(i,j)) + dkhso3(i,j)/hplus(i,j) + 1.0 )
  1642. end if
  1643. ! solve quadratic equation for new H+ concentration:
  1644. a=1.+x2/(a1+hplus(i,j))
  1645. b=-x1-z
  1646. c=-x3-2.*dkhso3(i,j)*z
  1647. z=max(0.,(b*b-4.*a*c))
  1648. hplus(i,j)=max(1.e-10,(-b+sqrt(z))/(2.*a))
  1649. end if
  1650. end do !
  1651. end do ! i,j loop
  1652. end do !iter
  1653. do j=j1,j2
  1654. do i=i1,i2
  1655. if (cloudy(i,j)) then
  1656. temp=ye(i,j,i_temp)
  1657. ZTR=(1./TEMP-1./298)
  1658. xliq=ye(i,j,ilwc)/ye(i,j,icc)
  1659. xl=ye(i,j,ilwc)*Avog*1e-3/ye(i,j,icc)
  1660. ye(i,j,iph)=-log10(hplus(i,j)) ! pH for diagnostics
  1661. ! phase factor ratio of aqueous phase to gas phase concentration
  1662. phs4 =hkso2(i,j) *(1.+dkso2(i,j)/hplus(i,j)+ &
  1663. dkso2(i,j)*dkhso3(i,j)/hplus(i,j)/hplus(i,j))*xliq
  1664. phso2 =hkso2(i,j) *xliq
  1665. phh2o2 =hkh2o2(i,j)*xliq
  1666. phozone=hko3(i,j) *xliq
  1667. ! the original rate equations could be partly in look-up table
  1668. rw(i,j,KSO2HP) =8e4*exp(-3560.*ztr)/(0.1+hplus(i,j))
  1669. XSO2O3A=4.39e11*exp(-4131./temp)+2.56e3*exp(-966./temp) !S(IV)
  1670. XSO2O3B=2.56e3*exp(-966./temp)/hplus(i,j)
  1671. !divide by [H+]!S(IV)
  1672. ! make rate constants dimensionless by multiplying
  1673. ! by (1./xliq/avo=6e20)
  1674. ! multiply with the fractions of concentrations residing
  1675. ! in the aqueous phase
  1676. rw(i,j,KSO2HP)=rw(i,j,KSO2HP)/xl*phso2/(1.+phs4)*phh2o2/(1.+phh2o2)
  1677. rw(i,j,KSO2O3)=(XSO2O3A+XSO2O3B)/xl*phs4/(1.+phs4)*phozone/ &
  1678. (1.+phozone)
  1679. end if !cloudy
  1680. end do !
  1681. end do ! I,J, LOOP
  1682. !------------- Start main loop
  1683. do j=j1,j2
  1684. do i=i1,i2
  1685. !
  1686. ! only cloud chemistry if substantial amount of clouds are present
  1687. !
  1688. if (cloudy(i,j)) then
  1689. !
  1690. ! oxidation of S(IV) by O3
  1691. !
  1692. so2x=y0(i,j,iso2)
  1693. xcov=ye(i,j,icc)
  1694. x1=min(100.,rw(i,j,kso2o3)*y0(i,j,io3)*dt)
  1695. dso2=y0(i,j,iso2)*xcov*(exp(-x1)-1.)
  1696. !only applied to xcov part of cloud
  1697. !CMK print *, i,j, xcov, x1, y0(i,j,iso2), dso2
  1698. dso2=max(-y0(i,j,io3)*xcov,dso2)! limit to o3 availability
  1699. !CEV y(i,j,iso2)=y0(i,j,iso2)+dso2
  1700. !NOTE CMK: parallel MPI should take care here!
  1701. #ifdef with_m7
  1702. ft = y0(i,j,iacs_n) + y0(i,j,icos_n)
  1703. if (ft > tiny(ft)) then
  1704. y(i,j,iso4acs)=y0(i,j,iso4acs)-dso2*(y0(i,j,iacs_n)/ft)
  1705. y(i,j,iso4cos)=y0(i,j,iso4cos)-dso2*(y0(i,j,icos_n)/ft)
  1706. y(i,j,iso2)=y0(i,j,iso2)+dso2
  1707. y(i,j,io3)=y0(i,j,io3)+dso2
  1708. !AERHEMMIP
  1709. ! Production of liquid phase so4
  1710. ! D_prod_liq(i,j)=-dso2
  1711. #ifdef with_budgets
  1712. c4(i,j,1)=c4(i,j,1)+dso2
  1713. !conversion 1e-3 g->kg 1e6 cm-3 ->1m-3
  1714. diag_prod(region)%prod(i,j,level,2)=diag_prod(region)%prod(i,j,level,2)-dso2/y(i,j,iair)*ye(i,j,iairm)/xmair*xmso4
  1715. AC_diag_prod(region)%prod(i,j,level,2)=AC_diag_prod(region)%prod(i,j,level,2)-dso2/y(i,j,iair)*ye(i,j,iairm)/xmair*xmso4
  1716. #endif
  1717. else
  1718. #ifdef with_budgets
  1719. diag_prod(region)%prod(i,j,level,2)=diag_prod(region)%prod(i,j,level,2)+0.0
  1720. AC_diag_prod(region)%prod(i,j,level,2)=AC_diag_prod(region)%prod(i,j,level,2)+0.0
  1721. #endif
  1722. !CEV y(i,j,iso4)=y0(i,j,iso4)-dso2
  1723. y(i,j,iso4acs)=y0(i,j,iso4acs)
  1724. y(i,j,iso4cos)=y0(i,j,iso4cos)
  1725. y(i,j,iso2)=y0(i,j,iso2)
  1726. y(i,j,io3)=y0(i,j,io3)
  1727. endif
  1728. !CEV y(i,j,io3)=y0(i,j,io3)+dso2
  1729. #else
  1730. ! gas phase chemistry: ft = 0.
  1731. y(i,j,iso4)=y0(i,j,iso4)-dso2
  1732. y(i,j,iso2)=y0(i,j,iso2)+dso2
  1733. y(i,j,io3)=y0(i,j,io3)+dso2
  1734. #ifdef with_budgets
  1735. c4(i,j,1)=c4(i,j,1)+dso2
  1736. #endif
  1737. #endif
  1738. #ifdef with_budgets
  1739. if ( io3 == 1 ) l_sum_wet = l_sum_wet- &
  1740. dso2 *ye(i,j,iairm)/ (fscale(1)*y(i,j,iair))
  1741. if ( iso2 == 1 ) l_sum_wet = l_sum_wet+ &
  1742. dso2 *ye(i,j,iairm)/ (fscale(1)*y(i,j,iair))
  1743. if ( iso4 == 1 ) l_sum_wet = l_sum_wet- &
  1744. dso2 *ye(i,j,iairm)/ (fscale(1)*y(i,j,iair))
  1745. !CEV c4(i,j,1)=c4(i,j,1)+dso2
  1746. #endif
  1747. xliq=ye(i,j,ilwc)/ye(i,j,icc)
  1748. !
  1749. ! oxidation of S(IV) by H2O2
  1750. !
  1751. !*** here we explicitly solve the dv:
  1752. ! y'=P-Q*y-R*y*y (P and Q are 0=>b3=0.)
  1753. !
  1754. so2x=y(i,j,iso2)
  1755. if ( so2x > tiny(so2x) ) then
  1756. b1=rw(i,j,kso2hp)
  1757. b2=b1*(y0(i,j,ih2o2)-so2x)
  1758. disc=min(100.,sqrt(b2*b2)) ! disc is b2 for b3=0.0
  1759. x1=(b2-disc)/(-2.*b1) ! in this case x1 =0.
  1760. x2=(b2+disc)/(-2.*b1)
  1761. x3=(so2x-x1)/(so2x-x2)*exp(-disc*dt)
  1762. so2x=(x1-x2*x3)/(1.-x3)
  1763. dso2=(so2x-y(i,j,iso2))*xcov
  1764. dso2=max(dso2,-y0(i,j,ih2o2)*xcov)
  1765. !CEV y(i,j,iso2) =y(i,j,iso2)+dso2 ! dso2 is loss of SO2 and H2O2
  1766. ! divide produced SO4 over CO/ACC
  1767. #ifdef with_m7
  1768. ft = y0(i,j,iacs_n) + y0(i,j,icos_n)
  1769. if (ft > tiny(ft)) then
  1770. y(i,j,iso4acs)=y(i,j,iso4acs)-dso2*(y0(i,j,iacs_n)/ft)
  1771. y(i,j,iso4cos)=y(i,j,iso4cos)-dso2*(y0(i,j,icos_n)/ft)
  1772. y(i,j,iso2)=y(i,j,iso2)+dso2
  1773. y(i,j,ih2o2)=y0(i,j,ih2o2)+dso2
  1774. #ifdef with_budgets
  1775. c4(i,j,2)=c4(i,j,2)+dso2
  1776. ! add amount liquid so4 production to diagnostic and change to molec->mass kg
  1777. !
  1778. diag_prod(region)%prod(i,j,level,2)=diag_prod(region)%prod(i,j,level,2)-dso2/y(i,j,iair)*ye(i,j,iairm)/xmair*xmso4
  1779. AC_diag_prod(region)%prod(i,j,level,2)=AC_diag_prod(region)%prod(i,j,level,2)-dso2/y(i,j,iair)*ye(i,j,iairm)/xmair*xmso4
  1780. !*1e6*1e-3/avog*xmso4
  1781. #endif
  1782. else
  1783. #ifdef with_budgets
  1784. diag_prod(region)%prod(i,j,level,2)=diag_prod(region)%prod(i,j,level,2)+0.0
  1785. AC_diag_prod(region)%prod(i,j,level,2)=AC_diag_prod(region)%prod(i,j,level,2)+0.0
  1786. !*1e6*1e-3/avog*xmso4
  1787. #endif
  1788. y(i,j,ih2o2) =y0(i,j,ih2o2)
  1789. endif
  1790. #else
  1791. ! gas - phase chemistry
  1792. y(i,j,iso4)=y(i,j,iso4)-dso2
  1793. y(i,j,iso2)=y(i,j,iso2)+dso2
  1794. y(i,j,ih2o2)=y0(i,j,ih2o2)+dso2
  1795. #ifdef with_budgets
  1796. c4(i,j,2)=c4(i,j,2)+dso2
  1797. #endif
  1798. #endif
  1799. #ifdef with_budgets
  1800. if ( ih2o2 == 1 ) l_sum_wet = l_sum_wet- &
  1801. dso2 *ye(i,j,iairm)/ (fscale(1)*y(i,j,iair))
  1802. if ( iso2 == 1 ) l_sum_wet = l_sum_wet- &
  1803. dso2 *ye(i,j,iairm)/ (fscale(1)*y(i,j,iair))
  1804. if ( iso4 == 1 ) l_sum_wet = l_sum_wet+ &
  1805. dso2 *ye(i,j,iairm)/ (fscale(1)*y(i,j,iair))
  1806. !CEV c4(i,j,2)=c4(i,j,2)+dso2
  1807. #endif
  1808. end if
  1809. !
  1810. ! NH3 uptake in cloud droplets is limited by SO4 availability
  1811. ! no HNO3 is considered at this point
  1812. ! assume instantaneous uptake of NH3 incloud only in cloudy part
  1813. !
  1814. ! EQSAM gives hell to any NH3/NH4 interchange. It first drops both in one heap
  1815. ! and then redistributes. So this cloud chemistry reaction does not matter.
  1816. end if !cloudy
  1817. end do ! i,j,loop
  1818. end do !
  1819. #ifdef with_budgets
  1820. sum_wetchem(region) = sum_wetchem(region) + l_sum_wet
  1821. #endif
  1822. !free memory
  1823. deallocate(hkso2 )
  1824. deallocate(hkh2o2 )
  1825. deallocate(hko3 )
  1826. deallocate(dkso2 )
  1827. deallocate(dkhso3 )
  1828. deallocate(dkh2o )
  1829. deallocate(dknh3 )
  1830. deallocate(hknh3 )
  1831. deallocate(hkco2 )
  1832. deallocate(dkco2 )
  1833. deallocate(hplus )
  1834. deallocate(rw )
  1835. deallocate(cloudy )
  1836. deallocate(sulph )
  1837. status = 0
  1838. end subroutine WETS
  1839. !EOC
  1840. !--------------------------------------------------------------------------
  1841. ! TM5 !
  1842. !--------------------------------------------------------------------------
  1843. !BOP
  1844. !
  1845. ! !IROUTINE: MARK_TRAC
  1846. !
  1847. ! !DESCRIPTION: calculate nox/pan/orgn/hno3 analogous to ebi scheme
  1848. ! ozone production from marked nox
  1849. ! simple nhx chemistry, scaled to real nhx
  1850. !\\
  1851. !\\
  1852. ! !INTERFACE:
  1853. !
  1854. subroutine MARK_TRAC( region, level, is, js, y, rr, rj, dt, ye)
  1855. !
  1856. ! !USES:
  1857. !
  1858. use chem_param
  1859. use Dims, only : CheckShape
  1860. use global_data, only : region_dat
  1861. use dims, only : at, bt, im, jm
  1862. #ifdef with_budgets
  1863. use budget_global, only : budg_dat, nzon_vg
  1864. #endif
  1865. !
  1866. ! !INPUT PARAMETERS:
  1867. !
  1868. integer, intent(in) :: region, level, is, js
  1869. real :: dt ! time step
  1870. !
  1871. ! !INPUT/OUTPUT PARAMETERS:
  1872. !
  1873. real, intent(inout):: y (is:,js:,:) ! concentrations
  1874. real, intent(in) :: rr(is:,js:,:) ! reaction rates
  1875. real, intent(in) :: rj(is:,js:,:) ! photolysis rates
  1876. real, intent(in) :: ye(is:,js:,:) ! help fields ( air masses )
  1877. !
  1878. ! !REVISION HISTORY:
  1879. ! Jan 1999 - fjd
  1880. ! Jan 2002 - MK - adapted for TM5
  1881. ! 22 Mar 2012 - P. Le Sager - adapted for lon-lat MPI domain decomposition
  1882. !
  1883. !EOP
  1884. !------------------------------------------------------------------------
  1885. !BOC
  1886. integer :: status, i1, i2, j1, j2
  1887. ! --- begin --------------------------------
  1888. call Get_DistGrid( dgrid(region), I_STRT=i1, I_STOP=i2, J_STRT=j1, J_STOP=j2 )
  1889. ! check arguments ...
  1890. call CheckShape( (/i2-i1+1, j2-j1+1, maxtrace/), shape(y ), status )
  1891. call CheckShape( (/i2-i1+1, j2-j1+1, nreac /), shape(rr), status )
  1892. call CheckShape( (/i2-i1+1, j2-j1+1, nj /), shape(rj), status )
  1893. call CheckShape( (/i2-i1+1, j2-j1+1, n_extra /), shape(ye), status )
  1894. call MARK_O3S
  1895. !
  1896. ! more marked tracers possible here
  1897. !
  1898. contains
  1899. subroutine mark_o3s
  1900. !---------------------------------------------------
  1901. ! marked tracer O3S stratospheric ozone
  1902. !---------------------------------------------------
  1903. #ifndef without_dry_deposition
  1904. use dry_deposition, only: vd
  1905. #endif
  1906. integer :: i, j, nzone, nzone_v
  1907. real :: p3, xl3, o3old
  1908. do j = j1, j2
  1909. do i = i1, i2
  1910. if (at(level+1)+bt(level+1)*1e5<= 14000) then !
  1911. ! well, you want to count all layers below 140 hPa
  1912. ! (given surface pressure of 1e5 Pa)
  1913. ! in the current model setup (25 layers) this means
  1914. ! 12077 + 1e5*0.00181 = 12258 Pa and above...
  1915. ! p3: production of o3 in stratosphere
  1916. P3 = rj(i,j,jano3)*y(i,j,ino3)+ &
  1917. rj(i,j,jno2)*y(i,j,ino2)
  1918. XL3= rr(i,j,ko3ho2)*y(i,j,iho2)+&
  1919. rr(i,j,ko3oh)*y(i,j,ioh)+ &
  1920. rr(i,j,kno2o3)*y(i,j,ino2)+&
  1921. rj(i,j,jo3d)+&
  1922. rr(i,j,knoo3)*y(i,j,ino)+&
  1923. rr(i,j,kc62)*y(i,j,ieth)+&
  1924. rr(i,j,kc58)*y(i,j,iole)+&
  1925. rr(i,j,kc77)*y(i,j,iisop)+&
  1926. rr(i,j,ko3c3h6)*y(i,j,ic3h6)+&
  1927. rr(i,j,ko3terp)*y(i,j,iterp)+&
  1928. rr(i,j,ko3ispd)*y(i,j,iispd)
  1929. else
  1930. !
  1931. ! these are only the net destruction reactions
  1932. !
  1933. P3 = 0.
  1934. XL3= rr(i,j,ko3ho2)*y(i,j,iho2)+&
  1935. rr(i,j,ko3oh)*y(i,j,ioh)+&
  1936. rj(i,j,jo3d)+&
  1937. rr(i,j,kc62)*y(i,j,ieth)+&
  1938. rr(i,j,kc58)*y(i,j,iole)+&
  1939. rr(i,j,kc77)*y(i,j,iisop)+&
  1940. rr(i,j,ko3c3h6)*y(i,j,ic3h6)+&
  1941. rr(i,j,ko3terp)*y(i,j,iterp)+&
  1942. rr(i,j,ko3ispd)*y(i,j,iispd)+&
  1943. rr(i,j,knh2o3)*y(i,j,inh2)+&
  1944. rr(i,j,knh2o2o3)*y(i,j,inh2o2)
  1945. ! add up deposition....
  1946. #ifndef without_dry_deposition
  1947. if ( level == 1 ) &
  1948. XL3 = XL3 + vd(region,io3)%surf(i,j)/ye(i,j,idz)
  1949. #endif
  1950. end if
  1951. o3old=y(i,j,io3s)
  1952. y(i,j,io3s)=(o3old+p3*dt)/(1.+xl3*dt)
  1953. #ifdef with_budgets
  1954. nzone=budg_dat(region)%nzong(i,j) ! global budget
  1955. nzone_v=nzon_vg(level)
  1956. budmarkg(nzone,nzone_v,1)=budmarkg(nzone,nzone_v,1)+ &
  1957. (y(i,j,io3s)-o3old)*ye(i,j,iairm)*1000./xmair/y(i,j,iair)
  1958. #endif
  1959. end do
  1960. end do !i,j
  1961. end subroutine MARK_O3S
  1962. end subroutine MARK_TRAC
  1963. !EOC
  1964. end module EBISCHEME