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