LCOV - code coverage report
Current view: | top level - hemco/HEMCO/src/Extensions - hcox_dustginoux_mod.F90 (source / functions) |  |  | Hit | Total | Coverage
Test: | coverage.info |  | Lines: | 0 | 255 | 0.0 %
Date: | 2025-01-13 21:54:50 |  | Functions: | 0 | 10 | 0.0 %

              Line data    Source code
           1             : !------------------------------------------------------------------------------
           2             : !                   Harmonized Emissions Component (HEMCO)                    !
           3             : !------------------------------------------------------------------------------
           4             : !BOP
           5             : !
           6             : ! !MODULE: hcox_dustginoux_mod.F90
           7             : !
           8             : ! !DESCRIPTION: Paul GINOUX dust source function.  This subroutine updates
           9             : !  the surface mixing ratio of dust aerosols for NDSTBIN size bins.  The
          10             : !  uplifting of dust depends in space on the source function, and in time
          11             : !  and space on the soil moisture and surface wind speed (10 meters).  Dust
          12             : !  is uplifted if the wind speed is greater than a threshold velocity which
          13             : !  is calculated with the formula of Marticorena et al.  (JGR, v.102,
          14             : !  pp 23277-23287, 1997).  To run this subroutine you need the source
          15             : !  function which can be obtained by contacting Paul Ginoux at
          16             : !  ginoux@rondo.gsfc.nasa.gov/  If you are not using GEOS DAS met fields,
          17             : !  you will most likely need to adapt the adjusting parameter.
          18             : !\\
          19             : !\\
          20             : ! This is a HEMCO extension module that uses many of the HEMCO core
          21             : ! utilities.
          22             : !\\
          23             : !\\
          24             : ! References:
          25             : !
          26             : ! \begin{enumerate}
          27             : ! \item Ginoux, P., M. Chin, I. Tegen, J. Prospero, B. Hoben, O. Dubovik,
          28             : !        and S.-J. Lin, "Sources and distributions of dust aerosols simulated
          29             : !        with the GOCART model", J. Geophys. Res., 2001
          30             : ! \item Chin, M., P. Ginoux, S. Kinne, B. Holben, B. Duncan, R. Martin,
          31             : !        J. Logan, A. Higurashi, and T. Nakajima, "Tropospheric aerosol
          32             : !        optical thickness from the GOCART model and comparisons with
          33             : !        satellite and sunphotometers measurements", J. Atmos Sci., 2001.
          34             : ! \end{enumerate}
          35             : !
          36             : ! !AUTHOR:
          37             : !  Paul Ginoux (ginoux@rondo.gsfc.nasa.gov)
          38             : !
          39             : ! !INTERFACE:
          40             : !
          41             : MODULE HCOX_DustGinoux_Mod
          42             : !
          43             : ! !USES:
          44             : !
          45             :   USE HCO_Error_Mod
          46             :   USE HCO_Diagn_Mod
          47             :   USE HCO_State_Mod,  ONLY : HCO_State
          48             :   USE HCOX_State_Mod, ONLY : Ext_State
          49             :
          50             :   IMPLICIT NONE
          51             :   PRIVATE
          52             : !
          53             : ! !PUBLIC MEMBER FUNCTIONS:
          54             : !
          55             :   PUBLIC :: HcoX_DustGinoux_Run
          56             :   PUBLIC :: HcoX_DustGinoux_Init
          57             :   PUBLIC :: HcoX_DustGinoux_Final
          58             :   PUBLIC :: HcoX_DustGinoux_GetChDust
          59             : !
          60             : ! !REVISION HISTORY:
          61             : !  08 Apr 2004 - T. D. Fairlie - Initial version
          62             : !  See https://github.com/geoschem/hemco for complete history
          63             : !EOP
          64             : !------------------------------------------------------------------------------
          65             : !BOC
          66             : !
          67             : ! !PRIVATE TYPES:
          68             : !
          69             :   TYPE :: MyInst
          70             :
          71             :    ! Quantities related to dust bins
          72             :    INTEGER              :: Instance
          73             :    INTEGER              :: NBINS
          74             :    INTEGER              :: ExtNr    = -1     ! Extension number  for DustGinoux
          75             :    INTEGER              :: ExtNrAlk = -1     ! Extension number  for DustAlk
          76             :    INTEGER, ALLOCATABLE :: HcoIDs    (:)     ! HEMCO species IDs for DustGinoux
          77             :    INTEGER, ALLOCATABLE :: HcoIDsAlk (:)     ! HEMCO species IDs for DustAlk
          78             :    INTEGER,  POINTER    :: IPOINT    (:)     ! 1=sand, 2=silt, 3=clay
          79             :    REAL,     POINTER    :: FRAC_S    (:)     !
          80             :    REAL,     POINTER    :: DUSTDEN   (:)     ! dust density     [kg/m3]
          81             :    REAL,     POINTER    :: DUSTREFF  (:)     ! effective radius [um]
          82             :    REAL(hp), POINTER    :: FLUX(:,:,:)
          83             :    REAL(hp), POINTER    :: FLUX_ALK(:,:,:)
          84             :
          85             :    ! Source functions (get from HEMCO core)
          86             :    REAL(hp), POINTER    :: SRCE_SAND(:,:) => NULL()
          87             :    REAL(hp), POINTER    :: SRCE_SILT(:,:) => NULL()
          88             :    REAL(hp), POINTER    :: SRCE_CLAY(:,:) => NULL()
          89             :
          90             :    ! Transfer coefficient (grid-dependent)
          91             :    REAL(dp)             :: CH_DUST
          92             :
          93             :    TYPE(MyInst), POINTER :: NextInst => NULL()
          94             :   END TYPE MyInst
          95             :
          96             :   ! Pointer to instances
          97             :   TYPE(MyInst), POINTER  :: AllInst => NULL()
          98             :
          99             : CONTAINS
         100             : !EOC
         101             : !------------------------------------------------------------------------------
         102             : !                   Harmonized Emissions Component (HEMCO)                    !
         103             : !------------------------------------------------------------------------------
         104             : !BOP
         105             : !
         106             : ! !IROUTINE: HCOX_DustGinoux_Run
         107             : !
         108             : ! !DESCRIPTION: Subroutine HcoX\_DustGinoux\_Run is the driver routine
         109             : ! for the Paul Ginoux dust source function HEMCO extension.
         110             : !\\
         111             : !\\
         112             : ! !INTERFACE:
         113             : !
         114           0 :   SUBROUTINE HcoX_DustGinoux_Run( ExtState, HcoState, RC )
         115             : !
         116             : ! !USES:
         117             : !
         118             :     USE HCO_Calc_Mod,     ONLY : HCO_EvalFld
         119             :     USE HCO_EmisList_Mod, ONLY : HCO_GetPtr
         120             :     USE HCO_FluxArr_Mod,  ONLY : HCO_EmisAdd
         121             :     USE HCO_Clock_Mod,    ONLY : HcoClock_First
         122             : !
         123             : ! !INPUT PARAMETERS:
         124             : !
         125             :     TYPE(Ext_State), POINTER        :: ExtState    ! Options for this ext
         126             : !
         127             : ! !INPUT/OUTPUT PARAMETERS:
         128             : !
         129             :     TYPE(HCO_State), POINTER        :: HcoState    ! HEMCO state object
         130             :     INTEGER,         INTENT(INOUT)  :: RC          ! Success or failure?
         131             : !
         132             : ! !REMARKS:
         133             : !    SRCE_FUNK Source function                               (-)
         134             : !              for 1: Sand, 2: Silt, 3: Clay
         135             : !                                                                             .
         136             : !    DUSTDEN   Dust density                                  (kg/m3)
         137             : !    DUSTREFF  Effective radius                              (um)
         138             : !    AD        Air mass for each grid box                    (kg)
         139             : !    NTDT      Time step                                     (s)
         140             : !    W10m      Velocity at the anemometer level (10meters)   (m/s)
         141             : !    GWET      Surface wetness                               (-)
         142             : !                                                                             .
         143             : !  Dust properties used in GOCART
         144             : !                                                                             .
         145             : !  Size classes: 01-1, 1-1.8, 1.8-3, 3-6 (um)
         146             : !  Radius: 0.7, 1.5, 2.5, 4  (um)
         147             : !  Density: 2500, 2650, 2650, 2650 (kg/m3)
         148             : !
         149             : ! !REVISION HISTORY:
         150             : !  08 Apr 2004 - T. D. Fairlie - Initial version
         151             : !  See https://github.com/geoschem/hemco for complete history
         152             : !EOP
         153             : !------------------------------------------------------------------------------
         154             : !BOC
         155             : !
         156             : ! !DEFINED PARAMETER:
         157             : !
         158             :     REAL*8, PARAMETER :: RHOA     = 1.25d-3
         159             :
         160             : !
         161             : ! !LOCAL VARIABLES:
         162             : !
         163             :     ! SAVED scalars
         164             : !    LOGICAL, SAVE     :: FIRST = .TRUE.
         165             :
         166             :     ! Scalars
         167             :     INTEGER           :: I, J, N, M, tmpID
         168             :     LOGICAL           :: ERR
         169             :     REAL*8            :: W10M,   DEN,    DIAM,   U_TS0, U_TS
         170             :     REAL*8            :: SRCE_P, REYNOL, ALPHA,  BETA
         171             :     REAL*8            :: GAMMA,  CW,     DTSRCE, A_M2,  G
         172             :     REAL              :: DSRC
         173             :     CHARACTER(LEN=63) :: MSG, LOC
         174             :
         175             :     ! Arrays
         176           0 :     REAL*8            :: DUST_EMI_TOTAL(HcoState%NX, HcoState%NY)
         177             :
         178             :     ! Pointers
         179             :     TYPE(MyInst), POINTER :: Inst
         180           0 :     REAL(hp),     POINTER :: Arr2D(:,:)
         181             :
         182             :     !=======================================================================
         183             :     ! HCOX_DUSTGINOUX_RUN begins here!
         184             :     !=======================================================================
         185           0 :     LOC = 'HCOX_DUSTGINOUX_RUN (HCOX_DUSTGINOUX_MOD.F90)'
         186             :
         187             :     ! Return if extension is disabled
         188           0 :     IF ( ExtState%DustGinoux <= 0 ) RETURN
         189             :
         190             :     ! Enter
         191           0 :     CALL HCO_ENTER(HcoState%Config%Err, LOC, RC)
         192           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         193           0 :         CALL HCO_ERROR( 'ERROR 0', RC, THISLOC=LOC )
         194           0 :         RETURN
         195             :     ENDIF
         196             :
         197             :     ! Get instance
         198           0 :     Inst   => NULL()
         199           0 :     CALL InstGet ( ExtState%DustGinoux, Inst, RC )
         200           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         201           0 :        WRITE(MSG,*) 'Cannot find DustGinoux instance Nr. ', ExtState%DustGinoux
         202           0 :        CALL HCO_ERROR(MSG,RC)
         203           0 :        RETURN
         204             :     ENDIF
         205             :
         206             :     ! Set gravity at earth surface (cm/s^2)
         207           0 :     G       = HcoState%Phys%g0 * 1.0d2
         208             :
         209             :     ! Emission timestep [s]
         210           0 :     DTSRCE  = HcoState%TS_EMIS
         211             :
         212             :     ! Initialize total dust emissions array [kg/m2/s]
         213           0 :     DUST_EMI_TOTAL = 0.0d0
         214             :
         215             :     ! Error check
         216           0 :     ERR     = .FALSE.
         217             :
         218             :     ! Init
         219           0 :     Arr2D    => NULL()
         220             :
         221             :     !=================================================================
         222             :     ! Point to DUST source functions
         223             :     !=================================================================
         224             :     !IF ( HcoClock_First(HcoState%Clock,.TRUE.) ) THEN
         225             :
         226             :        ! Sand
         227           0 :        CALL HCO_EvalFld( HcoState, 'GINOUX_SAND', Inst%SRCE_SAND, RC )
         228           0 :        IF ( RC /= HCO_SUCCESS ) THEN
         229           0 :            CALL HCO_ERROR( 'ERROR 1', RC, THISLOC=LOC )
         230           0 :            RETURN
         231             :        ENDIF
         232             :
         233             :        ! Silt
         234           0 :        CALL HCO_EvalFld( HcoState, 'GINOUX_SILT', Inst%SRCE_SILT, RC )
         235           0 :        IF ( RC /= HCO_SUCCESS ) THEN
         236           0 :            CALL HCO_ERROR( 'ERROR 2', RC, THISLOC=LOC )
         237           0 :            RETURN
         238             :        ENDIF
         239             :
         240             :        ! Clay
         241           0 :        CALL HCO_EvalFld( HcoState, 'GINOUX_CLAY', Inst%SRCE_CLAY, RC )
         242           0 :        IF ( RC /= HCO_SUCCESS ) THEN
         243           0 :            CALL HCO_ERROR( 'ERROR 3', RC, THISLOC=LOC )
         244           0 :            RETURN
         245             :        ENDIF
         246             :     !ENDIF
         247             :
         248             :     !=================================================================
         249             :     ! Compute dust emisisons
         250             :     !=================================================================
         251             : !$OMP PARALLEL DO                                             &
         252             : !$OMP DEFAULT( SHARED )                                       &
         253             : !$OMP PRIVATE( I,      J,     M,      N,      DEN,   DIAM   ) &
         254             : !$OMP PRIVATE( REYNOL, ALPHA, BETA,   GAMMA,  U_TS0, U_TS   ) &
         255             : !$OMP PRIVATE( CW,     W10M,  SRCE_P, RC                    ) &
         256             : !$OMP SCHEDULE( DYNAMIC )
         257           0 :     DO N = 1, Inst%NBINS
         258             :
         259             :        !====================================================================
         260             :        ! Threshold velocity as a function of the dust density and the
         261             :        ! diameter from Bagnold (1941), valid for particles larger
         262             :        ! than 10 um.
         263             :        !
         264             :        ! u_ts0 = 6.5*sqrt(dustden(n)*g0*2.*dustreff(n))
         265             :        !
         266             :        ! Threshold velocity from Marticorena and Bergametti
         267             :        ! Convert units to fit dimensional parameters
         268             :        !====================================================================
         269           0 :        DEN    = Inst%DUSTDEN(N) * 1.d-3                   ! [g/cm3]
         270           0 :        DIAM   = 2d0 * Inst%DUSTREFF(N) * 1.d2             ! [cm in diameter]
         271           0 :        REYNOL = 1331.d0 * DIAM**(1.56d0) + 0.38d0         ! [Reynolds number]
         272           0 :        ALPHA  = DEN * G * DIAM / RHOA
         273           0 :        BETA   = 1d0 + ( 6.d-3 / ( DEN * G * DIAM**(2.5d0) ) )
         274           0 :        GAMMA  = ( 1.928d0 * REYNOL**(0.092d0) ) - 1.d0
         275             :
         276             :        !====================================================================
         277             :        ! I think the 129.d-5 is to put U_TS in m/sec instead of cm/sec
         278             :        ! This is a threshold friction velocity!       from M&B
         279             :        ! i.e. Ginoux uses the Gillette and Passi formulation
         280             :        ! but has substituted Bagnold's Ut with M&B's U*t.
         281             :        ! This appears to be a problem.  (tdf, 4/2/04)
         282             :        !====================================================================
         283             :
         284             :        ! [m/s]
         285           0 :        U_TS0  = 129.d-5 * SQRT( ALPHA ) * SQRT( BETA ) / SQRT( GAMMA )
         286             :
         287             :        ! Index used to select the source function (1=sand, 2=silt, 3=clay)
         288           0 :        M = Inst%IPOINT(N)
         289             :
         290             :        ! Loop over grid boxes
         291           0 :        DO J = 1, HcoState%NY
         292           0 :        DO I = 1, HcoState%NX
         293             :
         294             :           ! Fraction of emerged surfaces
         295             :           ! (subtract lakes, coastal ocean,...)
         296           0 :           CW = 1.d0
         297             :
         298             :           ! Case of surface dry enough to erode
         299           0 :           IF ( ExtState%GWETTOP%Arr%Val(I,J) < 0.2d0 ) THEN
         300             :
         301             :              U_TS = U_TS0 *( 1.2d0 + 0.2d0 * &
         302           0 :                     LOG10( MAX(1.d-3,ExtState%GWETTOP%Arr%Val(I,J))))
         303           0 :              U_TS = MAX( 0.d0, U_TS )
         304             :
         305             :           ELSE
         306             :
         307             :              ! Case of wet surface, no erosion
         308             :              U_TS = 100.d0
         309             :
         310             :           ENDIF
         311             :
         312             :           ! 10m wind speed squared [m2/s2]
         313           0 :           W10M = ExtState%U10M%Arr%Val(I,J)**2 &
         314           0 :                + ExtState%V10M%Arr%Val(I,J)**2
         315             :
         316             :           ! Get source function
         317           0 :           SELECT CASE( M )
         318             :              CASE( 1 )
         319           0 :                 SRCE_P = Inst%SRCE_SAND(I,J)
         320             :              CASE( 2 )
         321           0 :                 SRCE_P = Inst%SRCE_SILT(I,J)
         322             :              CASE( 3 )
         323           0 :                 SRCE_P = Inst%SRCE_CLAY(I,J)
         324             :           END SELECT
         325             :
         326             :           ! Units are m2
         327           0 :           SRCE_P = Inst%FRAC_S(N) * SRCE_P !* A_M2
         328             :
         329             :           ! Dust source increment [kg/m2/s]
         330           0 :           Inst%FLUX(I,J,N) = CW           * Inst%CH_DUST * SRCE_P * W10M &
         331           0 :                            * ( SQRT(W10M) - U_TS )
         332             :
         333             :           ! Not less than zero
         334           0 :           IF ( Inst%FLUX(I,J,N) < 0.d0 ) Inst%FLUX(I,J,N) = 0.d0
         335             :
         336             :           ! Increment total dust emissions [kg/m2/s] (L. Zhang, 6/26/15)
         337           0 :           DUST_EMI_TOTAL(I,J) = DUST_EMI_TOTAL(I,J) + Inst%FLUX(I,J,N)
         338             :
         339             :           ! Include DUST Alkalinity SOURCE, assuming an alkalinity
         340             :           ! of 4% by weight [kg].                  !tdf 05/10/08
         341             :           !tdf 3% Ca + equ 1% Mg = 4% alkalinity
         342           0 :           IF ( Inst%ExtNrAlk > 0 ) THEN
         343           0 :              Inst%FLUX_ALK(I,J,N) = 0.04 * Inst%FLUX(I,J,N)
         344             :           ENDIF
         345             :
         346             :        ENDDO
         347             :        ENDDO
         348             :     ENDDO
         349             : !$OMP END PARALLEL DO
         350             :
         351             :     ! Error check
         352             :     IF ( ERR ) THEN
         353             :        RC = HCO_FAIL
         354             :        RETURN
         355             :     ENDIF
         356             :
         357             :     ! Redistribute dust emissions across bins (L. Zhang, 6/26/15)
         358             : !$OMP PARALLEL DO                                           &
         359             : !$OMP DEFAULT( SHARED )                                     &
         360             : !$OMP PRIVATE( I, J, N )                                    &
         361             : !$OMP SCHEDULE( DYNAMIC )
         362           0 :      DO N=1,Inst%NBINS
         363           0 :      DO J=1,HcoState%NY
         364           0 :      DO I=1,HcoState%NX
         365           0 :         SELECT CASE( N )
         366             :            CASE( 1 )
         367           0 :               Inst%FLUX(I,J,N) = DUST_EMI_TOTAL(I,J) * 0.0766d0
         368             :            CASE( 2 )
         369           0 :               Inst%FLUX(I,J,N) = DUST_EMI_TOTAL(I,J) * 0.1924d0
         370             :            CASE( 3 )
         371           0 :               Inst%FLUX(I,J,N) = DUST_EMI_TOTAL(I,J) * 0.3491d0
         372             :            CASE( 4 )
         373           0 :               Inst%FLUX(I,J,N) = DUST_EMI_TOTAL(I,J) * 0.3819d0
         374             :         END SELECT
         375             :      ENDDO
         376             :      ENDDO
         377             :      ENDDO
         378             : !$OMP END PARALLEL DO
         379             :
         380             :     !=======================================================================
         381             :     ! PASS TO HEMCO STATE AND UPDATE DIAGNOSTICS
         382             :     !=======================================================================
         383           0 :     DO N = 1, Inst%NBINS
         384           0 :        IF ( Inst%HcoIDs(N) > 0 ) THEN
         385             :
         386             :           ! Add flux to emission array
         387             :           CALL HCO_EmisAdd( HcoState,       Inst%FLUX(:,:,N), &
         388           0 :                             Inst%HcoIDs(N), RC,       ExtNr=Inst%ExtNr   )
         389           0 :           IF ( RC /= HCO_SUCCESS ) THEN
         390           0 :              WRITE(MSG,*) 'HCO_EmisAdd error: dust bin ', N
         391           0 :              CALL HCO_ERROR(MSG, RC )
         392           0 :              RETURN
         393             :           ENDIF
         394             :
         395             :        ENDIF
         396             :
         397             :        ! This block is only relevant if the DustAlk extension
         398             :        ! has been turned on.  Skip othewrise. (bmy, 7/7/17)
         399           0 :        IF ( Inst%ExtNrAlk > 0 ) THEN
         400           0 :           IF ( Inst%HcoIDsAlk(N) > 0 ) THEN
         401             :
         402             :              ! Add flux to emission array
         403             :              CALL HCO_EmisAdd( HcoState,          Inst%FLUX_Alk(:,:,N), &
         404           0 :                                Inst%HcoIDsAlk(N), RC, ExtNr=Inst%ExtNrAlk)
         405           0 :              IF ( RC /= HCO_SUCCESS ) THEN
         406           0 :                 WRITE(MSG,*) 'HCO_EmisAdd error: dust alkalinity bin ', N
         407           0 :                 CALL HCO_ERROR(MSG, RC )
         408           0 :                 RETURN
         409             :              ENDIF
         410             :           ENDIF
         411             :        ENDIF
         412             :
         413             :     ENDDO
         414             :
         415             :     !=======================================================================
         416             :     ! Cleanup & quit
         417             :     !=======================================================================
         418             :
         419             :     ! Nullify pointers
         420           0 :     Inst    => NULL()
         421             :
         422             :     ! Leave w/ success
         423           0 :     CALL HCO_LEAVE( HcoState%Config%Err,RC )
         424             :
         425           0 :   END SUBROUTINE HcoX_DustGinoux_Run
         426             : !EOC
         427             : !------------------------------------------------------------------------------
         428             : !                   Harmonized Emissions Component (HEMCO)                    !
         429             : !------------------------------------------------------------------------------
         430             : !BOP
         431             : !
         432             : ! !IROUTINE: HCOX_DustGinoux_Init
         433             : !
         434             : ! !DESCRIPTION: Subroutine HcoX\_DustGinoux\_Init initializes the HEMCO
         435             : ! DUSTGINOUX extension.
         436             : !\\
         437             : !\\
         438             : ! !INTERFACE:
         439             : !
         440           0 :   SUBROUTINE HcoX_DustGinoux_Init( HcoState, ExtName, ExtState, RC )
         441             : !
         442             : ! !USES:
         443             : !
         444             :     USE HCO_ExtList_Mod, ONLY : GetExtNr, GetExtOpt
         445             :     USE HCO_State_Mod,   ONLY : HCO_GetExtHcoID
         446             : !
         447             : ! !INPUT PARAMETERS:
         448             : !
         449             :     TYPE(HCO_State),  POINTER        :: HcoState   ! HEMCO State object
         450             :     CHARACTER(LEN=*), INTENT(IN   )  :: ExtName    ! Extension name
         451             :     TYPE(Ext_State),  POINTER        :: ExtState   ! Extension options
         452             : !
         453             : ! !INPUT/OUTPUT PARAMETERS:
         454             : !
         455             :     INTEGER,          INTENT(INOUT)  :: RC         ! Success or failure?
         456             : !
         457             : ! !REVISION HISTORY:
         458             : !  11 Dec 2013 - C. Keller   - Now a HEMCO extension
         459             : !  See https://github.com/geoschem/hemco for complete history
         460             : !EOP
         461             : !------------------------------------------------------------------------------
         462             : !BOC
         463             : !
         464             : ! !LOCAL VARIABLES:
         465             : !
         466             :     ! Scalars
         467             :     INTEGER                        :: N, AS, nSpc, nSpcAlk, ExtNr
         468             :     CHARACTER(LEN=255)             :: MSG, LOC
         469             :     REAL(dp)                       :: Mp, Rp, TmpScal
         470             :     LOGICAL                        :: FOUND
         471             :
         472             :     ! Arrays
         473           0 :     CHARACTER(LEN=31), ALLOCATABLE :: SpcNames(:)
         474           0 :     CHARACTER(LEN=31), ALLOCATABLE :: SpcNamesAlk(:)
         475             :
         476             :     ! Pointers
         477             :     TYPE(MyInst), POINTER          :: Inst
         478             :
         479             :     !=======================================================================
         480             :     ! HCOX_DUSTGINOUX_INIT begins here!
         481             :     !=======================================================================
         482           0 :     LOC = 'HCOX_DUSTGINOUX_INIT (HCOX_DUSTGINOUX_MOD.F90)'
         483             :
         484             :     ! Extension Nr.
         485           0 :     ExtNr = GetExtNr( HcoState%Config%ExtList, TRIM(ExtName) )
         486           0 :     IF ( ExtNr <= 0 ) RETURN
         487             :
         488             :     ! Create Instance
         489           0 :     Inst => NULL()
         490           0 :     CALL InstCreate ( ExtNr, ExtState%DustGinoux, Inst, RC )
         491           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         492           0 :        CALL HCO_ERROR ( 'Cannot create DustGinoux instance', RC )
         493           0 :        RETURN
         494             :     ENDIF
         495             :     ! Also fill Inst%ExtNr
         496           0 :     Inst%ExtNr = ExtNr
         497             :
         498             :     ! Check for dust alkalinity option
         499           0 :     Inst%ExtNrAlk = GetExtNr( HcoState%Config%ExtList, 'DustAlk' )
         500             :
         501             :     ! Enter
         502           0 :     CALL HCO_ENTER(HcoState%Config%Err, LOC, RC)
         503           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         504           0 :         CALL HCO_ERROR( 'ERROR 4', RC, THISLOC=LOC )
         505           0 :         RETURN
         506             :     ENDIF
         507             :
         508             :     ! Get the expected number of dust species
         509           0 :     Inst%NBINS = HcoState%nDust
         510             :
         511             :     ! Get the actual number of dust species defined for DustGinoux extension
         512             :     CALL HCO_GetExtHcoID( HcoState, Inst%ExtNr, Inst%HcoIDs, &
         513           0 :                           SpcNames, nSpc, RC )
         514           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         515           0 :         CALL HCO_ERROR( 'ERROR 5', RC, THISLOC=LOC )
         516           0 :         RETURN
         517             :     ENDIF
         518             :
         519             :     ! Get the dust alkalinity species defined for DustAlk option
         520           0 :     IF ( Inst%ExtNrAlk > 0 ) THEN
         521             :        CALL HCO_GetExtHcoID( HcoState,    Inst%ExtNrAlk, Inst%HcoIDsAlk, &
         522           0 :                              SpcNamesAlk, nSpcAlk,  RC)
         523           0 :        IF ( RC /= HCO_SUCCESS ) THEN
         524           0 :            CALL HCO_ERROR( 'ERROR 6', RC, THISLOC=LOC )
         525           0 :            RETURN
         526             :        ENDIF
         527             :     ENDIF
         528             :
         529             :     ! Make sure the # of dust species is as expected
         530           0 :     IF ( nSpc /= Inst%NBINS ) THEN
         531           0 :        WRITE( MSG, 100 ) Inst%NBINS, nSpc
         532             :  100   FORMAT( 'Expected ', i3, ' DustGinoux species but only found ', i3, &
         533             :                ' in the HEMCO configuration file!  Exiting...' )
         534           0 :        CALL HCO_ERROR(MSG, RC )
         535           0 :        RETURN
         536             :     ENDIF
         537             :
         538             :     ! Set scale factor: first try to read from configuration file. If
         539             :     ! not specified, call wrapper function which sets teh scale factor
         540             :     ! based upon compiler switches.
         541             :     CALL GetExtOpt( HcoState%Config, Inst%ExtNr, 'Mass tuning factor', &
         542           0 :                      OptValDp=TmpScal, Found=FOUND, RC=RC )
         543           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         544           0 :         CALL HCO_ERROR( 'ERROR 7', RC, THISLOC=LOC )
         545           0 :         RETURN
         546             :     ENDIF
         547             :
         548             :     ! Set parameter FLX_MSS_FDG_FCT to specified tuning factor. Get from
         549             :     ! wrapper routine if not defined in configuration file
         550           0 :     IF ( FOUND ) THEN
         551           0 :        Inst%CH_DUST = TmpScal
         552             :     ELSE
         553             :        ! Get global mass flux tuning factor
         554           0 :        Inst%CH_DUST = HcoX_DustGinoux_GetCHDust( Inst, HcoState )
         555           0 :        IF ( Inst%CH_DUST < 0.0_dp ) THEN
         556           0 :           RC = HCO_FAIL
         557           0 :           RETURN
         558             :        ENDIF
         559             :     ENDIF
         560             :
         561             :     ! Verbose mode
         562           0 :     IF ( HcoState%amIRoot ) THEN
         563             :
         564             :        ! Write the name of the extension regardless of the verbose setting
         565           0 :        msg = 'Using HEMCO extension: DustGinoux (dust mobilization)'
         566           0 :        IF ( HCO_IsVerb( HcoState%Config%Err ) ) THEN
         567           0 :           CALL HCO_Msg( HcoState%Config%Err, sep1='-' ) ! with separator
         568             :        ELSE
         569           0 :           CALL HCO_Msg( msg, verb=.TRUE.              ) ! w/o separator
         570             :        ENDIF
         571             :
         572             :        ! Write all other messages as debug printout only
         573           0 :        IF ( Inst%ExtNrAlk > 0 ) THEN
         574           0 :           MSG = 'Use dust alkalinity option'
         575           0 :           CALL HCO_MSG(HcoState%Config%Err,MSG, SEP1='-' )
         576             :        ENDIF
         577             :
         578           0 :        MSG = 'Use the following species (Name: HcoID):'
         579           0 :        CALL HCO_MSG(HcoState%Config%Err,MSG)
         580           0 :        DO N = 1, nSpc
         581           0 :           WRITE(MSG,*) TRIM(SpcNames(N)), ':', Inst%HcoIDs(N)
         582           0 :           CALL HCO_MSG(HcoState%Config%Err,MSG)
         583             :        ENDDO
         584           0 :        IF ( Inst%ExtNrAlk > 0 ) THEN
         585           0 :           DO N = 1, nSpcAlk
         586           0 :              WRITE(MSG,*) TRIM(SpcNamesAlk(N)), ':', Inst%HcoIDsAlk(N)
         587           0 :              CALL HCO_MSG(HcoState%Config%Err,MSG)
         588             :           ENDDO
         589             :        ENDIF
         590             :
         591           0 :        WRITE(MSG,*) 'Global mass flux tuning factor: ', Inst%CH_DUST
         592           0 :        CALL HCO_MSG(HcoState%Config%Err,MSG,SEP2='-')
         593             :     ENDIF
         594             :
         595             :     ! Allocate vectors holding bin-specific informations
         596           0 :     ALLOCATE ( Inst%IPOINT  (Inst%NBINS) )
         597           0 :     ALLOCATE ( Inst%FRAC_S  (Inst%NBINS) )
         598           0 :     ALLOCATE ( Inst%DUSTDEN (Inst%NBINS) )
         599           0 :     ALLOCATE ( Inst%DUSTREFF(Inst%NBINS) )
         600           0 :     ALLOCATE ( Inst%FLUX    (HcoState%NX,HcoState%NY,Inst%NBINS) )
         601           0 :     ALLOCATE ( Inst%FLUX_ALK(HcoState%NX,HcoState%NY,Inst%NBINS) )
         602             :
         603             :     ! Allocate arrays
         604             :     ALLOCATE ( Inst%SRCE_SAND ( HcoState%NX, HcoState%NY ), &
         605             :                Inst%SRCE_SILT ( HcoState%NX, HcoState%NY ), &
         606             :                Inst%SRCE_CLAY ( HcoState%NX, HcoState%NY ), &
         607           0 :                STAT = AS )
         608           0 :     IF ( AS /= 0 ) THEN
         609           0 :        CALL HCO_ERROR('Allocation error', RC )
         610           0 :        RETURN
         611             :     ENDIF
         612             :
         613             :     ! Init
         614           0 :     Inst%FLUX      = 0.0_hp
         615           0 :     Inst%FLUX_ALK  = 0.0_hp
         616           0 :     Inst%SRCE_SAND = 0.0_hp
         617           0 :     Inst%SRCE_SILT = 0.0_hp
         618           0 :     Inst%SRCE_CLAY = 0.0_hp
         619             :
         620             :
         621             :     !=======================================================================
         622             :     ! Setup for simulations that use 4 dust bins (w/ or w/o TOMAS)
         623             :     !=======================================================================
         624             :
         625             :     ! Fill bin-specific information
         626           0 :     IF ( Inst%NBINS == 4 ) THEN
         627             :
         628           0 :        Inst%IPOINT  (1:Inst%NBINS) = (/ 3,       2,       2,       2       /)
         629           0 :        Inst%FRAC_S  (1:Inst%NBINS) = (/ 0.095d0, 0.3d0,   0.3d0,   0.3d0   /)
         630           0 :        Inst%DUSTDEN (1:Inst%NBINS) = (/ 2500.d0, 2650.d0, 2650.d0, 2650.d0 /)
         631           0 :        Inst%DUSTREFF(1:Inst%NBINS) = (/ 0.73d-6, 1.4d-6,  2.4d-6,  4.5d-6  /)
         632             :
         633             :     ELSE
         634             :
         635             : #if !defined( TOMAS )
         636           0 :        MSG = 'Cannot have > 4 GINOUX dust bins unless you are using TOMAS!'
         637           0 :        CALL HCO_ERROR(MSG, RC )
         638           0 :        RETURN
         639             : #endif
         640             :
         641             :     ENDIF
         642             :
         643             : #if defined( TOMAS )
         644             :
         645             :     !=======================================================================
         646             :     ! Setup for TOMAS simulations using more than 4 dust bins
         647             :     !
         648             :     ! from Ginoux:
         649             :     ! The U.S. Department of Agriculture (USDA) defines particles
         650             :     ! with a radius between 1 um and 25 um as silt, and below 1 um
         651             :     ! as clay [Hillel, 1982]. Mineralogical silt particles are mainly
         652             :     ! composed of quartz, but they are often coated with strongly
         653             :     ! adherent clay such that their physicochemical properties are
         654             :     ! similar to clay [Hillel, 1982].
         655             :     !
         656             :     ! SRCE_FUNC Source function
         657             :     ! for 1: Sand, 2: Silt, 3: Clay
         658             :     !=======================================================================
         659             :     IF ( Inst%NBINS == HcoState%MicroPhys%nBins ) THEN
         660             :
         661             :        !--------------------------------------------------------------------
         662             :        ! Define the IPOINT array based on particle size
         663             :        !--------------------------------------------------------------------
         664             :
         665             :        ! Loop over # of TOMAS bins
         666             :        DO N = 1, HcoState%MicroPhys%nBins
         667             :
         668             :           ! Compute particle mass and radius
         669             :           Mp = 1.4 * HcoState%MicroPhys%BinBound(N)
         670             :           Rp = ( ( Mp /2500. ) * (3./(4.*HcoState%Phys%PI)))**(0.333)
         671             :
         672             :           ! Pick the source function based on particle size
         673             :           IF ( Rp < 1.d-6 ) THEN
         674             :              Inst%IPOINT(N) = 3
         675             :           ELSE
         676             :              Inst%IPOINT(N) = 2
         677             :           END IF
         678             :        END DO
         679             :
         680             :        !--------------------------------------------------------------------
         681             :        ! Set up dust density (DUSTDEN) array
         682             :        !--------------------------------------------------------------------
         683             :        DO N = 1, HcoState%MicroPhys%nBins
         684             :           IF ( HcoState%MicroPhys%BinBound(N) < 4.0D-15 ) THEN
         685             :              Inst%DUSTDEN(N)  = 2500.d0
         686             :           ELSE
         687             :              Inst%DUSTDEN(N)  = 2650.d0
         688             :           ENDIF
         689             :        ENDDO
         690             :
         691             :        !--------------------------------------------------------------------
         692             :        ! Set up dust density (DUSTDEN) array
         693             :        !--------------------------------------------------------------------
         694             :        DO N = 1, HcoState%MicroPhys%nBins
         695             :           Inst%DUSTREFF(N) = 0.5d0                                    &
         696             :                       * ( SQRT( HcoState%MicroPhys%BinBound(N) *      &
         697             :                                 HcoState%MicroPhys%BinBound(N+1) )    &
         698             :                       /   Inst%DUSTDEN(N) * 6.d0/HcoState%Phys%PI )**( 0.333d0 )
         699             :        ENDDO
         700             :
         701             :        !--------------------------------------------------------------------
         702             :        ! Set up the FRAC_S array
         703             :        !--------------------------------------------------------------------
         704             :
         705             :        ! Initialize
         706             :        Inst%FRAC_S( 1:HcoState%MicroPhys%nBins )           = 0d0
         707             :
         708             : # if  defined( TOMAS12 ) || defined( TOMAS15 )
         709             :
         710             :        !---------------------------------------------------
         711             :        ! TOMAS simulations with 12 or 15 size bins
         712             :        !---------------------------------------------------
         713             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 1  )  = 7.33E-10
         714             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 2  )  = 2.032E-08
         715             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 3  )  = 3.849E-07
         716             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 4  )  = 5.01E-06
         717             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 5  )  = 4.45E-05
         718             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 6  )  = 2.714E-04
         719             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 7  )  = 1.133E-03
         720             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 8  )  = 3.27E-03
         721             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 9  )  = 6.81E-03
         722             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 10 )  = 1.276E-02
         723             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 11 )  = 2.155E-01
         724             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 12 )  = 6.085E-01
         725             :
         726             : # else
         727             :
         728             :        !---------------------------------------------------
         729             :        ! TOMAS simulations with 30 or 40 size bins
         730             :        !---------------------------------------------------
         731             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins +  1 )  = 1.05d-10
         732             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins +  2 )  = 6.28d-10
         733             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins +  3 )  = 3.42d-09
         734             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins +  4 )  = 1.69d-08
         735             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins +  5 )  = 7.59d-08
         736             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins +  6 )  = 3.09d-07
         737             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins +  7 )  = 1.15d-06
         738             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins +  8 )  = 3.86d-06
         739             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins +  9 )  = 1.18d-05
         740             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 10 )  = 3.27d-05
         741             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 11 )  = 8.24d-05
         742             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 12 )  = 1.89d-04
         743             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 13 )  = 3.92d-04
         744             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 14 )  = 7.41d-04
         745             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 15 )  = 1.27d-03
         746             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 16 )  = 2.00d-03
         747             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 17 )  = 2.89d-03
         748             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 18 )  = 3.92d-03
         749             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 19 )  = 5.26d-03
         750             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 20 )  = 7.50d-03
         751             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 21 )  = 1.20d-02
         752             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 22 )  = 2.08d-02
         753             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 23 )  = 3.62d-02
         754             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 24 )  = 5.91d-02
         755             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 25 )  = 8.74d-02
         756             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 26 )  = 1.15d-01
         757             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 27 )  = 1.34d-01
         758             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 28 )  = 1.37d-01
         759             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 29 )  = 1.24d-01
         760             :        Inst%FRAC_S( HcoState%MicroPhys%nActiveModeBins + 30 )  = 9.85d-02
         761             :
         762             : # endif
         763             :
         764             :     ELSE
         765             :
         766             :        ! Stop w/ error message
         767             :        CALL HCO_ERROR( 'Wrong number of TOMAS dust bins!', RC )
         768             :
         769             :     ENDIF
         770             :
         771             : #endif
         772             :
         773             :     !=====================================================================
         774             :     ! Activate fields in ExtState used by Ginoux dust
         775             :     !=====================================================================
         776             :
         777             :     ! Activate met. fields required by this module
         778           0 :     ExtState%U10M%DoUse    = .TRUE.
         779           0 :     ExtState%V10M%DoUse    = .TRUE.
         780           0 :     ExtState%GWETTOP%DoUse = .TRUE.
         781             :
         782             :     !=======================================================================
         783             :     ! Leave w/ success
         784             :     !=======================================================================
         785           0 :     IF ( ALLOCATED(SpcNames) ) DEALLOCATE(SpcNames)
         786             :
         787             :     ! Nullify pointers
         788           0 :     Inst    => NULL()
         789             :
         790           0 :     CALL HCO_LEAVE( HcoState%Config%Err,RC )
         791             :
         792           0 :   END SUBROUTINE HcoX_DustGinoux_Init
         793             : !EOC
         794             : !------------------------------------------------------------------------------
         795             : !                   Harmonized Emissions Component (HEMCO)                    !
         796             : !------------------------------------------------------------------------------
         797             : !BOP
         798             : !
         799             : ! !IROUTINE: HCOX_DustGinoux_Final
         800             : !
         801             : ! !DESCRIPTION: Subroutine HcoX\_DustGinoux\_Final finalizes the HEMCO
         802             : ! DUSTGINOUX extension.
         803             : !\\
         804             : !\\
         805             : ! !INTERFACE:
         806             : !
         807           0 :   SUBROUTINE HcoX_DustGinoux_Final( ExtState )
         808             : !
         809             : ! !INPUT PARAMETERS:
         810             : !
         811             :     TYPE(Ext_State),  POINTER       :: ExtState   ! Module options
         812             : !
         813             : ! !REVISION HISTORY:
         814             : !  11 Dec 2013 - C. Keller - Now a HEMCO extension
         815             : !  See https://github.com/geoschem/hemco for complete history
         816             : !EOP
         817             : !------------------------------------------------------------------------------
         818             : !BOC
         819             :
         820             :     !=======================================================================
         821             :     ! HCOX_DUSTGINOUX_FINAL begins here!
         822             :     !=======================================================================
         823             :
         824           0 :     CALL InstRemove ( ExtState%DustGinoux )
         825             :
         826             :
         827             :
         828           0 :   END SUBROUTINE HcoX_DustGinoux_Final
         829             : !EOC
         830             : !------------------------------------------------------------------------------
         831             : !                   Harmonized Emissions Component (HEMCO)                    !
         832             : !------------------------------------------------------------------------------
         833             : !BOP
         834             : !
         835             : ! !IROUTINE: HCOX_DustGinoux_GetChDust
         836             : !
         837             : ! !DESCRIPTION: Function HCOX\_DustGinoux\_GetChDust returns the CH\_DUST
         838             : ! parameter for the current simulation type.
         839             : !\\
         840             : !\\
         841             : ! !INTERFACE:
         842             : !
         843           0 :   FUNCTION HCOX_DustGinoux_GetChDust( Inst, HcoState ) RESULT( CH_DUST )
         844             : !
         845             : ! !INPUT PARAMETERS:
         846             : !
         847             :     TYPE(MyInst),    POINTER        :: Inst      ! Instance
         848             :     TYPE(HCO_State), POINTER        :: HcoState  ! Hemco state
         849             : !
         850             : ! !RETURN VALUE:
         851             : !
         852             :     REAL*8 :: CH_DUST
         853             : !
         854             : ! !REMARKS:
         855             : !  The logic in the #ifdefs may need to be cleaned up later on.  We have
         856             : !  just replicated the existing code in pre-HEMCO versions of dust_mod.F.
         857             : !
         858             : ! !REVISION HISTORY:
         859             : !  11 Dec 2013 - C. Keller   - Initial version
         860             : !  See https://github.com/geoschem/hemco for complete history
         861             : !EOP
         862             : !------------------------------------------------------------------------------
         863             : !BOC
         864             : !
         865             : ! !LOCAL VARIABLES:
         866             : !
         867             :     ! Transfer coeff for type natural source  (kg*s2/m5)
         868             :     ! Emission reduction factor for China-nested grid domain (win, 4/27/08)
         869             :
         870           0 :     IF ( TRIM(HcoState%Config%GridRes)  == '4.0x5.0'  ) THEN
         871             :
         872             :        !-----------------------------------------------------------------------
         873             :        ! All 4x5 simulations (including TOMAS)
         874             :        !-----------------------------------------------------------------------
         875           0 :        Inst%CH_DUST  = 9.375d-10
         876             :
         877             :     ELSE
         878             :
         879             :        !-----------------------------------------------------------------------
         880             :        ! All other resolutions
         881             :        !-----------------------------------------------------------------------
         882             :
         883             :        ! Start w/ same value as for 4x5
         884           0 :        Inst%CH_DUST  = 9.375d-10
         885             :
         886             : #if defined( TOMAS )
         887             :        ! KLUDGE: For TOMAS simulations at grids higher than 4x5 (e.g. 2x25),
         888             :        ! then multiplyCH_DUST by 0.75.  (Sal Farina)
         889             :        Inst%CH_DUST  = Inst%CH_DUST * 0.75d0
         890             : #endif
         891             :
         892             :     ENDIF
         893             :
         894           0 :   END FUNCTION HCOX_DustGinoux_GetChDust
         895             : !EOC
         896             : !------------------------------------------------------------------------------
         897             : !                   Harmonized Emissions Component (HEMCO)                    !
         898             : !------------------------------------------------------------------------------
         899             : !BOP
         900             : !
         901             : ! !IROUTINE: InstGet
         902             : !
         903             : ! !DESCRIPTION: Subroutine InstGet returns a poiner to the desired instance.
         904             : !\\
         905             : !\\
         906             : ! !INTERFACE:
         907             : !
         908           0 :   SUBROUTINE InstGet ( Instance, Inst, RC, PrevInst )
         909             : !
         910             : ! !INPUT PARAMETERS:
         911             : !
         912             :     INTEGER                             :: Instance
         913             :     TYPE(MyInst),     POINTER           :: Inst
         914             :     INTEGER                             :: RC
         915             :     TYPE(MyInst),     POINTER, OPTIONAL :: PrevInst
         916             : !
         917             : ! !REVISION HISTORY:
         918             : !  18 Feb 2016 - C. Keller   - Initial version
         919             : !  See https://github.com/geoschem/hemco for complete history
         920             : !EOP
         921             : !------------------------------------------------------------------------------
         922             : !BOC
         923             :     TYPE(MyInst),     POINTER    :: PrvInst
         924             :
         925             :     !=================================================================
         926             :     ! InstGet begins here!
         927             :     !=================================================================
         928             :
         929             :     ! Get instance. Also archive previous instance.
         930           0 :     PrvInst => NULL()
         931           0 :     Inst    => AllInst
         932           0 :     DO WHILE ( ASSOCIATED(Inst) )
         933           0 :        IF ( Inst%Instance == Instance ) EXIT
         934           0 :        PrvInst => Inst
         935           0 :        Inst    => Inst%NextInst
         936             :     END DO
         937           0 :     IF ( .NOT. ASSOCIATED( Inst ) ) THEN
         938           0 :        RC = HCO_FAIL
         939           0 :        RETURN
         940             :     ENDIF
         941             :
         942             :     ! Pass output arguments
         943           0 :     IF ( PRESENT(PrevInst) ) PrevInst => PrvInst
         944             :
         945             :     ! Cleanup & Return
         946           0 :     PrvInst => NULL()
         947           0 :     RC = HCO_SUCCESS
         948             :
         949             :   END SUBROUTINE InstGet
         950             : !EOC
         951             : !------------------------------------------------------------------------------
         952             : !                   Harmonized Emissions Component (HEMCO)                    !
         953             : !------------------------------------------------------------------------------
         954             : !BOP
         955             : !
         956             : ! !IROUTINE: InstCreate
         957             : !
         958             : ! !DESCRIPTION: Subroutine InstCreate creates a new instance.
         959             : !\\
         960             : !\\
         961             : ! !INTERFACE:
         962             : !
         963           0 :   SUBROUTINE InstCreate ( ExtNr, Instance, Inst, RC )
         964             : !
         965             : ! !INPUT PARAMETERS:
         966             : !
         967             :     INTEGER,       INTENT(IN)       :: ExtNr
         968             : !
         969             : ! !OUTPUT PARAMETERS:
         970             : !
         971             :     INTEGER,       INTENT(  OUT)    :: Instance
         972             :     TYPE(MyInst),  POINTER          :: Inst
         973             : !
         974             : ! !INPUT/OUTPUT PARAMETERS:
         975             : !
         976             :     INTEGER,       INTENT(INOUT)    :: RC
         977             : !
         978             : ! !REVISION HISTORY:
         979             : !  18 Feb 2016 - C. Keller   - Initial version
         980             : !  See https://github.com/geoschem/hemco for complete history
         981             : !EOP
         982             : !------------------------------------------------------------------------------
         983             : !BOC
         984             :     TYPE(MyInst), POINTER          :: TmpInst
         985             :     INTEGER                        :: nnInst
         986             :
         987             :     !=================================================================
         988             :     ! InstCreate begins here!
         989             :     !=================================================================
         990             :
         991             :     ! ----------------------------------------------------------------
         992             :     ! Generic instance initialization
         993             :     ! ----------------------------------------------------------------
         994             :
         995             :     ! Initialize
         996           0 :     Inst => NULL()
         997             :
         998             :     ! Get number of already existing instances
         999           0 :     TmpInst => AllInst
        1000           0 :     nnInst = 0
        1001           0 :     DO WHILE ( ASSOCIATED(TmpInst) )
        1002           0 :        nnInst  =  nnInst + 1
        1003           0 :        TmpInst => TmpInst%NextInst
        1004             :     END DO
        1005             :
        1006             :     ! Create new instance
        1007           0 :     ALLOCATE(Inst)
        1008           0 :     Inst%Instance = nnInst + 1
        1009           0 :     Inst%ExtNr    = ExtNr
        1010             :
        1011             :     ! Attach to instance list
        1012           0 :     Inst%NextInst => AllInst
        1013           0 :     AllInst       => Inst
        1014             :
        1015             :     ! Update output instance
        1016           0 :     Instance = Inst%Instance
        1017             :
        1018             :     ! ----------------------------------------------------------------
        1019             :     ! Type specific initialization statements follow below
        1020             :     ! ----------------------------------------------------------------
        1021             :
        1022             :     ! Return w/ success
        1023           0 :     RC = HCO_SUCCESS
        1024             :
        1025           0 :   END SUBROUTINE InstCreate
        1026             : !EOC
        1027             : !------------------------------------------------------------------------------
        1028             : !                   Harmonized Emissions Component (HEMCO)                    !
        1029             : !------------------------------------------------------------------------------
        1030             : !BOP
        1031             : !BOP
        1032             : !
        1033             : ! !IROUTINE: InstRemove
        1034             : !
        1035             : ! !DESCRIPTION: Subroutine InstRemove creates a new instance.
        1036             : !\\
        1037             : !\\
        1038             : ! !INTERFACE:
        1039             : !
        1040           0 :   SUBROUTINE InstRemove ( Instance )
        1041             : !
        1042             : ! !INPUT PARAMETERS:
        1043             : !
        1044             :     INTEGER                         :: Instance
        1045             : !
        1046             : ! !REVISION HISTORY:
        1047             : !  18 Feb 2016 - C. Keller   - Initial version
        1048             : !  See https://github.com/geoschem/hemco for complete history
        1049             : !EOP
        1050             : !------------------------------------------------------------------------------
        1051             : !BOC
        1052             :     INTEGER                     :: RC
        1053             :     TYPE(MyInst), POINTER       :: PrevInst
        1054             :     TYPE(MyInst), POINTER       :: Inst
        1055             :
        1056             :     !=================================================================
        1057             :     ! InstRemove begins here!
        1058             :     !=================================================================
        1059             :
        1060             :     ! Init
        1061           0 :     PrevInst => NULL()
        1062           0 :     Inst     => NULL()
        1063             :
        1064             :     ! Get instance. Also archive previous instance.
        1065           0 :     CALL InstGet ( Instance, Inst, RC, PrevInst=PrevInst )
        1066             :
        1067             :     ! Instance-specific deallocation
        1068           0 :     IF ( ASSOCIATED(Inst) ) THEN
        1069             :
        1070             :        !---------------------------------------------------------------------
        1071             :        ! Deallocate fields of Inst before popping Inst off the list
        1072             :        ! in order to avoid memory leaks (Bob Yantosca, 17 Aug 2020)
        1073             :        !---------------------------------------------------------------------
        1074           0 :        IF ( ASSOCIATED( Inst%SRCE_SAND ) ) THEN
        1075           0 :           DEALLOCATE( Inst%SRCE_SAND )
        1076             :        ENDIF
        1077           0 :        Inst%SRCE_SAND => NULL()
        1078             :
        1079           0 :        IF ( ASSOCIATED( Inst%SRCE_SILT ) ) THEN
        1080           0 :           DEALLOCATE( Inst%SRCE_SILT )
        1081             :        ENDIF
        1082           0 :        Inst%SRCE_SILT => NULL()
        1083             :
        1084           0 :        IF ( ASSOCIATED( Inst%SRCE_CLAY ) ) THEN
        1085           0 :           DEALLOCATE( Inst%SRCE_CLAY )
        1086             :        ENDIF
        1087           0 :        Inst%SRCE_CLAY  => NULL()
        1088             :
        1089           0 :        IF ( ASSOCIATED( Inst%IPOINT ) ) THEN
        1090           0 :           DEALLOCATE( Inst%IPOINT )
        1091             :        ENDIF
        1092           0 :        Inst%IPOINT => NULL()
        1093             :
        1094           0 :        IF ( ASSOCIATED( Inst%FRAC_S ) ) THEN
        1095           0 :           DEALLOCATE( Inst%FRAC_S )
        1096             :        ENDIf
        1097           0 :        Inst%FRAC_S => NULL()
        1098             :
        1099           0 :        IF ( ASSOCIATED( Inst%DUSTDEN ) ) THEN
        1100           0 :           DEALLOCATE( Inst%DUSTDEN   )
        1101             :        ENDIF
        1102           0 :        Inst%DUSTDEN => NULL()
        1103             :
        1104           0 :        IF ( ASSOCIATED( Inst%DUSTREFF ) ) THEN
        1105           0 :           DEALLOCATE( Inst%DUSTREFF )
        1106             :        ENDIF
        1107           0 :        Inst%DUSTREFF => NULL()
        1108             :
        1109           0 :        IF ( ASSOCIATED( Inst%FLUX ) ) THEN
        1110           0 :           DEALLOCATE( Inst%FLUX )
        1111             :        ENDIF
        1112           0 :        Inst%FLUX => NULL()
        1113             :
        1114           0 :        IF ( ASSOCIATED( Inst%FLUX_ALK  ) ) THEN
        1115           0 :           DEALLOCATE( Inst%FLUX_ALK )
        1116             :        ENDIF
        1117           0 :        Inst%FLUX_ALK   => NULL()
        1118             :
        1119           0 :        IF ( ALLOCATED ( Inst%HcoIDs ) ) THEN
        1120           0 :           DEALLOCATE( Inst%HcoIDs  )
        1121             :        ENDIF
        1122             :
        1123           0 :        IF ( ALLOCATED ( Inst%HcoIDsALK ) ) THEN
        1124           0 :           DEALLOCATE( Inst%HcoIDsALK )
        1125             :        ENDIF
        1126             :
        1127             :        !---------------------------------------------------------------------
        1128             :        ! Pop off instance from list
        1129             :        !---------------------------------------------------------------------
        1130           0 :        IF ( ASSOCIATED(PrevInst) ) THEN
        1131           0 :           PrevInst%NextInst => Inst%NextInst
        1132             :        ELSE
        1133           0 :           AllInst => Inst%NextInst
        1134             :        ENDIF
        1135           0 :        DEALLOCATE(Inst)
        1136             :     ENDIF
        1137             :
        1138             :     ! Free pointers before exiting
        1139           0 :     PrevInst => NULL()
        1140           0 :     Inst     => NULL()
        1141             :
        1142           0 :    END SUBROUTINE InstRemove
        1143             : !EOC
        1144           0 : END MODULE HCOX_DustGinoux_Mod

Generated by: LCOV version 1.14