Line data Source code
1 : !------------------------------------------------------------------------------
2 : ! Harmonized Emissions Component (HEMCO) !
3 : !------------------------------------------------------------------------------
4 : !BOP
5 : !
6 : ! !MODULE: hcox_megan_mod.F90
7 : !
8 : ! !DESCRIPTION: Module HCOX\_Megan\_Mod contains variables and routines
9 : ! specifying the algorithms that control the MEGAN inventory of biogenic
10 : ! emissions (as implemented into the GEOS-Chem model).
11 : !\\
12 : !\\
13 : ! This is a HEMCO extension module that uses many of the HEMCO core
14 : ! utilities.
15 : !\\
16 : !\\
17 : ! MEGAN calculates gamma activity factor based upon temperature and
18 : ! radiation information from the past. In the original GEOS-Chem
19 : ! code, the initial 10-d averages were explicitly calculated during
20 : ! initialization of MEGAN. This is not feasible in an ESMF environment,
21 : ! and the following restart variables can now be provided through the
22 : ! HEMCO configuration file:
23 : ! \begin{itemize}
24 : ! \item T\_DAVG: long-term historical temperature
25 : ! \item PARDR\_DAVG: long-term historical direct radiation
26 : ! \item PARDF\_DAVG: long-term historical diffuse radiation
27 : ! \item T\_PREVDAY: short-term historical temperature
28 : ! \end{itemize}
29 : ! These variables are automatically searched for on the first call of
30 : ! the run call. If not defined, default values will be used. The values
31 : ! of T\_DAVG, T\_PREVDAY, PARDR\_DAVG, and PARDF\_DAVG are continuously
32 : ! updated at the end of the run sequence, e.g. they represent the
33 : ! instantaneous running average. The e-folding times to be used when
34 : ! calculating the short=term and long-term running averages are defined
35 : ! as module parameter below (parameter TAU\_HOURS and TAU\_DAYS).
36 : !\\
37 : !\\
38 : ! A similar procedure is also applied to the leaf area index variables.
39 : ! The original GEOS-Chem MEGAN code used three LAI variables: current month
40 : ! LAI (LAI\_CM), previous month LAI (LAI\_PM), and instantaneous LAI (LAI),
41 : ! which was a daily interpolation of LAI\_CM and next month' LAI, (LAI\_NM).
42 : ! The HEMCO implementation uses only the instantaneous LAI, assuming it is
43 : ! updated every day. The short term historical LAI is kept in memory and
44 : ! used to determine the LAI change over time (used to calculate the gamma
45 : ! leaf age). It is also updated on every time step.
46 : ! For the first simulation day, the previous' day LAI is taken from the
47 : ! restart file (field LAI\_PREVDAY). If no restart variable is defined, a
48 : ! LAI change of zero is assumed (ckeller, 10/9/2014).
49 : !\\
50 : !\\
51 : ! !References:
52 : !
53 : ! \begin{itemize}
54 : ! \item Guenther, A., et al., \emph{The Model of Emissions of Gases and
55 : ! Aerosols from Nature version 2.1 (MEGAN2.1): an extended and updated
56 : ! framework for modeling biogenic emissions}, \underline{Geosci. Model
57 : ! Dev.}, \textbf{5}, 1471-1792, 2012.
58 : ! \item Guenther, A., et al., \emph{A global model of natural volatile
59 : ! organic compound emissions}, \underline{J.Geophys. Res.},
60 : ! \textbf{100}, 8873-8892, 1995.
61 : ! \item Wang, Y., D. J. Jacob, and J. A. Logan, \emph{Global simulation of
62 : ! tropospheric O3-Nox-hydrocarbon chemistry: 1. Model formulation},
63 : ! \underline{J. Geophys. Res.}, \textbf{103}, D9, 10713-10726, 1998.
64 : ! \item Guenther, A., B. Baugh, G. Brasseur, J. Greenberg, P. Harley, L.
65 : ! Klinger, D. Serca, and L. Vierling, \emph{Isoprene emission estimates
66 : ! and uncertanties for the Central African EXPRESSO study domain},
67 : ! \underline{J. Geophys. Res.}, \textbf{104}, 30,625-30,639, 1999.
68 : ! \item Guenther, A. C., T. Pierce, B. Lamb, P. Harley, and R. Fall,
69 : ! \emph{Natural emissions of non-methane volatile organic compounds,
70 : ! carbon monoxide, and oxides of nitrogen from North America},
71 : ! \underline{Atmos. Environ.}, \textbf{34}, 2205-2230, 2000.
72 : ! \item Guenther, A., and C. Wiedinmyer, \emph{User's guide to Model of
73 : ! Emissions of Gases and Aerosols from Nature}. http://cdp.ucar.edu.
74 : ! (Nov. 3, 2004)
75 : ! \item Guenther, A., \emph{AEF for methyl butenol}, personal commucation.
76 : ! (Nov, 2004)
77 : ! \item Sakulyanontvittaya, T., T. Duhl, C. Wiedinmyer, D. Helmig, S.
78 : ! Matsunaga, M. Potosnak, J. Milford, and A. Guenther, \emph{Monoterpene
79 : ! and sesquiterpene emission estimates for the United States},
80 : ! \underline{Environ. Sci. Technol}, \textbf{42}, 1623-1629, 2008.
81 : ! \end{itemize}
82 : !
83 : ! !INTERFACE:
84 : !
85 : MODULE HCOX_MEGAN_MOD
86 : !
87 : ! !USES:
88 : !
89 : USE HCO_ERROR_MOD
90 : USE HCO_DIAGN_MOD
91 : USE HCOX_State_MOD, ONLY : Ext_State
92 : USE HCO_STATE_MOD, ONLY : HCO_STATE
93 :
94 : IMPLICIT NONE
95 : PRIVATE
96 : !
97 : ! !PUBLIC MEMBER FUNCTIONS:
98 : !
99 : PUBLIC :: HCOX_Megan_Init
100 : PUBLIC :: HCOX_Megan_Run
101 : PUBLIC :: HCOX_Megan_Final
102 : !
103 : ! !PRIVATE MEMBER FUNCTIONS:
104 : !
105 : PRIVATE :: GET_MEGAN_EMISSIONS ! dbm, new MEGAN driver routine
106 : ! for all compounds (6/21/2012)
107 : PRIVATE :: GET_MEGAN_PARAMS
108 : PRIVATE :: GET_MEGAN_AEF
109 : PRIVATE :: GET_GAMMA_PAR_PCEEA
110 : PRIVATE :: GET_GAMMA_T_LI
111 : PRIVATE :: GET_GAMMA_T_LD
112 : PRIVATE :: GET_GAMMA_LAI
113 : PRIVATE :: GET_GAMMA_AGE
114 : PRIVATE :: GET_GAMMA_SM
115 : PRIVATE :: CALC_NORM_FAC
116 : PRIVATE :: SOLAR_ANGLE
117 : PRIVATE :: FILL_RESTART_VARS
118 : PRIVATE :: CALC_AEF
119 : PRIVATE :: GET_GAMMA_CO2 ! (Tai, Jan 2013)
120 : !
121 : ! !REVISION HISTORY:
122 : ! (1 ) Original code (biogen_em_mod.f) by Dorian Abbot (6/2003). Updated to
123 : ! latest algorithm and modified for the standard code by May Fu
124 : ! (11/2004).
125 : ! See https://github.com/geoschem/hemco for complete history
126 : !EOP
127 : !------------------------------------------------------------------------------
128 : !BOC
129 : !
130 : ! !MODULE VARIABLES:
131 : !
132 : TYPE :: MyInst
133 : INTEGER :: Instance
134 : INTEGER :: ExtNr ! Extension number for MEGAN
135 : REAL(hp) :: ISOP_SCALING ! Isoprene emissions scaling
136 : REAL(hp) :: GLOBCO2 ! Global CO2 conc (ppmv)
137 : REAL(hp) :: ISOPTOSOAP ! SOAP Emission factor
138 : REAL(hp) :: MONOTOSOAP ! SOAP Emission factor
139 : REAL(hp) :: OTHRTOSOAP ! SOAP Emission factor
140 : REAL(hp) :: ISOPTOSOAS ! Direct SOA Emission factor
141 : REAL(hp) :: MONOTOSOAS ! Direct SOA Emission factor
142 : REAL(hp) :: OTHRTOSOAS ! Direct SOA Emission factor
143 : LOGICAL :: LISOPCO2 ! Include CO2 inhibition of ISOP?
144 : LOGICAL :: NORMLAI ! Normalize LAI by PFT?
145 : LOGICAL :: OFFLINE_BIOGENICVOC ! Use offline emiss?
146 :
147 : ! Physical parameter
148 : REAL(hp) :: D2RAD ! Degrees to radians
149 : REAL(hp) :: RAD2D ! Radians to degrees
150 :
151 : ! HEMCO species IDs
152 : INTEGER :: IDTISOP
153 : INTEGER :: IDTACET
154 : INTEGER :: IDTPRPE
155 : INTEGER :: IDTC2H4
156 : INTEGER :: IDTALD2
157 : INTEGER :: IDTMOH
158 : INTEGER :: IDTEOH
159 : INTEGER :: IDTLIMO
160 : INTEGER :: IDTMTPA
161 : INTEGER :: IDTMTPO
162 : INTEGER :: IDTSESQ
163 : INTEGER :: IDTSOAP
164 : INTEGER :: IDTSOAS
165 :
166 : ! Pointers to annual emission factor arrays.
167 : ! These fields are obtained from ext. data (from config file)
168 : ! These arrays represent the base emission values in kg/m2/s
169 : ! that will be scaled based upon meteorological conditions.
170 : REAL(hp), POINTER :: AEF_ISOP(:,:)
171 : REAL(hp), POINTER :: AEF_MBOX(:,:)
172 : REAL(hp), POINTER :: AEF_BPIN(:,:)
173 : REAL(hp), POINTER :: AEF_CARE(:,:)
174 : REAL(hp), POINTER :: AEF_LIMO(:,:)
175 : REAL(hp), POINTER :: AEF_OCIM(:,:)
176 : REAL(hp), POINTER :: AEF_SABI(:,:)
177 :
178 : ! Annual emission factors arrays
179 : ! These fields are not read from file, but are computed in CALC_AEF
180 : REAL(hp), POINTER :: AEF_APIN(:,:) ! Alpha-pinene
181 : REAL(hp), POINTER :: AEF_MYRC(:,:) ! Myrcene
182 : REAL(hp), POINTER :: AEF_OMON(:,:) ! Other monoterpenes
183 : REAL(hp), POINTER :: AEF_ACET(:,:) ! Acetone
184 : REAL(hp), POINTER :: AEF_MOH(:,:) ! Methanol
185 : REAL(hp), POINTER :: AEF_EOH(:,:) ! Ethanol
186 : REAL(hp), POINTER :: AEF_CH2O(:,:) ! Formaldehyde
187 : REAL(hp), POINTER :: AEF_ALD2(:,:) ! Acetaldehyde
188 : REAL(hp), POINTER :: AEF_FAXX(:,:) ! Formic acid
189 : REAL(hp), POINTER :: AEF_AAXX(:,:) ! Acetic acid
190 : REAL(hp), POINTER :: AEF_C2H4(:,:) ! Ethene
191 : REAL(hp), POINTER :: AEF_TOLU(:,:) ! Toluene
192 : REAL(hp), POINTER :: AEF_HCNX(:,:) ! HCN
193 : REAL(hp), POINTER :: AEF_PRPE(:,:) ! >= C3 alkenes
194 : REAL(hp), POINTER :: AEF_FARN(:,:) ! a-Farnesene
195 : REAL(hp), POINTER :: AEF_BCAR(:,:) ! b-Caryophyllene
196 : REAL(hp), POINTER :: AEF_OSQT(:,:) ! Other sesquiterp.
197 :
198 : ! Emission arrays (kg/m2/s)
199 : REAL(hp), POINTER :: FLUXISOP(:,:)
200 : REAL(hp), POINTER :: FLUXMONO(:,:)
201 : REAL(hp), POINTER :: FLUXACET(:,:)
202 : REAL(hp), POINTER :: FLUXPRPE(:,:)
203 : REAL(hp), POINTER :: FLUXC2H4(:,:)
204 : REAL(hp), POINTER :: FLUXLIMO(:,:)
205 : REAL(hp), POINTER :: FLUXMTPA(:,:)
206 : REAL(hp), POINTER :: FLUXMTPO(:,:)
207 : REAL(hp), POINTER :: FLUXSESQ(:,:)
208 : REAL(hp), POINTER :: FLUXSOAP(:,:)
209 : REAL(hp), POINTER :: FLUXSOAS(:,:)
210 : REAL(hp), POINTER :: FLUXALD2(:,:)
211 : REAL(hp), POINTER :: FLUXMOH(:,:)
212 : REAL(hp), POINTER :: FLUXEOH(:,:)
213 :
214 : ! Emission arrays for use in diagnostics (kg/m2/s)
215 : REAL(sp), POINTER :: FLUXACETmb(:,:)
216 : REAL(sp), POINTER :: FLUXACETbg(:,:)
217 : REAL(sp), POINTER :: FLUXAPIN(:,:)
218 : REAL(sp), POINTER :: FLUXBPIN(:,:)
219 : REAL(sp), POINTER :: FLUXSABI(:,:)
220 : REAL(sp), POINTER :: FLUXMYRC(:,:)
221 : REAL(sp), POINTER :: FLUXCARE(:,:)
222 : REAL(sp), POINTER :: FLUXOCIM(:,:)
223 : REAL(sp), POINTER :: FLUXOMON(:,:)
224 : REAL(sp), POINTER :: FLUXFARN(:,:)
225 : REAL(sp), POINTER :: FLUXBCAR(:,:)
226 : REAL(sp), POINTER :: FLUXOSQT(:,:)
227 : REAL(sp), POINTER :: FLUXMBOX(:,:)
228 : REAL(sp), POINTER :: FLUXFAXX(:,:)
229 : REAL(sp), POINTER :: FLUXAAXX(:,:)
230 :
231 : ! Normalization factor
232 : REAL(hp), POINTER :: NORM_FAC(:)
233 :
234 : ! Restart variables
235 : REAL(sp), POINTER :: T_LASTXDAYS (:,:) ! Avg. temp of last X days
236 : REAL(sp), POINTER :: T_LAST24H (:,:) ! Avg. temp of last 24 hrs
237 : REAL(sp), POINTER :: PARDF_LASTXDAYS(:,:) ! Avg. PARDF of last X days
238 : REAL(sp), POINTER :: PARDR_LASTXDAYS(:,:) ! Avg. PARDR of last X days
239 : REAL(sp), POINTER :: LAI_PREVDAY(:,:) ! LAI of prev. day
240 :
241 : ! Array for PFT
242 : REAL(hp), POINTER :: ARRAY_16(:,:,:)
243 :
244 : ! Days between mid-months (updated by HEMCO clock)
245 : INTEGER :: DAYS_BTW_M
246 :
247 : ! Input data suffix
248 : CHARACTER(LEN=255) :: SUFFIX
249 :
250 : TYPE(MyInst), POINTER :: NextInst => NULL()
251 : END TYPE MyInst
252 :
253 : ! Pointer to all instances
254 : TYPE(MyInst), POINTER :: AllInst => NULL()
255 :
256 : ! Scalars
257 : ! e-folding time to be applied to long-term past conditions (in days)
258 : REAL(hp), PARAMETER :: TAU_DAYS = 5.0_hp
259 :
260 : ! e-folding time to be applied to short-term past conditions (in hours)
261 : REAL(hp), PARAMETER :: TAU_HOURS = 12.0_hp
262 :
263 : ! W/m2 -> umol/m2/s
264 : REAL(hp), PARAMETER :: WM2_TO_UMOLM2S = 4.766_hp
265 :
266 : ! Maximum LAI value [cm2/cm2]
267 : REAL(hp), PARAMETER :: LAI_MAX = 6.0_hp
268 :
269 : CONTAINS
270 : !EOC
271 : !------------------------------------------------------------------------------
272 : ! Harmonized Emissions Component (HEMCO) !
273 : !------------------------------------------------------------------------------
274 : !BOP
275 : !
276 : ! !IROUTINE: HCOX_Megan_Run
277 : !
278 : ! !DESCRIPTION: Subroutine HCOX\_MEGAN\_Run is the driver routine for
279 : ! the MEGAN model within the new emissions structure.
280 : ! Note that all diagnostics are commented since those are still written
281 : ! as part of the old emission structure.
282 : !\\
283 : !\\
284 : ! !INTERFACE:
285 : !
286 0 : SUBROUTINE HCOX_Megan_Run( ExtState, HcoState, RC )
287 : !
288 : ! !USES:
289 : !
290 : USE HCO_FLUXARR_MOD, ONLY : HCO_EmisAdd
291 : USE HCO_CLOCK_MOD, ONLY : HcoClock_First
292 : USE HCO_CLOCK_MOD, ONLY : HcoClock_Rewind
293 : USE HCO_CLOCK_MOD, ONLY : HcoClock_NewHour
294 : USE HCO_CLOCK_MOD, ONLY : HcoClock_NewDay
295 : USE HCO_Restart_Mod, ONLY : HCO_RestartWrite
296 : !
297 : ! !INPUT PARAMETERS:
298 : !
299 : TYPE(Ext_State), POINTER :: ExtState
300 : TYPE(HCO_State), POINTER :: HcoState
301 : !
302 : ! !INPUT/OUTPUT PARAMETERS:
303 : !
304 : INTEGER, INTENT(INOUT) :: RC
305 : !
306 : ! !REVISION HISTORY:
307 : ! 05 Aug 2013 - C. Keller - Initial version
308 : ! See https://github.com/geoschem/hemco for complete history
309 : !EOP
310 : !------------------------------------------------------------------------------
311 : !BOC
312 : !
313 : ! !LOCAL VARIABLES:
314 : !
315 : INTEGER :: I, J
316 : REAL(hp) :: EMIS_ISOP, EMIS_MBOX, EMIS_APIN, EMIS_BPIN
317 : REAL(hp) :: EMIS_LIMO, EMIS_SABI, EMIS_MYRC, EMIS_CARE
318 : REAL(hp) :: EMIS_OCIM, EMIS_OMON, EMIS_MONO, EMIS_ALD2
319 : REAL(hp) :: EMIS_MOH, EMIS_EOH, EMIS_FAXX, EMIS_AAXX
320 : REAL(hp) :: EMIS_ACET, EMIS_PRPE, EMIS_C2H4
321 : REAL(hp) :: EMIS_FARN, EMIS_BCAR, EMIS_OSQT
322 : REAL(hp) :: EMIS_OTHR
323 : REAL(hp) :: X, Y, TMP
324 : REAL(hp) :: TS_EMIS
325 : REAL(hp) :: DNEWFRAC
326 : REAL(hp) :: DOLDFRAC
327 : REAL(hp) :: HNEWFRAC
328 : REAL(hp) :: HOLDFRAC
329 : LOGICAL :: ERR
330 : LOGICAL :: FIRST, IsNewHour, IsNewDay
331 :
332 : ! For diagnostics
333 0 : REAL(hp), POINTER :: Arr2D(:,:)
334 : CHARACTER(LEN=63) :: DiagnName
335 : CHARACTER(LEN=255) :: MSG, LOC
336 :
337 : ! Conversion factors for acetone calculations
338 : REAL(hp), PARAMETER :: YIELD_MO = 0.116_hp
339 : REAL(hp), PARAMETER :: MONO_SCALE = 0.89_hp
340 : REAL(hp), PARAMETER :: MB_SCALE1 = 0.6_hp
341 : REAL(hp), PARAMETER :: MB_SCALE2 = 0.76_hp
342 : REAL(hp), PARAMETER :: MBOX_MW_g = 86.13_hp
343 :
344 : ! Conversion facor for SOAP/SOAS calculations
345 : REAL(hp), PARAMETER :: MONOtoC = ( 12.0 * 10 ) / 136.26
346 :
347 : TYPE(MyInst), POINTER :: Inst
348 :
349 : !=================================================================
350 : ! HCOX_Megan_Run begins here!
351 : !=================================================================
352 0 : LOC = 'HCOX_Megan_Run (HCOX_MEGAN_MOD.F90)'
353 :
354 : ! Enter
355 0 : CALL HCO_ENTER( HcoState%Config%Err, LOC, RC )
356 0 : IF ( RC /= HCO_SUCCESS ) THEN
357 0 : CALL HCO_ERROR( 'ERROR 0', RC, THISLOC=LOC )
358 0 : RETURN
359 : ENDIF
360 0 : ERR = .FALSE.
361 :
362 : ! Nullify
363 0 : Arr2d => NULL()
364 0 : Inst => NULL()
365 :
366 : ! Get instance
367 0 : CALL InstGet ( ExtState%Megan, Inst, RC )
368 0 : IF ( RC /= HCO_SUCCESS ) THEN
369 0 : WRITE(MSG,*) 'Cannot find Megan instance Nr. ', ExtState%Megan
370 0 : CALL HCO_ERROR(MSG,RC)
371 0 : RETURN
372 : ENDIF
373 :
374 : ! Time information
375 0 : FIRST = HcoClock_First ( HcoState%Clock, .TRUE. )
376 : IsNewHour = HcoClock_NewHour( HcoState%Clock, .TRUE. )
377 : IsNewDay = HcoClock_NewDay ( HcoState%Clock, .TRUE. )
378 :
379 : ! Initialize flux arrays
380 0 : Inst%FLUXISOP = 0.0_hp
381 0 : Inst%FLUXMBOX = 0.0_hp
382 0 : Inst%FLUXAPIN = 0.0_hp
383 0 : Inst%FLUXBPIN = 0.0_hp
384 0 : Inst%FLUXSABI = 0.0_hp
385 0 : Inst%FLUXMYRC = 0.0_hp
386 0 : Inst%FLUXCARE = 0.0_hp
387 0 : Inst%FLUXOCIM = 0.0_hp
388 0 : Inst%FLUXOMON = 0.0_hp
389 0 : Inst%FLUXMONO = 0.0_hp
390 0 : Inst%FLUXACET = 0.0_hp
391 0 : Inst%FLUXALD2 = 0.0_hp
392 0 : Inst%FLUXMOH = 0.0_hp
393 0 : Inst%FLUXEOH = 0.0_hp
394 0 : Inst%FLUXFAXX = 0.0_hp
395 0 : Inst%FLUXAAXX = 0.0_hp
396 0 : Inst%FLUXACETmb = 0.0_sp
397 0 : Inst%FLUXACETbg = 0.0_sp
398 0 : Inst%FLUXPRPE = 0.0_sp
399 0 : Inst%FLUXC2H4 = 0.0_sp
400 0 : Inst%FLUXLIMO = 0.0_sp
401 0 : Inst%FLUXMTPA = 0.0_sp
402 0 : Inst%FLUXMTPO = 0.0_sp
403 0 : Inst%FLUXFARN = 0.0_sp
404 0 : Inst%FLUXBCAR = 0.0_sp
405 0 : Inst%FLUXOSQT = 0.0_sp
406 0 : Inst%FLUXSESQ = 0.0_sp
407 0 : Inst%FLUXSOAP = 0.0_sp
408 0 : Inst%FLUXSOAS = 0.0_sp
409 :
410 : #if defined( ESMF_ ) || defined( MODEL_GEOS )
411 :
412 : !----------------------------------------------------------------
413 : ! %%%%% ESMF environment: execute these on every call %%%%%
414 : ! %%%%% because this will fill from the External State %%%%%
415 : !----------------------------------------------------------------
416 :
417 : ! Generate annual emission factors for MEGAN inventory
418 : CALL CALC_AEF( HcoState, ExtState, Inst, RC )
419 : IF ( RC /= HCO_SUCCESS ) THEN
420 : MSG = 'Error encountered in MEGAN routine CALC_AEF!'
421 : CALL HCO_ERROR( MSG, RC )
422 : RETURN
423 : ENDIF
424 :
425 : ! Calculate normalization factor (dbm, 11/2012)
426 : CALL CALC_NORM_FAC( Inst, RC )
427 : IF ( RC /= HCO_SUCCESS ) THEN
428 : MSG = 'Error encountered in MEGAN routine CALC_NORM_FAC!'
429 : CALL HCO_ERROR( MSG, RC )
430 : RETURN
431 : ENDIF
432 :
433 : ! Fill restart variables.
434 : CALL FILL_RESTART_VARS( HcoState, ExtState, Inst, RC )
435 : IF ( RC /= HCO_SUCCESS ) THEN
436 : MSG = 'Error encountered in MEGAN routine FILL_RESTART_VARS!'
437 : CALL HCO_ERROR( MSG, RC )
438 : RETURN
439 : ENDIF
440 :
441 : #else
442 :
443 : !----------------------------------------------------------------
444 : ! %%%%% Standard environment: Execute these only once %%%%%
445 : ! %%%%% to avoid constantly overwriting restart variables %%%%%
446 : !----------------------------------------------------------------
447 0 : IF ( FIRST ) THEN
448 :
449 : ! Generate annual emission factors for MEGAN inventory
450 0 : CALL CALC_AEF( HcoState, ExtState, Inst, RC )
451 0 : IF ( RC /= HCO_SUCCESS ) THEN
452 0 : MSG = 'Error encountered in MEGAN routine CALC_AEF!'
453 0 : CALL HCO_ERROR( MSG, RC )
454 0 : RETURN
455 : ENDIF
456 :
457 : ! Calculate normalization factor (dbm, 11/2012)
458 0 : CALL CALC_NORM_FAC( Inst, RC )
459 0 : IF ( RC /= HCO_SUCCESS ) THEN
460 0 : MSG = 'Error encountered in MEGAN routine CALC_NORM_FAC!'
461 0 : CALL HCO_ERROR( MSG, RC )
462 0 : RETURN
463 : ENDIF
464 :
465 : ! Fill restart variables
466 0 : CALL FILL_RESTART_VARS( HcoState, ExtState, Inst, RC )
467 0 : IF ( RC /= HCO_SUCCESS ) THEN
468 0 : MSG = 'Error encountered in MEGAN routine FILL_RESTART_VARS!'
469 0 : CALL HCO_ERROR( MSG, RC )
470 0 : RETURN
471 : ENDIF
472 : ENDIF
473 :
474 : #endif
475 :
476 : ! Set to 1 day since we know that LAI is updated every day.
477 0 : Inst%DAYS_BTW_M = 1
478 :
479 : ! Calculate weights for running means of historic variables
480 : ! DNEWFRAC and DOLDFRAC are the weights given to the current
481 : ! and existing value, respectively, when updating running means
482 : ! over the last X days. HNEWFRAC and HOLDFRAC are the same but
483 : ! for the 24H means. (ckeller, 11/05/2015)
484 0 : TS_EMIS = HcoState%TS_EMIS
485 0 : DNEWFRAC = TS_EMIS / ( TAU_DAYS * 24.0_hp * 3600.0_hp )
486 0 : DOLDFRAC = 1.0_hp - DNEWFRAC
487 0 : HNEWFRAC = TS_EMIS / ( TAU_HOURS * 3600.0_hp )
488 0 : HOLDFRAC = 1.0_hp - HNEWFRAC
489 :
490 : !$OMP PARALLEL DO &
491 : !$OMP DEFAULT( SHARED ) &
492 : !$OMP PRIVATE( I, J, EMIS_ISOP, EMIS_MBOX, EMIS_APIN, EMIS_BPIN ) &
493 : !$OMP PRIVATE( EMIS_LIMO, EMIS_SABI, EMIS_MYRC, EMIS_CARE, EMIS_OCIM ) &
494 : !$OMP PRIVATE( EMIS_OMON, EMIS_MONO, EMIS_MOH, EMIS_EOH, EMIS_FAXX ) &
495 : !$OMP PRIVATE( EMIS_AAXX, EMIS_ACET, EMIS_PRPE, EMIS_C2H4, TMP ) &
496 : !$OMP PRIVATE( EMIS_FARN, EMIS_BCAR, EMIS_OSQT, EMIS_ALD2, EMIS_OTHR ) &
497 : !$OMP PRIVATE( X, Y, RC )
498 :
499 : !-----------------------------------------------------------------
500 : ! Loop over all grid boxes
501 : !-----------------------------------------------------------------
502 0 : DO J = 1, HcoState%NY
503 0 : DO I = 1, HcoState%NX
504 :
505 : ! Zero biogenic species
506 0 : EMIS_ISOP = 0.0_hp
507 0 : EMIS_MBOX = 0.0_hp
508 0 : EMIS_APIN = 0.0_hp
509 0 : EMIS_BPIN = 0.0_hp
510 0 : EMIS_LIMO = 0.0_hp
511 0 : EMIS_SABI = 0.0_hp
512 0 : EMIS_MYRC = 0.0_hp
513 0 : EMIS_CARE = 0.0_hp
514 0 : EMIS_OCIM = 0.0_hp
515 0 : EMIS_OMON = 0.0_hp
516 0 : EMIS_MONO = 0.0_hp
517 0 : EMIS_OTHR = 0.0_hp
518 0 : EMIS_ALD2 = 0.0_hp
519 0 : EMIS_MOH = 0.0_hp
520 0 : EMIS_EOH = 0.0_hp
521 0 : EMIS_FAXX = 0.0_hp
522 0 : EMIS_AAXX = 0.0_hp
523 0 : EMIS_ACET = 0.0_hp
524 0 : EMIS_PRPE = 0.0_hp
525 0 : EMIS_C2H4 = 0.0_hp
526 0 : EMIS_FARN = 0.0_hp
527 0 : EMIS_BCAR = 0.0_hp
528 0 : EMIS_OSQT = 0.0_hp
529 :
530 : !--------------------------------------------------------------
531 : ! Calculate VOC emissions
532 : !
533 : ! The GET_EMIS*_MEGAN calls now use the annual scale factors
534 : ! imported through the HEMCO list, which are already in units
535 : ! of kg/m2/s. ckeller, 14/01/25.
536 : !
537 : ! Updated to new MEGAN routine (dbm, 12/2012)
538 : !--------------------------------------------------------------
539 :
540 : !--------------------------------------------------------------------
541 : ! MEGAN Isoprene
542 : !--------------------------------------------------------------------
543 :
544 : ! Isoprene [kg/m2/s]
545 : CALL GET_MEGAN_EMISSIONS( HcoState, ExtState, Inst, &
546 0 : I, J, 'ISOP', EMIS_ISOP, RC )
547 0 : IF ( RC /= HCO_SUCCESS ) THEN
548 : CALL HCO_ERROR( &
549 0 : 'GET_MEGAN_EMISSIONS_ISOP', RC )
550 0 : ERR = .TRUE.
551 0 : EXIT
552 : ENDIF
553 :
554 : !FP_ISOP (6/2009)
555 0 : EMIS_ISOP = Inst%ISOP_SCALING * EMIS_ISOP
556 :
557 : ! Write isoprene emissions into tracer tendency array
558 0 : IF ( Inst%IDTISOP > 0 ) THEN
559 0 : Inst%FLUXISOP(I,J) = EMIS_ISOP
560 : ENDIF
561 :
562 : ! Biogenic emissions of SOA and SOA-Precursor from isopene
563 : ! NOTE: These emission factors appear to be based on emissions
564 : ! in kgC/m2/s. Convert from kg/m2/s to kgC/m2/s.
565 0 : IF ( (Inst%IDTISOP>0) .AND. (Inst%IDTSOAP>0) ) THEN
566 0 : Inst%FLUXSOAP(I,J) = Inst%FLUXSOAP(I,J) + &
567 0 : ( EMIS_ISOP * MONOtoC ) * Inst%ISOPTOSOAP
568 : ENDIF
569 0 : IF ( (Inst%IDTISOP>0) .AND. (Inst%IDTSOAS>0) ) THEN
570 0 : Inst%FLUXSOAS(I,J) = Inst%FLUXSOAS(I,J) + &
571 0 : ( EMIS_ISOP * MONOtoC ) * Inst%ISOPTOSOAS
572 : ENDIF
573 :
574 : !--------------------------------------------------------------------
575 : ! MEGAN monoterpenes
576 : !--------------------------------------------------------------------
577 :
578 : ! ---------------------------------------------------
579 : ! Alpha Pinene emissions
580 : CALL GET_MEGAN_EMISSIONS( HcoState, ExtState, &
581 0 : Inst, I, J, 'APIN', EMIS_APIN, RC)
582 0 : IF ( RC /= HCO_SUCCESS ) THEN
583 : CALL HCO_ERROR( &
584 0 : 'GET_MEGAN_EMISSIONS_APIN', RC )
585 0 : ERR = .TRUE.
586 0 : EXIT
587 : ENDIF
588 0 : Inst%FLUXAPIN(I,J) = EMIS_APIN
589 :
590 : ! ---------------------------------------------------
591 : ! Beta Pinene emissions
592 : CALL GET_MEGAN_EMISSIONS( HcoState, ExtState, &
593 0 : Inst, I, J, 'BPIN', EMIS_BPIN, RC)
594 0 : IF ( RC /= HCO_SUCCESS ) THEN
595 : CALL HCO_ERROR( &
596 0 : 'GET_MEGAN_EMISSIONS_BPIN', RC )
597 0 : ERR = .TRUE.
598 0 : EXIT
599 : ENDIF
600 0 : Inst%FLUXBPIN(I,J) = EMIS_BPIN
601 :
602 : ! ---------------------------------------------------
603 : ! Limonene emissions
604 : CALL GET_MEGAN_EMISSIONS( HcoState, ExtState, &
605 0 : Inst, I, J, 'LIMO', EMIS_LIMO, RC)
606 0 : IF ( RC /= HCO_SUCCESS ) THEN
607 : CALL HCO_ERROR( &
608 0 : 'GET_MEGAN_EMISSIONS_LIMO', RC )
609 0 : ERR = .TRUE.
610 0 : EXIT
611 : ENDIF
612 0 : Inst%FLUXLIMO(I,J) = EMIS_LIMO
613 :
614 : ! ---------------------------------------------------
615 : ! Sabinene emissions
616 : CALL GET_MEGAN_EMISSIONS( HcoState, ExtState, &
617 0 : Inst, I, J, 'SABI', EMIS_SABI, RC)
618 0 : IF ( RC /= HCO_SUCCESS ) THEN
619 : CALL HCO_ERROR( &
620 0 : 'GET_MEGAN_EMISSIONS_SABI', RC )
621 0 : ERR = .TRUE.
622 0 : EXIT
623 : ENDIF
624 0 : Inst%FLUXSABI(I,J) = EMIS_SABI
625 :
626 : ! ---------------------------------------------------
627 : ! Mycrene emissions
628 : CALL GET_MEGAN_EMISSIONS( HcoState, ExtState, &
629 0 : Inst, I, J, 'MYRC', EMIS_MYRC, RC)
630 0 : IF ( RC /= HCO_SUCCESS ) THEN
631 : CALL HCO_ERROR( &
632 0 : 'GET_MEGAN_EMISSIONS_MYRC', RC )
633 0 : ERR = .TRUE.
634 0 : EXIT
635 : ENDIF
636 0 : Inst%FLUXMYRC(I,J) = EMIS_MYRC
637 :
638 : ! ---------------------------------------------------
639 : ! 3-Carene emissions
640 : CALL GET_MEGAN_EMISSIONS( HcoState, ExtState, &
641 0 : Inst, I, J, 'CARE', EMIS_CARE, RC)
642 0 : IF ( RC /= HCO_SUCCESS ) THEN
643 : CALL HCO_ERROR( &
644 0 : 'GET_MEGAN_EMISSIONS_CARE', RC )
645 0 : ERR = .TRUE.
646 0 : EXIT
647 : ENDIF
648 0 : Inst%FLUXCARE(I,J) = EMIS_CARE
649 :
650 : ! ---------------------------------------------------
651 : ! Ocimene emissions
652 : CALL GET_MEGAN_EMISSIONS( HcoState, ExtState, &
653 0 : Inst, I, J, 'OCIM', EMIS_OCIM, RC)
654 0 : IF ( RC /= HCO_SUCCESS ) THEN
655 : CALL HCO_ERROR( &
656 0 : 'GET_MEGAN_EMISSIONS_OCIM', RC )
657 0 : ERR = .TRUE.
658 0 : EXIT
659 : ENDIF
660 0 : Inst%FLUXOCIM(I,J) = EMIS_OCIM
661 :
662 : ! ---------------------------------------------------
663 : ! Other monoterpenes
664 : ! (added 12/2012; dbm)
665 : CALL GET_MEGAN_EMISSIONS( HcoState, ExtState, &
666 0 : Inst, I, J, 'OMON', EMIS_OMON, RC)
667 0 : IF ( RC /= HCO_SUCCESS ) THEN
668 : CALL HCO_ERROR( &
669 0 : 'GET_MEGAN_EMISSIONS_OMON', RC )
670 0 : ERR = .TRUE.
671 0 : EXIT
672 : ENDIF
673 0 : Inst%FLUXOMON(I,J) = EMIS_OMON
674 :
675 : ! ---------------------------------------------------
676 : ! Total monoterpenes = sum of individual
677 : ! dbm, now add other lumped monoterpenes (11/2012)
678 : EMIS_MONO = EMIS_APIN + EMIS_BPIN + EMIS_LIMO + EMIS_SABI + &
679 0 : EMIS_MYRC + EMIS_CARE + EMIS_OCIM + EMIS_OMON
680 :
681 : ! Add to tracer tendency array [kg/m2/s]
682 0 : Inst%FLUXMONO(I,J) = EMIS_MONO
683 :
684 : !--------------------------------------------------------------------
685 : ! MEGAN Acetaldehyde
686 : !--------------------------------------------------------------------
687 0 : IF ( Inst%IDTALD2 > 0 ) THEN
688 : CALL GET_MEGAN_EMISSIONS( HcoState, ExtState, &
689 0 : Inst, I, J, 'ALD2', EMIS_ALD2, RC)
690 0 : IF ( RC /= HCO_SUCCESS ) THEN
691 : CALL HCO_ERROR( &
692 0 : 'GET_MEGAN_EMISSIONS_ALD2', RC )
693 0 : ERR = .TRUE.
694 0 : EXIT
695 : ENDIF
696 :
697 : ! Add to tracer tendency array [kg/m2/s]
698 0 : Inst%FLUXALD2(I,J) = EMIS_ALD2
699 : ENDIF
700 :
701 : ! ---------------------------------------------------
702 : ! MEGAN Methanol
703 0 : IF ( Inst%IDTMOH > 0 ) THEN
704 : CALL GET_MEGAN_EMISSIONS( HcoState, ExtState, &
705 0 : Inst, I, J, 'MOH', EMIS_MOH, RC)
706 0 : IF ( RC /= HCO_SUCCESS ) THEN
707 : CALL HCO_ERROR( &
708 0 : 'GET_MEGAN_EMISSIONS_MOH', RC )
709 0 : ERR = .TRUE.
710 0 : EXIT
711 : ENDIF
712 :
713 : ! Add to tracer tendency array [kg/m2/s]
714 0 : Inst%FLUXMOH(I,J) = EMIS_MOH
715 : ENDIF
716 :
717 : ! ---------------------------------------------------
718 : ! MEGAN Ethanol
719 0 : IF ( Inst%IDTEOH > 0 ) THEN
720 : CALL GET_MEGAN_EMISSIONS( HcoState, ExtState, &
721 0 : Inst, I, J, 'EOH', EMIS_EOH, RC)
722 0 : IF ( RC /= HCO_SUCCESS ) THEN
723 : CALL HCO_ERROR( &
724 0 : 'GET_MEGAN_EMISSIONS_EOH', RC )
725 0 : ERR = .TRUE.
726 0 : EXIT
727 : ENDIF
728 :
729 : ! Add to tracer tendency array [kg/m2/s]
730 0 : Inst%FLUXEOH(I,J) = EMIS_EOH
731 : ENDIF
732 :
733 : !--------------------------------------------------------------------
734 : ! Other MEGAN biogenics
735 : ! Calls included here for future incorporation or
736 : ! specialized simulations. (dbm, 12/2012)
737 : !--------------------------------------------------------------------
738 :
739 : ! ---------------------------------------------------
740 : ! Methyl butenol
741 : CALL GET_MEGAN_EMISSIONS( HcoState, ExtState, &
742 0 : Inst, I, J, 'MBOX', EMIS_MBOX, RC)
743 0 : IF ( RC /= HCO_SUCCESS ) THEN
744 : CALL HCO_ERROR( &
745 0 : 'GET_MEGAN_EMISSIONS_MBOX', RC )
746 0 : ERR = .TRUE.
747 0 : EXIT
748 : ENDIF
749 0 : Inst%FLUXMBOX(I,J) = EMIS_MBOX
750 :
751 : ! ---------------------------------------------------
752 : ! MEGAN Formic acid
753 : CALL GET_MEGAN_EMISSIONS( HcoState, ExtState, &
754 0 : Inst, I, J, 'FAXX', EMIS_FAXX, RC )
755 0 : IF ( RC /= HCO_SUCCESS ) THEN
756 : CALL HCO_ERROR( &
757 0 : 'GET_MEGAN_EMISSIONS_FAXX', RC )
758 0 : ERR = .TRUE.
759 0 : EXIT
760 : ENDIF
761 0 : Inst%FLUXFAXX(I,J) = EMIS_FAXX
762 :
763 : ! ---------------------------------------------------
764 : ! MEGAN Acetic acid
765 : CALL GET_MEGAN_EMISSIONS( HcoState, ExtState, &
766 0 : Inst, I, J, 'AAXX', EMIS_AAXX, RC )
767 0 : IF ( RC /= HCO_SUCCESS ) THEN
768 : CALL HCO_ERROR( &
769 0 : 'GET_MEGAN_EMISSIONS_AAXX', RC )
770 0 : ERR = .TRUE.
771 0 : EXIT
772 : ENDIF
773 0 : Inst%FLUXAAXX(I,J) = EMIS_AAXX
774 :
775 : !--------------------------------------------------------------------
776 : ! Biogenic acetone emissions
777 : !--------------------------------------------------------------------
778 0 : IF ( Inst%IDTACET > 0 ) THEN
779 :
780 : !-----------------------------------------------------------------
781 : ! (1) BIOGENIC ACETONE FROM METHYL BUTENOL -- NORTH AMERICA
782 : !
783 : ! Methyl Butenol (a.k.a. MBO) produces acetone with a molar yield
784 : ! of 0.6 [Alvarado (1999)]. The biogenic source of MBO is thought
785 : ! to be restricted to North America. According to Guenther (1999)
786 : ! North america emits 3.2Tg-C of MBO, producing 1.15 Tg-C of
787 : ! Acetone in North America.
788 : !
789 : !
790 : ! Lon and lat of grid box (I,J) in degrees
791 0 : X = HcoState%Grid%XMID%Val( I, J )
792 0 : IF ( X >= 180.0_hp ) X = X - 360.0_hp
793 0 : Y = HcoState%Grid%YMID%Val( I, J )
794 :
795 : ! Methyl butenol is emitted only in North America, where
796 : ! ( -167.5 <= lon <= -52.5 ) and ( 16.0 <= lat <= 72.0 )
797 0 : IF ( ( X >= -167.5_hp .and. X <= -52.5_hp ) .AND. &
798 : ( Y >= 16.0_hp .and. Y <= 72.0_hp ) ) THEN
799 : ! Apply yield from MBO to get [kg ACET/m2/s]
800 0 : TMP = EMIS_MBOX * MB_SCALE1
801 0 : TMP = TMP * HcoState%Spc(Inst%IDTACET)%MW_g / MBOX_MW_g
802 :
803 : ! Scale to a posteriori source from Jacob et al 2001 (bdf, 9/5/01)
804 0 : Inst%FLUXACETmb(I,J) = TMP * MB_SCALE2
805 : ENDIF
806 :
807 : !-----------------------------------------------------------------
808 : ! (3) BIOGENIC ACETONE -- DIRECT EMISSION
809 : !
810 : ! Direct Emission now includes emission
811 : ! from grasses and emission from dry leaf matter
812 : CALL GET_MEGAN_EMISSIONS( HcoState, ExtState, &
813 0 : Inst, I, J, 'ACET', EMIS_ACET, RC)
814 0 : IF ( RC /= HCO_SUCCESS ) THEN
815 : CALL HCO_ERROR( &
816 0 : 'GET_MEGAN_EMISSIONS_ACET', RC )
817 0 : ERR = .TRUE.
818 0 : EXIT
819 : ENDIF
820 :
821 : ! Write to array
822 0 : Inst%FLUXACETbg(I,J) = EMIS_ACET
823 :
824 : ENDIF
825 :
826 : !--------------------------------------------------------------------
827 : ! Biogenic emissions of SOA and SOA-Precursor from monoterpenes
828 : !
829 : ! NOTE: These emission factors appear to be based on emissions
830 : ! in kgC/m2/s. Convert from kg/m2/s to kgC/m2/s.
831 : !--------------------------------------------------------------------
832 0 : IF ( Inst%IDTSOAP>0 ) THEN
833 0 : Inst%FLUXSOAP(I,J) = Inst%FLUXSOAP(I,J) + &
834 0 : ( EMIS_MONO * MONOtoC ) * Inst%MONOTOSOAP
835 : ENDIF
836 0 : IF ( Inst%IDTSOAS>0 ) THEN
837 0 : Inst%FLUXSOAS(I,J) = Inst%FLUXSOAS(I,J) + &
838 0 : ( EMIS_MONO * MONOtoC ) * Inst%MONOTOSOAS
839 : ENDIF
840 :
841 : !--------------------------------------------------------------------
842 : ! Biogenic emissions of PRPE
843 : !
844 : ! Now uses MEGAN2.1 (dbm, 12/2012)
845 : !--------------------------------------------------------------------
846 0 : IF ( Inst%IDTPRPE > 0 ) THEN
847 : CALL GET_MEGAN_EMISSIONS( HcoState, ExtState, &
848 0 : Inst, I, J, 'PRPE', EMIS_PRPE, RC)
849 0 : IF ( RC /= HCO_SUCCESS ) THEN
850 : CALL HCO_ERROR( &
851 0 : 'GET_MEGAN_EMISSIONS_PRPE', RC )
852 0 : ERR = .TRUE.
853 0 : EXIT
854 : ENDIF
855 :
856 : ! Add to tracer tendency array [kg/m2/s]
857 0 : Inst%FLUXPRPE(I,J) = EMIS_PRPE
858 :
859 : ENDIF
860 :
861 : !--------------------------------------------------------------------
862 : ! Biogenic emissions of ethene (C2H4)
863 : !
864 : ! Now uses MEGAN2.1 (dbm, 12/2012)
865 : !--------------------------------------------------------------------
866 0 : IF ( Inst%IDTC2H4 > 0 ) THEN
867 : CALL GET_MEGAN_EMISSIONS( HcoState, ExtState, &
868 0 : Inst, I, J, 'C2H4', EMIS_C2H4, RC)
869 0 : IF ( RC /= HCO_SUCCESS ) THEN
870 : CALL HCO_ERROR( &
871 0 : 'GET_MEGAN_EMISSIONS_C2H4', RC )
872 0 : ERR = .TRUE.
873 0 : EXIT
874 : ENDIF
875 :
876 : ! Add to tracer tendency array [kg/m2/s]
877 0 : Inst%FLUXC2H4(I,J) = EMIS_C2H4
878 : ENDIF
879 :
880 : ! ----------------------------------------------------------------
881 : ! The new MEGAN implementation has speciated information
882 : ! (hotp 3/7/10)
883 : ! as of 7/28/10 for year 2000 GEOS4 2x2.5 in Tg/yr:
884 : ! ------------------------------
885 : ! HC Class New MEGAN Old MEGAN
886 : ! -------- --------- ---------
887 : ! MTPA 73 86
888 : ! LIMO 10 25
889 : ! MTPO 33 3.2+38
890 : ! SESQ 13 15
891 : ! ----- --------
892 : ! TOTAL 129 167.2
893 : ! see Pye et al. 2010 ACP
894 : !
895 : ! Monoterpene lumping:
896 : ! GEOS-Chem MEGAN
897 : ! ========= ==========================================
898 : ! MTPA a-pinene (APIN), b-pinene (BPIN),
899 : ! sabinene (SABI), carene (CARE)
900 : ! LIMO limonene (LIMO)
901 : ! MTPO myrcene (MYRC), ocimene (OCIM),
902 : ! other mono (OMON)
903 : ! SESQ farnesene (FARN), b-caryoph (BCAR),
904 : ! other sesq (OSQT)
905 : ! ========= ==========================================
906 :
907 : !--------------------------------------------------------------
908 : ! MEGAN MTPA
909 : !--------------------------------------------------------------
910 : ! MTPA=a-,b-pinene,sabinene,carene (hotp 5/20/10)
911 0 : IF ( Inst%IDTMTPA > 0 ) THEN
912 0 : Inst%FLUXMTPA(I,J) = EMIS_APIN + EMIS_BPIN + EMIS_SABI + EMIS_CARE
913 : ENDIF
914 :
915 : !--------------------------------------------------------------
916 : ! MEGAN Limonene
917 : !--------------------------------------------------------------
918 : ! [kg/m2/s]
919 0 : IF ( Inst%IDTLIMO > 0 ) THEN
920 0 : Inst%FLUXLIMO(I,J) = EMIS_LIMO
921 : ENDIF
922 :
923 : !--------------------------------------------------------------
924 : ! MEGAN MTPO
925 : !--------------------------------------------------------------
926 : ! MTPO is all other monoterpenes (MEGAN categories:
927 : ! myrcene, ocimene, OMON) (hotp 5/20/10)
928 : ! All other monoterpenes (mostly camphene, linalool,
929 : ! terpinolene, terpinolene, phellandrene) (hotp 3/10/10)
930 : ! 14-18% of OMTP is terpinene and terpinolene
931 0 : IF ( Inst%IDTMTPO > 0 ) THEN
932 0 : Inst%FLUXMTPO(I,J) = EMIS_MYRC + EMIS_OCIM + EMIS_OMON
933 : ENDIF
934 :
935 : !--------------------------------------------------------------
936 : ! MEGAN sesquiterpenes
937 : !--------------------------------------------------------------
938 :
939 : ! ---------------------------------------------------
940 : ! a-Farnesene
941 : CALL GET_MEGAN_EMISSIONS( HcoState, ExtState, &
942 0 : Inst, I, J, 'FARN', EMIS_FARN, RC )
943 0 : IF ( RC /= HCO_SUCCESS ) THEN
944 : CALL HCO_ERROR( &
945 0 : 'GET_MEGAN_EMISSIONS_FARN', RC )
946 0 : ERR = .TRUE.
947 0 : EXIT
948 : ENDIF
949 0 : Inst%FLUXFARN(I,J) = EMIS_FARN
950 :
951 : ! ---------------------------------------------------
952 : ! b_Caryophyllene
953 : CALL GET_MEGAN_EMISSIONS( HcoState, ExtState, &
954 0 : Inst, I, J, 'BCAR', EMIS_BCAR, RC )
955 0 : IF ( RC /= HCO_SUCCESS ) THEN
956 : CALL HCO_ERROR( &
957 0 : 'GET_MEGAN_EMISSIONS_BCAR', RC )
958 0 : ERR = .TRUE.
959 0 : EXIT
960 : ENDIF
961 0 : Inst%FLUXBCAR(I,J) = EMIS_BCAR
962 :
963 : ! ---------------------------------------------------
964 : ! Other sesquiterpene
965 : CALL GET_MEGAN_EMISSIONS( HcoState, ExtState, &
966 0 : Inst, I, J, 'OSQT', EMIS_OSQT, RC )
967 0 : IF ( RC /= HCO_SUCCESS ) THEN
968 : CALL HCO_ERROR( &
969 0 : 'GET_MEGAN_EMISSIONS_OSQT', RC )
970 0 : ERR = .TRUE.
971 0 : EXIT
972 : ENDIF
973 0 : Inst%FLUXOSQT(I,J) = EMIS_OSQT
974 :
975 : ! ---------------------------------------------------
976 : ! Total sesquiterpenes from MEGAN (hotp 3/10/10)
977 0 : IF ( Inst%IDTSESQ > 0 ) THEN
978 0 : Inst%FLUXSESQ(I,J) = EMIS_FARN + EMIS_BCAR + EMIS_OSQT
979 : ENDIF
980 :
981 : ! Other terpenes
982 0 : EMIS_OTHR = EMIS_FARN + EMIS_BCAR + EMIS_OSQT
983 :
984 : !--------------------------------------------------------------------
985 : ! Biogenic emissions of SOA and SOA-Precursor from Other terpenes
986 : !
987 : ! NOTE: These emission factors appear to be based on emissions
988 : ! in kgC/m2/s. Convert from kg/m2/s to kgC/m2/s.
989 : !--------------------------------------------------------------------
990 0 : IF ( Inst%IDTSOAP>0 ) THEN
991 0 : Inst%FLUXSOAP(I,J) = Inst%FLUXSOAP(I,J) + &
992 0 : ( EMIS_OTHR * MONOtoC ) * Inst%OTHRTOSOAP
993 : ENDIF
994 0 : IF ( Inst%IDTSOAS>0 ) THEN
995 0 : Inst%FLUXSOAS(I,J) = Inst%FLUXSOAS(I,J) + &
996 0 : ( EMIS_OTHR * MONOtoC ) * Inst%OTHRTOSOAS
997 : ENDIF
998 :
999 : !-----------------------------------------------------------------
1000 : ! Update historical temperature / radiation values
1001 : !-----------------------------------------------------------------
1002 : ! Do this now on every time step. The arrays are simply the
1003 : ! the running means over the intentend time window (24 hours
1004 : ! and NUM_DAYS, respectively). This hugely faciliates warm
1005 : ! model restarts, irrespective of simulation start/end dates
1006 : ! and times. It also makes sure that all environmental
1007 : ! variables are incorporated into the time averages (e.g. if
1008 : ! emission time step is less than 60 minutes, all values will
1009 : ! be used to calculate the daily mean).
1010 : ! (ckeller, 11/05/2015)
1011 :
1012 : ! Updated LAI of last 24 hours
1013 0 : Inst%LAI_PREVDAY(I,J) = ( HOLDFRAC * Inst%LAI_PREVDAY(I,J) ) + &
1014 0 : ( HNEWFRAC * ExtState%LAI%Arr%Val(I,J) )
1015 :
1016 : ! Updated temperature of last 24 hours
1017 0 : Inst%T_LAST24H(I,J) = ( HOLDFRAC * Inst%T_LAST24H(I,J) ) + &
1018 0 : ( HNEWFRAC * ExtState%T2M%Arr%Val(I,J) )
1019 :
1020 : ! Updated temperature of last NUM_DAYS
1021 0 : Inst%T_LASTXDAYS(I,J) = ( DOLDFRAC * Inst%T_LASTXDAYS(I,J) ) + &
1022 0 : ( DNEWFRAC * ExtState%T2M%Arr%Val(I,J) )
1023 :
1024 : ! Updated direct radiation of last NUM_DAYS
1025 0 : Inst%PARDR_LASTXDAYS(I,J) = ( DOLDFRAC * Inst%PARDR_LASTXDAYS(I,J) ) + &
1026 0 : ( DNEWFRAC * ExtState%PARDR%Arr%Val(I,J) )
1027 :
1028 : ! Updated diffuse radiation of last NUM_DAYS
1029 0 : Inst%PARDF_LASTXDAYS(I,J) = ( DOLDFRAC * Inst%PARDF_LASTXDAYS(I,J) ) + &
1030 0 : ( DNEWFRAC * ExtState%PARDF%Arr%Val(I,J) )
1031 :
1032 : ENDDO !I
1033 : ENDDO !J
1034 : !$OMP END PARALLEL DO
1035 :
1036 0 : IF ( ERR ) THEN
1037 0 : RC = HCO_FAIL
1038 0 : RETURN
1039 : ENDIF
1040 :
1041 : !=================================================================
1042 : ! PASS TO HEMCO STATE AND UPDATE DIAGNOSTICS
1043 : !=================================================================
1044 :
1045 : ! ----------------------------------------------------------------
1046 : ! ISOPRENE
1047 0 : IF ( Inst%IDTISOP > 0 ) THEN
1048 :
1049 : ! Add flux to emission array
1050 : CALL HCO_EmisAdd( HcoState, Inst%FLUXISOP, Inst%IDTISOP, &
1051 0 : RC, ExtNr=Inst%ExtNr )
1052 0 : IF ( RC /= HCO_SUCCESS ) THEN
1053 : CALL HCO_ERROR( &
1054 0 : 'HCO_EmisAdd error: FLUXISOP', RC )
1055 0 : RETURN
1056 : ENDIF
1057 : ENDIF
1058 :
1059 : ! ----------------------------------------------------------------
1060 : ! ACETALDEHYDE
1061 0 : IF ( Inst%IDTALD2 > 0 ) THEN
1062 :
1063 : ! Add flux to emission array
1064 : CALL HCO_EmisAdd( HcoState, Inst%FLUXALD2, Inst%IDTALD2, &
1065 0 : RC, ExtNr=Inst%ExtNr )
1066 0 : IF ( RC /= HCO_SUCCESS ) THEN
1067 : CALL HCO_ERROR( &
1068 0 : 'HCO_EmisAdd error: FLUXALD2', RC )
1069 0 : RETURN
1070 : ENDIF
1071 : ENDIF
1072 :
1073 : ! ----------------------------------------------------------------
1074 : ! METHANOL
1075 0 : IF ( Inst%IDTMOH > 0 ) THEN
1076 :
1077 : ! Add flux to emission array
1078 : CALL HCO_EmisAdd( HcoState, Inst%FLUXMOH, Inst%IDTMOH, &
1079 0 : RC, ExtNr=Inst%ExtNr )
1080 0 : IF ( RC /= HCO_SUCCESS ) THEN
1081 : CALL HCO_ERROR( &
1082 0 : 'HCO_EmisAdd error: FLUXMOH', RC )
1083 0 : RETURN
1084 : ENDIF
1085 : ENDIF
1086 :
1087 : ! ----------------------------------------------------------------
1088 : ! ETHANOL
1089 0 : IF ( Inst%IDTEOH > 0 ) THEN
1090 :
1091 : ! Add flux to emission array
1092 : CALL HCO_EmisAdd( HcoState, Inst%FLUXEOH, Inst%IDTEOH, &
1093 0 : RC, ExtNr=Inst%ExtNr )
1094 0 : IF ( RC /= HCO_SUCCESS ) THEN
1095 : CALL HCO_ERROR( &
1096 0 : 'HCO_EmisAdd error: FLUXEOH', RC )
1097 0 : RETURN
1098 : ENDIF
1099 : ENDIF
1100 :
1101 : ! ----------------------------------------------------------------
1102 : ! ACETONE
1103 0 : IF ( Inst%IDTACET > 0 ) THEN
1104 :
1105 : ! Add flux to emission array
1106 0 : Inst%FLUXACET = Inst%FLUXACETbg + Inst%FLUXACETmb
1107 : CALL HCO_EmisAdd( HcoState, Inst%FLUXACET, Inst%IDTACET, &
1108 0 : RC, ExtNr=Inst%ExtNr )
1109 0 : IF ( RC /= HCO_SUCCESS ) THEN
1110 : CALL HCO_ERROR( &
1111 0 : 'HCO_EmisAdd error: FLUXACET', RC )
1112 0 : RETURN
1113 : ENDIF
1114 : ENDIF
1115 :
1116 : ! ----------------------------------------------------------------
1117 : ! SOA-Precursor (SOAP)
1118 0 : IF ( Inst%IDTSOAP > 0 ) THEN
1119 :
1120 : ! Add flux to emission array
1121 : CALL HCO_EmisAdd( HcoState, Inst%FLUXSOAP, Inst%IDTSOAP, &
1122 0 : RC, ExtNr=Inst%ExtNr )
1123 0 : IF ( RC /= HCO_SUCCESS ) THEN
1124 : CALL HCO_ERROR( &
1125 0 : 'HCO_EmisAdd error: FLUXSOAP', RC )
1126 0 : RETURN
1127 : ENDIF
1128 :
1129 : ENDIF
1130 :
1131 : ! ----------------------------------------------------------------
1132 : ! SOA-Simplified (SOAS)
1133 0 : IF ( Inst%IDTSOAS > 0 ) THEN
1134 :
1135 : ! Add flux to emission array
1136 : CALL HCO_EmisAdd( HcoState, Inst%FLUXSOAS, Inst%IDTSOAS, &
1137 0 : RC, ExtNr=Inst%ExtNr )
1138 0 : IF ( RC /= HCO_SUCCESS ) THEN
1139 : CALL HCO_ERROR( &
1140 0 : 'HCO_EmisAdd error: FLUXSOAS', RC )
1141 0 : RETURN
1142 : ENDIF
1143 :
1144 : ENDIF
1145 :
1146 : ! ----------------------------------------------------------------
1147 : ! ALKENES
1148 0 : IF ( Inst%IDTPRPE > 0 ) THEN
1149 :
1150 : ! Add flux to emission array
1151 : CALL HCO_EmisAdd( HcoState, Inst%FLUXPRPE, Inst%IDTPRPE, &
1152 0 : RC, ExtNr=Inst%ExtNr )
1153 0 : IF ( RC /= HCO_SUCCESS ) THEN
1154 : CALL HCO_ERROR( &
1155 0 : 'HCO_EmisAdd error: FLUXPRPE', RC )
1156 0 : RETURN
1157 : ENDIF
1158 :
1159 : ENDIF
1160 :
1161 : ! ----------------------------------------------------------------
1162 : ! ETHENE
1163 0 : IF ( Inst%IDTC2H4 > 0 ) THEN
1164 :
1165 : ! Add flux to emission array
1166 : CALL HCO_EmisAdd( HcoState, Inst%FLUXC2H4, Inst%IDTC2H4, &
1167 0 : RC, ExtNr=Inst%ExtNr )
1168 0 : IF ( RC /= HCO_SUCCESS ) THEN
1169 : CALL HCO_ERROR( &
1170 0 : 'HCO_EmisAdd error: FLUXC2H4', RC )
1171 0 : RETURN
1172 : ENDIF
1173 :
1174 : ENDIF
1175 :
1176 : ! ----------------------------------------------------------------
1177 : ! MTPA
1178 0 : IF ( Inst%IDTMTPA > 0 ) THEN
1179 :
1180 : ! Add flux to emission array
1181 : CALL HCO_EmisAdd( HcoState, Inst%FLUXMTPA, Inst%IDTMTPA, &
1182 0 : RC, ExtNr=Inst%ExtNr )
1183 0 : IF ( RC /= HCO_SUCCESS ) THEN
1184 : CALL HCO_ERROR( &
1185 0 : 'HCO_EmisAdd error: FLUXMTPA', RC )
1186 0 : RETURN
1187 : ENDIF
1188 :
1189 : ENDIF
1190 :
1191 : ! ----------------------------------------------------------------
1192 : ! MTPO
1193 0 : IF ( Inst%IDTMTPO > 0 ) THEN
1194 :
1195 : ! Add flux to emission array
1196 : CALL HCO_EmisAdd( HcoState, Inst%FLUXMTPO, Inst%IDTMTPO, &
1197 0 : RC, ExtNr=Inst%ExtNr )
1198 0 : IF ( RC /= HCO_SUCCESS ) THEN
1199 : CALL HCO_ERROR( &
1200 0 : 'HCO_EmisAdd error: FLUXMTPO', RC )
1201 0 : RETURN
1202 : ENDIF
1203 :
1204 : ENDIF
1205 :
1206 : ! ----------------------------------------------------------------
1207 : ! LIMONENE
1208 0 : IF ( Inst%IDTLIMO > 0 ) THEN
1209 :
1210 : ! Add flux to emission array
1211 : CALL HCO_EmisAdd( HcoState, Inst%FLUXLIMO, Inst%IDTLIMO, &
1212 0 : RC, ExtNr=Inst%ExtNr )
1213 0 : IF ( RC /= HCO_SUCCESS ) THEN
1214 : CALL HCO_ERROR( &
1215 0 : 'HCO_EmisAdd error: FLUXLIMO', RC )
1216 0 : RETURN
1217 : ENDIF
1218 :
1219 : ENDIF
1220 :
1221 : ! ----------------------------------------------------------------
1222 : ! SESQ
1223 0 : IF ( Inst%IDTSESQ > 0 ) THEN
1224 :
1225 : ! Add flux to emission array
1226 : CALL HCO_EmisAdd( HcoState, Inst%FLUXSESQ, Inst%IDTSESQ, &
1227 0 : RC, ExtNr=Inst%ExtNr )
1228 0 : IF ( RC /= HCO_SUCCESS ) THEN
1229 : CALL HCO_ERROR( &
1230 0 : 'HCO_EmisAdd error: FLUXSESQ', RC )
1231 0 : RETURN
1232 : ENDIF
1233 :
1234 : ENDIF
1235 :
1236 : ! ----------------------------------------------------------------
1237 : ! Eventually copy internal values to ESMF internal state object
1238 : ! ----------------------------------------------------------------
1239 :
1240 : ! LAI_PREVDAY
1241 : CALL HCO_RestartWrite( HcoState, &
1242 0 : 'LAI_PREVDAY', Inst%LAI_PREVDAY, RC )
1243 0 : IF ( RC /= HCO_SUCCESS ) THEN
1244 0 : CALL HCO_ERROR( 'ERROR 1', RC, THISLOC=LOC )
1245 0 : RETURN
1246 : ENDIF
1247 :
1248 : ! T_LAST24H
1249 : CALL HCO_RestartWrite( HcoState, &
1250 0 : 'T_PREVDAY', Inst%T_LAST24H, RC )
1251 0 : IF ( RC /= HCO_SUCCESS ) THEN
1252 0 : CALL HCO_ERROR( 'ERROR 2', RC, THISLOC=LOC )
1253 0 : RETURN
1254 : ENDIF
1255 :
1256 : ! T_LASTXDAYS
1257 : CALL HCO_RestartWrite( HcoState, &
1258 0 : 'T_DAVG', Inst%T_LASTXDAYS, RC )
1259 0 : IF ( RC /= HCO_SUCCESS ) THEN
1260 0 : CALL HCO_ERROR( 'ERROR 3', RC, THISLOC=LOC )
1261 0 : RETURN
1262 : ENDIF
1263 :
1264 : ! PARDR_LASTXDAYS
1265 : CALL HCO_RestartWrite( HcoState, &
1266 0 : 'PARDR_DAVG', Inst%PARDR_LASTXDAYS, RC )
1267 0 : IF ( RC /= HCO_SUCCESS ) THEN
1268 0 : CALL HCO_ERROR( 'ERROR 4', RC, THISLOC=LOC )
1269 0 : RETURN
1270 : ENDIF
1271 :
1272 : ! PARDF_LASTXDAYS
1273 : CALL HCO_RestartWrite( HcoState, &
1274 0 : 'PARDF_DAVG', Inst%PARDF_LASTXDAYS, RC )
1275 0 : IF ( RC /= HCO_SUCCESS ) THEN
1276 0 : CALL HCO_ERROR( 'ERROR 5', RC, THISLOC=LOC )
1277 0 : RETURN
1278 : ENDIF
1279 :
1280 : !=================================================================
1281 : ! ALL DONE!
1282 : !=================================================================
1283 :
1284 : ! Cleanup
1285 0 : Inst => NULL()
1286 :
1287 : ! Reset first-time flag
1288 0 : FIRST = .FALSE.
1289 :
1290 : ! Return w/ success
1291 0 : CALL HCO_LEAVE( HcoState%Config%Err,RC )
1292 :
1293 0 : END SUBROUTINE HCOX_Megan_Run
1294 : !EOC
1295 : !------------------------------------------------------------------------------
1296 : ! Harmonized Emissions Component (HEMCO) !
1297 : !------------------------------------------------------------------------------
1298 : !BOP
1299 : !
1300 : ! !IROUTINE: Get_Megan_Emissions
1301 : !
1302 : ! !DESCRIPTION: Subroutine Get\_Megan\_Emissions computes biogenic emissions in
1303 : ! units of kg/m2/s using the MEGAN inventory. (dbm, 12/2012)
1304 : !\\
1305 : !\\
1306 : ! !INTERFACE:
1307 : !
1308 0 : SUBROUTINE GET_MEGAN_EMISSIONS( HcoState, ExtState, &
1309 : Inst, I, J, CMPD, MEGAN_EMIS, RC )
1310 : !
1311 : ! !INPUT PARAMETERS:
1312 : !
1313 : TYPE(HCO_STATE), POINTER :: HcoState
1314 : TYPE(Ext_State), POINTER :: ExtState
1315 : TYPE(MyInst), POINTER :: Inst
1316 : INTEGER, INTENT(IN) :: I, J ! GEOS-Chem lon & lat indices
1317 : CHARACTER(LEN=*), INTENT(IN) :: CMPD ! Compound name (dbm,6/21/2012)
1318 : !
1319 : ! !OUTPUT PARAMETERS:
1320 : !
1321 : REAL(hp), INTENT(OUT) :: MEGAN_EMIS ! kg/m2/s
1322 : !
1323 : ! !INPUT/OUTPUT PARAMETERS:
1324 : !
1325 : INTEGER, INTENT(INOUT) :: RC
1326 : !
1327 : ! !REMARKS:
1328 : ! References (see above for full citations):
1329 : ! ============================================================================
1330 : ! (1 ) Guenther et al, 1995, 1999, 2000, 2004, 2006
1331 : ! (2 ) Wang, et al, 1998
1332 : ! (3 ) Guenther et al, 2007, MEGAN v2.1 User mannual
1333 : ! (4 ) Guenther et al, 2012 GMD MEGANv2.1 description and associated code at
1334 : ! http://acd.ucar.edu/~guenther/MEGAN/
1335 : !
1336 : ! !REVISION HISTORY:
1337 : ! (1 ) Original code by Dorian Abbot (9/2003). Updated to the latest
1338 : ! algorithm and modified for the standard code by May Fu (11/20/04)
1339 : ! See https://github.com/geoschem/hemco for complete history
1340 : !EOP
1341 : !------------------------------------------------------------------------------
1342 : !BOC
1343 : !
1344 : ! !LOCAL VARIABLES:
1345 : !
1346 : REAL(hp) :: GAMMA_LAI
1347 : REAL(hp) :: GAMMA_AGE
1348 : REAL(hp) :: GAMMA_PAR
1349 : REAL(hp) :: GAMMA_T_LD
1350 : REAL(hp) :: GAMMA_T_LI
1351 : REAL(hp) :: GAMMA_SM
1352 : REAL(hp) :: GAMMA_CO2 ! (Tai, Jan 2013)
1353 : REAL(hp) :: AEF
1354 : REAL(hp) :: D_BTW_M
1355 : REAL(hp) :: TS, SUNCOS
1356 : REAL(hp) :: Q_DIR_2, Q_DIFF_2
1357 : REAL(hp) :: BETA, LDF, CT1, CEO
1358 : REAL(hp) :: ANEW, AGRO, AMAT, AOLD
1359 : REAL(hp) :: ISOLAI, PMISOLAI, MISOLAI
1360 : REAL(hp) :: PFTSUM
1361 : LOGICAL :: BIDIR
1362 : CHARACTER(LEN=255) :: LOC
1363 :
1364 : !=================================================================
1365 : ! GET_MEGAN_EMISSIONS begins here!
1366 : !=================================================================
1367 0 : LOC = 'GET_MEGAN_EMISSIONS (HCOX_MEGAN_MOD.F90)'
1368 :
1369 : ! Initialize parameters, gamma values, and return value
1370 0 : MEGAN_EMIS = 0.0_hp
1371 0 : GAMMA_LAI = 0.0_hp
1372 0 : GAMMA_AGE = 0.0_hp
1373 0 : GAMMA_T_LD = 0.0_hp
1374 0 : GAMMA_T_LI = 0.0_hp
1375 0 : GAMMA_PAR = 0.0_hp
1376 0 : GAMMA_SM = 0.0_hp
1377 0 : GAMMA_CO2 = 0.0_hp
1378 0 : BETA = 0.0_hp
1379 0 : AEF = 0.0_hp
1380 0 : LDF = 0.0_hp
1381 0 : CT1 = 0.0_hp
1382 0 : CEO = 0.0_hp
1383 0 : ANEW = 0.0_hp
1384 0 : AGRO = 0.0_hp
1385 0 : AMAT = 0.0_hp
1386 0 : AOLD = 0.0_hp
1387 0 : BIDIR = .FALSE.
1388 :
1389 : ! Number of days between MISOLAI and PMISOLAI
1390 0 : D_BTW_M = DBLE( Inst%DAYS_BTW_M )
1391 :
1392 : ! Pass met variables. Now use only LAI (ckeller, 10/9/2014)
1393 0 : ISOLAI = ExtState%LAI%Arr%Val(I,J)
1394 0 : PMISOLAI = Inst%LAI_PREVDAY(I,J)
1395 0 : MISOLAI = ISOLAI
1396 0 : TS = ExtState%T2M%Arr%Val(I,J)
1397 0 : SUNCOS = ExtState%SUNCOS%Arr%Val(I,J)
1398 :
1399 : ! Convert Q_DIR and Q_DIFF from (W/m2) to (micromol/m2/s)
1400 0 : Q_DIR_2 = ExtState%PARDR%Arr%Val(I,J) * WM2_TO_UMOLM2S
1401 0 : Q_DIFF_2 = ExtState%PARDF%Arr%Val(I,J) * WM2_TO_UMOLM2S
1402 :
1403 : ! Eventually normalize LAI by PFT (if setting is set
1404 : ! accordingly). ckeller, 7/17/17.
1405 0 : IF ( Inst%NORMLAI ) THEN
1406 0 : PFTSUM = SUM( Inst%ARRAY_16(I,J,2:16) )
1407 0 : IF ( PFTSUM > 0.0_hp ) THEN
1408 0 : MISOLAI = MIN( MISOLAI / PFTSUM, LAI_MAX )
1409 0 : PMISOLAI = MIN( PMISOLAI / PFTSUM, LAI_MAX )
1410 : ENDIF
1411 : ENDIF
1412 :
1413 : ! --------------------------------------------
1414 : ! Get MEGAN parameters for this compound
1415 : ! --------------------------------------------
1416 : CALL GET_MEGAN_PARAMS ( HcoState, &
1417 : CMPD, BETA, LDF, CT1, CEO, &
1418 0 : ANEW, AGRO, AMAT, AOLD, BIDIR, RC )
1419 0 : IF ( RC /= HCO_SUCCESS ) THEN
1420 0 : CALL HCO_ERROR( 'ERROR 6', RC, THISLOC=LOC )
1421 0 : RETURN
1422 : ENDIF
1423 :
1424 : ! --------------------------------------------
1425 : ! Get base emission factor for this compound and grid square
1426 : ! Units: kg/m2/s
1427 : ! --------------------------------------------
1428 0 : CALL GET_MEGAN_AEF ( HcoState, Inst, I, J, CMPD, AEF, RC )
1429 0 : IF ( RC /= HCO_SUCCESS ) THEN
1430 0 : CALL HCO_ERROR( 'ERROR 7', RC, THISLOC=LOC )
1431 0 : RETURN
1432 : ENDIF
1433 :
1434 : !-----------------------------------------------------
1435 : ! Only interested in terrestrial biosphere
1436 : ! If (local LAI != 0 .AND. baseline emission !=0 )
1437 : !-----------------------------------------------------
1438 0 : IF ( ISOLAI * AEF > 0.0_hp ) THEN
1439 :
1440 : ! --------------------------------------------------
1441 : ! GAMMA_par (light activity factor)
1442 : ! --------------------------------------------------
1443 :
1444 : ! Calculate GAMMA PAR only during day
1445 0 : IF ( SUNCOS > 0.0_hp ) THEN
1446 :
1447 : GAMMA_PAR = GET_GAMMA_PAR_PCEEA( HcoState, &
1448 : ExtState, Inst, I, J, &
1449 : Q_DIR_2, Q_DIFF_2, &
1450 0 : Inst%PARDR_LASTXDAYS(I,J), &
1451 0 : Inst%PARDF_LASTXDAYS(I,J) )
1452 : ELSE
1453 :
1454 : ! If night
1455 : GAMMA_PAR = 0.0_hp
1456 : ENDIF
1457 :
1458 : ! --------------------------------------------------
1459 : ! GAMMA_T_LI (temperature activity factor for
1460 : ! light-independent fraction)
1461 : ! --------------------------------------------------
1462 0 : GAMMA_T_LI = GET_GAMMA_T_LI( TS, BETA )
1463 :
1464 : ! --------------------------------------------------
1465 : ! GAMMA_T_LD (temperature activity factor for
1466 : ! light-dependent fraction)
1467 : ! --------------------------------------------------
1468 0 : GAMMA_T_LD = GET_GAMMA_T_LD( TS, Inst%T_LASTXDAYS(I,J), &
1469 0 : Inst%T_LAST24H(I,J), CT1, CEO )
1470 :
1471 : ! --------------------------------------------------
1472 : ! GAMMA_LAI (leaf area index activity factor)
1473 : ! --------------------------------------------------
1474 0 : GAMMA_LAI = GET_GAMMA_LAI( MISOLAI, BIDIR )
1475 :
1476 : ! --------------------------------------------------
1477 : ! GAMMA_AGE (leaf age activity factor)
1478 : ! --------------------------------------------------
1479 : GAMMA_AGE = GET_GAMMA_AGE( MISOLAI, PMISOLAI, D_BTW_M, &
1480 : Inst%T_LASTXDAYS(I,J), &
1481 0 : ANEW, AGRO, AMAT, AOLD )
1482 :
1483 : ! --------------------------------------------------
1484 : ! GAMMA_SM (soil moisture activity factor)
1485 : ! --------------------------------------------------
1486 0 : GAMMA_SM = GET_GAMMA_SM( ExtState, I, J, CMPD )
1487 :
1488 : ! CO2 inhibition of isoprene (Tai, Jan 2013)
1489 0 : IF ( Inst%LISOPCO2 ) THEN
1490 0 : GAMMA_CO2 = GET_GAMMA_CO2( Inst%GLOBCO2 )
1491 : ELSE
1492 : GAMMA_CO2 = 1.0_hp
1493 : ENDIF
1494 :
1495 : ELSE
1496 :
1497 : ! set activity factors to zero
1498 : GAMMA_PAR = 0.0_hp
1499 : GAMMA_T_LI = 0.0_hp
1500 : GAMMA_T_LD = 0.0_hp
1501 : GAMMA_LAI = 0.0_hp
1502 : GAMMA_AGE = 0.0_hp
1503 : GAMMA_SM = 0.0_hp
1504 : GAMMA_CO2 = 0.0_hp
1505 :
1506 : END IF
1507 :
1508 : ! Emission is the product of all of these.
1509 : ! Units here are kg/m2/s.
1510 : ! Normalization factor ensures product of GAMMA values is 1.0 under
1511 : ! standard conditions.
1512 0 : IF ( CMPD == 'ISOP' ) THEN
1513 : ! Only apply CO2 inhibition to isoprene (mps, 9/15/15)
1514 : ! Amos Tai wrote:
1515 : ! In my opinion, we should not apply the CO2 inhibition factor on
1516 : ! other monoterpene species yet, because the empirical data I've used
1517 : ! are for isoprene emissions only. But we generally agree that CO2
1518 : ! inhibition should affect monoterpenes too, so we'll leave room for
1519 : ! future incorporation when new data arise.
1520 0 : MEGAN_EMIS = Inst%NORM_FAC(1) * AEF * GAMMA_AGE * GAMMA_SM * &
1521 : GAMMA_LAI * ((1.0_hp - LDF) * GAMMA_T_LI + &
1522 0 : (LDF * GAMMA_PAR * GAMMA_T_LD)) * GAMMA_CO2
1523 : ELSE
1524 0 : MEGAN_EMIS = Inst%NORM_FAC(1) * AEF * GAMMA_AGE * GAMMA_SM * &
1525 : GAMMA_LAI * ((1.0_hp - LDF) * GAMMA_T_LI + &
1526 0 : (LDF * GAMMA_PAR * GAMMA_T_LD))
1527 : ENDIF
1528 :
1529 : ! Leave w/ success
1530 0 : RC = HCO_SUCCESS
1531 :
1532 : END SUBROUTINE GET_MEGAN_EMISSIONS
1533 : !EOC
1534 : !------------------------------------------------------------------------------
1535 : ! Harmonized Emissions Component (HEMCO) !
1536 : !------------------------------------------------------------------------------
1537 : !BOP
1538 : !
1539 : ! !IROUTINE: Get_Megan_Params
1540 : !
1541 : ! !DESCRIPTION: Subroutine Get\_Megan\_Params returns the emission parameters
1542 : ! for each MEGAN compound needed to compute emissions. Called from
1543 : ! GET\_MEGAN\_EMISSIONS.
1544 : !\\
1545 : !\\
1546 : ! !INTERFACE:
1547 : !
1548 0 : SUBROUTINE GET_MEGAN_PARAMS( HcoState, &
1549 : CPD, BTA, LIDF, C_T1, C_EO, &
1550 : A_NEW, A_GRO, A_MAT, A_OLD, BI_DIR, &
1551 : RC )
1552 : !
1553 : ! !INPUT PARAMETERS:
1554 : !
1555 : TYPE(HCO_State), POINTER :: HcoState
1556 : CHARACTER(LEN=*), INTENT(IN) :: CPD ! Compound name
1557 : !
1558 : ! !INPUT/OUTPUT PARAMETERS:
1559 : !
1560 : REAL(hp), INTENT(INOUT) :: BTA ! Beta coefficient for temperature activity
1561 : ! factor for light-independent fraction
1562 : REAL(hp), INTENT(INOUT) :: LIDF ! Light-dependent fraction of emissions
1563 : REAL(hp), INTENT(INOUT) :: C_T1 ! CT1 parameter for temperature activity
1564 : ! factor for light-dependent fraction
1565 : REAL(hp), INTENT(INOUT) :: C_EO ! Ceo parameter for temperature activity
1566 : ! factor for light-dependent fraction
1567 : REAL(hp), INTENT(INOUT) :: A_NEW ! Relative emission factor (new leaves)
1568 : REAL(hp), INTENT(INOUT) :: A_GRO ! Relative emission factor (growing leaves)
1569 : REAL(hp), INTENT(INOUT) :: A_MAT ! Relative emission factor (mature leaves)
1570 : REAL(hp), INTENT(INOUT) :: A_OLD ! Relative emission factor (old leaves)
1571 : LOGICAL, INTENT(INOUT) :: BI_DIR ! Logical flag to indicate bidirectional exchange
1572 : INTEGER, INTENT(INOUT) :: RC
1573 : !
1574 : ! !REMARKS:
1575 : ! References (see above for full citations):
1576 : ! ============================================================================
1577 : ! (1 ) Guenther et al, (GMD 2012) and associated MEGANv2.1 source code
1578 : !
1579 : ! !REVISION HISTORY:
1580 : ! (1 ) Created by dbm 07/2012
1581 : ! See https://github.com/geoschem/hemco for complete history
1582 : !EOP
1583 : !------------------------------------------------------------------------------
1584 : !BOC
1585 : !
1586 : ! !LOCAL VARIABLES:
1587 : !
1588 : CHARACTER(LEN=255):: MSG
1589 :
1590 : !=================================================================
1591 : ! GET_MEGAN_PARAMS begins here!
1592 : !=================================================================
1593 :
1594 : ! Initialize values
1595 0 : BTA = 0.0_hp
1596 0 : LIDF = 0.0_hp
1597 0 : C_T1 = 0.0_hp
1598 0 : C_EO = 0.0_hp
1599 0 : A_NEW = 0.0_hp
1600 0 : A_GRO = 0.0_hp
1601 0 : A_MAT = 0.0_hp
1602 0 : A_OLD = 0.0_hp
1603 0 : BI_DIR = .FALSE.
1604 :
1605 : ! ----------------------------------------------------------------
1606 : ! Note that not all the above compounds are used in standard chemistry
1607 : ! simulations, but they are provided here for future incorporation or
1608 : ! specialized applications. More compounds can be added as needed
1609 : ! by adding the corresponding CPD name and the appropriate paramaters.
1610 : ! (dbm, 01/2013)
1611 : !
1612 : ! Values are from Table 4 in Guenther et al., 2012
1613 : ! ----------------------------------------------------------------
1614 :
1615 : ! Isoprene, MBO
1616 0 : IF ( TRIM(CPD) == 'ISOP' .OR. &
1617 : TRIM(CPD) == 'MBOX' ) THEN
1618 0 : BTA = 0.13_hp ! Not actually used for ISOP, MBO
1619 0 : LIDF = 1.0_hp
1620 0 : C_T1 = 95.0_hp
1621 0 : C_EO = 2.0_hp
1622 0 : A_NEW = 0.05_hp
1623 0 : A_GRO = 0.6_hp
1624 0 : A_MAT = 1.0_hp
1625 0 : A_OLD = 0.9_hp
1626 0 : BI_DIR = .FALSE.
1627 :
1628 : ! Myrcene, sabinene, alpha-pinene
1629 : ELSE IF ( TRIM(CPD) == 'MYRC' .OR. &
1630 0 : TRIM(CPD) == 'SABI' .OR. &
1631 : TRIM(CPD) == 'APIN' ) THEN
1632 0 : BTA = 0.10_hp
1633 0 : LIDF = 0.6_hp
1634 0 : C_T1 = 80.0_hp
1635 0 : C_EO = 1.83_hp
1636 0 : A_NEW = 2.0_hp
1637 0 : A_GRO = 1.8_hp
1638 0 : A_MAT = 1.0_hp
1639 0 : A_OLD = 1.05_hp
1640 0 : BI_DIR = .FALSE.
1641 :
1642 : ! Limonene, 3-carene, beta-pinene
1643 : ELSE IF ( TRIM(CPD) == 'LIMO' .OR. &
1644 0 : TRIM(CPD) == 'CARE' .OR. &
1645 : TRIM(CPD) == 'BPIN' ) THEN
1646 0 : BTA = 0.10_hp
1647 0 : LIDF = 0.2_hp
1648 0 : C_T1 = 80.0_hp
1649 0 : C_EO = 1.83_hp
1650 0 : A_NEW = 2.0_hp
1651 0 : A_GRO = 1.8_hp
1652 0 : A_MAT = 1.0_hp
1653 0 : A_OLD = 1.05_hp
1654 0 : BI_DIR = .FALSE.
1655 :
1656 : ! t-beta-ocimene
1657 0 : ELSE IF ( TRIM(CPD) == 'OCIM' ) THEN
1658 0 : BTA = 0.10_hp
1659 0 : LIDF = 0.8_hp
1660 0 : C_T1 = 80.0_hp
1661 0 : C_EO = 1.83_hp
1662 0 : A_NEW = 2.0_hp
1663 0 : A_GRO = 1.8_hp
1664 0 : A_MAT = 1.0_hp
1665 0 : A_OLD = 1.05_hp
1666 0 : BI_DIR = .FALSE.
1667 :
1668 : ! Other monoterpenes (lumped)
1669 0 : ELSE IF ( TRIM(CPD) == 'OMON' ) THEN
1670 0 : BTA = 0.10_hp
1671 0 : LIDF = 0.4_hp
1672 0 : C_T1 = 80.0_hp
1673 0 : C_EO = 1.83_hp
1674 0 : A_NEW = 2.0_hp
1675 0 : A_GRO = 1.8_hp
1676 0 : A_MAT = 1.0_hp
1677 0 : A_OLD = 1.05_hp
1678 0 : BI_DIR = .FALSE.
1679 :
1680 : ! Methanol
1681 0 : ELSE IF ( TRIM(CPD) == 'MOH' ) THEN
1682 0 : BTA = 0.08_hp
1683 0 : LIDF = 0.8_hp
1684 0 : C_T1 = 60.0_hp
1685 0 : C_EO = 1.6_hp
1686 0 : A_NEW = 3.5_hp
1687 0 : A_GRO = 3.0_hp
1688 0 : A_MAT = 1.0_hp
1689 0 : A_OLD = 1.2_hp
1690 0 : BI_DIR = .FALSE.
1691 :
1692 : ! Acetone
1693 0 : ELSE IF ( TRIM(CPD) == 'ACET' ) THEN
1694 0 : BTA = 0.1_hp
1695 0 : LIDF = 0.2_hp
1696 0 : C_T1 = 80.0_hp
1697 0 : C_EO = 1.83_hp
1698 0 : A_NEW = 1.0_hp
1699 0 : A_GRO = 1.0_hp
1700 0 : A_MAT = 1.0_hp
1701 0 : A_OLD = 1.0_hp
1702 0 : BI_DIR = .FALSE.
1703 :
1704 : ! Bidirectional VOC: Ethanol, formaldehyde, acetaldehyde, formic acid,
1705 : ! acetic acid
1706 : ELSE IF ( TRIM(CPD) == 'EOH' .OR. &
1707 : TRIM(CPD) == 'CH2O' .OR. &
1708 : TRIM(CPD) == 'ALD2' .OR. &
1709 0 : TRIM(CPD) == 'FAXX' .OR. &
1710 : TRIM(CPD) == 'AAXX' ) THEN
1711 0 : BTA = 0.13_hp
1712 0 : LIDF = 0.8_hp
1713 0 : C_T1 = 95.0_hp
1714 0 : C_EO = 2.0_hp
1715 0 : A_NEW = 1.0_hp
1716 0 : A_GRO = 1.0_hp
1717 0 : A_MAT = 1.0_hp
1718 0 : A_OLD = 1.0_hp
1719 0 : BI_DIR = .TRUE.
1720 :
1721 : ! Stress VOCs: ethene, toluene, HCN
1722 : ! There are others species in this category but none are currently
1723 : ! used in GEOS-Chem
1724 : ELSE IF ( TRIM(CPD) == 'C2H4' .OR. &
1725 0 : TRIM(CPD) == 'TOLU' .OR. &
1726 : TRIM(CPD) == 'HCNX' ) THEN
1727 0 : BTA = 0.1_hp
1728 0 : LIDF = 0.8_hp
1729 0 : C_T1 = 80.0_hp
1730 0 : C_EO = 1.83_hp
1731 0 : A_NEW = 1.0_hp
1732 0 : A_GRO = 1.0_hp
1733 0 : A_MAT = 1.0_hp
1734 0 : A_OLD = 1.0_hp
1735 0 : BI_DIR = .FALSE.
1736 :
1737 : ! Other VOCs: >C2 alkenes
1738 : ! This includes propene, butene and very minor contribution from
1739 : ! larger alkenes
1740 0 : ELSE IF ( TRIM(CPD) == 'PRPE' ) THEN
1741 0 : BTA = 0.1_hp
1742 0 : LIDF = 0.2_hp
1743 0 : C_T1 = 80.0_hp
1744 0 : C_EO = 1.83_hp
1745 0 : A_NEW = 1.0_hp
1746 0 : A_GRO = 1.0_hp
1747 0 : A_MAT = 1.0_hp
1748 0 : A_OLD = 1.0_hp
1749 0 : BI_DIR = .FALSE.
1750 :
1751 : ! SOAupdate: Sesquiterpenes hotp 3/2/10
1752 : ! alpha-Farnesene, beta-Caryophyllene, other sesquiterpenes
1753 : ELSE IF ( TRIM(CPD) == 'FARN' .OR. &
1754 0 : TRIM(CPD) == 'BCAR' .OR. &
1755 : TRIM(CPD) == 'OSQT' ) THEN
1756 0 : BTA = 0.17_hp
1757 0 : LIDF = 0.5_hp
1758 0 : C_T1 = 130.0_hp
1759 0 : C_EO = 2.37_hp
1760 0 : A_NEW = 0.4_hp
1761 0 : A_GRO = 0.6_hp
1762 0 : A_MAT = 1.0_hp
1763 0 : A_OLD = 0.95_hp
1764 0 : BI_DIR = .FALSE.
1765 :
1766 : ! Calls for any other MEGAN compounds (e.g. sesquiterpenes, etc.) can
1767 : ! be added following the above format based on the parameters in
1768 : ! Guenther 2012 or the MEGAN source code (dbm, 6/21/2012).
1769 : ELSE
1770 :
1771 0 : MSG = 'Invalid compound name'
1772 : CALL HCO_ERROR(MSG, RC, &
1773 0 : THISLOC='GET_MEGAN_PARAMS' )
1774 0 : RETURN
1775 :
1776 : ENDIF
1777 :
1778 : ! Leave w/ success
1779 0 : RC = HCO_SUCCESS
1780 :
1781 : END SUBROUTINE GET_MEGAN_PARAMS
1782 : !EOC
1783 : !------------------------------------------------------------------------------
1784 : ! Harmonized Emissions Component (HEMCO) !
1785 : !------------------------------------------------------------------------------
1786 : !BOP
1787 : !
1788 : ! !IROUTINE: Get_Megan_AEF
1789 : !
1790 : ! !DESCRIPTION: Function Get\_Megan\_AEF returns the appropriate AEF value
1791 : ! for a given compound and grid square.
1792 : !\\
1793 : !\\
1794 : ! !INTERFACE:
1795 : !
1796 0 : SUBROUTINE GET_MEGAN_AEF( HcoState, Inst, I, J, CPD, EMFAC, RC )
1797 : !
1798 : ! !INPUT PARAMETERS:
1799 : !
1800 : TYPE(HCO_State), POINTER :: HcoState
1801 : TYPE(MyInst), POINTER :: Inst
1802 : INTEGER, INTENT(IN) :: I, J ! Lon & lat indices
1803 : CHARACTER(LEN=*), INTENT(IN) :: CPD ! Compound name
1804 : !
1805 : ! !OUTPUT PARAMETERS:
1806 : !
1807 : REAL(hp), INTENT(OUT) :: EMFAC ! MEGAN base emission factor
1808 : ! (kg/m2/s) for grid cell I,J
1809 : !
1810 : ! !INPUT/OUTPUT PARAMETERS:
1811 : !
1812 : INTEGER, INTENT(INOUT) :: RC ! Return code
1813 : !
1814 : ! !REMARKS:
1815 : ! References (see above for full citations):
1816 : ! ============================================================================
1817 : ! (1 ) Guenther et al, 2012, MEGANv2.1 source code
1818 : !
1819 : ! !REVISION HISTORY:
1820 : ! (1 ) Created 11/2012 by dbm
1821 : ! See https://github.com/geoschem/hemco for complete history
1822 : !EOP
1823 : !------------------------------------------------------------------------------
1824 : !BOC
1825 : !
1826 : ! !LOCAL VARIABLES:
1827 : !
1828 : CHARACTER(LEN=255):: MSG
1829 :
1830 : !=================================================================
1831 : ! GET_MEGAN_AEF begins here!
1832 : !=================================================================
1833 :
1834 : ! Find appropriate tracer
1835 0 : SELECT CASE ( TRIM( CPD ) )
1836 : CASE ( 'ISOP' )
1837 0 : EMFAC = Inst%AEF_ISOP(I,J)
1838 : CASE ( 'MBOX' )
1839 0 : EMFAC = Inst%AEF_MBOX(I,J)
1840 : CASE ( 'MYRC' )
1841 0 : EMFAC = Inst%AEF_MYRC(I,J)
1842 : CASE ( 'SABI' )
1843 0 : EMFAC = Inst%AEF_SABI(I,J)
1844 : CASE ( 'APIN' )
1845 0 : EMFAC = Inst%AEF_APIN(I,J)
1846 : CASE ( 'LIMO' )
1847 0 : EMFAC = Inst%AEF_LIMO(I,J)
1848 : CASE ( 'CARE' )
1849 0 : EMFAC = Inst%AEF_CARE(I,J)
1850 : CASE ( 'BPIN' )
1851 0 : EMFAC = Inst%AEF_BPIN(I,J)
1852 : CASE ( 'OCIM' )
1853 0 : EMFAC = Inst%AEF_OCIM(I,J)
1854 : CASE ( 'OMON' )
1855 0 : EMFAC = Inst%AEF_OMON(I,J)
1856 : CASE ( 'MOH' )
1857 0 : EMFAC = Inst%AEF_MOH(I,J)
1858 : CASE ( 'ACET' )
1859 0 : EMFAC = Inst%AEF_ACET(I,J)
1860 : CASE ( 'EOH' )
1861 0 : EMFAC = Inst%AEF_EOH(I,J)
1862 : CASE ( 'CH2O' )
1863 0 : EMFAC = Inst%AEF_CH2O(I,J)
1864 : CASE ( 'ALD2' )
1865 0 : EMFAC = Inst%AEF_ALD2(I,J)
1866 : CASE ( 'FAXX' )
1867 0 : EMFAC = Inst%AEF_FAXX(I,J)
1868 : CASE ( 'AAXX' )
1869 0 : EMFAC = Inst%AEF_AAXX(I,J)
1870 : CASE ( 'C2H4' )
1871 0 : EMFAC = Inst%AEF_C2H4(I,J)
1872 : CASE ( 'TOLU' )
1873 0 : EMFAC = Inst%AEF_TOLU(I,J)
1874 : CASE ( 'HCNX' )
1875 0 : EMFAC = Inst%AEF_HCNX(I,J)
1876 : CASE ( 'PRPE' )
1877 0 : EMFAC = Inst%AEF_PRPE(I,J)
1878 : CASE ( 'FARN' )
1879 0 : EMFAC = Inst%AEF_FARN(I,J)
1880 : CASE ( 'BCAR' )
1881 0 : EMFAC = Inst%AEF_BCAR(I,J)
1882 : CASE ( 'OSQT' )
1883 0 : EMFAC = Inst%AEF_OSQT(I,J)
1884 : CASE DEFAULT
1885 0 : MSG = 'Invalid compound name'
1886 : CALL HCO_ERROR(MSG, &
1887 0 : RC, THISLOC='GET_MEGAN_AEF' )
1888 0 : RETURN
1889 : END SELECT
1890 :
1891 : ! Return w/ success
1892 0 : RC = HCO_SUCCESS
1893 :
1894 : END SUBROUTINE GET_MEGAN_AEF
1895 : !EOC
1896 : !------------------------------------------------------------------------------
1897 : ! Harmonized Emissions Component (HEMCO) !
1898 : !------------------------------------------------------------------------------
1899 : !BOP
1900 : !
1901 : ! !IROUTINE: Get_Gamma_PAR_PCEEA
1902 : !
1903 : ! !DESCRIPTION: Computes the PCEEA gamma activity factor with sensitivity
1904 : ! to LIGHT.
1905 : !\\
1906 : !\\
1907 : ! !INTERFACE:
1908 : !
1909 0 : FUNCTION GET_GAMMA_PAR_PCEEA( HcoState, ExtState, &
1910 : Inst, I, J, Q_DIR_2, Q_DIFF_2, &
1911 : PARDR_AVG_SIM, PARDF_AVG_SIM ) &
1912 : RESULT( GAMMA_P_PCEEA )
1913 : !
1914 : ! !USES:
1915 : !
1916 : USE HCO_CLOCK_MOD, ONLY : HcoClock_Get, HcoClock_GetLocal
1917 : !
1918 : ! !INPUT PARAMETERS:
1919 : !
1920 : TYPE(HCO_State), POINTER :: HcoState
1921 : TYPE(Ext_State), POINTER :: ExtState
1922 : TYPE(MyInst), POINTER :: Inst
1923 : INTEGER, INTENT(IN) :: I, J ! Lon & lat indices
1924 : REAL(sp), INTENT(IN) :: PARDR_AVG_SIM ! Avg direct PAR [W/m2]
1925 : REAL(sp), INTENT(IN) :: PARDF_AVG_SIM ! Avg diffuse PAR [W/m2]
1926 : REAL(hp), INTENT(IN) :: Q_DIR_2 ! Direct PAR [umol/m2/s]
1927 : REAL(hp), INTENT(IN) :: Q_DIFF_2 ! Diffuse PAR [umol/m2/s]
1928 : !
1929 : ! !RETURN VALUE:
1930 : !
1931 : REAL(hp) :: GAMMA_P_PCEEA ! GAMMA factor for light
1932 : !
1933 : ! !REMARKS:
1934 : ! References (see above for full citations):
1935 : ! ============================================================================
1936 : ! (1 ) Guenther et al, 2006
1937 : ! (2 ) Guenther et al, 2007, MEGAN v2.1 user guide
1938 : !
1939 : ! !REVISION HISTORY:
1940 : ! (1 ) Code was taken & adapted directly from the MEGAN v2.1 source code.
1941 : ! (mpb,2009)
1942 : ! See https://github.com/geoschem/hemco for complete history
1943 : !EOP
1944 : !------------------------------------------------------------------------------
1945 : !BOC
1946 : !
1947 : ! !LOCAL VARIABLES:
1948 : !
1949 : REAL(hp) :: mmPARDR_DAILY
1950 : REAL(hp) :: mmPARDF_DAILY
1951 : REAL(hp) :: PAC_DAILY, PAC_INSTANT, C_PPFD
1952 : REAL(hp) :: PTOA, PHI
1953 : REAL(hp) :: BETA, SINbeta
1954 : INTEGER :: DOY, RC
1955 : REAL(hp) :: AAA, BBB
1956 : REAL(hp) :: LocalHour
1957 : REAL(hp) :: LAT
1958 :
1959 : !-----------------------------------------------------------------
1960 : ! Compute GAMMA_PAR_PCEEA
1961 : !-----------------------------------------------------------------
1962 :
1963 : ! Initialize
1964 0 : C_PPFD = 0.0_hp
1965 0 : PTOA = 0.0_hp
1966 :
1967 : ! Convert past light conditions to micromol/m2/s
1968 0 : mmPARDR_DAILY = PARDR_AVG_SIM * WM2_TO_UMOLM2S
1969 0 : mmPARDF_DAILY = PARDF_AVG_SIM * WM2_TO_UMOLM2S
1970 :
1971 : ! Work out the light at the top of the canopy.
1972 0 : PAC_DAILY = mmPARDR_DAILY + mmPARDF_DAILY
1973 0 : PAC_INSTANT = Q_DIR_2 + Q_DIFF_2
1974 :
1975 : ! Get latitude
1976 0 : LAT = HcoState%Grid%YMID%Val(I,J)
1977 :
1978 : ! Get day of year, local-time and latitude
1979 : ! TODO: Evaluate RC?
1980 0 : CALL HcoClock_Get( HcoState%Clock, cDOY = DOY, RC=RC )
1981 0 : CALL HcoClock_GetLocal( HcoState, I, J, cH = LocalHour, RC=RC )
1982 :
1983 : ! Get solar elevation angle
1984 0 : SINbeta = SOLAR_ANGLE( HcoState, Inst, DOY, LocalHour, LAT )
1985 0 : BETA = ASIN( SINbeta ) * Inst%RAD2D
1986 :
1987 0 : IF ( SINbeta < 0.0_hp ) THEN
1988 :
1989 : GAMMA_P_PCEEA = 0.0_hp
1990 :
1991 0 : ELSEIF ( SINbeta > 0.0_hp ) THEN
1992 :
1993 : ! PPFD at top of atmosphere
1994 : PTOA = 3000.0_hp + 99.0_hp * &
1995 : COS( 2._hp * 3.14159265358979323_hp * &
1996 0 : ( DOY - 10.0_hp ) / 365.0_hp )
1997 :
1998 : ! Above canopy transmission
1999 0 : PHI = PAC_INSTANT / ( SINbeta * PTOA )
2000 :
2001 : ! Work out gamma P
2002 0 : BBB = 1.0_hp + 0.0005_hp *( PAC_DAILY - 400.0_hp )
2003 0 : AAA = ( 2.46_hp * BBB * PHI ) - ( 0.9_hp * PHI**2 )
2004 :
2005 0 : GAMMA_P_PCEEA = SINbeta * AAA
2006 :
2007 : ENDIF
2008 :
2009 : ! Screen unforced errors. IF solar elevation angle is
2010 : ! less than 1 THEN gamma_p can not be greater than 0.1.
2011 0 : IF ( BETA < 1.0_hp .AND. GAMMA_P_PCEEA > 0.1_hp ) THEN
2012 0 : GAMMA_P_PCEEA = 0.0_hp
2013 : ENDIF
2014 :
2015 : ! Prevent negative values
2016 0 : GAMMA_P_PCEEA = MAX( GAMMA_P_PCEEA , 0.0_hp )
2017 :
2018 0 : END FUNCTION GET_GAMMA_PAR_PCEEA
2019 : !EOC
2020 : !------------------------------------------------------------------------------
2021 : ! Harmonized Emissions Component (HEMCO) !
2022 : !------------------------------------------------------------------------------
2023 : !BOP
2024 : !
2025 : ! !IROUTINE: Solar_Angle
2026 : !
2027 : ! !DESCRIPTION: Function SOLAR\_ANGLE computes the local solar angle for a
2028 : ! given day of year, latitude and longitude (or local time). Called from
2029 : ! routine Get\_Gamma\_P\_Pecca.
2030 : !\\
2031 : !\\
2032 : ! !INTERFACE:
2033 : !
2034 0 : FUNCTION SOLAR_ANGLE( HcoState, Inst, DOY, SHOUR, LAT ) &
2035 : RESULT(SINbeta)
2036 : !
2037 : ! !INPUT PARAMETERS:
2038 : !
2039 : TYPE(HCO_State), POINTER :: HcoState
2040 : TYPE(MyInst), POINTER :: Inst
2041 : INTEGER, INTENT(IN) :: DOY ! Day of year
2042 : REAL(hp), INTENT(IN) :: SHOUR ! Local time
2043 : REAL(hp), INTENT(IN) :: LAT ! Latitude
2044 : !
2045 : ! !RETURN VALUE:
2046 : !
2047 : REAL(hp) :: SINbeta ! Sin of the local solar angle
2048 : !
2049 : ! !REMARKS:
2050 : ! References (see above for full citations):
2051 : ! (1 ) Guenther et al, 2006
2052 : ! (2 ) Guenther et al, MEGAN v2.1 user mannual 2007-09
2053 : !
2054 : ! !REVISION HISTORY:
2055 : ! (1 ) This code was taken directly from the MEGAN v2.1 source code.(mpb,2009)
2056 : ! See https://github.com/geoschem/hemco for complete history
2057 : !EOP
2058 : !------------------------------------------------------------------------------
2059 : !BOC
2060 : !
2061 : ! !LOCAL VARIABLES:
2062 : !
2063 : REAL(hp) :: BETA ! solar elevation angle
2064 : REAL(hp) :: sindelta, cosdelta, A, B
2065 :
2066 : ! Calculation of sin beta
2067 0 : sindelta = -SIN( 0.40907_hp ) * COS( 6.28_hp * ( DOY + 10_dp ) / 365_dp )
2068 :
2069 0 : cosdelta = (1-sindelta**2.0_hp)**0.5_hp
2070 :
2071 0 : A = SIN( LAT * Inst%D2RAD ) * sindelta
2072 0 : B = COS( LAT * Inst%D2RAD ) * cosdelta
2073 :
2074 0 : SINbeta = A + B * COS( 2.0_hp * HcoState%Phys%PI * ( SHOUR-12_dp )/24_dp )
2075 :
2076 0 : END FUNCTION SOLAR_ANGLE
2077 : !EOC
2078 : !------------------------------------------------------------------------------
2079 : ! Harmonized Emissions Component (HEMCO) !
2080 : !------------------------------------------------------------------------------
2081 : !BOP
2082 : !
2083 : ! !IROUTINE: Get_Gamma_T_LI
2084 : !
2085 : ! !DESCRIPTION: Function Get\_Gamma\_T\_LI computes the temperature activity
2086 : ! factor (GAMMA\_T\_LI) for the light-independent fraction of emissions
2087 : !\\
2088 : !\\
2089 : ! !INTERFACE:
2090 : !
2091 0 : FUNCTION GET_GAMMA_T_LI( T, BETA ) &
2092 : RESULT( GAMMA_T_LI )
2093 : !
2094 : ! !INPUT PARAMETERS:
2095 : !
2096 : ! Current leaf temperature, the surface air temperature field (TS)
2097 : ! is assumed equivalent to the leaf temperature over forests.
2098 : REAL(hp), INTENT(IN) :: T
2099 :
2100 : ! Temperature factor per species
2101 : REAL(hp), INTENT(IN) :: BETA
2102 : !
2103 : ! !RETURN VALUE:
2104 : !
2105 : ! Activity factor for the light-independent fraction of emissions
2106 : REAL(hp) :: GAMMA_T_LI
2107 : !
2108 : ! !REMARKS:
2109 : ! GAMMA_T = exp[Beta*(T - T_Standard)]
2110 : ! .
2111 : ! where Beta = temperature dependent parameter
2112 : ! Ts = standard temperature (normally 303K, 30C)
2113 : ! .
2114 : ! Note: If T = Ts (i.e. standard conditions) then GAMMA_T = 1
2115 : !
2116 : ! References (see above for full citations):
2117 : ! ============================================================================
2118 : ! (1 ) Guenther et al, 2006
2119 : ! (2 ) Guenther et al, MEGAN user mannual 2007-08
2120 : ! (3 ) Guenther et al., GMD 2012 and MEGANv2.1 source code.
2121 : !
2122 : ! !REVISION HISTORY:
2123 : ! (1 ) Original code by Michael Barkley (2009).
2124 : ! See https://github.com/geoschem/hemco for complete history
2125 : !EOP
2126 : !------------------------------------------------------------------------------
2127 : !BOC
2128 : !
2129 : ! !DEFINED PARAMETERS:
2130 : !
2131 : ! Standard reference temperature [K]
2132 : REAL*8, PARAMETER :: T_STANDARD = 303.d0
2133 :
2134 : !=================================================================
2135 : ! GET_GAMMAT_T_LI begins here!
2136 : !=================================================================
2137 :
2138 0 : GAMMA_T_LI = EXP( BETA * ( T - T_STANDARD ) )
2139 :
2140 0 : END FUNCTION GET_GAMMA_T_LI
2141 : !EOC
2142 : !------------------------------------------------------------------------------
2143 : ! Harmonized Emissions Component (HEMCO) !
2144 : !------------------------------------------------------------------------------
2145 : !BOP
2146 : !
2147 : ! !IROUTINE: Get_Gamma_T_LD
2148 : !
2149 : ! !DESCRIPTION: Function Get\_Gamma\_T\_LD computes the temperature
2150 : ! sensitivity for the light-dependent fraction of emissions.
2151 : !\\
2152 : !\\
2153 : ! !INTERFACE:
2154 : !
2155 0 : FUNCTION GET_GAMMA_T_LD( T, PT_15, PT_1, CT1, CEO ) &
2156 : RESULT( GAMMA_T_LD )
2157 : !
2158 : ! !INPUT PARAMETERS:
2159 : !
2160 : ! Current leaf temperature [K], the surface air temperature field (TS)
2161 : ! is assumed equivalent to the leaf temperature over forests.
2162 : REAL(hp), INTENT(IN) :: T
2163 :
2164 : ! Average leaf temperature over the past 15 days
2165 : REAL(sp), INTENT(IN) :: PT_15
2166 :
2167 : ! Average leaf temperature over the past arbitray day(s).
2168 : ! This is not used at present
2169 : REAL(sp), INTENT(IN) :: PT_1
2170 :
2171 : ! Compound-specific parameters for light-dependent temperature activity
2172 : ! factor (dbm, 6/21/2012)
2173 : REAL(hp), INTENT(IN) :: CT1, CEO
2174 : !
2175 : ! !RETURN VALUE:
2176 : !
2177 : ! Temperature activity factor for the light-dependent fraction of
2178 : ! emissions
2179 : REAL(hp) :: GAMMA_T_LD
2180 : !
2181 : ! !REMARKS:
2182 : ! References (see above for full citations):
2183 : ! (1 ) Guenther et al, 1995
2184 : ! (2 ) Guenther et al, 2006
2185 : ! (3 ) Guenther et al, MEGAN v2.1 user mannual 2007-08
2186 : ! (4 ) Guenther et al., GMD 2012 and MEGANv2.1 source code.
2187 : !
2188 : ! !REVISION HISTORY:
2189 : ! (1 ) Includes the latest MEGAN v2.1 temperature algorithm (mpb, 2009).
2190 : ! Note, this temp-dependence is the same for the PCEEA & hybrid models.
2191 : ! See https://github.com/geoschem/hemco for complete history
2192 : !EOP
2193 : !------------------------------------------------------------------------------
2194 : !BOC
2195 : !
2196 : ! !LOCAL VARIABLES:
2197 : !
2198 : REAL(hp) :: C_T, CT2
2199 : REAL(hp) :: E_OPT, T_OPT, X
2200 : !
2201 : ! !DEFINED PARAMETERS:
2202 : !
2203 : ! Ideal gas constant [J/mol/K]
2204 : REAL(hp), PARAMETER :: R = 8.3144598e-3_hp
2205 :
2206 : !=================================================================
2207 : ! GET_GAMMA_T_LD begins here!
2208 : !=================================================================
2209 0 : E_OPT = CEO * EXP( 0.08_hp * ( PT_15 - 2.97e2_hp ) )
2210 0 : T_OPT = 3.13e2_hp + ( 6.0e-1_hp * ( PT_15 - 2.97e2_hp ) )
2211 0 : CT2 = 200.0_hp
2212 :
2213 : ! Variable related to temperature
2214 0 : X = ( 1.0_hp/T_OPT - 1.0_hp/T ) / R
2215 :
2216 : ! C_T: Effect of temperature on leaf BVOC emission, including
2217 : ! effect of average temperature over previous 15 days, based on
2218 : ! Eq 5a, 5b, 5c from Guenther et al, 1999.
2219 : C_T = E_OPT * CT2 * EXP( CT1 * X ) / &
2220 0 : ( CT2 - CT1 * ( 1.0_hp - EXP( CT2 * X ) ) )
2221 :
2222 : ! Hourly emission activity = C_T
2223 : ! Prevent negative values
2224 0 : GAMMA_T_LD = MAX( C_T, 0.0_hp )
2225 :
2226 0 : END FUNCTION GET_GAMMA_T_LD
2227 : !EOC
2228 : !------------------------------------------------------------------------------
2229 : ! Harmonized Emissions Component (HEMCO) !
2230 : !------------------------------------------------------------------------------
2231 : !BOP
2232 : !
2233 : ! !IROUTINE: Get_Gamma_Lai
2234 : !
2235 : ! !DESCRIPTION: Function Get\_Gamma\_Lai computes the gamma exchange activity
2236 : ! factor which is sensitive to leaf area (= GAMMA\_LAI).
2237 : !\\
2238 : !\\
2239 : ! !INTERFACE:
2240 : !
2241 0 : FUNCTION GET_GAMMA_LAI( CMLAI, BIDIREXCH ) &
2242 : RESULT( GAMMA_LAI )
2243 : !
2244 : ! !INPUT PARAMETERS:
2245 : !
2246 : REAL(hp), INTENT(IN) :: CMLAI ! Current month's LAI [cm2/cm2]
2247 : LOGICAL, INTENT(IN) :: BIDIREXCH ! Logical flag indicating whether
2248 : ! the compound undergoes bidirectional
2249 : ! exchange
2250 : !
2251 : ! !RETURN VALUE:
2252 : !
2253 : REAL(hp) :: GAMMA_LAI
2254 : !
2255 : ! !REMARKS:
2256 : ! References (see above for full citations):
2257 : ! ============================================================================
2258 : ! (1 ) Guenther et al, 2006
2259 : ! (2 ) Guenther et al, MEGAN user mannual 2007-08
2260 : ! (3 ) Guenther et al., GMD 2012 and MEGANv2.1 source code.
2261 : !
2262 : ! !REVISION HISTORY:
2263 : ! (1 ) Original code by Dorian Abbot (9/2003). Modified for the standard
2264 : ! code by May Fu (11/2004)
2265 : ! See https://github.com/geoschem/hemco for complete history
2266 : !EOP
2267 : !------------------------------------------------------------------------------
2268 : !BOC
2269 :
2270 : ! Formulation for birectional compounds is as described for
2271 : ! ALD2 in Millet et al., ACP 2010
2272 0 : IF ( BIDIREXCH ) THEN
2273 :
2274 0 : IF ( CMLAI <= 6.0_hp) THEN
2275 :
2276 : ! if lai less than 2:
2277 0 : IF ( CMLAI <= 2.0_hp ) THEN
2278 0 : GAMMA_LAI = 0.5_hp * CMLAI
2279 :
2280 : ! if between 2 and 6:
2281 : ELSE
2282 0 : GAMMA_LAI = 1.0_hp - 0.0625_hp * ( CMLAI - 2.0_hp )
2283 : END IF
2284 :
2285 : ELSE
2286 : ! keep at 0.75 for LAI > 6
2287 : GAMMA_LAI = 0.75_hp
2288 : END IF
2289 :
2290 : ! For all other compounds use the standard gamma_lai formulation
2291 : ELSE
2292 0 : GAMMA_LAI = 0.49_hp * CMLAI / SQRT( 1.0_hp + 0.2_hp * CMLAI*CMLAI)
2293 : ENDIF
2294 :
2295 0 : END FUNCTION GET_GAMMA_LAI
2296 : !EOC
2297 : !------------------------------------------------------------------------------
2298 : ! Harmonized Emissions Component (HEMCO) !
2299 : !------------------------------------------------------------------------------
2300 : !BOP
2301 : !
2302 : ! !IROUTINE: Get_Gamma_Age
2303 : !
2304 : ! !DESCRIPTION: Function Get\_Gamma\_Age computes the gamma exchange
2305 : ! activity factor which is sensitive to leaf age (= Gamma\_Age).
2306 : !\\
2307 : !\\
2308 : ! !INTERFACE:
2309 : !
2310 0 : FUNCTION GET_GAMMA_AGE( CMLAI, PMLAI, DBTWN, TT, AN, AG, AM, AO ) &
2311 : RESULT( GAMMA_AGE )
2312 : !
2313 : ! !INPUT PARAMETERS:
2314 : !
2315 : REAL(hp), INTENT(IN) :: CMLAI ! Current month's LAI [cm2/cm2]
2316 : REAL(hp), INTENT(IN) :: PMLAI ! Previous months LAI [cm2/cm2]
2317 : REAL(hp), INTENT(IN) :: DBTWN ! Number of days between
2318 : REAL(sp), INTENT(IN) :: TT ! Daily average temperature [K]
2319 : REAL(hp), INTENT(IN) :: AN ! Relative emiss factor (new leaves)
2320 : REAL(hp), INTENT(IN) :: AG ! Relative emiss factor (growing leaves)
2321 : REAL(hp), INTENT(IN) :: AM ! Relative emiss factor (mature leaves)
2322 : REAL(hp), INTENT(IN) :: AO ! Relative emiss factor (old leaves)
2323 : !
2324 : ! !RETURN VALUE:
2325 : !
2326 : REAL(hp) :: GAMMA_AGE ! Activity factor
2327 : !
2328 : ! !REMARKS:
2329 : ! References (see above for full citations):
2330 : ! ============================================================================
2331 : ! (1 ) Guenther et al, 2006
2332 : ! (2 ) Guenther et al, MEGAN user mannual 2007-08
2333 : ! (3 ) Guenther et al., GMD 2012 and MEGANv2.1 source code
2334 : !
2335 : ! !REVISION HISTORY:
2336 : ! (1 ) Original code by Dorian Abbot (9/2003). Modified for the standard
2337 : ! code by May Fu (11/2004)
2338 : ! See https://github.com/geoschem/hemco for complete history
2339 : !EOP
2340 : !------------------------------------------------------------------------------
2341 : !BOC
2342 : !
2343 : ! !LOCAL VARIABLES:
2344 : !
2345 : REAL(hp) :: FNEW ! Fraction of new leaves in canopy
2346 : REAL(hp) :: FGRO ! Fraction of growing leaves
2347 : REAL(hp) :: FMAT ! Fraction of mature leaves
2348 : REAL(hp) :: FOLD ! Fraction of old leaves
2349 :
2350 : ! TI: number of days after budbreak required to induce emissions
2351 : REAL(hp) :: TI
2352 :
2353 : ! TM: number of days after budbreak required to reach peak emissions
2354 : REAL(hp) :: TM
2355 :
2356 : !=================================================================
2357 : ! GET_GAMMA_AGE begins here!
2358 : !=================================================================
2359 :
2360 : !-----------------------
2361 : ! Compute TI and TM
2362 : ! (mpb,2009)
2363 : !-----------------------
2364 :
2365 0 : IF ( TT <= 303.0_hp ) THEN
2366 0 : TI = 5.0_hp + 0.7_hp * ( 300.0_hp - TT )
2367 0 : ELSEIF ( TT > 303.0_hp ) THEN
2368 0 : TI = 2.9_hp
2369 : ENDIF
2370 0 : TM = 2.3_hp * TI
2371 :
2372 : !-----------------------
2373 : ! Compute GAMMA_AGE
2374 : !-----------------------
2375 :
2376 0 : IF ( CMLAI == PMLAI ) THEN !(i.e. LAI stays the same)
2377 :
2378 : FNEW = 0.0_hp
2379 : FGRO = 0.1_hp
2380 : FMAT = 0.8_hp
2381 : FOLD = 0.1_hp
2382 :
2383 0 : ELSE IF ( CMLAI > PMLAI ) THEN !(i.e. LAI has INcreased)
2384 :
2385 : ! Calculate Fnew
2386 0 : IF ( DBTWN > TI ) THEN
2387 0 : FNEW = ( TI / DBTWN ) * ( 1.0_hp - PMLAI / CMLAI )
2388 : ELSE
2389 0 : FNEW = 1.0_hp - ( PMLAI / CMLAI )
2390 : ENDIF
2391 :
2392 : ! Calculate FMAT
2393 0 : IF ( DBTWN > TM ) THEN
2394 : FMAT = ( PMLAI / CMLAI ) + &
2395 0 : (( DBTWN - TM ) / DBTWN )*( 1.0_hp - PMLAI / CMLAI )
2396 : ELSE
2397 0 : FMAT = ( PMLAI / CMLAI )
2398 : ENDIF
2399 :
2400 : ! Calculate Fgro and Fold
2401 0 : FGRO = 1.0_hp - FNEW - FMAT
2402 0 : FOLD = 0.0_hp
2403 :
2404 : ELSE ! This is the case if PMLAI > CMLAI (i.e. LAI has DEcreased)
2405 :
2406 0 : FNEW = 0.0_hp
2407 0 : FGRO = 0.0_hp
2408 0 : FOLD = ( PMLAI - CMLAI ) / PMLAI
2409 0 : FMAT = 1.0_hp - FOLD
2410 :
2411 : ENDIF
2412 :
2413 : ! Age factor
2414 0 : GAMMA_AGE = FNEW * AN + FGRO * AG + FMAT * AM + FOLD * AO
2415 :
2416 : ! Prevent negative values
2417 0 : GAMMA_AGE = MAX( GAMMA_AGE , 0.0_hp )
2418 :
2419 0 : END FUNCTION GET_GAMMA_AGE
2420 : !EOC
2421 : !------------------------------------------------------------------------------
2422 : ! Harmonized Emissions Component (HEMCO) !
2423 : !------------------------------------------------------------------------------
2424 : !BOP
2425 : !
2426 : ! !IROUTINE: get_gamma_sm
2427 : !
2428 : ! !DESCRIPTION: Function GET\_GAMMA\_SM computes activity factor for soil
2429 : ! moisture
2430 : !\\
2431 : !\\
2432 : ! !INTERFACE:
2433 : !
2434 0 : FUNCTION GET_GAMMA_SM( ExtState, I, J, CMPD ) &
2435 : RESULT( GAMMA_SM )
2436 : !
2437 : ! !INPUT PARAMETERS:
2438 : !
2439 : TYPE(Ext_State), POINTER :: ExtState
2440 : INTEGER, INTENT(IN) :: I, J ! GEOS-Chem lon & lat indices
2441 : CHARACTER(LEN=*), INTENT(IN) :: CMPD ! Compound name (dbm, 6/21/2012)
2442 :
2443 : ! !RETURN VALUE:
2444 : !
2445 : REAL(hp) :: GAMMA_SM ! Activity factor
2446 : !
2447 : ! !REMARKS:
2448 : ! References (see above for full citations):
2449 : ! ============================================================================
2450 : ! (1 ) Guenther et al, ACP 2006
2451 : ! (2 ) Guenther et al., GMD 2012 and MEGANv2.1 source code
2452 : !
2453 : ! !REVISION HISTORY:
2454 : ! (1 ) Created by dbm (6/2012). We are not currently using a soil moisture
2455 : ! effect for isoprene. For all compounds other than acetaldehyde and
2456 : ! ethanol, gamma_sm =1 presently.
2457 : ! See https://github.com/geoschem/hemco for complete history
2458 : !EOP
2459 : !------------------------------------------------------------------------------
2460 : !BOC
2461 : !
2462 : ! !LOCAL VARIABLES:
2463 : !
2464 : REAL(hp) :: GWETROOT
2465 :
2466 : !=================================================================
2467 : ! GET_GAMMA_SM begins here!
2468 : !=================================================================
2469 :
2470 : ! By default gamma_sm is 1.0
2471 0 : GAMMA_SM = 1.0_hp
2472 :
2473 : ! Error trap: GWETROOT must be between 0.0 and 1.0 (ckeller, 4/16/15)
2474 0 : GWETROOT = MIN(MAX(ExtState%GWETROOT%Arr%Val(I,J),0.0_hp),1.0_hp)
2475 :
2476 0 : IF ( TRIM( CMPD ) == 'ALD2' .OR. TRIM ( CMPD ) == 'EOH' ) THEN
2477 :
2478 : ! GWETROOT = degree of saturation or wetness in the root-zone
2479 : ! (top meter of soil). This is defined as the ratio of the volumetric
2480 : ! soil moisture to the porosity. We use a soil moisture activity factor
2481 : ! for ALD2 to account for stimulation of emission by flooding.
2482 : ! (Millet et al., ACP 2010)
2483 : ! Constant value of 1.0 for GWETROOT = 0-0.9, increasing linearly to
2484 : ! 3.0 at GWETROOT =1.
2485 0 : GAMMA_SM = MAX( 20.0_hp * GWETROOT - 17.0_hp, 1.0_hp)
2486 :
2487 : ENDIF
2488 :
2489 0 : END FUNCTION GET_GAMMA_SM
2490 : !EOC
2491 : !------------------------------------------------------------------------------
2492 : ! Harmonized Emissions Component (HEMCO) !
2493 : !------------------------------------------------------------------------------
2494 : !BOP
2495 : !
2496 : ! !IROUTINE: get_gamma_co2
2497 : !
2498 : ! !DESCRIPTION: Function GET\_GAMMA\_CO2 computes the CO2 activity factor
2499 : ! associated with CO2 inhibition of isoprene emission. Called from
2500 : ! GET\_MEGAN\_EMISSIONS only.
2501 : !\\
2502 : !\\
2503 : ! !INTERFACE:
2504 : !
2505 0 : FUNCTION GET_GAMMA_CO2( CO2a ) &
2506 : RESULT( GAMMA_CO2 )
2507 : !
2508 : ! !INPUT PARAMETERS:
2509 : REAL(hp), INTENT(IN) :: CO2a ! Atmospheric CO2 conc [ppmv]
2510 : !
2511 : ! !RETURN VALUE:
2512 : REAL(hp) :: GAMMA_CO2 ! CO2 activity factor [unitless]
2513 : !
2514 : ! !LOCAL VARIABLES:
2515 : REAL(hp) :: CO2i ! Intercellular CO2 conc [ppmv]
2516 : REAL(hp) :: ISMAXi ! Asymptote for intercellular CO2
2517 : REAL(hp) :: HEXPi ! Exponent for intercellular CO2
2518 : REAL(hp) :: CSTARi ! Scaling coef for intercellular CO2
2519 : REAL(hp) :: ISMAXa ! Asymptote for atmospheric CO2
2520 : REAL(hp) :: HEXPa ! Exponent for atmospheric CO2
2521 : REAL(hp) :: CSTARa ! Scaling coef for atmospheric CO2
2522 : LOGICAL :: LPOSSELL ! Use Possell & Hewitt (2011)?
2523 : LOGICAL :: LWILKINSON ! Use Wilkinson et al. (2009)?
2524 : !
2525 : ! !REMARKS:
2526 : ! References:
2527 : ! ============================================================================
2528 : ! (1 ) Heald, C. L., Wilkinson, M. J., Monson, R. K., Alo, C. A.,
2529 : ! Wang, G. L., and Guenther, A.: Response of isoprene emission
2530 : ! to ambient co(2) changes and implications for global budgets,
2531 : ! Global Change Biology, 15, 1127-1140, 2009.
2532 : ! (2 ) Wilkinson, M. J., Monson, R. K., Trahan, N., Lee, S., Brown, E.,
2533 : ! Jackson, R. B., Polley, H. W., Fay, P. A., and Fall, R.: Leaf
2534 : ! isoprene emission rate as a function of atmospheric CO2
2535 : ! concentration, Global Change Biology, 15, 1189-1200, 2009.
2536 : ! (3 ) Possell, M., and Hewitt, C. N.: Isoprene emissions from plants
2537 : ! are mediated by atmospheric co2 concentrations, Global Change
2538 : ! Biology, 17, 1595-1610, 2011.
2539 : !
2540 : ! !REVISION HISTORY:
2541 : ! (1 ) Implemented in the standard code by A. Tai (Jun 2012).
2542 : ! See https://github.com/geoschem/hemco for complete history
2543 : !EOP
2544 : !------------------------------------------------------------------------------
2545 : !BOC
2546 :
2547 : !----------------------------------------------------------
2548 : ! Choose between two alternative CO2 inhibition schemes
2549 : !----------------------------------------------------------
2550 :
2551 : ! Empirical relationship of Possell & Hewitt (2011) based on nine
2552 : ! experimental studies including Wilkinson et al. (2009). This is
2553 : ! especially recommended for sub-ambient CO2 concentrations:
2554 0 : LPOSSELL = .TRUE. ! Default option
2555 :
2556 : ! Semi-process-based parameterization of Wilkinson et al. (2009),
2557 : ! taking into account of sensitivity to intercellular CO2
2558 : ! fluctuation, which is here set as a constant fraction of
2559 : ! atmospheric CO2:
2560 0 : LWILKINSON = .FALSE. ! Set .TRUE. only if LPOSSELL = .FALSE.
2561 :
2562 : !-----------------------
2563 : ! Compute GAMMA_CO2
2564 : !-----------------------
2565 :
2566 : IF ( LPOSSELL ) THEN
2567 :
2568 : ! Use empirical relationship of Possell & Hewitt (2011):
2569 0 : GAMMA_CO2 = 8.9406_hp / ( 1.0_hp + 8.9406_hp * 0.0024_hp * CO2a )
2570 :
2571 : ELSEIF ( LWILKINSON ) THEN
2572 :
2573 : ! Use parameterization of Wilkinson et al. (2009):
2574 :
2575 : ! Parameters for intercellular CO2 using linear interpolation:
2576 : IF ( CO2a <= 600.0_hp ) THEN
2577 : ISMAXi = 1.036_hp - (1.036_hp - 1.072_hp) / &
2578 : (600.0_hp - 400.0_hp) * (600.0_hp - CO2a)
2579 : HEXPi = 2.0125_hp - (2.0125_hp - 1.7000_hp) / &
2580 : (600.0_hp - 400.0_hp) * (600.0_hp - CO2a)
2581 : CSTARi = 1150.0_hp - (1150.0_hp - 1218.0_hp) / &
2582 : (600.0_hp - 400.0_hp) * (600.0_hp - CO2a)
2583 : ELSEIF ( CO2a > 600.0_hp .AND. CO2a < 800.0_hp ) THEN
2584 : ISMAXi = 1.046_hp - (1.046_hp - 1.036_hp) / &
2585 : (800.0_hp - 600.0_hp) * (800.0_hp - CO2a)
2586 : HEXPi = 1.5380_hp - (1.5380_hp - 2.0125_hp) / &
2587 : (800.0_hp - 600.0_hp) * (800.0_hp - CO2a)
2588 : CSTARi = 2025.0_hp - (2025.0_hp - 1150.0_hp) / &
2589 : (800.0_hp - 600.0_hp) * (800.0_hp - CO2a)
2590 : ELSE
2591 : ISMAXi = 1.014_hp - (1.014_hp - 1.046_hp) / &
2592 : (1200.0_hp - 800.0_hp) * (1200.0_hp - CO2a)
2593 : HEXPi = 2.8610_hp - (2.8610_hp - 1.5380_hp) / &
2594 : (1200.0_hp - 800.0_hp) * (1200.0_hp - CO2a)
2595 : CSTARi = 1525.0_hp - (1525.0_hp - 2025.0_hp) / &
2596 : (1200.0_hp - 800.0_hp) * (1200.0_hp - CO2a)
2597 : ENDIF
2598 :
2599 : ! Parameters for atmospheric CO2:
2600 : ISMAXa = 1.344_hp
2601 : HEXPa = 1.4614_hp
2602 : CSTARa = 585.0_hp
2603 :
2604 : ! For now, set CO2_Ci = 0.7d0 * CO2_Ca as recommended by Heald
2605 : ! et al. (2009):
2606 : CO2i = 0.7_hp * CO2a
2607 :
2608 : ! Compute GAMMA_CO2:
2609 : GAMMA_CO2 = ( ISMAXi - ISMAXi * CO2i**HEXPi / &
2610 : ( CSTARi**HEXPi + CO2i**HEXPi ) ) &
2611 : * ( ISMAXa - ISMAXa * ( 0.7_hp * CO2a )**HEXPa / &
2612 : ( CSTARa**HEXPa + ( 0.7_hp * CO2a )**HEXPa ) )
2613 :
2614 : ELSE
2615 :
2616 : ! No CO2 inhibition scheme is used; GAMMA_CO2 set to unity:
2617 : GAMMA_CO2 = 1.0_hp
2618 :
2619 : ENDIF
2620 :
2621 0 : END FUNCTION GET_GAMMA_CO2
2622 : !EOC
2623 : !------------------------------------------------------------------------------
2624 : ! Harmonized Emissions Component (HEMCO) !
2625 : !------------------------------------------------------------------------------
2626 : !BOP
2627 : !
2628 : ! !IROUTINE: CALC_NORM_FAC
2629 : !
2630 : ! !DESCRIPTION: Function CALC\_NORM\_FAC calculates the normalization factor
2631 : ! needed to compute emissions. Called from GET\_MEGAN\_EMISSIONS.
2632 : !\\
2633 : !\\
2634 : ! !INTERFACE:
2635 : !
2636 0 : SUBROUTINE CALC_NORM_FAC( Inst, RC )
2637 : !
2638 : ! !INPUT PARAMETERS:
2639 : !
2640 : TYPE(MyInst), POINTER :: Inst
2641 : !
2642 : ! !INPUT/OUTPUT PARAMETERS
2643 : !
2644 : INTEGER, INTENT(INOUT) :: RC
2645 : !
2646 : ! !REMARKS:
2647 : ! References (see above for full citations):
2648 : ! ============================================================================
2649 : ! (1 ) Guenther et al, (GMD 2012) and associated MEGANv2.1 source code
2650 : !
2651 : ! !REVISION HISTORY:
2652 : ! (1 ) Created by dbm 11/2012. We calculate only 1 normalization factor for all
2653 : ! compounds based on the isoprene gamma values. Formally there should be a
2654 : ! different normalization factor for each compound, but we are following
2655 : ! Alex Guenther's approach here and the MEGAN source code.
2656 : ! "Hi Dylan, sorry for being so slow to get back to you.
2657 : ! Since the change is only a few percent or less, I didn't
2658 : ! bother to assign a different normalization factor to each
2659 : ! compound. Since the MEGAN canopy environment model also
2660 : ! has 8 different canopy types (tropical broadleaf tree,
2661 : ! conifer tree, etc.) then to be correct we should have a
2662 : ! different CCE for each canopy type for each compound class
2663 : ! (which would be 160 slightly different values of CCE)."
2664 : ! See https://github.com/geoschem/hemco for complete history
2665 : !EOP
2666 : !------------------------------------------------------------------------------
2667 : !BOC
2668 : !
2669 : ! !LOCAL VARIABLES:
2670 : !
2671 : REAL(hp) :: PAC_DAILY, PHI, BBB, AAA, GAMMA_P_STANDARD
2672 : REAL(hp) :: GAMMA_T_LI_STANDARD
2673 : REAL(hp) :: GAMMA_SM_STANDARD
2674 : REAL(hp) :: CMLAI, GAMMA_LAI_STANDARD
2675 : REAL(hp) :: GAMMA_AGE_STANDARD
2676 : REAL(hp) :: PT_15, T, R, CEO, CT1, E_OPT, T_OPT, CT2, X
2677 : REAL(hp) :: GAMMA_T_LD_STANDARD
2678 : REAL(hp) :: LDF, GAMMA_STANDARD
2679 :
2680 : !-----------------------------------------------------------------
2681 : ! CALC_NORM_FAC
2682 : !-----------------------------------------------------------------
2683 :
2684 : ! -----------------
2685 : ! GAMMA_P for standard conditions
2686 : ! -----------------
2687 : ! Based on Eq. 11b from Guenther et al., 2006
2688 : ! Using standard conditions of phi = 0.6, solar angle of 60 deg,
2689 : ! and P_daily = 400
2690 : ! Note corrigendum for Eq. 11b in that paper, should be a
2691 : ! minus sign before the 0.9.
2692 0 : PAC_DAILY = 400.0_hp
2693 0 : PHI = 0.6_hp
2694 0 : BBB = 1.0_hp + 0.0005_hp *( PAC_DAILY - 400.0_hp )
2695 0 : AAA = ( 2.46_hp * BBB * PHI ) - ( 0.9_hp * PHI**2 )
2696 : ! sin(60) = 0.866
2697 0 : GAMMA_P_STANDARD = 0.866_hp * AAA
2698 :
2699 : ! -----------------
2700 : ! GAMMA_T_LI for standard conditions
2701 : ! -----------------
2702 : ! gamma_t_li = EXP( Beta * ( T - T_Standard ) )
2703 : ! This is 1.0 for T = T_Standard
2704 0 : GAMMA_T_LI_STANDARD = 1.0_hp
2705 :
2706 : ! -----------------
2707 : ! GAMMA_SM for standard conditions
2708 : ! -----------------
2709 : ! Standard condition is soil moisture = 0.3 m^3/m^3
2710 : ! GAMMA_SM = 1.0 for all compounds under this condition
2711 0 : GAMMA_SM_STANDARD = 1.0_hp
2712 :
2713 : ! -----------------
2714 : ! GAMMA_LAI for standard conditions
2715 : ! -----------------
2716 : ! Standard condition is LAI = 5
2717 0 : CMLAI = 5.0_hp
2718 0 : GAMMA_LAI_STANDARD = 0.49_hp * CMLAI / SQRT( 1.0_hp + 0.2_hp * CMLAI*CMLAI )
2719 :
2720 : ! -----------------
2721 : ! GAMMA_AGE for standard conditions
2722 : ! -----------------
2723 : ! Standard condition is 0% new, 10% growing, 80% mature, 10% old foliage
2724 : ! Isoprene uses A_NEW = 0.05d0, A_GRO = 0.6d0, A_MAT = 1.d0, A_OLD = 0.9d0
2725 0 : GAMMA_AGE_STANDARD = 0.1_hp*0.6_hp + 0.8_hp*1.0_hp + 0.1_hp*0.9_hp
2726 :
2727 : ! -----------------
2728 : ! GAMMA_T_LD for standard conditions
2729 : ! -----------------
2730 : ! Standard condition is
2731 : ! PT_15 = average leaf temp over past 24-240 hours = 297K
2732 : ! T = air temperature = 303K
2733 0 : PT_15 = 297.0_hp
2734 0 : T = 303.0_hp
2735 0 : R = 8.3144598e-3_hp
2736 : ! parameters for isoprene
2737 0 : CEO = 2.0_hp
2738 0 : CT1 = 95.0_hp
2739 :
2740 0 : E_OPT = CEO * EXP( 0.08_hp * ( PT_15 - 2.97e2_hp ) )
2741 0 : T_OPT = 3.13e2_hp + ( 6.0e-1_hp * ( PT_15 - 2.97e2_hp ) )
2742 0 : CT2 = 200.0_hp
2743 :
2744 : ! Variable related to temperature
2745 0 : X = ( 1.0_hp/T_OPT - 1.0_hp/T ) / R
2746 :
2747 : GAMMA_T_LD_STANDARD = E_OPT * CT2 * EXP( CT1 * X ) / &
2748 0 : ( CT2 - CT1 * ( 1.0_hp - EXP( CT2 * X ) ) )
2749 :
2750 : ! -----------------
2751 : ! Overall GAMMA_STANDARD
2752 : ! -----------------
2753 : ! LDF = 1d0 for isoprene
2754 0 : LDF = 1.0_hp
2755 : GAMMA_STANDARD = &
2756 : GAMMA_AGE_STANDARD * GAMMA_SM_STANDARD * GAMMA_LAI_STANDARD &
2757 : * ((1.0_hp - LDF) * GAMMA_T_LI_STANDARD &
2758 0 : + (LDF * GAMMA_P_STANDARD * GAMMA_T_LD_STANDARD))
2759 : ! This ends up being 1.0101081.
2760 :
2761 0 : Inst%NORM_FAC = 1.0_hp / GAMMA_STANDARD
2762 :
2763 : ! Return w/ success
2764 0 : RC = HCO_SUCCESS
2765 :
2766 0 : END SUBROUTINE CALC_NORM_FAC
2767 : !EOC
2768 :
2769 : !------------------------------------------------------------------------------
2770 : ! Harmonized Emissions Component (HEMCO) !
2771 : !------------------------------------------------------------------------------
2772 : !BOP
2773 : !
2774 : ! !IROUTINE: Fill_Restart_Vars
2775 : !
2776 : ! !DESCRIPTION: Subroutine FILL\_RESTART\_VARS fills the megan restart
2777 : ! variables.
2778 : !\\
2779 : !\\
2780 : ! !INTERFACE:
2781 : !
2782 0 : SUBROUTINE FILL_RESTART_VARS( HcoState, ExtState, Inst, RC )
2783 : !
2784 : ! !USES:
2785 : !
2786 : USE HCO_Restart_Mod, ONLY : HCO_RestartGet
2787 : !
2788 : ! !INPUT PARAMETERS:
2789 : !
2790 : TYPE(HCO_State), POINTER :: HcoState
2791 : TYPE(Ext_State), POINTER :: ExtState
2792 : TYPE(MyInst), POINTER :: Inst
2793 : !
2794 : ! !INPUT/OUTPUT PARAMETERS:
2795 : !
2796 : INTEGER, INTENT(INOUT) :: RC
2797 : !
2798 : ! !REVISION HISTORY:
2799 : ! 19 Dec 2014 - C. Keller - Initial version
2800 : ! See https://github.com/geoschem/hemco for complete history
2801 : !EOP
2802 : !------------------------------------------------------------------------------
2803 : !BOC
2804 : !
2805 : ! !LOCAL VARIABLES:
2806 : !
2807 : INTEGER :: I
2808 : LOGICAL :: FND
2809 :
2810 : !=================================================================
2811 : ! FILL_RESTART_VARS begins here!
2812 : !=================================================================
2813 :
2814 : ! On first call, see if there are restart variables available for
2815 : ! historic values of temperature and irradiation. If so, fill the
2816 : ! daily arrays with those average values to start with. If not,
2817 : ! simply use the current values.
2818 : ! The same procedure is applied to the 15 day average values. For
2819 : ! temperature, we also restart previous day temperature so that
2820 : ! we can determine a trend in the daily average temperatures
2821 : ! (between the long term daily averages and the most recent daily
2822 : ! average).
2823 : ! We now first call HCO_CopyFromInt_ESMF to check if the variable
2824 : ! is found in the (ESMF) internal state object. In an non-ESMF
2825 : ! environment, this call will always return FND=.FALSE.
2826 : ! (ckeller, 3/9/15).
2827 :
2828 : !-----------------------------------------------------------------
2829 : ! LAI
2830 : !-----------------------------------------------------------------
2831 : CALL HCO_RestartGet( HcoState, 'LAI_PREVDAY', &
2832 0 : Inst%LAI_PREVDAY, RC, FILLED=FND )
2833 :
2834 : ! Default value
2835 0 : IF ( .NOT. FND ) THEN
2836 0 : Inst%LAI_PREVDAY = ExtState%LAI%Arr%Val
2837 : ENDIF
2838 :
2839 : !-----------------------------------------------------------------
2840 : ! DIFFUSE RADIATION ( PARDF )
2841 : !-----------------------------------------------------------------
2842 :
2843 : ! Temperature over last 24 hours
2844 : CALL HCO_RestartGet( HcoState, 'T_PREVDAY', &
2845 0 : Inst%T_LAST24H, RC, DefVal = 288.15_sp )
2846 :
2847 : ! Temperature over last X days
2848 : CALL HCO_RestartGet( HcoState, 'T_DAVG', &
2849 0 : Inst%T_LASTXDAYS, RC, DefVal = 288.15_sp )
2850 :
2851 : ! Direct radiation (PARDR) over last X days
2852 : CALL HCO_RestartGet( HcoState, 'PARDR_DAVG', &
2853 0 : Inst%PARDR_LASTXDAYS, RC, DefVal = 30.0_sp )
2854 :
2855 : ! Diffuse radiation (PARDF) over last X days
2856 : CALL HCO_RestartGet( HcoState, 'PARDF_DAVG', &
2857 0 : Inst%PARDF_LASTXDAYS, RC, DefVal = 48.0_sp )
2858 :
2859 : ! Return w/ success
2860 0 : RC = HCO_SUCCESS
2861 :
2862 0 : END SUBROUTINE FILL_RESTART_VARS
2863 : !EOC
2864 : !------------------------------------------------------------------------------
2865 : ! Harmonized Emissions Component (HEMCO) !
2866 : !------------------------------------------------------------------------------
2867 : !BOP
2868 : !
2869 : ! !IROUTINE: CALC_AEF
2870 : !
2871 : ! !DESCRIPTION: Subroutine CALC\_AEF reads Emission Factors for all
2872 : ! biogenic VOC species from disk.
2873 : !\\
2874 : !\\
2875 : ! !INTERFACE:
2876 : !
2877 0 : SUBROUTINE CALC_AEF( HcoState, ExtState, Inst, RC )
2878 : !
2879 : ! !USES:
2880 : !
2881 : USE HCO_EMISLIST_MOD, ONLY : HCO_GetPtr
2882 : USE HCO_CALC_MOD, ONLY : HCO_EvalFld
2883 : !
2884 : ! !INPUT PARAMETERS:
2885 : !
2886 : TYPE(Ext_State), POINTER :: ExtState
2887 : TYPE(HCO_State), POINTER :: HcoState
2888 : TYPE(MyInst), POINTER :: Inst
2889 : !
2890 : ! !INPUT/OUTPUT PARAMETERS:
2891 : !
2892 : INTEGER, INTENT(INOUT) :: RC
2893 : !
2894 : ! !REMARKS:
2895 : ! Reference: (5 ) Guenther et al, 2004
2896 : !
2897 : ! !REVISION HISTORY:
2898 : ! (1 ) Original code by Dorian Abbot (9/2003). Modified for the standard
2899 : ! code by May Fu (11/2004)
2900 : ! See https://github.com/geoschem/hemco for complete history
2901 : !EOP
2902 : !------------------------------------------------------------------------------
2903 : !BOC
2904 : !
2905 : ! !LOCAL VARIABLES:
2906 : !
2907 : INTEGER :: I, J, P, ARR_IND
2908 : REAL(hp) :: FACTOR
2909 : REAL(hp) :: PFT_EF_OMON(15), PFT_EF_MOH(15)
2910 : REAL(hp) :: PFT_EF_ACET(15), PFT_EF_BIDR(15)
2911 : REAL(hp) :: PFT_EF_STRS(15), PFT_EF_OTHR(15)
2912 : ! --->
2913 : ! dbm, compute EF maps for a-pinene and myrcene as well since there seems to
2914 : ! be an issue with the EF maps for these species provided on the MEGAN
2915 : ! data portal
2916 : REAL(hp) :: PFT_EF_APIN(15), PFT_EF_MYRC(15)
2917 : ! <---
2918 : REAL(hp) :: PFT_EF_FARN(15), PFT_EF_BCAR(15)
2919 : REAL(hp) :: PFT_EF_OSQT(15)
2920 : REAL(hp) :: EM_FRAC_ALD2(15), EM_FRAC_EOH(15)
2921 : REAL(hp) :: EM_FRAC_FAXX(15), EM_FRAC_AAXX(15)
2922 : REAL(hp) :: EM_FRAC_CH2O(15)
2923 :
2924 : ! Pointers to CLM4 plant functional types
2925 0 : REAL(hp) :: PFT_BARE(HcoState%NX,HcoState%NY)
2926 0 : REAL(hp) :: PFT_NDLF_EVGN_TMPT_TREE(HcoState%NX,HcoState%NY)
2927 0 : REAL(hp) :: PFT_NDLF_EVGN_BORL_TREE(HcoState%NX,HcoState%NY)
2928 0 : REAL(hp) :: PFT_NDLF_DECD_BORL_TREE(HcoState%NX,HcoState%NY)
2929 0 : REAL(hp) :: PFT_BDLF_EVGN_TROP_TREE(HcoState%NX,HcoState%NY)
2930 0 : REAL(hp) :: PFT_BDLF_EVGN_TMPT_TREE(HcoState%NX,HcoState%NY)
2931 0 : REAL(hp) :: PFT_BDLF_DECD_TROP_TREE(HcoState%NX,HcoState%NY)
2932 0 : REAL(hp) :: PFT_BDLF_DECD_TMPT_TREE(HcoState%NX,HcoState%NY)
2933 0 : REAL(hp) :: PFT_BDLF_DECD_BORL_TREE(HcoState%NX,HcoState%NY)
2934 0 : REAL(hp) :: PFT_BDLF_EVGN_SHRB(HcoState%NX,HcoState%NY)
2935 0 : REAL(hp) :: PFT_BDLF_DECD_TMPT_SHRB(HcoState%NX,HcoState%NY)
2936 0 : REAL(hp) :: PFT_BDLF_DECD_BORL_SHRB(HcoState%NX,HcoState%NY)
2937 0 : REAL(hp) :: PFT_C3_ARCT_GRSS(HcoState%NX,HcoState%NY)
2938 0 : REAL(hp) :: PFT_C3_NARC_GRSS(HcoState%NX,HcoState%NY)
2939 0 : REAL(hp) :: PFT_C4_GRSS(HcoState%NX,HcoState%NY)
2940 0 : REAL(hp) :: PFT_CROP(HcoState%NX,HcoState%NY)
2941 :
2942 : CHARACTER(LEN=255) :: LOC
2943 :
2944 : ! Suffix
2945 : CHARACTER(LEN=255) :: SFX
2946 :
2947 : !=================================================================
2948 : ! CALC_AEF begins here!
2949 : !=================================================================
2950 0 : LOC = 'CALC_AEF (HCOX_MEGAN_MOD.F90)'
2951 :
2952 : ! Suffix
2953 0 : SFX = Inst%SUFFIX
2954 :
2955 : ! ----------------------------------------------------------------
2956 : ! Note that not all these compounds are used in standard chemistry
2957 : ! simulations, but they are provided here for future incorporation or
2958 : ! specialized applications. More compounds can be added as needed
2959 : ! by adding the corresponding PFT-specific emission factors and
2960 : ! emission category fraction.
2961 : ! (dbm, 01/2013)
2962 : ! ----------------------------------------------------------------
2963 :
2964 : !-----------------------------------------------------------------
2965 : ! Point to external data
2966 : !-----------------------------------------------------------------
2967 : CALL HCO_EvalFld( HcoState, 'MEGAN_AEF_ISOP'//TRIM(SFX), &
2968 0 : Inst%AEF_ISOP, RC )
2969 0 : IF ( RC /= HCO_SUCCESS ) THEN
2970 0 : CALL HCO_ERROR( 'ERROR 8', RC, THISLOC=LOC )
2971 0 : RETURN
2972 : ENDIF
2973 :
2974 : CALL HCO_EvalFld( HcoState, 'MEGAN_AEF_MBOX'//TRIM(SFX), &
2975 0 : Inst%AEF_MBOX, RC )
2976 0 : IF ( RC /= HCO_SUCCESS ) THEN
2977 0 : CALL HCO_ERROR( 'ERROR 9', RC, THISLOC=LOC )
2978 0 : RETURN
2979 : ENDIF
2980 :
2981 : CALL HCO_EvalFld( HcoState, 'MEGAN_AEF_BPIN'//TRIM(SFX), &
2982 0 : Inst%AEF_BPIN, RC )
2983 0 : IF ( RC /= HCO_SUCCESS ) THEN
2984 0 : CALL HCO_ERROR( 'ERROR 10', RC, THISLOC=LOC )
2985 0 : RETURN
2986 : ENDIF
2987 :
2988 : CALL HCO_EvalFld( HcoState, 'MEGAN_AEF_CARE'//TRIM(SFX), &
2989 0 : Inst%AEF_CARE, RC )
2990 0 : IF ( RC /= HCO_SUCCESS ) THEN
2991 0 : CALL HCO_ERROR( 'ERROR 11', RC, THISLOC=LOC )
2992 0 : RETURN
2993 : ENDIF
2994 :
2995 : CALL HCO_EvalFld( HcoState, 'MEGAN_AEF_LIMO'//TRIM(SFX), &
2996 0 : Inst%AEF_LIMO, RC )
2997 0 : IF ( RC /= HCO_SUCCESS ) THEN
2998 0 : CALL HCO_ERROR( 'ERROR 12', RC, THISLOC=LOC )
2999 0 : RETURN
3000 : ENDIF
3001 :
3002 : CALL HCO_EvalFld( HcoState, 'MEGAN_AEF_OCIM'//TRIM(SFX), &
3003 0 : Inst%AEF_OCIM, RC )
3004 0 : IF ( RC /= HCO_SUCCESS ) THEN
3005 0 : CALL HCO_ERROR( 'ERROR 13', RC, THISLOC=LOC )
3006 0 : RETURN
3007 : ENDIF
3008 :
3009 : CALL HCO_EvalFld( HcoState, 'MEGAN_AEF_SABI'//TRIM(SFX), &
3010 0 : Inst%AEF_SABI, RC )
3011 0 : IF ( RC /= HCO_SUCCESS ) THEN
3012 0 : CALL HCO_ERROR( 'ERROR 14', RC, THISLOC=LOC )
3013 0 : RETURN
3014 : ENDIF
3015 :
3016 : !-----------------------------------------------------------------
3017 : ! Point to PFT fractions
3018 : !-----------------------------------------------------------------
3019 :
3020 : ! CLM4 PFT coverage (unitless)
3021 : ! From Table 3 in Guenther et al., 2012
3022 : ! PFT_BARE : Bare
3023 : ! PFT_NDLF_EVGN_TMPT_TREE : Needleleaf evergreen temperate tree
3024 : ! PFT_NDLF_EVGN_BORL_TREE : Needleleaf evergreen boreal tree
3025 : ! PFT_NDLF_DECD_BORL_TREE : Needleleaf deciduous boreal tree
3026 : ! PFT_BDLF_EVGN_TROP_TREE : Broadleaf evergreen tropical tree
3027 : ! PFT_BDLF_EVGN_TMPT_TREE : Broadleaf evergreen temperate tree
3028 : ! PFT_BDLF_DECD_TROP_TREE : Broadleaf deciduous tropical tree
3029 : ! PFT_BDLF_DECD_TMPT_TREE : Broadleaf deciduous temperate tree
3030 : ! PFT_BDLF_DECD_BORL_TREE : Broadleaf deciduous boreal tree
3031 : ! PFT_BDLF_EVGN_SHRB : Broadleaf evergreen temperate shrub
3032 : ! PFT_BDLF_DECD_TMPT_SHRB : Broadleaf deciduous temperate shrub
3033 : ! PFT_BDLF_DECD_BORL_SHRB : Broadleaf deciduous boreal shrub
3034 : ! PFT_C3_ARCT_GRSS : Arctic C3 grass
3035 : ! PFT_C3_NARC_GRSS : Cool C3 grass
3036 : ! PFT_C4_GRSS : Warm C4 grass
3037 : ! PFT_CROP : Crop
3038 :
3039 : CALL HCO_EvalFld( HcoState, &
3040 : 'CLM4_PFT_BARE'//TRIM(SFX), &
3041 0 : PFT_BARE, RC )
3042 0 : IF ( RC /= HCO_SUCCESS ) THEN
3043 0 : CALL HCO_ERROR( 'ERROR 15', RC, THISLOC=LOC )
3044 0 : RETURN
3045 : ENDIF
3046 :
3047 : CALL HCO_EvalFld( HcoState, &
3048 : 'CLM4_PFT_NDLF_EVGN_TMPT_TREE'//TRIM(SFX), &
3049 0 : PFT_NDLF_EVGN_TMPT_TREE, RC )
3050 0 : IF ( RC /= HCO_SUCCESS ) THEN
3051 0 : CALL HCO_ERROR( 'ERROR 16', RC, THISLOC=LOC )
3052 0 : RETURN
3053 : ENDIF
3054 :
3055 : CALL HCO_EvalFld( HcoState, &
3056 : 'CLM4_PFT_NDLF_EVGN_BORL_TREE'//TRIM(SFX), &
3057 0 : PFT_NDLF_EVGN_BORL_TREE, RC )
3058 0 : IF ( RC /= HCO_SUCCESS ) THEN
3059 0 : CALL HCO_ERROR( 'ERROR 17', RC, THISLOC=LOC )
3060 0 : RETURN
3061 : ENDIF
3062 :
3063 : CALL HCO_EvalFld( HcoState, &
3064 : 'CLM4_PFT_NDLF_DECD_BORL_TREE'//TRIM(SFX), &
3065 0 : PFT_NDLF_DECD_BORL_TREE, RC )
3066 0 : IF ( RC /= HCO_SUCCESS ) THEN
3067 0 : CALL HCO_ERROR( 'ERROR 18', RC, THISLOC=LOC )
3068 0 : RETURN
3069 : ENDIF
3070 :
3071 : CALL HCO_EvalFld( HcoState, &
3072 : 'CLM4_PFT_BDLF_EVGN_TROP_TREE'//TRIM(SFX), &
3073 0 : PFT_BDLF_EVGN_TROP_TREE, RC )
3074 0 : IF ( RC /= HCO_SUCCESS ) THEN
3075 0 : CALL HCO_ERROR( 'ERROR 19', RC, THISLOC=LOC )
3076 0 : RETURN
3077 : ENDIF
3078 :
3079 : CALL HCO_EvalFld( HcoState, &
3080 : 'CLM4_PFT_BDLF_EVGN_TMPT_TREE'//TRIM(SFX), &
3081 0 : PFT_BDLF_EVGN_TMPT_TREE, RC )
3082 0 : IF ( RC /= HCO_SUCCESS ) THEN
3083 0 : CALL HCO_ERROR( 'ERROR 20', RC, THISLOC=LOC )
3084 0 : RETURN
3085 : ENDIF
3086 :
3087 : CALL HCO_EvalFld( HcoState, &
3088 : 'CLM4_PFT_BDLF_DECD_TROP_TREE'//TRIM(SFX), &
3089 0 : PFT_BDLF_DECD_TROP_TREE, RC )
3090 0 : IF ( RC /= HCO_SUCCESS ) THEN
3091 0 : CALL HCO_ERROR( 'ERROR 21', RC, THISLOC=LOC )
3092 0 : RETURN
3093 : ENDIF
3094 :
3095 : CALL HCO_EvalFld( HcoState, &
3096 : 'CLM4_PFT_BDLF_DECD_TMPT_TREE'//TRIM(SFX), &
3097 0 : PFT_BDLF_DECD_TMPT_TREE, RC )
3098 0 : IF ( RC /= HCO_SUCCESS ) THEN
3099 0 : CALL HCO_ERROR( 'ERROR 22', RC, THISLOC=LOC )
3100 0 : RETURN
3101 : ENDIF
3102 :
3103 : CALL HCO_EvalFld( HcoState, &
3104 : 'CLM4_PFT_BDLF_DECD_BORL_TREE'//TRIM(SFX), &
3105 0 : PFT_BDLF_DECD_BORL_TREE, RC )
3106 0 : IF ( RC /= HCO_SUCCESS ) THEN
3107 0 : CALL HCO_ERROR( 'ERROR 23', RC, THISLOC=LOC )
3108 0 : RETURN
3109 : ENDIF
3110 :
3111 : CALL HCO_EvalFld( HcoState, &
3112 : 'CLM4_PFT_BDLF_EVGN_SHRB'//TRIM(SFX), &
3113 0 : PFT_BDLF_EVGN_SHRB, RC )
3114 0 : IF ( RC /= HCO_SUCCESS ) THEN
3115 0 : CALL HCO_ERROR( 'ERROR 24', RC, THISLOC=LOC )
3116 0 : RETURN
3117 : ENDIF
3118 :
3119 : CALL HCO_EvalFld( HcoState, &
3120 : 'CLM4_PFT_BDLF_DECD_TMPT_SHRB'//TRIM(SFX), &
3121 0 : PFT_BDLF_DECD_TMPT_SHRB, RC )
3122 0 : IF ( RC /= HCO_SUCCESS ) THEN
3123 0 : CALL HCO_ERROR( 'ERROR 25', RC, THISLOC=LOC )
3124 0 : RETURN
3125 : ENDIF
3126 :
3127 : CALL HCO_EvalFld( HcoState, &
3128 : 'CLM4_PFT_BDLF_DECD_BORL_SHRB'//TRIM(SFX), &
3129 0 : PFT_BDLF_DECD_BORL_SHRB, RC )
3130 0 : IF ( RC /= HCO_SUCCESS ) THEN
3131 0 : CALL HCO_ERROR( 'ERROR 26', RC, THISLOC=LOC )
3132 0 : RETURN
3133 : ENDIF
3134 :
3135 : CALL HCO_EvalFld( HcoState, &
3136 : 'CLM4_PFT_C3_ARCT_GRSS'//TRIM(SFX), &
3137 0 : PFT_C3_ARCT_GRSS, RC )
3138 0 : IF ( RC /= HCO_SUCCESS ) THEN
3139 0 : CALL HCO_ERROR( 'ERROR 27', RC, THISLOC=LOC )
3140 0 : RETURN
3141 : ENDIF
3142 :
3143 : CALL HCO_EvalFld( HcoState, &
3144 : 'CLM4_PFT_C3_NARC_GRSS'//TRIM(SFX), &
3145 0 : PFT_C3_NARC_GRSS, RC )
3146 0 : IF ( RC /= HCO_SUCCESS ) THEN
3147 0 : CALL HCO_ERROR( 'ERROR 28', RC, THISLOC=LOC )
3148 0 : RETURN
3149 : ENDIF
3150 :
3151 : CALL HCO_EvalFld( HcoState, &
3152 : 'CLM4_PFT_C4_GRSS'//TRIM(SFX), &
3153 0 : PFT_C4_GRSS, RC )
3154 0 : IF ( RC /= HCO_SUCCESS ) THEN
3155 0 : CALL HCO_ERROR( 'ERROR 29', RC, THISLOC=LOC )
3156 0 : RETURN
3157 : ENDIF
3158 :
3159 : CALL HCO_EvalFld( HcoState, &
3160 : 'CLM4_PFT_CROP'//TRIM(SFX), &
3161 0 : PFT_CROP, RC )
3162 0 : IF ( RC /= HCO_SUCCESS ) THEN
3163 0 : CALL HCO_ERROR( 'ERROR 30', RC, THISLOC=LOC )
3164 0 : RETURN
3165 : ENDIF
3166 :
3167 : ! Copy PFTs into ARRAY_16
3168 0 : Inst%ARRAY_16(:,:, 1) = PFT_BARE
3169 0 : Inst%ARRAY_16(:,:, 2) = PFT_NDLF_EVGN_TMPT_TREE
3170 0 : Inst%ARRAY_16(:,:, 3) = PFT_NDLF_EVGN_BORL_TREE
3171 0 : Inst%ARRAY_16(:,:, 4) = PFT_NDLF_DECD_BORL_TREE
3172 0 : Inst%ARRAY_16(:,:, 5) = PFT_BDLF_EVGN_TROP_TREE
3173 0 : Inst%ARRAY_16(:,:, 6) = PFT_BDLF_EVGN_TMPT_TREE
3174 0 : Inst%ARRAY_16(:,:, 7) = PFT_BDLF_DECD_TROP_TREE
3175 0 : Inst%ARRAY_16(:,:, 8) = PFT_BDLF_DECD_TMPT_TREE
3176 0 : Inst%ARRAY_16(:,:, 9) = PFT_BDLF_DECD_BORL_TREE
3177 0 : Inst%ARRAY_16(:,:,10) = PFT_BDLF_EVGN_SHRB
3178 0 : Inst%ARRAY_16(:,:,11) = PFT_BDLF_DECD_TMPT_SHRB
3179 0 : Inst%ARRAY_16(:,:,12) = PFT_BDLF_DECD_BORL_SHRB
3180 0 : Inst%ARRAY_16(:,:,13) = PFT_C3_ARCT_GRSS
3181 0 : Inst%ARRAY_16(:,:,14) = PFT_C3_NARC_GRSS
3182 0 : Inst%ARRAY_16(:,:,15) = PFT_C4_GRSS
3183 0 : Inst%ARRAY_16(:,:,16) = PFT_CROP
3184 :
3185 : ! --------------------------------------------------------------------------------
3186 : ! PFT-specific EFs from Table 2 in Guenther et al., 2012
3187 : ! in ug compound/m2/h
3188 : ! PFTs 1-15 in the table correspond to #2-16
3189 : ! (i.e., excluding bare ground #1) in the above array.
3190 : ! --------------------------------------------------------------------------------
3191 : ! Compound Class EF1 EF2 EF3 EF4 EF5 EF6 EF7 EF8 EF9 EF10 EF11 EF12 EF13 EF14 EF15
3192 : ! --------------------------------------------------------------------------------
3193 : ! Other Monoterp 180 180 170 150 150 150 150 150 110 200 110 5 5 5 5
3194 : ! Methanol 900 900 900 500 900 500 900 900 900 900 900 500 500 500 900
3195 : ! Acetone 240 240 240 240 240 240 240 240 240 240 240 80 80 80 80
3196 : ! Bidirect VOC 500 500 500 500 500 500 500 500 500 500 500 80 80 80 80
3197 : ! Stress VOC 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300
3198 : ! Other VOC 140 140 140 140 140 140 140 140 140 140 140 140 140 140 140
3199 : ! a-Pinene 500 500 510 600 400 600 400 400 200 300 200 2 2 2 2
3200 : ! Myrcene 70 70 60 80 30 80 30 30 30 50 30 0.3 0.3 0.3 0.3
3201 : ! a-Farnesene 40 40 40 60 40 60 40 40 40 40 40 3 3 3 4
3202 : ! b-Carophyllene 80 80 80 60 40 60 40 40 50 50 50 1 1 1 4
3203 : ! Other sesqt. 120 120 120 120 100 120 100 100 100 100 100 2 2 2 2
3204 : ! --------------------------------------------------------------------------------
3205 :
3206 : ! One thing to note is these are net emissions to the canopy atmosphere
3207 : ! but not net emissions to the above canopy atmosphere since they don't
3208 : ! account for within-canopy deposition. Only an issue for OVOCs.
3209 :
3210 : ! EF1 EF2 EF3 EF4 EF5
3211 : PFT_EF_OMON = (/180.0_hp, 180.0_hp, 170.0_hp, 150.0_hp, 150.0_hp, &
3212 : ! EF6 EF7 EF8 EF9 EF10
3213 : 150.0_hp, 150.0_hp, 150.0_hp, 110.0_hp, 200.0_hp, &
3214 : ! EF11 EF12 EF13 EF14 EF15
3215 0 : 110.0_hp, 5.0_hp , 5.0_hp , 5.0_hp , 5.0_hp/)
3216 :
3217 : ! EF1 EF2 EF3 EF4 EF5
3218 : PFT_EF_MOH = (/900.0_hp, 900.0_hp, 900.0_hp, 500.0_hp, 900.0_hp, &
3219 : ! EF6 EF7 EF8 EF9 EF10
3220 : 500.0_hp, 900.0_hp, 900.0_hp, 900.0_hp, 900.0_hp, &
3221 : ! EF11 EF12 EF13 EF14 EF15
3222 0 : 900.0_hp, 500.0_hp, 500.0_hp, 500.0_hp, 900.0_hp/)
3223 :
3224 : ! EF1 EF2 EF3 EF4 EF5
3225 : PFT_EF_ACET = (/240.0_hp, 240.0_hp, 240.0_hp, 240.0_hp, 240.0_hp, &
3226 : ! EF6 EF7 EF8 EF9 EF10
3227 : 240.0_hp, 240.0_hp, 240.0_hp, 240.0_hp, 240.0_hp, &
3228 : ! EF11 EF12 EF13 EF14 EF15
3229 0 : 240.0_hp, 80.0_hp , 80.0_hp , 80.0_hp , 80.0_hp/)
3230 :
3231 : ! EF1 EF2 EF3 EF4 EF5
3232 : PFT_EF_BIDR = (/500.0_hp, 500.0_hp, 500.0_hp, 500.0_hp, 500.0_hp, &
3233 : ! EF6 EF7 EF8 EF9 EF10
3234 : 500.0_hp, 500.0_hp, 500.0_hp, 500.0_hp, 500.0_hp, &
3235 : ! EF11 EF12 EF13 EF14 EF15
3236 0 : 500.0_hp, 80.0_hp , 80.0_hp , 80.0_hp , 80.0_hp/)
3237 :
3238 : ! EF1 EF2 EF3 EF4 EF5
3239 : PFT_EF_STRS = (/300.0_hp, 300.0_hp, 300.0_hp, 300.0_hp, 300.0_hp, &
3240 : ! EF6 EF7 EF8 EF9 EF10
3241 : 300.0_hp, 300.0_hp, 300.0_hp, 300.0_hp, 300.0_hp, &
3242 : ! EF11 EF12 EF13 EF14 EF15
3243 0 : 300.0_hp, 300.0_hp, 300.0_hp, 300.0_hp, 300.0_hp/)
3244 :
3245 : ! EF1 EF2 EF3 EF4 EF5
3246 : PFT_EF_OTHR = (/140.0_hp, 140.0_hp, 140.0_hp, 140.0_hp, 140.0_hp, &
3247 : ! EF6 EF7 EF8 EF9 EF10
3248 : 140.0_hp, 140.0_hp, 140.0_hp, 140.0_hp, 140.0_hp, &
3249 : ! EF11 EF12 EF13 EF14 EF15
3250 0 : 140.0_hp, 140.0_hp, 140.0_hp, 140.0_hp, 140.0_hp/)
3251 :
3252 : ! ---> Now compute EFs for a-pinene and myrcene as well (dbm, 12/2012)
3253 : ! EF1 EF2 EF3 EF4 EF5
3254 : PFT_EF_APIN = (/500.0_hp, 500.0_hp, 510.0_hp, 600.0_hp, 400.0_hp, &
3255 : ! EF6 EF7 EF8 EF9 EF10
3256 : 600.0_hp, 400.0_hp, 400.0_hp, 200.0_hp, 300.0_hp, &
3257 : ! EF11 EF12 EF13 EF14 EF15
3258 0 : 200.0_hp, 2.0_hp, 2.0_hp, 2.0_hp, 2.0_hp/)
3259 :
3260 : ! EF1 EF2 EF3 EF4 EF5
3261 : PFT_EF_MYRC = (/70.0_hp, 70.0_hp, 60.0_hp, 80.0_hp, 30.0_hp, &
3262 : ! EF6 EF7 EF8 EF9 EF10
3263 : 80.0_hp, 30.0_hp, 30.0_hp, 30.0_hp, 50.0_hp, &
3264 : ! EF11 EF12 EF13 EF14 EF15
3265 0 : 30.0_hp, 0.3_hp, 0.3_hp, 0.3_hp, 0.3_hp/)
3266 : ! <---
3267 :
3268 : ! EF1 EF2 EF3 EF4 EF5
3269 : PFT_EF_FARN = (/40.0_hp, 40.0_hp, 40.0_hp, 60.0_hp, 40.0_hp, &
3270 : ! EF6 EF7 EF8 EF9 EF10
3271 : 60.0_hp, 40.0_hp, 40.0_hp, 40.0_hp, 40.0_hp, &
3272 : ! EF11 EF12 EF13 EF14 EF15
3273 0 : 40.0_hp, 3.0_hp, 3.0_hp, 3.0_hp, 4.0_hp/)
3274 :
3275 : ! EF1 EF2 EF3 EF4 EF5
3276 : PFT_EF_BCAR = (/80.0_hp, 80.0_hp, 80.0_hp, 60.0_hp, 40.0_hp, &
3277 : ! EF6 EF7 EF8 EF9 EF10
3278 : 60.0_hp, 40.0_hp, 40.0_hp, 50.0_hp, 50.0_hp, &
3279 : ! EF11 EF12 EF13 EF14 EF15
3280 0 : 50.0_hp, 1.0_hp, 1.0_hp, 1.0_hp, 4.0_hp/)
3281 :
3282 : ! EF1 EF2 EF3 EF4 EF5
3283 : PFT_EF_OSQT = (/120.0_hp, 120.0_hp, 120.0_hp, 120.0_hp, 100.0_hp, &
3284 : ! EF6 EF7 EF8 EF9 EF10
3285 : 120.0_hp, 100.0_hp, 100.0_hp, 100.0_hp, 100.0_hp, &
3286 : ! EF11 EF12 EF13 EF14 EF15
3287 0 : 100.0_hp, 2.0_hp, 2.0_hp, 2.0_hp, 2.0_hp/)
3288 :
3289 :
3290 : ! Other monoterpenes, methanol, acetone, MBO are each 100% of thier
3291 : ! respective categories. The VOCs within the stress category each
3292 : ! account for a specific fraction of emissions across all PFTs
3293 : ! (ethene 58%, toluene 3%, HCN 1.5%). The VOCs within the
3294 : ! other category also account for a given fraction of emissions
3295 : ! across all PFTs (propene 48%, butene 24%, other alkenes 0.2%). But
3296 : ! VOCs in the bidirectional category account for a different amount of
3297 : ! the total flux for the different PFTs. So in this case we define a
3298 : ! vector containing these fractions.
3299 :
3300 : ! Acetaldehyde: 40% of bidirectional category flux, except 25%
3301 : ! for grasses and crops
3302 : EM_FRAC_ALD2 = (/0.40_hp, 0.40_hp, 0.40_hp, 0.40_hp, 0.40_hp, &
3303 : 0.40_hp, 0.40_hp, 0.40_hp, 0.40_hp, 0.40_hp, &
3304 0 : 0.40_hp, 0.25_hp, 0.25_hp, 0.25_hp, 0.25_hp/)
3305 :
3306 : ! Ethanol: 40% of bidirectional category flux, except 25%
3307 : ! for grasses and crops
3308 : EM_FRAC_EOH = (/0.40_hp, 0.40_hp, 0.40_hp, 0.40_hp, 0.40_hp, &
3309 : 0.40_hp, 0.40_hp, 0.40_hp, 0.40_hp, 0.40_hp, &
3310 0 : 0.40_hp, 0.25_hp, 0.25_hp, 0.25_hp, 0.25_hp/)
3311 :
3312 : ! Formic acid: 6% of bidirectional category flux, except 15%
3313 : ! for grasses and crops
3314 : EM_FRAC_FAXX = (/0.06_hp, 0.06_hp, 0.06_hp, 0.06_hp, 0.06_hp, &
3315 : 0.06_hp, 0.06_hp, 0.06_hp, 0.06_hp, 0.06_hp, &
3316 0 : 0.06_hp, 0.15_hp, 0.15_hp, 0.15_hp, 0.15_hp/)
3317 :
3318 : ! Acetic acid: 6% of bidirectional category flux, except 15%
3319 : ! for grasses and crops
3320 : EM_FRAC_AAXX = (/0.06_hp, 0.06_hp, 0.06_hp, 0.06_hp, 0.06_hp, &
3321 : 0.06_hp, 0.06_hp, 0.06_hp, 0.06_hp, 0.06_hp, &
3322 0 : 0.06_hp, 0.15_hp, 0.15_hp, 0.15_hp, 0.15_hp/)
3323 :
3324 : ! Formaldehyde: 8% of bidirectional category flux, except 20%
3325 : ! for grasses and crops
3326 : EM_FRAC_CH2O = (/0.08_hp, 0.08_hp, 0.08_hp, 0.08_hp, 0.08_hp, &
3327 : 0.08_hp, 0.08_hp, 0.08_hp, 0.08_hp, 0.08_hp, &
3328 0 : 0.08_hp, 0.20_hp, 0.20_hp, 0.20_hp, 0.20_hp/)
3329 :
3330 : ! Set AEF arrays to zero
3331 0 : Inst%AEF_APIN(:,:) = 0.0_hp
3332 0 : Inst%AEF_MYRC(:,:) = 0.0_hp
3333 0 : Inst%AEF_OMON(:,:) = 0.0_hp
3334 0 : Inst%AEF_FARN(:,:) = 0.0_hp
3335 0 : Inst%AEF_BCAR(:,:) = 0.0_hp
3336 0 : Inst%AEF_OSQT(:,:) = 0.0_hp
3337 0 : Inst%AEF_MOH (:,:) = 0.0_hp
3338 0 : Inst%AEF_ACET(:,:) = 0.0_hp
3339 0 : Inst%AEF_EOH (:,:) = 0.0_hp
3340 0 : Inst%AEF_CH2O(:,:) = 0.0_hp
3341 0 : Inst%AEF_ALD2(:,:) = 0.0_hp
3342 0 : Inst%AEF_FAXX(:,:) = 0.0_hp
3343 0 : Inst%AEF_AAXX(:,:) = 0.0_hp
3344 0 : Inst%AEF_C2H4(:,:) = 0.0_hp
3345 0 : Inst%AEF_TOLU(:,:) = 0.0_hp
3346 0 : Inst%AEF_HCNX(:,:) = 0.0_hp
3347 0 : Inst%AEF_PRPE(:,:) = 0.0_hp
3348 :
3349 : ! Loop through plant types
3350 0 : DO P = 1, 15
3351 :
3352 : ! Add 1 to Array_16 index to skip bare ground
3353 0 : ARR_IND = P + 1
3354 :
3355 : ! Don't need to divide ARRAY_16 by 100 since data from netCDF
3356 : ! file has already been converted to fraction (mps, 2/12/15)
3357 :
3358 : ! ---> Now compute EFs for a-pinene and myrcene as well (dbm, 12/2012)
3359 : ! a-pinene: 100% of category
3360 : Inst%AEF_APIN(:,:) = Inst%AEF_APIN(:,:) + &
3361 0 : Inst%ARRAY_16(:,:,ARR_IND) * PFT_EF_APIN(P)
3362 :
3363 : ! Myrcene: 100% of category
3364 : Inst%AEF_MYRC(:,:) = Inst%AEF_MYRC(:,:) + &
3365 0 : Inst%ARRAY_16(:,:,ARR_IND) * PFT_EF_MYRC(P)
3366 : ! <---
3367 :
3368 : ! Other monoterpenes: 100% of category
3369 : Inst%AEF_OMON(:,:) = Inst%AEF_OMON(:,:) + &
3370 0 : Inst%ARRAY_16(:,:,ARR_IND) * PFT_EF_OMON(P)
3371 :
3372 : ! a-Farnesene: 100% of category
3373 : Inst%AEF_FARN(:,:) = Inst%AEF_FARN(:,:) + &
3374 0 : Inst%ARRAY_16(:,:,ARR_IND) * PFT_EF_FARN(P)
3375 :
3376 : ! b-Caryophyllene: 100% of category
3377 : Inst%AEF_BCAR(:,:) = Inst%AEF_BCAR(:,:) + &
3378 0 : Inst%ARRAY_16(:,:,ARR_IND) * PFT_EF_BCAR(P)
3379 :
3380 : ! Other sesquiterpenes: 100% of category
3381 : Inst%AEF_OSQT(:,:) = Inst%AEF_OSQT(:,:) + &
3382 0 : Inst%ARRAY_16(:,:,ARR_IND) * PFT_EF_OSQT(P)
3383 :
3384 : ! Methanol: 100% of category
3385 : Inst%AEF_MOH(:,:) = Inst%AEF_MOH(:,:) + &
3386 0 : Inst%ARRAY_16(:,:,ARR_IND) * PFT_EF_MOH(P)
3387 :
3388 : ! Acetone: 100% of category
3389 : Inst%AEF_ACET(:,:) = Inst%AEF_ACET(:,:) + &
3390 0 : Inst%ARRAY_16(:,:,ARR_IND) * PFT_EF_ACET(P)
3391 :
3392 : ! Ethanol: variable fraction of category
3393 : Inst%AEF_EOH(:,:) = Inst%AEF_EOH(:,:) + &
3394 0 : Inst%ARRAY_16(:,:,ARR_IND)*PFT_EF_BIDR(P)*EM_FRAC_EOH(P)
3395 :
3396 : ! Formaldehyde: variable fraction of category
3397 : Inst%AEF_CH2O(:,:) = Inst%AEF_CH2O(:,:) + &
3398 0 : Inst%ARRAY_16(:,:,ARR_IND)*PFT_EF_BIDR(P)*EM_FRAC_CH2O(P)
3399 :
3400 : ! Acetaldehyde: variable fraction of category
3401 : Inst%AEF_ALD2(:,:) = Inst%AEF_ALD2(:,:) + &
3402 0 : Inst%ARRAY_16(:,:,ARR_IND)*PFT_EF_BIDR(P)*EM_FRAC_ALD2(P)
3403 :
3404 : ! Formic acid: variable fraction of category
3405 : Inst%AEF_FAXX(:,:) = Inst%AEF_FAXX(:,:) + &
3406 0 : Inst%ARRAY_16(:,:,ARR_IND)*PFT_EF_BIDR(P)*EM_FRAC_FAXX(P)
3407 :
3408 : ! Acetic acid: variable fraction of category
3409 : Inst%AEF_AAXX(:,:) = Inst%AEF_AAXX(:,:) + &
3410 0 : Inst%ARRAY_16(:,:,ARR_IND)*PFT_EF_BIDR(P)*EM_FRAC_AAXX(P)
3411 :
3412 : ! Ethene: 58% of "stress" category for all PFTs
3413 : Inst%AEF_C2H4(:,:) = Inst%AEF_C2H4(:,:) + &
3414 0 : Inst%ARRAY_16(:,:,ARR_IND) * PFT_EF_STRS(P) * 0.58_hp
3415 :
3416 : ! Toluene: 3% of "stress" category for all PFTs
3417 : Inst%AEF_TOLU(:,:) = Inst%AEF_TOLU(:,:) + &
3418 0 : Inst%ARRAY_16(:,:,ARR_IND) * PFT_EF_STRS(P) * 0.03_hp
3419 :
3420 : ! HCN: 1.5% of "stress" category for all PFTs
3421 : Inst%AEF_HCNX(:,:) = Inst%AEF_HCNX(:,:) + &
3422 0 : Inst%ARRAY_16(:,:,ARR_IND) * PFT_EF_STRS(P) * 0.015_hp
3423 :
3424 : ! Propene: 48% of "other" category for all PFTs
3425 : ! Butene: 24% of "other" category for all PFTs
3426 : ! Larger alkenes: 0.2% of "other" category for all PFTs
3427 : ! Total: 72.2%
3428 : Inst%AEF_PRPE(:,:) = Inst%AEF_PRPE(:,:) + &
3429 0 : Inst%ARRAY_16(:,:,ARR_IND) * PFT_EF_OTHR(P) * 0.722_hp
3430 :
3431 : ENDDO
3432 :
3433 : ! Convert AEF arrays from [ug/m2/hr] to [kg/m2/s]
3434 0 : FACTOR = 1.0e-9_hp / 3600.0_hp
3435 0 : Inst%AEF_APIN = Inst%AEF_APIN * FACTOR
3436 0 : Inst%AEF_MYRC = Inst%AEF_MYRC * FACTOR
3437 0 : Inst%AEF_OMON = Inst%AEF_OMON * FACTOR
3438 0 : Inst%AEF_FARN = Inst%AEF_FARN * FACTOR
3439 0 : Inst%AEF_BCAR = Inst%AEF_BCAR * FACTOR
3440 0 : Inst%AEF_OSQT = Inst%AEF_OSQT * FACTOR
3441 0 : Inst%AEF_ACET = Inst%AEF_ACET * FACTOR
3442 0 : Inst%AEF_EOH = Inst%AEF_EOH * FACTOR
3443 0 : Inst%AEF_ALD2 = Inst%AEF_ALD2 * FACTOR
3444 0 : Inst%AEF_C2H4 = Inst%AEF_C2H4 * FACTOR
3445 0 : Inst%AEF_TOLU = Inst%AEF_TOLU * FACTOR
3446 0 : Inst%AEF_PRPE = Inst%AEF_PRPE * FACTOR
3447 0 : Inst%AEF_MOH = Inst%AEF_MOH * FACTOR
3448 0 : Inst%AEF_CH2O = Inst%AEF_CH2O * FACTOR
3449 0 : Inst%AEF_FAXX = Inst%AEF_FAXX * FACTOR
3450 0 : Inst%AEF_AAXX = Inst%AEF_AAXX * FACTOR
3451 0 : Inst%AEF_HCNX = Inst%AEF_HCNX * FACTOR
3452 :
3453 : ! Return w/ success
3454 0 : RC = HCO_SUCCESS
3455 :
3456 : END SUBROUTINE CALC_AEF
3457 : !EOC
3458 : !------------------------------------------------------------------------------
3459 : ! Harmonized Emissions Component (HEMCO) !
3460 : !------------------------------------------------------------------------------
3461 : !BOP
3462 : !
3463 : ! !IROUTINE: HCOX_Megan_Init
3464 : !
3465 : ! !DESCRIPTION: Subroutine HCOX\_Megan\_Init allocates and initializes all
3466 : ! module arrays.
3467 : !\\
3468 : !\\
3469 : ! !INTERFACE:
3470 : !
3471 0 : SUBROUTINE HCOX_Megan_Init( HcoState, ExtName, ExtState, RC )
3472 : !
3473 : ! !USES:
3474 : !
3475 : USE HCO_STATE_MOD, ONLY : Hco_GetHcoID
3476 : USE HCO_STATE_MOD, ONLY : HCO_GetExtHcoID
3477 : USE HCO_ExtList_Mod, ONLY : GetExtNr, GetExtOpt
3478 : USE HCO_Restart_Mod, ONLY : HCO_RestartDefine
3479 : !
3480 : ! !INPUT PARAMETERS:
3481 : !
3482 : TYPE(HCO_State), POINTER :: HcoState
3483 : CHARACTER(LEN=*), INTENT(IN ) :: ExtName
3484 : TYPE(Ext_State), POINTER :: ExtState
3485 : !
3486 : ! !INPUT/OUTPUT PARAMETERS:
3487 : !
3488 : INTEGER, INTENT(INOUT) :: RC
3489 : !
3490 : ! !REVISION HISTORY:
3491 : ! 05 Aug 2013 - C. Keller - Initial version
3492 : ! See https://github.com/geoschem/hemco for complete history
3493 : !EOP
3494 : !------------------------------------------------------------------------------
3495 : !BOC
3496 : !
3497 : ! !LOCAL VARIABLES:
3498 : !
3499 : INTEGER :: ExtNr, iExtNr
3500 : INTEGER :: I, nSpc, AS, NX, NY
3501 0 : INTEGER, ALLOCATABLE :: HcoIDs(:)
3502 : LOGICAL :: FOUND
3503 : REAL*8 :: PI_180
3504 0 : REAL(hp), POINTER :: Ptr2D(:,:)
3505 : TYPE(MyInst), POINTER :: Inst
3506 : CHARACTER(LEN=255) :: MSG, LOC
3507 0 : CHARACTER(LEN=31), ALLOCATABLE :: SpcNames(:)
3508 : LOGICAL :: Optfound
3509 :
3510 : !=================================================================
3511 : ! HCOX_MEGAN_INIT begins here!
3512 : !=================================================================
3513 0 : LOC = 'HCOX_MEGAN_INIT (HCOX_MEGAN_MOD.F90)'
3514 :
3515 : ! Extension Nr.
3516 0 : ExtNr = GetExtNr( HcoState%Config%ExtList, TRIM(ExtName) )
3517 0 : IF ( ExtNr <= 0 ) RETURN
3518 :
3519 : ! Enter
3520 0 : CALL HCO_ENTER( HcoState%Config%Err, LOC, RC )
3521 0 : IF ( RC /= HCO_SUCCESS ) THEN
3522 0 : CALL HCO_ERROR( 'ERROR 31', RC, THISLOC=LOC )
3523 0 : RETURN
3524 : ENDIF
3525 :
3526 : ! Nullify
3527 0 : Ptr2D => NULL()
3528 0 : Inst => NULL()
3529 :
3530 : ! Create an instance for this extension
3531 0 : CALL InstCreate ( ExtNr, ExtState%Megan, Inst, RC )
3532 0 : IF ( RC /= HCO_SUCCESS ) THEN
3533 : CALL HCO_ERROR ( &
3534 0 : 'Cannot create MEGAN instance', RC )
3535 0 : RETURN
3536 : ENDIF
3537 :
3538 : ! Check to see if offline biogenic VOCs are used. If so, those
3539 : ! will be used in place of online MEGAN emissions (mps, 12/17/19).
3540 0 : Inst%OFFLINE_BIOGENICVOC = .FALSE.
3541 : CALL GetExtOpt( HcoState%Config, 0, 'OFFLINE_BIOGENICVOC', &
3542 0 : OptValBool=OptFound, Found=FOUND, RC=RC )
3543 0 : IF ( RC /= HCO_SUCCESS ) THEN
3544 0 : CALL HCO_ERROR( 'ERROR 32', RC, THISLOC=LOC )
3545 0 : RETURN
3546 : ENDIF
3547 0 : IF ( FOUND ) Inst%OFFLINE_BIOGENICVOC = OptFound
3548 :
3549 : ! Verbose mode
3550 0 : IF ( HcoState%amIRoot) THEN
3551 :
3552 : ! Write the name of the extension regardless of the verbose setting
3553 0 : msg = 'Using HEMCO extension: MEGAN (biogenic emissions)'
3554 0 : IF ( HCO_IsVerb( HcoState%Config%Err ) ) THEN
3555 0 : CALL HCO_Msg( HcoState%Config%Err, msg, sep1='-' ) ! with separator
3556 : ELSE
3557 0 : CALL HCO_Msg( msg, verb=.TRUE. ) ! w/o separator
3558 : ENDIF
3559 :
3560 : ! Write all other messages as debug printout only
3561 0 : WRITE(MSG,*) '- Use offline biogenic VOCs? ', Inst%OFFLINE_BIOGENICVOC
3562 0 : CALL HCO_MSG( HcoState%Config%Err, MSG )
3563 : ENDIF
3564 :
3565 : !-----------------------------------------------------------------
3566 : ! Read settings
3567 : !-----------------------------------------------------------------
3568 :
3569 : ! Read settings specified in configuration file
3570 : ! Note: the specified strings have to match those in
3571 : ! the config. file!
3572 : CALL GetExtOpt( HcoState%Config, ExtNr, 'Isoprene scaling', &
3573 0 : OptValHp=Inst%ISOP_SCALING, RC=RC )
3574 0 : IF ( RC /= HCO_SUCCESS ) THEN
3575 0 : CALL HCO_ERROR( 'ERROR 33', RC, THISLOC=LOC )
3576 0 : RETURN
3577 : ENDIF
3578 : CALL GetExtOpt( HcoState%Config, ExtNr, 'CO2 inhibition', &
3579 0 : OptValBool=Inst%LISOPCO2, RC=RC )
3580 0 : IF ( RC /= HCO_SUCCESS ) THEN
3581 0 : CALL HCO_ERROR( 'ERROR 34', RC, THISLOC=LOC )
3582 0 : RETURN
3583 : ENDIF
3584 : CALL GetExtOpt( HcoState%Config, ExtNr, 'CO2 conc (ppmv)', &
3585 0 : OptValHp=Inst%GLOBCO2, RC=RC )
3586 0 : IF ( RC /= HCO_SUCCESS ) THEN
3587 0 : CALL HCO_ERROR( 'ERROR 35', RC, THISLOC=LOC )
3588 0 : RETURN
3589 : ENDIF
3590 :
3591 : ! Normalize LAI by PFT? Default setting is 'yes'
3592 : ! ckeller, 7/17/17.
3593 0 : Inst%NORMLAI = .TRUE.
3594 : CALL GetExtOpt( HcoState%Config, ExtNr, 'Normalize LAI', &
3595 0 : OptValBool=OptFound, Found=FOUND, RC=RC )
3596 0 : IF ( RC /= HCO_SUCCESS ) THEN
3597 0 : CALL HCO_ERROR( 'ERROR 36', RC, THISLOC=LOC )
3598 0 : RETURN
3599 : ENDIF
3600 0 : IF ( FOUND ) Inst%NORMLAI = OptFound
3601 :
3602 : ! Check GLOBCO2 if CO2 inhibition is turned on (LISOPCO2 = .TRUE.)
3603 : ! GLOBCO2 should be between 150-1250 ppmv. Isoprene response to
3604 : ! CO2 outside this range has no empirical basis. (Tai, Jan 2013)
3605 0 : IF ( Inst%LISOPCO2 ) THEN
3606 0 : IF ( Inst%GLOBCO2 < 150.0_hp .OR. &
3607 : Inst%GLOBCO2 > 1250.0_hp ) THEN
3608 0 : MSG = 'Global CO2 outside valid range of 150-1250 ppmv!'
3609 0 : CALL HCO_ERROR(MSG, RC )
3610 0 : RETURN
3611 : ENDIF
3612 : ENDIF
3613 :
3614 0 : Optfound = .FALSE.
3615 : !optional arguments for SOAP
3616 : CALL GetExtOpt ( HcoState%Config, ExtNr, 'Isoprene to SOAP', &
3617 0 : OptValHp=Inst%ISOPTOSOAP, FOUND=Optfound, RC=RC )
3618 0 : IF ( RC /= HCO_SUCCESS ) THEN
3619 0 : CALL HCO_ERROR( 'ERROR 37', RC, THISLOC=LOC )
3620 0 : RETURN
3621 : ENDIF
3622 0 : IF ( Optfound ) THEN
3623 : !convert from carbon basis to mass basis
3624 0 : Inst%ISOPTOSOAP = Inst%ISOPTOSOAP * 1.134
3625 : ELSE
3626 : !set to zero if not specified
3627 0 : Inst%ISOPTOSOAP = 0.0
3628 : ENDIF
3629 :
3630 0 : Optfound = .FALSE.
3631 : !optional arguments for SOAS
3632 : CALL GetExtOpt ( HcoState%Config, ExtNr, 'Isoprene to SOAS', &
3633 0 : OptValHp=Inst%ISOPTOSOAS, FOUND=Optfound, RC=RC )
3634 0 : IF ( RC /= HCO_SUCCESS ) THEN
3635 0 : CALL HCO_ERROR( 'ERROR 38', RC, THISLOC=LOC )
3636 0 : RETURN
3637 : ENDIF
3638 0 : IF ( Optfound ) THEN
3639 : !convert from carbon basis to mass basis
3640 0 : Inst%ISOPTOSOAS = Inst%ISOPTOSOAS * 1.134
3641 : ELSE
3642 : !set to zero if not specified
3643 0 : Inst%ISOPTOSOAS = 0.0
3644 : ENDIF
3645 :
3646 0 : Optfound = .FALSE.
3647 : CALL GetExtOpt ( HcoState%Config, Inst%ExtNr, 'Monoterp to SOAP', &
3648 0 : OptValHp=Inst%MONOTOSOAP, FOUND=Optfound, RC=RC )
3649 0 : IF ( RC /= HCO_SUCCESS ) THEN
3650 0 : CALL HCO_ERROR( 'ERROR 39', RC, THISLOC=LOC )
3651 0 : RETURN
3652 : ENDIF
3653 0 : IF ( Optfound ) THEN
3654 : !convert from carbon basis to mass basis
3655 : Inst%MONOTOSOAP = Inst%MONOTOSOAP ! * 1.134
3656 : ELSE
3657 : !set to zero if not specified
3658 0 : Inst%MONOTOSOAP = 0.0
3659 : ENDIF
3660 :
3661 0 : Optfound = .FALSE.
3662 : CALL GetExtOpt ( HcoState%Config, Inst%ExtNr, 'Monoterp to SOAS', &
3663 0 : OptValHp=Inst%MONOTOSOAS, FOUND=Optfound, RC=RC )
3664 0 : IF ( RC /= HCO_SUCCESS ) THEN
3665 0 : CALL HCO_ERROR( 'ERROR 40', RC, THISLOC=LOC )
3666 0 : RETURN
3667 : ENDIF
3668 0 : IF ( Optfound ) THEN
3669 : !convert from carbon basis to mass basis
3670 : Inst%MONOTOSOAS = Inst%MONOTOSOAS ! * 1.134
3671 : ELSE
3672 : !set to zero if not specified
3673 0 : Inst%MONOTOSOAS = 0.0
3674 : ENDIF
3675 :
3676 0 : Optfound = .FALSE.
3677 : CALL GetExtOpt ( HcoState%Config, Inst%ExtNr, 'Othrterp to SOAP', &
3678 0 : OptValHp=Inst%OTHRTOSOAP, FOUND=Optfound, RC=RC )
3679 0 : IF ( RC /= HCO_SUCCESS ) THEN
3680 0 : CALL HCO_ERROR( 'ERROR 41', RC, THISLOC=LOC )
3681 0 : RETURN
3682 : ENDIF
3683 0 : IF ( Optfound ) THEN
3684 : !convert from carbon basis to mass basis
3685 0 : Inst%OTHRTOSOAP = Inst%OTHRTOSOAP * 1.134
3686 : ELSE
3687 : !set to zero if not specified
3688 0 : Inst%OTHRTOSOAP = 0.0
3689 : ENDIF
3690 :
3691 0 : Optfound = .FALSE.
3692 : CALL GetExtOpt ( HcoState%Config, Inst%ExtNr, 'Othrterp to SOAS', &
3693 0 : OptValHp=Inst%OTHRTOSOAS, FOUND=Optfound, RC=RC )
3694 0 : IF ( RC /= HCO_SUCCESS ) THEN
3695 0 : CALL HCO_ERROR( 'ERROR 42', RC, THISLOC=LOC )
3696 0 : RETURN
3697 : ENDIF
3698 0 : IF ( Optfound ) THEN
3699 : !convert from carbon basis to mass basis
3700 0 : Inst%OTHRTOSOAS = Inst%OTHRTOSOAS * 1.134
3701 : ELSE
3702 : !set to zero if not specified
3703 0 : Inst%OTHRTOSOAS = 0.0
3704 : ENDIF
3705 :
3706 : !-----------------------------------------------------------------
3707 : ! Set species IDs
3708 : !-----------------------------------------------------------------
3709 :
3710 : ! Verbose mode
3711 0 : IF ( HcoState%amIRoot ) THEN
3712 0 : MSG = ' - Use the following species:'
3713 0 : CALL HCO_MSG( HcoState%Config%Err, MSG )
3714 : ENDIF
3715 :
3716 : ! Get species IDs
3717 : ! --> Assume that species are ordered ISOP, ACET, PRPE, C2H4 in
3718 : ! config. file!
3719 0 : CALL HCO_GetExtHcoID( HcoState, ExtNr, HcoIDs, SpcNames, nSpc, RC)
3720 0 : IF ( RC /= HCO_SUCCESS ) THEN
3721 0 : CALL HCO_ERROR( 'ERROR 43', RC, THISLOC=LOC )
3722 0 : RETURN
3723 : ENDIF
3724 :
3725 : ! Assign species IDs
3726 0 : Inst%IDTISOP = -1
3727 0 : Inst%IDTACET = -1
3728 0 : Inst%IDTPRPE = -1
3729 0 : Inst%IDTC2H4 = -1
3730 0 : Inst%IDTALD2 = -1
3731 0 : Inst%IDTMOH = -1
3732 0 : Inst%IDTEOH = -1
3733 0 : Inst%IDTSOAP = -1
3734 0 : Inst%IDTSOAS = -1
3735 0 : Inst%IDTMTPA = -1
3736 0 : Inst%IDTMTPO = -1
3737 0 : Inst%IDTLIMO = -1
3738 0 : Inst%IDTSESQ = -1
3739 0 : DO I = 1, nSpc
3740 0 : SELECT CASE ( TRIM(SpcNames(I)) )
3741 : CASE( 'ISOP' )
3742 0 : IF ( .not. Inst%OFFLINE_BIOGENICVOC ) THEN
3743 0 : Inst%IDTISOP = HcoIDs(I)
3744 0 : WRITE(MSG,*) ' Isoprene = ',TRIM(SpcNames(I)),Inst%IDTISOP
3745 : ELSE
3746 : WRITE(MSG,*) ' Isoprene will be obtained from ' // &
3747 0 : 'offline biogenic VOC emissions'
3748 : ENDIF
3749 : CASE( 'ACET' )
3750 0 : IF ( .not. Inst%OFFLINE_BIOGENICVOC ) THEN
3751 0 : Inst%IDTACET = HcoIDs(I)
3752 0 : WRITE(MSG,*) ' Acetone = ',TRIM(SpcNames(I)),Inst%IDTACET
3753 : ELSE
3754 : WRITE(MSG,*) ' Acetone will be obtained from ' // &
3755 0 : 'offline biogenic VOC emissions'
3756 : ENDIF
3757 : CASE( 'PRPE' )
3758 0 : IF ( .not. Inst%OFFLINE_BIOGENICVOC ) THEN
3759 0 : Inst%IDTPRPE = HcoIDs(I)
3760 0 : WRITE(MSG,*) ' PRPE = ',TRIM(SpcNames(I)),Inst%IDTPRPE
3761 : ELSE
3762 : WRITE(MSG,*) ' PRPE will be obtained from ' // &
3763 0 : 'offline biogenic VOC emissions'
3764 : ENDIF
3765 : CASE( 'ALD2' )
3766 0 : IF ( .not. Inst%OFFLINE_BIOGENICVOC ) THEN
3767 0 : Inst%IDTALD2 = HcoIDs(I)
3768 0 : WRITE(MSG,*) ' ALD2 = ',TRIM(SpcNames(I)),Inst%IDTALD2
3769 : ELSE
3770 : WRITE(MSG,*) ' ALD2 will be obtained from ' // &
3771 0 : 'offline biogenic VOC emissions'
3772 : ENDIF
3773 : CASE( 'MOH' )
3774 0 : IF ( .not. Inst%OFFLINE_BIOGENICVOC ) THEN
3775 0 : Inst%IDTMOH = HcoIDs(I)
3776 0 : WRITE(MSG,*) ' MOH = ',TRIM(SpcNames(I)),Inst%IDTMOH
3777 : ELSE
3778 : WRITE(MSG,*) ' MOH will be obtained from ' // &
3779 0 : 'offline biogenic VOC emissions'
3780 : ENDIF
3781 : CASE( 'EOH' )
3782 0 : IF ( .not. Inst%OFFLINE_BIOGENICVOC ) THEN
3783 0 : Inst%IDTEOH = HcoIDs(I)
3784 0 : WRITE(MSG,*) ' EOH = ',TRIM(SpcNames(I)),Inst%IDTEOH
3785 : ELSE
3786 : WRITE(MSG,*) ' EOH will be obtained from ' // &
3787 0 : 'offline biogenic VOC emissions'
3788 : ENDIF
3789 : CASE( 'C2H4' )
3790 0 : IF ( .not. Inst%OFFLINE_BIOGENICVOC ) THEN
3791 0 : Inst%IDTC2H4 = HcoIDs(I)
3792 0 : WRITE(MSG,*) ' C2H4 = ',TRIM(SpcNames(I)),Inst%IDTC2H4
3793 : ELSE
3794 : WRITE(MSG,*) ' C2H4 will be obtained from ' // &
3795 0 : 'offline biogenic VOC emissions'
3796 : ENDIF
3797 : CASE( 'SOAP' )
3798 0 : IF ( .not. Inst%OFFLINE_BIOGENICVOC ) THEN
3799 0 : Inst%IDTSOAP = HcoIDs(I)
3800 0 : WRITE(MSG,*) ' SOAP = ',TRIM(SpcNames(I)),Inst%IDTSOAP
3801 : ELSE
3802 : WRITE(MSG,*) ' SOAP will be obtained from ' // &
3803 0 : 'offline biogenic VOC emissions'
3804 : ENDIF
3805 : CASE( 'SOAS' )
3806 0 : IF ( .not. Inst%OFFLINE_BIOGENICVOC ) THEN
3807 0 : Inst%IDTSOAS = HcoIDs(I)
3808 0 : WRITE(MSG,*) ' SOAS = ',TRIM(SpcNames(I)),Inst%IDTSOAS
3809 : ELSE
3810 : WRITE(MSG,*) ' SOAS will be obtained from ' // &
3811 0 : 'offline biogenic VOC emissions'
3812 : ENDIF
3813 : CASE( 'MTPA' )
3814 0 : IF ( .not. Inst%OFFLINE_BIOGENICVOC ) THEN
3815 0 : Inst%IDTMTPA = HcoIDs(I)
3816 0 : WRITE(MSG,*) ' MTPA = ',TRIM(SpcNames(I)),Inst%IDTMTPA
3817 : ELSE
3818 : WRITE(MSG,*) ' MTPA will be obtained from ' // &
3819 0 : 'offline biogenic VOC emissions'
3820 : ENDIF
3821 : CASE( 'MTPO' )
3822 0 : IF ( .not. Inst%OFFLINE_BIOGENICVOC ) THEN
3823 0 : Inst%IDTMTPO = HcoIDs(I)
3824 0 : WRITE(MSG,*) ' MTPO = ',TRIM(SpcNames(I)),Inst%IDTMTPO
3825 : ELSE
3826 : WRITE(MSG,*) ' MTPO will be obtained from ' // &
3827 0 : 'offline biogenic VOC emissions'
3828 : ENDIF
3829 : CASE( 'LIMO' )
3830 0 : IF ( .not. Inst%OFFLINE_BIOGENICVOC ) THEN
3831 0 : Inst%IDTLIMO = HcoIDs(I)
3832 0 : WRITE(MSG,*) ' LIMO = ',TRIM(SpcNames(I)),Inst%IDTLIMO
3833 : ELSE
3834 : WRITE(MSG,*) ' LIMO will be obtained from ' // &
3835 0 : 'offline biogenic VOC emissions'
3836 : ENDIF
3837 : CASE( 'SESQ' )
3838 0 : IF ( .not. Inst%OFFLINE_BIOGENICVOC ) THEN
3839 0 : Inst%IDTSESQ = HcoIDs(I)
3840 0 : WRITE(MSG,*) ' SESQ = ',TRIM(SpcNames(I)),Inst%IDTSESQ
3841 : ELSE
3842 : WRITE(MSG,*) ' SESQ will be obtained from ' // &
3843 0 : 'offline biogenic VOC emissions'
3844 : ENDIF
3845 : CASE DEFAULT
3846 0 : MSG = 'Invalid species names: ' // TRIM(SpcNames(I))
3847 0 : CALL HCO_ERROR(MSG, RC )
3848 0 : RETURN
3849 : END SELECT
3850 :
3851 : ! Verbose
3852 0 : IF ( HcoState%amIRoot ) CALL HCO_MSG( HcoState%Config%Err, MSG )
3853 : ENDDO
3854 :
3855 : ! Verbose mode
3856 0 : IF ( HcoState%amIRoot ) THEN
3857 0 : WRITE(MSG,*) ' --> Isoprene scale factor is ',Inst%ISOP_SCALING
3858 0 : CALL HCO_MSG( HcoState%Config%Err, MSG )
3859 0 : WRITE(MSG,*) ' --> Use CO2 inhibition on isoprene option ', &
3860 0 : Inst%LISOPCO2
3861 0 : CALL HCO_MSG( HcoState%Config%Err, MSG )
3862 0 : WRITE(MSG,*) ' --> Global atmospheric CO2 concentration : ', &
3863 0 : Inst%GLOBCO2, ' ppmv'
3864 0 : CALL HCO_MSG( HcoState%Config%Err, MSG )
3865 0 : WRITE(MSG,*) ' --> Normalize LAI by PFT: ', &
3866 0 : Inst%NORMLAI
3867 0 : CALL HCO_MSG( HcoState%Config%Err, MSG )
3868 0 : WRITE(MSG,*) ' --> Isoprene to SOA-Precursor', &
3869 : !convert back to direct mass basis just for show
3870 0 : Inst%ISOPTOSOAP / 1.134
3871 0 : CALL HCO_MSG( HcoState%Config%Err, MSG )
3872 0 : WRITE(MSG,*) ' --> Isoprene direct to SOA (Simple)', &
3873 : !convert back to direct mass basis just for show
3874 0 : Inst%ISOPTOSOAS / 1.134
3875 0 : CALL HCO_MSG( HcoState%Config%Err, MSG )
3876 0 : WRITE(MSG,*) ' --> Monoterpene to SOA-Precursor', &
3877 : !convert back to direct mass basis just for show
3878 0 : Inst%MONOTOSOAP / 1.134
3879 0 : CALL HCO_MSG( HcoState%Config%Err, MSG )
3880 0 : WRITE(MSG,*) ' --> Monoterpene direct to SOA (Simple)', &
3881 : !convert back to direct mass basis just for show
3882 0 : Inst%MONOTOSOAS / 1.134
3883 0 : CALL HCO_MSG( HcoState%Config%Err, MSG )
3884 0 : WRITE(MSG,*) ' --> Othrterpene to SOA-Precursor', &
3885 : !convert back to direct mass basis just for show
3886 0 : Inst%OTHRTOSOAP / 1.134
3887 0 : CALL HCO_MSG( HcoState%Config%Err, MSG )
3888 0 : WRITE(MSG,*) ' --> Othrterpene direct to SOA (Simple)', &
3889 : !convert back to direct mass basis just for show
3890 0 : Inst%OTHRTOSOAS / 1.134
3891 0 : CALL HCO_MSG( HcoState%Config%Err, MSG )
3892 : ENDIF
3893 :
3894 : CALL GetExtOpt( HcoState%Config, ExtNr, 'MEGAN_SUFFIX', &
3895 0 : OptValChar=Inst%SUFFIX, FOUND=FOUND, RC=RC )
3896 0 : IF ( RC /= HCO_SUCCESS ) THEN
3897 0 : CALL HCO_ERROR( 'ERROR 44', RC, THISLOC=LOC )
3898 0 : RETURN
3899 : ENDIF
3900 0 : IF ( .NOT. FOUND ) Inst%SUFFIX = ''
3901 :
3902 : !-----------------------------------------------------------------
3903 : ! Allocate module variables
3904 : !-----------------------------------------------------------------
3905 :
3906 : ! Get horizontal grid extensions on this CPU
3907 0 : NX = HcoState%NX
3908 0 : NY = HcoState%NY
3909 :
3910 0 : ALLOCATE( Inst%T_LAST24H( NX, NY ), STAT=AS )
3911 0 : IF ( AS /= 0 ) THEN
3912 0 : CALL HCO_ERROR( 'T_LAST24H', RC )
3913 0 : RETURN
3914 : ENDIF
3915 0 : Inst%T_LAST24H = 0.0_sp
3916 :
3917 0 : ALLOCATE( Inst%T_LASTXDAYS( NX, NY ), STAT=AS )
3918 : IF ( AS /= 0 ) THEN
3919 0 : CALL HCO_ERROR( 'T_LASTXDAYS', RC )
3920 0 : RETURN
3921 : ENDIF
3922 0 : Inst%T_LASTXDAYS = 0.0_sp
3923 :
3924 0 : ALLOCATE( Inst%PARDR_LASTXDAYS( NX, NY ), STAT=AS )
3925 : IF ( AS /= 0 ) THEN
3926 0 : CALL HCO_ERROR( 'PARDR_LASTXDAYS', RC )
3927 0 : RETURN
3928 : ENDIF
3929 0 : Inst%PARDR_LASTXDAYS = 0.0_sp
3930 :
3931 0 : ALLOCATE( Inst%PARDF_LASTXDAYS( NX, NY ), STAT=AS )
3932 : IF ( AS /= 0 ) THEN
3933 0 : CALL HCO_ERROR( 'PARDF_LASTXDAYS', RC )
3934 0 : RETURN
3935 : ENDIF
3936 0 : Inst%PARDF_LASTXDAYS = 0.0_sp
3937 :
3938 0 : ALLOCATE( Inst%LAI_PREVDAY( NX, NY ), STAT=AS )
3939 : IF ( AS /= 0 ) THEN
3940 0 : CALL HCO_ERROR( 'LAI_PREVDAY', RC )
3941 0 : RETURN
3942 : ENDIF
3943 0 : Inst%LAI_PREVDAY = 0.0_sp
3944 :
3945 : ! Normalization factor
3946 : ! There should be a different normalization factor for each compound, but
3947 : ! we calculate only 1 normalization factor for all compounds (dbm 11/2012)
3948 0 : ALLOCATE( Inst%NORM_FAC( 1 ), STAT=AS )
3949 : IF ( AS /= 0 ) THEN
3950 0 : CALL HCO_ERROR( 'NORM_FAC', RC )
3951 0 : RETURN
3952 : ENDIF
3953 0 : Inst%NORM_FAC = -99d0
3954 :
3955 0 : ALLOCATE( Inst%AEF_APIN( NX, NY ), STAT=AS )
3956 : IF ( AS /= 0 ) THEN
3957 0 : CALL HCO_ERROR( 'AEF_APIN', RC )
3958 0 : RETURN
3959 : ENDIF
3960 0 : Inst%AEF_APIN = 0.0_hp
3961 :
3962 0 : ALLOCATE( Inst%AEF_MYRC( NX, NY ), STAT=AS )
3963 : IF ( AS /= 0 ) THEN
3964 0 : CALL HCO_ERROR( 'AEF_MYRC', RC )
3965 0 : RETURN
3966 : ENDIF
3967 0 : Inst%AEF_MYRC = 0.0_hp
3968 :
3969 0 : ALLOCATE( Inst%AEF_OMON( NX, NY ), STAT=AS )
3970 : IF ( AS /= 0 ) THEN
3971 0 : CALL HCO_ERROR( 'AEF_OMON', RC )
3972 0 : RETURN
3973 : ENDIF
3974 0 : Inst%AEF_OMON = 0.0_hp
3975 :
3976 0 : ALLOCATE( Inst%AEF_FARN( NX, NY ), STAT=AS )
3977 : IF ( AS /= 0 ) THEN
3978 0 : CALL HCO_ERROR( 'AEF_FARN', RC )
3979 0 : RETURN
3980 : ENDIF
3981 0 : Inst%AEF_FARN = 0.0_hp
3982 :
3983 0 : ALLOCATE( Inst%AEF_BCAR( NX, NY ), STAT=AS )
3984 : IF ( AS /= 0 ) THEN
3985 0 : CALL HCO_ERROR( 'AEF_BCAR', RC )
3986 0 : RETURN
3987 : ENDIF
3988 0 : Inst%AEF_BCAR = 0.0_hp
3989 :
3990 0 : ALLOCATE( Inst%AEF_OSQT( NX, NY ), STAT=AS )
3991 : IF ( AS /= 0 ) THEN
3992 0 : CALL HCO_ERROR( 'AEF_OSQT', RC )
3993 0 : RETURN
3994 : ENDIF
3995 0 : Inst%AEF_OSQT = 0.0_hp
3996 :
3997 0 : ALLOCATE( Inst%AEF_MOH( NX, NY ), STAT=AS )
3998 : IF ( AS /= 0 ) THEN
3999 0 : CALL HCO_ERROR( 'AEF_MOH', RC )
4000 0 : RETURN
4001 : ENDIF
4002 0 : Inst%AEF_MOH = 0.0_hp
4003 :
4004 0 : ALLOCATE( Inst%AEF_ACET( NX, NY ), STAT=AS )
4005 : IF ( AS /= 0 ) THEN
4006 0 : CALL HCO_ERROR( 'AEF_ACET', RC )
4007 0 : RETURN
4008 : ENDIF
4009 0 : Inst%AEF_ACET = 0.0_hp
4010 :
4011 0 : ALLOCATE( Inst%AEF_EOH( NX, NY ), STAT=AS )
4012 : IF ( AS /= 0 ) THEN
4013 0 : CALL HCO_ERROR( 'AEF_EOH', RC )
4014 0 : RETURN
4015 : ENDIF
4016 0 : Inst%AEF_EOH = 0.0_hp
4017 :
4018 0 : ALLOCATE( Inst%AEF_CH2O( NX, NY ), STAT=AS )
4019 : IF ( AS /= 0 ) THEN
4020 0 : CALL HCO_ERROR( 'AEF_CH2O', RC )
4021 0 : RETURN
4022 : ENDIF
4023 0 : Inst%AEF_CH2O = 0.0_hp
4024 :
4025 0 : ALLOCATE( Inst%AEF_ALD2( NX, NY ), STAT=AS )
4026 : IF ( AS /= 0 ) THEN
4027 0 : CALL HCO_ERROR( 'AEF_ALD2', RC )
4028 0 : RETURN
4029 : ENDIF
4030 0 : Inst%AEF_ALD2 = 0.0_hp
4031 :
4032 0 : ALLOCATE( Inst%AEF_FAXX( NX, NY ), STAT=AS )
4033 : IF ( AS /= 0 ) THEN
4034 0 : CALL HCO_ERROR( 'AEF_FAXX', RC )
4035 0 : RETURN
4036 : ENDIF
4037 0 : Inst%AEF_FAXX = 0.0_hp
4038 :
4039 0 : ALLOCATE( Inst%AEF_AAXX( NX, NY ), STAT=AS )
4040 : IF ( AS /= 0 ) THEN
4041 0 : CALL HCO_ERROR( 'AEF_AAXX', RC )
4042 0 : RETURN
4043 : ENDIF
4044 0 : Inst%AEF_AAXX = 0.0_hp
4045 :
4046 0 : ALLOCATE( Inst%AEF_C2H4( NX, NY ), STAT=AS )
4047 : IF ( AS /= 0 ) THEN
4048 0 : CALL HCO_ERROR( 'AEF_C2H4', RC )
4049 0 : RETURN
4050 : ENDIF
4051 0 : Inst%AEF_C2H4 = 0.0_hp
4052 :
4053 0 : ALLOCATE( Inst%AEF_TOLU( NX, NY ), STAT=AS )
4054 : IF ( AS /= 0 ) THEN
4055 0 : CALL HCO_ERROR( 'AEF_TOLU', RC )
4056 0 : RETURN
4057 : ENDIF
4058 0 : Inst%AEF_TOLU = 0.0_hp
4059 :
4060 0 : ALLOCATE( Inst%AEF_HCNX( NX, NY ), STAT=AS )
4061 : IF ( AS /= 0 ) THEN
4062 0 : CALL HCO_ERROR( 'AEF_HCNX', RC )
4063 0 : RETURN
4064 : ENDIF
4065 0 : Inst%AEF_HCNX = 0.0_hp
4066 :
4067 0 : ALLOCATE( Inst%AEF_PRPE( NX, NY ), STAT=AS )
4068 : IF ( AS /= 0 ) THEN
4069 0 : CALL HCO_ERROR( 'AEF_PRPE', RC )
4070 0 : RETURN
4071 : ENDIF
4072 0 : Inst%AEF_PRPE = 0.0_hp
4073 :
4074 0 : ALLOCATE( Inst%FLUXISOP( NX, NY ), STAT=AS )
4075 : IF ( AS /= 0 ) THEN
4076 0 : CALL HCO_ERROR( 'FLUXISOP', RC )
4077 0 : RETURN
4078 : ENDIF
4079 0 : Inst%FLUXISOP = 0.0_hp
4080 :
4081 0 : ALLOCATE( Inst%FLUXMONO( NX, NY ), STAT=AS )
4082 : IF ( AS /= 0 ) THEN
4083 0 : CALL HCO_ERROR( 'FLUXMONO', RC )
4084 0 : RETURN
4085 : ENDIF
4086 0 : Inst%FLUXMONO = 0.0_hp
4087 :
4088 0 : ALLOCATE( Inst%FLUXACET( NX, NY ), STAT=AS )
4089 : IF ( AS /= 0 ) THEN
4090 0 : CALL HCO_ERROR( 'FLUXACET', RC )
4091 0 : RETURN
4092 : ENDIF
4093 0 : Inst%FLUXACET = 0.0_hp
4094 :
4095 0 : ALLOCATE( Inst%FLUXACETmb( NX, NY ), STAT=AS )
4096 : IF ( AS /= 0 ) THEN
4097 0 : CALL HCO_ERROR( 'FLUXACETmb', RC )
4098 0 : RETURN
4099 : ENDIF
4100 0 : Inst%FLUXACETmb = 0.0_sp
4101 :
4102 0 : ALLOCATE( Inst%FLUXACETbg( NX, NY ), STAT=AS )
4103 : IF ( AS /= 0 ) THEN
4104 0 : CALL HCO_ERROR( 'FLUXACETbg', RC )
4105 0 : RETURN
4106 : ENDIF
4107 0 : Inst%FLUXACETbg = 0.0_sp
4108 :
4109 0 : ALLOCATE( Inst%FLUXPRPE( NX, NY ), STAT=AS )
4110 : IF ( AS /= 0 ) THEN
4111 0 : CALL HCO_ERROR( 'FLUXPRPE', RC )
4112 0 : RETURN
4113 : ENDIF
4114 0 : Inst%FLUXPRPE = 0.0_hp
4115 :
4116 0 : ALLOCATE( Inst%FLUXC2H4( NX, NY ), STAT=AS )
4117 : IF ( AS /= 0 ) THEN
4118 0 : CALL HCO_ERROR( 'FLUXC2H4', RC )
4119 0 : RETURN
4120 : ENDIF
4121 0 : Inst%FLUXC2H4 = 0.0_hp
4122 :
4123 0 : ALLOCATE( Inst%FLUXLIMO( NX, NY ), STAT=AS )
4124 : IF ( AS /= 0 ) THEN
4125 0 : CALL HCO_ERROR( 'FLUXLIMO', RC )
4126 0 : RETURN
4127 : ENDIF
4128 0 : Inst%FLUXLIMO = 0.0_hp
4129 :
4130 0 : ALLOCATE( Inst%FLUXMTPA( NX, NY ), STAT=AS )
4131 : IF ( AS /= 0 ) THEN
4132 0 : CALL HCO_ERROR( 'FLUXMTPA', RC )
4133 0 : RETURN
4134 : ENDIF
4135 0 : Inst%FLUXMTPA = 0.0_hp
4136 :
4137 0 : ALLOCATE( Inst%FLUXMTPO( NX, NY ), STAT=AS )
4138 : IF ( AS /= 0 ) THEN
4139 0 : CALL HCO_ERROR( 'FLUXMTPO', RC )
4140 0 : RETURN
4141 : ENDIF
4142 0 : Inst%FLUXMTPO = 0.0_hp
4143 :
4144 0 : ALLOCATE( Inst%FLUXSESQ( NX, NY ), STAT=AS )
4145 : IF ( AS /= 0 ) THEN
4146 0 : CALL HCO_ERROR( 'FLUXSESQ', RC )
4147 0 : RETURN
4148 : ENDIF
4149 0 : Inst%FLUXSESQ = 0.0_hp
4150 :
4151 0 : ALLOCATE( Inst%FLUXSOAP( NX, NY ), STAT=AS )
4152 : IF ( AS /= 0 ) THEN
4153 0 : CALL HCO_ERROR( 'FLUXSOAP', RC )
4154 0 : RETURN
4155 : ENDIF
4156 0 : Inst%FLUXSOAP = 0.0_hp
4157 :
4158 0 : ALLOCATE( Inst%FLUXSOAS( NX, NY ), STAT=AS )
4159 : IF ( AS /= 0 ) THEN
4160 0 : CALL HCO_ERROR( 'FLUXSOAS', RC )
4161 0 : RETURN
4162 : ENDIF
4163 0 : Inst%FLUXSOAS = 0.0_hp
4164 :
4165 0 : ALLOCATE( Inst%FLUXALD2( NX, NY ), STAT=AS )
4166 : IF ( AS /= 0 ) THEN
4167 0 : CALL HCO_ERROR( 'FLUXALD2', RC )
4168 0 : RETURN
4169 : ENDIF
4170 0 : Inst%FLUXALD2 = 0.0_hp
4171 :
4172 0 : ALLOCATE( Inst%FLUXMOH( NX, NY ), STAT=AS )
4173 : IF ( AS /= 0 ) THEN
4174 0 : CALL HCO_ERROR( 'FLUXMOH', RC )
4175 0 : RETURN
4176 : ENDIF
4177 0 : Inst%FLUXMOH = 0.0_hp
4178 :
4179 0 : ALLOCATE( Inst%FLUXEOH( NX, NY ), STAT=AS )
4180 : IF ( AS /= 0 ) THEN
4181 0 : CALL HCO_ERROR( 'FLUXEOH', RC )
4182 0 : RETURN
4183 : ENDIF
4184 0 : Inst%FLUXEOH = 0.0_hp
4185 :
4186 0 : ALLOCATE( Inst%FLUXAPIN( NX, NY ), STAT=AS )
4187 : IF ( AS /= 0 ) THEN
4188 0 : CALL HCO_ERROR( 'FLUXAPIN', RC )
4189 0 : RETURN
4190 : ENDIF
4191 0 : Inst%FLUXAPIN = 0.0_sp
4192 :
4193 0 : ALLOCATE( Inst%FLUXBPIN( NX, NY ), STAT=AS )
4194 : IF ( AS /= 0 ) THEN
4195 0 : CALL HCO_ERROR( 'FLUXBPIN', RC )
4196 0 : RETURN
4197 : ENDIF
4198 0 : Inst%FLUXBPIN = 0.0_sp
4199 :
4200 0 : ALLOCATE( Inst%FLUXSABI( NX, NY ), STAT=AS )
4201 : IF ( AS /= 0 ) THEN
4202 0 : CALL HCO_ERROR( 'FLUXSABI', RC )
4203 0 : RETURN
4204 : ENDIF
4205 0 : Inst%FLUXSABI = 0.0_sp
4206 :
4207 0 : ALLOCATE( Inst%FLUXMYRC( NX, NY ), STAT=AS )
4208 : IF ( AS /= 0 ) THEN
4209 0 : CALL HCO_ERROR( 'FLUXMYRC', RC )
4210 0 : RETURN
4211 : ENDIF
4212 0 : Inst%FLUXMYRC = 0.0_sp
4213 :
4214 0 : ALLOCATE( Inst%FLUXCARE( NX, NY ), STAT=AS )
4215 : IF ( AS /= 0 ) THEN
4216 0 : CALL HCO_ERROR( 'FLUXCARE', RC )
4217 0 : RETURN
4218 : ENDIF
4219 0 : Inst%FLUXCARE = 0.0_sp
4220 :
4221 0 : ALLOCATE( Inst%FLUXOCIM( NX, NY ), STAT=AS )
4222 : IF ( AS /= 0 ) THEN
4223 0 : CALL HCO_ERROR( 'FLUXOCIM', RC )
4224 0 : RETURN
4225 : ENDIF
4226 0 : Inst%FLUXOCIM = 0.0_sp
4227 :
4228 0 : ALLOCATE( Inst%FLUXOMON( NX, NY ), STAT=AS )
4229 : IF ( AS /= 0 ) THEN
4230 0 : CALL HCO_ERROR( 'FLUXOMON', RC )
4231 0 : RETURN
4232 : ENDIF
4233 0 : Inst%FLUXOMON = 0.0_sp
4234 :
4235 0 : ALLOCATE( Inst%FLUXFARN( NX, NY ), STAT=AS )
4236 : IF ( AS /= 0 ) THEN
4237 0 : CALL HCO_ERROR( 'FLUXFARN', RC )
4238 0 : RETURN
4239 : ENDIF
4240 0 : Inst%FLUXFARN = 0.0_sp
4241 :
4242 0 : ALLOCATE( Inst%FLUXBCAR( NX, NY ), STAT=AS )
4243 : IF ( AS /= 0 ) THEN
4244 0 : CALL HCO_ERROR( 'FLUXBCAR', RC )
4245 0 : RETURN
4246 : ENDIF
4247 0 : Inst%FLUXBCAR = 0.0_sp
4248 :
4249 0 : ALLOCATE( Inst%FLUXOSQT( NX, NY ), STAT=AS )
4250 : IF ( AS /= 0 ) THEN
4251 0 : CALL HCO_ERROR( 'FLUXOSQT', RC )
4252 0 : RETURN
4253 : ENDIF
4254 0 : Inst%FLUXOSQT = 0.0_sp
4255 :
4256 0 : ALLOCATE( Inst%FLUXMBOX( NX, NY ), STAT=AS )
4257 : IF ( AS /= 0 ) THEN
4258 0 : CALL HCO_ERROR( 'FLUXMBOX', RC )
4259 0 : RETURN
4260 : ENDIF
4261 0 : Inst%FLUXMBOX = 0.0_sp
4262 :
4263 0 : ALLOCATE( Inst%FLUXFAXX( NX, NY ), STAT=AS )
4264 : IF ( AS /= 0 ) THEN
4265 0 : CALL HCO_ERROR( 'FLUXFAXX', RC )
4266 0 : RETURN
4267 : ENDIF
4268 0 : Inst%FLUXFAXX = 0.0_sp
4269 :
4270 0 : ALLOCATE( Inst%FLUXAAXX( NX, NY ), STAT=AS )
4271 : IF ( AS /= 0 ) THEN
4272 0 : CALL HCO_ERROR( 'FLUXAAXX', RC )
4273 0 : RETURN
4274 : ENDIF
4275 0 : Inst%FLUXAAXX = 0.0_sp
4276 :
4277 0 : ALLOCATE( Inst%ARRAY_16( NX, NY, 16 ), STAT=AS )
4278 : IF ( AS /= 0 ) THEN
4279 0 : CALL HCO_ERROR( 'ARRAY_16', RC )
4280 0 : RETURN
4281 : ENDIF
4282 0 : Inst%ARRAY_16 = 0.0_hp
4283 :
4284 : ALLOCATE ( Inst%AEF_ISOP ( NX, NY ), &
4285 : Inst%AEF_MBOX ( NX, NY ), &
4286 : Inst%AEF_BPIN ( NX, NY ), &
4287 : Inst%AEF_CARE ( NX, NY ), &
4288 : Inst%AEF_LIMO ( NX, NY ), &
4289 : Inst%AEF_OCIM ( NX, NY ), &
4290 0 : Inst%AEF_SABI ( NX, NY ), STAT=AS )
4291 0 : IF ( AS /= 0 ) THEN
4292 0 : CALL HCO_ERROR( 'AEF allocation error', RC )
4293 0 : RETURN
4294 : ENDIF
4295 0 : Inst%AEF_ISOP = 0.0_hp
4296 0 : Inst%AEF_MBOX = 0.0_hp
4297 0 : Inst%AEF_BPIN = 0.0_hp
4298 0 : Inst%AEF_CARE = 0.0_hp
4299 0 : Inst%AEF_LIMO = 0.0_hp
4300 0 : Inst%AEF_OCIM = 0.0_hp
4301 0 : Inst%AEF_SABI = 0.0_hp
4302 :
4303 : !=================================================================
4304 : ! Create manual diagnostics
4305 : !=================================================================
4306 : CALL Diagn_Create( HcoState = HcoState, &
4307 : cName = 'InvMEGAN_ACET_MBOX', &
4308 : ExtNr = ExtNr, &
4309 : Cat = -1, &
4310 : Hier = -1, &
4311 : HcoID = -1, &
4312 : SpaceDim = 2, &
4313 : OutUnit = 'kg/m2/s', &
4314 : AutoFill = 0, &
4315 : Trgt2D = Inst%FLUXACETmb, &
4316 0 : RC = RC )
4317 0 : IF ( RC /= HCO_SUCCESS ) THEN
4318 0 : CALL HCO_ERROR( 'ERROR 45', RC, THISLOC=LOC )
4319 0 : RETURN
4320 : ENDIF
4321 :
4322 : CALL Diagn_Create( HcoState = HcoState, &
4323 : cName = 'InvMEGAN_ACET_DIRECT',&
4324 : ExtNr = ExtNr, &
4325 : Cat = -1, &
4326 : Hier = -1, &
4327 : HcoID = -1, &
4328 : SpaceDim = 2, &
4329 : OutUnit = 'kg/m2/s', &
4330 : AutoFill = 0, &
4331 : Trgt2D = Inst%FLUXACETbg, &
4332 0 : RC = RC )
4333 0 : IF ( RC /= HCO_SUCCESS ) THEN
4334 0 : CALL HCO_ERROR( 'ERROR 46', RC, THISLOC=LOC )
4335 0 : RETURN
4336 : ENDIF
4337 :
4338 : CALL Diagn_Create( HcoState = HcoState, &
4339 : cName = 'InvMEGAN_APIN', &
4340 : ExtNr = ExtNr, &
4341 : Cat = -1, &
4342 : Hier = -1, &
4343 : HcoID = -1, &
4344 : SpaceDim = 2, &
4345 : OutUnit = 'kg/m2/s', &
4346 : AutoFill = 0, &
4347 : Trgt2D = Inst%FLUXAPIN, &
4348 0 : RC = RC )
4349 0 : IF ( RC /= HCO_SUCCESS ) THEN
4350 0 : CALL HCO_ERROR( 'ERROR 47', RC, THISLOC=LOC )
4351 0 : RETURN
4352 : ENDIF
4353 :
4354 : CALL Diagn_Create( HcoState = HcoState, &
4355 : cName = 'InvMEGAN_BPIN', &
4356 : ExtNr = ExtNr, &
4357 : Cat = -1, &
4358 : Hier = -1, &
4359 : HcoID = -1, &
4360 : SpaceDim = 2, &
4361 : OutUnit = 'kg/m2/s', &
4362 : AutoFill = 0, &
4363 : Trgt2D = Inst%FLUXBPIN, &
4364 0 : RC = RC )
4365 0 : IF ( RC /= HCO_SUCCESS ) THEN
4366 0 : CALL HCO_ERROR( 'ERROR 48', RC, THISLOC=LOC )
4367 0 : RETURN
4368 : ENDIF
4369 :
4370 : CALL Diagn_Create( HcoState = HcoState, &
4371 : cName = 'InvMEGAN_SABI', &
4372 : ExtNr = ExtNr, &
4373 : Cat = -1, &
4374 : Hier = -1, &
4375 : HcoID = -1, &
4376 : SpaceDim = 2, &
4377 : OutUnit = 'kg/m2/s', &
4378 : AutoFill = 0, &
4379 : Trgt2D = Inst%FLUXSABI, &
4380 0 : RC = RC )
4381 0 : IF ( RC /= HCO_SUCCESS ) THEN
4382 0 : CALL HCO_ERROR( 'ERROR 49', RC, THISLOC=LOC )
4383 0 : RETURN
4384 : ENDIF
4385 :
4386 : CALL Diagn_Create( HcoState = HcoState, &
4387 : cName = 'InvMEGAN_MYRC', &
4388 : ExtNr = ExtNr, &
4389 : Cat = -1, &
4390 : Hier = -1, &
4391 : HcoID = -1, &
4392 : SpaceDim = 2, &
4393 : OutUnit = 'kg/m2/s', &
4394 : AutoFill = 0, &
4395 : Trgt2D = Inst%FLUXMYRC, &
4396 0 : RC = RC )
4397 0 : IF ( RC /= HCO_SUCCESS ) THEN
4398 0 : CALL HCO_ERROR( 'ERROR 50', RC, THISLOC=LOC )
4399 0 : RETURN
4400 : ENDIF
4401 :
4402 : CALL Diagn_Create( HcoState = HcoState, &
4403 : cName = 'InvMEGAN_CARE', &
4404 : ExtNr = ExtNr, &
4405 : Cat = -1, &
4406 : Hier = -1, &
4407 : HcoID = -1, &
4408 : SpaceDim = 2, &
4409 : OutUnit = 'kg/m2/s', &
4410 : AutoFill = 0, &
4411 : Trgt2D = Inst%FLUXCARE, &
4412 0 : RC = RC )
4413 0 : IF ( RC /= HCO_SUCCESS ) THEN
4414 0 : CALL HCO_ERROR( 'ERROR 51', RC, THISLOC=LOC )
4415 0 : RETURN
4416 : ENDIF
4417 :
4418 : CALL Diagn_Create( HcoState = HcoState, &
4419 : cName = 'InvMEGAN_OCIM', &
4420 : ExtNr = ExtNr, &
4421 : Cat = -1, &
4422 : Hier = -1, &
4423 : HcoID = -1, &
4424 : SpaceDim = 2, &
4425 : OutUnit = 'kg/m2/s', &
4426 : AutoFill = 0, &
4427 : Trgt2D = Inst%FLUXOCIM, &
4428 0 : RC = RC )
4429 0 : IF ( RC /= HCO_SUCCESS ) THEN
4430 0 : CALL HCO_ERROR( 'ERROR 52', RC, THISLOC=LOC )
4431 0 : RETURN
4432 : ENDIF
4433 :
4434 : CALL Diagn_Create( HcoState = HcoState, &
4435 : cName = 'InvMEGAN_OMON', &
4436 : ExtNr = ExtNr, &
4437 : Cat = -1, &
4438 : Hier = -1, &
4439 : HcoID = -1, &
4440 : SpaceDim = 2, &
4441 : OutUnit = 'kg/m2/s', &
4442 : AutoFill = 0, &
4443 : Trgt2D = Inst%FLUXOMON, &
4444 0 : RC = RC )
4445 0 : IF ( RC /= HCO_SUCCESS ) THEN
4446 0 : CALL HCO_ERROR( 'ERROR 53', RC, THISLOC=LOC )
4447 0 : RETURN
4448 : ENDIF
4449 :
4450 : CALL Diagn_Create( HcoState = HcoState, &
4451 : cName = 'InvMEGAN_FARN', &
4452 : ExtNr = ExtNr, &
4453 : Cat = -1, &
4454 : Hier = -1, &
4455 : HcoID = -1, &
4456 : SpaceDim = 2, &
4457 : OutUnit = 'kg/m2/s', &
4458 : AutoFill = 0, &
4459 : Trgt2D = Inst%FLUXFARN, &
4460 0 : RC = RC )
4461 0 : IF ( RC /= HCO_SUCCESS ) THEN
4462 0 : CALL HCO_ERROR( 'ERROR 54', RC, THISLOC=LOC )
4463 0 : RETURN
4464 : ENDIF
4465 :
4466 : CALL Diagn_Create( HcoState = HcoState, &
4467 : cName = 'InvMEGAN_BCAR', &
4468 : ExtNr = ExtNr, &
4469 : Cat = -1, &
4470 : Hier = -1, &
4471 : HcoID = -1, &
4472 : SpaceDim = 2, &
4473 : OutUnit = 'kg/m2/s', &
4474 : AutoFill = 0, &
4475 : Trgt2D = Inst%FLUXBCAR, &
4476 0 : RC = RC )
4477 0 : IF ( RC /= HCO_SUCCESS ) THEN
4478 0 : CALL HCO_ERROR( 'ERROR 55', RC, THISLOC=LOC )
4479 0 : RETURN
4480 : ENDIF
4481 :
4482 : CALL Diagn_Create( HcoState = HcoState, &
4483 : cName = 'InvMEGAN_OSQT', &
4484 : ExtNr = ExtNr, &
4485 : Cat = -1, &
4486 : Hier = -1, &
4487 : HcoID = -1, &
4488 : SpaceDim = 2, &
4489 : OutUnit = 'kg/m2/s', &
4490 : AutoFill = 0, &
4491 : Trgt2D = Inst%FLUXOSQT, &
4492 0 : RC = RC )
4493 0 : IF ( RC /= HCO_SUCCESS ) THEN
4494 0 : CALL HCO_ERROR( 'ERROR 56', RC, THISLOC=LOC )
4495 0 : RETURN
4496 : ENDIF
4497 :
4498 : CALL Diagn_Create( HcoState = HcoState, &
4499 : cName = 'InvMEGAN_MBOX', &
4500 : ExtNr = ExtNr, &
4501 : Cat = -1, &
4502 : Hier = -1, &
4503 : HcoID = -1, &
4504 : SpaceDim = 2, &
4505 : OutUnit = 'kg/m2/s', &
4506 : AutoFill = 0, &
4507 : Trgt2D = Inst%FLUXMBOX, &
4508 0 : RC = RC )
4509 0 : IF ( RC /= HCO_SUCCESS ) THEN
4510 0 : CALL HCO_ERROR( 'ERROR 57', RC, THISLOC=LOC )
4511 0 : RETURN
4512 : ENDIF
4513 :
4514 : CALL Diagn_Create( HcoState = HcoState, &
4515 : cName = 'InvMEGAN_FAXX', &
4516 : ExtNr = ExtNr, &
4517 : Cat = -1, &
4518 : Hier = -1, &
4519 : HcoID = -1, &
4520 : SpaceDim = 2, &
4521 : OutUnit = 'kg/m2/s', &
4522 : AutoFill = 0, &
4523 : Trgt2D = Inst%FLUXFAXX, &
4524 0 : RC = RC )
4525 0 : IF ( RC /= HCO_SUCCESS ) THEN
4526 0 : CALL HCO_ERROR( 'ERROR 58', RC, THISLOC=LOC )
4527 0 : RETURN
4528 : ENDIF
4529 :
4530 : CALL Diagn_Create( HcoState = HcoState, &
4531 : cName = 'InvMEGAN_AAXX', &
4532 : ExtNr = ExtNr, &
4533 : Cat = -1, &
4534 : Hier = -1, &
4535 : HcoID = -1, &
4536 : SpaceDim = 2, &
4537 : OutUnit = 'kg/m2/s', &
4538 : AutoFill = 0, &
4539 : Trgt2D = Inst%FLUXAAXX, &
4540 0 : RC = RC )
4541 0 : IF ( RC /= HCO_SUCCESS ) THEN
4542 0 : CALL HCO_ERROR( 'ERROR 59', RC, THISLOC=LOC )
4543 0 : RETURN
4544 : ENDIF
4545 :
4546 : !=================================================================
4547 : ! Initialize internal diagnostics. These are the restart variables
4548 : ! that can be used for a 'warm' start of MEGAN.
4549 : !=================================================================
4550 : CALL HCO_RestartDefine ( HcoState, 'LAI_PREVDAY', &
4551 0 : Inst%LAI_PREVDAY, '1', RC )
4552 0 : IF ( RC /= HCO_SUCCESS ) THEN
4553 0 : CALL HCO_ERROR( 'ERROR 60', RC, THISLOC=LOC )
4554 0 : RETURN
4555 : ENDIF
4556 :
4557 : CALL HCO_RestartDefine ( HcoState, 'T_PREVDAY', &
4558 0 : Inst%T_LAST24H, 'K', RC )
4559 0 : IF ( RC /= HCO_SUCCESS ) THEN
4560 0 : CALL HCO_ERROR( 'ERROR 61', RC, THISLOC=LOC )
4561 0 : RETURN
4562 : ENDIF
4563 :
4564 : CALL HCO_RestartDefine ( HcoState, 'T_DAVG', &
4565 0 : Inst%T_LASTXDAYS, 'K', RC )
4566 0 : IF ( RC /= HCO_SUCCESS ) THEN
4567 0 : CALL HCO_ERROR( 'ERROR 62', RC, THISLOC=LOC )
4568 0 : RETURN
4569 : ENDIF
4570 :
4571 : CALL HCO_RestartDefine ( HcoState, 'PARDR_DAVG', &
4572 0 : Inst%PARDR_LASTXDAYS, 'W/m2', RC )
4573 0 : IF ( RC /= HCO_SUCCESS ) THEN
4574 0 : CALL HCO_ERROR( 'ERROR 63', RC, THISLOC=LOC )
4575 0 : RETURN
4576 : ENDIF
4577 :
4578 : CALL HCO_RestartDefine ( HcoState, 'PARDF_DAVG', &
4579 0 : Inst%PARDF_LASTXDAYS, 'W/m2', RC )
4580 0 : IF ( RC /= HCO_SUCCESS ) THEN
4581 0 : CALL HCO_ERROR( 'ERROR 64', RC, THISLOC=LOC )
4582 0 : RETURN
4583 : ENDIF
4584 :
4585 : !=================================================================
4586 : ! The original MEGAN code used to read the emission factors here.
4587 : ! We now get the emisson factors through HEMCO, hence no need to
4588 : ! do this anymore (ckeller, 05/19/2014).
4589 : !=================================================================
4590 :
4591 : ! Set physical constants
4592 0 : PI_180 = HcoState%Phys%PI_180
4593 0 : Inst%D2RAD = PI_180 ! Degrees to radians
4594 0 : Inst%RAD2D = 1.0_hp / PI_180 ! Radians to degrees
4595 :
4596 : ! Enable met. fields
4597 0 : ExtState%T2M%DoUse = .TRUE.
4598 0 : ExtState%SUNCOS%DoUse = .TRUE.
4599 0 : ExtState%PARDR%DoUse = .TRUE.
4600 0 : ExtState%PARDF%DoUse = .TRUE.
4601 0 : ExtState%LAI%DoUse = .TRUE.
4602 0 : ExtState%GWETROOT%DoUse = .TRUE.
4603 :
4604 : ! Cleanup
4605 0 : Inst => NULL()
4606 :
4607 : ! Leave w/ success
4608 0 : IF ( ALLOCATED(HcoIDs ) ) DEALLOCATE(HcoIDs )
4609 0 : IF ( ALLOCATED(SpcNames) ) DEALLOCATE(SpcNames)
4610 0 : CALL HCO_LEAVE( HcoState%Config%Err,RC )
4611 :
4612 0 : END SUBROUTINE HCOX_Megan_Init
4613 : !EOC
4614 : !------------------------------------------------------------------------------
4615 : ! Harmonized Emissions Component (HEMCO) !
4616 : !------------------------------------------------------------------------------
4617 : !BOP
4618 : !
4619 : ! !IROUTINE: HCOX_Megan_Final
4620 : !
4621 : ! !DESCRIPTION: Subroutine HCOX\_Megan\_Final deallocates all allocated arrays
4622 : ! at the end of a GEOS-Chem model run.
4623 : !\\
4624 : !\\
4625 : ! !INTERFACE:
4626 : !
4627 0 : SUBROUTINE HCOX_MEGAN_FINAL ( HcoState, ExtState, RC )
4628 : !
4629 : ! !USES
4630 : !
4631 : !
4632 : ! !INPUT PARAMETERS:
4633 : !
4634 : TYPE(HCO_State), POINTER :: HcoState ! HEMCO State obj
4635 : TYPE(Ext_State), POINTER :: ExtState ! Extension State obj
4636 : !
4637 : ! !INPUT/OUTPUT PARAMETERS:
4638 : !
4639 : INTEGER, INTENT(INOUT) :: RC
4640 : !
4641 : ! !REVISION HISTORY:
4642 : ! 05 Aug 2013 - C. Keller - Initial version
4643 : ! See https://github.com/geoschem/hemco for complete history
4644 : !EOP
4645 : !------------------------------------------------------------------------------
4646 : !BOC
4647 : !
4648 : ! !LOCAL VARIABLES:
4649 : !
4650 0 : CALL InstRemove ( ExtState%Megan )
4651 :
4652 0 : END SUBROUTINE HCOX_MEGAN_FINAL
4653 : !EOC
4654 : !------------------------------------------------------------------------------
4655 : ! Harmonized Emissions Component (HEMCO) !
4656 : !------------------------------------------------------------------------------
4657 : !BOP
4658 : !
4659 : ! !IROUTINE: InstGet
4660 : !
4661 : ! !DESCRIPTION: Subroutine InstGet returns a pointer to the desired instance.
4662 : !\\
4663 : !\\
4664 : ! !INTERFACE:
4665 : !
4666 0 : SUBROUTINE InstGet ( Instance, Inst, RC, PrevInst )
4667 : !
4668 : ! !INPUT PARAMETERS:
4669 : !
4670 : INTEGER :: Instance
4671 : TYPE(MyInst), POINTER :: Inst
4672 : INTEGER :: RC
4673 : TYPE(MyInst), POINTER, OPTIONAL :: PrevInst
4674 : !
4675 : ! !REVISION HISTORY:
4676 : ! 18 Feb 2016 - C. Keller - Initial version
4677 : ! See https://github.com/geoschem/hemco for complete history
4678 : !EOP
4679 : !------------------------------------------------------------------------------
4680 : !BOC
4681 : TYPE(MyInst), POINTER :: PrvInst
4682 :
4683 : !=================================================================
4684 : ! InstGet begins here!
4685 : !=================================================================
4686 :
4687 : ! Get instance. Also archive previous instance.
4688 0 : PrvInst => NULL()
4689 0 : Inst => AllInst
4690 0 : DO WHILE ( ASSOCIATED(Inst) )
4691 0 : IF ( Inst%Instance == Instance ) EXIT
4692 0 : PrvInst => Inst
4693 0 : Inst => Inst%NextInst
4694 : END DO
4695 0 : IF ( .NOT. ASSOCIATED( Inst ) ) THEN
4696 0 : RC = HCO_FAIL
4697 0 : RETURN
4698 : ENDIF
4699 :
4700 : ! Pass output arguments
4701 0 : IF ( PRESENT(PrevInst) ) PrevInst => PrvInst
4702 :
4703 : ! Cleanup & Return
4704 0 : PrvInst => NULL()
4705 0 : RC = HCO_SUCCESS
4706 :
4707 : END SUBROUTINE InstGet
4708 : !EOC
4709 : !------------------------------------------------------------------------------
4710 : ! Harmonized Emissions Component (HEMCO) !
4711 : !------------------------------------------------------------------------------
4712 : !BOP
4713 : !
4714 : ! !IROUTINE: InstCreate
4715 : !
4716 : ! !DESCRIPTION: Subroutine InstCreate adds a new instance to the list of
4717 : ! instances, assigns a unique instance number to this new instance, and
4718 : ! archives this instance number to output argument Instance.
4719 : !\\
4720 : !\\
4721 : ! !INTERFACE:
4722 : !
4723 0 : SUBROUTINE InstCreate ( ExtNr, Instance, Inst, RC )
4724 : !
4725 : ! !INPUT PARAMETERS:
4726 : !
4727 : INTEGER, INTENT(IN) :: ExtNr
4728 : !
4729 : ! !OUTPUT PARAMETERS:
4730 : !
4731 : INTEGER, INTENT( OUT) :: Instance
4732 : TYPE(MyInst), POINTER :: Inst
4733 : !
4734 : ! !INPUT/OUTPUT PARAMETERS:
4735 : !
4736 : INTEGER, INTENT(INOUT) :: RC
4737 : !
4738 : ! !REVISION HISTORY:
4739 : ! 18 Feb 2016 - C. Keller - Initial version
4740 : ! See https://github.com/geoschem/hemco for complete history
4741 : !EOP
4742 : !------------------------------------------------------------------------------
4743 : !BOC
4744 : TYPE(MyInst), POINTER :: TmpInst
4745 : INTEGER :: nnInst
4746 :
4747 : !=================================================================
4748 : ! InstCreate begins here!
4749 : !=================================================================
4750 :
4751 : ! ----------------------------------------------------------------
4752 : ! Generic instance initialization
4753 : ! ----------------------------------------------------------------
4754 :
4755 : ! Initialize
4756 0 : Inst => NULL()
4757 :
4758 : ! Get number of already existing instances
4759 0 : TmpInst => AllInst
4760 0 : nnInst = 0
4761 0 : DO WHILE ( ASSOCIATED(TmpInst) )
4762 0 : nnInst = nnInst + 1
4763 0 : TmpInst => TmpInst%NextInst
4764 : END DO
4765 :
4766 : ! Create new instance
4767 0 : ALLOCATE(Inst)
4768 0 : Inst%Instance = nnInst + 1
4769 0 : Inst%ExtNr = ExtNr
4770 :
4771 : ! Attach to instance list
4772 0 : Inst%NextInst => AllInst
4773 0 : AllInst => Inst
4774 :
4775 : ! Update output instance
4776 0 : Instance = Inst%Instance
4777 :
4778 : ! ----------------------------------------------------------------
4779 : ! Type specific initialization statements follow below
4780 : ! ----------------------------------------------------------------
4781 :
4782 : ! Return w/ success
4783 0 : RC = HCO_SUCCESS
4784 :
4785 0 : END SUBROUTINE InstCreate
4786 : !EOC
4787 : !------------------------------------------------------------------------------
4788 : ! Harmonized Emissions Component (HEMCO) !
4789 : !------------------------------------------------------------------------------
4790 : !BOP
4791 : !
4792 : ! !IROUTINE: InstRemove
4793 : !
4794 : ! !DESCRIPTION: Subroutine InstRemove removes an instance from the list of
4795 : ! instances.
4796 : !\\
4797 : !\\
4798 : ! !INTERFACE:
4799 : !
4800 0 : SUBROUTINE InstRemove ( Instance )
4801 : !
4802 : ! !INPUT PARAMETERS:
4803 : !
4804 : INTEGER :: Instance
4805 : !
4806 : ! !REVISION HISTORY:
4807 : ! 18 Feb 2016 - C. Keller - Initial version
4808 : ! See https://github.com/geoschem/hemco for complete history
4809 : !EOP
4810 : !------------------------------------------------------------------------------
4811 : !BOC
4812 : INTEGER :: RC
4813 : TYPE(MyInst), POINTER :: PrevInst
4814 : TYPE(MyInst), POINTER :: Inst
4815 :
4816 : !=================================================================
4817 : ! InstRemove begins here!
4818 : !=================================================================
4819 :
4820 : ! Get instance. Also archive previous instance.
4821 0 : PrevInst => NULL()
4822 0 : Inst => NULL()
4823 0 : CALL InstGet ( Instance, Inst, RC, PrevInst=PrevInst )
4824 :
4825 : ! Instance-specific deallocation
4826 0 : IF ( ASSOCIATED(Inst) ) THEN
4827 :
4828 : !---------------------------------------------------------------------
4829 : ! Deallocate fields of Inst before popping off from the list
4830 : ! in order to avoid memory leaks (Bob Yantosca (17 Aug 2022)
4831 : !---------------------------------------------------------------------
4832 0 : IF ( ASSOCIATED( Inst%ARRAY_16 ) ) THEN
4833 0 : DEALLOCATE( Inst%ARRAY_16 )
4834 : ENDIF
4835 0 : Inst%ARRAY_16 => NULL()
4836 :
4837 0 : IF ( ASSOCIATED( Inst%NORM_FAC ) ) THEN
4838 0 : DEALLOCATE( Inst%NORM_FAC )
4839 : ENDIF
4840 0 : Inst%NORM_FAC => NULL()
4841 :
4842 0 : IF ( ASSOCIATED( Inst%AEF_ISOP ) ) THEN
4843 0 : DEALLOCATE( Inst%AEF_ISOP )
4844 : ENDIF
4845 0 : Inst%AEF_ISOP => NULL()
4846 :
4847 0 : IF ( ASSOCIATED( Inst%AEF_MBOX ) ) THEN
4848 0 : DEALLOCATE( Inst%AEF_MBOX )
4849 : ENDIF
4850 0 : Inst%AEF_MBOX => NULL()
4851 :
4852 0 : IF ( ASSOCIATED( Inst%AEF_BPIN ) ) THEN
4853 0 : DEALLOCATE( Inst%AEF_BPIN )
4854 : ENDIF
4855 0 : Inst%AEF_BPIN => NULL()
4856 :
4857 0 : IF ( ASSOCIATED( Inst%AEF_CARE ) ) THEN
4858 0 : DEALLOCATE( Inst%AEF_CARE )
4859 : ENDIF
4860 0 : Inst%AEF_CARE => NULL()
4861 :
4862 0 : IF ( ASSOCIATED( Inst%AEF_LIMO ) ) THEN
4863 0 : DEALLOCATE( Inst%AEF_LIMO )
4864 : ENDIF
4865 0 : Inst%AEF_LIMO => NULL()
4866 :
4867 0 : IF ( ASSOCIATED( Inst%AEF_OCIM ) ) THEN
4868 0 : DEALLOCATE( Inst%AEF_OCIM )
4869 : ENDIF
4870 0 : Inst%AEF_OCIM => NULL()
4871 :
4872 0 : IF ( ASSOCIATED( Inst%AEF_SABI ) ) THEN
4873 0 : DEALLOCATE( Inst%AEF_SABI )
4874 : ENDIF
4875 0 : Inst%AEF_SABI => NULL()
4876 :
4877 0 : IF ( ASSOCIATED( Inst%AEF_APIN ) ) THEN
4878 0 : DEALLOCATE( Inst%AEF_APIN )
4879 : ENDIF
4880 0 : Inst%AEF_APIN => NULL()
4881 :
4882 0 : IF ( ASSOCIATED( Inst%AEF_MYRC ) ) THEN
4883 0 : DEALLOCATE( Inst%AEF_MYRC )
4884 : ENDIF
4885 0 : Inst%AEF_MYRC => NULL()
4886 :
4887 0 : IF ( ASSOCIATED( Inst%AEF_OMON ) ) THEN
4888 0 : DEALLOCATE( Inst%AEF_OMON )
4889 : ENDIF
4890 0 : Inst%AEF_OMON => NULL()
4891 :
4892 0 : IF ( ASSOCIATED( Inst%AEF_ACET ) ) THEN
4893 0 : DEALLOCATE( Inst%AEF_ACET )
4894 : ENDIF
4895 0 : Inst%AEF_ACET => NULL()
4896 :
4897 0 : IF ( ASSOCIATED( Inst%AEF_MOH ) ) THEN
4898 0 : DEALLOCATE( Inst%AEF_MOH )
4899 : ENDIF
4900 0 : Inst%AEF_MOH => NULL()
4901 :
4902 0 : IF ( ASSOCIATED( Inst%AEF_EOH ) ) THEN
4903 0 : DEALLOCATE( Inst%AEF_EOH )
4904 : ENDIF
4905 0 : Inst%AEF_EOH => NULL()
4906 :
4907 0 : IF ( ASSOCIATED( Inst%AEF_CH2O ) ) THEN
4908 0 : DEALLOCATE( Inst%AEF_CH2O )
4909 : ENDIF
4910 0 : Inst%AEF_CH2O => NULL()
4911 :
4912 0 : IF ( ASSOCIATED( Inst%AEF_ALD2 ) ) THEN
4913 0 : DEALLOCATE( Inst%AEF_ALD2 )
4914 : ENDIF
4915 0 : Inst%AEF_ALD2 => NULL()
4916 :
4917 0 : IF ( ASSOCIATED( Inst%AEF_FAXX ) ) THEN
4918 0 : DEALLOCATE( Inst%AEF_FAXX )
4919 : ENDIF
4920 0 : Inst%AEF_FAXX => NULL()
4921 :
4922 0 : IF ( ASSOCIATED( Inst%AEF_AAXX ) ) THEN
4923 0 : DEALLOCATE( Inst%AEF_AAXX )
4924 : ENDIF
4925 0 : Inst%AEF_AAXX => NULL()
4926 :
4927 0 : IF ( ASSOCIATED( Inst%AEF_C2H4 ) ) THEN
4928 0 : DEALLOCATE( Inst%AEF_C2H4 )
4929 : ENDIF
4930 0 : Inst%AEF_C2H4 => NULL()
4931 :
4932 0 : IF ( ASSOCIATED( Inst%AEF_TOLU ) ) THEN
4933 0 : DEALLOCATE( Inst%AEF_TOLU )
4934 : ENDIF
4935 0 : Inst%AEF_TOLU => NULL()
4936 :
4937 0 : IF ( ASSOCIATED( Inst%AEF_HCNX ) ) THEN
4938 0 : DEALLOCATE( Inst%AEF_HCNX )
4939 : ENDIF
4940 0 : Inst%AEF_HCNX => NULL()
4941 :
4942 0 : IF ( ASSOCIATED( Inst%AEF_PRPE ) ) THEN
4943 0 : DEALLOCATE( Inst%AEF_PRPE )
4944 : ENDIF
4945 0 : Inst%AEF_PRPE => NULL()
4946 :
4947 0 : IF ( ASSOCIATED( Inst%AEF_FARN ) ) THEN
4948 0 : DEALLOCATE( Inst%AEF_FARN )
4949 : ENDIF
4950 0 : Inst%AEF_FARN => NULL()
4951 :
4952 0 : IF ( ASSOCIATED( Inst%AEF_BCAR ) ) THEN
4953 0 : DEALLOCATE( Inst%AEF_BCAR )
4954 : ENDIF
4955 0 : Inst%AEF_BCAR => NULL()
4956 :
4957 0 : IF ( ASSOCIATED( Inst%AEF_OSQT ) ) THEN
4958 0 : DEALLOCATE( Inst%AEF_OSQT )
4959 : ENDIF
4960 0 : Inst%AEF_OSQT => NULL()
4961 :
4962 0 : IF ( ASSOCIATED( Inst%FLUXISOP ) ) THEN
4963 0 : DEALLOCATE( Inst%FLUXISOP )
4964 : ENDIF
4965 0 : Inst%FLUXISOP => NULL()
4966 :
4967 0 : IF ( ASSOCIATED( Inst%FLUXMONO ) ) THEN
4968 0 : DEALLOCATE( Inst%FLUXMONO )
4969 : ENDIF
4970 0 : Inst%FLUXMONO => NULL()
4971 :
4972 0 : IF ( ASSOCIATED( Inst%FLUXACET ) ) THEN
4973 0 : DEALLOCATE( Inst%FLUXACET )
4974 : ENDIF
4975 0 : Inst%FLUXACET => NULL()
4976 :
4977 0 : IF ( ASSOCIATED( Inst%FLUXACETmb ) ) THEN
4978 0 : DEALLOCATE( Inst%FLUXACETmb )
4979 : ENDIF
4980 0 : Inst%FLUXACETmb => NULL()
4981 :
4982 0 : IF ( ASSOCIATED( Inst%FLUXACETbg ) ) THEN
4983 0 : DEALLOCATE( Inst%FLUXACETbg )
4984 : ENDIF
4985 0 : Inst%FLUXACETbg => NULL()
4986 :
4987 0 : IF ( ASSOCIATED( Inst%FLUXPRPE ) ) THEN
4988 0 : DEALLOCATE( Inst%FLUXPRPE )
4989 : ENDIF
4990 0 : Inst%FLUXPRPE => NULL()
4991 :
4992 0 : IF ( ASSOCIATED( Inst%FLUXC2H4 ) ) THEN
4993 0 : DEALLOCATE( Inst%FLUXC2H4 )
4994 : ENDIF
4995 0 : Inst%FLUXC2H4 => NULL()
4996 :
4997 0 : IF ( ASSOCIATED( Inst%FLUXLIMO ) ) THEN
4998 0 : DEALLOCATE( Inst%FLUXLIMO )
4999 : ENDIF
5000 0 : Inst%FLUXLIMO => NULL()
5001 :
5002 0 : IF ( ASSOCIATED( Inst%FLUXMTPA ) ) THEN
5003 0 : DEALLOCATE( Inst%FLUXMTPA )
5004 : ENDIF
5005 0 : Inst%FLUXMTPA => NULL()
5006 :
5007 0 : IF ( ASSOCIATED( Inst%FLUXMTPO ) ) THEN
5008 0 : DEALLOCATE( Inst%FLUXMTPO )
5009 : ENDIF
5010 0 : Inst%FLUXMTPO => NULL()
5011 :
5012 0 : IF ( ASSOCIATED( Inst%FLUXSESQ ) ) THEN
5013 0 : DEALLOCATE( Inst%FLUXSESQ )
5014 : ENDIF
5015 0 : Inst%FLUXSESQ => NULL()
5016 :
5017 0 : IF ( ASSOCIATED( Inst%FLUXSOAP ) ) THEN
5018 0 : DEALLOCATE( Inst%FLUXSOAP )
5019 : ENDIF
5020 0 : Inst%FLUXSOAP => NULL()
5021 :
5022 0 : IF ( ASSOCIATED( Inst%FLUXSOAS ) ) THEN
5023 0 : DEALLOCATE( Inst%FLUXSOAS )
5024 : ENDIF
5025 0 : Inst%FLUXSOAS => NULL()
5026 :
5027 0 : IF ( ASSOCIATED( Inst%FLUXALD2 ) ) THEN
5028 0 : DEALLOCATE( Inst%FLUXALD2 )
5029 : ENDIF
5030 0 : Inst%FLUXALD2 => NULL()
5031 :
5032 0 : IF ( ASSOCIATED( Inst%FLUXMOH ) ) THEN
5033 0 : DEALLOCATE( Inst%FLUXMOH )
5034 : ENDIF
5035 0 : Inst%FLUXMOH => NULL()
5036 :
5037 0 : IF ( ASSOCIATED( Inst%FLUXEOH ) ) THEN
5038 0 : DEALLOCATE( Inst%FLUXEOH )
5039 : ENDIF
5040 0 : Inst%FLUXEOH => NULL()
5041 :
5042 0 : IF ( ASSOCIATED( Inst%FLUXAPIN ) ) THEN
5043 0 : DEALLOCATE( Inst%FLUXAPIN )
5044 : ENDIF
5045 0 : Inst%FLUXAPIN => NULL()
5046 :
5047 0 : IF ( ASSOCIATED( Inst%FLUXBPIN ) ) THEN
5048 0 : DEALLOCATE( Inst%FLUXBPIN )
5049 : ENDIF
5050 0 : Inst%FLUXBPIN => NULL()
5051 :
5052 0 : IF ( ASSOCIATED( Inst%FLUXSABI ) ) THEN
5053 0 : DEALLOCATE( Inst%FLUXSABI )
5054 : ENDIF
5055 0 : Inst%FLUXSABI => NULL()
5056 :
5057 0 : IF ( ASSOCIATED( Inst%FLUXMYRC ) ) THEN
5058 0 : DEALLOCATE( Inst%FLUXMYRC )
5059 : ENDIF
5060 0 : Inst%FLUXMYRC => NULL()
5061 :
5062 0 : IF ( ASSOCIATED( Inst%FLUXCARE ) ) THEN
5063 0 : DEALLOCATE( Inst%FLUXCARE )
5064 : ENDIF
5065 0 : Inst%FLUXCARE => NULL()
5066 :
5067 0 : IF ( ASSOCIATED( Inst%FLUXOCIM ) ) THEN
5068 0 : DEALLOCATE( Inst%FLUXOCIM )
5069 : ENDIF
5070 0 : Inst%FLUXOCIM => NULL()
5071 :
5072 0 : IF ( ASSOCIATED( Inst%FLUXOMON ) ) THEN
5073 0 : DEALLOCATE( Inst%FLUXOMON )
5074 : ENDIF
5075 0 : Inst%FLUXOMON => NULL()
5076 :
5077 0 : IF ( ASSOCIATED( Inst%FLUXMBOX ) ) THEN
5078 0 : DEALLOCATE( Inst%FLUXMBOX )
5079 : ENDIF
5080 0 : Inst%FLUXMBOX => NULL()
5081 :
5082 0 : IF ( ASSOCIATED( Inst%FLUXFAXX ) ) THEN
5083 0 : DEALLOCATE( Inst%FLUXFAXX )
5084 : ENDIF
5085 0 : Inst%FLUXFAXX => NULL()
5086 :
5087 0 : IF ( ASSOCIATED( Inst%FLUXAAXX ) ) THEN
5088 0 : DEALLOCATE( Inst%FLUXAAXX )
5089 : ENDIF
5090 0 : Inst%FLUXAAXX => NULL()
5091 :
5092 0 : IF ( ASSOCIATED( Inst%FLUXFARN ) ) THEN
5093 0 : DEALLOCATE( Inst%FLUXFARN )
5094 : ENDIF
5095 0 : Inst%FLUXFARN => NULL()
5096 :
5097 0 : IF ( ASSOCIATED( Inst%FLUXBCAR ) ) THEN
5098 0 : DEALLOCATE( Inst%FLUXBCAR )
5099 : ENDIF
5100 0 : Inst%FLUXBCAR => NULL()
5101 :
5102 0 : IF ( ASSOCIATED( Inst%FLUXOSQT ) ) THEN
5103 0 : DEALLOCATE( Inst%FLUXOSQT )
5104 : ENDIF
5105 0 : Inst%FLUXOSQT => NULL()
5106 :
5107 0 : IF ( ASSOCIATED( Inst%LAI_PREVDAY ) ) THEN
5108 0 : DEALLOCATE( Inst%LAI_PREVDAY )
5109 : ENDIF
5110 0 : Inst%LAI_PREVDAY => NULL()
5111 :
5112 0 : IF ( ASSOCIATED( Inst%T_LASTXDAYS ) ) THEN
5113 0 : DEALLOCATE( Inst%T_LASTXDAYS )
5114 : ENDIF
5115 0 : Inst%T_LASTXDAYS => NULL()
5116 :
5117 0 : IF ( ASSOCIATED( Inst%T_LAST24H ) ) THEN
5118 0 : DEALLOCATE( Inst%T_LAST24H )
5119 : ENDIF
5120 0 : Inst%T_LAST24H => NULL()
5121 :
5122 0 : IF ( ASSOCIATED( Inst%PARDF_LASTXDAYS ) ) THEN
5123 0 : DEALLOCATE( Inst%PARDF_LASTXDAYS )
5124 : ENDIF
5125 0 : Inst%PARDF_LASTXDAYS => NULL()
5126 :
5127 0 : IF ( ASSOCIATED( Inst%PARDR_LASTXDAYS ) ) THEN
5128 0 : DEALLOCATE( Inst%PARDR_LASTXDAYS )
5129 : ENDIF
5130 0 : Inst%PARDR_LASTXDAYS => NULL()
5131 :
5132 : !---------------------------------------------------------------------
5133 : ! Pop off instance from list
5134 : !---------------------------------------------------------------------
5135 0 : IF ( ASSOCIATED(PrevInst) ) THEN
5136 0 : PrevInst%NextInst => Inst%NextInst
5137 : ELSE
5138 0 : AllInst => Inst%NextInst
5139 : ENDIF
5140 0 : DEALLOCATE(Inst)
5141 : ENDIF
5142 :
5143 : ! Free pointers before exiting
5144 0 : PrevInst => NULL()
5145 0 : Inst => NULL()
5146 :
5147 0 : END SUBROUTINE InstRemove
5148 : !EOC
5149 0 : END MODULE HCOX_MEGAN_MOD
|