1 !**************************************************************************
2 ! This computer software was prepared by Battelle Memorial Institute, hereinafter
3 ! the Contractor, under Contract No. DE-AC05-76RL0 1830 with the Department of
4 ! Energy (DOE). NEITHER THE GOVERNMENT NOR THE CONTRACTOR MAKES ANY WARRANTY,
5 ! EXPRESS OR IMPLIED, OR ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE.
7 ! CBMZ module: see module_cbmz.F for references and terms of use
8 !**********************************************************************************
10 MODULE module_cbmz_addemiss
11 !WRF:MODEL_LAYER:CHEMICS
15 integer, parameter :: cbmz_addemiss_masscheck = -1
16 ! only do emissions masscheck calcs when this is positive
24 !----------------------------------------------------------------------
25 subroutine cbmz_addemiss_anthro( id, dtstep, dz8w, config_flags, &
26 rho_phy, chem,emis_ant,alt, &
27 ids,ide, jds,jde, kds,kde, &
28 ims,ime, jms,jme, kms,kme, &
29 its,ite, jts,jte, kts,kte )
31 ! adds emissions for cbmz trace gas species
32 ! (i.e., emissions tendencies over time dtstep are applied
33 ! to the trace gas concentrations)
37 USE module_state_description
42 TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
44 INTEGER, INTENT(IN ) :: id, &
45 ids,ide, jds,jde, kds,kde, &
46 ims,ime, jms,jme, kms,kme, &
47 its,ite, jts,jte, kts,kte
49 REAL, INTENT(IN ) :: dtstep
51 ! trace species mixing ratios (gases=ppm)
52 REAL, DIMENSION( ims:ime, kms:kme, jms:jme, num_chem ), &
53 INTENT(INOUT ) :: chem
55 ! emissions arrays (v.1: ppm m/min; v.2: mole km^-2 hr^-1)
57 ! REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
58 REAL, DIMENSION( ims:ime, kms:config_flags%kemit, jms:jme,num_emis_ant),&
62 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , &
63 INTENT(IN ) :: dz8w, rho_phy,alt
67 real, parameter :: efact1 = 1.0/60.0
69 double precision :: chem_sum(num_chem)
72 ! do mass check initial calc
73 if (cbmz_addemiss_masscheck > 0) call addemiss_masscheck( &
74 id, config_flags, 1, 'cbmz_addemiss', &
75 dtstep, efact1, dz8w, chem, chem_sum, &
76 ids,ide, jds,jde, kds,kde, &
77 ims,ime, jms,jme, kms,kme, &
78 its,ite, jts,jte, kts,kte, &
80 emis_ant(ims,kms,jms,p_e_so2),emis_ant(ims,kms,jms,p_e_no), &
81 emis_ant(ims,kms,jms,p_e_co),emis_ant(ims,kms,jms,p_e_eth), &
82 emis_ant(ims,kms,jms,p_e_hc3),emis_ant(ims,kms,jms,p_e_hc5), &
83 emis_ant(ims,kms,jms,p_e_hc8),emis_ant(ims,kms,jms,p_e_xyl), &
84 emis_ant(ims,kms,jms,p_e_ol2),emis_ant(ims,kms,jms,p_e_olt), &
85 emis_ant(ims,kms,jms,p_e_oli),emis_ant(ims,kms,jms,p_e_tol), &
86 emis_ant(ims,kms,jms,p_e_csl),emis_ant(ims,kms,jms,p_e_hcho), &
87 emis_ant(ims,kms,jms,p_e_ald),emis_ant(ims,kms,jms,p_e_ket), &
88 emis_ant(ims,kms,jms,p_e_ora2),emis_ant(ims,kms,jms,p_e_nh3), &
89 emis_ant(ims,kms,jms,p_e_no2),emis_ant(ims,kms,jms,p_e_ch3oh), &
90 emis_ant(ims,kms,jms,p_e_c2h5oh))
100 DO k=kts,min(config_flags%kemit,kte)
101 !v1 units: conv = dtstep/(dz8w(i,k,j)*60.)
103 conv = 4.828e-4/rho_phy(i,k,j)*dtstep/(dz8w(i,k,j)*60.)
104 conv3 = (dtstep/dz8w(i,k,j))*alt(i,k,j)*28/250*1e-3
106 #if (defined(CHEM_DBG_I) && defined(CHEM_DBG_J) && defined(CHEM_DBG_K))
107 if( (i <= CHEM_DBG_I .and. i >= CHEM_DBG_I) .and. &
108 (j <= CHEM_DBG_J .and. j >= CHEM_DBG_J) .and. &
109 (k <= CHEM_DBG_K .and. k >= CHEM_DBG_K) ) then
111 print*,"Converted emissions for CBMZ:"
112 print*,"e_csl=",emis_ant(i,k,j,p_e_csl)*conv
113 print*,"e_so2=",emis_ant(i,k,j,p_e_so2)*conv
114 print*,"e_no=",emis_ant(i,k,j,p_e_no)*conv
115 print*,"e_ald=",emis_ant(i,k,j,p_e_ald)*conv
116 print*,"e_hcho=",emis_ant(i,k,j,p_e_hcho)*conv
117 print*,"e_ora2=",emis_ant(i,k,j,p_e_ora2)*conv
118 print*,"e_nh3=",emis_ant(i,k,j,p_e_nh3)*conv
119 print*,"e_hc3=",emis_ant(i,k,j,p_e_hc3)*conv
120 print*,"e_hc5=",emis_ant(i,k,j,p_e_hc5)*conv
121 print*,"e_hc8=",emis_ant(i,k,j,p_e_hc8)*conv
122 print*,"e_eth=",emis_ant(i,k,j,p_e_eth)*conv
123 print*,"e_co=",emis_ant(i,k,j,p_e_co)*conv
124 print*,"e_ol2=",emis_ant(i,k,j,p_e_ol2)*conv
125 print*,"e_olt=",emis_ant(i,k,j,p_e_olt)*conv
126 print*,"e_oli=",emis_ant(i,k,j,p_e_oli)*conv
127 print*,"e_tol=",emis_ant(i,k,j,p_e_tol)*conv
128 print*,"e_xyl=",emis_ant(i,k,j,p_e_xyl)*conv
129 print*,"e_ket=",emis_ant(i,k,j,p_e_ket)*conv
133 chem(i,k,j,p_csl) = chem(i,k,j,p_csl) &
134 +emis_ant(i,k,j,p_e_csl)*conv
135 chem(i,k,j,p_so2) = chem(i,k,j,p_so2) &
136 +emis_ant(i,k,j,p_e_so2)*conv
137 chem(i,k,j,p_no) = chem(i,k,j,p_no) &
138 +emis_ant(i,k,j,p_e_no)*conv
139 chem(i,k,j,p_ald) = chem(i,k,j,p_ald) &
140 +emis_ant(i,k,j,p_e_ald)*conv
141 chem(i,k,j,p_hcho) = chem(i,k,j,p_hcho) &
142 +emis_ant(i,k,j,p_e_hcho)*conv
143 chem(i,k,j,p_ora2) = chem(i,k,j,p_ora2) &
144 +emis_ant(i,k,j,p_e_ora2)*conv
145 chem(i,k,j,p_nh3) = chem(i,k,j,p_nh3) &
146 +emis_ant(i,k,j,p_e_nh3)*conv
147 chem(i,k,j,p_eth) = chem(i,k,j,p_eth) &
148 +emis_ant(i,k,j,p_e_eth)*conv
149 chem(i,k,j,p_co) = chem(i,k,j,p_co) &
150 +emis_ant(i,k,j,p_e_co)*conv
151 chem(i,k,j,p_ol2) = chem(i,k,j,p_ol2) &
152 +emis_ant(i,k,j,p_e_ol2)*conv
153 chem(i,k,j,p_olt) = chem(i,k,j,p_olt) &
154 +emis_ant(i,k,j,p_e_olt)*conv
155 chem(i,k,j,p_oli) = chem(i,k,j,p_oli) &
156 +emis_ant(i,k,j,p_e_oli)*conv
157 chem(i,k,j,p_tol) = chem(i,k,j,p_tol) &
158 +emis_ant(i,k,j,p_e_tol)*conv
159 chem(i,k,j,p_xyl) = chem(i,k,j,p_xyl) &
160 +emis_ant(i,k,j,p_e_xyl)*conv
161 chem(i,k,j,p_ket) = chem(i,k,j,p_ket) &
162 +emis_ant(i,k,j,p_e_ket)*conv
164 chem_select_2 : SELECT CASE( config_flags%chem_opt )
166 END SELECT chem_select_2
171 ! when emissions input file is "radm2sorg" variety, calc par emissions as a
172 ! combination of the anthropogenic emissions for radm2 primary voc species
173 if ( (config_flags%emiss_inpt_opt == EMISS_INPT_DEFAULT) .or. &
174 (config_flags%emiss_inpt_opt == EMISS_INPT_PNNL_RS) ) then
175 chem(i,k,j,p_par) = chem(i,k,j,p_par) &
177 ( 0.4*emis_ant(i,k,j,p_e_ald) + 2.9*emis_ant(i,k,j,p_e_hc3) &
178 + 4.8*emis_ant(i,k,j,p_e_hc5) + 7.9*emis_ant(i,k,j,p_e_hc8) &
179 + 0.9*emis_ant(i,k,j,p_e_ket) + 2.8*emis_ant(i,k,j,p_e_oli) &
180 + 1.8*emis_ant(i,k,j,p_e_olt) + 1.0*emis_ant(i,k,j,p_e_ora2) )
182 ! when emissions input file is "cbmzmosaic" variety,
183 ! the par emissions are read into e_hc5
184 ! and there are emissions for other species
186 chem(i,k,j,p_par) = chem(i,k,j,p_par) &
187 + conv*emis_ant(i,k,j,p_e_hc5)
189 chem(i,k,j,p_no2) = chem(i,k,j,p_no2) &
190 + conv*emis_ant(i,k,j,p_e_no2)
191 chem(i,k,j,p_ch3oh) = chem(i,k,j,p_ch3oh) &
192 + conv*emis_ant(i,k,j,p_e_ch3oh)
193 chem(i,k,j,p_c2h5oh) = chem(i,k,j,p_c2h5oh) &
194 + conv*emis_ant(i,k,j,p_e_c2h5oh)
197 !BSINGH(01/24/2013): Added for DMS emissions
198 !PMA DMS emission [added by BSINGH - 01/20/2014]
199 if ( (config_flags%emiss_inpt_opt == EMISS_INPT_PNNL_MAM)) then
200 chem(i,k,j,p_dms) = chem(i,k,j,p_dms) &
201 + conv*emis_ant(i,k,j,p_e_dms)
208 ! do mass check final calc
209 if (cbmz_addemiss_masscheck > 0) call addemiss_masscheck( &
210 id, config_flags, 2, 'cbmz_addemiss', &
211 dtstep, efact1, dz8w, chem, chem_sum, &
212 ids,ide, jds,jde, kds,kde, &
213 ims,ime, jms,jme, kms,kme, &
214 its,ite, jts,jte, kts,kte, &
216 emis_ant(ims,kms,jms,p_e_so2),emis_ant(ims,kms,jms,p_e_no), &
217 emis_ant(ims,kms,jms,p_e_co),emis_ant(ims,kms,jms,p_e_eth), &
218 emis_ant(ims,kms,jms,p_e_hc3),emis_ant(ims,kms,jms,p_e_hc5), &
219 emis_ant(ims,kms,jms,p_e_hc8),emis_ant(ims,kms,jms,p_e_xyl), &
220 emis_ant(ims,kms,jms,p_e_ol2),emis_ant(ims,kms,jms,p_e_olt), &
221 emis_ant(ims,kms,jms,p_e_oli),emis_ant(ims,kms,jms,p_e_tol), &
222 emis_ant(ims,kms,jms,p_e_csl),emis_ant(ims,kms,jms,p_e_hcho), &
223 emis_ant(ims,kms,jms,p_e_ald),emis_ant(ims,kms,jms,p_e_ket), &
224 emis_ant(ims,kms,jms,p_e_ora2),emis_ant(ims,kms,jms,p_e_nh3), &
225 emis_ant(ims,kms,jms,p_e_no2),emis_ant(ims,kms,jms,p_e_ch3oh), &
226 emis_ant(ims,kms,jms,p_e_c2h5oh))
229 END subroutine cbmz_addemiss_anthro
233 !----------------------------------------------------------------------
234 subroutine cbmz_addemiss_bio( id, dtstep, dz8w, config_flags, &
235 rho_phy, chem, e_bio, ne_area, e_iso, &
236 ids,ide, jds,jde, kds,kde, &
237 ims,ime, jms,jme, kms,kme, &
238 its,ite, jts,jte, kts,kte )
241 USE module_state_description
242 USE module_data_radm2
243 USE module_aerosols_sorgam
248 TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
250 INTEGER, INTENT(IN ) :: id, ne_area, &
251 ids,ide, jds,jde, kds,kde, &
252 ims,ime, jms,jme, kms,kme, &
253 its,ite, jts,jte, kts,kte
255 REAL, INTENT(IN ) :: dtstep
257 REAL, DIMENSION( ims:ime, kms:kme, jms:jme, num_chem ), &
258 INTENT(INOUT ) :: chem
260 REAL, DIMENSION( ims:ime, jms:jme,ne_area ), &
263 REAL, DIMENSION( ims:ime, kms:config_flags%kemit, jms:jme ), &
266 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , &
267 INTENT(IN ) :: dz8w, rho_phy
272 real, parameter :: efact1 = 1.0/60.0
273 double precision :: chem_sum(num_chem)
277 ! apply gunther online biogenic gas emissions when bio_emiss_opt == GUNTHER1
279 if (config_flags%bio_emiss_opt == GUNTHER1) then
281 if (cbmz_addemiss_masscheck > 0) call addemiss_masscheck( &
282 id, config_flags, 1, 'cbmz_addemiss_bioaa', &
283 dtstep, efact1, dz8w, chem, chem_sum, &
284 ids,ide, jds,jde, kds,kde, &
285 ims,ime, jms,jme, kms,kme, &
286 its,ite, jts,jte, kts,kte, &
288 e_bio(ims,jms,lald), e_bio(ims,jms,lhc3), &
289 e_bio(ims,jms,lhc5), e_bio(ims,jms,lhc8), &
290 e_bio(ims,jms,lhcho), e_bio(ims,jms,liso), &
291 e_bio(ims,jms,lket), e_bio(ims,jms,lno), &
292 e_bio(ims,jms,loli), e_bio(ims,jms,lolt), &
293 e_bio(ims,jms,lora1), e_bio(ims,jms,lora2), &
294 e_bio(ims,jms,lxyl), &
295 e_bio(ims,jms,lxyl), e_bio(ims,jms,lxyl), &
296 e_bio(ims,jms,lxyl), e_bio(ims,jms,lxyl), &
297 e_bio(ims,jms,lxyl), e_bio(ims,jms,lxyl), &
298 e_bio(ims,jms,lxyl), e_bio(ims,jms,lxyl) )
302 chem(i,kts,j,p_so2) = chem(i,kts,j,p_so2) &
303 + e_bio(i,j,lso2)/(dz8w(i,kts,j)*60.)*dtstep
304 chem(i,kts,j,p_sulf) = chem(i,kts,j,p_sulf) &
305 + e_bio(i,j,lsulf)/(dz8w(i,kts,j)*60.)*dtstep
306 chem(i,kts,j,p_no2) = chem(i,kts,j,p_no2) &
307 + e_bio(i,j,lno2)/(dz8w(i,kts,j)*60.)*dtstep
308 chem(i,kts,j,p_no) = chem(i,kts,j,p_no) &
309 + e_bio(i,j,lno)/(dz8w(i,kts,j)*60.)*dtstep
310 chem(i,kts,j,p_o3) = chem(i,kts,j,p_o3) &
311 + e_bio(i,j,lo3)/(dz8w(i,kts,j)*60.)*dtstep
312 chem(i,kts,j,p_hno3) = chem(i,kts,j,p_hno3) &
313 + e_bio(i,j,lhno3)/(dz8w(i,kts,j)*60.)*dtstep
314 chem(i,kts,j,p_h2o2) = chem(i,kts,j,p_h2o2) &
315 + e_bio(i,j,lh2o2)/(dz8w(i,kts,j)*60.)*dtstep
316 chem(i,kts,j,p_ald) = chem(i,kts,j,p_ald) &
317 + e_bio(i,j,lald)/(dz8w(i,kts,j)*60.)*dtstep
318 chem(i,kts,j,p_hcho) = chem(i,kts,j,p_hcho) &
319 + e_bio(i,j,lhcho)/(dz8w(i,kts,j)*60.)*dtstep
320 chem(i,kts,j,p_op1) = chem(i,kts,j,p_op1) &
321 + e_bio(i,j,lop1)/(dz8w(i,kts,j)*60.)*dtstep
322 chem(i,kts,j,p_op2) = chem(i,kts,j,p_op2) &
323 + e_bio(i,j,lop2)/(dz8w(i,kts,j)*60.)*dtstep
324 chem(i,kts,j,p_ora1) = chem(i,kts,j,p_ora1) &
325 + e_bio(i,j,lora1)/(dz8w(i,kts,j)*60.)*dtstep
326 chem(i,kts,j,p_ora2) = chem(i,kts,j,p_ora2) &
327 + e_bio(i,j,lora2)/(dz8w(i,kts,j)*60.)*dtstep
328 chem(i,kts,j,p_nh3) = chem(i,kts,j,p_nh3) &
329 + e_bio(i,j,lnh3)/(dz8w(i,kts,j)*60.)*dtstep
330 chem(i,kts,j,p_n2o5) = chem(i,kts,j,p_n2o5) &
331 + e_bio(i,j,ln2o5)/(dz8w(i,kts,j)*60.)*dtstep
332 chem(i,kts,j,p_no2) = chem(i,kts,j,p_no2) &
333 + e_bio(i,j,lno2)/(dz8w(i,kts,j)*60.)*dtstep
334 chem(i,kts,j,p_pan) = chem(i,kts,j,p_pan) &
335 + e_bio(i,j,lpan)/(dz8w(i,kts,j)*60.)*dtstep
336 chem(i,kts,j,p_eth) = chem(i,kts,j,p_eth) &
337 + e_bio(i,j,leth)/(dz8w(i,kts,j)*60.)*dtstep
338 chem(i,kts,j,p_co) = chem(i,kts,j,p_co) &
339 + e_bio(i,j,lco)/(dz8w(i,kts,j)*60.)*dtstep
340 chem(i,kts,j,p_ol2) = chem(i,kts,j,p_ol2) &
341 + e_bio(i,j,lol2)/(dz8w(i,kts,j)*60.)*dtstep
342 chem(i,kts,j,p_olt) = chem(i,kts,j,p_olt) &
343 + e_bio(i,j,lolt)/(dz8w(i,kts,j)*60.)*dtstep
344 chem(i,kts,j,p_oli) = chem(i,kts,j,p_oli) &
345 + e_bio(i,j,loli)/(dz8w(i,kts,j)*60.)*dtstep
346 chem(i,kts,j,p_tol) = chem(i,kts,j,p_tol) &
347 + e_bio(i,j,ltol)/(dz8w(i,kts,j)*60.)*dtstep
348 chem(i,kts,j,p_xyl) = chem(i,kts,j,p_xyl) &
349 + e_bio(i,j,lxyl)/(dz8w(i,kts,j)*60.)*dtstep
350 chem(i,kts,j,p_hono) = chem(i,kts,j,p_hono) &
351 + e_bio(i,j,lhono)/(dz8w(i,kts,j)*60.)*dtstep
352 chem(i,kts,j,p_hno4) = chem(i,kts,j,p_hno4) &
353 + e_bio(i,j,lhno4)/(dz8w(i,kts,j)*60.)*dtstep
354 chem(i,kts,j,p_ket) = chem(i,kts,j,p_ket) &
355 + e_bio(i,j,lket)/(dz8w(i,kts,j)*60.)*dtstep
356 chem(i,kts,j,p_mgly) = chem(i,kts,j,p_mgly) &
357 + e_bio(i,j,lmgly)/(dz8w(i,kts,j)*60.)*dtstep
358 chem(i,kts,j,p_onit) = chem(i,kts,j,p_onit) &
359 + e_bio(i,j,lonit)/(dz8w(i,kts,j)*60.)*dtstep
360 chem(i,kts,j,p_csl) = chem(i,kts,j,p_csl) &
361 + e_bio(i,j,lcsl)/(dz8w(i,kts,j)*60.)*dtstep
362 chem(i,kts,j,p_iso) = chem(i,kts,j,p_iso) &
363 + e_bio(i,j,liso)/(dz8w(i,kts,j)*60.)*dtstep
367 ! calc par emissions as a combination of the biogenic emissions
368 ! for radm2 primary voc species
371 chem(i,kts,j,p_par) = chem(i,kts,j,p_par) &
372 + (dtstep/(dz8w(i,kts,j)*60.))* &
373 ( 0.4*e_bio(i,j,lald) + 2.9*e_bio(i,j,lhc3) &
374 + 4.8*e_bio(i,j,lhc5) + 7.9*e_bio(i,j,lhc8) &
375 + 0.9*e_bio(i,j,lket) + 2.8*e_bio(i,j,loli) &
376 + 1.8*e_bio(i,j,lolt) + 1.0*e_bio(i,j,lora2) )
380 if (cbmz_addemiss_masscheck > 0) call addemiss_masscheck( &
381 id, config_flags, 2, 'cbmz_addemiss_bioaa', &
382 dtstep, efact1, dz8w, chem, chem_sum, &
383 ids,ide, jds,jde, kds,kde, &
384 ims,ime, jms,jme, kms,kme, &
385 its,ite, jts,jte, kts,kte, &
387 e_bio(ims,jms,lald), e_bio(ims,jms,lhc3), &
388 e_bio(ims,jms,lhc5), e_bio(ims,jms,lhc8), &
389 e_bio(ims,jms,lhcho), e_bio(ims,jms,liso), &
390 e_bio(ims,jms,lket), e_bio(ims,jms,lno), &
391 e_bio(ims,jms,loli), e_bio(ims,jms,lolt), &
392 e_bio(ims,jms,lora1), e_bio(ims,jms,lora2), &
393 e_bio(ims,jms,lxyl), &
394 e_bio(ims,jms,lxyl), e_bio(ims,jms,lxyl), &
395 e_bio(ims,jms,lxyl), e_bio(ims,jms,lxyl), &
396 e_bio(ims,jms,lxyl), e_bio(ims,jms,lxyl), &
397 e_bio(ims,jms,lxyl), e_bio(ims,jms,lxyl) )
403 ! apply offline isoprene emissions when bio_emiss_opt /= GUNTHER1
405 if (config_flags%bio_emiss_opt /= GUNTHER1) then
407 if (cbmz_addemiss_masscheck > 0) call addemiss_masscheck( &
408 id, config_flags, 1, 'cbmz_addemiss_biobb', &
409 dtstep, efact1, dz8w, chem, chem_sum, &
410 ids,ide, jds,jde, kds,kde, &
411 ims,ime, jms,jme, kms,kme, &
412 its,ite, jts,jte, kts,kte, &
414 e_iso,e_iso,e_iso,e_iso,e_iso,e_iso,e_iso, &
415 e_iso,e_iso,e_iso,e_iso,e_iso,e_iso,e_iso, &
416 e_iso,e_iso,e_iso,e_iso,e_iso,e_iso,e_iso )
419 do k = kts, min(config_flags%kemit,kte)
421 chem(i,k,j,p_iso) = chem(i,k,j,p_iso) + e_iso(i,k,j) &
422 *4.828e-4/rho_phy(i,k,j)*(dtstep/(dz8w(i,k,j)*60.))
427 if (cbmz_addemiss_masscheck > 0) call addemiss_masscheck( &
428 id, config_flags, 2, 'cbmz_addemiss_biobb', &
429 dtstep, efact1, dz8w, chem, chem_sum, &
430 ids,ide, jds,jde, kds,kde, &
431 ims,ime, jms,jme, kms,kme, &
432 its,ite, jts,jte, kts,kte, &
434 e_iso,e_iso,e_iso,e_iso,e_iso,e_iso,e_iso, &
435 e_iso,e_iso,e_iso,e_iso,e_iso,e_iso,e_iso, &
436 e_iso,e_iso,e_iso,e_iso,e_iso,e_iso,e_iso )
441 END subroutine cbmz_addemiss_bio
444 END MODULE module_cbmz_addemiss