LCOV - code coverage report
Current view: top level - hemco/HEMCO/src/Extensions - hcox_soilnox_mod.F90 (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 614 0.0 %
Date: 2025-03-13 18:42:46 Functions: 0 22 0.0 %

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

Generated by: LCOV version 1.14