Line data Source code
1 : !------------------------------------------------------------------------------
2 : ! Harmonized Emissions Component (HEMCO) !
3 : !------------------------------------------------------------------------------
4 : !BOP
5 : !
6 : ! !MODULE: hcox_soilnox_mod.F90
7 : !
8 : ! !DESCRIPTION: Module HCOX\_SoilNOx\_Mod contains routines to compute soil
9 : ! NOx emissions. We follow the implementation in GEOS-Chem by Hudman
10 : ! et al 2012.
11 : !\\
12 : !\\
13 : ! !INTERFACE:
14 : !
15 : MODULE HCOX_SoilNOx_Mod
16 : !
17 : ! !USES:
18 : !
19 : USE HCO_ERROR_Mod
20 : USE HCO_CHARTOOLS_MOD
21 : USE HCO_DIAGN_Mod
22 : USE HCOX_TOOLS_MOD
23 : USE HCOX_State_Mod, ONLY : Ext_State
24 : USE HCO_STATE_Mod, ONLY : HCO_State
25 :
26 : IMPLICIT NONE
27 : PRIVATE
28 : !
29 : ! !PUBLIC MEMBER FUNCTIONS:
30 : !
31 : PUBLIC :: HCOX_SoilNOx_Run
32 : PUBLIC :: HCOX_SoilNOx_Init
33 : PUBLIC :: HCOX_SoilNOx_Final
34 : !
35 : ! !REMARKS:
36 : ! This is a HEMCO extension module that uses many of the HEMCO core
37 : ! utilities.
38 : ! .
39 : ! Original codes from:
40 : ! HARVARD ATMOSPHERIC CHEMISTRY MODELING GROUP
41 : ! MODULE FOR SOIL NOX EMISSIONS
42 : ! by Yuhang Wang, Gerry Gardner, and Prof. Daniel Jacob
43 : ! Updated model code:
44 : ! by Rynda Hudman, Neil Moore, Randall Martin, and Bram Maasakkers
45 : ! .
46 : ! The soil NOx code has been updated from the original implementation
47 : ! of Yienger & Levy [1995] from Wang et al., [1998] as summarized below.
48 : ! .
49 : ! Old:
50 : ! ENOx = f( T, biome, w/d) x Pulse(precip) x canopy uptake + FERT
51 : ! .
52 : ! New:
53 : ! ENOx = f( T, biome, WFPS, Fert) x Pulse(dryspell) x canopy uptake
54 : ! .
55 : ! 1 - Update moisture treatment: soil moisture as a continuous variable
56 : ! using WFPS rather than discrete wet/dry states and purely exponential
57 : ! T impact (impact = -1. Tg N/yr)
58 : ! .
59 : ! 2 - Update to Fertilizer: new fertilizer maps including chemical and
60 : ! manure fertilizer from Potter et al., [2010] distributed using MODIS EVI
61 : ! seasonality, online-N deposition as a fertilizer source, and N-fertilizer
62 : ! source subject to T, WFPS, and pulsing like other N (impact = +1.3 Tg N/yr)
63 : ! .
64 : ! 3- Update Pulsing Scheme: Yan et al., [2005] (shorter, stronger pulses)
65 : ! (impact = +1. Tg N/yr). Also added restart file containing dry spell
66 : ! information to properly account for dry spell length in continuing runs.
67 : ! .
68 : ! References:
69 : ! ============================================================================
70 : ! (1 ) Wang, Y., D.J. Jacob, and J.A. Logan, Global simulation of
71 : ! tropospheric O3-NOx-hydrocarbon chemistry, 1. Model formulation,
72 : ! J. Geophys. Res., 103/D9, 10, 713-10,726, 1998.
73 : ! (2 ) Yienger, J.J, and H. Levy, Empirical model of global soil-biogenic
74 : ! NOx emissions, J. Geophys. Res., 100, D6, 11,447-11464, June 20, 1995.
75 : ! (3 ) Yan, X., T. Ohara, and H. Akimoto, Statistical modeling of global
76 : ! soil NOx emissions, Global Biogeochem. Cycles, 19, GB3019,
77 : ! doi:10.1029/2004GB002276, 2005.
78 : ! (4 ) Potter, P., Ramankutty, N., Bennett, E., and Donner, S.:
79 : ! Characterizing the Spatial Patterns of Global Fertilizer Application
80 : ! and Manure Production, Earth Interactions, 14, 1-22,
81 : ! 10.1175/2009EI288.1, 2010.
82 : ! (5 ) Moore, N.E., Improving global bottom-up biogenic soil NOx inventories,
83 : ! Master's Thesis, Dalhousie University, 2007.
84 : ! (6 ) Hudman, R.C., N.E. Moore, A.K. Mebust, R.V. Martin, A.R. Russell,
85 : ! L.C. Valin, and R.C Cohen, Steps toward a mechanistic model of global
86 : ! soil nitric oxide emissions: implementation and space
87 : ! based-constraints, Atmos. Chem. Phys., 12, 7779-7795,
88 : ! doi:10.5194/acp-12-7779-2012, 2012.
89 : !
90 : ! !REVISION HISTORY:
91 : ! See https://github.com/geoschem/hemco for complete history
92 : !EOP
93 : !------------------------------------------------------------------------------
94 : !BOC
95 : !
96 : ! !MODULE VARIABLES:
97 : !
98 : ! Derived type to hold MODIS land types
99 : TYPE MODL
100 : REAL(hp), POINTER :: VAL (:,:)
101 : ENDTYPE MODL
102 :
103 : TYPE :: MyInst
104 : INTEGER :: Instance
105 : INTEGER :: ExtNr ! Extension number
106 : INTEGER :: IDTNO ! NO tracer ID
107 : LOGICAL :: LFERTILIZERNOX ! Use fertilizer NOx?
108 : REAL(hp) :: FERT_SCALE ! fertilizer scale factor
109 :
110 : ! Dry period length (from restart)
111 : REAL(sp), ALLOCATABLE :: DRYPERIOD(:,: )
112 :
113 : ! Pulse factors (from restart)
114 : REAL(sp), ALLOCATABLE :: PFACTOR(:,: )
115 : REAL(sp), ALLOCATABLE :: GWET_PREV(:,: )
116 :
117 : ! Deposition reservoir (from restart)
118 : REAL(sp), ALLOCATABLE :: DEP_RESERVOIR(:,: )
119 :
120 : ! NOx in the canopy
121 : REAL(hp), ALLOCATABLE :: CANOPYNOX(:,:,:)
122 :
123 : ! MODIS landtype
124 : TYPE(MODL), POINTER :: LANDTYPE(:) => NULL()
125 :
126 : ! Soil fertilizer (kg/m3)
127 : REAL(hp), POINTER :: SOILFERT(:,:) => NULL()
128 :
129 : ! Fraction of arid and non-arid land
130 : REAL(hp), POINTER :: CLIMARID(:,:) => NULL()
131 : REAL(hp), POINTER :: CLIMNARID(:,:) => NULL()
132 :
133 : ! DRYCOEFF (if read from settings in configuration file)
134 : REAL(hp), POINTER :: DRYCOEFF(:)
135 :
136 : ! Overall scale factor to be applied to total soil NOx emissions. Must
137 : ! be defined in the HEMCO configuration file as extension attribute
138 : ! 'Scaling_NO'
139 : REAL(sp), ALLOCATABLE :: SpcScalVal(:)
140 : CHARACTER(LEN=61), ALLOCATABLE :: SpcScalFldNme(:)
141 :
142 : ! Diagnostics
143 : REAL(sp), POINTER :: FertNO_Diag(:,:)
144 :
145 : TYPE(MyInst), POINTER :: NextInst => NULL()
146 : END TYPE MyInst
147 :
148 : ! Pointer to all instances
149 : TYPE(MyInst), POINTER :: AllInst => NULL()
150 : !
151 : ! !DEFINED PARAMETERS:
152 : !
153 : ! # of MODIS/Koppen biome types
154 : INTEGER, PARAMETER :: NBIOM = 24
155 :
156 : ! Max. # of allowed drycoeff vars
157 : INTEGER, PARAMETER :: MaxDryCoeff = 50
158 :
159 : ! Canopy wind extinction coefficients
160 : ! (cf. Yienger & Levy [1995], Sec 5), now a function of the
161 : ! MODIS/KOPPEN biometype (J.D. Maasakkers)
162 : REAL(hp), PARAMETER, PRIVATE :: SOILEXC(NBIOM) = (/&
163 : 0.10_hp, 0.50_hp, 0.10_hp, 0.10_hp, 0.10_hp, 0.10_hp, 0.10_hp, &
164 : 0.10_hp, 0.10_hp, 1.00_hp, 1.00_hp, 1.00_hp, 1.00_hp, 2.00_hp, &
165 : 4.00_hp, 4.00_hp, 4.00_hp, 4.00_hp, 4.00_hp, 4.00_hp, 4.00_hp, &
166 : 2.00_hp, 0.10_hp, 2.00_hp /)
167 :
168 : ! Steinkamp and Lawrence, 2011 A values, wet biome coefficients
169 : ! for each of the 24 soil biomes [ng N/m2/s].
170 : REAL(hp), PARAMETER, PRIVATE :: A_BIOME(NBIOM) = (/&
171 : 0.00_hp, 0.00_hp, 0.00_hp, 0.00_hp, 0.00_hp, 0.06_hp, 0.09_hp, &
172 : 0.09_hp, 0.01_hp, 0.84_hp, 0.84_hp, 0.24_hp, 0.42_hp, 0.62_hp, &
173 : 0.03_hp, 0.36_hp, 0.36_hp, 0.35_hp, 1.66_hp, 0.08_hp, 0.44_hp, &
174 : 0.57_hp, 0.57_hp, 0.57_hp /)
175 :
176 : ! "A" coefficients for converting surface temp to soil temp
177 : ! for each of the 24 soil biomes
178 : REAL(hp), PARAMETER, PRIVATE :: SOILTA(NBIOM) = (/&
179 : 0.00_hp, 0.92_hp, 0.00_hp, 0.66_hp, 0.66_hp, 0.66_hp, 0.66_hp, &
180 : 0.66_hp, 0.66_hp, 0.66_hp, 0.66_hp, 0.66_hp, 0.66_hp, 0.66_hp, &
181 : 0.84_hp, 0.84_hp, 0.84_hp, 0.84_hp, 0.84_hp, 0.84_hp, 0.84_hp, &
182 : 1.03_hp, 1.03_hp, 1.03_hp /)
183 :
184 : ! "B" coefficients for converting surface temp to soil temp
185 : ! for each of the 24 soil biomes
186 : REAL(hp), PARAMETER, PRIVATE :: SOILTB(NBIOM) = (/&
187 : 0.00_hp, 4.40_hp, 0.00_hp, 8.80_hp, 8.80_hp, 8.80_hp, 8.80_hp, &
188 : 8.80_hp, 8.80_hp, 8.80_hp, 8.80_hp, 8.80_hp, 8.80_hp, 8.80_hp, &
189 : 3.60_hp, 3.60_hp, 3.60_hp, 3.60_hp, 3.60_hp, 3.60_hp, 3.60_hp, &
190 : 2.90_hp, 2.90_hp, 2.90_hp /)
191 :
192 : ! MODIS/Koppen resistance values
193 : INTEGER, PARAMETER, PRIVATE :: SNIMODIS(NBIOM) = (/&
194 : 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, &
195 : 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, &
196 : 21, 22, 23, 24 /)
197 :
198 : INTEGER, PARAMETER, PRIVATE :: SNIRI(NBIOM) = (/&
199 : 9999, 200, 9999, 9999, 9999, 9999, 200, 200, 200, 200, &
200 : 200, 200, 200, 200, 200, 200, 200, 400, 400, 200, &
201 : 200, 200, 9999, 200 /)
202 :
203 : INTEGER, PARAMETER, PRIVATE :: SNIRLU(NBIOM) = (/&
204 : 9999, 9000, 9999, 9999, 9999, 9999, 9000, 9000, 9000, 9000, &
205 : 9000, 9000, 9000, 9000, 9000, 1000, 9000, 9000, 9000, 9000, &
206 : 1000, 9000, 9999, 9000 /)
207 :
208 : INTEGER, PARAMETER, PRIVATE :: SNIRAC(NBIOM) = (/&
209 : 0, 300, 0, 0, 0, 0, 100, 100, 100, 100, &
210 : 100, 100, 100, 100, 2000, 2000, 2000, 2000, 2000, 2000, &
211 : 2000, 200, 100, 200 /)
212 :
213 : INTEGER, PARAMETER, PRIVATE :: SNIRGSS(NBIOM) = (/&
214 : 0, 0, 100, 1000, 100, 1000, 350, 350, 350, 350, &
215 : 350, 350, 350, 350, 500, 200, 500, 500, 500, 500, &
216 : 200, 150, 400, 150 /)
217 :
218 : INTEGER, PARAMETER, PRIVATE :: SNIRGSO(NBIOM) = (/&
219 : 2000, 1000, 3500, 400, 3500, 400, 200, 200, 200, 200, &
220 : 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, &
221 : 200, 150, 300, 150 /)
222 :
223 : INTEGER, PARAMETER, PRIVATE :: SNIRCLS(NBIOM) = (/&
224 : 9999, 2500, 9999, 9999, 9999, 9999, 2000, 2000, 2000, 2000, &
225 : 2000, 2000, 2000, 2000, 2000, 9999, 2000, 2000, 2000, 2000, &
226 : 9999, 2000, 9999, 2000 /)
227 :
228 : INTEGER, PARAMETER, PRIVATE :: SNIRCLO(NBIOM) = (/&
229 : 9999, 1000, 1000, 9999, 1000, 9999, 1000, 1000, 1000, 1000, &
230 : 1000, 1000, 1000, 1000, 1000, 9999, 1000, 1000, 1000, 1000, &
231 : 9999, 1000, 9999, 1000 /)
232 :
233 : INTEGER, PARAMETER, PRIVATE :: SNIVSMAX(NBIOM) = (/&
234 : 10, 100, 100, 10, 100, 10, 100, 100, 100, 100, &
235 : 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, &
236 : 100, 100, 100, 100 /)
237 :
238 : ! ! Conversion factor from kg NO to ng N
239 : ! REAL(hp), PARAMETER, PRIVATE :: kgNO_to_ngN = 4.666d11 !(14/30 * 1e12)
240 :
241 : CONTAINS
242 : !EOC
243 : !------------------------------------------------------------------------------
244 : ! Harmonized Emissions Component (HEMCO) !
245 : !------------------------------------------------------------------------------
246 : !BOP
247 : !
248 : ! !IROUTINE: HCOX_SoilNOx_Run
249 : !
250 : ! !DESCRIPTION: Subroutine HcoX\_SoilNox\_Run is the driver routine to
251 : ! calculate ship NOx emissions for the current time step. Emissions in
252 : ! [kg/m2/s] are added to the emissions array of the passed
253 : !\\
254 : !\\
255 : ! !INTERFACE:
256 : !
257 0 : SUBROUTINE HCOX_SoilNOx_Run( ExtState, HcoState, RC )
258 : !
259 : ! !USES:
260 : !
261 : USE HCO_Types_Mod, ONLY : DiagnCont
262 : USE HCO_CLOCK_MOD, ONLY : HcoClock_First
263 : USE HCO_CLOCK_MOD, ONLY : HcoClock_Rewind
264 : USE HCO_FLuxArr_Mod, ONLY : HCO_EmisAdd
265 : USE HCO_EmisList_Mod, ONLY : HCO_GetPtr
266 : USE HCO_Calc_Mod, ONLY : HCO_EvalFld
267 : USE HCO_ExtList_Mod, ONLY : GetExtOpt
268 : USE HCO_ExtList_Mod, ONLY : HCO_GetOpt
269 : USE HCO_Restart_Mod, ONLY : HCO_RestartGet
270 : USE HCO_Restart_Mod, ONLY : HCO_RestartWrite
271 : !
272 : ! !INPUT PARAMETERS:
273 : !
274 : TYPE(Ext_State), POINTER :: ExtState ! Module options
275 :
276 : !
277 : ! !INPUT/OUTPUT PARAMETERS:
278 : !
279 : TYPE(HCO_State), POINTER :: HcoState ! Output obj
280 : INTEGER, INTENT(INOUT) :: RC
281 : !
282 : ! !REVISION HISTORY:
283 : ! 05 Nov 2013 - C. Keller - Initial Version
284 : ! See https://github.com/geoschem/hemco for complete history
285 : !EOP
286 : !------------------------------------------------------------------------------
287 : !BOC
288 : !
289 : ! !LOCAL VARIABLES:
290 : !
291 : INTEGER :: I, J, N
292 0 : REAL(hp), TARGET :: FLUX_2D(HcoState%NX,HcoState%NY)
293 0 : REAL(hp), TARGET :: Tmp2D (HcoState%NX,HcoState%NY)
294 0 : REAL(sp) :: Def2D (HcoState%NX,HcoState%NY)
295 : REAL(hp) :: FERTDIAG, DEP_FERT, SOILFRT
296 : REAL*4 :: TSEMIS
297 : REAL(hp) :: UNITCONV, IJFLUX
298 0 : REAL(dp), ALLOCATABLE :: VecDp(:)
299 : LOGICAL :: FIRST
300 : LOGICAL :: aIR, FOUND
301 : CHARACTER(LEN= 31) :: DiagnName
302 : CHARACTER(LEN=255) :: MSG, DMY, LOC
303 : TYPE(MyInst), POINTER :: Inst
304 :
305 : !=================================================================
306 : ! HCOX_SoilNOx_RUN begins here!
307 : !=================================================================
308 0 : LOC = 'HCOX_SoilNOx_RUN (HCOX_SOILNOX_MOD.F90)'
309 :
310 : ! Enter
311 0 : CALL HCO_ENTER( HcoState%Config%Err, LOC, RC )
312 0 : IF ( RC /= HCO_SUCCESS ) THEN
313 0 : CALL HCO_ERROR( 'ERROR 0', RC, THISLOC=LOC )
314 0 : RETURN
315 : ENDIF
316 :
317 : ! Return if extension disabled
318 0 : IF ( ExtState%SoilNOx < 0 ) RETURN
319 :
320 : ! Nullify
321 0 : Inst => NULL()
322 :
323 : ! Get Instance
324 0 : CALL InstGet ( ExtState%SoilNox, Inst, RC )
325 0 : IF ( RC /= HCO_SUCCESS ) THEN
326 0 : WRITE(MSG,*) 'Cannot find soil NOx instance Nr. ', ExtState%SoilNOx
327 0 : CALL HCO_ERROR(MSG,RC)
328 0 : RETURN
329 : ENDIF
330 :
331 : ! Conversion factor from ng N to kg NO
332 0 : UNITCONV = 1.0e-12_hp / 14.0_hp * HcoState%Spc(Inst%IDTNO)%MW_g
333 :
334 : !-----------------------------------------------------------------
335 : ! On first call, set pointers to all arrays needed by SoilNOx
336 : !-----------------------------------------------------------------
337 0 : FIRST = HcoClock_First ( HcoState%Clock, .TRUE. )
338 :
339 : !IF ( FIRST ) THEN
340 0 : CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK1', Inst%LANDTYPE(1)%VAL, RC )
341 0 : IF ( RC /= HCO_SUCCESS ) THEN
342 0 : CALL HCO_ERROR( 'ERROR 1', RC, THISLOC=LOC )
343 0 : RETURN
344 : ENDIF
345 0 : CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK2', Inst%LANDTYPE(2)%VAL, RC )
346 0 : IF ( RC /= HCO_SUCCESS ) THEN
347 0 : CALL HCO_ERROR( 'ERROR 2', RC, THISLOC=LOC )
348 0 : RETURN
349 : ENDIF
350 0 : CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK3', Inst%LANDTYPE(3)%VAL, RC )
351 0 : IF ( RC /= HCO_SUCCESS ) THEN
352 0 : CALL HCO_ERROR( 'ERROR 3', RC, THISLOC=LOC )
353 0 : RETURN
354 : ENDIF
355 0 : CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK4', Inst%LANDTYPE(4)%VAL, RC )
356 0 : IF ( RC /= HCO_SUCCESS ) THEN
357 0 : CALL HCO_ERROR( 'ERROR 4', RC, THISLOC=LOC )
358 0 : RETURN
359 : ENDIF
360 0 : CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK5', Inst%LANDTYPE(5)%VAL, RC )
361 0 : IF ( RC /= HCO_SUCCESS ) THEN
362 0 : CALL HCO_ERROR( 'ERROR 5', RC, THISLOC=LOC )
363 0 : RETURN
364 : ENDIF
365 0 : CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK6', Inst%LANDTYPE(6)%VAL, RC )
366 0 : IF ( RC /= HCO_SUCCESS ) THEN
367 0 : CALL HCO_ERROR( 'ERROR 6', RC, THISLOC=LOC )
368 0 : RETURN
369 : ENDIF
370 0 : CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK7', Inst%LANDTYPE(7)%VAL, RC )
371 0 : IF ( RC /= HCO_SUCCESS ) THEN
372 0 : CALL HCO_ERROR( 'ERROR 7', RC, THISLOC=LOC )
373 0 : RETURN
374 : ENDIF
375 0 : CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK8', Inst%LANDTYPE(8)%VAL, RC )
376 0 : IF ( RC /= HCO_SUCCESS ) THEN
377 0 : CALL HCO_ERROR( 'ERROR 8', RC, THISLOC=LOC )
378 0 : RETURN
379 : ENDIF
380 0 : CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK9', Inst%LANDTYPE(9)%VAL, RC )
381 0 : IF ( RC /= HCO_SUCCESS ) THEN
382 0 : CALL HCO_ERROR( 'ERROR 9', RC, THISLOC=LOC )
383 0 : RETURN
384 : ENDIF
385 0 : CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK10', Inst%LANDTYPE(10)%VAL, RC )
386 0 : IF ( RC /= HCO_SUCCESS ) THEN
387 0 : CALL HCO_ERROR( 'ERROR 10', RC, THISLOC=LOC )
388 0 : RETURN
389 : ENDIF
390 0 : CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK11', Inst%LANDTYPE(11)%VAL, RC )
391 0 : IF ( RC /= HCO_SUCCESS ) THEN
392 0 : CALL HCO_ERROR( 'ERROR 11', RC, THISLOC=LOC )
393 0 : RETURN
394 : ENDIF
395 0 : CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK12', Inst%LANDTYPE(12)%VAL, RC )
396 0 : IF ( RC /= HCO_SUCCESS ) THEN
397 0 : CALL HCO_ERROR( 'ERROR 12', RC, THISLOC=LOC )
398 0 : RETURN
399 : ENDIF
400 0 : CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK13', Inst%LANDTYPE(13)%VAL, RC )
401 0 : IF ( RC /= HCO_SUCCESS ) THEN
402 0 : CALL HCO_ERROR( 'ERROR 13', RC, THISLOC=LOC )
403 0 : RETURN
404 : ENDIF
405 0 : CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK14', Inst%LANDTYPE(14)%VAL, RC )
406 0 : IF ( RC /= HCO_SUCCESS ) THEN
407 0 : CALL HCO_ERROR( 'ERROR 14', RC, THISLOC=LOC )
408 0 : RETURN
409 : ENDIF
410 0 : CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK15', Inst%LANDTYPE(15)%VAL, RC )
411 0 : IF ( RC /= HCO_SUCCESS ) THEN
412 0 : CALL HCO_ERROR( 'ERROR 15', RC, THISLOC=LOC )
413 0 : RETURN
414 : ENDIF
415 0 : CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK16', Inst%LANDTYPE(16)%VAL, RC )
416 0 : IF ( RC /= HCO_SUCCESS ) THEN
417 0 : CALL HCO_ERROR( 'ERROR 16', RC, THISLOC=LOC )
418 0 : RETURN
419 : ENDIF
420 0 : CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK17', Inst%LANDTYPE(17)%VAL, RC )
421 0 : IF ( RC /= HCO_SUCCESS ) THEN
422 0 : CALL HCO_ERROR( 'ERROR 17', RC, THISLOC=LOC )
423 0 : RETURN
424 : ENDIF
425 0 : CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK18', Inst%LANDTYPE(18)%VAL, RC )
426 0 : IF ( RC /= HCO_SUCCESS ) THEN
427 0 : CALL HCO_ERROR( 'ERROR 18', RC, THISLOC=LOC )
428 0 : RETURN
429 : ENDIF
430 0 : CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK19', Inst%LANDTYPE(19)%VAL, RC )
431 0 : IF ( RC /= HCO_SUCCESS ) THEN
432 0 : CALL HCO_ERROR( 'ERROR 19', RC, THISLOC=LOC )
433 0 : RETURN
434 : ENDIF
435 0 : CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK20', Inst%LANDTYPE(20)%VAL, RC )
436 0 : IF ( RC /= HCO_SUCCESS ) THEN
437 0 : CALL HCO_ERROR( 'ERROR 20', RC, THISLOC=LOC )
438 0 : RETURN
439 : ENDIF
440 0 : CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK21', Inst%LANDTYPE(21)%VAL, RC )
441 0 : IF ( RC /= HCO_SUCCESS ) THEN
442 0 : CALL HCO_ERROR( 'ERROR 21', RC, THISLOC=LOC )
443 0 : RETURN
444 : ENDIF
445 0 : CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK22', Inst%LANDTYPE(22)%VAL, RC )
446 0 : IF ( RC /= HCO_SUCCESS ) THEN
447 0 : CALL HCO_ERROR( 'ERROR 22', RC, THISLOC=LOC )
448 0 : RETURN
449 : ENDIF
450 0 : CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK23', Inst%LANDTYPE(23)%VAL, RC )
451 0 : IF ( RC /= HCO_SUCCESS ) THEN
452 0 : CALL HCO_ERROR( 'ERROR 23', RC, THISLOC=LOC )
453 0 : RETURN
454 : ENDIF
455 0 : CALL HCO_EvalFld( HcoState, 'SOILNOX_LANDK24', Inst%LANDTYPE(24)%VAL, RC )
456 0 : IF ( RC /= HCO_SUCCESS ) THEN
457 0 : CALL HCO_ERROR( 'ERROR 24', RC, THISLOC=LOC )
458 0 : RETURN
459 : ENDIF
460 0 : CALL HCO_EvalFld( HcoState, 'SOILNOX_FERT', Inst%SOILFERT, RC )
461 0 : IF ( RC /= HCO_SUCCESS ) THEN
462 0 : CALL HCO_ERROR( 'ERROR 25', RC, THISLOC=LOC )
463 0 : RETURN
464 : ENDIF
465 0 : CALL HCO_EvalFld( HcoState, 'SOILNOX_ARID', Inst%CLIMARID, RC )
466 0 : IF ( RC /= HCO_SUCCESS ) THEN
467 0 : CALL HCO_ERROR( 'ERROR 26', RC, THISLOC=LOC )
468 0 : RETURN
469 : ENDIF
470 0 : CALL HCO_EvalFld( HcoState, 'SOILNOX_NONARID', Inst%CLIMNARID, RC )
471 0 : IF ( RC /= HCO_SUCCESS ) THEN
472 0 : CALL HCO_ERROR( 'ERROR 27', RC, THISLOC=LOC )
473 0 : RETURN
474 : ENDIF
475 :
476 0 : IF ( FIRST ) THEN
477 : ! Check if ExtState variables DRYCOEFF is defined. Otherwise, try to
478 : ! read it from settings.
479 0 : IF ( .NOT. ASSOCIATED(ExtState%DRYCOEFF) ) THEN
480 : CALL GetExtOpt( HcoState%Config, Inst%ExtNr, 'DRYCOEFF', &
481 0 : OptValChar=DMY, FOUND=FOUND, RC=RC )
482 0 : IF ( .NOT. FOUND ) THEN
483 0 : CALL HCO_ERROR( 'DRYCOEFF not defined', RC )
484 0 : RETURN
485 : ENDIF
486 0 : ALLOCATE(VecDp(MaxDryCoeff))
487 : CALL HCO_CharSplit( DMY, HCO_GetOpt(HcoState%Config%ExtList,'Separator'), &
488 0 : HCO_GetOpt(HcoState%Config%ExtList,'Wildcard'), VecDp, N, RC )
489 0 : IF ( RC /= HCO_SUCCESS ) THEN
490 0 : CALL HCO_ERROR( 'ERROR 28', RC, THISLOC=LOC )
491 0 : RETURN
492 : ENDIF
493 0 : ALLOCATE(Inst%DRYCOEFF(N))
494 0 : Inst%DRYCOEFF(1:N) = VecDp(1:N)
495 0 : ExtState%DRYCOEFF => Inst%DRYCOEFF
496 0 : DEALLOCATE(VecDp)
497 : ENDIF
498 : ENDIF
499 :
500 : !---------------------------------------------------------------
501 : ! Fill restart variables. Restart variables can be specified
502 : ! in the HEMCO configuration file. In an ESMF environment, they
503 : ! can also be defined as internal state fields. The internal
504 : ! state fields take precedence over fields read through the
505 : ! HEMCO interface.
506 : ! The restart variables must be read on the first time step or
507 : ! after the rewinding the clock.
508 : !---------------------------------------------------------------
509 :
510 : #if !defined ( MODEL_GEOS )
511 0 : IF ( FIRST .OR. HcoClock_Rewind( HcoState%Clock, .TRUE. ) ) THEN
512 : #else
513 : IF ( .TRUE. ) THEN
514 : #endif
515 :
516 : ! DEP_RESERVOIR. Read in kg NO/m3
517 : CALL HCO_EvalFld( HcoState, 'DEP_RESERVOIR_DEFAULT', &
518 0 : Tmp2D, RC, FOUND=FOUND )
519 0 : IF ( FOUND ) THEN
520 0 : Def2D = Tmp2D
521 : ELSE
522 0 : Def2D = 1.0e-4_sp
523 : ENDIF
524 : CALL HCO_RestartGet( HcoState, 'DEP_RESERVOIR', &
525 0 : Inst%DEP_RESERVOIR, RC, Def2D=Def2D )
526 0 : IF ( RC /= HCO_SUCCESS ) THEN
527 0 : CALL HCO_ERROR( 'ERROR 29', RC, THISLOC=LOC )
528 0 : RETURN
529 : ENDIF
530 :
531 : ! GWET_PREV [unitless]
532 : CALL HCO_RestartGet( HcoState, 'GWET_PREV', &
533 0 : Inst%GWET_PREV, RC, FILLED=FOUND )
534 0 : IF ( RC /= HCO_SUCCESS ) THEN
535 0 : CALL HCO_ERROR( 'ERROR 30', RC, THISLOC=LOC )
536 0 : RETURN
537 : ENDIF
538 0 : IF ( .NOT. FOUND ) THEN
539 0 : Inst%GWET_PREV = 0.0_sp
540 0 : IF ( HcoState%amIRoot ) THEN
541 0 : MSG = 'Cannot find GWET_PREV restart variable - initialized to 0.0!'
542 0 : CALL HCO_WARNING(HcoState%Config%Err,MSG,RC)
543 : ENDIF
544 : ENDIF
545 :
546 : ! PFACTOR [unitless]
547 : CALL HCO_RestartGet( HcoState, 'PFACTOR', &
548 0 : Inst%PFACTOR, RC, FILLED=FOUND )
549 0 : IF ( RC /= HCO_SUCCESS ) THEN
550 0 : CALL HCO_ERROR( 'ERROR 31', RC, THISLOC=LOC )
551 0 : RETURN
552 : ENDIF
553 0 : IF ( .NOT. FOUND ) THEN
554 0 : Inst%PFACTOR = 1.0_sp
555 0 : IF ( HcoState%amIRoot ) THEN
556 0 : MSG = 'Cannot find PFACTOR restart variable - initialized to 1.0!'
557 0 : CALL HCO_WARNING(HcoState%Config%Err,MSG,RC)
558 : ENDIF
559 : ENDIF
560 :
561 : ! DRYPERIOD [unitless]
562 : CALL HCO_RestartGet( HcoState, 'DRYPERIOD', &
563 0 : Inst%DRYPERIOD, RC, FILLED=FOUND )
564 0 : IF ( RC /= HCO_SUCCESS ) THEN
565 0 : CALL HCO_ERROR( 'ERROR 32', RC, THISLOC=LOC )
566 0 : RETURN
567 : ENDIF
568 0 : IF ( .NOT. FOUND ) THEN
569 0 : Inst%DRYPERIOD = 0.0_sp
570 0 : IF ( HcoState%amIRoot ) THEN
571 0 : MSG = 'Cannot find DRYPERIOD restart variable - initialized to 0.0!'
572 0 : CALL HCO_WARNING(HcoState%Config%Err,MSG,RC)
573 : ENDIF
574 : ENDIF
575 :
576 : ENDIF
577 :
578 : !---------------------------------------------------------------
579 : ! Now need to call GET_CANOPY_NOX to break ugly dependency between
580 : ! drydep and soil NOx emissions. (bmy, 6/22/09)
581 : ! Now a function of the new MODIS/Koppen biome map (J.D. Maasakkers)
582 0 : CALL GET_CANOPY_NOX( HcoState, ExtState, Inst, RC )
583 0 : IF ( RC /= HCO_SUCCESS ) THEN
584 0 : CALL HCO_ERROR( 'ERROR 33', RC, THISLOC=LOC )
585 0 : RETURN
586 : ENDIF
587 :
588 : ! Init
589 0 : TSEMIS = HcoState%TS_EMIS
590 0 : FLUX_2D = 0e+0_hp
591 :
592 : ! Loop over each land grid-box, removed loop over landpoints
593 : !$OMP PARALLEL DO &
594 : !$OMP DEFAULT( SHARED ) &
595 : !$OMP PRIVATE( I, J, Dep_Fert, SoilFrt, FertDiag, IJflux )&
596 : !$OMP COLLAPSE( 2 )
597 0 : DO J = 1, HcoState%NY
598 0 : DO I = 1, HcoState%NX
599 :
600 : ! Zero private variables for safety's sake
601 0 : Dep_Fert = 0.0_hp
602 0 : SoilFrt = 0.0_hp
603 0 : FertDiag = 0.0_hp
604 0 : IJflux = 0.0_hp
605 :
606 : ! Do not calculate soil NOx emissions if there is no soil in
607 : ! the gridbox
608 0 : IF ( Inst%LANDTYPE(1)%VAL(I,J) == 1.0_hp ) CYCLE
609 :
610 : ! Get Deposited Fertilizer DEP_FERT [kg NO/m2]
611 0 : CALL Get_Dep_N( I, J, ExtState, HcoState, Inst, Dep_Fert )
612 :
613 : ! Get N fertilizer reservoir associated with chemical and
614 : ! manure fertilizer [kg NO/m2]
615 0 : IF ( Inst%LFERTILIZERNOX ) THEN
616 0 : SOILFRT = Inst%SOILFERT( I, J )
617 : ENDIF
618 :
619 : ! Put in constraint if dry period gt 1 yr, keep at 1yr to
620 : ! avoid unrealistic pulse
621 0 : IF ( Inst%DRYPERIOD(I,J) > 8760.0_sp ) THEN
622 0 : Inst%DRYPERIOD(I,J) = 8760.0_sp
623 : ENDIF
624 :
625 : ! Return NO emissions from soils [kg NO/m2/s]
626 : CALL Soil_NOx_Emission( ExtState, Inst, &
627 : TsEmis, I, &
628 : J, SoilFrt, &
629 0 : Inst%GWET_PREV(I,J), Inst%DryPeriod(I,J), &
630 0 : Inst%PFACTOR(I,J), IJflux, &
631 : Dep_Fert, FertDiag, &
632 0 : UnitConv, Inst%CanopyNOx(I,J,:) )
633 :
634 : ! Write out
635 0 : Flux_2D(I,J) = MAX( IJflux, 0.0_hp )
636 :
637 : ! Update diagnostics
638 0 : Inst%FertNO_Diag(I,J) = FertDiag
639 :
640 : ENDDO !J
641 : ENDDO !I
642 : !$OMP END PARALLEL DO
643 :
644 : !-----------------------------------------------------------------
645 : ! EVENTUALLY ADD SCALE FACTORS
646 : !-----------------------------------------------------------------
647 :
648 : ! Eventually apply species specific scale factor
649 0 : IF ( Inst%SpcScalVal(1) /= 1.0_sp ) THEN
650 0 : FLUX_2D = FLUX_2D * Inst%SpcScalVal(1)
651 : ENDIF
652 :
653 : ! Eventually apply spatiotemporal scale factors
654 0 : CALL HCOX_SCALE ( HcoState, FLUX_2D, TRIM(Inst%SpcScalFldNme(1)), RC )
655 0 : IF ( RC /= HCO_SUCCESS ) THEN
656 0 : CALL HCO_ERROR( 'ERROR 34', RC, THISLOC=LOC )
657 0 : RETURN
658 : ENDIF
659 :
660 : !-----------------------------------------------------------------
661 : ! PASS TO HEMCO STATE AND UPDATE DIAGNOSTICS
662 : !-----------------------------------------------------------------
663 :
664 : ! Add flux to emission array
665 : CALL HCO_EmisAdd( HcoState, FLUX_2D, Inst%IDTNO, &
666 0 : RC, ExtNr=Inst%ExtNr )
667 0 : IF ( RC /= HCO_SUCCESS ) THEN
668 0 : CALL HCO_ERROR( 'HCO_EmisAdd error', RC )
669 0 : RETURN
670 : ENDIF
671 :
672 : ! ----------------------------------------------------------------
673 : ! Eventually copy internal values to ESMF internal state object
674 : ! ----------------------------------------------------------------
675 :
676 : ! DEP_RESERVOIR [kg/m3]
677 0 : CALL HCO_RestartWrite( HcoState, 'DEP_RESERVOIR', Inst%DEP_RESERVOIR, RC )
678 0 : IF ( RC /= HCO_SUCCESS ) THEN
679 0 : CALL HCO_ERROR( 'ERROR 35', RC, THISLOC=LOC )
680 0 : RETURN
681 : ENDIF
682 :
683 : ! GWET_PREV [unitless]
684 0 : CALL HCO_RestartWrite( HcoState, 'GWET_PREV', Inst%GWET_PREV, RC )
685 0 : IF ( RC /= HCO_SUCCESS ) THEN
686 0 : CALL HCO_ERROR( 'ERROR 36', RC, THISLOC=LOC )
687 0 : RETURN
688 : ENDIF
689 :
690 : ! PFACTOR [unitless]
691 0 : CALL HCO_RestartWrite( HcoState, 'PFACTOR', Inst%PFACTOR, RC )
692 0 : IF ( RC /= HCO_SUCCESS ) THEN
693 0 : CALL HCO_ERROR( 'ERROR 37', RC, THISLOC=LOC )
694 0 : RETURN
695 : ENDIF
696 :
697 : ! DRYPERIOD [unitless]
698 0 : CALL HCO_RestartWrite( HcoState, 'DRYPERIOD', Inst%DRYPERIOD, RC )
699 0 : IF ( RC /= HCO_SUCCESS ) THEN
700 0 : CALL HCO_ERROR( 'ERROR 38', RC, THISLOC=LOC )
701 0 : RETURN
702 : ENDIF
703 :
704 : ! Leave w/ success
705 0 : Inst => NULL()
706 0 : CALL HCO_LEAVE( HcoState%Config%Err,RC )
707 :
708 0 : END SUBROUTINE HCOX_SoilNox_Run
709 : !EOC
710 : !------------------------------------------------------------------------------
711 : ! Harmonized Emissions Component (HEMCO) !
712 : !------------------------------------------------------------------------------
713 : !BOP
714 : !
715 : ! !IROUTINE: HCOX_SoilNOx_Init
716 : !
717 : ! !DESCRIPTION: Subroutine HcoX\_SoilNox\_Init initializes the HEMCO
718 : ! SOILNOX extension.
719 : !\\
720 : !\\
721 : ! !INTERFACE:
722 : !
723 0 : SUBROUTINE HCOX_SoilNOx_Init( HcoState, ExtName, ExtState, RC )
724 : !
725 : ! !USES:
726 : !
727 : USE HCO_ExtList_Mod, ONLY : GetExtNr, GetExtOpt
728 : USE HCO_ExtList_Mod, ONLY : GetExtSpcVal
729 : USE HCO_STATE_MOD, ONLY : HCO_GetExtHcoID
730 : USE HCO_Restart_Mod, ONLY : HCO_RestartDefine
731 : !
732 : ! !ARGUMENTS:
733 : !
734 : TYPE(HCO_State), POINTER :: HcoState ! Output obj
735 : CHARACTER(LEN=*), INTENT(IN ) :: ExtName ! Extension name
736 : TYPE(Ext_State), POINTER :: ExtState ! Module options
737 : INTEGER, INTENT(INOUT) :: RC
738 : !
739 : ! !REMARKS:
740 : !
741 : ! !REVISION HISTORY:
742 : ! 05 Nov 2013 - C. Keller - Initial Version
743 : ! See https://github.com/geoschem/hemco for complete history
744 : !EOP
745 : !------------------------------------------------------------------------------
746 : !BOC
747 : !
748 : ! !LOCAL VARIABLES:
749 : !
750 : INTEGER :: ExtNr
751 : CHARACTER(LEN=255) :: MSG, LOC
752 0 : CHARACTER(LEN=31), ALLOCATABLE :: SpcNames(:)
753 0 : INTEGER, ALLOCATABLE :: HcoIDs(:)
754 : INTEGER :: nSpc, I, J, II, AS
755 : TYPE(MyInst), POINTER :: Inst
756 :
757 : !=================================================================
758 : ! HCOX_SoilNOx_INIT begins here!
759 : !=================================================================
760 0 : LOC = 'HCOX_SoilNOx_INIT (HCOX_SOILNOX_MOD.F90)'
761 :
762 : ! Extension Nr.
763 0 : ExtNr = GetExtNr( HcoState%Config%ExtList, TRIM(ExtName) )
764 0 : IF ( ExtNr <= 0 ) RETURN
765 :
766 : ! Enter
767 0 : CALL HCO_ENTER( HcoState%Config%Err, LOC, RC )
768 0 : IF ( RC /= HCO_SUCCESS ) THEN
769 0 : CALL HCO_ERROR( 'ERROR 39', RC, THISLOC=LOC )
770 0 : RETURN
771 : ENDIF
772 :
773 : ! Create instance
774 0 : Inst => NULL()
775 0 : CALL InstCreate ( ExtNr, ExtState%SoilNox, Inst, RC )
776 0 : IF ( RC /= HCO_SUCCESS ) THEN
777 0 : CALL HCO_ERROR ( 'Cannot create soil NOx instance', RC )
778 0 : RETURN
779 : ENDIF
780 :
781 : ! ----------------------------------------------------------------------
782 : ! Get species IDs and settings
783 : ! ----------------------------------------------------------------------
784 :
785 : ! Read settings specified in configuration file
786 : ! Note: the specified strings have to match those in
787 : ! the config. file!
788 : CALL GetExtOpt( HcoState%Config, ExtNr, 'Use fertilizer NOx', &
789 0 : OptValBool=Inst%LFERTILIZERNOX, RC=RC )
790 0 : IF ( RC /= HCO_SUCCESS ) THEN
791 0 : CALL HCO_ERROR( 'ERROR 40', RC, THISLOC=LOC )
792 0 : RETURN
793 : ENDIF
794 :
795 : ! Get global scale factor
796 0 : Inst%FERT_SCALE = HCOX_SoilNOx_GetFertScale()
797 :
798 : ! Get HEMCO species IDs
799 0 : CALL HCO_GetExtHcoID( HcoState, ExtNr, HcoIDs, SpcNames, nSpc, RC )
800 0 : IF ( RC /= HCO_SUCCESS ) THEN
801 0 : CALL HCO_ERROR( 'ERROR 41', RC, THISLOC=LOC )
802 0 : RETURN
803 : ENDIF
804 0 : IF ( nSpc /= 1 ) THEN
805 0 : MSG = 'Module soil NOx accepts only one species!'
806 0 : CALL HCO_ERROR(MSG, RC )
807 0 : RETURN
808 : ENDIF
809 0 : Inst%IDTNO = HcoIDs(1)
810 :
811 : ! Get species scale factor
812 : CALL GetExtSpcVal( HcoState%Config, ExtNr, nSpc, &
813 0 : SpcNames, 'Scaling', 1.0_sp, Inst%SpcScalVal, RC )
814 0 : IF ( RC /= HCO_SUCCESS ) THEN
815 0 : CALL HCO_ERROR( 'ERROR 42', RC, THISLOC=LOC )
816 0 : RETURN
817 : ENDIF
818 :
819 : CALL GetExtSpcVal( HcoState%Config, ExtNr, nSpc, &
820 0 : SpcNames, 'ScaleField', HCOX_NOSCALE, Inst%SpcScalFldNme, RC )
821 0 : IF ( RC /= HCO_SUCCESS ) THEN
822 0 : CALL HCO_ERROR( 'ERROR 43', RC, THISLOC=LOC )
823 0 : RETURN
824 : ENDIF
825 :
826 : ! Verbose mode
827 0 : IF ( HcoState%amIRoot ) THEN
828 :
829 : ! Write the name of the extension regardless of the verbose setting
830 0 : msg = 'Using HEMCO extension: SoilNOx (soil NOx emissions)'
831 0 : IF ( HCO_IsVerb( HcoState%Config%Err ) ) THEN
832 0 : CALL HCO_Msg( HcoState%Config%Err, msg, sep1='-' ) ! with separator
833 : ELSE
834 0 : CALL HCO_Msg( msg, verb=.TRUE. ) ! w/o separator
835 : ENDIF
836 :
837 : ! Write all other messages as debug printout only
838 0 : WRITE(MSG,*) ' - NOx species : ', TRIM(SpcNames(1)), Inst%IDTNO
839 0 : CALL HCO_MSG(HcoState%Config%Err,MSG)
840 0 : WRITE(MSG,*) ' - NOx scale factor : ', Inst%SpcScalVal(1)
841 0 : CALL HCO_MSG(HcoState%Config%Err,MSG)
842 0 : WRITE(MSG,*) ' - NOx scale field : ', TRIM(Inst%SpcScalFldNme(1))
843 0 : CALL HCO_MSG(HcoState%Config%Err,MSG)
844 0 : WRITE(MSG,*) ' - Use fertilizer NOx : ', Inst%LFERTILIZERNOX
845 0 : CALL HCO_MSG(HcoState%Config%Err,MSG)
846 0 : WRITE(MSG,*) ' - Fertilizer scale factor: ', Inst%FERT_SCALE
847 0 : CALL HCO_MSG(HcoState%Config%Err,MSG,SEP2='-')
848 : ENDIF
849 :
850 : ! ----------------------------------------------------------------------
851 : ! Set module variables
852 : ! ----------------------------------------------------------------------
853 :
854 : ! horizontal dimensions
855 0 : I = HcoState%NX
856 0 : J = HcoState%NY
857 :
858 0 : ALLOCATE( Inst%FertNO_Diag( I, J ), STAT=AS )
859 0 : IF ( AS /= 0 ) THEN
860 0 : CALL HCO_ERROR( 'FertNO_Diag', RC )
861 0 : RETURN
862 : ENDIF
863 0 : Inst%FertNO_Diag = 0.0_sp
864 :
865 0 : ALLOCATE( Inst%DRYPERIOD( I, J ), STAT=AS )
866 0 : IF ( AS /= 0 ) THEN
867 0 : CALL HCO_ERROR( 'DRYPERIOD', RC )
868 0 : RETURN
869 : ENDIF
870 0 : Inst%DRYPERIOD = 0.0_sp
871 :
872 0 : ALLOCATE( Inst%PFACTOR( I, J ), STAT=AS )
873 0 : IF ( AS /= 0 ) THEN
874 0 : CALL HCO_ERROR( 'PFACTOR', RC )
875 0 : RETURN
876 : ENDIF
877 0 : Inst%PFACTOR = 0.0_sp
878 :
879 0 : ALLOCATE( Inst%GWET_PREV( I, J ), STAT=AS )
880 0 : IF ( AS /= 0 ) THEN
881 0 : CALL HCO_ERROR( 'GWET_PREV', RC )
882 0 : RETURN
883 : ENDIF
884 0 : Inst%GWET_PREV = 0.0_sp
885 :
886 0 : ALLOCATE( Inst%DEP_RESERVOIR( I, J ), STAT=AS )
887 0 : IF ( AS /= 0 ) THEN
888 0 : CALL HCO_ERROR( 'DEP_RESERVOIR', RC )
889 0 : RETURN
890 : ENDIF
891 0 : Inst%DEP_RESERVOIR = 0.0_sp
892 :
893 0 : ALLOCATE( Inst%CANOPYNOX( I, J, NBIOM ), STAT=AS )
894 0 : IF ( AS /= 0 ) THEN
895 0 : CALL HCO_ERROR( 'CANOPYNOX', RC )
896 0 : RETURN
897 : ENDIF
898 0 : Inst%CANOPYNOX = 0e+0_hp
899 :
900 : ! Reserve 24 pointers for land fractions for each Koppen category
901 0 : ALLOCATE ( Inst%LANDTYPE(NBIOM), STAT=AS )
902 : IF ( AS /= 0 ) THEN
903 0 : CALL HCO_ERROR( 'LANDTYPE', RC )
904 0 : RETURN
905 : ENDIF
906 0 : DO II = 1,NBIOM
907 0 : ALLOCATE( Inst%LANDTYPE(II)%VAL( I, J ), STAT=AS )
908 : IF ( AS /= 0 ) THEN
909 0 : CALL HCO_ERROR( 'LANDTYPE array', RC )
910 0 : RETURN
911 : ENDIF
912 0 : Inst%LANDTYPE(II)%Val = 0.0_hp
913 : ENDDO
914 :
915 : ALLOCATE ( Inst%SOILFERT ( I, J ), &
916 : Inst%CLIMARID ( I, J ), &
917 0 : Inst%CLIMNARID ( I, J ), STAT=AS )
918 0 : IF ( AS /= 0 ) THEN
919 0 : CALL HCO_ERROR( 'SOILFERT', RC )
920 0 : RETURN
921 : ENDIF
922 0 : Inst%SOILFERT = 0.0_hp
923 0 : Inst%CLIMARID = 0.0_hp
924 0 : Inst%CLIMNARID = 0.0_hp
925 :
926 : ! ----------------------------------------------------------------------
927 : ! Set diagnostics
928 : ! ----------------------------------------------------------------------
929 : CALL Diagn_Create( HcoState = HcoState, &
930 : cName = 'EmisNO_Fert', &
931 : ExtNr = ExtNr, &
932 : Cat = -1, &
933 : Hier = -1, &
934 : HcoID = -1, &
935 : SpaceDim = 2, &
936 : OutUnit = 'kg/m2/s', &
937 : AutoFill = 0, &
938 : Trgt2D = Inst%FertNO_Diag, &
939 0 : RC = RC )
940 0 : IF ( RC /= HCO_SUCCESS ) THEN
941 0 : CALL HCO_ERROR( 'ERROR 44', RC, THISLOC=LOC )
942 0 : RETURN
943 : ENDIF
944 :
945 : CALL HCO_RestartDefine( HcoState, 'PFACTOR', &
946 0 : Inst%PFACTOR, '1', RC )
947 0 : IF ( RC /= HCO_SUCCESS ) THEN
948 0 : CALL HCO_ERROR( 'ERROR 45', RC, THISLOC=LOC )
949 0 : RETURN
950 : ENDIF
951 :
952 : CALL HCO_RestartDefine( HcoState, 'DRYPERIOD', &
953 0 : Inst%DRYPERIOD, '1', RC )
954 0 : IF ( RC /= HCO_SUCCESS ) THEN
955 0 : CALL HCO_ERROR( 'ERROR 46', RC, THISLOC=LOC )
956 0 : RETURN
957 : ENDIF
958 :
959 : CALL HCO_RestartDefine( HcoState, 'GWET_PREV', &
960 0 : Inst%GWET_PREV, '1', RC )
961 0 : IF ( RC /= HCO_SUCCESS ) THEN
962 0 : CALL HCO_ERROR( 'ERROR 47', RC, THISLOC=LOC )
963 0 : RETURN
964 : ENDIF
965 :
966 : CALL HCO_RestartDefine( HcoState, ' DEP_RESERVOIR', &
967 0 : Inst%DEP_RESERVOIR, 'kg/m3', RC )
968 0 : IF ( RC /= HCO_SUCCESS ) THEN
969 0 : CALL HCO_ERROR( 'ERROR 48', RC, THISLOC=LOC )
970 0 : RETURN
971 : ENDIF
972 :
973 : ! ----------------------------------------------------------------------
974 : ! Set HEMCO extensions variables
975 : ! ----------------------------------------------------------------------
976 :
977 : ! Activate required met fields
978 0 : ExtState%T2M%DoUse = .TRUE.
979 0 : ExtState%GWETTOP%DoUse = .TRUE.
980 0 : ExtState%SUNCOS%DoUse = .TRUE.
981 0 : ExtState%U10M%DoUse = .TRUE.
982 0 : ExtState%V10M%DoUse = .TRUE.
983 0 : ExtState%LAI%DoUse = .TRUE.
984 0 : ExtState%FRLAND%DoUse = .TRUE.
985 0 : ExtState%FRLANDIC%DoUse = .TRUE.
986 0 : ExtState%FROCEAN%DoUse = .TRUE.
987 0 : ExtState%FRSEAICE%DoUse = .TRUE.
988 0 : ExtState%FRLAKE%DoUse = .TRUE.
989 0 : ExtState%SNODP%DoUse = .TRUE.
990 0 : ExtState%RADSWG%DoUse = .TRUE.
991 0 : ExtState%CLDFRC%DoUse = .TRUE.
992 :
993 : ! Activate required deposition parameter
994 0 : ExtState%DRY_TOTN%DoUse = .TRUE.
995 0 : ExtState%WET_TOTN%DoUse = .TRUE.
996 :
997 : ! Leave w/ success
998 0 : Inst => NULL()
999 0 : IF ( ALLOCATED(HcoIDs ) ) DEALLOCATE(HcoIDs )
1000 0 : IF ( ALLOCATED(SpcNames) ) DEALLOCATE(SpcNames)
1001 0 : CALL HCO_LEAVE( HcoState%Config%Err,RC )
1002 :
1003 0 : END SUBROUTINE HCOX_SoilNOx_Init
1004 : !EOC
1005 : !------------------------------------------------------------------------------
1006 : ! Harmonized Emissions Component (HEMCO) !
1007 : !------------------------------------------------------------------------------
1008 : !BOP
1009 : !
1010 : ! !IROUTINE: HCOX_SoilNOx_Final
1011 : !
1012 : ! !DESCRIPTION: Subroutine HcoX\_SoilNOx\_Final finalizes the HEMCO
1013 : ! SOILNOX extension.
1014 : !\\
1015 : !\\
1016 : ! !INTERFACE:
1017 : !
1018 0 : SUBROUTINE HCOX_SoilNOx_Final( HcoState, ExtState, RC )
1019 : !
1020 : ! !USES
1021 : !
1022 : !
1023 : ! !INPUT PARAMETERS:
1024 : !
1025 : TYPE(HCO_State), POINTER :: HcoState ! HEMCO State obj
1026 : TYPE(Ext_State), POINTER :: ExtState ! Extension state
1027 : !
1028 : ! !INPUT/OUTPUT PARAMETERS:
1029 : !
1030 : INTEGER, INTENT(INOUT) :: RC
1031 : !
1032 : ! !REVISION HISTORY:
1033 : ! 05 Nov 2013 - C. Keller - Initial Version
1034 : ! See https://github.com/geoschem/hemco for complete history
1035 : !EOP
1036 : !------------------------------------------------------------------------------
1037 : !BOC
1038 : !
1039 : ! !LOCAL VARIABLES:
1040 : !
1041 :
1042 : !=================================================================
1043 : ! HCOX_SoilNOx_FINAL begins here!
1044 : !=================================================================
1045 0 : CALL InstRemove ( ExtState )
1046 :
1047 0 : END SUBROUTINE HCOX_SoilNox_Final
1048 : !EOC
1049 : !------------------------------------------------------------------------------
1050 : ! Harmonized Emissions Component (HEMCO) !
1051 : !------------------------------------------------------------------------------
1052 : !BOP
1053 : !
1054 : ! !IROUTINE: HCOX_SoilNOx_GetFertScale
1055 : !
1056 : ! !DESCRIPTION: Function HCOX\_SoilNOx\_GETFERTSCALE returns the scale factor
1057 : ! applied to fertilizer NOx emissions.
1058 : !\\
1059 : !\\
1060 : ! !INTERFACE:
1061 : !
1062 0 : FUNCTION HCOX_SoilNOx_GetFertScale() RESULT ( FERT_SCALE )
1063 : !
1064 : ! !ARGUMENTS:
1065 : !
1066 : REAL(hp) :: FERT_SCALE
1067 : !
1068 : ! !REMARKS:
1069 : !
1070 : ! !REVISION HISTORY:
1071 : ! 11 Dec 2013 - C. Keller - Initial version
1072 : ! See https://github.com/geoschem/hemco for complete history
1073 : !EOP
1074 : !------------------------------------------------------------------------------
1075 : !BOC
1076 : !
1077 : ! !LOCAL VARIABLES:
1078 : !
1079 :
1080 : ! Scale factor so that fertilizer emission = 1.8 Tg N/yr
1081 : ! (Stehfest and Bouwman, 2006)
1082 : ! before canopy reduction
1083 0 : FERT_SCALE = 0.0068_hp
1084 : ! Value calculated by running the 2x2.5 model
1085 : ! For now, use this value for all resolutions since regular soil NOx
1086 : ! emissions change with resolution as well (J.D. Maasakkers)
1087 :
1088 0 : END FUNCTION HCOX_SoilNOx_GetFertScale
1089 : !EOC
1090 : !------------------------------------------------------------------------------
1091 : ! Harmonized Emissions Component (HEMCO) !
1092 : !------------------------------------------------------------------------------
1093 : !BOP
1094 : !
1095 : ! !IROUTINE: Soil_NOx_Emission
1096 : !
1097 : ! !DESCRIPTION: Subroutine Soil\_NOx\_Emission computes the emission of soil
1098 : ! and fertilizer NOx for the GEOS-Chem model.
1099 : !\\
1100 : !\\
1101 : ! !INTERFACE:
1102 : !
1103 0 : SUBROUTINE Soil_NOx_Emission( ExtState, Inst, TS_EMIS, I, &
1104 : J, SOILFRT, GWET_PREV, DRYPERIOD, &
1105 : PFACTOR, SOILNOx, DEPN, FERTDIAG, &
1106 0 : UNITCONV, R_CANOPY )
1107 : !
1108 : ! !INPUT PARAMETERS:
1109 : !
1110 : TYPE(Ext_State), POINTER :: ExtState ! Module options
1111 : TYPE(MyInst), POINTER :: Inst ! Instance object
1112 : REAL*4, INTENT(IN) :: TS_EMIS ! Emission timestep [s]
1113 : INTEGER, INTENT(IN) :: I ! grid box lon index
1114 : INTEGER, INTENT(IN) :: J ! grid box lat index
1115 : REAL(hp), INTENT(IN) :: DEPN ! Dry Dep Fert term [kg/m2]
1116 : REAL(hp), INTENT(IN) :: SOILFRT ! Fertilizer emissions [kg/m2]
1117 : REAL(hp), INTENT(IN) :: UNITCONV ! ng N to kg NO
1118 : REAL(hp), INTENT(IN) :: R_CANOPY(:)! Resist of canopy to NOx [1/s]
1119 : !
1120 : ! !OUTPUT PARAMETERS:
1121 : !
1122 : REAL(hp), INTENT(OUT) :: SOILNOx ! Soil NOx emissions [kg/m2/s]
1123 : REAL(sp), INTENT(OUT) :: GWET_PREV ! Soil Moisture Prev timestep
1124 : REAL(sp), INTENT(OUT) :: DRYPERIOD ! Dry period length in hours
1125 : REAL(sp), INTENT(OUT) :: PFACTOR ! Pulsing Factor
1126 : REAL(hp), INTENT(OUT) :: FERTDIAG ! Fert emissions [kg/m2/s]
1127 : !
1128 : ! !REMARKS:
1129 : ! R_CANOPY is computed in routine GET_CANOPY_NOX of "canopy_nox_mod.f".
1130 : ! This was originally in the GEOS-Chem dry deposition code, but was split
1131 : ! off in order to avoid an ugly code dependency between the dry deposition
1132 : ! and soil NOx codes.
1133 : !
1134 : ! As of v9-02, this module uses the MODIS/Koppen biome types instead
1135 : ! of the Olson land type / biome type, making it different from the original
1136 : ! dry deposition code (J.D. Maasakkers)
1137 : !
1138 : ! !REVISION HISTORY:
1139 : ! 31 Jan 2011 - R. Hudman - New Model added
1140 : ! See https://github.com/geoschem/hemco for complete history
1141 : !EOP
1142 : !------------------------------------------------------------------------------
1143 : !BOC
1144 : !
1145 : ! !LOCAL VARIABLES:
1146 : !
1147 : INTEGER :: K
1148 : REAL(hp) :: BASE_TERM, CRF_TERM, PULSE
1149 : REAL(hp) :: TC, TEMP_TERM, WINDSQR
1150 : REAL(hp) :: WET_TERM, A_FERT, A_BIOM
1151 : REAL(hp) :: LAI, SUNCOS, GWET
1152 : REAL(hp) :: ARID, NARID
1153 :
1154 : !=================================================================
1155 : ! Initialize
1156 : !=================================================================
1157 :
1158 : ! Initialize
1159 0 : SOILNOX = 0.0_hp
1160 0 : FERTDIAG = 0.0_hp
1161 :
1162 : ! Surface temperature [C]
1163 0 : TC = ExtState%T2M%Arr%Val(I,J) - 273.15_hp
1164 :
1165 : ! Surface wind speed, squared
1166 0 : WINDSQR = ExtState%U10M%Arr%Val(I,J)**2 + &
1167 0 : ExtState%V10M%Arr%Val(I,J)**2
1168 :
1169 : ! Leaf area index
1170 0 : LAI = ExtState%LAI%Arr%Val(I,J)
1171 :
1172 : ! Cosine of Solar Zenit Angle
1173 0 : SUNCOS = ExtState%SUNCOS%Arr%Val(I,J)
1174 :
1175 : ! Top soil wetness [unitless]
1176 0 : GWET = ExtState%GWETTOP%Arr%Val(I,J)
1177 :
1178 : !=================================================================
1179 : ! Compute soil NOx emissions
1180 : !=================================================================
1181 :
1182 : ! Cumulative multiplication factor (over baseline emissions)
1183 : ! that accounts for soil pulsing
1184 0 : PULSE = PULSING( GWET, TS_EMIS, GWET_PREV, PFACTOR, DRYPERIOD )
1185 :
1186 : ! ------Loop Over MODIS/Koppen Landtypes
1187 0 : DO K = 1, 24
1188 :
1189 : ! Temperature-dependent term of soil NOx emissions [unitless]
1190 : ! Use GWET instead of climo wet/dry
1191 0 : TEMP_TERM = SOILTEMP( K, TC, GWET )
1192 :
1193 : ! Soil moisture scaling of soil NOx emissions
1194 0 : ARID = Inst%CLIMARID(I,J)
1195 0 : NARID = Inst%CLIMNARID(I,J)
1196 0 : WET_TERM = SOILWET( GWET , ARID, NARID )
1197 :
1198 : ! Fertilizer emission [kg/m2/s]
1199 0 : A_FERT = FERTADD( SOILFRT, DEPN )
1200 :
1201 : ! Scale fertilizer emissions as specified
1202 : ! (scale needed to force fert emiss of 1.8 Tg N/yr w/o canopy uptake)
1203 0 : A_FERT = A_FERT * Inst%FERT_SCALE
1204 :
1205 : ! Canopy reduction factor
1206 0 : CRF_TERM = SOILCRF( K, LAI, R_CANOPY(K), WINDSQR, SUNCOS )
1207 :
1208 : ! Base emission. ng N/m2/s --> kg NO/m2/s
1209 0 : A_BIOM = A_BIOME(K) * UNITCONV
1210 :
1211 : ! SOILNOX includes fertilizer
1212 : SOILNOX = ( SOILNOX &
1213 : + ( A_BIOM + A_FERT ) &
1214 : * ( TEMP_TERM * WET_TERM * PULSE ) &
1215 0 : * Inst%LANDTYPE(K)%VAL(I,J) &
1216 0 : * ( 1.0_hp - CRF_TERM ) )
1217 :
1218 : ! FERTDIAG, only used for the fertilizer diagnostic
1219 : FERTDIAG = ( FERTDIAG &
1220 : + ( A_FERT ) &
1221 : * ( TEMP_TERM * WET_TERM * PULSE ) &
1222 0 : * Inst%LANDTYPE(K)%VAL(I,J) &
1223 0 : * ( 1.0_hp - CRF_TERM ) )
1224 :
1225 : ENDDO
1226 :
1227 0 : END SUBROUTINE Soil_NOx_Emission
1228 : !EOC
1229 : !------------------------------------------------------------------------------
1230 : ! Harmonized Emissions Component (HEMCO) !
1231 : !------------------------------------------------------------------------------
1232 : !BOP
1233 : !
1234 : ! !IROUTINE: Get_Canopy_NOx
1235 : !
1236 : ! !DESCRIPTION: Subroutine Get\_Canopy\_NOx computes the bulk surface
1237 : ! resistance of the canopy to NOx. This computation was originally done
1238 : ! within legacy routine DEPVEL (in "drydep\_mod.f"). Moving this computation
1239 : ! to Get\_Canopy\_NOx now allows for a totally clean separation between
1240 : ! dry deposition routines and emissions routines in GEOS-Chem.
1241 : !\\
1242 : !\\
1243 : ! !INTERFACE:
1244 : !
1245 0 : SUBROUTINE Get_Canopy_NOx( HcoState, ExtState, Inst, RC )
1246 : !
1247 : ! !USES:
1248 : !
1249 : USE Drydep_Toolbox_Mod, ONLY : BIOFIT
1250 : USE HCO_GeoTools_Mod, ONLY : HCO_LANDTYPE
1251 : !
1252 : ! !ARGUMENTS:
1253 : !
1254 : TYPE(HCO_State), POINTER :: HcoState
1255 : TYPE(Ext_State), POINTER :: ExtState
1256 : TYPE(MyInst), POINTER :: Inst
1257 : INTEGER, INTENT(INOUT) :: RC
1258 : !
1259 : ! !REMARKS:
1260 : ! For backwards compatibility, the bulk surface resistance is stored
1261 : ! in common block array CANOPYNOX in "commsoil.h". Leave it like this
1262 : ! for the time being...we'll clean it up when we fix all of the soil
1263 : ! NOx routines.
1264 : !
1265 : ! !REVISION HISTORY:
1266 : ! 14 Jun 2012 - J.D. Maasakkers - Rewritten as a function of the
1267 : ! MODIS/Koppen biometype
1268 : ! See https://github.com/geoschem/hemco for complete history
1269 : !EOP
1270 : !------------------------------------------------------------------------------
1271 : !BOC
1272 : !
1273 : ! !DEFINED PARAMETERS:
1274 : !
1275 : ! Molecular weight of water [kg]
1276 : REAL(hp), PARAMETER :: XMWH2O = 18e-3_hp
1277 :
1278 : ! Surface pressure??? [Pa]
1279 : REAL(hp), PARAMETER :: PRESS = 1.5e+5_hp
1280 : !
1281 : ! !LOCAL VARIABLES:
1282 : !
1283 : ! Scalars
1284 : INTEGER :: I, J, K, KK
1285 : INTEGER :: DCSZ
1286 : REAL(hp) :: F0, HSTAR, XMW
1287 : REAL(hp) :: DTMP1, DTMP2, DTMP3, DTMP4, GFACT, GFACI
1288 : REAL(hp) :: RT, RAD0, RIX, RIXX, RDC, RLUXX
1289 : REAL(hp) :: RGSX, RCLX, TEMPK, TEMPC
1290 : REAL(hp) :: LAI, SUNCOS, CLDFRC
1291 : REAL(hp) :: BIO_RESULT
1292 :
1293 : ! Arrays
1294 : REAL(hp) :: RI (NBIOM)
1295 : REAL(hp) :: RLU (NBIOM)
1296 : REAL(hp) :: RAC (NBIOM)
1297 : REAL(hp) :: RGSS(NBIOM)
1298 : REAL(hp) :: RGSO(NBIOM)
1299 : REAL(hp) :: RCLS(NBIOM)
1300 : REAL(hp) :: RCLO(NBIOM)
1301 :
1302 : !=================================================================
1303 : ! GET_CANOPY_NOX begins here!
1304 : !=================================================================
1305 :
1306 : ! Set physical parameters
1307 0 : HSTAR = 0.01e+0_hp ! Henry's law constant
1308 0 : F0 = 0.1e+0_hp ! Reactivity factor for biological oxidation
1309 0 : XMW = 46e-3_hp ! Molecular wt of NO2 (kg)
1310 :
1311 : ! Get size of DRYCOEFF (will be passed to routine BIOFIT)
1312 0 : DCSZ = SIZE( ExtState%DRYCOEFF )
1313 :
1314 : ! Loop over surface boxes
1315 0 : DO J = 1, HcoState%NY
1316 0 : DO I = 1, HcoState%NX
1317 :
1318 : ! Surface temperature [K] and [C]
1319 0 : TEMPK = ExtState%T2M%Arr%Val(I,J)
1320 0 : TEMPC = ExtState%T2M%Arr%Val(I,J) - 273.15_hp
1321 :
1322 : ! Compute bulk surface resistance for gases.
1323 : !
1324 : ! Adjust external surface resistances for temperature;
1325 : ! from Wesely [1989], expression given in text on p. 1296.
1326 0 : RT = 1000.0_hp * EXP( -TEMPC - 4.0_hp )
1327 :
1328 : !--------------------------------------------------------------
1329 : ! Get surface resistances - loop over biome types K
1330 : !
1331 : ! The land types within each grid square are defined using the
1332 : ! Olson land-type database. Each of the Olson land types is
1333 : ! assigned a corresponding "deposition land type" with
1334 : ! characteristic values of surface resistance components.
1335 : ! There are 74 Olson land-types but only 11 deposition
1336 : ! land-types (i.e., many of the Olson land types share the
1337 : ! same deposition characteristics). Surface resistance
1338 : ! components for the "deposition land types" are from Wesely
1339 : ! [1989] except for tropical forests [Jacob and Wofsy, 1990]
1340 : ! and for tundra [Jacob et al., 1992]. All surface resistance
1341 : ! components are normalized to a leaf area index of unity.
1342 : !--------------------------------------------------------------
1343 : !Loop over all biometypes
1344 0 : DO K = 1, NBIOM
1345 :
1346 : ! Skip if not present
1347 0 : IF ( Inst%LANDTYPE(K)%VAL(I,J) == 0.0_hp ) CYCLE
1348 :
1349 : ! Set second loop variable to K to allow snow/ice correction
1350 0 : KK = K
1351 :
1352 : ! If the surface is snow or ice, then set K=3
1353 0 : IF ( ( ExtState%SNODP%Arr%Val(I,J) > 0.2 ) .OR. &
1354 0 : ( HCO_LANDTYPE(ExtState%FRLAND%Arr%Val(I,J), &
1355 0 : ExtState%FRLANDIC%Arr%Val(I,J), &
1356 0 : ExtState%FROCEAN%Arr%Val(I,J), &
1357 0 : ExtState%FRSEAICE%Arr%Val(I,J), &
1358 0 : ExtState%FRLAKE%Arr%Val(I,J) ) == 2 ) ) KK = 3
1359 :
1360 : ! USE new MODIS/KOPPEN Biometypes to read data
1361 :
1362 : ! Read the internal resistance RI (minimum stomatal resistance
1363 : ! for water vapor, per unit area of leaf) from the IRI array;
1364 : ! a '9999' value means no deposition to stomata so we impose a
1365 : ! very large value for RI.
1366 0 : RI(K) = DBLE( SNIRI(KK) )
1367 0 : IF ( RI(K) >= 9999.e+0_hp ) RI(K)= 1.e+12_hp
1368 :
1369 : ! Cuticular resistances IRLU read in from 'drydep.table'
1370 : ! are per unit area of leaf; divide them by the leaf area index
1371 : ! to get a cuticular resistance for the bulk canopy. If IRLU is
1372 : !'9999' it means there are no cuticular surfaces on which to
1373 : ! deposit so we impose a very large value for RLU.
1374 0 : IF ( SNIRLU(KK) >= 9999 .OR. &
1375 : ExtState%LAI%Arr%Val(I,J) <= 0e+0_hp ) THEN
1376 0 : RLU(K) = 1.e+6_hp
1377 : ELSE
1378 0 : RLU(K)= DBLE(SNIRLU(KK)) / ExtState%LAI%Arr%Val(I,J) + RT
1379 : ENDIF
1380 :
1381 : ! The following are the remaining resistances for the Wesely
1382 : ! resistance-in-series model for a surface canopy
1383 : ! (see Atmos. Environ. paper, Fig.1).
1384 0 : RAC(K) = MAX( DBLE( SNIRAC(KK) ), 1e+0_hp )
1385 0 : RGSS(K) = MAX( DBLE( SNIRGSS(KK) ) + RT, 1e+0_hp )
1386 0 : RGSO(K) = MAX( DBLE( SNIRGSO(KK) ) + RT, 1e+0_hp )
1387 0 : RCLS(K) = DBLE( SNIRCLS(KK) ) + RT
1388 0 : RCLO(K) = DBLE( SNIRCLO(KK) ) + RT
1389 :
1390 0 : IF ( RAC(K) >= 9999.e+0_hp ) RAC(K) = 1e+12_hp
1391 0 : IF ( RGSS(K) >= 9999.e+0_hp ) RGSS(K) = 1e+12_hp
1392 0 : IF ( RGSO(K) >= 9999.e+0_hp ) RGSO(K) = 1e+12_hp
1393 0 : IF ( RCLS(K) >= 9999.e+0_hp ) RCLS(K) = 1e+12_hp
1394 0 : IF ( RCLO(K) >= 9999.e+0_hp ) RCLO(K) = 1e+12_hp
1395 :
1396 : !-------------------------------------------------------------
1397 : ! Adjust stomatal resistances for insolation and temperature:
1398 : !
1399 : ! Temperature adjustment is from Wesely [1989], equation (3).
1400 : !
1401 : ! Light adjustment by the function BIOFIT is described by Wang
1402 : ! [1996]. It combines:
1403 : !
1404 : ! - Local dependence of stomal resistance on the intensity I
1405 : ! of light impinging the leaf; this is expressed as a
1406 : ! multiplicative factor I/(I+b) to the stomatal resistance
1407 : ! where b = 50 W m-2
1408 : ! (equation (7) of Baldocchi et al. [1987])
1409 : ! - Radiative transfer of direct and diffuse radiation in the
1410 : ! canopy using equations (12)-(16) from Guenther et al.
1411 : ! [1995]
1412 : ! - Separate accounting of sunlit and shaded leaves using
1413 : ! equation (12) of Guenther et al. [1995]
1414 : ! - Partitioning of the radiation at the top of the canopy
1415 : ! into direct and diffuse components using a
1416 : ! parameterization to results from an atmospheric radiative
1417 : ! transfer model [Wang, 1996]
1418 : !
1419 : ! The dependent variables of the function BIOFIT are the leaf
1420 : ! area index (XYLAI), the cosine of zenith angle (SUNCOS) and
1421 : ! the fractional cloud cover (CFRAC). The factor GFACI
1422 : ! integrates the light dependence over the canopy depth; so
1423 : ! be scaled by LAI to yield a bulk canopy value because that's
1424 : ! already done in the GFACI formulation.
1425 : !-------------------------------------------------------------
1426 :
1427 : ! Radiation @ sfc [W/m2]
1428 0 : RAD0 = ExtState%RADSWG%Arr%Val(I,J)
1429 :
1430 : ! Internal resistance
1431 0 : RIX = RI(K)
1432 :
1433 : ! Skip the following block if the resistance RIX is high
1434 0 : IF ( RIX < 9999e+0_hp ) THEN
1435 0 : GFACT = 100.0e+0_hp
1436 :
1437 0 : IF ( TEMPC > 0.e+0_hp .AND. TEMPC < 40.e+0_hp) THEN
1438 0 : GFACT = 400.e+0_hp / TEMPC / ( 40.0e+0_hp - TEMPC )
1439 : ENDIF
1440 :
1441 0 : GFACI = 100.e+0_hp
1442 :
1443 0 : IF ( RAD0 > 0e+0_hp .AND. ExtState%LAI%Arr%Val(I,J) > 0e+0_hp ) THEN
1444 :
1445 0 : LAI = ExtState%LAI%Arr%Val(I,J)
1446 0 : SUNCOS = ExtState%SUNCOS%Arr%Val(I,J)
1447 0 : CLDFRC = ExtState%CLDFRC%Arr%Val(I,J)
1448 :
1449 : BIO_RESULT = BIOFIT( ExtState%DRYCOEFF, LAI, &
1450 0 : SUNCOS, CLDFRC, SIZE(ExtState%DRYCOEFF) )
1451 :
1452 0 : GFACI= 1e+0_hp / BIO_RESULT
1453 : ENDIF
1454 :
1455 0 : RIX = RIX * GFACT * GFACI
1456 : ENDIF
1457 :
1458 : ! Compute aerodynamic resistance to lower elements in lower
1459 : ! part of the canopy or structure, assuming level terrain -
1460 : ! equation (5) of Wesely [1989].
1461 0 : RDC = 100.0_hp * ( 1.0_hp + 1000.0_hp / ( RAD0 + 10.0_hp ) )
1462 :
1463 : ! Loop over species; species-dependent corrections to resistances
1464 : ! are from equations (6)-(9) of Wesely [1989].
1465 : !
1466 : ! NOTE: here we only consider NO2 (bmy, 6/22/09)
1467 : RIXX = RIX * DIFFG( TEMPK, PRESS, XMWH2O ) / &
1468 : DIFFG( TEMPK, PRESS, XMW ) &
1469 0 : + 1.e+0_hp / ( HSTAR/3000.e+0_hp + 100.e+0_hp*F0 )
1470 :
1471 0 : RLUXX = 1.e+12_hp
1472 :
1473 0 : IF ( RLU(K) < 9999.e+0_hp ) THEN
1474 0 : RLUXX = RLU(K) / ( HSTAR / 1.0e+05_hp + F0 )
1475 : ENDIF
1476 :
1477 : ! To prevent virtually zero resistance to species with huge HSTAR,
1478 : ! such as HNO3, a minimum value of RLUXX needs to be set.
1479 : ! The rationality of the existence of such a minimum is
1480 : ! demonstrated by the observed relationship between Vd(NOy-NOx)
1481 : ! and Ustar in Munger et al.[1996]; Vd(HNO3) never exceeds 2 cm/s
1482 : ! in observations. The corresponding minimum resistance is 50 s/m.
1483 : ! was introduced by J.Y. Liang on 7/9/95.
1484 0 : RGSX = 1e+0_hp / ( HSTAR/1e+5_hp/RGSS(K) + F0/RGSO(K) )
1485 0 : RCLX = 1e+0_hp / ( HSTAR/1e+5_hp/RCLS(K) + F0/RCLO(K) )
1486 :
1487 : ! Get the bulk surface resistance of the canopy
1488 : ! from the network of resistances in parallel and in series
1489 : ! (Fig. 1 of Wesely [1989])
1490 0 : DTMP1 = 1.e+0_hp / RIXX
1491 0 : DTMP2 = 1.e+0_hp / RLUXX
1492 0 : DTMP3 = 1.e+0_hp / ( RAC(K) + RGSX )
1493 0 : DTMP4 = 1.e+0_hp / ( RDC + RCLX )
1494 :
1495 : ! Save the within canopy depvel of NOx, used in calculating
1496 : ! the canopy reduction factor for soil emissions [1/s]
1497 0 : Inst%CANOPYNOX(I,J,K) = DTMP1 + DTMP2 + DTMP3 + DTMP4
1498 :
1499 : ENDDO !K
1500 : ENDDO !I
1501 : ENDDO !J
1502 :
1503 : ! Return w/ success
1504 0 : RC = HCO_SUCCESS
1505 :
1506 0 : END SUBROUTINE Get_Canopy_NOx
1507 : !EOC
1508 : !------------------------------------------------------------------------------
1509 : ! Harmonized Emissions Component (HEMCO) !
1510 : !------------------------------------------------------------------------------
1511 : !BOP
1512 : !
1513 : ! !IROUTINE: DiffG
1514 : !
1515 : ! !DESCRIPTION: Function DiffG calculates the molecular diffusivity [m2/s] in
1516 : ! air for a gas X of molecular weight XM [kg] at temperature TK [K] and
1517 : ! pressure PRESS [Pa].
1518 : !\\
1519 : !\\
1520 : ! !INTERFACE:
1521 : !
1522 0 : FUNCTION DiffG( TK, PRESS, XM ) RESULT( DIFF_G )
1523 : !
1524 : ! !INPUT PARAMETERS:
1525 : !
1526 : REAL(hp), INTENT(IN) :: TK ! Temperature [K]
1527 : REAL(hp), INTENT(IN) :: PRESS ! Pressure [hPa]
1528 : REAL(hp), INTENT(IN) :: XM ! Molecular weight of gas [kg]
1529 : !
1530 : ! !RETURN VALUE:
1531 : !
1532 : REAL(hp) :: DIFF_G ! Molecular diffusivity [m2/s]
1533 : !
1534 : ! !REMARKS:
1535 : ! We specify the molecular weight of air (XMAIR) and the hard-sphere molecular
1536 : ! radii of air (RADAIR) and of the diffusing gas (RADX). The molecular
1537 : ! radius of air is given in a Table on p. 479 of Levine [1988]. The Table
1538 : ! also gives radii for some other molecules. Rather than requesting the user
1539 : ! to supply a molecular radius we specify here a generic value of 2.E-10 m for
1540 : ! all molecules, which is good enough in terms of calculating the diffusivity
1541 : ! as long as molecule is not too big.
1542 : !
1543 : ! !REVISION HISTORY:
1544 : ! 22 Jun 2009 - R. Yantosca - Copied from "drydep_mod.f"
1545 : ! See https://github.com/geoschem/hemco for complete history
1546 : !EOP
1547 : !------------------------------------------------------------------------------
1548 : !BOC
1549 : !
1550 : ! !DEFINED PARAMETERS:
1551 : !
1552 : REAL(hp), PARAMETER :: XMAIR = 28.8e-3_hp
1553 : REAL(hp), PARAMETER :: RADAIR = 1.2e-10_hp
1554 : REAL(hp), PARAMETER :: PI = 3.14159265358979323e+0_hp
1555 : REAL(hp), PARAMETER :: RADX = 1.5e-10_hp
1556 : REAL(hp), PARAMETER :: RGAS = 8.32e+0_hp
1557 : REAL(hp), PARAMETER :: AVOGAD = 6.022140857e+23_hp
1558 : !
1559 : ! !LOCAL VARIABLES:
1560 : !
1561 : REAL(hp) :: AIRDEN, Z, DIAM, FRPATH, SPEED
1562 :
1563 : !=================================================================
1564 : ! DIFFG begins here!
1565 : !=================================================================
1566 :
1567 : ! Air density
1568 0 : AIRDEN = ( PRESS * AVOGAD ) / ( RGAS * TK )
1569 :
1570 : ! DIAM is the collision diameter for gas X with air.
1571 0 : DIAM = RADX + RADAIR
1572 :
1573 : ! Calculate the mean free path for gas X in air:
1574 : ! eq. 8.5 of Seinfeld [1986];
1575 0 : Z = XM / XMAIR
1576 0 : FRPATH = 1e+0_hp /( PI * SQRT( 1e+0_hp + Z ) * AIRDEN*( DIAM**2 ) )
1577 :
1578 : ! Calculate average speed of gas X; eq. 15.47 of Levine [1988]
1579 0 : SPEED = SQRT( 8e+0_hp * RGAS * TK / ( PI * XM ) )
1580 :
1581 : ! Calculate diffusion coefficient of gas X in air;
1582 : ! eq. 8.9 of Seinfeld [1986]
1583 0 : DIFF_G = ( 3e+0_hp * PI / 32e+0_hp ) * ( 1e+0_hp + Z ) * FRPATH * SPEED
1584 :
1585 0 : END FUNCTION DiffG
1586 : !EOC
1587 : !------------------------------------------------------------------------------
1588 : ! Harmonized Emissions Component (HEMCO) !
1589 : !------------------------------------------------------------------------------
1590 : !BOP
1591 : !
1592 : ! !IROUTINE: Get_Dep_N
1593 : !
1594 : ! !DESCRIPTION: Subroutine GET\_DEP\_N sums dry and wet deposition since prev.
1595 : ! timestep and calculates contribution to fertilizer N source. Output is in
1596 : ! kg NO/m2.
1597 : !\\
1598 : !\\
1599 : ! !INTERFACE:
1600 : !
1601 0 : SUBROUTINE Get_Dep_N( I, J, ExtState, HcoState, Inst, DEP_FERT )
1602 : !
1603 : ! !INPUT PARAMETERS:
1604 : !
1605 : INTEGER, INTENT(IN) :: I
1606 : INTEGER, INTENT(IN) :: J
1607 : TYPE(Ext_State), POINTER :: ExtState
1608 : TYPE(HCO_State), POINTER :: HcoState
1609 : TYPE(MyInst), POINTER :: Inst
1610 : !
1611 : ! !INPUT/OUTPUT PARAMETERS:
1612 : !
1613 : ! Dep emitted as Fert [kgNO/m2]
1614 : REAL(hp) , INTENT(INOUT) :: DEP_FERT
1615 : !
1616 : ! !REVISION HISTORY:
1617 : ! See https://github.com/geoschem/hemco for complete history
1618 : !EOP
1619 : !------------------------------------------------------------------------------
1620 : !BOC
1621 : !
1622 : ! !DEFINED PARAMETERS:
1623 : !
1624 : REAL(hp), PARAMETER :: TAU_MONTHS = 6.0_hp ! Decay rate of dep. N [mon]
1625 : REAL(hp), PARAMETER :: SECPERDAY = 86400.0_hp
1626 : REAL(hp), PARAMETER :: DAYSPERMONTH = 30.0_hp
1627 : !
1628 : ! !LOCAL VARIABLES:
1629 : !
1630 : REAL(hp) :: DRYN ! Dry dep. N since prev timestep
1631 : ! Units ng N/m2/s
1632 : REAL(hp) :: WETN ! Wet dep. N since prev timestep
1633 : REAL(hp) :: DEPN ! dep. N since prev timestep
1634 :
1635 : REAL(hp) :: C1
1636 : REAL(hp) :: C2
1637 : REAL(hp) :: TAU_SEC
1638 : REAL(hp) :: TS_SEC
1639 :
1640 : !Total all N species & convert molec/cm2/s --> kg NO/m2/s
1641 0 : DRYN = SOURCE_DRYN( I, J, ExtState, HcoState, Inst )
1642 :
1643 : !Total all N species & convert kg/s --> kg NO/m2/s
1644 0 : WETN = SOURCE_WETN( I, J, ExtState, HcoState )
1645 :
1646 : ! Sum wet and dry deposition [kg NO/m2/s]
1647 0 : DEPN = DRYN + WETN
1648 :
1649 : ! Emission Timestep in seconds
1650 0 : TS_SEC = HcoState%TS_EMIS
1651 :
1652 : !Do mass balance (see Intro to Atm Chem Chap. 3)
1653 : !m(t) = m(0) * exp(-t/tau) + Source * tau * (1 - exp(-t/tau))
1654 :
1655 : !convert months --> seconds (assume 30 days months)
1656 0 : TAU_SEC = TAU_MONTHS * DAYSPERMONTH * SECPERDAY
1657 :
1658 0 : C1 = EXP( -TS_SEC / TAU_SEC )
1659 0 : C2 = 1.0_hp - C1
1660 :
1661 : ! kg NO/m2
1662 : ! NOTE: DEP_RESERVOIR is stored in kg NO/m3, but we just assume
1663 : ! that this is kg NO/m2.
1664 0 : Inst%DEP_RESERVOIR(I,J) = ( Inst%DEP_RESERVOIR (I,J) * C1 ) &
1665 0 : + DEPN * TAU_SEC * C2
1666 :
1667 : ! 40% runoff.
1668 0 : DEP_FERT = Inst%DEP_RESERVOIR(I,J) * 0.6_hp
1669 :
1670 0 : END SUBROUTINE Get_Dep_N
1671 : !EOC
1672 : !------------------------------------------------------------------------------
1673 : ! Harmonized Emissions Component (HEMCO) !
1674 : !------------------------------------------------------------------------------
1675 : !BOP
1676 : !
1677 : ! !IROUTINE: Source_DryN
1678 : !
1679 : ! !DESCRIPTION: Subroutine SOURCE\_DRYN gets dry deposited Nitrogen since
1680 : ! last emission time step, converts to kg NO/m2/s.
1681 : !\\
1682 : !\\
1683 : ! !INTERFACE:
1684 : !
1685 0 : FUNCTION Source_Dryn( I, J, ExtState, HcoState, Inst ) RESULT( DRYN )
1686 : !
1687 : ! !INPUT PARAMETERS:
1688 : !
1689 : INTEGER, INTENT(IN) :: I
1690 : INTEGER, INTENT(IN) :: J
1691 : TYPE(Ext_State), POINTER :: ExtState ! Module options
1692 : TYPE(HCO_State), POINTER :: HcoState ! Output obj
1693 : TYPE(MyInst), POINTER :: Inst
1694 : !
1695 : ! !RETURN VALUE:
1696 : !
1697 : REAL(hp) :: DRYN ! Dry dep. N since prev timestep
1698 : !
1699 : ! !REVISION HISTORY:
1700 : ! See https://github.com/geoschem/hemco for complete history
1701 : !EOP
1702 : !------------------------------------------------------------------------------
1703 : !BOC
1704 : !
1705 : ! !LOCAL VARIABLES:
1706 : !
1707 : REAL(hp), PARAMETER :: CM2_PER_M2 = 1.0e+4_hp
1708 : REAL(hp) :: NTS
1709 :
1710 : ! Divide through by number of chemistry timesteps
1711 : ! because DRY_TOTN is summed over chemistry timesteps
1712 : ! need to get average
1713 :
1714 : !Molecules/cm2/s --> kg NO/m2/s
1715 0 : NTS = HcoState%TS_EMIS / HcoState%TS_CHEM
1716 0 : DRYN = ExtState%DRY_TOTN%Arr%Val(I,J) * CM2_PER_M2 / NTS / &
1717 0 : HcoState%Phys%Avgdr * HcoState%Spc(Inst%IDTNO)%MW_g / 1000.0_hp
1718 :
1719 0 : END FUNCTION Source_DryN
1720 : !EOC
1721 : !------------------------------------------------------------------------------
1722 : ! Harmonized Emissions Component (HEMCO) !
1723 : !------------------------------------------------------------------------------
1724 : !BOP
1725 : !
1726 : ! !IROUTINE: Source_WetN
1727 : !
1728 : ! !DESCRIPTION: Subroutine Source\_WetN gets wet deposited Nitrogen since
1729 : ! last emission time step, converts to kg NO/m2/s.
1730 : !\\
1731 : !\\
1732 : ! !INTERFACE:
1733 : !
1734 0 : FUNCTION Source_WetN( I, J, ExtState, HcoState ) RESULT(WETN )
1735 : !
1736 : ! !INPUT PARAMETERS:
1737 : !
1738 : INTEGER, INTENT(IN) :: I
1739 : INTEGER, INTENT(IN) :: J
1740 : TYPE(Ext_State), POINTER :: ExtState ! Module options
1741 : TYPE(HCO_State), POINTER :: HcoState ! Output obj
1742 : !
1743 : ! !RETURN VALUE:
1744 : !
1745 : REAL(hp) :: WETN ! Dry dep. N since prev timestep
1746 : !
1747 : ! !REVISION HISTORY:
1748 : ! See https://github.com/geoschem/hemco for complete history
1749 : !EOP
1750 : !------------------------------------------------------------------------------
1751 : !BOC
1752 : !
1753 : ! !LOCAL VARIABLES:
1754 : !
1755 : REAL(hp) :: NTS, AREA_M2
1756 :
1757 : ! Divide through by number of transport timesteps
1758 : ! because WET_TOTN is summed over transport timesteps
1759 : ! need to get average
1760 :
1761 0 : NTS = HcoState%TS_EMIS / HcoState%TS_DYN
1762 0 : AREA_M2 = HcoState%Grid%AREA_M2%Val(I,J)
1763 :
1764 : ! Total N wet dep
1765 0 : WETN = ExtState%WET_TOTN%Arr%Val(I,J) / AREA_M2 / NTS
1766 :
1767 0 : END FUNCTION Source_WetN
1768 : !EOC
1769 : !------------------------------------------------------------------------------
1770 : ! Harmonized Emissions Component (HEMCO) !
1771 : !------------------------------------------------------------------------------
1772 : !BOP
1773 : !
1774 : ! !IROUTINE: SoilTemp
1775 : !
1776 : ! !DESCRIPTION: Function SoilTemp computes the temperature-dependent term
1777 : ! of the soil NOx emissions in ng N/m2/s and converts to molec/cm2/s
1778 : !\\
1779 : !\\
1780 : ! !INTERFACE:
1781 : !
1782 0 : FUNCTION SoilTemp( NN, TC, GWET ) RESULT( SOIL_TEMP )
1783 : !
1784 : ! !INPUT PARAMETERS:
1785 : !
1786 : INTEGER, INTENT(IN) :: NN ! Soil biome type
1787 : REAL(hp), INTENT(IN) :: TC ! Surface air temperature [C]
1788 : REAL(hp), INTENT(IN) :: GWET ! Top soil moisture
1789 : !
1790 : ! !RETURN VALUE:
1791 : !
1792 : REAL(hp) :: SOIL_TEMP ! Temperature-dependent term of
1793 : ! soil NOx emissions [unitless]
1794 : !
1795 : ! !REMARKS:
1796 : ! Based on Ormeci et al., [1999] and Otter et al., [1999]
1797 : ! there exists and entirely exponential relationship between
1798 : ! temperature and soil NOx emissions at constant soil moisture
1799 : ! Therefore we use the following relationship based
1800 : ! on Yienger and Levy et al., [1995] for temperatures 0-30C:
1801 : !
1802 : !
1803 : ! f(T) = exp( 0.103+/-0.04 * T )
1804 : ! in ng N/m2/s
1805 : !
1806 : !
1807 : ! where T is the temperature in degrees Celsius....Below
1808 : ! 0 C, we assume emissions are zero because they are insignificant
1809 : ! for the purposes of this global source. ...
1810 : !
1811 : ! References:
1812 : ! ============================================================================
1813 : ! (1 ) Ormeci, B., S. L. Sanin, and J. J. Pierce, Laboratory study of
1814 : ! NO flux from agricultural soil: Effects of soil moisture, pH,
1815 : ! and temperature, J. Geophys. Res., 104 ,16211629, 1999.
1816 : ! (2 ) Otter, L. B., W. X. Yang, M. C. Scholes, and F. X. Meixner,
1817 : ! Nitric oxide emissions from a southern African savanna, J.
1818 : ! Geophys. Res., 105 , 20,69720,706, 1999.
1819 : ! (3 ) Yienger, J.J, and H. Levy, Empirical model of global soil-biogenic
1820 : ! NOx emissions, J. Geophys. Res., 100, D6, 11,447-11464, June 20, 1995.
1821 : !
1822 : ! !REVISION HISTORY:
1823 : ! 17 Aug 2009 - R. Yantosca - Initial Version
1824 : ! See https://github.com/geoschem/hemco for complete history
1825 : !EOP
1826 : !------------------------------------------------------------------------------
1827 : !BOC
1828 : !
1829 : ! !LOCAL VARIABLES
1830 : !
1831 : REAL(hp) :: TMMP
1832 :
1833 : !==============================================================
1834 : ! 1) Convert from Surface Temp --> Soil Temp
1835 : !==============================================================
1836 :
1837 : ! Save surface air temp in shadow variable TMMP
1838 0 : TMMP = TC
1839 :
1840 : ! DRY
1841 0 : IF ( GWET < 0.3_hp ) THEN
1842 :
1843 : ! Convert surface air temperature to model temperature
1844 : ! by adding 5 degrees C to model temperature
1845 0 : TMMP = TMMP + 5.0_hp
1846 :
1847 : ! WET
1848 : ELSE
1849 :
1850 0 : TMMP = SOILTA(NN) * TMMP + SOILTB(NN)
1851 :
1852 : ENDIF
1853 :
1854 : !==============================================================
1855 : ! 2) Compute Temperature Dependence
1856 : !==============================================================
1857 :
1858 : ! Compute the soil temperature dependence term according
1859 : ! to equations 9b, 9a of Yienger & Levy [1995].
1860 : ! We now assume that soil response is exponential 0-30C
1861 : ! based on latest observations, caps at 30C
1862 :
1863 0 : IF ( TMMP <= 0.0_hp ) THEN
1864 :
1865 : ! No soil emissions if temp below freezing
1866 : SOIL_TEMP = 0.0_hp
1867 :
1868 : ELSE
1869 :
1870 : ! Caps temperature response at 30C
1871 0 : IF ( TMMP >= 30.0_hp ) TMMP = 30.0_hp
1872 :
1873 0 : SOIL_TEMP = EXP( 0.103_hp * TMMP )
1874 :
1875 : ENDIF
1876 :
1877 0 : END FUNCTION SoilTemp
1878 : !EOC
1879 : !----------------------------------------------------------------------------
1880 : ! Harmonized Emissions Component (HEMCO) !
1881 : !------------------------------------------------------------------------------
1882 : !BOP
1883 : !
1884 : ! !IROUTINE: SoilWet
1885 : !
1886 : ! !DESCRIPTION: Function SoilWet returns the soil moisture scaling
1887 : ! of soil NOx emissions (values from 0-1).
1888 : !\\
1889 : !\\
1890 : ! !INTERFACE:
1891 : !
1892 0 : FUNCTION SoilWet( GWET, ARID, NONARID ) RESULT( WETSCALE )
1893 : !
1894 : ! !INPUT PARAMETERS:
1895 : !
1896 : ! Top soil wetness [unitless]
1897 : REAL(hp), INTENT(IN) :: GWET
1898 :
1899 : ! Fraction of arid & non-arid soil in the gridbox
1900 : REAL(hp), INTENT(IN) :: ARID
1901 : REAL(hp), INTENT(IN) :: NONARID
1902 : !
1903 : ! !RETURN_VALUE:
1904 : !
1905 : ! A scaling term between 0-1 based on soil moisture
1906 : REAL(hp) :: WETSCALE
1907 : !
1908 : ! !REMARKS:
1909 : ! Soil moisture and temperature and now decoupled, the temperature
1910 : ! term is scaled with a value from 0-1 based on water filled pore space
1911 : ! WFPS in top-soil.
1912 : !
1913 : ! From N.E. Moore thesis:
1914 : ! The response of SNOx is not monotonic to WFPS. SNOx are low for the
1915 : ! extreme values of WFPS (0 and 1). For low values, emissions are
1916 : ! substrate-limited. For high values, emissions are trapped and cannot
1917 : ! diffuse to the surface [Yan et al., 2005]. SNOx dependence on soil
1918 : ! moisture is best described as a Poisson function [Parsons et al., 1996;
1919 : ! Otter et al., 1999; Pierce and Aneja, 2000; Kirkman et al., 2001;
1920 : ! van Dijk and Meixner, 2001; van Dijk et al., 2002]:
1921 : !
1922 : ! scaling = a*x*exp(-b*x^2)
1923 : !
1924 : ! where the values of a and b are chosen such that the maximum value
1925 : ! (unity) occurs for WFPS=0.3, which laboratory and field measurements have
1926 : ! found to be the optimal value for emissions in most soils. The typical
1927 : ! range of values are 0.2 (arid) up to 0.45 (floodplain)
1928 : ! [Yang and Meixner, 1997; Ormeci et al., 1999].
1929 : !
1930 : ! Rice paddies no longer have to be scaled as in the Yienger & Levy model.
1931 : !
1932 : ! References:
1933 : ! ============================================================================
1934 : ! (1 ) Galbally, I. E., and R. Roy, Loss of fixed nitrogen from soils
1935 : ! by nitric oxide exhalation, Nature, 275 , 734735, 1978.
1936 : ! (2 ) Kirkman, G. A., W. X. Yang, and F. X. Meixner, Biogenic nitric
1937 : ! oxide emissions upscaling: An approach for Zimbabwe, Global
1938 : ! Biogeochemical Cycles, 15 ,1005 1020, 2001.
1939 : ! (3 ) Ormeci, B., S. L. Sanin, and J. J. Pierce, Laboratory study of NO
1940 : ! flux from agricultural soil: Effects of soil moisture, pH, and
1941 : ! temperature, J. Geophys. Res., 104 , 16211629, 1999.
1942 : ! (4 ) Otter, L. B., W. X. Yang, M. C. Scholes, and F. X. Meixner,
1943 : ! Nitric oxide emissions from a southern African savanna, J.
1944 : ! Geophys. Res., 105 , 20,69720,706, 1999.
1945 : ! (5 ) Parsons, D. A., M. C. Scholes, R. J. Scholes, and J. S. Levine,
1946 : ! Biogenic NO emissions from savanna soils as a function of fire
1947 : ! regime, soil type, soil nitrogen, and water status, J. Geophys.
1948 : ! Res., 101 , 23,68323,688, 1996.
1949 : ! (6 ) Pierce, J. J., and V. P. Aneja, Nitric oxide emissions from
1950 : ! engineered soil systems, Journal of Environmental Engineering,
1951 : ! pp. 225232, 2000.
1952 : ! (7 ) van Dijk, S. M., and J. H. Duyzer, Nitric oxide emissions from
1953 : ! forest soils, J. Geophys. Res., 104 , 15,95515,961, 1999.
1954 : ! (8 ) van Dijk, S. M., and F. X. Meixner, Production and consumption of
1955 : ! NO in forest and pasture soils from the Amazon basin, Water, Air,
1956 : ! and Soil Pollution: Focus 1 , pp. 119130, 2001.
1957 : ! (9 ) Yang, W. X., and F. X. Meixner, Gaseous Nitrogen Emissions from
1958 : ! Grasslands, CAB Int., Wallingford, UK, 1997, 67-71.
1959 : !
1960 : ! !REVISION HISTORY:
1961 : ! 31 Jan 2011 - R. Hudman - Rewrote scaling scheme
1962 : ! See https://github.com/geoschem/hemco for complete history
1963 : !EOP
1964 : !------------------------------------------------------------------------------
1965 : !BOC
1966 : !
1967 : !Scale by soil moisture
1968 0 : IF ( ARID >= NONARID .AND. ARID > 0.0_hp ) THEN
1969 : !Arid, max Poisson = 0.2
1970 0 : WETSCALE = 8.24_hp * GWET * EXP( -12.5_hp * GWET * GWET )
1971 : ELSE
1972 : !Non-arid, max Poisson = 0.3
1973 0 : WETSCALE = 5.5_hp * GWET * EXP( -5.55_hp * GWET * GWET )
1974 : ENDIF
1975 :
1976 0 : END FUNCTION SoilWet
1977 : !EOC
1978 : !------------------------------------------------------------------------------
1979 : ! Harmonized Emissions Component (HEMCO) !
1980 : !------------------------------------------------------------------------------
1981 : !BOP
1982 : !
1983 : ! !IROUTINE: SoilCrf
1984 : !
1985 : ! !DESCRIPTION: Computes the canopy reduction factor for the soil NOx
1986 : ! emissions according to Jacob \% Bakwin [1991] (and as used in Wang
1987 : ! et al [1998]).
1988 : !\\
1989 : !\\
1990 : ! !INTERFACE:
1991 : !
1992 0 : FUNCTION SoilCrf( K, LAI, CPYNOX, WINDSQR, SUNCOS ) RESULT( SOIL_CRF )
1993 : !
1994 : ! !INPUT PARAMETERS:
1995 : !
1996 : INTEGER, INTENT(IN) :: K ! Soil biome type
1997 : REAL(hp), INTENT(IN) :: LAI ! Leaf area index [cm2/cm2]
1998 : REAL(hp), INTENT(IN) :: CPYNOX ! Bulk sfc resistance to NOx [1/s]
1999 : REAL(hp), INTENT(IN) :: WINDSQR ! Square of sfc wind speed [m2/s2]
2000 : REAL(hp), INTENT(IN) :: SUNCOS ! Cosine of solar zenith angle
2001 : !
2002 : ! !RETURN_VALUE:
2003 : !
2004 : REAL(hp) :: SOIL_CRF ! Canopy reduction factor (see below)
2005 : !
2006 : ! !REMARKS:
2007 : ! Also note, CANOPYNOX (the bulk surface resistance to NOx) is computed
2008 : ! in routine GET_CANOPY_NOx (in "canopy_nox_mod.f") and is passed here
2009 : ! as an argument.
2010 : !
2011 : ! !REVISION HISTORY:
2012 : ! 17 Aug 2009 - R. Yantosca - Initial Version
2013 : ! See https://github.com/geoschem/hemco for complete history
2014 : !EOP
2015 : !------------------------------------------------------------------------------
2016 : !BOC
2017 : !
2018 : ! !DEFINED PARAMETERS:
2019 : !
2020 : ! Ventilation velocity for NOx, day & night values [m/s]
2021 : REAL(hp), PARAMETER :: VFDAY = 1.0e-2_hp
2022 : REAL(hp), PARAMETER :: VFNIGHT = 0.2e-2_hp
2023 : !
2024 : ! !LOCAL VARIABLES:
2025 : !
2026 : REAL(hp) :: VFNEW
2027 :
2028 : ! Pick proper ventilation velocity for day or night
2029 0 : IF ( SUNCOS > 0.0_hp ) THEN
2030 : VFNEW = VFDAY
2031 : ELSE
2032 0 : VFNEW = VFNIGHT
2033 : ENDIF
2034 :
2035 : ! If the leaf area index and the bulk surface resistance
2036 : ! of the canopy to NOx deposition are both nonzero ...
2037 0 : IF ( LAI > 0.0_hp .and. CPYNOX > 0.0_hp ) THEN
2038 :
2039 : ! Adjust the ventilation velocity.
2040 : ! NOTE: SOILEXC(21) is the canopy wind extinction
2041 : ! coefficient for the tropical rainforest biome.
2042 : VFNEW = ( VFNEW * SQRT( WINDSQR/9.0_hp * 7.0_hp/LAI ) &
2043 0 : * ( SOILEXC(21) / SOILEXC(K) ) )
2044 :
2045 : ! Soil canopy reduction factor
2046 0 : SOIL_CRF = CPYNOX / ( CPYNOX + VFNEW )
2047 :
2048 : ELSE
2049 :
2050 : ! Otherwise set the soil canopy reduction factor to zero
2051 : SOIL_CRF = 0.0_hp
2052 :
2053 : ENDIF
2054 :
2055 0 : END FUNCTION SoilCrf
2056 : !EOC
2057 : !-----------------------------------------------------------------------------
2058 : ! Harmonized Emissions Component (HEMCO) !
2059 : !------------------------------------------------------------------------------
2060 : !BOP
2061 : !
2062 : ! !IROUTINE: FertAdd
2063 : !
2064 : ! !DESCRIPTION: Function FertAdd computes fertilizer emissions
2065 : !\\
2066 : !\\
2067 : ! !INTERFACE:
2068 : !
2069 0 : FUNCTION FertAdd( SOILFRT, DEPN ) RESULT( FERT_ADD )
2070 : !
2071 : ! !INPUT PARAMETERS:
2072 : !
2073 : REAL(hp), INTENT(IN) :: DEPN ! N emissions from deposition
2074 : REAL(hp), INTENT(IN) :: SOILFRT ! N emissions from fertilizers
2075 : ! read in from disk and passed
2076 : ! here as an argument [ng N/m2/s]
2077 : !
2078 : ! !RETURN_VALUE:
2079 : !
2080 : REAL(hp) :: FERT_ADD ! Total Fert emissions
2081 : !
2082 : ! !REMARKS:
2083 : ! We use a new spatially explicit data set of chemical and manure fert
2084 : ! (native resolution 0.5\B0x0.5\B0) from Potter et al., [2010]
2085 : ! distributed using MODIS EVI seasonality as described in
2086 : ! N.E. Moore thesis, and Hudman et al., in prep.
2087 : !
2088 : ! In previous model, fertilizer emissions were emitted instantaneously as
2089 : ! 2.5% of applied fertilizer, independent of soil moisture/soil temperature,
2090 : ! so that they were constant over the growing season.
2091 : !
2092 : ! Similar to the YL parameterization, we now treat fertilizer emissions
2093 : ! as part of the Aw. If we treat the wet biome coefficient as a measure of
2094 : ! available N multiplied by a mean emission rate, we can treat fertilizer
2095 : ! N in the same manner.
2096 : !
2097 : ! AW = SOILAW(BinewsoilAWS_08112011_emissonlyome) + N available in soil
2098 : ! x mean emission rate
2099 : !
2100 : ! Instead of choosing an emission rate for each box equivalent to 2.5%
2101 : ! of applied N yearly as done in the YL scheme, we chose the mean emission
2102 : ! rate so that the total global above canopy SNOx due to fertilizer matches
2103 : ! observed estimates of fertilizer emissions of 1.8 Tg N yr-1 from Stehfest
2104 : ! and Bouman [2006]. This treatment allows for interannual and daily
2105 : ! variability in the strength of response to temperature and precipitation.
2106 : ! Note: this scaling must be set for each resolution.
2107 : !
2108 : ! References:
2109 : ! ============================================================================
2110 : ! (1 ) Potter, P., Ramankutty, N., Bennett, E., and Donner, S.:
2111 : ! Characterizing the Spatial Patterns of Global Fertilizer
2112 : ! Application and Manure Production, Earth Interactions,
2113 : ! in press, 2010.
2114 : ! (2 ) Stehfest, E. and L. Bouwman, N2O and NO emission from
2115 : ! agricultural fields and soils under natural vegetation:
2116 : ! summarizing available measurement data and modeling
2117 : ! of global annual emissions, Nutrient Cycling in Agroecosystems
2118 : ! (2006), 74:207-228 DOI 10.1007/s10705-006-9000-7.
2119 : !
2120 : ! !REVISION HISTORY:
2121 : ! 31 Jan 2011 - R. Hudman - Rewrote pulsing scheme
2122 : ! See https://github.com/geoschem/hemco for complete history
2123 : !EOP
2124 : !------------------------------------------------------------------------------
2125 : !BOC
2126 : !
2127 : ! Seconds per year
2128 : REAL(hp), PARAMETER :: SEC_PER_YEAR = 3.1536e+7_hp
2129 :
2130 :
2131 : ! Soil fert and dep [ kg/m2 ], a measure of N avail. in soil
2132 0 : FERT_ADD = ( SOILFRT + DEPN ) / SEC_PER_YEAR
2133 :
2134 : ! Convert [ng N/m2] --> [kg/m2/s]
2135 : ! (scale needed to force fert emiss of 1.8 Tg N/yr w/o canopy uptake)
2136 : ! FERT_ADD = FERT_ADD * FERT_SCALE
2137 :
2138 0 : END FUNCTION FERTADD
2139 : !EOC
2140 : !------------------------------------------------------------------------------
2141 : ! Harmonized Emissions Component (HEMCO) !
2142 : !------------------------------------------------------------------------------
2143 : !BOP
2144 : !
2145 : ! !IROUTINE: Pulsing
2146 : !
2147 : ! !DESCRIPTION: Function Pulsing calculates the increase (or "pulse") of
2148 : ! soil NOx emission that happens after preciptiation falls on dry soil.
2149 : ! .
2150 : ! According to Yan et al., [2005] , this pulsing process is thought to
2151 : ! be due to a release of inorganic nitrogen trapped on top of the dry soil
2152 : ! and a subsequent reactivation of water-stressed bacteria, which then
2153 : ! metabolize the excess nitrogen. This can happen in seasonally dry
2154 : ! grasslands and savannahs or over freshly fertilized fields.
2155 : !\\
2156 : !\\
2157 : ! !INTERFACE:
2158 : !
2159 0 : FUNCTION Pulsing( GWET, TS_EMIS, &
2160 : GWET_PREV, PFACTOR, DRYPERIOD ) &
2161 : RESULT( THE_PULSING )
2162 : !
2163 : ! !INPUT PARAMETERS:
2164 : !
2165 : REAL(hp), INTENT(IN) :: GWET ! Soil Moisture
2166 : REAL*4, INTENT(IN) :: TS_EMIS ! Emissions timestep [s]
2167 :
2168 : ! !INPUT/OUTPUT PARAMETERS:
2169 : !
2170 : REAL(sp), INTENT(INOUT) :: GWET_PREV ! Soil Moisture Prev timestep
2171 : REAL(sp), INTENT(INOUT) :: PFACTOR ! Pulsing Factor
2172 : REAL(sp), INTENT(INOUT) :: DRYPERIOD ! Dry period length in hours
2173 : !
2174 : ! !RETURN VALUE:
2175 : !
2176 : REAL(hp) :: THE_PULSING ! Factor to multiply baseline
2177 : ! emissions by to account for
2178 : ! soil pulsing of all types
2179 : !
2180 : ! !REMARKS:
2181 : ! Soil NOx emissions consist of baseline emissions plus discrete "pulsing"
2182 : ! episodes. We follow thw Yan et al., [2005] algorithm, where the pulse
2183 : ! (relative to the flux prewetting) is determined by the antecedent dry
2184 : ! period, with a simple logarithmic relationship,
2185 : !
2186 : ! PFACTOR = 13.01 ln ( DRYPERIOD ) - 53.6
2187 : !
2188 : ! where PFACTOR is the magnitude of peak flux relative to prewetting flux,
2189 : ! and DRYPERIOD is the length of the antecedent dry period in hours.
2190 : !
2191 : ! The pulse decays with
2192 : !
2193 : ! PFACTOR = PFACTOR * EXP( -0.068e+0_hp * DTSRCE )
2194 : !
2195 : ! References:
2196 : ! ============================================================================
2197 : ! (1 ) Yan, X., T. Ohara, and H. Akimoto (2005), Statistical modeling of
2198 : ! global soil NOx emissions, Global Biogeochem. Cycles, 19, GB3019,
2199 : ! doi:10.1029/2004GB002276.Section 2.3.3
2200 : !
2201 : ! !REVISION HISTORY:
2202 : ! 31 Jan 2011 - R. Hudman - Rewrote pulsing scheme
2203 : ! See https://github.com/geoschem/hemco for complete history
2204 : !EOP
2205 : !------------------------------------------------------------------------------
2206 : !BOC
2207 : !
2208 : ! !LOCAL VARIABLES:
2209 : !
2210 : REAL(hp) :: DTSRCE, GDIFF
2211 :
2212 : !=================================================================
2213 : ! PULSING begins here!
2214 : !=================================================================
2215 :
2216 : ! Emission timestep [s --> hours]
2217 0 : DTSRCE = TS_EMIS / 3600.0_hp
2218 :
2219 : ! If soil moisture less than 0.3 and no pulse is taking place
2220 0 : IF ( GWET < 0.3_hp .and. PFACTOR == 1.0_hp) THEN
2221 :
2222 : ! Get change in soil moisture since previous timestep
2223 0 : GDIFF = ( GWET - GWET_PREV )
2224 :
2225 : ! If change in soil moisture is > 0.01 (rains)
2226 0 : IF ( GDIFF > 0.01_hp ) THEN
2227 :
2228 : ! Initialize new pulse factor (dry period hours)
2229 0 : IF ( DRYPERIOD > 0.0_hp ) THEN
2230 0 : PFACTOR = 13.01_hp * LOG( DRYPERIOD ) - 53.6_hp
2231 : ELSE
2232 0 : PFACTOR = -53.6_hp
2233 : ENDIF
2234 :
2235 : ! If dry period < ~3 days then no pulse
2236 0 : IF ( PFACTOR < 1.0_hp ) PFACTOR = 1.0_hp
2237 :
2238 : ! Reinitialize dry period
2239 0 : DRYPERIOD = 0.0_hp
2240 :
2241 : ! If no rain (i.e., change in soil moisture is < 0.01)
2242 : ELSE
2243 :
2244 : ! Add one timestep to dry period
2245 0 : DRYPERIOD = DRYPERIOD + DTSRCE
2246 :
2247 : ENDIF
2248 :
2249 : ! If box is already pulsing , then decay pulse one timestep
2250 0 : ELSEIF ( PFACTOR /= 1.0_hp ) THEN
2251 :
2252 : ! Decay pulse
2253 0 : PFACTOR = PFACTOR * EXP( -0.068_hp * DTSRCE )
2254 :
2255 : ! Update dry period
2256 0 : IF ( GWET < 0.3_hp ) DRYPERIOD = DRYPERIOD + DTSRCE
2257 :
2258 : ! If end of pulse
2259 0 : IF ( PFACTOR < 1.0_hp ) PFACTOR = 1.0_hp
2260 :
2261 : ENDIF
2262 :
2263 : ! Update soil moisture holder for previous timestep
2264 0 : GWET_PREV = GWET
2265 :
2266 : ! Return the pulsing factor
2267 0 : THE_PULSING = PFACTOR
2268 :
2269 0 : END FUNCTION Pulsing
2270 : !EOC
2271 : !------------------------------------------------------------------------------
2272 : ! Harmonized Emissions Component (HEMCO) !
2273 : !------------------------------------------------------------------------------
2274 : !BOP
2275 : !
2276 : ! !IROUTINE: InstGet
2277 : !
2278 : ! !DESCRIPTION: Subroutine InstGet returns a pointer to the desired instance.
2279 : !\\
2280 : !\\
2281 : ! !INTERFACE:
2282 : !
2283 0 : SUBROUTINE InstGet ( Instance, Inst, RC, PrevInst )
2284 : !
2285 : ! !INPUT PARAMETERS:
2286 : !
2287 : INTEGER :: Instance
2288 : TYPE(MyInst), POINTER :: Inst
2289 : INTEGER :: RC
2290 : TYPE(MyInst), POINTER, OPTIONAL :: PrevInst
2291 : !
2292 : ! !REVISION HISTORY:
2293 : ! 18 Feb 2016 - C. Keller - Initial version
2294 : ! See https://github.com/geoschem/hemco for complete history
2295 : !EOP
2296 : !------------------------------------------------------------------------------
2297 : !BOC
2298 : TYPE(MyInst), POINTER :: PrvInst
2299 :
2300 : !=================================================================
2301 : ! InstGet begins here!
2302 : !=================================================================
2303 :
2304 : ! Get instance. Also archive previous instance.
2305 0 : PrvInst => NULL()
2306 0 : Inst => AllInst
2307 0 : DO WHILE ( ASSOCIATED(Inst) )
2308 0 : IF ( Inst%Instance == Instance ) EXIT
2309 0 : PrvInst => Inst
2310 0 : Inst => Inst%NextInst
2311 : END DO
2312 0 : IF ( .NOT. ASSOCIATED( Inst ) ) THEN
2313 0 : RC = HCO_FAIL
2314 0 : RETURN
2315 : ENDIF
2316 :
2317 : ! Pass output arguments
2318 0 : IF ( PRESENT(PrevInst) ) PrevInst => PrvInst
2319 :
2320 : ! Cleanup & Return
2321 0 : PrvInst => NULL()
2322 0 : RC = HCO_SUCCESS
2323 :
2324 : END SUBROUTINE InstGet
2325 : !EOC
2326 : !------------------------------------------------------------------------------
2327 : ! Harmonized Emissions Component (HEMCO) !
2328 : !------------------------------------------------------------------------------
2329 : !BOP
2330 : !
2331 : ! !IROUTINE: InstCreate
2332 : !
2333 : ! !DESCRIPTION: Subroutine InstCreate adds a new instance to the list of
2334 : ! instances, assigns a unique instance number to this new instance, and
2335 : ! archives this instance number to output argument Instance.
2336 : !\\
2337 : !\\
2338 : ! !INTERFACE:
2339 : !
2340 0 : SUBROUTINE InstCreate ( ExtNr, Instance, Inst, RC )
2341 : !
2342 : ! !INPUT PARAMETERS:
2343 : !
2344 : INTEGER, INTENT(IN) :: ExtNr
2345 : !
2346 : ! !OUTPUT PARAMETERS:
2347 : !
2348 : INTEGER, INTENT( OUT) :: Instance
2349 : TYPE(MyInst), POINTER :: Inst
2350 : !
2351 : ! !INPUT/OUTPUT PARAMETERS:
2352 : !
2353 : INTEGER, INTENT(INOUT) :: RC
2354 : !
2355 : ! !REVISION HISTORY:
2356 : ! 18 Feb 2016 - C. Keller - Initial version
2357 : ! See https://github.com/geoschem/hemco for complete history
2358 : !EOP
2359 : !------------------------------------------------------------------------------
2360 : !BOC
2361 : TYPE(MyInst), POINTER :: TmpInst
2362 : INTEGER :: nnInst
2363 :
2364 : !=================================================================
2365 : ! InstCreate begins here!
2366 : !=================================================================
2367 :
2368 : ! ----------------------------------------------------------------
2369 : ! Generic instance initialization
2370 : ! ----------------------------------------------------------------
2371 :
2372 : ! Initialize
2373 0 : Inst => NULL()
2374 :
2375 : ! Get number of already existing instances
2376 0 : TmpInst => AllInst
2377 0 : nnInst = 0
2378 0 : DO WHILE ( ASSOCIATED(TmpInst) )
2379 0 : nnInst = nnInst + 1
2380 0 : TmpInst => TmpInst%NextInst
2381 : END DO
2382 :
2383 : ! Create new instance
2384 0 : ALLOCATE(Inst)
2385 0 : Inst%Instance = nnInst + 1
2386 0 : Inst%ExtNr = ExtNr
2387 :
2388 : ! Attach to instance list
2389 0 : Inst%NextInst => AllInst
2390 0 : AllInst => Inst
2391 :
2392 : ! Update output instance
2393 0 : Instance = Inst%Instance
2394 :
2395 : ! ----------------------------------------------------------------
2396 : ! Type specific initialization statements follow below
2397 : ! ----------------------------------------------------------------
2398 :
2399 : ! Make sure pointers are not dangling
2400 0 : Inst%DRYCOEFF => NULL()
2401 0 : Inst%CLIMARID => NULL()
2402 0 : Inst%CLIMNARID => NULL()
2403 0 : Inst%SOILFERT => NULL()
2404 0 : Inst%LANDTYPE => NULL()
2405 :
2406 : ! Return w/ success
2407 0 : RC = HCO_SUCCESS
2408 :
2409 0 : END SUBROUTINE InstCreate
2410 : !EOC
2411 : !------------------------------------------------------------------------------
2412 : ! Harmonized Emissions Component (HEMCO) !
2413 : !------------------------------------------------------------------------------
2414 : !BOP
2415 : !
2416 : ! !IROUTINE: InstRemove
2417 : !
2418 : ! !DESCRIPTION: Subroutine InstRemove removes an instance from the list of
2419 : ! instances.
2420 : !\\
2421 : !\\
2422 : ! !INTERFACE:
2423 : !
2424 0 : SUBROUTINE InstRemove ( ExtState )
2425 : !
2426 : ! !INPUT PARAMETERS:
2427 : !
2428 : TYPE(Ext_State), POINTER :: ExtState ! Extension state
2429 : !
2430 : ! !REVISION HISTORY:
2431 : ! 18 Feb 2016 - C. Keller - Initial version
2432 : ! See https://github.com/geoschem/hemco for complete history
2433 : !EOP
2434 : !------------------------------------------------------------------------------
2435 : !BOC
2436 : INTEGER :: RC
2437 : INTEGER :: I
2438 : TYPE(MyInst), POINTER :: PrevInst
2439 : TYPE(MyInst), POINTER :: Inst
2440 :
2441 : !=================================================================
2442 : ! InstRemove begins here!
2443 : !=================================================================
2444 :
2445 : ! Get instance. Also archive previous instance.
2446 0 : PrevInst => NULL()
2447 0 : Inst => NULL()
2448 0 : CALL InstGet ( ExtState%SoilNOx, Inst, RC, PrevInst=PrevInst )
2449 :
2450 : ! Instance-specific deallocation
2451 0 : IF ( ASSOCIATED(Inst) ) THEN
2452 :
2453 : !---------------------------------------------------------------------
2454 : ! Deallocate fields of Inst before popping off from the list
2455 : ! in order to avoid memory leaks (Bob Yantosca (17 Aug 2022)
2456 : !---------------------------------------------------------------------
2457 0 : IF ( ALLOCATED( Inst%PFACTOR ) ) THEN
2458 0 : DEALLOCATE( Inst%PFACTOR )
2459 : ENDIF
2460 :
2461 0 : IF ( ALLOCATED( Inst%GWET_PREV ) ) THEN
2462 0 : DEALLOCATE( Inst%GWET_PREV )
2463 : ENDIF
2464 :
2465 0 : IF ( ALLOCATED( Inst%CANOPYNOX ) ) THEN
2466 0 : DEALLOCATE( Inst%CANOPYNOX )
2467 : ENDIF
2468 :
2469 0 : IF ( ALLOCATED( Inst%DEP_RESERVOIR ) ) THEN
2470 0 : DEALLOCATE( Inst%DEP_RESERVOIR )
2471 : ENDIF
2472 :
2473 0 : IF ( ALLOCATED( Inst%SpcScalVal ) ) THEN
2474 0 : DEALLOCATE( Inst%SpcScalVal )
2475 : ENDIF
2476 :
2477 0 : IF ( ALLOCATED( Inst%SpcScalFldNme ) ) THEN
2478 0 : DEALLOCATE( Inst%SpcScalFldNme )
2479 : ENDIF
2480 :
2481 0 : IF ( ASSOCIATED( Inst%FertNO_Diag ) ) THEN
2482 0 : DEALLOCATE( Inst%FertNO_Diag )
2483 : ENDIF
2484 0 : Inst%FertNO_Diag => NULL()
2485 :
2486 0 : IF ( ASSOCIATED( Inst%CLIMARID ) ) THEN
2487 0 : DEALLOCATE( Inst%CLIMARID )
2488 : ENDIF
2489 0 : Inst%CLIMARID => NULL()
2490 :
2491 0 : IF ( ASSOCIATED( Inst%CLIMNARID ) ) THEN
2492 0 : DEALLOCATE( Inst%CLIMNARID )
2493 : ENDIF
2494 0 : Inst%CLIMNARID => NULL()
2495 :
2496 0 : IF ( ASSOCIATED( Inst%SOILFERT ) ) THEN
2497 0 : DEALLOCATE( Inst%SOILFERT )
2498 : ENDIF
2499 0 : Inst%SOILFERT => NULL()
2500 :
2501 : ! Deallocate LANDTYPE vector
2502 0 : IF ( ASSOCIATED(Inst%LANDTYPE) ) THEN
2503 0 : DO I = 1,NBIOM
2504 0 : IF ( ASSOCIATED( Inst%LANDTYPE(I)%VAL ) ) THEN
2505 0 : DEALLOCATE( Inst%LANDTYPE(I)%Val )
2506 : ENDIF
2507 0 : Inst%LANDTYPE(I)%Val => NULL()
2508 : ENDDO
2509 0 : DEALLOCATE ( Inst%LANDTYPE )
2510 :
2511 : ENDIF
2512 0 : Inst%LANDTYPE => NULL()
2513 :
2514 : ! Eventually deallocate DRYCOEFF.
2515 : ! Make sure ExtState DRYCOEFF pointer is not dangling!
2516 0 : IF ( ASSOCIATED ( Inst%DRYCOEFF ) ) THEN
2517 0 : DEALLOCATE ( Inst%DRYCOEFF )
2518 0 : ExtState%DRYCOEFF => NULL()
2519 : ENDIF
2520 0 : Inst%DRYCOEFF => NULL()
2521 :
2522 : !---------------------------------------------------------------------
2523 : ! Pop off instance from list
2524 : !---------------------------------------------------------------------
2525 0 : IF ( ASSOCIATED(PrevInst) ) THEN
2526 0 : PrevInst%NextInst => Inst%NextInst
2527 : ELSE
2528 0 : AllInst => Inst%NextInst
2529 : ENDIF
2530 0 : DEALLOCATE(Inst)
2531 : ENDIF
2532 :
2533 : ! Free pointers before exiting
2534 0 : PrevInst => NULL()
2535 0 : Inst => NULL()
2536 :
2537 0 : END SUBROUTINE InstRemove
2538 : !EOC
2539 0 : END MODULE HCOX_SoilNOx_Mod
2540 : !EOM
|