Line data Source code
1 : !------------------------------------------------------------------------------
2 : ! Harmonized Emissions Component (HEMCO) !
3 : !------------------------------------------------------------------------------
4 : !BOP
5 : !
6 : ! !MODULE: hcox_lightnox_mod.F90
7 : !
8 : ! !DESCRIPTION: Module HCOX\_LightNOx\_Mod contains routines to
9 : ! compute NO lightning emissions, according to the GEOS-Chem lightning
10 : ! algorithms.
11 : !\\
12 : !\\
13 : ! This is a HEMCO extension module that uses many of the HEMCO core
14 : ! utilities. In particular, the LIS-OTD local redistribution factors are
15 : ! now read through the HEMCO framework, and the corresponding netCDF
16 : ! input file is specified in the HEMCO configuration file. The table of
17 : ! cumulative distribution functions used to vertically distribute lightning
18 : ! NOx emissions is specified in the extension switch section of the
19 : ! configuration file.
20 : !\\
21 : !\\
22 : ! References:
23 : ! \begin{itemize}
24 : ! \item Murray, L. T., Jacob, D. J., Logan, J. A., Hudman, R. C., and
25 : ! Koshak, W. J.: \emph{Optimized regional and interannual variability
26 : ! of lightning in a global chemical transport model con- strained
27 : ! by LIS/OTD satellite data}, \underline{J. Geophys. Res.},
28 : ! Atmospheres, 117, 2012.
29 : ! \item Ott, L. E., K. E. Pickering, G. L. Stenchikov, D. J. Allen,
30 : ! A. J. DeCaria, B. Ridley, R.-F. Lin, S. Lang, and W.-K. Tao,
31 : ! \emph{Production of lightning NOx and its vertical distribution
32 : ! calculated from three-dimensional cloud-scale chemical transport
33 : ! model simulations}, \underline{J. Geophys. Res.}, 115, D04301, 2010.
34 : ! \end{itemize}
35 : !
36 : ! !INTERFACE:
37 : !
38 : MODULE HCOX_LightNOx_Mod
39 : !
40 : ! !USES:
41 : !
42 : USE HCO_Error_Mod
43 : USE HCO_Diagn_Mod
44 : USE HCOX_TOOLS_MOD
45 : USE HCO_State_Mod, ONLY : HCO_State
46 : USE HCOX_State_MOD, ONLY : Ext_State
47 :
48 : IMPLICIT NONE
49 : PRIVATE
50 : !
51 : ! !PUBLIC MEMBER FUNCTIONS:
52 : !
53 : PUBLIC :: HCOX_LightNOX_Run
54 : PUBLIC :: HCOX_LightNOX_Final
55 : PUBLIC :: HCOX_LightNOX_Init
56 : !
57 : ! !PRIVATE MEMBER FUNCTIONS:
58 : !
59 : PRIVATE :: LIGHTNOX
60 : PRIVATE :: LIGHTDIST
61 : !
62 : ! !PUBLIC DATA MEMBERS:
63 : !
64 : !
65 : ! !REMARKS:
66 : ! %%% NOTE: MFLUX and PRECON methods are now deprecated (ltm, bmy, 7/9/09)
67 : ! .
68 : ! References:
69 : ! ============================================================================
70 : ! (1 ) Price & Rind (1992), JGR, vol. 97, 9919-9933.
71 : ! (2 ) Price & Rind (1994), M. Weather Rev, vol. 122, 1930-1939.
72 : ! (3 ) Allen & Pickering (2002), JGR, 107, D23, 4711, doi:10.1029/2002JD002066
73 : ! (4 ) Hudman et al (2007), JGR, 112, D12S05, doi:10.1029/2006JD007912
74 : ! (5 ) Sauvage et al, 2007, ACP,
75 : ! http://www.atmos-chem-phys.net/7/815/2007/acp-7-815-2007.pdf
76 : ! (6 ) Ott et al., (2010), JGR
77 : ! (7 ) Allen et al., (2010), JGR
78 : ! (8 ) Murray et al., (2011), in prep.
79 : !
80 : ! !REVISION HISTORY:
81 : ! 14 Apr 2004 - L. Murray, R. Hudman - Initial version
82 : ! See https://github.com/geoschem/hemco for complete history
83 : !EOP
84 : !------------------------------------------------------------------------------
85 : !BOC
86 : !
87 : ! !DEFINED PARAMETERS:
88 : !
89 : INTEGER, PARAMETER :: NLTYPE = 4
90 : INTEGER, PARAMETER :: NNLIGHT = 3200
91 : REAL*8, PARAMETER :: RFLASH_MIDLAT = 3.011d26 ! 500 mol/flash applied in the N extratropics
92 : REAL*8, PARAMETER :: RFLASH_TROPIC = 1.566d26 ! 260 mol/flash applied in the tropics / S extratropics
93 : REAL*8, PARAMETER :: EAST_WEST_DIV = -30d0
94 : REAL*8, PARAMETER :: WEST_NS_DIV = 35d0
95 : REAL*8, PARAMETER :: EAST_NS_DIV = 35d0
96 : !
97 : ! !PRIVATE TYPES:
98 : !
99 : ! Scalars
100 : TYPE :: MyInst
101 : INTEGER :: Instance
102 : INTEGER :: IDTNO ! NO tracer ID
103 : INTEGER :: ExtNr ! HEMCO Extension ID
104 : LOGICAL :: LCNVFRC ! Use convective fractions?
105 : LOGICAL :: LLFR ! Use GEOS-5 flash rates
106 :
107 : ! Arrays
108 : REAL(dp), POINTER :: PROFILE(:,:)
109 : REAL(hp), POINTER :: SLBASE(:,:,:)
110 : REAL(sp), POINTER :: FLASH_DENS_TOT(:,:)
111 : REAL(sp), POINTER :: FLASH_DENS_IC(:,:)
112 : REAL(sp), POINTER :: FLASH_DENS_CG(:,:)
113 : REAL(sp), POINTER :: CONV_DEPTH(:,:)
114 :
115 : ! Overall scale factor to be applied to lightning NOx emissions. Must
116 : ! be defined in the HEMCO configuration file as extension attribute
117 : ! 'Scaling_NO'.
118 : ! SpcScalFldNme is the name of the gridded scale factor. Must be provided
119 : ! in the HEMCO configuration file as extension attribute 'ScaleField_NO'.
120 : REAL(sp), ALLOCATABLE :: SpcScalVal(:)
121 : CHARACTER(LEN=61), ALLOCATABLE :: SpcScalFldNme(:)
122 :
123 : TYPE(MyInst), POINTER :: NextInst => NULL()
124 : END TYPE MyInst
125 :
126 : ! Pointer to all instances
127 : TYPE(MyInst), POINTER :: AllInst => NULL()
128 :
129 : CONTAINS
130 : !EOC
131 : !------------------------------------------------------------------------------
132 : ! Harmonized Emissions Component (HEMCO) !
133 : !------------------------------------------------------------------------------
134 : !BOP
135 : !
136 : ! !IROUTINE: HCOX_LightNOx_Run
137 : !
138 : ! !DESCRIPTION: Subroutine HCOX\_LIGHTNOX\_RUN is the driver routine
139 : ! to calculate lightning NOx emissions and return them to the HEMCO
140 : ! driver routine.
141 : !\\
142 : !\\
143 : ! !INTERFACE:
144 : !
145 0 : SUBROUTINE HCOX_LightNOx_Run( ExtState, HcoState, RC )
146 : !
147 : ! !USES:
148 : !
149 : USE HCO_FluxArr_Mod, ONLY : HCO_EmisAdd
150 : !
151 : ! !INPUT PARAMETERS:
152 : !
153 : TYPE(Ext_State), POINTER :: ExtState ! Module options
154 : TYPE(HCO_State), POINTER :: HcoState ! HEMCO options
155 : !
156 : ! !INPUT/OUTPUT PARAMETERS:
157 : !
158 : INTEGER, INTENT(INOUT) :: RC
159 : !
160 : ! !REVISION HISTORY:
161 : ! 09 Oct 1997 - R. Yantosca - Initial version
162 : ! See https://github.com/geoschem/hemco for complete history
163 : !EOP
164 : !------------------------------------------------------------------------------
165 : !BOC
166 : !
167 : ! !LOCAL VARIABLES:
168 : !
169 : TYPE(MyInst), POINTER :: Inst
170 : INTEGER :: Yr, Mt
171 : LOGICAL :: FOUND
172 : CHARACTER(LEN=255) :: MSG, LOC
173 :
174 : !=================================================================
175 : ! HCOX_LIGHTNOX_RUN begins here!
176 : !=================================================================
177 0 : LOC = 'HCOX_LIGHTNOX_RUN (HCOX_LIGHTNOX_MOD.F90)'
178 :
179 : ! Enter
180 0 : CALL HCO_ENTER( HcoState%Config%Err, LOC, RC )
181 0 : IF ( RC /= HCO_SUCCESS ) THEN
182 0 : CALL HCO_ERROR( 'ERROR 0', RC, THISLOC=LOC )
183 0 : RETURN
184 : ENDIF
185 :
186 : ! Return if extension disabled
187 0 : IF ( ExtState%LightNOx <= 0 ) THEN
188 0 : CALL HCO_LEAVE( HcoState%Config%Err,RC )
189 0 : RETURN
190 : ENDIF
191 :
192 : ! Get pointer to this instance. Varible Inst contains all module
193 : ! variables for the current instance. The instance number is
194 : ! ExtState%<yourname>.
195 0 : Inst => NULL()
196 0 : CALL InstGet ( ExtState%LightNOx, Inst, RC )
197 0 : IF ( RC /= HCO_SUCCESS ) THEN
198 0 : WRITE(MSG,*) 'Cannot find lightning NOx instance Nr. ', ExtState%LightNOx
199 0 : CALL HCO_ERROR(MSG,RC)
200 0 : RETURN
201 : ENDIF
202 :
203 : ! Update lightnox NOx emissions (fill SLBASE)
204 0 : CALL LIGHTNOX( HcoState, ExtState, Inst, RC )
205 0 : IF ( RC /= HCO_SUCCESS ) THEN
206 0 : CALL HCO_ERROR( 'ERROR 1', RC, THISLOC=LOC )
207 0 : RETURN
208 : ENDIF
209 :
210 : !=================================================================
211 : ! Pass to HEMCO State and update diagnostics
212 : !=================================================================
213 0 : IF ( Inst%IDTNO > 0 ) THEN
214 :
215 : ! Add flux to emission array
216 : CALL HCO_EmisAdd( HcoState, Inst%SLBASE, Inst%IDTNO, &
217 0 : RC, ExtNr=Inst%ExtNr)
218 0 : IF ( RC /= HCO_SUCCESS ) THEN
219 0 : CALL HCO_ERROR( 'HCO_EmisAdd error: SLBASE', RC )
220 0 : RETURN
221 : ENDIF
222 :
223 : ENDIF
224 :
225 : ! Return w/ success
226 0 : Inst => NULL()
227 0 : CALL HCO_LEAVE( HcoState%Config%Err,RC )
228 :
229 : END SUBROUTINE HCOX_LightNOx_Run
230 : !EOC
231 : !------------------------------------------------------------------------------
232 : ! Harmonized Emissions Component (HEMCO) !
233 : !------------------------------------------------------------------------------
234 : !BOP
235 : !
236 : ! !IROUTINE: LightNOx
237 : !
238 : ! !DESCRIPTION: Subroutine LIGHTNOX uses Price \& Rind's formulation for
239 : ! computing NOx emission from lightning (with various updates).
240 : !\\
241 : !\\
242 : ! !INTERFACE:
243 : !
244 0 : SUBROUTINE LightNOx( HcoState, ExtState, Inst, RC )
245 : !
246 : ! !USES:
247 : !
248 : USE HCO_Calc_Mod, ONLY : HCO_EvalFld
249 : USE HCO_EmisList_Mod, ONLY : HCO_GetPtr
250 : USE HCO_GeoTools_Mod, ONLY : HCO_LANDTYPE
251 : USE HCO_Clock_Mod, ONLY : HcoClock_Get
252 : USE HCO_Clock_Mod, ONLY : HcoClock_First
253 : USE HCO_ExtList_Mod, ONLY : GetExtOpt
254 : !
255 : ! !INPUT PARAMETERS:
256 : !
257 : TYPE(HCO_State), POINTER :: HcoState ! Output obj
258 : TYPE(Ext_State), POINTER :: ExtState ! Module options
259 : TYPE(MyInst ), POINTER :: Inst
260 : !
261 : ! !INPUT/OUTPUT PARAMETERS:
262 : !
263 : INTEGER, INTENT(INOUT) :: RC
264 : !
265 : ! !REMARKS:
266 : !
267 : ! !REVISION HISTORY:
268 : ! 10 May 2006 - L. Murray - Initial version
269 : ! See https://github.com/geoschem/hemco for complete history
270 : !EOP
271 : !------------------------------------------------------------------------------
272 : !BOC
273 : !
274 : ! !LOCAL VARIABLES:
275 : !
276 : INTEGER :: I, J, L
277 : INTEGER :: LTOP
278 : INTEGER :: MONTH
279 : INTEGER :: MTYPE
280 : REAL*8 :: A_M2
281 : REAL*8 :: A_KM2
282 : REAL*8 :: H0
283 : REAL*8 :: IC_CG_RATIO
284 : REAL*8 :: RATE
285 : REAL*8 :: RATE_SAVE
286 : REAL*8 :: TOTAL
287 : REAL*8 :: TOTAL_CG
288 : REAL*8 :: TOTAL_IC
289 : REAL*8 :: X
290 : REAL*8 :: YMID
291 : REAL*8 :: XMID
292 0 : REAL*8 :: VERTPROF(HcoState%NZ)
293 : INTEGER :: LMAX
294 : INTEGER :: LNDTYPE
295 : INTEGER :: SFCTYPE
296 : REAL(hp) :: TROPP
297 : REAL(dp) :: TmpScale
298 : CHARACTER(LEN=255) :: LOC
299 :
300 : !=================================================================
301 : ! LIGHTNOX begins here!
302 : !=================================================================
303 0 : LOC = 'LIGHTNOX (HCOX_LIGHTNOX_MOD.F90)'
304 :
305 : ! Enter
306 0 : CALL HCO_ENTER( HcoState%Config%Err, LOC, RC )
307 0 : IF ( RC /= HCO_SUCCESS ) THEN
308 0 : CALL HCO_ERROR( 'ERROR 2', RC, THISLOC=LOC )
309 0 : RETURN
310 : ENDIF
311 :
312 : ! Reset arrays
313 0 : Inst%SLBASE = 0.0_hp
314 0 : Inst%FLASH_DENS_TOT = 0.0_sp
315 : !Inst%FLASH_DENS_IC = 0.0_sp
316 : !Inst%FLASH_DENS_CG = 0.0_sp
317 0 : Inst%CONV_DEPTH = 0.0_sp
318 :
319 : ! LMAX: the highest L-level to look for lightning NOx (usually LLPAR-1)
320 0 : LMAX = HcoState%NZ - 1
321 :
322 : ! Get current month (to be passed to LIGHTDIST)
323 0 : CALL HcoClock_Get( HcoState%Clock, cMM=MONTH, RC=RC)
324 0 : IF ( RC /= HCO_SUCCESS ) THEN
325 0 : CALL HCO_ERROR( 'ERROR 3', RC, THISLOC=LOC )
326 0 : RETURN
327 : ENDIF
328 :
329 : !=================================================================
330 : ! Compute lightning NOx emissions for each (I,J) column
331 : !=================================================================
332 :
333 : !$OMP PARALLEL DO &
334 : !$OMP DEFAULT( SHARED ) &
335 : !$OMP PRIVATE( I, J, L, A_M2, A_KM2 ) &
336 : !$OMP PRIVATE( YMID, XMID, LTOP, MTYPE ) &
337 : !$OMP PRIVATE( LNDTYPE, SFCTYPE, TROPP ) &
338 : !$OMP PRIVATE( RATE, RATE_SAVE, H0, IC_CG_RATIO ) &
339 : !$OMP PRIVATE( TOTAL, TOTAL_IC, TOTAL_CG, VERTPROF, X ) &
340 : !$OMP SCHEDULE( DYNAMIC )
341 :
342 : ! Loop over surface boxes
343 0 : DO J = 1, HcoState%NY
344 0 : DO I = 1, HcoState%NX
345 :
346 : ! Grid box surface areas in [m2] and [km2]
347 0 : A_M2 = HcoState%Grid%AREA_M2%Val( I, J )
348 0 : A_KM2 = A_M2 / 1d6
349 :
350 : ! Grid box latitude and longitude [degrees]
351 0 : YMID = HcoState%Grid%YMID%Val( I, J )
352 0 : XMID = HcoState%Grid%XMID%Val( I, J )
353 :
354 : ! Make sure xmid is between -180 and +180
355 0 : IF ( XMID >= 180.0d0 ) XMID = XMID - 360.0d0
356 :
357 : ! Get surface type. Note that these types are different than
358 : ! the types used elsewhere in this module. HCO_LANDTYPE returns
359 : ! 0=ocean, 1=land, 2=ice; elsewhere we use 0=land, 1=ocean, 2=ice!
360 0 : LNDTYPE = HCO_LANDTYPE( ExtState%FRLAND%Arr%Val(I,J), &
361 0 : ExtState%FRLANDIC%Arr%Val(I,J), &
362 0 : ExtState%FROCEAN%Arr%Val(I,J), &
363 0 : ExtState%FRSEAICE%Arr%Val(I,J), &
364 0 : ExtState%FRLAKE%Arr%Val(I,J))
365 :
366 : ! Set surface type (0=land, 1=ocean, 2=ice) based on land type
367 0 : IF ( LNDTYPE == 2 ) THEN
368 0 : SFCTYPE = 2 ! Ice
369 0 : ELSEIF ( LNDTYPE == 1 ) THEN
370 0 : SFCTYPE = 0 ! Land
371 : ELSE
372 0 : SFCTYPE = 1 ! Ocean (default)
373 : ENDIF
374 :
375 : ! Tropopause pressure. Convert to Pa
376 0 : TROPP = ExtState%TROPP%Arr%Val(I,J) !* 100.0_hp
377 :
378 : !===========================================================
379 : ! Initialize
380 : !===========================================================
381 0 : RATE = 0.0
382 0 : RATE_SAVE = 0.0
383 0 : H0 = 0.0
384 0 : IC_CG_RATIO = 1.0
385 :
386 0 : TOTAL = 0d0
387 0 : TOTAL_IC = 0d0
388 0 : TOTAL_CG = 0d0
389 :
390 : !===========================================================
391 : ! (1) Get flash density [#/km2/s] from meteorology
392 : !===========================================================
393 :
394 : !-----------------------------------------------------------
395 : ! (1a) Prescribed in HEMCO_Config.rc
396 : !-----------------------------------------------------------
397 0 : RATE = ExtState%FLASH_DENS%Arr%Val(I,J)
398 :
399 : !-----------------------------------------------------------
400 : ! (1b) From GEOS-5
401 : !-----------------------------------------------------------
402 : IF ( Inst%LLFR &
403 : .AND. ASSOCIATED( ExtState%LFR%Arr%Val ) &
404 0 : .AND. ASSOCIATED( ExtState%BYNCY%Arr%Val ) ) THEN
405 0 : RATE = ExtState%LFR%Arr%Val(I,J)
406 : ENDIF
407 :
408 : ! Error check: do not continue if flash rate is zero
409 0 : IF ( RATE <= 0.0 ) CYCLE
410 :
411 : !===========================================================
412 : ! (2) Get depth of convection [m] and find associated LTOP
413 : !===========================================================
414 :
415 : !-----------------------------------------------------------
416 : ! (2a) Prescribed in HEMCO_Config.rc
417 : !-----------------------------------------------------------
418 0 : H0 = ExtState%CONV_DEPTH%Arr%Val(I,J)
419 0 : LTOP = 1
420 0 : DO L = 1, HcoState%NZ
421 0 : IF ( SUM(HcoState%Grid%BXHEIGHT_M%Val(I,J,1:L)) > H0 ) THEN
422 0 : LTOP = L
423 0 : EXIT
424 : ENDIF
425 : ENDDO
426 : ! Reset H0 to be the height of that layer in the model,
427 : ! to avoid negative values in the partitioning
428 0 : H0 = SUM(HcoState%Grid%BXHEIGHT_M%Val(I,J,1:LTOP))
429 :
430 : !-----------------------------------------------------------
431 : ! (2b) From GEOS-5
432 : !-----------------------------------------------------------
433 : IF ( Inst%LLFR &
434 : .AND. ASSOCIATED( ExtState%LFR%Arr%Val ) &
435 0 : .AND. ASSOCIATED( ExtState%BYNCY%Arr%Val ) ) THEN
436 :
437 : ! Set LTOP to top of buoyancy
438 0 : DO L = HcoState%NZ, 1, -1
439 0 : IF ( ExtState%BYNCY%Arr%Val(I,J,L) >= 0.0_sp ) THEN
440 0 : LTOP = L + 1
441 0 : EXIT
442 : ENDIF
443 : ENDDO
444 : !LTOP = MAX( LTOP, LMAX )
445 : ! H0 is the convective cloud top height [m]. This is the
446 : ! distance from the surface to the top edge of box (I,J,LTOP).
447 0 : H0 = SUM(HcoState%Grid%BXHEIGHT_M%Val(I,J,1:LTOP))
448 : ENDIF
449 :
450 : ! Save out convective cloud depth
451 0 : Inst%CONV_DEPTH(I,J) = LTOP
452 :
453 : !===========================================================
454 : ! (3) Compute ratio of CG vs total flashes
455 : !===========================================================
456 :
457 : ! Ratio of cloud-to-ground flashes to total # of flashes
458 0 : X = 1d0 / ( 1d0 + IC_CG_RATIO )
459 :
460 : !-----------------------------------------------------------
461 : ! Store flash rates [flashes/km2/min]
462 : !-----------------------------------------------------------
463 0 : IF ( RATE > 0d0 ) THEN
464 :
465 : ! Flashes per km2 per minute
466 0 : RATE_SAVE = RATE / 60d0
467 :
468 : ! Store total, IC, and CG flash rates
469 0 : Inst%FLASH_DENS_TOT(I,J) = RATE_SAVE
470 : !Inst%FLASH_DENS_IC(I,J) = RATE_SAVE * X
471 : !Inst%FLASH_DENS_CG(I,J) = RATE_SAVE * ( 1d0 - X )
472 :
473 : ENDIF
474 :
475 : !===========================================================
476 : ! (4) Compute LNOx yield for IC and CG flashes (molec/km2/s)
477 : !===========================================================
478 :
479 : ! Compute LNOx emissions for tropics or midlats
480 0 : IF ( XMID > EAST_WEST_DIV ) THEN
481 :
482 : !--------------------------------------------------------
483 : ! (4a) We are in EURASIA
484 : !--------------------------------------------------------
485 0 : IF ( YMID > EAST_NS_DIV ) THEN
486 :
487 : ! Eurasian Mid-Latitudes
488 0 : TOTAL_IC = RFLASH_MIDLAT * RATE * ( 1d0 - X )
489 0 : TOTAL_CG = RFLASH_MIDLAT * RATE * X
490 :
491 : ELSE
492 :
493 : ! Eurasian Tropics
494 0 : TOTAL_IC = RFLASH_TROPIC * RATE * ( 1d0 - X )
495 0 : TOTAL_CG = RFLASH_TROPIC * RATE * X
496 :
497 : ENDIF
498 :
499 : ELSE
500 :
501 : !--------------------------------------------------------
502 : ! (4b) We are in the AMERICAS
503 : !--------------------------------------------------------
504 0 : IF ( YMID > WEST_NS_DIV ) THEN
505 :
506 : ! American Mid-Latitudes
507 0 : TOTAL_IC = RFLASH_MIDLAT * RATE * ( 1d0 - X )
508 0 : TOTAL_CG = RFLASH_MIDLAT * RATE * X
509 :
510 : ELSE
511 :
512 : ! American Tropics
513 0 : TOTAL_IC = RFLASH_TROPIC * RATE * ( 1d0 - X )
514 0 : TOTAL_CG = RFLASH_TROPIC * RATE * X
515 :
516 : ENDIF
517 : ENDIF
518 :
519 : !===========================================================
520 : ! (5) Compute column total lightning NOx yield (kg/km2/s)
521 : !===========================================================
522 :
523 : ! Sum of IC + CG
524 0 : TOTAL = TOTAL_IC + TOTAL_CG
525 :
526 : ! Convert from molec km-2 s-1 to kg(NO) m-2 s-1
527 0 : TOTAL = TOTAL * ( HcoState%Spc(Inst%IDTNO)%MW_g / 1000.0_hp ) / &
528 0 : HcoState%Phys%Avgdr / 1000000.0_hp
529 :
530 : !===========================================================
531 : ! (6) Distribute column LNOx vertically from surface to LTOP
532 : !===========================================================
533 :
534 : !-----------------------------------------------------------
535 : ! LIGHTDIST computes the lightning NOx distribution from
536 : ! the ground to the convective cloud top using cumulative
537 : ! distribution functions for ocean flashes, tropical land
538 : ! flashes, and non-tropical land flashes, as specified by
539 : ! Lesley Ott [JGR, 2010]
540 : !-----------------------------------------------------------
541 :
542 : ! If there's lightning NOx w/in the column ...
543 0 : IF ( TOTAL > 0d0 ) THEN
544 :
545 : ! Partition the column total NOx [kg/m2/s] from lightning
546 : ! into the vertical using Ott et al. [2010] PDF functions
547 : CALL LIGHTDIST( I, J, LTOP, H0, YMID, TOTAL, VERTPROF, &
548 0 : ExtState, HcoState, SFCTYPE, MONTH, MTYPE, Inst )
549 :
550 : ! Add vertically partitioned NOx into SLBASE array
551 0 : DO L = 1, HcoState%NZ
552 0 : Inst%SLBASE(I,J,L) = VERTPROF(L)
553 :
554 : ! No lightning NOx emissions in the stratosphere (cdh, 4/25/2013)
555 0 : IF ( HcoState%Grid%PEDGE%Val(I,J,L) < TROPP ) THEN
556 0 : Inst%SLBASE(I,J,L) = 0.0_hp
557 : ENDIF
558 :
559 : ENDDO
560 : ENDIF
561 :
562 : ENDDO
563 : ENDDO
564 : !$OMP END PARALLEL DO
565 :
566 : !-----------------------------------------------------------------
567 : ! Eventually add scale factors
568 : !-----------------------------------------------------------------
569 :
570 : ! Eventually apply species specific scale factor
571 0 : IF ( Inst%SpcScalVal(1) /= 1.0_sp ) THEN
572 0 : Inst%SLBASE = Inst%SLBASE * Inst%SpcScalVal(1)
573 : ENDIF
574 :
575 : ! Eventually apply spatiotemporal scale factors
576 0 : CALL HCOX_SCALE( HcoState, Inst%SLBASE, TRIM(Inst%SpcScalFldNme(1)), RC )
577 0 : IF ( RC /= HCO_SUCCESS ) THEN
578 0 : CALL HCO_ERROR( 'ERROR 4', RC, THISLOC=LOC )
579 0 : RETURN
580 : ENDIF
581 :
582 : ! Return w/ success
583 0 : CALL HCO_LEAVE( HcoState%Config%Err,RC )
584 :
585 : END SUBROUTINE LightNOx
586 : !EOC
587 : !------------------------------------------------------------------------------
588 : ! Harmonized Emissions Component (HEMCO) !
589 : !------------------------------------------------------------------------------
590 : !BOP
591 : !
592 : ! !IROUTINE: LightDist
593 : !
594 : ! !DESCRIPTION: Subroutine LightDist reads in the CDF used to partition the
595 : ! column lightning NOx into the GEOS-Chem vertical layers.
596 : !\\
597 : !\\
598 : ! !INTERFACE:
599 : !
600 0 : SUBROUTINE LightDist( I, J, LTOP, H0, XLAT, TOTAL, VERTPROF, &
601 : ExtState, HcoState, SFCTYPE, MONTH, MTYPE, Inst )
602 : !
603 : ! !INPUT PARAMETERS:
604 : !
605 : INTEGER, INTENT(IN) :: I ! Longitude index
606 : INTEGER, INTENT(IN) :: J ! Latitude index
607 : INTEGER, INTENT(IN) :: LTOP ! Level of conv cloud top
608 : REAL*8, INTENT(IN) :: H0 ! Conv cloud top height [m]
609 : REAL*8, INTENT(IN) :: XLAT ! Latitude value [degrees]
610 : REAL*8, INTENT(IN) :: TOTAL ! Column Total # of LNOx molec
611 : TYPE(Ext_State), POINTER :: ExtState ! Module options
612 : TYPE(HCO_State), POINTER :: HcoState ! Hemco state object
613 : INTEGER, INTENT(IN) :: SFCTYPE ! Surface type
614 : INTEGER, INTENT(IN) :: MONTH ! Current month
615 : TYPE(MyInst), POINTER :: Inst ! Hemco state object
616 : !
617 : ! !OUTPUT PARAMETERS:
618 : !
619 : REAL*8, INTENT(OUT) :: VERTPROF(HcoState%NZ) ! Vertical profile
620 : INTEGER, INTENT(OUT) :: MTYPE ! lightning type
621 : !
622 : ! !REMARKS:
623 : ! References:
624 : ! ============================================================================
625 : ! (1 ) Pickering et al., JGR 103, 31,203 - 31,316, 1998.
626 : ! (2 ) Ott et al., JGR, 2010
627 : ! (3 ) Allen et al., JGR, 2010
628 : !
629 : ! !REVISION HISTORY:
630 : ! 18 Sep 2002 - M. Evans - Initial version (based on Yuhang Wang's code)
631 : ! See https://github.com/geoschem/hemco for complete history
632 : !EOP
633 : !------------------------------------------------------------------------------
634 : !BOC
635 : !
636 : ! !LOCAL VARIABLES:
637 : !
638 : INTEGER :: L
639 : REAL*8 :: ZHEIGHT, YMID
640 0 : REAL*8 :: FRAC(HcoState%NZ)
641 :
642 : !=================================================================
643 : ! LIGHTDIST begins here!
644 : !=================================================================
645 :
646 : ! Initialize
647 0 : MTYPE = 0
648 0 : VERTPROF = 0d0
649 :
650 : !%%% NOTE: Use L=1 for GRID_MOD functions. This is OK for the
651 : !%%% existing GEOS-Chem with a pure cartesian grid, but may be an
652 : !%%% issue when interfaced with a GCM with a non-regular grid
653 : !%%% (bmy, 3/1/12)
654 0 : YMID = HcoState%Grid%YMID%Val( I, J )
655 :
656 : !=================================================================
657 : ! Test whether location (I,J) is continental, marine, or snow/ice
658 : !
659 : ! Depending on the combination of land/water and latitude,
660 : ! assign a flag describing the type of lightning:
661 : !
662 : ! MTYPE = 1: ocean lightning
663 : ! MTYPE = 2: tropical continental lightning
664 : ! MTYPE = 3: midlatitude continental lightning
665 : ! MTYPE = 4: subtropical lightning
666 : !
667 : ! (ltm, bmy, 1/25/11)
668 : !=================================================================
669 :
670 : ! Assign profile kind to grid box, following Allen et al.
671 : ! [JGR, 2010] (ltm, 1/25,11)
672 :
673 0 : SELECT CASE ( MONTH )
674 :
675 : ! Southern Hemisphere Summer
676 : CASE ( 1,2,3,12 )
677 :
678 0 : IF ( ABS(YMID) .le. 15 ) THEN
679 0 : IF ( SFCTYPE == 0 ) THEN
680 0 : MTYPE = 2 ! Tropical continental
681 : ELSE
682 0 : MTYPE = 1 ! Tropical marine
683 : ENDIF
684 0 : ELSE IF ( ( YMID .gt. 15. ) .and. ( YMID .le. 30. ) ) THEN
685 0 : MTYPE = 4 ! N. Subtropics
686 0 : ELSE IF ( ( YMID .ge. -40. ) .and. ( YMID .lt. -15. ) ) THEN
687 0 : MTYPE = 4 ! S. Subtropics
688 : ELSE
689 0 : MTYPE = 3 ! Midlatitude
690 : ENDIF
691 :
692 : ! Equinox months
693 : CASE ( 4,5,10,11 )
694 :
695 0 : IF ( ABS(YMID) .le. 15 ) THEN
696 0 : IF ( SFCTYPE == 0 ) THEN
697 0 : MTYPE = 2 ! Tropical continental
698 : ELSE
699 0 : MTYPE = 1 ! Tropical marine
700 : ENDIF
701 0 : ELSE IF ( ABS(YMID) .le. 30 ) THEN
702 0 : MTYPE = 4 ! Subtropics
703 : ELSE
704 0 : MTYPE = 3 ! Midlatitude
705 : ENDIF
706 :
707 : ! Northern Hemisphere Summer
708 : CASE ( 6,7,8,9 )
709 :
710 0 : IF ( ABS(YMID) .le. 15 ) THEN
711 0 : IF ( SFCTYPE == 0 ) THEN
712 0 : MTYPE = 2 ! Tropical continental
713 : ELSE
714 0 : MTYPE = 1 ! Tropical marine
715 : ENDIF
716 0 : ELSE IF ( ( YMID .gt. 15. ) .and. ( YMID .le. 40. ) ) THEN
717 0 : MTYPE = 4 ! N. Subtropics
718 0 : ELSE IF ( ( YMID .ge. -30. ) .and. ( YMID .lt. -15. ) ) THEN
719 0 : MTYPE = 4 ! S. Subtropics
720 : ELSE
721 0 : MTYPE = 3 ! Midlatitude
722 : ENDIF
723 :
724 : END SELECT
725 :
726 : ! Extra safety check for pathological grid boxes (bmy, 11/29/06)
727 0 : IF ( MTYPE == 0 ) RETURN
728 :
729 : !=================================================================
730 : ! Use the CDF for this type of lightning to partition the total
731 : ! column lightning NOx into the layers
732 : !=================================================================
733 0 : ZHEIGHT = 0.0
734 :
735 : ! Compute the height [km] at the top of each vertical level.
736 : ! Look up the cumulative fraction of NOx for each vertical level
737 0 : DO L = 1, LTOP
738 0 : ZHEIGHT = ZHEIGHT + HcoState%Grid%BXHEIGHT_M%Val(I,J,L)
739 0 : FRAC(L) = Inst%PROFILE( NINT( ( ZHEIGHT/H0 )*3200. ), MTYPE ) *0.01
740 : ENDDO
741 :
742 : ! Convert from cumulative fraction to fraction for each level
743 0 : DO L = LTOP, 2, - 1
744 0 : FRAC(L) = FRAC(L) - FRAC(L-1)
745 : ENDDO
746 :
747 : ! Partition lightning NOx by layer into VERTPROF
748 0 : DO L = 1, LTOP
749 0 : VERTPROF(L) = ( FRAC(L) * TOTAL )
750 : ENDDO
751 :
752 0 : END SUBROUTINE LightDist
753 : !EOC
754 : !------------------------------------------------------------------------------
755 : ! Harmonized Emissions Component (HEMCO) !
756 : !------------------------------------------------------------------------------
757 : !BOP
758 : !
759 : ! !IROUTINE: HCOX_LightNOx_Init
760 : !
761 : ! !DESCRIPTION: Subroutine HCOX\_LIGHTNOX\_INIT allocates all module arrays.
762 : ! It also reads the lightning CDF data from disk before the first lightning
763 : ! timestep.
764 : !\\
765 : !\\
766 : ! !INTERFACE:
767 : !
768 0 : SUBROUTINE HCOX_LightNOx_Init( HcoState, ExtName, ExtState, RC )
769 : !
770 : ! !USES:
771 : !
772 : USE HCO_Chartools_Mod, ONLY : HCO_CharParse
773 : USE HCO_ExtList_Mod, ONLY : GetExtNr
774 : USE HCO_ExtList_Mod, ONLY : GetExtOpt
775 : USE HCO_ExtList_Mod, ONLY : GetExtSpcVal
776 : USE HCO_State_Mod, ONLY : HCO_GetHcoID
777 : USE HCO_State_Mod, ONLY : HCO_GetExtHcoID
778 : USE HCO_ReadList_Mod, ONLY : ReadList_Remove
779 : USE HCO_inquireMod, ONLY : findfreeLUN
780 : !
781 : ! !INPUT PARAMETERS:
782 : !
783 : TYPE(HCO_State), POINTER :: HcoState ! Hemco options
784 : CHARACTER(LEN=*), INTENT(IN ) :: ExtName ! Extension name
785 : TYPE(Ext_State), POINTER :: ExtState ! Module options
786 : !
787 : ! !OUTPUT PARAMETERS:
788 : !
789 : INTEGER, INTENT( OUT) :: RC
790 : !
791 : ! !REVISION HISTORY:
792 : ! 14 Apr 2004 - R. Yantosca - Initial version
793 : ! See https://github.com/geoschem/hemco for complete history
794 : !EOP
795 : !------------------------------------------------------------------------------
796 : !BOC
797 : !
798 : ! !LOCAL VARIABLES:
799 : !
800 : INTEGER :: AS, III, IOS, JJJ, IU_FILE, nSpc
801 : INTEGER :: ExtNr
802 : LOGICAL :: FOUND, FileExists
803 0 : INTEGER, ALLOCATABLE :: HcoIDs(:)
804 0 : CHARACTER(LEN=31), ALLOCATABLE :: SpcNames(:)
805 : CHARACTER(LEN=255) :: MSG, LOC, FILENAME, FileMsg
806 : TYPE(MyInst), POINTER :: Inst
807 :
808 : !=======================================================================
809 : ! HCOX_LightNOX_Init begins here!
810 : !=======================================================================
811 0 : LOC = 'HCOX_LightNOX_Init (HCOX_LIGHTNOX_MOD.F90)'
812 :
813 : ! Extension Nr.
814 0 : ExtNr = GetExtNr( HcoState%Config%ExtList, TRIM(ExtName) )
815 0 : IF ( ExtNr <= 0 ) RETURN
816 :
817 : ! Enter
818 0 : CALL HCO_ENTER( HcoState%Config%Err, LOC, RC )
819 0 : IF ( RC /= HCO_SUCCESS ) THEN
820 0 : CALL HCO_ERROR( 'ERROR 5', RC, THISLOC=LOC )
821 0 : RETURN
822 : ENDIF
823 :
824 : ! Create LightNOx instance for this simulation
825 0 : Inst => NULL()
826 0 : CALL InstCreate ( ExtNr, ExtState%LightNOx, Inst, RC )
827 0 : IF ( RC /= HCO_SUCCESS ) THEN
828 0 : CALL HCO_ERROR ( 'Cannot create LightNOx instance', RC )
829 0 : RETURN
830 : ENDIF
831 :
832 : !=======================================================================
833 : ! Obtain lightning CDF's from Ott et al [JGR, 2010].
834 : !
835 : ! PART 1 --- Move the file name check to the front of this routine to
836 : ! facilitate the GEOS-Chem dry-run and HEMCO-standalone dry-run.
837 : !=======================================================================
838 :
839 : ! Get filename from configuration file
840 : CALL GetExtOpt( HcoState%Config, ExtNr, 'CDF table', &
841 0 : OptValChar=FILENAME, RC=RC )
842 0 : IF ( RC /= HCO_SUCCESS ) THEN
843 0 : CALL HCO_ERROR( 'ERROR 6', RC, THISLOC=LOC )
844 0 : RETURN
845 : ENDIF
846 :
847 : ! Call HEMCO parser to replace tokens such as $ROOT, $MET, or $RES.
848 : ! There shouldn't be any date token in there ($YYYY, etc.), so just
849 : ! provide some dummy variables here
850 0 : CALL HCO_CharParse( HcoState%Config, FILENAME, -999, -1, -1, -1, -1, RC )
851 0 : IF ( RC /= HCO_SUCCESS ) THEN
852 0 : CALL HCO_ERROR( 'ERROR 7', RC, THISLOC=LOC )
853 0 : RETURN
854 : ENDIF
855 :
856 : !-----------------------------------------------------------------------
857 : ! In dry-run mode, print file path to dryrun log and exit.
858 : ! Otherwise, print file path to the HEMCO log file and continue.
859 : !-----------------------------------------------------------------------
860 :
861 : ! Test if the file exists
862 0 : INQUIRE( FILE=TRIM( FileName ), EXIST=FileExists )
863 :
864 : ! Create a display string based on whether or not the file is found
865 0 : IF ( FileExists ) THEN
866 0 : FileMsg = 'HEMCO (LIGHTNOX): Opening'
867 : ELSE
868 0 : FileMsg = 'HEMCO (LIGHTNOX): REQUIRED FILE NOT FOUND'
869 : ENDIF
870 :
871 : ! Write file status to stdout and the HEMCO log
872 0 : IF ( HcoState%amIRoot ) THEN
873 0 : WRITE( 6, 300 ) TRIM( FileMsg ), TRIM( FileName )
874 0 : WRITE( MSG, 300 ) TRIM( FileMsg ), TRIM( FileName )
875 0 : CALL HCO_MSG( HcoState%Config%Err, MSG )
876 : 300 FORMAT( a, ' ', a )
877 : ENDIF
878 :
879 : ! For dry-run simulation, return to calling program.
880 : ! For regular simulations, throw an error if we can't find the file.
881 0 : IF ( HcoState%Options%IsDryRun ) THEN
882 : RETURN
883 : ELSE
884 0 : IF ( .not. FileExists ) THEN
885 0 : WRITE( MSG, 300 ) TRIM( FileMsg ), TRIM( FileName )
886 0 : CALL HCO_ERROR(MSG, RC )
887 0 : RETURN
888 : ENDIF
889 : ENDIF
890 :
891 : !=======================================================================
892 : ! Exit if this is a GEOS-Chem or HEMCO-standalone dry-run
893 : !=======================================================================
894 : IF ( HcoState%Options%IsDryRun ) THEN
895 : Inst => NULL()
896 : CALL HCO_LEAVE( HcoState%Config%Err,RC )
897 : RETURN
898 : ENDIF
899 :
900 : !=======================================================================
901 : ! Continue for regular simulations ...
902 : !=======================================================================
903 :
904 : ! Check for usage of convective fractions. This becomes only active
905 : ! if both the convective fraction and the buoyancy field are available.
906 : CALL GetExtOpt( HcoState%Config, ExtNr, 'Use CNV_FRC', &
907 0 : OptValBool=Inst%LCNVFRC, FOUND=FOUND, RC=RC )
908 0 : IF ( RC /= HCO_SUCCESS ) THEN
909 0 : CALL HCO_ERROR( 'ERROR 8', RC, THISLOC=LOC )
910 0 : RETURN
911 : ENDIF
912 0 : IF ( .NOT. FOUND ) Inst%LCNVFRC = .FALSE.
913 :
914 : ! Check for usage of GEOS-5 lightning flash rates. If on, the GEOS-5
915 : ! flash rates (where available) are used instead of the computed flash
916 : ! rates. This is off by default.
917 : CALL GetExtOpt( HcoState%Config, ExtNr, 'GEOS-5 flash rates', &
918 0 : OptValBool=Inst%LLFR, FOUND=FOUND, RC=RC )
919 0 : IF ( RC /= HCO_SUCCESS ) THEN
920 0 : CALL HCO_ERROR( 'ERROR 9', RC, THISLOC=LOC )
921 0 : RETURN
922 : ENDIF
923 0 : IF ( .NOT. FOUND ) Inst%LLFR = .FALSE.
924 :
925 : ! Get species ID
926 0 : CALL HCO_GetExtHcoID( HcoState, ExtNr, HcoIDs, SpcNames, nSpc, RC )
927 0 : IF ( RC /= HCO_SUCCESS ) THEN
928 0 : CALL HCO_ERROR( 'ERROR 10', RC, THISLOC=LOC )
929 0 : RETURN
930 : ENDIF
931 0 : IF ( nSpc /= 1 ) THEN
932 0 : MSG = 'Lightning NOx module must have exactly one species!'
933 0 : CALL HCO_ERROR(MSG, RC )
934 0 : RETURN
935 : ENDIF
936 0 : Inst%IDTNO = HcoIDs(1)
937 :
938 : ! Get species scale factor
939 : CALL GetExtSpcVal( HcoState%Config, ExtNr, nSpc, &
940 0 : SpcNames, 'Scaling', 1.0_sp, Inst%SpcScalVal, RC )
941 0 : IF ( RC /= HCO_SUCCESS ) THEN
942 0 : CALL HCO_ERROR( 'ERROR 11', RC, THISLOC=LOC )
943 0 : RETURN
944 : ENDIF
945 :
946 : CALL GetExtSpcVal( HcoState%Config, ExtNr, nSpc, &
947 0 : SpcNames, 'ScaleField', HCOX_NOSCALE, Inst%SpcScalFldNme, RC )
948 0 : IF ( RC /= HCO_SUCCESS ) THEN
949 0 : CALL HCO_ERROR( 'ERROR 12', RC, THISLOC=LOC )
950 0 : RETURN
951 : ENDIF
952 :
953 : ! Echo info about this extension
954 0 : IF ( HcoState%amIRoot ) THEN
955 :
956 : ! Print the name of the module regardless of verbose
957 0 : msg = 'Using HEMCO extension: LightNOx (lightning NOx emissions'
958 0 : IF ( HCO_IsVerb( HcoState%Config%Err ) ) THEN
959 0 : CALL HCO_Msg( HcoState%Config%Err, sep1='-' ) ! with separator
960 : ELSE
961 0 : CALL HCO_Msg( msg, verb=.TRUE. ) ! w/o separator
962 : ENDIF
963 :
964 : ! Other information will be printed only when verbose is true
965 0 : WRITE(MSG,*) ' - Use species ', TRIM(SpcNames(1)), '->', Inst%IDTNO
966 0 : CALL HCO_MSG(HcoState%Config%Err,MSG)
967 0 : WRITE(MSG,*) ' - Use GEOS-5 flash rates: ', Inst%LLFR
968 0 : CALL HCO_MSG(HcoState%Config%Err,MSG)
969 0 : WRITE(MSG,*) ' - Use scalar scale factor: ', Inst%SpcScalVal(1)
970 0 : CALL HCO_MSG(HcoState%Config%Err,MSG)
971 0 : WRITE(MSG,*) ' - Use gridded scale field: ', TRIM(Inst%SpcScalFldNme(1))
972 0 : CALL HCO_MSG(HcoState%Config%Err,MSG)
973 : ENDIF
974 :
975 : !=======================================================================
976 : ! Allocate arrays
977 : !=======================================================================
978 :
979 0 : ALLOCATE( Inst%PROFILE( NNLIGHT, NLTYPE ), STAT=AS )
980 0 : IF( AS /= 0 ) THEN
981 0 : CALL HCO_ERROR ( 'PROFILE', RC )
982 0 : RETURN
983 : ENDIF
984 0 : Inst%PROFILE = 0.0_hp
985 :
986 0 : ALLOCATE( Inst%SLBASE(HcoState%NX,HcoState%NY,HcoState%NZ), STAT=AS )
987 : IF( AS /= 0 ) THEN
988 0 : CALL HCO_ERROR ( 'SLBASE', RC )
989 0 : RETURN
990 : ENDIF
991 0 : Inst%SLBASE = 0.0_hp
992 :
993 0 : ALLOCATE ( Inst%FLASH_DENS_TOT( HcoState%NX, HcoState%NY), STAT=AS )
994 : IF ( AS/=0 ) THEN
995 0 : CALL HCO_ERROR( 'FLASH_DENS_TOT', RC )
996 0 : RETURN
997 : ENDIF
998 0 : Inst%FLASH_DENS_TOT = 0.0_sp
999 :
1000 : !ALLOCATE ( Inst%FLASH_DENS_IC( HcoState%NX, HcoState%NY), STAT=AS )
1001 : !IF ( AS/=0 ) THEN
1002 : ! CALL HCO_ERROR( 'FLASH_DENS_IC', RC )
1003 : ! RETURN
1004 : !ENDIF
1005 : !Inst%FLASH_DENS_IC = 0.0_sp
1006 :
1007 : !ALLOCATE ( Inst%FLASH_DENS_CG( HcoState%NX, HcoState%NY), STAT=AS )
1008 : !IF ( AS/=0 ) THEN
1009 : ! CALL HCO_ERROR( 'FLASH_DENS_CG', RC )
1010 : ! RETURN
1011 : !ENDIF
1012 : !Inst%FLASH_DENS_CG = 0.0_sp
1013 :
1014 0 : ALLOCATE ( Inst%CONV_DEPTH( HcoState%NX, HcoState%NY), STAT=AS )
1015 : IF ( AS/=0 ) THEN
1016 0 : CALL HCO_ERROR( 'CONV_DEPTH', RC )
1017 0 : RETURN
1018 : ENDIF
1019 0 : Inst%CONV_DEPTH = 0.0_sp
1020 :
1021 : !=======================================================================
1022 : ! Obtain lightning CDF's from Ott et al [JGR, 2010].
1023 : !
1024 : ! PART 2 --- Read the data!
1025 : !=======================================================================
1026 :
1027 : ! Find a free file LUN
1028 0 : IU_FILE = findFreeLUN()
1029 :
1030 : ! Open file containing lightning NOx PDF data
1031 0 : OPEN( IU_FILE, FILE=TRIM( FILENAME ), STATUS='OLD', IOSTAT=IOS )
1032 0 : IF ( IOS /= 0 ) THEN
1033 0 : MSG = 'IOERROR: LightDist: 1'
1034 0 : CALL HCO_ERROR(MSG, RC )
1035 0 : RETURN
1036 : ENDIF
1037 :
1038 : ! Read 12 header lines
1039 0 : DO III = 1, 12
1040 0 : READ( IU_FILE, '(a)', IOSTAT=IOS )
1041 0 : IF ( IOS /= 0 ) THEN
1042 0 : MSG = 'IOERROR: LightDist: 2'
1043 0 : CALL HCO_ERROR(MSG, RC )
1044 0 : RETURN
1045 : ENDIF
1046 : ENDDO
1047 :
1048 : ! Read NNLIGHT types of lightning profiles
1049 0 : DO III = 1, NNLIGHT
1050 0 : READ( IU_FILE,*,IOSTAT=IOS) (Inst%PROFILE(III,JJJ),JJJ=1,NLTYPE)
1051 0 : IF ( IOS /= 0 ) THEN
1052 0 : MSG = 'IOERROR: LightDist: 3'
1053 0 : CALL HCO_ERROR(MSG, RC )
1054 0 : RETURN
1055 : ENDIF
1056 : ENDDO
1057 :
1058 : ! Close file
1059 0 : CLOSE( IU_FILE )
1060 :
1061 : !=======================================================================
1062 : ! Create diagnostics for lightning flash rates and convective cloud height
1063 : !=======================================================================
1064 : CALL Diagn_Create( HcoState = HcoState, &
1065 : cName = 'HcoLightningFlashRate_Total', &
1066 : ExtNr = ExtNr, &
1067 : Cat = -1, &
1068 : Hier = -1, &
1069 : HcoID = -1, &
1070 : SpaceDim = 2, &
1071 : OutUnit = 'flashes/min/km2', &
1072 : AutoFill = 0, &
1073 : Trgt2D = Inst%FLASH_DENS_TOT, &
1074 0 : RC = RC )
1075 0 : IF ( RC /= HCO_SUCCESS ) THEN
1076 0 : CALL HCO_ERROR( 'ERROR 13', RC, THISLOC=LOC )
1077 0 : RETURN
1078 : ENDIF
1079 :
1080 : !CALL Diagn_Create( HcoState = HcoState, &
1081 : ! cName = 'HcoLightningFlashRate_IntraCld', &
1082 : ! ExtNr = ExtNr, &
1083 : ! Cat = -1, &
1084 : ! Hier = -1, &
1085 : ! HcoID = -1, &
1086 : ! SpaceDim = 2, &
1087 : ! OutUnit = 'flashes/min/km2', &
1088 : ! AutoFill = 0, &
1089 : ! Trgt2D = Inst%FLASH_DENS_IC, &
1090 : ! RC = RC )
1091 : !IF ( RC /= HCO_SUCCESS ) RETURN
1092 : !
1093 : !CALL Diagn_Create( HcoState = HcoState, &
1094 : ! cName = 'HcoLightningFlashRate_CldGround', &
1095 : ! ExtNr = ExtNr, &
1096 : ! Cat = -1, &
1097 : ! Hier = -1, &
1098 : ! HcoID = -1, &
1099 : ! SpaceDim = 2, &
1100 : ! OutUnit = 'flashes/min/km2', &
1101 : ! AutoFill = 0, &
1102 : ! Trgt2D = Inst%FLASH_DENS_CG, &
1103 : ! RC = RC )
1104 : !IF ( RC /= HCO_SUCCESS ) RETURN
1105 :
1106 : CALL Diagn_Create( HcoState = HcoState, &
1107 : cName = 'HcoConvectiveCloudTopHeight', &
1108 : ExtNr = ExtNr, &
1109 : Cat = -1, &
1110 : Hier = -1, &
1111 : HcoID = -1, &
1112 : SpaceDim = 2, &
1113 : OutUnit = '1', &
1114 : AutoFill = 0, &
1115 : Trgt2D = Inst%CONV_DEPTH, &
1116 0 : RC = RC )
1117 0 : IF ( RC /= HCO_SUCCESS ) THEN
1118 0 : CALL HCO_ERROR( 'ERROR 14', RC, THISLOC=LOC )
1119 0 : RETURN
1120 : ENDIF
1121 :
1122 : !=======================================================================
1123 : ! Activate met fields required by this module
1124 : !=======================================================================
1125 0 : ExtState%TK%DoUse = .TRUE.
1126 0 : ExtState%TROPP%DoUse = .TRUE.
1127 0 : ExtState%CNV_MFC%DoUse = .TRUE.
1128 0 : ExtState%CNV_FRC%DoUse = .TRUE.
1129 0 : ExtState%LFR%DoUse = .TRUE.
1130 0 : ExtState%FLASH_DENS%DoUse = .TRUE.
1131 0 : ExtState%CONV_DEPTH%DoUse = .TRUE.
1132 0 : ExtState%FRLAND%DoUse = .TRUE.
1133 0 : ExtState%FRLANDIC%DoUse = .TRUE.
1134 0 : ExtState%FROCEAN%DoUse = .TRUE.
1135 0 : ExtState%FRSEAICE%DoUse = .TRUE.
1136 0 : ExtState%FRLAKE%DoUse = .TRUE.
1137 :
1138 : ! Only activate BYNCY and LFR if they are needed
1139 0 : IF ( Inst%LCNVFRC .OR. Inst%LLFR ) ExtState%BYNCY%DoUse = .TRUE.
1140 0 : IF ( Inst%LLFR ) ExtState%LFR%DoUse = .TRUE.
1141 :
1142 : ! Cleanup
1143 0 : Inst => NULL()
1144 :
1145 : ! Leave w/ success
1146 0 : IF ( ALLOCATED(HcoIDs ) ) DEALLOCATE(HcoIDs )
1147 0 : IF ( ALLOCATED(SpcNames) ) DEALLOCATE(SpcNames)
1148 0 : CALL HCO_LEAVE( HcoState%Config%Err,RC )
1149 :
1150 0 : END SUBROUTINE HCOX_LightNOx_Init
1151 : !EOC
1152 : !------------------------------------------------------------------------------
1153 : ! Harmonized Emissions Component (HEMCO) !
1154 : !------------------------------------------------------------------------------
1155 : !BOP
1156 : !
1157 : ! !IROUTINE: hcox_lightnox_final
1158 : !
1159 : ! !DESCRIPTION: Subroutine HCOX\_LIGHTNOX\_FINAL deallocates all module
1160 : ! arrays.
1161 : !\\
1162 : !\\
1163 : ! !INTERFACE:
1164 : !
1165 0 : SUBROUTINE HCOX_LightNOx_Final( ExtState )
1166 : !
1167 : ! !INPUT PARAMETERS:
1168 : !
1169 : TYPE(Ext_State), POINTER :: ExtState ! Module options
1170 : !
1171 : ! !REVISION HISTORY:
1172 : ! 14 Apr 2004 - R. Yantosca - Initial version
1173 : ! See https://github.com/geoschem/hemco for complete history
1174 : !EOP
1175 : !------------------------------------------------------------------------------
1176 : !BOC
1177 :
1178 : !=================================================================
1179 : ! Cleanup module arrays
1180 : !=================================================================
1181 0 : CALL InstRemove ( ExtState%LightNOx )
1182 :
1183 0 : END SUBROUTINE HCOX_LightNOx_Final
1184 : !EOC
1185 : !------------------------------------------------------------------------------
1186 : ! Harmonized Emissions Component (HEMCO) !
1187 : !------------------------------------------------------------------------------
1188 : !BOP
1189 : !
1190 : ! !IROUTINE: InstGet
1191 : !
1192 : ! !DESCRIPTION: Subroutine InstGet returns a pointer to the desired instance.
1193 : !\\
1194 : !\\
1195 : ! !INTERFACE:
1196 : !
1197 0 : SUBROUTINE InstGet ( Instance, Inst, RC, PrevInst )
1198 : !
1199 : ! !INPUT PARAMETERS:
1200 : !
1201 : INTEGER :: Instance
1202 : TYPE(MyInst), POINTER :: Inst
1203 : INTEGER :: RC
1204 : TYPE(MyInst), POINTER, OPTIONAL :: PrevInst
1205 : !
1206 : ! !REVISION HISTORY:
1207 : ! 18 Feb 2016 - C. Keller - Initial version
1208 : ! See https://github.com/geoschem/hemco for complete history
1209 : !EOP
1210 : !------------------------------------------------------------------------------
1211 : !BOC
1212 : TYPE(MyInst), POINTER :: PrvInst
1213 :
1214 : !=================================================================
1215 : ! InstGet begins here!
1216 : !=================================================================
1217 :
1218 : ! Get instance. Also archive previous instance.
1219 0 : PrvInst => NULL()
1220 0 : Inst => AllInst
1221 0 : DO WHILE ( ASSOCIATED(Inst) )
1222 0 : IF ( Inst%Instance == Instance ) EXIT
1223 0 : PrvInst => Inst
1224 0 : Inst => Inst%NextInst
1225 : END DO
1226 0 : IF ( .NOT. ASSOCIATED( Inst ) ) THEN
1227 0 : RC = HCO_FAIL
1228 0 : RETURN
1229 : ENDIF
1230 :
1231 : ! Pass output arguments
1232 0 : IF ( PRESENT(PrevInst) ) PrevInst => PrvInst
1233 :
1234 : ! Cleanup & Return
1235 0 : PrvInst => NULL()
1236 0 : RC = HCO_SUCCESS
1237 :
1238 : END SUBROUTINE InstGet
1239 : !EOC
1240 : !------------------------------------------------------------------------------
1241 : ! Harmonized Emissions Component (HEMCO) !
1242 : !------------------------------------------------------------------------------
1243 : !BOP
1244 : !
1245 : ! !IROUTINE: InstCreate
1246 : !
1247 : ! !DESCRIPTION: Subroutine InstCreate adds a new instance to the list of
1248 : ! instances, assigns a unique instance number to this new instance, and
1249 : ! archives this instance number to output argument Instance.
1250 : !\\
1251 : !\\
1252 : ! !INTERFACE:
1253 : !
1254 0 : SUBROUTINE InstCreate ( ExtNr, Instance, Inst, RC )
1255 : !
1256 : ! !INPUT PARAMETERS:
1257 : !
1258 : INTEGER, INTENT(IN) :: ExtNr
1259 : !
1260 : ! !OUTPUT PARAMETERS:
1261 : !
1262 : INTEGER, INTENT( OUT) :: Instance
1263 : TYPE(MyInst), POINTER :: Inst
1264 : !
1265 : ! !INPUT/OUTPUT PARAMETERS:
1266 : !
1267 : INTEGER, INTENT(INOUT) :: RC
1268 : !
1269 : ! !REVISION HISTORY:
1270 : ! 18 Feb 2016 - C. Keller - Initial version
1271 : ! See https://github.com/geoschem/hemco for complete history
1272 : !EOP
1273 : !------------------------------------------------------------------------------
1274 : !BOC
1275 : TYPE(MyInst), POINTER :: TmpInst
1276 : INTEGER :: nnInst
1277 :
1278 : !=================================================================
1279 : ! InstCreate begins here!
1280 : !=================================================================
1281 :
1282 : ! ----------------------------------------------------------------
1283 : ! Generic instance initialization
1284 : ! ----------------------------------------------------------------
1285 :
1286 : ! Initialize
1287 0 : Inst => NULL()
1288 :
1289 : ! Get number of already existing instances
1290 0 : TmpInst => AllInst
1291 0 : nnInst = 0
1292 0 : DO WHILE ( ASSOCIATED(TmpInst) )
1293 0 : nnInst = nnInst + 1
1294 0 : TmpInst => TmpInst%NextInst
1295 : END DO
1296 :
1297 : ! Create new instance
1298 0 : ALLOCATE(Inst)
1299 0 : Inst%Instance = nnInst + 1
1300 0 : Inst%ExtNr = ExtNr
1301 :
1302 : ! Attach to instance list
1303 0 : Inst%NextInst => AllInst
1304 0 : AllInst => Inst
1305 :
1306 : ! Update output instance
1307 0 : Instance = Inst%Instance
1308 :
1309 : ! Return w/ success
1310 0 : RC = HCO_SUCCESS
1311 :
1312 0 : END SUBROUTINE InstCreate
1313 : !EOC
1314 : !------------------------------------------------------------------------------
1315 : ! Harmonized Emissions Component (HEMCO) !
1316 : !------------------------------------------------------------------------------
1317 : !BOP
1318 : !
1319 : ! !IROUTINE: InstRemove
1320 : !
1321 : ! !DESCRIPTION: Subroutine InstRemove removes an instance from the list of
1322 : ! instances.
1323 : !\\
1324 : !\\
1325 : ! !INTERFACE:
1326 : !
1327 0 : SUBROUTINE InstRemove ( Instance )
1328 : !
1329 : ! !INPUT PARAMETERS:
1330 : !
1331 : INTEGER :: Instance
1332 : !
1333 : ! !REVISION HISTORY:
1334 : ! 18 Feb 2016 - C. Keller - Initial version
1335 : ! See https://github.com/geoschem/hemco for complete history
1336 : !EOP
1337 : !------------------------------------------------------------------------------
1338 : !BOC
1339 : INTEGER :: RC
1340 : TYPE(MyInst), POINTER :: PrevInst => NULL()
1341 : TYPE(MyInst), POINTER :: Inst => NULL()
1342 :
1343 : !=================================================================
1344 : ! InstRemove begins here!
1345 : !=================================================================
1346 :
1347 : ! Init
1348 0 : PrevInst => NULL()
1349 0 : Inst => NULL()
1350 :
1351 : ! Get instance. Also archive previous instance.
1352 0 : CALL InstGet ( Instance, Inst, RC, PrevInst=PrevInst )
1353 :
1354 : ! Instance-specific deallocation
1355 0 : IF ( ASSOCIATED(Inst) ) THEN
1356 :
1357 : !---------------------------------------------------------------------
1358 : ! Deallocate fields of Inst before popping off from the list
1359 : ! in order to avoid memory leaks (Bob Yantosca (17 Aug 2022)
1360 : !---------------------------------------------------------------------
1361 0 : IF ( ASSOCIATED( Inst%PROFILE ) ) THEN
1362 0 : DEALLOCATE( Inst%PROFILE )
1363 : ENDIF
1364 0 : Inst%PROFILE => NULL()
1365 :
1366 0 : IF ( ASSOCIATED( Inst%SLBASE ) ) THEN
1367 0 : DEALLOCATE( Inst%SLBASE )
1368 : ENDIF
1369 0 : Inst%SLBASE => NULL()
1370 :
1371 0 : IF ( ASSOCIATED( Inst%FLASH_DENS_TOT ) ) THEN
1372 0 : DEALLOCATE( Inst%FLASH_DENS_TOT )
1373 : ENDIF
1374 0 : Inst%FLASH_DENS_TOT => NULL()
1375 :
1376 : !IF ( ASSOCIATED( Inst%FLASH_DENS_IC ) ) THEN
1377 : ! DEALLOCATE( Inst%FLASH_DENS_IC )
1378 : !ENDIF
1379 0 : Inst%FLASH_DENS_IC => NULL()
1380 :
1381 : !IF ( ASSOCIATED( Inst%FLASH_DENS_CG ) ) THEN
1382 : ! DEALLOCATE ( Inst%FLASH_DENS_CG )
1383 : !ENDIF
1384 0 : Inst%FLASH_DENS_CG => NULL()
1385 :
1386 0 : IF ( ASSOCIATED( Inst%CONV_DEPTH ) ) THEN
1387 0 : DEALLOCATE( Inst%CONV_DEPTH )
1388 : ENDIF
1389 0 : Inst%CONV_DEPTH => NULL()
1390 :
1391 0 : IF ( ALLOCATED ( Inst%SpcScalVal ) ) THEN
1392 0 : DEALLOCATE( Inst%SpcScalVal )
1393 : ENDIF
1394 :
1395 0 : IF ( ALLOCATED( Inst%SpcScalFldNme ) ) THEN
1396 0 : DEALLOCATE( Inst%SpcScalFldNme )
1397 : ENDIF
1398 :
1399 : !---------------------------------------------------------------------
1400 : ! Pop off instance from list
1401 : !---------------------------------------------------------------------
1402 0 : IF ( ASSOCIATED(PrevInst) ) THEN
1403 0 : PrevInst%NextInst => Inst%NextInst
1404 : ELSE
1405 0 : AllInst => Inst%NextInst
1406 : ENDIF
1407 0 : DEALLOCATE(Inst)
1408 : ENDIF
1409 :
1410 : ! Free pointers before exiting
1411 0 : PrevInst => NULL()
1412 0 : Inst => NULL()
1413 :
1414 0 : END SUBROUTINE InstRemove
1415 : !EOC
1416 0 : END MODULE HCOX_LightNOx_Mod
|