LCOV - code coverage report
Current view: | top level - hemco/HEMCO/src/Extensions - hcox_lightnox_mod.F90 (source / functions) |  |  | Hit | Total | Coverage
Test: | coverage.info |  | Lines: | 0 | 357 | 0.0 %
Date: | 2024-12-17 22:39:59 |  | Functions: | 0 | 11 | 0.0 %

              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

Generated by: LCOV version 1.14