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

              Line data    Source code
           1             : !------------------------------------------------------------------------------
           2             : !                   Harmonized Emissions Component (HEMCO)                    !
           3             : !------------------------------------------------------------------------------
           4             : !BOP
           5             : !
           6             : ! !MODULE: hcox_dust_dead_mod.F
           7             : !
           8             : ! !DESCRIPTION: Module hcox\_dust\_dead\_mod.F contains routines and
           9             : !  variables from Charlie Zender's DEAD dust mobilization model.
          10             : !  Most routines are from Charlie Zender, but have been modified and/or
          11             : !  cleaned up for inclusion into GEOS-Chem.
          12             : !\\
          13             : !\\
          14             : ! This is a HEMCO extension module that uses many of the HEMCO core
          15             : ! utilities.
          16             : !\\
          17             : !\\
          18             : ! NOTE: The current (dust) code was validated at 2 x 2.5 resolution.
          19             : !  We have found that running at 4x5 we get much lower (~50%) dust
          20             : !  emissions than at 2x2.5.  Recommend we either find a way to scale
          21             : !  the U* computed in the dust module, or run a 1x1 and store the the
          22             : !  dust emissions, with which to drive lower resolution runs.
          23             : !  -- Duncan Fairlie, 1/25/07
          24             : !\\
          25             : !\\
          26             : !  (We'll) implement the [dust] code in the standard [GEOS-Chem]
          27             : !  model and put a warning about expected low bias when the simulation
          28             : !  is run at 4x5.  Whoever is interested in running dust at 4x5 in the
          29             : !  future can deal with making the fix.
          30             : !  -- Daniel Jacob, 1/25/07
          31             : !\\
          32             : !\\
          33             : ! !REFERENCES:
          34             : !
          35             : ! \begin{itemize}
          36             : ! \item Zender, C. S., Bian, H., and Newman, D.: Mineral Dust Entrainment and
          37             : !   Deposition (DEAD) model: Description and 1990s dust climatology,
          38             : !   Journal of Geophysical Research: Atmospheres, 108, 2003.
          39             : ! \end{itemize}
          40             : !
          41             : ! !INTERFACE:
          42             : !
          43             :       MODULE HCOX_DUSTDEAD_MOD
          44             : !
          45             : ! !USES:
          46             : !
          47             :       USE HCO_ERROR_MOD
          48             :       USE HCO_DIAGN_MOD
          49             :       USE HCOX_State_MOD,    ONLY : Ext_State
          50             :       USE HCO_STATE_MOD,     ONLY : HCO_State
          51             :
          52             :       IMPLICIT NONE
          53             :       PRIVATE
          54             : !
          55             : ! !PUBLIC MEMBER FUNCTIONS:
          56             : !
          57             :       PUBLIC :: HCOX_DustDead_Run
          58             :       PUBLIC :: HCOX_DustDead_Init
          59             :       PUBLIC :: HCOX_DustDead_Final
          60             : !
          61             : ! !REVISION HISTORY:
          62             : !  08 Apr 2004 - T. D. Fairlie - Initial version
          63             : !  See https://github.com/geoschem/hemco for complete history
          64             : !EOP
          65             : !------------------------------------------------------------------------------
          66             : !BOC
          67             : !
          68             : ! !MODULE VARIABLES:
          69             : !
          70             :       ! Now pack all local variables into customized instance
          71             :       TYPE :: MyInst
          72             :
          73             :        ! Fields required by module
          74             :        INTEGER                   :: Instance
          75             :        INTEGER                   :: ExtNr           ! Extension num for DustDead
          76             :        INTEGER                   :: ExtNrAlk        ! Extension num for DustAlk
          77             :        INTEGER, ALLOCATABLE      :: HcoIDs(:)       ! tracer IDs for DustDead
          78             :        INTEGER, ALLOCATABLE      :: HcoIDsAlk(:)    ! tracer IDs for DustAlk
          79             :        REAL*8                    :: FLX_MSS_FDG_FCT
          80             :
          81             :        !---------------------------------------
          82             :        ! 2-D pointers pointing to netCDF arrays
          83             :        !---------------------------------------
          84             :
          85             :        ! Time-invariant fields
          86             :        REAL(hp), POINTER         :: ERD_FCT_GEO  (:,:) => NULL()
          87             : !      REAL,    POINTER          :: ERD_FCT_HYDRO(:,:,:,:)
          88             : !      REAL,    POINTER          :: ERD_FCT_TOPO (:,:,:,:)
          89             : !      REAL,    POINTER          :: ERD_FCT_UNITY(:,:,:,:)
          90             : !      REAL,    POINTER          :: MBL_BSN_FCT  (:,:,:,:)
          91             :
          92             :        ! GOCART source function (tdf, bmy, 1/25/07)
          93             :        REAL(hp), POINTER          :: SRCE_FUNC(:,:) => NULL()
          94             :
          95             :        ! Land surface that is not lake or wetland (by area)
          96             :        REAL(hp), POINTER          :: LND_FRC_DRY  (:,:) => NULL()
          97             :        REAL(hp), POINTER          :: MSS_FRC_CACO3(:,:) => NULL()
          98             :        REAL(hp), POINTER          :: MSS_FRC_CLY  (:,:) => NULL()
          99             :        REAL(hp), POINTER          :: MSS_FRC_SND  (:,:) => NULL()
         100             :        REAL(hp), POINTER          :: SFC_TYP      (:,:) => NULL()
         101             :        REAL(hp), POINTER          :: VAI_DST(:,:) => NULL()
         102             :
         103             :        ! Time-varying surface info from CTM
         104             : !       REAL*8,  ALLOCATABLE :: FLX_LW_DWN_SFC(:,:)
         105             : !       REAL*8,  ALLOCATABLE :: FLX_SW_ABS_SFC(:,:)
         106             : !       REAL*8,  ALLOCATABLE :: TPT_GND(:,:)
         107             : !       REAL*8,  ALLOCATABLE :: TPT_SOI(:,:)
         108             : !       REAL*8,  ALLOCATABLE :: VWC_SFC(:,:)
         109             :
         110             :        ! Variables initialized in dst_tvbds_ntp() and dst_tvbds_ini()
         111             : !       REAL*8,  ALLOCATABLE :: SRC_STR(:,:)
         112             :
         113             :        ! LSM plant type, 28 land surface types plus 0 for ocean
         114             :        ! Also account for 3 different land types in each grid box
         115             :        ! NN_SFCTYP denotes the highest possible surface type number.
         116             :        ! (ckeller, 07/24/2014)
         117             :        INTEGER, ALLOCATABLE :: PLN_TYP(:,:)
         118             :        REAL*8,  ALLOCATABLE :: PLN_FRC(:,:)
         119             :        REAL*8,  ALLOCATABLE :: TAI(:,:)
         120             :
         121             :        ! Other fields
         122             :        REAL*8,  ALLOCATABLE :: DMT_VWR(:)
         123             : !       REAL*8,  ALLOCATABLE :: DNS_AER(:)
         124             :        REAL*8,  ALLOCATABLE :: OVR_SRC_SNK_FRC(:,:)
         125             :        REAL*8,  ALLOCATABLE :: OVR_SRC_SNK_MSS(:,:)
         126             : !       INTEGER, ALLOCATABLE :: OROGRAPHY(:,:)
         127             :        REAL*8,  ALLOCATABLE :: DMT_MIN(:)
         128             :        REAL*8,  ALLOCATABLE :: DMT_MAX(:)
         129             :        REAL*8,  ALLOCATABLE :: DMT_VMA_SRC(:)
         130             :        REAL*8,  ALLOCATABLE :: GSD_ANL_SRC(:)
         131             :        REAL*8,  ALLOCATABLE :: MSS_FRC_SRC(:)
         132             :        TYPE(MyInst), POINTER :: NextInst => NULL()
         133             :       END TYPE MyInst
         134             :
         135             :       ! Pointer to instances
         136             :       TYPE(MyInst), POINTER :: AllInst => NULL()
         137             :
         138             :       !---------------------------------------
         139             :       ! MODULE PARAMETER
         140             :       !---------------------------------------
         141             :       INTEGER, PARAMETER   :: NBINS = 4       ! # of dust bins
         142             :       INTEGER, PARAMETER   :: NN_SFCTYP = 28
         143             :
         144             :       ! Fundamental physical constants
         145             :       REAL*8,  PARAMETER   :: GAS_CST_UNV      = 8.3144598d0
         146             :       REAL*8,  PARAMETER   :: MMW_H2O          = 1.8015259d-02
         147             :       REAL*8,  PARAMETER   :: MMW_DRY_AIR      = 28.97d-3
         148             :       REAL*8,  PARAMETER   :: CST_VON_KRM      = 0.4d0
         149             :       REAL*8,  PARAMETER   :: GRV_SFC          = 9.80665d0
         150             :       REAL*8,  PARAMETER   :: GAS_CST_DRY_AIR  = 287.0d0
         151             :       REAL*8,  PARAMETER   :: RDS_EARTH        = 6.37122d+6
         152             :       REAL*8,  PARAMETER   :: GAS_CST_H2O      = 461.65D0
         153             :       REAL*8,  PARAMETER   :: SPC_HEAT_DRY_AIR = 1005.0d0
         154             :       REAL*8,  PARAMETER   :: TPT_FRZ_PNT      = 273.15d0
         155             :
         156             :       ! Derived quantities
         157             :       REAL*8,  PARAMETER   :: GRV_SFC_RCP      = 1.0d0   / GRV_SFC
         158             :       REAL*8,  PARAMETER   :: CST_VON_KRM_RCP  = 1.0d0   / CST_VON_KRM
         159             :       REAL*8,  PARAMETER   :: EPS_H2O          = MMW_H2O / MMW_DRY_AIR
         160             :       REAL*8,  PARAMETER   :: EPS_H2O_RCP_M1   = -1.0d0  + MMW_DRY_AIR
         161             :      &                                                   / MMW_H2O
         162             :       REAL*8,  PARAMETER   :: KAPPA_DRY_AIR    = GAS_CST_DRY_AIR
         163             :      &                                         / SPC_HEAT_DRY_AIR
         164             :
         165             :       ! Fixed-size grid information
         166             :       INTEGER, PARAMETER   :: DST_SRC_NBR      = 3
         167             :       INTEGER, PARAMETER   :: MVT              = 14
         168             :
         169             :       CONTAINS
         170             : !EOC
         171             : !------------------------------------------------------------------------------
         172             : !                   Harmonized Emissions Component (HEMCO)                    !
         173             : !------------------------------------------------------------------------------
         174             : !BOP
         175             : !
         176             : ! !IROUTINE: HCOX_DustDead_Run
         177             : !
         178             : ! !DESCRIPTION: Subroutine HcoX\_DustDead\_Run is the driver routine
         179             : ! for the HEMCO DEAD dust extension.
         180             : !\\
         181             : !\\
         182             : ! !INTERFACE:
         183             : !
         184           0 :       SUBROUTINE HCOX_DustDead_Run( ExtState, HcoState, RC )
         185             : !
         186             : ! !USES:
         187             : !
         188             :       USE HCO_CALC_MOD,      ONLY : HCO_EvalFld, HCO_CalcEmis
         189             :       USE HCO_FLUXARR_MOD,   ONLY : HCO_EmisAdd
         190             :       USE HCO_CLOCK_MOD,     ONLY : HcoClock_Get
         191             :       USE HCO_CLOCK_MOD,     ONLY : HcoClock_First
         192             : !
         193             : ! !INPUT PARAMETERS:
         194             : !
         195             :       TYPE(Ext_State), POINTER        :: ExtState    ! Module options
         196             :       TYPE(HCO_State), POINTER        :: HcoState    ! Hemco state
         197             : !
         198             : ! !INPUT/OUTPUT PARAMETERS:
         199             : !
         200             :       INTEGER,         INTENT(INOUT)  :: RC
         201             :
         202             : ! !REVISION HISTORY:
         203             : !  08 Apr 2004 - T. D. Fairlie - Initial version
         204             : !  See https://github.com/geoschem/hemco for complete history
         205             : !EOP
         206             : !------------------------------------------------------------------------------
         207             : !BOC
         208             : !
         209             : ! !LOCAL VARIABLES:
         210             : !
         211             :       ! Scalars
         212             :       LOGICAL                :: ERR
         213             :       INTEGER                :: I,      J,      L,       N
         214             :       INTEGER                :: M,      IOS,    INC,     LAT_IDX
         215             :       INTEGER                :: NDB,    NSTEP,  intDOY
         216             :       REAL*8                 :: W10M,   DEN,    DIAM,    U_TS0
         217             :       REAL*8                 :: U_TS,   SRCE_P, Reynol,  YMID_R
         218             :       REAL*8                 :: ALPHA,  BETA,   GAMMA,   CW
         219             :       REAL*8                 :: XTAU,   P1,      P2
         220             :       REAL*8                 :: AREA_M2, DTSRCE,  DOY
         221             :
         222             :       ! Arrays
         223           0 :       INTEGER                :: OROGRAPHY(HcoState%NX,HcoState%NY)
         224             :       REAL*8                 :: PSLON(HcoState%NX)         ! surface pressure
         225           0 :       REAL*8                 :: PTHICK(HcoState%NX)        ! delta P (L=1)
         226           0 :       REAL*8                 :: PMID(HcoState%NX)          ! mid layer P (L=1)
         227           0 :       REAL*8                 :: TLON(HcoState%NX)          ! temperature (L=1)
         228           0 :       REAL*8                 :: THLON(HcoState%NX)         ! pot. temp. (L=1)
         229           0 :       REAL*8                 :: ULON(HcoState%NX)          ! U-wind (L=1)
         230           0 :       REAL*8                 :: VLON(HcoState%NX)          ! V-wind (L=1)
         231           0 :       REAL*8                 :: BHT2(HcoState%NX)          ! half box height (L=1)
         232           0 :       REAL*8                 :: Q_H2O(HcoState%NX)         ! specific humidity (L=1)
         233           0 :       REAL*8                 :: ORO(HcoState%NX)           ! "orography"
         234           0 :       REAL*8                 :: SNW_HGT_LQD(HcoState%NX)   ! equivalent snow ht.
         235           0 :       REAL*8                 :: DSRC(HcoState%NX,NBINS)    ! dust mixing ratio incr.
         236           0 :       REAL*8                 :: DUST_EMI_TOTAL(HcoState%NX) ! total dust emiss
         237             :
         238             :       ! Flux array [kg/m2/s]
         239             :       REAL(hp), TARGET       :: FLUX(HcoState%NX,
         240             :      &                               HcoState%NY,
         241           0 :      &                               NBINS)
         242             :
         243             :       ! Flux array for dust alkalinity [kg/m2/s]
         244             :       REAL(hp), TARGET       :: FLUX_ALK(HcoState%NX,
         245             :      &                                   HcoState%NY,
         246           0 :      &                                   NBINS)
         247             :
         248             :       ! Pointers
         249             :       TYPE(MyInst), POINTER  :: Inst
         250             :
         251             :       ! Strings
         252             :       CHARACTER(LEN=255)     :: MSG, LOC
         253             : !
         254             : ! !DEFINED PARAMETERS:
         255             : !
         256             : !      REAL*8, PARAMETER      :: Ch_dust = 9.375d-10
         257             : !      REAL*8, PARAMETER      :: g0      = 9.80665d0
         258             : !      REAL*8, PARAMETER      :: G       = g0 * 1.D2
         259             : !      REAL*8, PARAMETER      :: RHOA    = 1.25D-3
         260             :       REAL*8, PARAMETER      :: CP      = 1004.16d0
         261             :       REAL*8, PARAMETER      :: RGAS    = 8314.3d0 / 28.97d0
         262             :       REAL*8, PARAMETER      :: AKAP    = RGAS     / CP
         263             :       REAL*8, PARAMETER      :: P1000   = 1000d0
         264             :
         265             :       !=================================================================
         266             :       ! HCOX_DUSTDEAD_RUN begins here!
         267             :       !=================================================================
         268           0 :       LOC = 'HCOX_DUSTDEAD_RUN (HCOX_DUSTDEAD_MOD.F)'
         269             :
         270             :       ! Return if extension disabled
         271           0 :       IF ( ExtState%DustDead <= 0 ) RETURN
         272             :
         273             :       ! Enter
         274           0 :       CALL HCO_ENTER( HcoState%Config%Err, LOC, RC )
         275           0 :       IF ( RC /= HCO_SUCCESS ) THEN
         276           0 :           CALL HCO_ERROR( 'ERROR 0', RC, THISLOC=LOC )
         277           0 :           RETURN
         278             :       ENDIF
         279             :
         280             :       ! Get instance
         281           0 :       Inst => NULL()
         282           0 :       CALL InstGet ( ExtState%DustDead, Inst, RC )
         283           0 :       IF ( RC /= HCO_SUCCESS ) THEN
         284           0 :        WRITE(MSG,*) 'Cannot find DEAD instance Nr. ', ExtState%DustDead
         285           0 :        CALL HCO_ERROR(MSG,RC)
         286           0 :        RETURN
         287             :       ENDIF
         288             :
         289             :       !=================================================================
         290             :       ! Get pointers to gridded data imported through config. file
         291             :       !=================================================================
         292             :       !
         293             :       ! The following time-invariant fields are read in
         294             :       ! ERD_FCT_GEO    ; geomorphic erodibility:       HcoState%NX HcoState%NY
         295             :       ! ERD_FCT_HYDRO  ; hydrologic erodibility:       HcoState%NX HcoState%NY
         296             :       ! ERD_FCT_TOPO   ; topog. erodibility (Ginoux):  HcoState%NX HcoState%NY
         297             :       ! ERD_FCT_UNITY  ; uniform erodibility:          HcoState%NX HcoState%NY
         298             :       ! MBL_BSN_FCT    ; overall erodibility factor :  HcoState%NX HcoState%NY
         299             :       !
         300             :       ! Erodibility field should be copied onto mbl_bsn_fct
         301             :       ! which is the one used by the DEAD code   Duncan 8/1/2003
         302             :       !
         303             :       ! LND_FRC_DRY    ; dry land fraction:            HcoState%NX HcoState%NY
         304             :       ! MSS_FRC_CACO3  ; mass fraction of soil CaCO3:  HcoState%NX HcoState%NY
         305             :       ! MSS_FRC_CLY    ; mass fraction of clay:        HcoState%NX HcoState%NY
         306             :       ! MSS_FRC_SND    ; mass fraction of sand:        HcoState%NX HcoState%NY
         307             :       ! SFC_TYP        ; surface type:                 HcoState%NX HcoState%NY
         308             :       !=================================================================
         309             :       !IF ( HcoClock_First(HcoState%Clock,.TRUE.) ) THEN
         310             :          CALL HCO_EvalFld( HcoState, 'DEAD_EF_GEO',
         311           0 :      &                     Inst%ERD_FCT_GEO, RC)
         312           0 :          IF ( RC /= HCO_SUCCESS ) THEN
         313           0 :              CALL HCO_ERROR( 'ERROR 1', RC, THISLOC=LOC )
         314           0 :              RETURN
         315             :          ENDIF
         316             :
         317             :          CALL HCO_EvalFld( HcoState, 'DEAD_LF_DRY',
         318           0 :      &                     Inst%LND_FRC_DRY, RC)
         319           0 :          IF ( RC /= HCO_SUCCESS ) THEN
         320           0 :              CALL HCO_ERROR( 'ERROR 2', RC, THISLOC=LOC )
         321           0 :              RETURN
         322             :          ENDIF
         323             :
         324             :          CALL HCO_EvalFld( HcoState, 'DEAD_MF_CACO3',
         325           0 :      &                     Inst%MSS_FRC_CACO3,  RC )
         326           0 :          IF ( RC /= HCO_SUCCESS ) THEN
         327           0 :              CALL HCO_ERROR( 'ERROR 3', RC, THISLOC=LOC )
         328           0 :              RETURN
         329             :          ENDIF
         330             :
         331             :          CALL HCO_EvalFld( HcoState, 'DEAD_MF_CLY',
         332           0 :      &                     Inst%MSS_FRC_CLY, RC)
         333           0 :          IF ( RC /= HCO_SUCCESS ) THEN
         334           0 :              CALL HCO_ERROR( 'ERROR 4', RC, THISLOC=LOC )
         335           0 :              RETURN
         336             :          ENDIF
         337             :
         338             :          CALL HCO_EvalFld( HcoState, 'DEAD_MF_SND',
         339           0 :      &                     Inst%MSS_FRC_SND, RC)
         340           0 :          IF ( RC /= HCO_SUCCESS ) THEN
         341           0 :              CALL HCO_ERROR( 'ERROR 5', RC, THISLOC=LOC )
         342           0 :              RETURN
         343             :          ENDIF
         344             :
         345             :          CALL HCO_EvalFld( HcoState, 'DEAD_SFC_TYP',
         346           0 :      &                     Inst%SFC_TYP, RC )
         347           0 :          IF ( RC /= HCO_SUCCESS ) THEN
         348           0 :              CALL HCO_ERROR( 'ERROR 6', RC, THISLOC=LOC )
         349           0 :              RETURN
         350             :          ENDIF
         351             :
         352             :          CALL HCO_EvalFld( HcoState, 'DEAD_GOC_SRC',
         353           0 :      &                     Inst%SRCE_FUNC, RC )
         354           0 :          IF ( RC /= HCO_SUCCESS ) THEN
         355           0 :              CALL HCO_ERROR( 'ERROR 7', RC, THISLOC=LOC )
         356           0 :              RETURN
         357             :          ENDIF
         358             :
         359             :          CALL HCO_EvalFld( HcoState, 'DEAD_VAI',
         360           0 :      &                     Inst%VAI_DST, RC )
         361           0 :          IF ( RC /= HCO_SUCCESS ) THEN
         362           0 :              CALL HCO_ERROR( 'ERROR 8', RC, THISLOC=LOC )
         363           0 :              RETURN
         364             :          ENDIF
         365             :
         366             : !         FIRST = .FALSE.
         367             :       !ENDIF
         368             :
         369             :       !=================================================================
         370             :       ! CALL DUST MOBILIZATION SCHEME
         371             :       !=================================================================
         372             :
         373             :       ! Make OROGRAPHY array (0=Ocean; 1=Land; 2=Ice)
         374           0 :       CALL GET_ORO( HcoState, ExtState, OROGRAPHY, RC )
         375           0 :       IF ( RC /= HCO_SUCCESS ) THEN
         376           0 :           CALL HCO_ERROR( 'ERROR 9', RC, THISLOC=LOC )
         377           0 :           RETURN
         378             :       ENDIF
         379             :
         380             :       ! Get emissions time step
         381           0 :       DTSRCE = HcoState%TS_EMIS
         382             :
         383             :       ! Get day of year, convert to real!!
         384           0 :       CALL HcoClock_Get( HcoState%Clock, cDOY = intDOY, RC=RC )
         385           0 :       IF ( RC /= HCO_SUCCESS ) THEN
         386           0 :           CALL HCO_ERROR( 'ERROR 10', RC, THISLOC=LOC )
         387           0 :           RETURN
         388             :       ENDIF
         389           0 :       DOY = intDOY
         390             :
         391             :       ! Init
         392           0 :       FLUX(:,:,:)     = 0.0_hp
         393           0 :       FLUX_ALK(:,:,:) = 0.0_hp
         394             :
         395             :       ! Error check
         396           0 :       ERR = .FALSE.
         397             :
         398             : !$OMP PARALLEL DO
         399             : !$OMP+DEFAULT( SHARED )
         400             : !$OMP+PRIVATE( I,     J,      P1,    P2,   PTHICK,  PMID, TLON        )
         401             : !$OMP+PRIVATE( THLON, ULON,   VLON,  BHT2, Q_H2O,   ORO,  SNW_HGT_LQD )
         402             : !$OMP+PRIVATE( N,     YMID_R, DSRC,  RC,   AREA_M2, DUST_EMI_TOTAL    )
         403             :
         404             :       ! Loop over latitudes
         405           0 :       DO J = 1, HcoState%NY
         406             :
         407             :          ! Don't do calculations if there has been an error
         408           0 :          IF ( ERR ) CYCLE
         409             :
         410             :          ! Loop over longitudes
         411           0 :          DO I = 1, HcoState%NX
         412             :
         413             :             ! Pressure [Pa] at bottom and top edge of level 1
         414           0 :             P1             = HcoState%Grid%PEDGE%Val(I,J,1)
         415           0 :             P2             = HcoState%Grid%PEDGE%Val(I,J,2)
         416             :
         417             :             ! Pressure thickness of 1st layer [Pa]
         418           0 :             PTHICK(I)      = ( P1 - P2 )
         419             :
         420             :             ! Pressure at midpt of surface layer [Pa]
         421           0 :             PMID(I)        = ( P1 + P2 ) / 2.0_hp
         422             :
         423             :             ! Temperature [K] at midpoint of surface layer
         424           0 :             TLON(I)        = ExtState%TK%Arr%Val(I,J,1)
         425             :
         426             :             ! Potential temperature [K] at midpoint
         427           0 :             THLON(I)       = TLON(I) * ( P1000 / PMID(I) )**AKAP
         428             :
         429             :             ! U and V winds at surface [m/s]
         430             :             ! --> These variables won't be used at all...
         431           0 :             ULON(I)        = ExtState%U10M%Arr%Val(I,J)
         432           0 :             VLON(I)        = ExtState%V10M%Arr%Val(I,J)
         433             :
         434             :             ! Half box height at surface [m]
         435           0 :             BHT2(I)        = HcoState%Grid%BXHEIGHT_M%Val(I,J,1) / 2.d0
         436             :
         437             :             ! Specific humidity at midpoint of surface layer [kg H2O/kg air]
         438           0 :             Q_H2O(I)       = ExtState%SPHU%Arr%Val(I,J,1)
         439             :
         440             :             ! Orography at surface
         441             :             ! Ocean is 0; land is 1; ice is 2
         442           0 :             ORO(I)         = REAL(OROGRAPHY(I,J),KIND=dp)
         443             :
         444             :             ! Snow [m H2O]. SNOWHGT is in kg H2O/m2, which is equivalent to
         445             :             ! mm H2O. Convert to m H2O here.
         446           0 :             SNW_HGT_LQD(I) = ExtState%SNOWHGT%Arr%Val(I,J) / 1000.d0
         447             :
         448             :             ! Dust tracer and increments
         449           0 :             DSRC(I,:) = 0.0d0
         450             :          ENDDO !I
         451             :
         452             :          !==============================================================
         453             :          ! CALL DUST MOBILIZATION DRIVER (DST_MBL) FOR LATITUDE J
         454             :          !==============================================================
         455             :
         456             :          ! Latitude in RADIANS
         457           0 :          YMID_R = HcoState%Grid%YMID%Val(1,J) * HcoState%Phys%PI /180.d0
         458             :
         459             :          ! Call DEAD dust mobilization
         460             :          CALL DST_MBL( HcoState, ExtState,  Inst, DOY,
         461             :      &                 BHT2,   J,      YMID_R, ORO,
         462             :      &                 PTHICK, PMID,  Q_H2O,  DSRC,   SNW_HGT_LQD,
         463             :      &                 DTSRCE, TLON,  THLON,  VLON,   ULON,
         464           0 :      &                 J,      RC )
         465             :
         466             :          ! Error check
         467           0 :          IF ( RC /= HCO_SUCCESS ) THEN
         468             :             ERR = .TRUE.
         469             :             CYCLE
         470             :          ENDIF
         471             :
         472             :          ! Redistribute dust emissions using new dust size distribution
         473             :          ! scheme (L. Zhang, 6/26/15)
         474           0 :          DUST_EMI_TOTAL = 0.0d0
         475           0 :          DO N = 1, NBINS
         476           0 :             DUST_EMI_TOTAL(:) = DUST_EMI_TOTAL(:) + DSRC(:,N)
         477             :          ENDDO
         478           0 :          DSRC(:,1) = DUST_EMI_TOTAL(:) * 0.0766d0
         479           0 :          DSRC(:,2) = DUST_EMI_TOTAL(:) * 0.1924d0
         480           0 :          DSRC(:,3) = DUST_EMI_TOTAL(:) * 0.3491d0
         481           0 :          DSRC(:,4) = DUST_EMI_TOTAL(:) * 0.3819d0
         482             :
         483             :          ! Write to emissions array
         484           0 :          DO I = 1, HcoState%NX
         485             :
         486             :             ! Loop over dust tracers
         487             :             ! Write into flux array: kg/box --> kg/m2/s
         488           0 :             AREA_M2 = HcoState%Grid%AREA_M2%Val( I, J )
         489           0 :             DO N = 1, NBINS
         490             :
         491           0 :                IF ( Inst%HcoIDs(N) > 0 ) THEN
         492           0 :                   FLUX(I,J,N) = ( DSRC(I,N) / AREA_M2 / DTSRCE )
         493             :                ENDIF
         494             :
         495             :                ! Include DUST Alkalinity SOURCE, assuming an alkalinity
         496             :                ! of 4% by weight [kg].                  !tdf 05/10/08
         497             :                !tdf with 3% Ca, there's also 1% equ. Mg, makes 4%
         498           0 :                IF ( Inst%ExtNrAlk > 0 ) THEN
         499           0 :                   FLUX_ALK(I,J,N) = 0.04 * ( DSRC(I,N) / AREA_M2 /
         500           0 :      &                              DTSRCE )
         501             :                ENDIF
         502             :
         503             :             ENDDO !N
         504             :          ENDDO !I
         505             :       ENDDO !J
         506             : !$OMP END PARALLEL DO
         507             :
         508             :       ! Error check
         509           0 :       IF ( ERR ) THEN
         510           0 :          RC = HCO_FAIL
         511           0 :          RETURN
         512             :       ENDIF
         513             :
         514             :       !=================================================================
         515             :       ! PASS TO HEMCO STATE AND UPDATE DIAGNOSTICS
         516             :       !=================================================================
         517           0 :       DO N = 1, NBINS
         518             :
         519           0 :          IF ( Inst%HcoIDs(N) > 0 ) THEN
         520             :
         521             :             ! Add to emissions array
         522             :             CALL HCO_EmisAdd( HcoState, FLUX(:,:,N),
         523           0 :      &                        Inst%HcoIDs(N), RC,  ExtNr=Inst%ExtNr )
         524           0 :             IF ( RC /= HCO_SUCCESS ) THEN
         525           0 :                WRITE(MSG,*) 'HCO_EmisAdd error: dust bin ', N
         526           0 :                CALL HCO_ERROR(MSG, RC )
         527           0 :                RETURN
         528             :             ENDIF
         529             :
         530             :          ENDIF
         531             :
         532           0 :          IF ( Inst%ExtNrAlk > 0 ) THEN
         533           0 :             IF ( Inst%HcoIDsAlk(N) > 0 ) THEN
         534             :
         535             :                ! Add to dust alkalinity emissions array
         536             :                CALL HCO_EmisAdd( HcoState, FLUX_Alk(:,:,N),
         537             :      &                           Inst%HcoIDsAlk(N), RC,
         538           0 :      &                           ExtNr=Inst%ExtNrAlk )
         539           0 :                IF ( RC /= HCO_SUCCESS ) THEN
         540           0 :                   WRITE(MSG,*) 'HCO_EmisAdd error: dust alk bin ', N
         541           0 :                   CALL HCO_ERROR(MSG, RC )
         542           0 :                   RETURN
         543             :                ENDIF
         544             :
         545             :             ENDIF
         546             :          ENDIF
         547             :
         548             :       ENDDO !N
         549             :
         550             :       ! Return w/ success
         551           0 :       Inst => NULL()
         552           0 :       CALL HCO_LEAVE( HcoState%Config%Err, RC )
         553             :
         554             :       END SUBROUTINE HCOX_DustDead_Run
         555             : !EOC
         556             : !------------------------------------------------------------------------------
         557             : !                   Harmonized Emissions Component (HEMCO)                    !
         558             : !------------------------------------------------------------------------------
         559             : !BOP
         560             : !
         561             : ! !IROUTINE: HCOX_DustDead_Init
         562             : !
         563             : ! !DESCRIPTION: Subroutine HcoX\_DustDead\_Init initializes the HEMCO
         564             : ! DUST\_DEAD extension.
         565             : !\\
         566             : !\\
         567             : ! !INTERFACE:
         568             : !
         569           0 :       SUBROUTINE HCOX_DustDead_Init ( HcoState, ExtName,
         570             :      &                                ExtState,  RC                )
         571             : !
         572             : ! !USES:
         573             : !
         574             :       USE HCO_ExtList_Mod,    ONLY : GetExtNr, GetExtOpt
         575             :       USE HCO_STATE_MOD,      ONLY : HCO_GetExtHcoID
         576             : !
         577             : ! !INPUT PARAMETERS:
         578             : !
         579             :       TYPE(HCO_State),  POINTER        :: HcoState   ! Hemco state
         580             :       CHARACTER(LEN=*), INTENT(IN   )  :: ExtName    ! Extension name
         581             :       TYPE(Ext_State),  POINTER        :: ExtState     ! Module options
         582             : !
         583             : ! !INPUT/OUTPUT PARAMETERS:
         584             : !
         585             :       INTEGER,          INTENT(INOUT)  :: RC
         586             :
         587             : ! !REVISION HISTORY:
         588             : !  25 Nov 2013 - C. Keller   - Now a HEMCO extension
         589             : !  See https://github.com/geoschem/hemco for complete history
         590             : !EOP
         591             : !------------------------------------------------------------------------------
         592             : !BOC
         593             : !
         594             : ! !LOCAL VARIABLES:
         595             : !
         596             :       CHARACTER(LEN=255)             :: MSG, LOC
         597             :       INTEGER                        :: I, J, N, AS
         598             :       INTEGER                        :: ExtNr, nSpc
         599             :       INTEGER                        :: nSpcAlk
         600           0 :       CHARACTER(LEN=31), ALLOCATABLE :: SpcNames(:)
         601           0 :       CHARACTER(LEN=31), ALLOCATABLE :: SpcNamesAlk(:)
         602             :       REAL(dp)                       :: TmpScal
         603             :       LOGICAL                        :: FOUND
         604             :       TYPE(MyInst), POINTER          :: Inst
         605             : #if defined ( MODEL_GEOS )
         606             :       CHARACTER(LEN=2047)            :: TuningTable
         607             :       CHARACTER(LEN=2047), PARAMETER :: TuningTable_Default =
         608             :      &                                   'DustDead_TuningTable.txt'
         609             : #endif
         610             :
         611             :       !=================================================================
         612             :       ! HCOX_DUST_DEAD_INIT begins here!
         613             :       !=================================================================
         614           0 :       LOC = 'HCOX_DUST_DEAD_INIT (HCOX_DUSTDEAD_MOD.F)'
         615             :
         616             :       ! Extension Nr.
         617           0 :       ExtNr = GetExtNr( HcoState%Config%ExtList, TRIM(ExtName) )
         618           0 :       IF ( ExtNr <= 0 ) RETURN
         619             :
         620             :       ! Enter
         621           0 :       CALL HCO_ENTER ( HcoState%Config%Err, LOC, RC )
         622           0 :       IF ( RC /= HCO_SUCCESS ) THEN
         623           0 :           CALL HCO_ERROR( 'ERROR 11', RC, THISLOC=LOC )
         624           0 :           RETURN
         625             :       ENDIF
         626             :
         627             :       ! Create AeroCom instance for this simulation
         628           0 :       Inst => NULL()
         629           0 :       CALL InstCreate ( ExtNr, ExtState%DustDead, Inst, RC )
         630           0 :       IF ( RC /= HCO_SUCCESS ) THEN
         631             :        CALL HCO_ERROR (
         632           0 :      &                 'Cannot create DEAD instance', RC )
         633           0 :        RETURN
         634             :       ENDIF
         635             :
         636             :       ! Check for dust alkalinity option
         637           0 :       Inst%ExtNrAlk = GetExtNr( HcoState%Config%ExtList, 'DustAlk')
         638             :
         639             :       ! Get horizontal dimensions
         640           0 :       I = HcoState%NX
         641           0 :       J = HcoState%NY
         642             :
         643             :       !-----------------------------------------------------------------
         644             :       ! Get species IDs
         645             :       !-----------------------------------------------------------------
         646             :
         647             :       CALL HCO_GetExtHcoID( HcoState, ExtNr, Inst%HcoIDs,
         648           0 :      &                      SpcNames, nSpc, RC)
         649           0 :       IF ( RC /= HCO_SUCCESS ) THEN
         650           0 :           CALL HCO_ERROR( 'ERROR 12', RC, THISLOC=LOC )
         651           0 :           RETURN
         652             :       ENDIF
         653             :
         654             :       ! Get the dust alkalinity species defined for DustAlk option
         655           0 :       IF ( Inst%ExtNrAlk > 0 ) THEN
         656             :          CALL HCO_GetExtHcoID( HcoState,    Inst%ExtNrAlk,
         657             :      &                         Inst%HcoIDsAlk,
         658           0 :      &                         SpcNamesAlk, nSpcAlk,  RC)
         659           0 :          IF ( RC /= HCO_SUCCESS ) THEN
         660           0 :              CALL HCO_ERROR( 'ERROR 13', RC, THISLOC=LOC )
         661           0 :              RETURN
         662             :          ENDIF
         663             :       ENDIF
         664             :
         665             :       ! Sanity check
         666           0 :       IF ( nSpc /= NBINS ) THEN
         667           0 :          MSG = 'Dust DEAD model does not have four species!'
         668           0 :          CALL HCO_ERROR(MSG, RC )
         669           0 :          RETURN
         670             :       ENDIF
         671             :
         672             :       ! Set scale factor: first try to read from configuration file. If
         673             :       ! not specified, call wrapper function which sets teh scale factor
         674             :       ! based upon compiler switches.
         675             :       CALL GetExtOpt( HcoState%Config, ExtNr,
         676             :      &                 'Mass tuning factor',
         677           0 :      &                 OptValDp=TmpScal, Found=FOUND, RC=RC )
         678           0 :       IF ( RC /= HCO_SUCCESS ) THEN
         679           0 :           CALL HCO_ERROR( 'ERROR 14', RC, THISLOC=LOC )
         680           0 :           RETURN
         681             :       ENDIF
         682             :
         683             :       ! Set parameter FLX_MSS_FDG_FCT to specified tuning factor as
         684             :       ! defined in configuration file
         685           0 :       IF ( FOUND ) THEN
         686           0 :          Inst%FLX_MSS_FDG_FCT = TmpScal
         687             :       ELSE
         688           0 :          Inst%FLX_MSS_FDG_FCT = -999.0e0
         689             :       ENDIF
         690             :
         691             : #if defined ( MODEL_GEOS )
         692             :       ! Determine mass flux tuning factor based on grid resolution
         693             :       IF ( Inst%FLX_MSS_FDG_FCT == -999.0e0 ) THEN
         694             :          CALL GetExtOpt( HcoState%Config, ExtNr,
         695             :      &                    'Mass tuning table',
         696             :      &                    OptValChar=TuningTable, Found=FOUND, RC=RC )
         697             :          IF ( .NOT. FOUND ) TuningTable = TuningTable_Default
         698             :          CALL ReadTuningFactor(HcoState, TuningTable,
         699             :      &                         Inst%FLX_MSS_FDG_FCT, RC)
         700             :          IF ( RC /= HCO_SUCCESS ) THEN
         701             :             CALL HCO_ERROR( 'ERROR ReadTuningFactor', RC, THISLOC=LOC )
         702             :             RETURN
         703             :          ENDIF
         704             :       ENDIF
         705             : #endif
         706             :
         707             :       ! Error
         708           0 :       IF ( Inst%FLX_MSS_FDG_FCT == -999.0e0 ) THEN
         709             :          MSG = 'Mass flux tuning factor not defined. ' //
         710             :      &         'Please explicitly set it by modifying the line ' //
         711           0 :      &         '` --> Mass tuning factor: XX.X` in HEMCO_Config.rc. '
         712             :             CALL HCO_ERROR(MSG,
         713           0 :      &                     RC, THISLOC='HCOX_DustDead_Init')
         714           0 :          RETURN
         715             :       ENDIF
         716             :
         717             :       ! Verbose mode
         718           0 :       IF ( HcoState%amIRoot ) THEN
         719             :
         720             :          ! Write the name of the extension regardless of the verbose setting
         721           0 :          msg = 'Using HEMCO extension: DustDead (dust mobilization)'
         722           0 :          IF ( HCO_IsVerb( HcoState%Config%Err ) ) THEN
         723           0 :             CALL HCO_Msg( HcoState%Config%Err, msg, sep1='-' ) ! with separator
         724             :          ELSE
         725           0 :             CALL HCO_Msg( msg, verb=.TRUE.                   ) ! w/o separator
         726             :          ENDIF
         727             :
         728             :          ! Write all other messages as debug printout only
         729           0 :          IF ( Inst%ExtNrAlk > 0 ) THEN
         730           0 :             MSG = 'Use dust alkalinity option'
         731           0 :             CALL HCO_MSG(HcoState%Config%Err,MSG, SEP1='-' )
         732             :          ENDIF
         733             :
         734           0 :          MSG = 'Use the following species (Name: HcoID):'
         735           0 :          CALL HCO_MSG(HcoState%Config%Err,MSG)
         736           0 :          DO N = 1, nSpc
         737           0 :             WRITE(MSG,*) TRIM(SpcNames(N)), ':', Inst%HcoIDs(N)
         738           0 :             CALL HCO_MSG(HcoState%Config%Err,MSG)
         739             :          ENDDO
         740           0 :          IF ( Inst%ExtNrAlk > 0 ) THEN
         741           0 :             DO N = 1, nSpcAlk
         742           0 :                WRITE(MSG,*) TRIM(SpcNamesAlk(N)), ':', Inst%HcoIDsAlk(N)
         743           0 :                CALL HCO_MSG(HcoState%Config%Err,MSG)
         744             :             ENDDO
         745             :          ENDIF
         746             :
         747           0 :          WRITE(MSG,*) 'Global mass flux tuning factor: ',
         748           0 :      &                 Inst%FLX_MSS_FDG_FCT
         749           0 :          CALL HCO_MSG(HcoState%Config%Err,MSG,SEP2='-')
         750             :
         751             :       ENDIF
         752             :
         753             :       !-----------------------------------------------------------------
         754             :       ! Init module arrays
         755             :       !-----------------------------------------------------------------
         756             :
         757           0 :       ALLOCATE( Inst%ERD_FCT_GEO( HcoState%NX, HcoState%NY), STAT=AS )
         758           0 :       IF ( AS /= 0 ) THEN
         759           0 :          msg = 'Could not allocate Inst%ERD_FCT_GEO!'
         760           0 :          CALL HCO_ERROR( msg, RC, thisLoc=loc )
         761           0 :          RETURN
         762             :       ENDIF
         763           0 :       Inst%ERD_FCT_GEO = 0.0_hp
         764             :
         765           0 :       ALLOCATE( Inst%SRCE_FUNC( HcoState%NX, HcoState%NY), STAT=AS )
         766             :       IF ( AS /= 0 ) THEN
         767           0 :          msg = 'Could not allocate Inst%SRCE_FUNC!'
         768           0 :          CALL HCO_ERROR( msg, RC, thisLoc=loc )
         769           0 :          RETURN
         770             :       ENDIF
         771           0 :       Inst%SRCE_FUNC = 0.0_hp
         772             :
         773           0 :       ALLOCATE( Inst%LND_FRC_DRY( HcoState%NX, HcoState%NY), STAT=AS )
         774             :       IF ( AS /= 0 ) THEN
         775           0 :          msg = 'Could not allocate Inst%LND_FRC_DRY!'
         776           0 :          CALL HCO_ERROR( msg, RC, thisLoc=loc )
         777           0 :          RETURN
         778             :       ENDIF
         779           0 :       Inst%LND_FRC_DRY = 0.0_hp
         780             :
         781           0 :       ALLOCATE( Inst%MSS_FRC_CACO3( HcoState%NX, HcoState%NY), STAT=AS )
         782             :       IF ( AS /= 0 ) THEN
         783           0 :          msg = 'Could not allocate Inst%MSS_FRC_CACO3!'
         784           0 :          CALL HCO_ERROR( msg, RC, thisLoc=loc )
         785           0 :          RETURN
         786             :       ENDIF
         787           0 :       Inst%MSS_FRC_CACO3 = 0.0_hp
         788             :
         789           0 :       ALLOCATE( Inst%MSS_FRC_CLY( HcoState%NX, HcoState%NY), STAT=AS )
         790             :       IF ( AS /= 0 ) THEN
         791           0 :          msg = 'Could not allocate Inst%MSS_FRC_CLY!'
         792           0 :          CALL HCO_ERROR( msg, RC, thisLoc=loc )
         793           0 :          RETURN
         794             :       ENDIF
         795           0 :       Inst%MSS_FRC_CLY = 0.0_hp
         796             :
         797           0 :       ALLOCATE( Inst%MSS_FRC_SND( HcoState%NX, HcoState%NY), STAT=AS )
         798             :       IF ( AS /= 0 ) THEN
         799           0 :          msg = 'Could not allocate Inst%MSS_FRC_SND!'
         800           0 :          CALL HCO_ERROR( msg, RC, thisLoc=loc )
         801           0 :          RETURN
         802             :       ENDIF
         803           0 :       Inst%MSS_FRC_SND = 0.0_hp
         804             :
         805           0 :       ALLOCATE( Inst%SFC_TYP( HcoState%NX, HcoState%NY), STAT=AS )
         806             :       IF ( AS /= 0 ) THEN
         807           0 :          msg = 'Could not allocate Inst%SFC_TYP!'
         808           0 :          CALL HCO_ERROR( msg, RC, thisLoc=loc )
         809           0 :          RETURN
         810             :       ENDIF
         811           0 :       Inst%SFC_TYP = 0.0_hp
         812             :
         813           0 :       ALLOCATE( Inst%VAI_DST( HcoState%NX, HcoState%NY), STAT=AS )
         814             :       IF ( AS /= 0 ) THEN
         815           0 :          msg = 'Could not allocate Inst%VAI_DST!'
         816           0 :          CALL HCO_ERROR( msg, RC, thisLoc=loc )
         817           0 :          RETURN
         818             :       ENDIF
         819           0 :       Inst%VAI_DST = 0.0_hp
         820             :
         821             : !      ! Allocate arrays
         822             : !      ALLOCATE( Inst%FLX_LW_DWN_SFC( I, J ), STAT=AS )
         823             : !      IF ( AS /= 0 ) THEN
         824             : !        CALL HCO_ERROR ( 'FLX_LW_DWN_SFC', RC )
         825             : !        RETURN
         826             : !      ENDIF
         827             : !      Inst%FLX_LW_DWN_SFC = 0d0
         828             :
         829             : !      ALLOCATE( Inst%FLX_SW_ABS_SFC( I, J ), STAT=AS )
         830             : !      IF ( AS /= 0 ) THEN
         831             : !        CALL HCO_ERROR ( 'FLX_SW_ABS_SFC', RC )
         832             : !        RETURN
         833             : !      ENDIF
         834             : !      Inst%FLX_SW_ABS_SFC = 0d0
         835             :
         836             : !      ALLOCATE( Inst%TPT_GND( I, J ), STAT=AS )
         837             : !      IF ( AS /= 0 ) THEN
         838             : !        CALL HCO_ERROR ( 'TPT_GND', RC )
         839             : !        RETURN
         840             : !      ENDIF
         841             : !      Inst%TPT_GND = 0d0
         842             :
         843             : !      ALLOCATE( Inst%TPT_SOI( I, J ), STAT=AS )
         844             : !      IF ( AS /= 0 ) THEN
         845             : !        CALL HCO_ERROR ( 'TPT_SOI', RC )
         846             : !        RETURN
         847             : !      ENDIF
         848             : !      Inst%TPT_SOI = 0d0
         849             :
         850             : !      ALLOCATE( Inst%VWC_SFC( I, J ), STAT=AS )
         851             : !      IF ( AS /= 0 ) THEN
         852             : !        CALL HCO_ERROR ( 'VWC_SFC', RC )
         853             : !        RETURN
         854             : !      ENDIF
         855             : !      Inst%VWC_SFC = 0d0
         856             :
         857             : !      ALLOCATE( Inst%SRC_STR( I, J ), STAT=AS )
         858             : !      IF ( AS /= 0 ) THEN
         859             : !        CALL HCO_ERROR ( 'SRC_STR', RC )
         860             : !        RETURN
         861             : !      ENDIF
         862             : !      Inst%SRC_STR = 0d0
         863             :
         864           0 :       ALLOCATE( Inst%PLN_TYP( 0:28, 3 ), STAT=AS )
         865           0 :       IF ( AS /= 0 ) THEN
         866           0 :         CALL HCO_ERROR ( 'PLN_TYP', RC )
         867           0 :         RETURN
         868             :       ENDIF
         869           0 :       Inst%PLN_TYP = 0
         870             :
         871           0 :       ALLOCATE( Inst%PLN_FRC( 0:28, 3 ), STAT=AS )
         872           0 :       IF ( AS /= 0 ) THEN
         873           0 :         CALL HCO_ERROR ( 'PLN_FRC', RC )
         874           0 :         RETURN
         875             :       ENDIF
         876           0 :       Inst%PLN_FRC = 0d0
         877             :
         878           0 :       ALLOCATE( Inst%TAI( MVT, 12 ), STAT=AS )
         879           0 :       IF ( AS /= 0 ) THEN
         880           0 :         CALL HCO_ERROR ( 'TAI', RC )
         881           0 :         RETURN
         882             :       ENDIF
         883           0 :       Inst%TAI = 0d0
         884             :
         885           0 :       ALLOCATE( Inst%DMT_VWR( NBINS ), STAT=AS )
         886           0 :       IF ( AS /= 0 ) THEN
         887           0 :         CALL HCO_ERROR ( 'DMT_VWR', RC )
         888           0 :         RETURN
         889             :       ENDIF
         890           0 :       Inst%DMT_VWR = 0d0
         891             :
         892             : !      ALLOCATE( Inst%DNS_AER( NBINS ), STAT=AS )
         893             : !      IF ( AS /= 0 ) THEN
         894             : !        CALL HCO_ERROR ( 'DNS_AER', RC )
         895             : !        RETURN
         896             : !      ENDIF
         897             : !      Inst%DNS_AER = 0d0
         898             :
         899           0 :       ALLOCATE( Inst%OVR_SRC_SNK_FRC( DST_SRC_NBR, NBINS ), STAT=AS )
         900           0 :       IF ( AS /= 0 ) THEN
         901           0 :         CALL HCO_ERROR ( 'OVR_SRC_SNK_FRC', RC )
         902           0 :         RETURN
         903             :       ENDIF
         904           0 :       Inst%OVR_SRC_SNK_FRC = 0d0
         905             :
         906           0 :       ALLOCATE( Inst%OVR_SRC_SNK_MSS( DST_SRC_NBR, NBINS ), STAT=AS )
         907           0 :       IF ( AS /= 0 ) THEN
         908           0 :         CALL HCO_ERROR ( 'OVR_SRC_SNK_MSS', RC )
         909           0 :         RETURN
         910             :       ENDIF
         911           0 :       Inst%OVR_SRC_SNK_MSS = 0d0
         912             :
         913             : !      ALLOCATE( Inst%OROGRAPHY( I, J ), STAT=AS )
         914             : !      IF ( AS /= 0 ) THEN
         915             : !        CALL HCO_ERROR ( 'OROGRAPHY', RC )
         916             : !        RETURN
         917             : !      ENDIF
         918             : !      Inst%OROGRAPHY = 0
         919             :
         920             :       ! Bin size min diameter [m]
         921           0 :       ALLOCATE( Inst%DMT_MIN( NBINS ), STAT=AS )
         922           0 :       IF ( AS /= 0 ) THEN
         923           0 :         CALL HCO_ERROR ( 'DMT_MIN', RC )
         924           0 :         RETURN
         925             :       ENDIF
         926           0 :       Inst%DMT_MIN(1) = 0.2d-6
         927           0 :       Inst%DMT_MIN(2) = 2.0d-6
         928           0 :       Inst%DMT_MIN(3) = 3.6d-6
         929           0 :       Inst%DMT_MIN(4) = 6.0d-6
         930             :
         931             :       ! Bin size max diameter [m]
         932           0 :       ALLOCATE( Inst%DMT_MAX( NBINS ), STAT=AS )
         933           0 :       IF ( AS /= 0 ) THEN
         934           0 :         CALL HCO_ERROR ( 'DMT_MAX', RC )
         935           0 :         RETURN
         936             :       ENDIF
         937           0 :       Inst%DMT_MAX(1) = 2.0d-6
         938           0 :       Inst%DMT_MAX(2) = 3.6d-6
         939           0 :       Inst%DMT_MAX(3) = 6.0d-6
         940           0 :       Inst%DMT_MAX(4) = 1.2d-5
         941             :
         942             :       ! DMT_VMA_SRC: D'Almeida's (1987) "Background" modes
         943             :       ! as default [m]  (Zender et al. p.5 Table 1)
         944             :       ! These modes also summarized in BSM96 p. 73 Table 2
         945             :       ! Mass median diameter BSM96 p. 73 Table 2
         946           0 :       ALLOCATE( Inst%DMT_VMA_SRC( DST_SRC_NBR ), STAT=AS )
         947           0 :       IF ( AS /= 0 ) THEN
         948           0 :         CALL HCO_ERROR ( 'DMT_VMA_SRC', RC )
         949           0 :         RETURN
         950             :       ENDIF
         951           0 :       Inst%DMT_VMA_SRC(1) = 0.832d-6
         952           0 :       Inst%DMT_VMA_SRC(2) = 4.82d-6
         953           0 :       Inst%DMT_VMA_SRC(3) = 19.38d-6
         954             :
         955             :       ! GSD_ANL_SRC: Geometric standard deviation [fraction]
         956             :       ! BSM96 p. 73 Table 2
         957           0 :       ALLOCATE( Inst%GSD_ANL_SRC( DST_SRC_NBR ), STAT=AS )
         958           0 :       IF ( AS /= 0 ) THEN
         959           0 :         CALL HCO_ERROR ( 'GSD_ANL_SRC', RC )
         960           0 :         RETURN
         961             :       ENDIF
         962           0 :       Inst%GSD_ANL_SRC(1) = 2.10d0
         963           0 :       Inst%GSD_ANL_SRC(2) = 1.90d0
         964           0 :       Inst%GSD_ANL_SRC(3) = 1.60d0
         965             :
         966             :       ! MSS_FRC_SRC:  Mass fraction BSM96 p. 73 Table 2
         967           0 :       ALLOCATE( Inst%MSS_FRC_SRC( DST_SRC_NBR ), STAT=AS )
         968           0 :       IF ( AS /= 0 ) THEN
         969           0 :         CALL HCO_ERROR ( 'MSS_FRC_SRC', RC )
         970           0 :         RETURN
         971             :       ENDIF
         972           0 :       Inst%MSS_FRC_SRC(1) = 0.036d0
         973           0 :       Inst%MSS_FRC_SRC(2) = 0.957d0
         974           0 :       Inst%MSS_FRC_SRC(3) = 0.007d0
         975             :
         976             :       !=================================================================
         977             :       ! Compute mass overlaps, Mij, between "source" PDFs
         978             :       ! and size bins (Zender et al., 2K3, Equ. 12, and Table 1)
         979             :       !=================================================================
         980             :       CALL OVR_SRC_SNK_FRC_GET( HcoState,
         981             :      &                          DST_SRC_NBR,   Inst%DMT_VMA_SRC,
         982             :      &                          Inst%GSD_ANL_SRC,   NBINS,
         983             :      &                          Inst%DMT_MIN,  Inst%DMT_MAX,
         984           0 :      &                          Inst%OVR_SRC_SNK_FRC, RC )
         985           0 :       IF ( RC /= HCO_SUCCESS ) THEN
         986           0 :           CALL HCO_ERROR( 'ERROR 15', RC, THISLOC=LOC )
         987           0 :           RETURN
         988             :       ENDIF
         989             :
         990             :       !=================================================================
         991             :       ! Compute OVR_SRC_SNK_MSS, the fraction of dust transported, given
         992             :       ! the mass overlap, OVR_SRC_SNK_FRC, and the mass fraction
         993             :       ! MSS_FRC_SRC.  OVR_SRC_SNK_MSS is used in routine
         994             :       ! FLX_MSS_VRT_DST_PRT which partitions the total vertical
         995             :       ! dust flux into transport
         996             :       !==============================================================
         997             :       CALL DST_PSD_MSS( Inst%OVR_SRC_SNK_FRC, Inst%MSS_FRC_SRC,
         998           0 :      &                  Inst%OVR_SRC_SNK_MSS, NBINS, DST_SRC_NBR )
         999             :
        1000             :       !=================================================================
        1001             :       ! Get plant type, cover, and Leaf area index from land sfc model
        1002             :       !=================================================================
        1003           0 :       CALL PLN_TYP_GET( Inst%PLN_TYP, Inst%PLN_FRC, Inst%TAI )
        1004             :
        1005             :       ! Activate met fields used by this extension
        1006           0 :       ExtState%SPHU%DoUse    = .TRUE.
        1007           0 :       ExtState%TK%DoUse      = .TRUE.
        1008           0 :       ExtState%U10M%DoUse    = .TRUE.
        1009           0 :       ExtState%V10M%DoUse    = .TRUE.
        1010           0 :       ExtState%T2M%DoUse     = .TRUE.
        1011           0 :       ExtState%GWETTOP%DoUse = .TRUE.
        1012           0 :       ExtState%SNOWHGT%DoUse = .TRUE.
        1013           0 :       ExtState%USTAR%DoUse   = .TRUE.
        1014           0 :       ExtState%Z0%DoUse      = .TRUE.
        1015           0 :       ExtState%FRLAND%DoUse  = .TRUE.
        1016           0 :       ExtState%FRLANDIC%DoUse= .TRUE.
        1017           0 :       ExtState%FROCEAN%DoUse = .TRUE.
        1018           0 :       ExtState%FRSEAICE%DoUse= .TRUE.
        1019           0 :       ExtState%FRLAKE%DoUse  = .TRUE.
        1020             :
        1021             :       ! Leave w/ success
        1022           0 :       Inst => NULL()
        1023           0 :       IF ( ALLOCATED(SpcNames   ) ) DEALLOCATE(SpcNames   )
        1024           0 :       IF ( ALLOCATED(SpcNamesAlk) ) DEALLOCATE(SpcNamesAlk)
        1025           0 :       CALL HCO_LEAVE( HcoState%Config%Err, RC )
        1026             :
        1027           0 :       END SUBROUTINE HCOX_DustDead_Init
        1028             : !EOC
        1029             : !------------------------------------------------------------------------------
        1030             : !                   Harmonized Emissions Component (HEMCO)                    !
        1031             : !------------------------------------------------------------------------------
        1032             : !BOP
        1033             : !
        1034             : ! !IROUTINE: HCOX_DustDead_Final
        1035             : !
        1036             : ! !DESCRIPTION: Subroutine HcoX\_DustDead\_Final finalizes the HEMCO
        1037             : ! DUST\_DEAD extension.
        1038             : !\\
        1039             : !\\
        1040             : ! !INTERFACE:
        1041             : !
        1042           0 :       SUBROUTINE HCOX_DustDead_Final ( ExtState )
        1043             : !
        1044             : ! !INPUT PARAMETERS:
        1045             : !
        1046             :       TYPE(Ext_State),  POINTER       :: ExtState   ! Module options
        1047             : !
        1048             : ! !REVISION HISTORY:
        1049             : !  25 Nov 2013 - C. Keller - Now a HEMCO extension
        1050             : !  See https://github.com/geoschem/hemco for complete history
        1051             : !EOP
        1052             : !------------------------------------------------------------------------------
        1053             : !BOC
        1054             : !
        1055             : ! !LOCAL VARIABLES:
        1056             : !
        1057           0 :       CALL InstRemove ( ExtState%DustDead )
        1058             :
        1059           0 :       END SUBROUTINE HCOX_DustDead_Final
        1060             : !EOC
        1061             : !------------------------------------------------------------------------------
        1062             : !                   Harmonized Emissions Component (HEMCO)                    !
        1063             : !------------------------------------------------------------------------------
        1064             : !
        1065             : !******************************************************************************
        1066             : ! ORIGINAL ROUTINES FOLLOW BELOW
        1067             : !******************************************************************************
        1068             :
        1069           0 :       SUBROUTINE DST_MBL( HcoState,    ExtState, Inst,
        1070             :      &                    DOY,         HGT_MDP,     LAT_IDX,
        1071           0 :      &                    LAT_RDN,     ORO,         PRS_DLT,
        1072           0 :      &                    PRS_MDP,     Q_H2O_VPR,   DSRC,
        1073           0 :      &                    SNW_HGT_LQD, TM_ADJ,      TPT_MDP,
        1074           0 :      &                    TPT_PTN_MDP, WND_MRD_MDP, WND_ZNL_MDP,
        1075             :      &                    NSTEP,       RC )
        1076             : !
        1077             : !******************************************************************************
        1078             : !  Subroutine DST_MBL is the driver for aerosol mobilization (DEAD model).
        1079             : !  It is designed to require only single layer surface fields, allowing for
        1080             : !  easier implementation.  DST_MBL is called once per latitude.  Modified
        1081             : !  for GEOS-CHEM by Duncan Fairlie and Bob Yantosca.
        1082             : !  (tdf, bmy, 1/25/07, 12/18/09)
        1083             : !
        1084             : !  Arguments as Input:
        1085             : !  ============================================================================
        1086             : !  (1 ) DOY         (REAL*8 ) : Day of year [1.0..366.0)            [unitless]
        1087             : !  (2 ) HGT_MDP     (REAL*8 ) : Midpoint height above surface       [m       ]
        1088             : !  (3 ) LAT_IDX     (INTEGER) : Model latitude index                [unitless]
        1089             : !  (4 ) LAT_RDN     (REAL*8 ) : Model latitude                      [radians ]
        1090             : !  (5 ) ORO         (REAL*8 ) : Orography                           [fraction]
        1091             : !  (6 ) PRS_DLT     (REAL*8 ) : Pressure thickness of grid box      [Pa      ]
        1092             : !  (7 ) PRS_MDP     (REAL*8 ) : Pressure @ midpoint of grid box     [Pa      ]
        1093             : !  (8 ) Q_H2O_VPR,  (REAL*8 ) : Water vapor mixing ratio            [kg/kg   ]
        1094             : !  (9 ) SNW_HGT_LQD (REAL*8 ) : Equivalent liquid water snow depth  [m       ]
        1095             : !  (10) TM_ADJ,     (REAL*8 ) : Adjustment timestep                 [s       ]
        1096             : !  (11) TPT_MDP,    (REAL*8 ) : Temperature                         [K       ]
        1097             : !  (12) TPT_PTN_MDP (REAL*8 ) : Midlayer local potential temp.      [K       ]
        1098             : !  (13) WND_MRD_MDP (REAL*8 ) : Meridional wind component (V-wind)  [m/s     ]
        1099             : !  (14) WND_ZNL_MDP (REAL*8 ) : Zonal wind component (U-wind)       [m/s     ]
        1100             : !  (15) FIRST,      (LOGICAL) : Logical used ot open output dataset [unitless]
        1101             : !  (16) NSTEP       (INTEGER) : Iteration counter                   [unitless]
        1102             : !
        1103             : !  Arguments as Output:
        1104             : !  ============================================================================
        1105             : !  (10) DSRC                ! O [kg kg-1] Dust mixing ratio increment
        1106             : !
        1107             : !  NOTES:
        1108             : !  (1 ) Cleaned up and added comments.  Also force double precision with
        1109             : !        "D" exponents. (bmy, 3/30/04)
        1110             : !  (2 ) Now get GOCART source function. (tdf, bmy, 1/25/07)
        1111             : !  (3 ) Tune nested-domain emissions dust to the same as 2x2.5 simulation
        1112             : !        Also tune GEOS-3 1x1 N. America nested-grid dust emissions to
        1113             : !        the 4x5 totals from the GEOS-5 4x5 v8-01-01-Run0 benchmark.
        1114             : !        (yxw, bmy, dan, 11/6/08)
        1115             : !  (4 ) New scale parameter for 2x2.5 GEOS-5 (tdf, jaf, phs, 10/30/09)
        1116             : !  (5 ) Defined FLX_MSS_FDG_FCT for GEOS_4 2x2.5, GEOS_5 2x2.5, NESTED_NA and
        1117             : !        NESTED_EU.  Redefined FLX_MSS_FDG_FCT for NESTED_CH, based upon above
        1118             : !        changes. (amv, bmy, 12/18/09)
        1119             : !  (6 ) For now treat MERRA like GEOS-5 (bmy, 8/13/10)
        1120             : !  29 Oct 2010 - T. D. Fairlie, R. Yantosca - Retune dust for MERRA 4x5
        1121             : !  08 Feb 2012 - R. Yantosca - For now, use same FLX_MSS_FDG_FCT for
        1122             : !                              GEOS-5.7.x as for MERRA
        1123             : !  01 Mar 2012 - R. Yantosca - Now use GET_AREA_M2(I,J,L) from grid_mod.F90
        1124             : !  09 Nov 2012 - M. Payer    - Replaced all met field arrays with State_Met
        1125             : !                              derived type object
        1126             : !   5 Jun 2013 - K. Yu       - Use 0.5 x 0.666 NA scale factor for the
        1127             : !                              0.25 x 0.3125 NA nested simulation
        1128             : !******************************************************************************
        1129             : !
        1130             :       ! Arguments
        1131             :       TYPE(HCO_State), POINTER      :: HcoState   ! Hemco state
        1132             :       TYPE(Ext_State), POINTER      :: ExtState    ! Module options
        1133             :       TYPE(MyInst),    POINTER      :: Inst
        1134             :       INTEGER,        INTENT(IN)    :: LAT_IDX
        1135             :       REAL*8,         INTENT(IN)    :: DOY
        1136             :       REAL*8,         INTENT(IN)    :: HGT_MDP(HcoState%NX)
        1137             :       REAL*8,         INTENT(IN)    :: LAT_RDN
        1138             :       REAL*8,         INTENT(IN)    :: ORO(HcoState%NX)
        1139             :       REAL*8,         INTENT(IN)    :: PRS_DLT(HcoState%NX)
        1140             :       REAL*8,         INTENT(IN)    :: PRS_MDP(HcoState%NX)
        1141             :       REAL*8,         INTENT(IN)    :: Q_H2O_VPR(HcoState%NX)
        1142             :       REAL*8,         INTENT(IN)    :: SNW_HGT_LQD(HcoState%NX)
        1143             :       REAL*8,         INTENT(IN)    :: TM_ADJ
        1144             :       REAL*8,         INTENT(IN)    :: TPT_MDP(HcoState%NX)
        1145             :       REAL*8,         INTENT(IN)    :: TPT_PTN_MDP(HcoState%NX)
        1146             :       REAL*8,         INTENT(IN)    :: WND_MRD_MDP(HcoState%NX)
        1147             :       REAL*8,         INTENT(IN)    :: WND_ZNL_MDP(HcoState%NX)
        1148             :       INTEGER,        INTENT(IN)    :: NSTEP
        1149             :       REAL*8,         INTENT(INOUT) :: DSRC(HcoState%NX, NBINS)
        1150             :       INTEGER,        INTENT(INOUT)  :: RC
        1151             :
        1152             :       !--------------
        1153             :       ! Parameters
        1154             :       !--------------
        1155             :
        1156             :       ! Reference height for mobilization processes [m]
        1157             :       REAL*8,  PARAMETER     :: HGT_RFR         = 10.0d0
        1158             :
        1159             :       ! Zero plane displacement for erodible surfaces [m]
        1160             :       REAL*8,  PARAMETER     :: HGT_ZPD_MBL     = 0.0d0
        1161             :
        1162             :       ! Set roughness length momentum for erodible surfaces, S&P, p. 858. [m]
        1163             :       REAL*8,  PARAMETER     :: RGH_MMN_MBL     = 1.0d-3
        1164             :
        1165             :       ! rgh_mmn_smt set to 33.3e-6 um, MaB95 p. 16426 recommend 10.0e-6
        1166             :       ! Smooth roughness length MaB95 p. 16426, MaB97 p. 4392, GMB98 p. 6207
        1167             :       ! [m]  Z0,m,s
        1168             :       REAL*8,  PARAMETER     :: RGH_MMN_SMT     = 33.3d-6
        1169             :
        1170             :       ! Minimum windspeed used for mobilization [m/s]
        1171             :       REAL*8,  PARAMETER     :: WND_MIN_MBL     = 1.0d0
        1172             :
        1173             :       !--------------
        1174             :       ! Local Output
        1175             :       !--------------
        1176           0 :       REAL*8 DST_SLT_FLX_RAT_TTL(HcoState%NX) ! [m-1] Ratio of vertical dust flux to
        1177             :                                         !       streamwise mass flux
        1178           0 :       REAL*8 FLX_MSS_HRZ_SLT_TTL(HcoState%NX) ! [kg/m/s] Vertically integrated
        1179             :                                         !              streamwise mass flux
        1180           0 :       REAL*8 FLX_MSS_VRT_DST_TTL(HcoState%NX) ! [kg/m2/s] Total vertical mass
        1181             :                                         !           flux of dust
        1182           0 :       REAL*8 FRC_THR_NCR_DRG(HcoState%NX)     ! [frc] Threshold friction velocity
        1183             :                                         !       increase from roughness
        1184           0 :       REAL*8 FRC_THR_NCR_WTR(HcoState%NX)     ! [frc] Threshold friction velocity
        1185             :                                         !       increase from moisture
        1186           0 :       REAL*8 FLX_MSS_VRT_DST(HcoState%NX,NBINS) ! [kg/m2/s] Vertical mass flux
        1187             :                                             !           of dust
        1188           0 :       REAL*8 HGT_ZPD(HcoState%NX)             ! [m] Zero plane displacement
        1189           0 :       REAL*8 LND_FRC_MBL_SLICE(HcoState%NX)   ! [frc] Bare ground fraction
        1190           0 :       REAL*8 MNO_LNG(HcoState%NX)             ! [m] Monin-Obukhov length
        1191           0 :       REAL*8 WND_FRC(HcoState%NX)             ! [m/s] Friction velocity
        1192           0 :       REAL*8 WND_FRC_GEOS(HcoState%NX)        ! [m/s] Friction velocity
        1193           0 :       REAL*8 Z0_GEOS(HcoState%NX)             ! [m] roughness height
        1194           0 :       REAL*8 SNW_FRC(HcoState%NX)             ! [frc] Fraction of surface covered
        1195             :                                         !       by snow
        1196             :       REAL*8 TRN_FSH_VPR_SOI_ATM(HcoState%NX) ! [frc] Transfer efficiency of vapor
        1197             :                                         !       from soil to atmosphere
        1198           0 :       REAL*8 wnd_frc_slt(HcoState%NX)      ! [m/s] Saltating friction velocity
        1199           0 :       REAL*8 WND_FRC_THR_SLT(HcoState%NX)  ! [m/s] Threshold friction velocity
        1200             :                                      !       for saltation
        1201           0 :       REAL*8 WND_MDP(HcoState%NX)          ! [m/s] Surface layer mean wind speed
        1202           0 :       REAL*8 WND_RFR(HcoState%NX)          ! [m/s] Wind speed at reference height
        1203           0 :       REAL*8 WND_RFR_THR_SLT(HcoState%NX)  ! [m/s] Threshold 10 m wind speed for
        1204             :                                      !       saltation
        1205             :
        1206             :       LOGICAL FLG_CACO3            ! [FLG] Activate CaCO3 tracer
        1207           0 :       LOGICAL FLG_MBL_SLICE(HcoState%NX) ! [flg] Mobilization candidates
        1208             :       CHARACTER(80) FL_OUT         ! [sng] Name of netCDF output file
        1209             :       INTEGER I                    ! [idx] Counting index
        1210             :       INTEGER M                    ! [idx] Counting index
        1211             :       INTEGER MBL_NBR              ! [nbr] Number of mobilization candidates
        1212           0 :       INTEGER SFC_TYP_SLICE(HcoState%NX) ! [idx] LSM surface type lat slice (0..28)
        1213           0 :       REAL*8 CND_TRM_SOI(HcoState%NX)          ! [W/m/K] Soil thermal conductivity
        1214           0 :       REAL*8 DNS_MDP(HcoState%NX)              ! [kg/m3] Midlayer density
        1215             :       REAL*8 FLX_LW_DWN_SFC_SLICE(HcoState%NX) ! [W/m2] Longwave downwelling flux
        1216             :                                          !        at surface
        1217             :       REAL*8 FLX_SW_ABS_SFC_SLICE(HcoState%NX) ! [W/m2] Solar flux absorbed by ground
        1218             :
        1219           0 :       REAL*8 LND_FRC_DRY_SLICE(HcoState%NX)   ! [frc] Dry land fraction
        1220           0 :       REAL*8 MBL_BSN_FCT_SLICE(HcoState%NX)   ! [frc] Erodibility factor
        1221           0 :       REAL*8 MSS_FRC_CACO3_SLICE(HcoState%NX) ! [frc] Mass fraction of CaCO3
        1222           0 :       REAL*8 MSS_FRC_CLY_SLICE(HcoState%NX)   ! [frc] Mass fraction of clay
        1223           0 :       REAL*8 MSS_FRC_SND_SLICE(HcoState%NX)   ! [frc] Mass fraction of sand
        1224             :
        1225             :       ! GOCART source function (tdf, bmy, 1/25/07)
        1226           0 :       REAL*8 SRCE_FUNC_SLICE(HcoState%NX)     ! GOCART source function
        1227             :
        1228           0 :       REAL*8 LVL_DLT(HcoState%NX) ! [m] Soil layer thickness
        1229           0 :       REAL*8 MPL_AIR(HcoState%NX) ! [kg/m2] Air mass path in layer
        1230             :
        1231             :       REAL*8 TM_DLT                ! [s] Mobilization timestep
        1232           0 :       REAL*8 TPT_GND_SLICE(HcoState%NX)  ! [K] Ground temperature
        1233           0 :       REAL*8 TPT_SOI_SLICE(HcoState%NX)  ! [K] Soil temperature
        1234             :       REAL*8 TPT_SOI_FRZ           ! [K] Temperature of frozen soil
        1235             :       REAL*8 TPT_VRT_MDP           ! [K] Midlayer virtual temperature
        1236           0 :       REAL*8 VAI_DST_SLICE(HcoState%NX)  ! [m2/m2] Vegetation area index,
        1237             :                                    !         one-sided
        1238           0 :       REAL*8 VWC_DRY(HcoState%NX)        ! [m3/s] Dry volumetric water content
        1239             :                                    !        (no E-T)
        1240           0 :       REAL*8 VWC_OPT(HcoState%NX)        ! [m3/m3] E-T optimal volumetric water
        1241             :                                    !         content
        1242           0 :       REAL*8 VWC_SAT(HcoState%NX)        ! [m3/m3] Saturated volumetric water
        1243             :                                    !         content (sand-dependent)
        1244           0 :       REAL*8 VWC_SFC_SLICE(HcoState%NX)  ! [m3/m3] Volumetric water content
        1245           0 :       REAL*8 GWC_SFC(HcoState%NX)        ! [kg/kg] Gravimetric water content
        1246           0 :       REAL*8 RGH_MMN(HcoState%NX)        ! [m] Roughness length momentum
        1247             :       REAL*8 W10M
        1248             :
        1249             :       ! GCM diagnostics
        1250             :       ! Dust tendency due to gravitational settling [kg/kg/s]
        1251           0 :       REAL*8 Q_DST_TND_MBL(HcoState%NX,NBINS)
        1252             :
        1253             :       ! Total dust tendency due to gravitational settling [kg/kg/s]
        1254           0 :       REAL*8 Q_DST_TND_MBL_TTL(HcoState%NX)
        1255             :
        1256             :       ! Temperature
        1257             :       REAL(dp) :: TMP
        1258             :
        1259             :       ! For error handling
        1260             :       CHARACTER(LEN=255)   :: MSG, LOC
        1261             :
        1262             :       !=================================================================
        1263             :       ! DST_MBL begins here!
        1264             :       !=================================================================
        1265           0 :       LOC = 'DST_MBL (HCOX_DUSTDEAD_MOD.F)'
        1266             :
        1267             :       ! Start
        1268           0 :       RC = HCO_SUCCESS
        1269             :
        1270             :       ! Time step [s]
        1271           0 :       TM_DLT                 = TM_ADJ
        1272             :
        1273             :       ! Freezing pt of soil [K] -- assume it's 0C
        1274           0 :       TPT_SOI_FRZ            = TPT_FRZ_PNT
        1275             :
        1276             :       ! Initialize output fluxes and tendencies
        1277           0 :       Q_DST_TND_MBL(:,:)     = 0.0D0       ! [kg kg-1 s-1]
        1278           0 :       Q_DST_TND_MBL_TTL(:)   = 0.0D0       ! [kg kg-1 s-1]
        1279           0 :       FLX_MSS_VRT_DST(:,:)   = 0.0D0       ! [kg m-2 s-1]
        1280           0 :       FLX_MSS_VRT_DST_TTL(:) = 0.0D0       ! [kg m-2 s-1]
        1281           0 :       FRC_THR_NCR_WTR(:)     = 0.0D0       ! [frc]
        1282           0 :       WND_RFR(:)             = 0.0D0       ! [m s-1]
        1283           0 :       WND_FRC(:)             = 0.0D0       ! [m s-1]
        1284           0 :       WND_FRC_SLT(:)         = 0.0D0       ! [m s-1]
        1285           0 :       WND_FRC_THR_SLT(:)     = 0.0D0       ! [m s-1]
        1286           0 :       WND_RFR_THR_SLT(:)     = 0.0D0       ! [m s-1]
        1287           0 :       HGT_ZPD(:)             = HGT_ZPD_MBL ! [m]
        1288             :
        1289           0 :       DSRC(:,:)              = 0.0D0
        1290             :
        1291             :       !=================================================================
        1292             :       ! Compute necessary derived fields
        1293             :       !=================================================================
        1294           0 :       DO I = 1, HcoState%NX
        1295             :
        1296             :          ! Stop occasional haywire model runs
        1297             : !         IF ( TPT_MDP(I) > 350.0d0 ) THEN
        1298             : !            MSG = 'TPT_MDP(i) > 350.0'
        1299             : !            CALL HCO_ERROR(MSG, RC, THISLOC='DST_MBL' )
        1300             : !            RETURN
        1301             : !         ENDIF
        1302             :          ! Now simply restrict to 350K, rather than crashing
        1303           0 :          IF ( TPT_MDP(I) > 350.0d0 ) THEN
        1304             :             TMP = 350.0d0
        1305             :          ELSE
        1306           0 :             TMP = TPT_MDP(I)
        1307             :          ENDIF
        1308             :
        1309             :          ! Midlayer virtual temperature [K]
        1310             :          TPT_VRT_MDP = TMP
        1311           0 :      &               * (1.0d0 + EPS_H2O_RCP_M1 * Q_H2O_VPR(I))
        1312             :
        1313             :          ! Density at center of gridbox [kg/m3]
        1314             :          DNS_MDP(I) = PRS_MDP(I)
        1315           0 :      &              / (TPT_VRT_MDP * GAS_CST_DRY_AIR)
        1316             :
        1317             :          ! Commented out
        1318             :          !cApproximate surface virtual temperature (uses midlayer moisture)
        1319             :          !c tpt_vrt_sfc=tpt_sfc(i)*(1.0+eps_H2O_rcp_m1*q_H2O_vpr(i)) ! [K]
        1320             :          !c
        1321             :          !c Surface density
        1322             :          !c dns_sfc(i)=prs_sfc(i)/(tpt_vrt_sfc*gas_cst_dry_air) ! [kg m-3]
        1323             :
        1324             :          ! Mass of air currently in gridbox [kg/m2]
        1325           0 :          MPL_AIR(I) = PRS_DLT(I) * GRV_SFC_RCP
        1326             :
        1327             :          ! Mean surface layer horizontal wind speed
        1328             :          WND_MDP(I) = SQRT( WND_ZNL_MDP(I)*WND_ZNL_MDP(I)
        1329           0 :      &              +       WND_MRD_MDP(I)*WND_MRD_MDP(I) )
        1330             :
        1331             :       ENDDO
        1332             :
        1333             :       !=================================================================
        1334             :       ! Gather input variables from GEOS-CHEM modules etc.
        1335             :       !=================================================================
        1336             :
        1337             :       ! Get LSM Surface type (0..28)
        1338             :       CALL SFC_TYP_GET( HcoState, ExtState, Inst,
        1339           0 :      &                  LAT_IDX,  SFC_TYP_SLICE, RC )
        1340           0 :       IF ( RC /= HCO_SUCCESS ) THEN
        1341           0 :           CALL HCO_ERROR( 'ERROR 16', RC, THISLOC=LOC )
        1342           0 :           RETURN
        1343             :       ENDIF
        1344             :
        1345             :       ! Get erodability and mass fractions
        1346             :       CALL SOI_TXT_GET(
        1347             :      &    HcoState,            ! Hemco state object
        1348             :      &    ExtState, Inst,       ! Extension options
        1349             :      &    LAT_IDX,             ! I [idx] Latitude index
        1350             :      &    LND_FRC_DRY_SLICE,   ! O [frc] Dry land fraction
        1351             :      &    MBL_BSN_FCT_SLICE,   ! O [frc] Erodibility factor
        1352             :      &    MSS_FRC_CACO3_SLICE, ! O [frc] Mass fraction of CaCO3
        1353             :      &    MSS_FRC_CLY_SLICE,   ! O [frc] Mass fraction of clay
        1354           0 :      &    MSS_FRC_SND_SLICE )  ! O [frc] Mass fraction of sand
        1355             :
        1356             :       ! Get GOCART source function (tdf, bmy, 1/25/07)
        1357             :       CALL SRCE_FUNC_GET(      ! GOCART source function
        1358             :      &    HcoState, Inst,      ! Hemco state object
        1359             :      &    LAT_IDX,             ! I [idx] Latitude index
        1360           0 :      &    SRCE_FUNC_SLICE )    ! O [frc] GOCART source function
        1361             :
        1362             :       ! Get volumetric water content from GWET
        1363             :       CALL VWC_SFC_GET(
        1364             :      &    HcoState,            ! Hemco state object
        1365             :      &    LAT_IDX,             ! I [idx] Latitude index
        1366             :      &    ExtState%GWETTOP%Arr%Val, ! I [unitless] Top soil moisture
        1367           0 :      &    VWC_SFC_SLICE )      ! O [m3 m-3] Volumetric water content
        1368             :
        1369             :       ! Get surface and soil temperature
        1370             :       CALL TPT_GND_SOI_GET(
        1371             :      &    HcoState,              ! Hemco state object
        1372             :      &    LAT_IDX,               ! I [idx] Latitude index!
        1373             :      &    ExtState%T2M%Arr%Val, ! I [K] Sfc temperature at 2m
        1374             :      &    TPT_GND_SLICE,         ! O [K] Ground temperature
        1375           0 :      &    TPT_SOI_SLICE )        ! O [K] Soil temperature
        1376             :
        1377             :       ! Get time-varying vegetation area index
        1378             :       CALL DST_TVBDS_GET(
        1379             :      &    Inst,                ! # of lons
        1380             :      &    HcoState%NX,         ! # of lons
        1381             :      &    LAT_IDX,             ! I [idx] Latitude index
        1382           0 :      &    VAI_DST_SLICE)       ! O [m2 m-2] Vegetation area index, one-sided
        1383             :
        1384             :       ! Get fraction of surface covered by snow
        1385             :       CALL SNW_FRC_GET(
        1386             :      &    HcoState,            ! Hemco state object
        1387             :      &    SNW_HGT_LQD,         ! I [m] Equivalent liquid water snow depth
        1388           0 :      &    SNW_FRC )            ! O [frc] Fraction of surface covered by snow
        1389             :
        1390             :       !=================================================================
        1391             :       ! Use the variables retrieved above to compute the fraction
        1392             :       ! of each gridcell suitable for dust mobilization
        1393             :       !=================================================================
        1394             :       CALL LND_FRC_MBL_GET(
        1395             :      %    HcoState,
        1396             :      &    DOY,                 ! I [day] Day of year [1.0..366.0)
        1397             :      &    FLG_MBL_SLICE,       ! O [flg] Mobilization candidate flag
        1398             :      &    LAT_RDN,             ! I [rdn] Latitude
        1399             :      &    LND_FRC_DRY_SLICE,   ! I [frc] Dry land fraction
        1400             :      &    LND_FRC_MBL_SLICE,   ! O [frc] Bare ground fraction
        1401             :      &    MBL_NBR,             ! O [flg] Number of mobilization candidates
        1402             :      &    ORO,                 ! I [frc] Orography
        1403             :      &    SFC_TYP_SLICE,       ! I [idx] LSM surface type (0..28)
        1404             :      &    SNW_FRC,             ! I [frc] Fraction of surface covered by snow
        1405             :      &    TPT_SOI_SLICE,       ! I [K] Soil temperature
        1406             :      &    TPT_SOI_FRZ,         ! I [K] Temperature of frozen soil
        1407             :      &    VAI_DST_SLICE,       ! I [m2 m-2] Vegetation area index, one-sided
        1408           0 :      &    RC )
        1409           0 :       IF ( RC /= HCO_SUCCESS ) THEN
        1410           0 :           CALL HCO_ERROR( 'ERROR 17', RC, THISLOC=LOC )
        1411           0 :           RETURN
        1412             :       ENDIF
        1413             :
        1414             :       ! Much ado about nothing
        1415           0 :       if (mbl_nbr == 0) then
        1416             :         goto 737
        1417             :       endif
        1418             :
        1419             :       !=================================================================
        1420             :       ! Compute time-invariant hydrologic properties
        1421             :       ! NB flg_mbl IS time-dependent, so keep this in time loop.
        1422             :       !=================================================================
        1423             :       CALL HYD_PRP_GET(        ! NB: These properties are time-invariant
        1424             :      &    HcoState,
        1425             :      &    FLG_MBL_SLICE,       ! I [flg] Mobilization candidate flag
        1426             :      &    MSS_FRC_CLY_SLICE,   ! I [frc] Mass fraction clay
        1427             :      &    MSS_FRC_SND_SLICE,   ! I [frc] Mass fraction sand
        1428             :      &    VWC_DRY,             ! O [m3/m3] Dry vol'mtric water content (no E-T)
        1429             :      &    VWC_OPT,             ! O [m3/m3] E-T optimal volumetric water content
        1430           0 :      &    VWC_SAT)             ! O [m3/m3] Saturated volumetric water content
        1431             :
        1432           0 :       CND_TRM_SOI(:) = 0.0D0
        1433           0 :       LVL_DLT(:)     = 0.0D0
        1434             :
        1435             :       !=================================================================
        1436             :       ! Get reference wind at 10m
        1437             :       !=================================================================
        1438           0 :       DO I = 1, HcoState%NX
        1439           0 :          W10M = ExtState%U10M%Arr%Val(I,LAT_IDX)**2 +
        1440           0 :      &          ExtState%V10M%Arr%Val(I,LAT_IDX)**2
        1441           0 :          W10M = SQRT(W10M)
        1442             :
        1443             :          ! add mobilisation criterion flag
        1444           0 :          IF ( FLG_MBL_SLICE(I) ) THEN
        1445           0 :             WND_RFR(I) = W10M
        1446             :          ENDIF
        1447             :       ENDDO
        1448             :
        1449             :       !=================================================================
        1450             :       ! Compute standard roughness length.   This call is probably
        1451             :       ! unnecessary, because we are only concerned with mobilisation
        1452             :       ! candidates, for which roughness length is imposed in blm_mbl
        1453             :       !=================================================================
        1454             :       CALL RGH_MMN_GET(      ! Set roughness length w/o zero plane displacement
        1455             :      &       HcoState, Inst,
        1456             :      &       ORO,            ! I [frc] Orography
        1457             :      &       RGH_MMN,        ! O [m] Roughness length momentum
        1458             :      &       SFC_TYP_SLICE,  ! I [idx] LSM surface type (0..28)
        1459             :      &       SNW_FRC,        ! I [frc] Fraction of surface covered by snow
        1460             :      &       WND_RFR,
        1461           0 :      &       RC )       ! I [m s-1] 10 m wind speed
        1462           0 :       IF ( RC /= HCO_SUCCESS ) THEN
        1463           0 :           CALL HCO_ERROR( 'ERROR 18', RC, THISLOC=LOC )
        1464           0 :           RETURN
        1465             :       ENDIF
        1466             :
        1467             :       !=================================================================
        1468             :       ! Introduce Ustar and Z0 from GEOS data
        1469             :       !=================================================================
        1470           0 :       DO I = 1, HcoState%NX
        1471             :
        1472             :          ! Just assign for flag mobilisation candidates
        1473           0 :          IF ( FLG_MBL_SLICE(I) ) THEN
        1474           0 :             WND_FRC_GEOS(I) = ExtState%USTAR%Arr%Val(I,LAT_IDX)
        1475           0 :             Z0_GEOS(I)      = ExtState%Z0%Arr%Val(I,LAT_IDX)
        1476             :          ELSE
        1477           0 :             WND_FRC_GEOS(I) = 0.0D0
        1478           0 :             Z0_GEOS(I)      = 0.0D0
        1479             :          ENDIF
        1480             :       ENDDO
        1481             :
        1482             :       !=================================================================
        1483             :       ! Surface exchange properties over erodible surfaces
        1484             :       ! DO NEED THIS: Compute Monin-Obukhov and Friction velocities
        1485             :       ! appropriate for dust producing regions.
        1486             :       !
        1487             :       ! Now calling Stripped down (adiabatic) version     tdf 10/27/2K3
        1488             :       ! rgh_mmn_mbl parameter included directly in blm_mbl
        1489             :       !=================================================================
        1490             :       CALL BLM_MBL(
        1491             :      &    HcoState,
        1492             :      &    FLG_MBL_SLICE,       ! I [flg] Mobilization candidate flag
        1493             :      &    RGH_MMN,             ! I [m] Roughness length momentum, Z0,m
        1494             :      &    WND_RFR,             ! I [m s-1] 10 m wind speed
        1495             :      &    MNO_LNG,             ! O [m] Monin-Obukhov length
        1496             :      &    WND_FRC,
        1497           0 :      &    RC )                 ! O [m s-1] Surface friction velocity, U*
        1498           0 :       IF ( RC /= HCO_SUCCESS ) THEN
        1499           0 :           CALL HCO_ERROR( 'ERROR 19', RC, THISLOC=LOC )
        1500           0 :           RETURN
        1501             :       ENDIF
        1502             :
        1503             :       !=================================================================
        1504             :       ! Factor by which surface roughness increases threshold friction
        1505             :       ! velocity.  The sink of atrmospheric momentum into non-erodible
        1506             :       ! roughness elements Zender et al., expression (3)
        1507             :       !=================================================================
        1508             : !-----------------------------------------------------------------------------
        1509             : ! Prior to 1/25/07:
        1510             : ! For now, instead of calling this routine to get FRC_THR_NCR_DRG, we will
        1511             : ! just set it to 1 (tdf, bmy, 1/25/07)
        1512             : !
        1513             : ! %%%%% DO NOT DELETE -- LEAVE THIS CODE COMMENTED OUT %%%%%
        1514             : !
        1515             : !      CALL FRC_THR_NCR_DRG_GET(
        1516             : !     &    HcoState,
        1517             : !     &    FRC_THR_NCR_DRG,     ! O [frc] Factor increases thresh. fric. veloc.
        1518             : !     &    FLG_MBL_SLICE,       ! I [flg] Mobilization candidate flag
        1519             : !     &    RGH_MMN_MBL,         ! I [m] Rgh length momentum for erodible sfcs
        1520             : !     &    RGH_MMN_SMT,         ! I [m] Smooth roughness length, Z0,m,s
        1521             : !     &    RC )
        1522             : !-----------------------------------------------------------------------------
        1523             :
        1524             :       ! Now set roughness factor to 1.0 (tdf, bmy, 1/25/07)
        1525           0 :       FRC_THR_NCR_DRG(:) = 1.0d0
        1526             :
        1527             :       !=================================================================
        1528             :       ! Convert volumetric water content to gravimetric water content
        1529             :       ! NB: Owen effect included in wnd_frc_slt_get
        1530             :       !=================================================================
        1531             :       CALL VWC2GWC(
        1532             :      &    HcoState,
        1533             :      &    FLG_MBL_SLICE,       ! I [flg] Mobilization candidate flag
        1534             :      &    GWC_SFC,             ! O [kg kg-1] Gravimetric water content
        1535             :      &    VWC_SAT,             ! I [m3 m-3] Saturated VWC (sand-dependent)
        1536           0 :      &    VWC_SFC_SLICE )      ! I [m3 m-3] Volumetric water content
        1537             :
        1538             :       !=================================================================
        1539             :       ! Factor by which soil moisture increases threshold friction
        1540             :       ! velocity -- i.e. the inhibition of saltation by soil mositure,
        1541             :       ! Zender et al., exp(5).
        1542             :       !=================================================================
        1543             :       CALL FRC_THR_NCR_WTR_GET(
        1544             :      &    HcoState,
        1545             :      &    FLG_MBL_SLICE,       ! I [flg] Mobilization candidate flag
        1546             :      &    FRC_THR_NCR_WTR,     ! O [frc] Factor by which moisture increases
        1547             :                                !         threshold friction velocity
        1548             :      &    MSS_FRC_CLY_SLICE,   ! I [frc] Mass fraction of clay
        1549           0 :      &    GWC_SFC)             ! I [kg kg-1] Gravimetric water content
        1550             :
        1551             :       !=================================================================
        1552             :       ! Now, compute basic threshold friction velocity for saltation
        1553             :       ! over dry, bare, smooth ground.  fxm: Use surface density not
        1554             :       ! midlayer density
        1555             :       !=================================================================
        1556             :       CALL WND_FRC_THR_SLT_GET(
        1557             :      &    HcoState,
        1558             :      &    FLG_MBL_SLICE,       ! I mobilisation flag
        1559             :      &    DNS_MDP,             ! I [kg m-3] Midlayer density
        1560             :      &    WND_FRC_THR_SLT,     ! O [m s-1] Threshold friction velocity
        1561           0 :      &    RC )
        1562           0 :       IF ( RC /= HCO_SUCCESS ) THEN
        1563           0 :           CALL HCO_ERROR( 'ERROR 20', RC, THISLOC=LOC )
        1564           0 :           RETURN
        1565             :       ENDIF
        1566             :
        1567             :       ! Adjust threshold friction velocity to account
        1568             :       ! for moisture and roughness
        1569           0 :       DO I = 1, HcoState%NX
        1570           0 :          WND_FRC_THR_SLT(I) =      ! [m s-1] Threshold friction velocity
        1571             :                                    !         for saltation
        1572             :      &        WND_FRC_THR_SLT(i)   ! [m s-1] Threshold for dry, flat ground
        1573             :      &        * FRC_THR_NCR_WTR(i) ! [frc] Adjustment for moisture
        1574           0 :      &        * FRC_THR_NCR_DRG(i) ! [frc] Adjustment for roughness
        1575             :       ENDDO
        1576             :
        1577             :       ! Threshold saltation wind speed at reference height, 10m
        1578           0 :       DO I = 1, HcoState%NX
        1579           0 :          IF ( FLG_MBL_SLICE(I) ) THEN
        1580             :            WND_RFR_THR_SLT(I) =  ! [m s-1] Threshold 10 m wind speed
        1581             :                                  !         for saltation
        1582           0 :      &     WND_RFR(I) * WND_FRC_THR_SLT(I) / WND_FRC(i)
        1583             :          ENDIF
        1584             :       ENDDO
        1585             :
        1586             :       !=================================================================
        1587             :       ! Saltation increases friction speed by roughening surface
        1588             :       ! i.e. Owen effect, Zender et al., expression (4)
        1589             :       !
        1590             :       ! Compute the wind friction velocity due to saltation, U*,s
        1591             :       ! accounting for the Owen effect.
        1592             :       !=================================================================
        1593             :       CALL WND_FRC_SLT_GET(
        1594             :      &    HcoState,
        1595             :      &    FLG_MBL_SLICE,     ! I [flg] Mobilization candidate flag
        1596             :      &    WND_FRC,           ! I [m s-1] Surface friction velocity
        1597             :      &    WND_FRC_SLT,       ! O [m s-1] Saltating friction velocity
        1598             :      &    WND_RFR,           ! I [m s-1] Wind speed at reference height
        1599           0 :      &    WND_RFR_THR_SLT )  ! I [m s-1] Thresh. 10 m wind speed for saltation
        1600             :
        1601             :       !=================================================================
        1602             :       ! Compute horizontal streamwise mass flux, Zender et al., expr. (10)
        1603             :       !=================================================================
        1604             :       CALL FLX_MSS_HRZ_SLT_TTL_WHI79_GET(
        1605             :      &    HcoState,
        1606             :      &    DNS_MDP,             ! I [kg m-3] Midlayer density
        1607             :      &    FLG_MBL_SLICE,       ! I [flg] Mobilization candidate flag
        1608             :      &    FLX_MSS_HRZ_SLT_TTL, ! O [kg m-1 s-1] Vertically integrated
        1609             :                                !                streamwise mass flux
        1610             :      &    WND_FRC_SLT,         ! I [m s-1] Saltating friction velocity
        1611           0 :      &    WND_FRC_THR_SLT )    ! I [m s-1] Threshold friction vel for saltation
        1612             :
        1613             : !-----------------------------------------------------------------------------
        1614             : ! Prior to 1/25/07:
        1615             : ! We now multiply by the GOCART source function, and we will ignore
        1616             : ! the MBL_BSN_FCT_SLICE.  (tdf, bmy, 1/25/07)
        1617             : !
        1618             : ! %%%%% DO NOT DELETE -- LEAVE THIS CODE COMMENTED OUT %%%%%
        1619             : !
        1620             : !ctdf...prior to Apr/05/06
        1621             : !      ! Apply land surface and vegetation limitations
        1622             : !      ! and global tuning factor
        1623             : !      DO I = 1, HcoState%NX
        1624             : !         FLX_MSS_HRZ_SLT_TTL(I) = FLX_MSS_HRZ_SLT_TTL(I) ! [kg m-2 s-1]
        1625             : !     &       * LND_FRC_MBL_SLICE(i)   ! [frc] Bare ground fraction
        1626             : !     &       * MBL_BSN_FCT_SLICE(i)   ! [frc] Erodibility factor
        1627             : !     &       * FLX_MSS_FDG_FCT        ! [frc] Global mass flux tuning
        1628             : !                                      !       factor (empirical)
        1629             : !      ENDDO
        1630             : !-----------------------------------------------------------------------------
        1631             :
        1632             :       ! Now simply multiply by the GOCART source function.
        1633             :       ! The vegetation effect has been eliminated in LND_FRC_MBL_GET
        1634             :       ! and we also ignore MBL_BSN_FCT. (tdf, bmy, 1/25/07)
        1635           0 :       DO I = 1, HcoState%NX
        1636           0 :          FLX_MSS_HRZ_SLT_TTL(I) = FLX_MSS_HRZ_SLT_TTL(I) ! [kg m-2 s-1]
        1637             :      &       * LND_FRC_MBL_SLICE(i)   ! [frc] Bare ground fraction
        1638             :      &       * Inst%FLX_MSS_FDG_FCT   ! [frc] Global mass flux tuning
        1639           0 :      &       * SRCE_FUNC_SLICE(I)     ! GOCART source function
        1640             :       ENDDO
        1641             :
        1642             :       !=================================================================
        1643             :       ! Compute vertical dust mass flux, see Zender et al., expr. (11).
        1644             :       !=================================================================
        1645             :       CALL FLX_MSS_VRT_DST_TTL_MAB95_GET(
        1646             :      &    HcoState,
        1647             :      &    DST_SLT_FLX_RAT_TTL, ! O [m-1] Ratio of vertical dust flux to
        1648             :                                !         streamwise mass flux
        1649             :      &    FLG_MBL_SLICE,       ! I [flg] Mobilization candidate flag
        1650             :      &    FLX_MSS_HRZ_SLT_TTL, ! I [kg/m/s] Vertically integrated
        1651             :                                !            streamwise mass flux
        1652             :      &    FLX_MSS_VRT_DST_TTL, ! O [kg/m2/s] Total vertical mass flux of dust
        1653           0 :      &    MSS_FRC_CLY_SLICE )  ! I [frc] Mass fraction clay
        1654             :
        1655             :       !=================================================================
        1656             :       ! Now, partition vertical dust mass flux into transport bins
        1657             :       !
        1658             :       ! OVR_SRC_SNK_MSS needed in FLX_MSS_VRT_DST_PRT
        1659             :       ! computed in DST_PSD_MSS, called from "dust_mod.f" (tdf, 3/30/04)
        1660             :       !=================================================================
        1661             :       CALL FLX_MSS_VRT_DST_PRT( Inst,
        1662             :      &    HcoState%NX,
        1663             :      &    FLG_MBL_SLICE,       ! I [flg] Mobilization candidate flag
        1664             :      &    FLX_MSS_VRT_DST,     ! O [kg m-2 s-1] Vertical mass flux of dust
        1665           0 :      &    FLX_MSS_VRT_DST_TTL) ! I [kg m-2 s-1] Total vertical mass flux of dus
        1666             :
        1667             :       !=================================================================
        1668             :       ! Mask dust mass flux by tracer mass fraction at source
        1669             :       !=================================================================
        1670           0 :       FLG_CACO3 = .FALSE.          ! [flg] Activate CaCO3 tracer
        1671             :       IF ( FLG_CACO3 ) THEN
        1672             :          CALL FLX_MSS_CACO3_MSK(
        1673             :      &        HcoState,
        1674             :      &        ExtState,
        1675             :      &        Inst%DMT_VWR,        ! I [m] Mass weighted diameter resolved
        1676             :      &        FLG_MBL_SLICE,       ! I [flg] Mobilization candidate flag
        1677             :      &        FLX_MSS_VRT_DST,     ! I/O [kg m-2 s-1] Vert. mass flux of dust
        1678             :      &        MSS_FRC_CACO3_SLICE, ! I [frc] Mass fraction of CaCO3
        1679             :      &        MSS_FRC_CLY_SLICE,   ! I [frc] Mass fraction of clay
        1680             :      &        MSS_FRC_SND_SLICE,   ! I [frc] Mass fraction of sand
        1681             :      &        RC )
        1682             :          IF ( RC /= HCO_SUCCESS ) THEN
        1683             :              CALL HCO_ERROR( 'ERROR 21', RC, THISLOC=LOC )
        1684             :              RETURN
        1685             :          ENDIF
        1686             :       endif
        1687             :
        1688             :       ! Now, flx_mss_vrt_dst has units of kg/m2/sec
        1689             :
        1690             :       ! Fluxes are known, so adjust mixing ratios
        1691           0 :       DO  I=1, HcoState%NX            ! NB: Inefficient loop order
        1692           0 :          IF (FLG_MBL_SLICE(I)) THEN
        1693             :
        1694             :             ! Loop over dust bins
        1695           0 :             DO M = 1, NBINS
        1696             :
        1697             :                !========================================================
        1698             :                ! Compute dust mobilisation tendency.  Recognise that
        1699             :                ! what GEOS-CHEM wants is an increment in kg...So,
        1700             :                ! multiply by DXYP [m2] and tm_adj [sec]
        1701             :                !========================================================
        1702             :
        1703             :                ! [kg/sec]
        1704           0 :                Q_DST_TND_MBL(I,M) = FLX_MSS_VRT_DST(I,M)
        1705           0 :      &            *HcoState%Grid%AREA_M2%Val(I,LAT_IDX)
        1706             :
        1707             :                ! Introduce DSRC: dust mixing ratio increment   12/9/2K3
        1708             :                ! [kg]
        1709           0 :                DSRC(I,M) = TM_ADJ * Q_DST_TND_MBL(I,M)
        1710             :
        1711             :            ENDDO
        1712             :          ENDIF
        1713             :       ENDDO
        1714             :
        1715             :       ! Jump to here when no points are mobilization candidates
        1716             :   737 CONTINUE
        1717             :
        1718           0 :       RC = HCO_SUCCESS
        1719             :
        1720             :       ! Return to calling program
        1721             :       END SUBROUTINE DST_MBL
        1722             :
        1723             : !------------------------------------------------------------------------------
        1724             :
        1725           0 :       SUBROUTINE SRCE_FUNC_GET( HcoState, Inst, LAT_IDX, SRCE_FUNC_OUT )
        1726             : !
        1727             : !******************************************************************************
        1728             : !  Subroutine SRCE_FUNC_GET returns a latitude slice of the GOCART source
        1729             : !  function.  This routine is called by DST_MBL. (tdf, bmy, 1/25/07)
        1730             : !
        1731             : !  Arguments as Input:
        1732             : !  ============================================================================
        1733             : !  (1 ) LAT_IDX       (INTEGER) : GEOS-Chem latitude index
        1734             : !
        1735             : !  Arguments as Output:
        1736             : !  ============================================================================
        1737             : !  (1 ) SRCE_FUNC_OUT (REAL*8 ) : GOCART source function [fraction]
        1738             : !
        1739             : !  NOTES:
        1740             : !******************************************************************************
        1741             : !
        1742             :       ! Arguments
        1743             :       TYPE(HCO_State), POINTER :: HcoState   ! Hemco state
        1744             :       TYPE(MyInst),    POINTER :: Inst
        1745             :       INTEGER, INTENT(IN)      :: LAT_IDX
        1746             :       REAL*8,  INTENT(OUT)     :: SRCE_FUNC_OUT(HcoState%NX)
        1747             :
        1748             :       ! Local variables
        1749             :       INTEGER              :: LON_IDX
        1750             :
        1751             :       !=================================================================
        1752             :       ! SRCE_FUNC_GET begins here!
        1753             :       !=================================================================
        1754             :
        1755             :       ! Loop over longitudes
        1756           0 :       DO LON_IDX = 1, HcoState%NX
        1757             :
        1758             :          ! Save latitude slice in SRCE_FUNC_OUT
        1759           0 :          SRCE_FUNC_OUT(LON_IDX) = Inst%SRCE_FUNC(LON_IDX,LAT_IDX)
        1760             :
        1761             :       ENDDO
        1762             :
        1763             :       ! Return to calling program
        1764           0 :       END SUBROUTINE SRCE_FUNC_GET
        1765             :
        1766             : !------------------------------------------------------------------------------
        1767             :
        1768           0 :       SUBROUTINE SOI_TXT_GET( HcoState, ExtState, Inst, J,
        1769           0 :      &                        LND_FRC_DRY_OUT,
        1770           0 :      &                        MBL_BSN_FCT_OUT, MSS_FRC_CACO3_OUT,
        1771           0 :      &                        MSS_FRC_CLY_OUT, MSS_FRC_SND_OUT )
        1772             : !
        1773             : !******************************************************************************
        1774             : !  Subroutine SOI_GET_TXT returns a latitude slice of soil texture to the
        1775             : !  calling program DST_MBL.  (tdf, bmy, 3/30/04)
        1776             : !
        1777             : !  Arguments as Input:
        1778             : !  ============================================================================
        1779             : !  (1 ) J                 (INTEGER) : Grid box latitude index
        1780             : !
        1781             : !  Arguments as Output:
        1782             : !  ============================================================================
        1783             : !  (2 ) lnd_frc_dry_out   (REAL*8 ) : Dry land fraction      [fraction]
        1784             : !  (3 ) mbl_bsn_fct_out   (REAL*8 ) : Erodibility factor     [fraction]
        1785             : !  (4 ) mss_frc_CaCO3_out (REAL*8 ) : Mass fraction of CaCO3 [fraction]
        1786             : !  (5 ) mss_frc_cly_out   (REAL*8 ) : Mass fraction of clay  [fraction]
        1787             : !  (6 ) mss_frc_snd_out   (REAL*8 ) : Mass fraction of sand  [fraction]
        1788             : !
        1789             : !  NOTES:
        1790             : !  (1 ) Updated comments, cosmetic changes (bmy, 3/30/04)
        1791             : !******************************************************************************
        1792             : !
        1793             :
        1794             :       ! Arguments
        1795             :       TYPE(HCO_State), POINTER :: HcoState   ! Hemco state
        1796             :       TYPE(Ext_State), POINTER :: ExtState    ! Module options
        1797             :       TYPE(MyInst),    POINTER :: Inst
        1798             :       INTEGER, INTENT(IN)  :: J
        1799             :       REAL*8,  INTENT(OUT) :: LND_FRC_DRY_OUT(HcoState%NX)
        1800             :       REAL*8,  INTENT(OUT) :: MBL_BSN_FCT_OUT(HcoState%NX)
        1801             :       REAL*8,  INTENT(OUT) :: MSS_FRC_CACO3_OUT(HcoState%NX)
        1802             :       REAL*8,  INTENT(OUT) :: MSS_FRC_CLY_OUT(HcoState%NX)
        1803             :       REAL*8,  INTENT(OUT) :: MSS_FRC_SND_OUT(HcoState%NX)
        1804             :
        1805             :       ! Local variables
        1806             :       INTEGER              :: I
        1807             :
        1808             :       ! Ad hoc globally uniform clay mass fraction [kg/kg]
        1809             :       REAL*8,  PARAMETER   :: MSS_FRC_CLY_GLB = 0.20d0
        1810             :
        1811             :       !=================================================================
        1812             :       ! SOI_GET_TXT begins here!
        1813             :       !=================================================================
        1814           0 :       DO I = 1, HcoState%NX
        1815             :
        1816             :          ! Save dry land fraction slice
        1817           0 :          LND_FRC_DRY_OUT(I) = Inst%LND_FRC_DRY(I,J)
        1818             :
        1819             :          ! Change surface source distribution to "geomorphic"  tdf 12/12/2K3
        1820           0 :          MBL_BSN_FCT_OUT(I) = Inst%ERD_FCT_GEO(I,J)
        1821             :
        1822             :          !fxm: CaCO3 currently has missing value of
        1823             :          !     1.0e36 which causes problems
        1824           0 :          IF ( Inst%MSS_FRC_CACO3(I,J) <= 1.0D0 ) THEN
        1825           0 :             MSS_FRC_CACO3_OUT(I) = Inst%MSS_FRC_CACO3(I,J)
        1826             :          ELSE
        1827           0 :             MSS_FRC_CACO3_OUT(I) = 0.0D0
        1828             :          ENDIF
        1829             :
        1830             :          ! fxm Temporarily set mss_frc_cly used in mobilization to globally
        1831             :          !     uniform SGS value of 0.20, and put excess mass fraction
        1832             :          !     into sand
        1833           0 :          MSS_FRC_CLY_OUT(I) = MSS_FRC_CLY_GLB
        1834           0 :          MSS_FRC_SND_OUT(I) = Inst%MSS_FRC_SND(I,J) +
        1835           0 :      &                        Inst%MSS_FRC_CLY(I,J) -
        1836           0 :      &                        MSS_FRC_CLY_GLB
        1837             :
        1838             :       ENDDO
        1839             :
        1840             :       ! Return to calling program
        1841           0 :       END SUBROUTINE SOI_TXT_GET
        1842             :
        1843             : !------------------------------------------------------------------------------
        1844             :
        1845           0 :       SUBROUTINE SFC_TYP_GET( HcoState, ExtState,
        1846           0 :      &                        Inst, J, SFC_TYP_OUT, RC )
        1847             : !
        1848             : !******************************************************************************
        1849             : !  Subroutine SFC_TYP_GET returns a latitude slice of LSM surface type
        1850             : !  to the calling programs DST_MBL & DST_DPS_DRY. (tdf, bmy, 3/30/04)
        1851             : !
        1852             : !  Arguments as Input:
        1853             : !  ============================================================================
        1854             : !  (1 ) J           (INTEGER) : Grid box latitude index
        1855             : !
        1856             : !  Arguments as Output:
        1857             : !  ============================================================================
        1858             : !  (1 ) sfc_typ_out (REAL*8 ) : LSM surface type (0..28) [unitless]
        1859             : !
        1860             : !  NOTES
        1861             : !  (1 ) Updated comments & cosmetic changes (bmy, 3/30/04)
        1862             : !  (2 ) Added error trap (ckeller, 7/24/2014)
        1863             : !******************************************************************************
        1864             : !
        1865             :
        1866             :       ! Arguments
        1867             :       TYPE(HCO_State), POINTER :: HcoState   ! Hemco state
        1868             :       TYPE(Ext_State), POINTER :: ExtState
        1869             :       TYPE(MyInst),    POINTER :: Inst
        1870             :       INTEGER, INTENT(IN)      :: J
        1871             :       INTEGER, INTENT(OUT)     :: SFC_TYP_OUT(HcoState%NX)
        1872             :       INTEGER, INTENT(INOUT)   :: RC
        1873             :
        1874             :       ! Local variables
        1875             :       INTEGER                  :: I, TMP
        1876             :       CHARACTER(LEN=255)       :: MSG
        1877             :
        1878             :       !=================================================================
        1879             :       ! SFC_TYP_GET begins here!
        1880             :       !=================================================================
        1881           0 :       DO I = 1, HcoState%NX
        1882           0 :          TMP = INT(Inst%SFC_TYP(I,J))
        1883             :
        1884             :          ! Make sure value is within valid range (1 - NN_SFCTYP).
        1885           0 :          SFC_TYP_OUT(I) = MAX( MIN(TMP,NN_SFCTYP), 0 )
        1886             :       ENDDO
        1887             :
        1888             :       ! Return with success
        1889           0 :       RC = HCO_SUCCESS
        1890             :
        1891             :       ! Return to calling program
        1892           0 :       END SUBROUTINE SFC_TYP_GET                       ! end sfc_typ_get()
        1893             :
        1894             : !------------------------------------------------------------------------------
        1895             :
        1896           0 :       SUBROUTINE TPT_GND_SOI_GET( HcoState, J, TS,
        1897           0 :      &                            TPT_GND_OUT, TPT_SOI_OUT )
        1898             : !
        1899             : !******************************************************************************
        1900             : !  Subroutine TPT_GND_SOI_GET returns a latitude slice of soil temperature and
        1901             : !  ground temperature to the calling program DST_MBL. (tdf, bmy, 3/30/04)
        1902             : !
        1903             : !  Arguments as Input:
        1904             : !  ============================================================================
        1905             : !  (1 ) J           (INTEGER) : Grid box latitude index
        1906             : !  (2 ) TS          (REAL*8)  : Surface temperature at 2m [K]
        1907             : !
        1908             : !  Arguments as Output:
        1909             : !  ============================================================================
        1910             : !  (2 ) TPT_GND_OUT (REAL*8 ) : Ground temperature array slice [K]
        1911             : !  (3 ) tpt_soi_out (REAL*8 ) : Soil temperature array slice   [K]
        1912             : !
        1913             : !  NOTES
        1914             : !  (1 ) Updated comments & cosmetic changes (bmy, 3/30/04)
        1915             : !******************************************************************************
        1916             : !
        1917             :
        1918             :       ! Arguments
        1919             :       INTEGER, INTENT(IN)  :: J
        1920             :       TYPE(HCO_State), POINTER :: HcoState   ! Hemco state
        1921             :       REAL(hp),INTENT(IN)  :: TS(HcoState%NX,HcoState%NY)
        1922             :       REAL*8,  INTENT(OUT) :: TPT_GND_OUT(HcoState%NX)
        1923             :       REAL*8,  INTENT(OUT) :: TPT_SOI_OUT(HcoState%NX)
        1924             :
        1925             :       ! Local variables
        1926             :       INTEGER              :: I
        1927             :
        1928             :       !=================================================================
        1929             :       ! TPT_GND_SOI_GET begins here!
        1930             :       !=================================================================
        1931             :
        1932             :       ! Use TS from GEOS-CHEM (tdf, 3/30/04)
        1933           0 :       DO I = 1, HcoState%NX
        1934           0 :          TPT_GND_OUT(I) = TS(I,J)
        1935           0 :          TPT_SOI_OUT(I) = TS(I,J)
        1936             :       ENDDO
        1937             :
        1938             :       ! Return to calling program
        1939           0 :       END SUBROUTINE TPT_GND_SOI_GET
        1940             :
        1941             : !------------------------------------------------------------------------------
        1942             :
        1943           0 :       SUBROUTINE VWC_SFC_GET( HcoState, J, GWETTOP, VWC_SFC_OUT )
        1944             : !
        1945             : !******************************************************************************
        1946             : !  Subroutine TPT_GND_SOI_GET returns a latitude slice of volumetric water
        1947             : !  content to the calling program DST_MBL. (tdf, bmy, 3/30/04)
        1948             : !
        1949             : !  Arguments as Input:
        1950             : !  ============================================================================
        1951             : !  (1 ) J       (INTEGER) : Grid box latitude index
        1952             : !  (2 ) GWETTOP (REAL*8)  : Top soil moisture [unitless]
        1953             : !
        1954             : !  Arguments as Output:
        1955             : !  ============================================================================
        1956             : !  VWC_SFC_OUT  (REAL*8 ) : Volumetric water content [m3/m3]
        1957             : !
        1958             : !  NOTES
        1959             : !  (1 ) Updated comments & cosmetic changes (bmy, 3/30/04)
        1960             : !******************************************************************************
        1961             : !
        1962             :
        1963             :       ! Arguments
        1964             :       INTEGER, INTENT(IN)  :: J
        1965             :       TYPE(HCO_State), POINTER        :: HcoState   ! Hemco state
        1966             :       REAL(hp), INTENT(IN)  :: GWETTOP(HcoState%NX,HcoState%NY)
        1967             :       REAL*8,  INTENT(OUT) :: VWC_SFC_OUT(HcoState%NX)
        1968             :
        1969             :       ! Local variables
        1970             :       INTEGER              :: I
        1971             :
        1972             :       !=================================================================
        1973             :       ! VWC_SFC_GET begins here!
        1974             :       !=================================================================
        1975           0 :       DO I = 1, HcoState%NX
        1976           0 :          VWC_SFC_OUT(I) = GWETTOP(I,J)
        1977             :       ENDDO
        1978             :
        1979             :       ! Return to calling program
        1980           0 :       END SUBROUTINE VWC_SFC_GET
        1981             :
        1982             : !------------------------------------------------------------------------------
        1983             :
        1984             :       REAL*8 FUNCTION DSVPDT_H2O_LQD_PRK78_FST_SCL( TPT_CLS )
        1985             : !
        1986             : !******************************************************************************
        1987             : !  Function DSVPDT_H2O_LQD_PRK78_FST_SCL returns the derivative of saturation
        1988             : !  vapor pressure [Pa] over planar liquid water (tdf, bmy, 3/30/04)
        1989             : !
        1990             : !  Arguments as Input:
        1991             : !  ============================================================================
        1992             : !  (1 ) TPT_CLS (REAL*8) : Temperature in Celsius [C]
        1993             : !
        1994             : !  NOTES:
        1995             : !  (1 ) Updated comments, cosmetic changes.  Also now force double-precision
        1996             : !        with "D" exponents. (bmy, 3/30/04)
        1997             : !******************************************************************************
        1998             : !
        1999             :       ! Arguments
        2000             :       REAL*8, INTENT(IN) :: TPT_CLS
        2001             :
        2002             :       ! Local variables
        2003             :       REAL*8, PARAMETER  :: C0 = 4.438099984d-01
        2004             :       REAL*8, PARAMETER  :: C1 = 2.857002636d-02
        2005             :       REAL*8, PARAMETER  :: C2 = 7.938054040d-04
        2006             :       REAL*8, PARAMETER  :: C3 = 1.215215065d-05
        2007             :       REAL*8, PARAMETER  :: C4 = 1.036561403d-07
        2008             :       REAL*8, PARAMETER  :: C5 = 3.532421810d-10
        2009             :       REAL*8, PARAMETER  :: C6 =-7.090244804d-13
        2010             :
        2011             :       !=================================================================
        2012             :       ! DSVPDT_H2O_LQD_PRK78_FST_SCL begins here!
        2013             :       !=================================================================
        2014             :
        2015             :       ! Return deriv. of saturation vapor pressure [Pa]
        2016             :       DSVPDT_H2O_LQD_PRK78_FST_SCL = 100.0d0 * ( C0+TPT_CLS *
        2017             :      &                                         ( C1+TPT_CLS *
        2018             :      &                                         ( C2+TPT_CLS *
        2019             :      &                                         ( C3+TPT_CLS *
        2020             :      &                                         ( C4+TPT_CLS *
        2021             :      &                                         ( C5+TPT_CLS * C6 ))))))
        2022             :
        2023             :       ! Return to calling program
        2024             :       END FUNCTION DSVPDT_H2O_LQD_PRK78_FST_SCL
        2025             :
        2026             : !------------------------------------------------------------------------------
        2027             :
        2028             :       REAL*8 FUNCTION DSVPDT_H2O_ICE_PRK78_FST_SCL( TPT_CLS )
        2029             : !
        2030             : !******************************************************************************
        2031             : !  Function DSVPDT_H2O_ICE_PRK78_FST_SCL returns the derivative of saturation
        2032             : !  vapor pressure [Pa] over planar ice water (tdf, bmy, 3/30/04)
        2033             : !
        2034             : !  Arguments as Input:
        2035             : !  ============================================================================
        2036             : !  (1 ) TPT_CLS (REAL*8) : Temperature in Celsius [C]
        2037             : !
        2038             : !  NOTES:
        2039             : !  (1 ) Updated comments, cosmetic changes.  Also now force double-precision
        2040             : !        with "D" exponents. (bmy, 3/30/04)
        2041             : !******************************************************************************
        2042             : !
        2043             :       ! Arguments
        2044             :       REAL*8, INTENT(IN) :: TPT_CLS
        2045             :
        2046             :       ! Local variables
        2047             :       REAL*8, PARAMETER  :: D0 = 5.030305237d-01
        2048             :       REAL*8, PARAMETER  :: D1 = 3.773255020d-02
        2049             :       REAL*8, PARAMETER  :: D2 = 1.267995369d-03
        2050             :       REAL*8, PARAMETER  :: D3 = 2.477563108d-05
        2051             :       REAL*8, PARAMETER  :: D4 = 3.005693132d-07
        2052             :       REAL*8, PARAMETER  :: D5 = 2.158542548d-09
        2053             :       REAL*8, PARAMETER  :: D6 = 7.131097725d-12
        2054             :
        2055             :       !=================================================================
        2056             :       ! DSVPDT_H2O_ICE_PRK78_FST_SCL begins here!
        2057             :       !=================================================================
        2058             :
        2059             :       ! Return deriv. of sat vapor pressure [Pa]
        2060             :       DSVPDT_H2O_ICE_PRK78_FST_SCL = 100.0D0 * ( D0+TPT_CLS *
        2061             :      &                                         ( D1+TPT_CLS *
        2062             :      &                                         ( D2+TPT_CLS *
        2063             :      &                                         ( D3+TPT_CLS *
        2064             :      &                                         ( D4+TPT_CLS *
        2065             :      &                                         ( D5+TPT_CLS * D6 ))))))
        2066             :
        2067             :       ! Return to calling program
        2068             :       END FUNCTION DSVPDT_H2O_ICE_PRK78_FST_SCL
        2069             :
        2070             : !------------------------------------------------------------------------------
        2071             :
        2072             :       REAL*8 FUNCTION SVP_H2O_LQD_PRK78_FST_SCL( TPT_CLS )
        2073             : !
        2074             : !******************************************************************************
        2075             : !  Function SVP_H2O_LQD_PRK78_FST_SCL returns the saturation vapor pressure
        2076             : !  over planer liquid water [Pa]  See Lowe and Ficke (1974) as reported in
        2077             : !  PrK78 p. 625. Range of validity is -50 C < T < 50 C. (tdf, bmy, 3/30/04)
        2078             : !
        2079             : !  Arguments as Input:
        2080             : !  ============================================================================
        2081             : !  (1 ) TPT_CLS (REAL*8) : Temperature in Celsius [C]
        2082             : !
        2083             : !  NOTES:
        2084             : !  (1 ) Updated comments, cosmetic changes.  Also now force double-precision
        2085             : !        with "D" exponents. (bmy, 3/30/04)
        2086             : !******************************************************************************
        2087             : !
        2088             :       ! Arguments
        2089             :       REAL*8, INTENT(IN) :: TPT_CLS
        2090             :
        2091             :       ! Local variables
        2092             :       REAL*8, PARAMETER  :: A0 = 6.107799961d0
        2093             :       REAL*8, PARAMETER  :: A1 = 4.436518521d-01
        2094             :       REAL*8, PARAMETER  :: A2 = 1.428945805d-02
        2095             :       REAL*8, PARAMETER  :: A3 = 2.650648471d-04
        2096             :       REAL*8, PARAMETER  :: A4 = 3.031240396d-06
        2097             :       REAL*8, PARAMETER  :: A5 = 2.034080948d-08
        2098             :       REAL*8, PARAMETER  :: A6 = 6.136820929d-11
        2099             :
        2100             :       !=================================================================
        2101             :       ! SVP_H2O_LQD_PRK78_FST_SCL begins here!
        2102             :       !=================================================================
        2103             :
        2104             :       ! Return saturation vapor pressure over liquid water [Pa]
        2105             :       SVP_H2O_LQD_PRK78_FST_SCL = 100.0D0 * ( A0+TPT_CLS *
        2106             :      &                                      ( A1+TPT_CLS *
        2107             :      &                                      ( A2+TPT_CLS *
        2108             :      &                                      ( A3+TPT_CLS *
        2109             :      &                                      ( A4+TPT_CLS *
        2110             :      &                                      ( A5+TPT_CLS * A6 ))))))
        2111             :
        2112             :       ! Return to calling program
        2113             :       END FUNCTION SVP_H2O_LQD_PRK78_FST_SCL
        2114             :
        2115             : !------------------------------------------------------------------------------
        2116             :
        2117             :       REAL*8 FUNCTION SVP_H2O_ICE_PRK78_FST_SCL( TPT_CLS )
        2118             : !
        2119             : !******************************************************************************
        2120             : !  Function SVP_H2O_ICE_PRK78_FST_SCL returns the saturation vapor pressure
        2121             : !  [Pa] over planar ice water (tdf, bmy, 3/30/04)
        2122             : !
        2123             : !  Arguments as Input:
        2124             : !  ============================================================================
        2125             : !  (1 ) TPT_CLS (REAL*8) : Temperature in Celsius [C]
        2126             : !
        2127             : !  NOTES:
        2128             : !  (1 ) Updated comments, cosmetic changes.  Also now force double-precision
        2129             : !        with "D" exponents. (bmy, 3/30/04)
        2130             : !******************************************************************************
        2131             : !
        2132             :
        2133             :       ! Arguments
        2134             :       REAL*8, INTENT(IN) :: TPT_CLS
        2135             :
        2136             :       ! Local variables
        2137             :       REAL*8, PARAMETER  :: B0 = 6.109177956d0
        2138             :       REAL*8, PARAMETER  :: B1 = 5.034698970d-01
        2139             :       REAL*8, PARAMETER  :: B2 = 1.886013408d-02
        2140             :       REAL*8, PARAMETER  :: B3 = 4.176223716d-04
        2141             :       REAL*8, PARAMETER  :: B4 = 5.824720280d-06
        2142             :       REAL*8, PARAMETER  :: B5 = 4.838803174d-08
        2143             :       REAL*8, PARAMETER  :: B6 = 1.838826904d-10
        2144             :
        2145             :       !=================================================================
        2146             :       ! SVP_H2O_ICE_PRK78_FST_SCL begins here!
        2147             :       !=================================================================
        2148             :
        2149             :       ! Return saturation vapor pressure over ice [Pa]
        2150             :       SVP_H2O_ICE_PRK78_FST_SCL = 100.0D0 * ( B0+TPT_CLS *
        2151             :      &                                      ( B1+TPT_CLS *
        2152             :      &                                      ( B2+TPT_CLS *
        2153             :      &                                      ( B3+TPT_CLS *
        2154             :      &                                      ( B4+TPT_CLS *
        2155             :      &                                      ( B5+TPT_CLS * B6 ))))))
        2156             :
        2157             :       ! Return to calling program
        2158             :       END FUNCTION SVP_H2O_ICE_PRK78_FST_SCL
        2159             :
        2160             : !------------------------------------------------------------------------------
        2161             :
        2162             :       REAL*8 FUNCTION TPT_BND_CLS_GET( TPT )
        2163             : !
        2164             : !******************************************************************************
        2165             : !  Function TPT_BND_CLS_GET returns the bounded temperature in [C],
        2166             : !  (i.e., -50 < T [C] < 50 C), given the temperature in [K].
        2167             : !  (tdf, bmy, 3/30/04)
        2168             : !
        2169             : !  Arguments as Input:
        2170             : !  ============================================================================
        2171             : !  (1 ) TPT (REAL*8) : Temperature in Kelvin [K]
        2172             : !
        2173             : !  NOTES:
        2174             : !******************************************************************************
        2175             : !
        2176             :       ! Arguments
        2177             :       REAL*8, INTENT(IN) :: TPT
        2178             :
        2179             :       ! Local variables
        2180             :       REAL*8, PARAMETER  :: TPT_FRZ_PNT=273.15
        2181             :
        2182             :       !=================================================================
        2183             :       ! TPT_BND_CLS_GET begins here!
        2184             :       !=================================================================
        2185             :       TPT_BND_CLS_GET = MIN( 50.0D0, MAX( -50.0D0, ( TPT-TPT_FRZ_PNT)) )
        2186             :
        2187             :       ! Return to calling program
        2188             :       END FUNCTION TPT_BND_CLS_GET
        2189             :
        2190             : !------------------------------------------------------------------------------
        2191             :
        2192           0 :       SUBROUTINE GET_ORO( HcoState, ExtState, OROGRAPHY, RC )
        2193             : !
        2194             : ! !USES:
        2195             : !
        2196             :       USE HCO_GEOTOOLS_MOD, ONLY : HCO_LANDTYPE
        2197             : !
        2198             : !******************************************************************************
        2199             : !  Subroutine GET_ORO creates a 2D orography array, OROGRAPHY, from the
        2200             : !  GMAO surface type fraction fields, based on definition of GMAO LWI, with
        2201             : !  modification to qualify land ice as ice. Ocean=0 (no ice); Land=1; Ice=2.
        2202             : !
        2203             : !  Arguments as Output:
        2204             : !  ============================================================================
        2205             : !  (1 ) OROGRAPHY (INTEGER) : Array for orography flags
        2206             : !
        2207             : !  NOTES:
        2208             : !  (1 ) Added parallel DO-loop (bmy, 4/14/04)
        2209             : !  (2 ) Now modified for GCAP and GEOS-5 met fields (swu, bmy, 6/9/05)
        2210             : !  (3 ) Now use IS_LAND, IS_WATER, IS_ICE functions from "dao_mod.f"
        2211             : !        (bmy, 8/17/05)
        2212             : !  09 Nov 2012 - M. Payer    - Replaced all met field arrays with State_Met
        2213             : !                              derived type object
        2214             : !******************************************************************************
        2215             : !
        2216             :
        2217             :       ! Arguments
        2218             :       TYPE(HCO_State), POINTER       :: HcoState
        2219             :       Type(Ext_State), POINTER       :: ExtState
        2220             :       INTEGER,         INTENT(OUT  ) :: OROGRAPHY(HcoState%NX,
        2221             :      &                                            HcoState%NY)
        2222             :       INTEGER,         INTENT(INOUT) :: RC
        2223             :
        2224             :       ! Local variables
        2225             :       INTEGER             :: I, J
        2226             :
        2227             :       !=================================================================
        2228             :       ! GET_ORO begins here!
        2229             :       !=================================================================
        2230             :
        2231             : !$OMP PARALLEL DO
        2232             : !$OMP+DEFAULT( SHARED )
        2233             : !$OMP+PRIVATE( I, J )
        2234           0 :       DO J = 1, HcoState%NY
        2235           0 :       DO I = 1, HcoState%NX
        2236             :
        2237             :          ! Set orography to from fraction land type
        2238           0 :          OROGRAPHY (I,J) = HCO_LANDTYPE( ExtState%FRLAND%Arr%Val(I,J),
        2239           0 :      &                                   ExtState%FRLANDIC%Arr%Val(I,J),
        2240           0 :      &                                   ExtState%FROCEAN%Arr%Val(I,J),
        2241           0 :      &                                   ExtState%FRSEAICE%Arr%Val(I,J),
        2242           0 :      &                                   ExtState%FRLAKE%Arr%Val(I,J) )
        2243             :
        2244             :       ENDDO
        2245             :       ENDDO
        2246             : !$OMP END PARALLEL DO
        2247             :
        2248             :       ! Return w/ success
        2249           0 :       RC = HCO_SUCCESS
        2250             :
        2251           0 :       END SUBROUTINE GET_ORO
        2252             :
        2253             : !------------------------------------------------------------------------------
        2254             :
        2255           0 :       SUBROUTINE HYD_PRP_GET( HcoState,     FLG_MBL, MSS_FRC_CLY_SLC,
        2256           0 :      &                        MSS_FRC_SND_SLC, VWC_DRY, VWC_OPT,
        2257           0 :      &                        VWC_SAT                            )
        2258             : !
        2259             : !******************************************************************************
        2260             : !  Subroutine HYD_PRP_GET determines hydrologic properties from soil texture.
        2261             : !  (tdf, bmy, 3/30/04)
        2262             : !
        2263             : !  Arguments as Input:
        2264             : !  ============================================================================
        2265             : !  (1 ) FLG_MBL     (LOGICAL) : Mobilization candidate flag [unitless]
        2266             : !  (2 ) MSS_FRC_CLY (REAL*8 ) : Mass fraction clay          [fraction]
        2267             : !  (3 ) MSS_FRC_SND (REAL*8 ) : Mass fraction sand          [fraction]
        2268             : !
        2269             : !  Arguments as Output:
        2270             : !  ============================================================================
        2271             : !  (4 ) VWC_DRY     (REAL*8 ) : Dry volumetric water content (no E-T) [m3/m3]
        2272             : !  (5 ) VWC_OPT     (REAL*8 ) : E-T optimal volumetric water content  [m3/m3]
        2273             : !  (6 ) VWC_SAT     (REAL*8 ) : Saturated volumetric water content    [m3/m3]
        2274             : !
        2275             : !  NOTES:
        2276             : !  (1 ) All I/O for this routine is time-invariant, thus, the hydrologic
        2277             : !        properties could be computed once at initialization.  However,
        2278             : !        FLG_MBL is time-dependent, so we should keep this as-is.
        2279             : !        (tdf, 10/27/03)
        2280             : !******************************************************************************
        2281             : !
        2282             :
        2283             :       ! Arguments
        2284             :       TYPE(HCO_State), POINTER :: HcoState
        2285             :       LOGICAL, INTENT(IN)  :: FLG_MBL(HcoState%NX)
        2286             :       REAL*8,  INTENT(IN)  :: MSS_FRC_CLY_SLC(HcoState%NX)
        2287             :       REAL*8,  INTENT(IN)  :: MSS_FRC_SND_SLC(HcoState%NX)
        2288             :       REAL*8,  INTENT(OUT) :: VWC_DRY(HcoState%NX)
        2289             :       REAL*8,  INTENT(OUT) :: VWC_OPT(HcoState%NX)
        2290             :       REAL*8,  INTENT(OUT) :: VWC_SAT(HcoState%NX)
        2291             :
        2292             :       ! Local variables
        2293             :       INTEGER              :: LON_IDX
        2294             :
        2295             :       ! [frc] Exponent "b" for smp (clay-dependent)
        2296           0 :       REAL*8               :: SMP_XPN_B(HcoState%NX)
        2297             :
        2298             :       ! [mm H2O] Saturated soil matric potential (sand-dependent)
        2299           0 :       REAL*8               :: SMP_SAT(HcoState%NX)
        2300             :
        2301             :       !=================================================================
        2302             :       ! HYD_PRP_GET begins here
        2303             :       !=================================================================
        2304             :
        2305             :       ! Initialize output values
        2306           0 :       VWC_DRY(:) = 0.0D0
        2307           0 :       VWC_OPT(:) = 0.0D0
        2308           0 :       VWC_SAT(:) = 0.0D0
        2309             :
        2310             :       ! Time-invariant soil hydraulic properties
        2311             :       ! See Bon96 p. 98, implemented in CCM:lsm/lsmtci()
        2312           0 :       DO LON_IDX = 1, HcoState%NX
        2313             :
        2314           0 :          IF ( FLG_MBL(LON_IDX) ) THEN
        2315             :
        2316             :            ! Exponent "b" for smp (clay-dependent) [fraction]
        2317             :            SMP_XPN_B(LON_IDX) =
        2318           0 :      &         2.91D0 +0.159D0 * MSS_FRC_CLY_SLC(LON_IDX) * 100.0D0
        2319             :
        2320             :            ! NB: Adopt convention that matric potential is positive definite
        2321             :            ! Saturated soil matric potential (sand-dependent) [mm H2O]
        2322             :            SMP_SAT(LON_IDX) =
        2323             :      &         10.0D0 * (10.0D0**(1.88D0-0.0131D0
        2324           0 :      &                          * MSS_FRC_SND_SLC(LON_IDX)*100.0D0))
        2325             :
        2326             :            ! Saturated volumetric water content (sand-dependent) ! [m3 m-3]
        2327             :            VWC_SAT(LON_IDX)=
        2328           0 :      &         0.489D0 - 0.00126D0 * MSS_FRC_SND_SLC(LON_IDX)*100.0D0
        2329             :
        2330             :            ! [m3 m-3]
        2331             :            VWC_DRY(LON_IDX) =
        2332             :
        2333             :                 ! Dry volumetric water content (no E-T)
        2334             :      &          VWC_SAT(LON_IDX)*(316230.0D0/SMP_SAT(LON_IDX))
        2335           0 :      &                       **(-1.0D0/SMP_XPN_B(LON_IDX))
        2336             :
        2337             :            ! E-T optimal volumetric water content! [m3 m-3]
        2338             :            VWC_OPT(LON_IDX) =
        2339             :      &         VWC_SAT(LON_IDX)*(158490.0D0/SMP_SAT(LON_IDX))
        2340           0 :      &                        **(-1.0D0/SMP_XPN_B(LON_IDX))
        2341             :          ENDIF
        2342             :       ENDDO
        2343             :
        2344             :       ! Return to calling program
        2345           0 :       END SUBROUTINE HYD_PRP_GET
        2346             :
        2347             : !------------------------------------------------------------------------------
        2348             :
        2349             :       SUBROUTINE CND_TRM_SOI_GET( HcoState,CND_TRM_SOI,FLG_MBL,LVL_DLT,
        2350             :      &                            MSS_FRC_CLY_SLC, MSS_FRC_SND_SLC,
        2351             :      &                            TPT_SOI,
        2352             :      &                            VWC_DRY,     VWC_OPT,     VWC_SAT,
        2353             :      &                            VWC_SFC )
        2354             :
        2355             : !
        2356             : !******************************************************************************
        2357             : !  Subroutine CND_TRM_SOI_GET gets thermal properties of soil.  Currently this
        2358             : !  routine is optimized for ground without snow-cover.  Although snow
        2359             : !  thickness is read in, it is not currently used. (tdf, bmy, 3/30/04)
        2360             : !
        2361             : !  Arguments as Input:
        2362             : !  ============================================================================
        2363             : !  (3 ) lvl_dlt     (REAL*8 ) : Soil layer thickness                  [m    ]
        2364             : !  (4 ) mss_frc_cly (REAL*8 ) : Mass fraction clay                    [frac.]
        2365             : !  (5 ) mss_frc_snd (REAL*8 ) : Mass fraction sand                    [frac.]
        2366             : !  (6 ) tpt_soi     (REAL*8 ) : Soil temperature                      [K    ]
        2367             : !  (7 ) vwc_dry     (REAL*8 ) : Dry volumetric water content (no E-T) [m3/m3]
        2368             : !  (8 ) vwc_opt     (REAL*8 ) : E-T optimal volumetric water content  [m3/m3]
        2369             : !  (9 ) vwc_sat     (REAL*8 ) : Saturated volumetric water content    [m3/m3]
        2370             : !  (10) vwc_sfc     (REAL*8 ) : Volumetric water content              [m3/m3]
        2371             : !
        2372             : !  Arguments as Output:
        2373             : !  ============================================================================
        2374             : !  (1 ) CND_TRM_SOI (REAL*8 ) : Soil thermal conductivity             [W/m/K]
        2375             : !  (2 ) FLG_MBL     (LOGICAL) : Mobilization candidate flag           [flag ]
        2376             : !
        2377             : !  NOTES:
        2378             : !******************************************************************************
        2379             : !
        2380             :
        2381             :       ! Arguments
        2382             :       TYPE(HCO_State), POINTER :: HcoState
        2383             :       LOGICAL, INTENT(IN)  :: FLG_MBL(HcoState%NX)
        2384             :       REAL*8,  INTENT(IN)  :: MSS_FRC_CLY_SLC(HcoState%NX)
        2385             :       REAL*8,  INTENT(IN)  :: MSS_FRC_SND_SLC(HcoState%NX)
        2386             :       REAL*8,  INTENT(IN)  :: TPT_SOI(HcoState%NX)
        2387             :       REAL*8,  INTENT(IN)  :: VWC_DRY(HcoState%NX)
        2388             :       REAL*8,  INTENT(IN)  :: VWC_OPT(HcoState%NX)
        2389             :       REAL*8,  INTENT(IN)  :: VWC_SAT(HcoState%NX)
        2390             :       REAL*8,  INTENT(IN)  :: VWC_SFC(HcoState%NX)
        2391             :       REAL*8,  INTENT(OUT) :: CND_TRM_SOI(HcoState%NX)
        2392             :       REAL*8,  INTENT(OUT) :: LVL_DLT(HcoState%NX)
        2393             :
        2394             :       !------------
        2395             :       ! Parameters
        2396             :       !------------
        2397             :
        2398             :       ! Thermal conductivity of ice water [W m-1 K-1]
        2399             :       REAL*8, PARAMETER    :: CND_TRM_H2O_ICE      = 2.2d0
        2400             :
        2401             :       ! Thermal conductivity of liquid water [W m-1 K-1]
        2402             :       REAL*8, PARAMETER    :: CND_TRM_H2O_LQD      = 0.6d0
        2403             :
        2404             :       ! Thermal conductivity of snow Bon96 p. 77 [W m-1 K-1]
        2405             :       REAL*8, PARAMETER    :: CND_TRM_SNW          = 0.34d0
        2406             :
        2407             :       ! Soil layer thickness, top layer! [m]
        2408             :       REAL*8, PARAMETER    :: LVL_DLT_SFC          = 0.1d0
        2409             :
        2410             :       ! Temperature range of mixed phase soil [K]
        2411             :       REAL*8, PARAMETER    :: TPT_DLT              = 0.5d0
        2412             :
        2413             :       ! Latent heat of fusion of H2O at 0 C, standard [J kg-1]
        2414             :       REAL*8, PARAMETER    :: LTN_HEAT_FSN_H2O_STD = 0.3336d06
        2415             :
        2416             :       ! Liquid water density [kg/m3]
        2417             :       REAL*8, PARAMETER    :: DNS_H2O_LQD_STD      = 1000.0d0
        2418             :
        2419             :       ! Kelvin--Celsius scale offset Bol80 [K]
        2420             :       REAL*8, PARAMETER    :: TPT_FRZ_PNT          = 273.15d0
        2421             :
        2422             :       !-----------------
        2423             :       ! Local variables
        2424             :       !-----------------
        2425             :
        2426             :       ! Longitude index
        2427             :       INTEGER              :: LON_IDX
        2428             :
        2429             :       ! Thermal conductivity of dry soil [W m-1 K-1]
        2430             :       REAL*8               :: CND_TRM_SOI_DRY(HcoState%NX)
        2431             :
        2432             :       ! Soil thermal conductivity, frozen [W m-1 K-1]
        2433             :       REAL*8               :: CND_TRM_SOI_FRZ(HcoState%NX)
        2434             :
        2435             :       ! Thermal conductivity of soil solids [W m-1 K-1]
        2436             :       REAL*8               :: CND_TRM_SOI_SLD(HcoState%NX)
        2437             :
        2438             :       ! Soil thermal conductivity, unfrozen [W m-1 K-1]
        2439             :       REAL*8               :: CND_TRM_SOI_WRM(HcoState%NX)
        2440             :
        2441             :       ! Volumetric latent heat of fusion [J m-3]
        2442             :       REAL*8               :: LTN_HEAT_FSN_VLM(HcoState%NX)
        2443             :
        2444             :       ! Bounded geometric bulk thickness of snow [m]
        2445             :       REAL*8               :: SNW_HGT_BND
        2446             :
        2447             :       !=================================================================
        2448             :       ! CND_TRM_SOI_GET begins here!
        2449             :       !=================================================================
        2450             :
        2451             :       ! [m] Soil layer thickness
        2452             :       LVL_DLT(:) = LVL_DLT_SFC
        2453             :
        2454             :       ! [W m-1 K-1] Soil thermal conductivity
        2455             :       CND_TRM_SOI(:) = 0.0D0
        2456             :
        2457             :       ! Loop over longitude
        2458             :       DO LON_IDX = 1, HcoState%NX
        2459             :          IF ( FLG_MBL(LON_IDX) ) THEN
        2460             :
        2461             :            ! Volumetric latent heat of fusion [J m-3]
        2462             :            LTN_HEAT_FSN_VLM(LON_IDX) = VWC_SFC(LON_IDX)
        2463             :      &         * LTN_HEAT_FSN_H2O_STD * DNS_H2O_LQD_STD
        2464             :
        2465             :            !Thermal conductivity of soil solids Bon96 p. 77 [W/m/K]
        2466             :            CND_TRM_SOI_SLD(LON_IDX) =
        2467             :      &         ( 8.80D0 *MSS_FRC_SND_SLC(LON_IDX)
        2468             :      &         + 2.92D0 *MSS_FRC_CLY_SLC(LON_IDX) )
        2469             :      &         / (MSS_FRC_SND_SLC(LON_IDX)
        2470             :      &         + MSS_FRC_CLY_SLC(LON_IDX))
        2471             :
        2472             :            ! Thermal conductivity of dry soil Bon96 p. 77 [W/m/K]
        2473             :            cnd_trm_soi_dry(lon_idx) = 0.15D0
        2474             :
        2475             :            ! Soil thermal conductivity, unfrozen [W/m/K]
        2476             :            CND_TRM_SOI_WRM(LON_IDX) =
        2477             :      &          CND_TRM_SOI_DRY(LON_IDX)
        2478             :      &         + ( CND_TRM_SOI_SLD(LON_IDX)
        2479             :      &         ** (1.0D0-VWC_SAT(LON_IDX))
        2480             :      &         * (CND_TRM_H2O_LQD ** VWC_SFC(LON_IDX) )
        2481             :      &         - CND_TRM_SOI_DRY(LON_IDX) )
        2482             :      &         * VWC_SFC(LON_IDX) / VWC_SAT(lon_idx)
        2483             :
        2484             :            ! Soil thermal conductivity, frozen [W/m/K]
        2485             :            CND_TRM_SOI_FRZ(LON_IDX) =
        2486             :      &          CND_TRM_SOI_DRY(LON_IDX)
        2487             :      &         + ( CND_TRM_SOI_SLD(LON_IDX)
        2488             :      &         ** (1.0D0-VWC_SAT(LON_IDX))
        2489             :      &         * (CND_TRM_H2O_ICE ** VWC_SFC(LON_IDX) )
        2490             :      &         - CND_TRM_SOI_DRY(LON_IDX) )
        2491             :      &         * VWC_SFC(LON_IDX) / VWC_SAT(LON_IDX)
        2492             :
        2493             :            IF (TPT_SOI(LON_IDX) < TPT_FRZ_PNT-TPT_DLT) THEN
        2494             :                ! Soil thermal conductivity [W/m/K]
        2495             :                CND_TRM_SOI(LON_IDX) = CND_TRM_SOI_FRZ(LON_IDX)
        2496             :            ENDIF
        2497             :
        2498             :            IF ( (TPT_SOI(LON_IDX) >= TPT_FRZ_PNT-TPT_DLT)
        2499             :      &          .AND. (TPT_SOI(LON_IDX) <= TPT_FRZ_PNT+TPT_DLT) )
        2500             :      &     THEN
        2501             :
        2502             :               ! Soil thermal conductivity [W/m/K]
        2503             :               CND_TRM_SOI(LON_IDX) =
        2504             :      &            CND_TRM_SOI_FRZ(LON_IDX)
        2505             :      &            + (CND_TRM_SOI_FRZ(LON_IDX)
        2506             :      &            - CND_TRM_SOI_WRM(LON_IDX) )
        2507             :      &            * (TPT_SOI(LON_IDX)
        2508             :      &              -TPT_FRZ_PNT+TPT_DLT)
        2509             :      &            / (2.0D0*TPT_DLT)
        2510             :            ENDIF
        2511             :
        2512             :            IF (TPT_SOI(LON_IDX) > TPT_FRZ_PNT+TPT_DLT) THEN
        2513             :               ! Soil thermal conductivity[W/m/K]
        2514             :               CND_TRM_SOI(LON_IDX)=CND_TRM_SOI_WRM(LON_IDX)
        2515             :            ENDIF
        2516             :
        2517             : ! Implement this later(??)
        2518             : !cZ Blend snow into first soil layer
        2519             : !cZ Snow is not allowed to cover dust mobilization regions
        2520             : !cZ snw_hgt_bnd=min(snw_hgt(lon_idx),1.0D0) ! [m] Bounded geometric bulk thickness of snow
        2521             : !cZ lvl_dlt_snw(lon_idx)=lvl_dlt(lon_idx)+snw_hgt_bnd ! O [m] Soil layer thickness
        2522             : !cZ including snow Bon96 p. 77
        2523             : !
        2524             : !cZ cnd_trm_soi(lon_idx)= & ! [W m-1 K-1] Soil thermal conductivity Bon96 p. 77
        2525             : !cZ cnd_trm_snw*cnd_trm_soi(lon_idx)*lvl_dlt_snw(lon_idx) &
        2526             : !cZ       /(cnd_trm_snw*lvl_dlt(lon_idx)+cnd_trm_soi(lon_idx)*snw_hgt_bnd)
        2527             :
        2528             :          ENDIF
        2529             :       ENDDO
        2530             :
        2531             :       END SUBROUTINE CND_TRM_SOI_GET
        2532             :
        2533             : !------------------------------------------------------------------------------
        2534             :
        2535             :       SUBROUTINE TRN_FSH_VPR_SOI_ATM_GET( HcoState, FLG_MBL,
        2536             :      &                                    TPT_SOI,
        2537             :      &                                    TPT_SOI_FRZ,
        2538             :      &                                    TRN_FSH_VPR_SOI_ATM,
        2539             :      &                                    VWC_DRY,
        2540             :      &                                    VWC_OPT,
        2541             :      &                                    VWC_SFC )
        2542             : !
        2543             : !******************************************************************************
        2544             : !  Subroutine TRN_FSH_VPR_SOI_ATM_GET computes the factor describing effects
        2545             : !  of soil texture and moisture on vapor transfer between soil and atmosphere.
        2546             : !  Taken from Bon96 p. 59, CCM:lsm/surphys. (tdf, bmy, 3/30/04)
        2547             : !
        2548             : !  The TRN_FSH_VPR_SOI_ATM efficiency factor attempts to tie soil texture and
        2549             : !  moisture properties to the vapor conductance of the soil-atmosphere system.
        2550             : !  When the soil temperature is sub-freezing, the conductance describes the
        2551             : !  resistance to vapor sublimation (or deposition) and transport through the
        2552             : !  open soil pores to the atmosphere.
        2553             : !
        2554             : !  For warm soils, vapor transfer is most efficient at the optimal VWC for E-T
        2555             : !  Thus when vwc_sfc = vwc_opt, soil vapor transfer is perfectly efficient
        2556             : !  (trn_fsh_vpr_soi_atm = 1.0) so the soil does not contribute any resistance
        2557             : !  to the surface vapor transfer.
        2558             : !
        2559             : !  When vwc_sfc > vwc_opt, the soil has an excess of moisture and, again,
        2560             : !  vapor transfer is not limited by soil characteristics.
        2561             : !  In fact, according to Bon96 p. 98, vwc_dry is only slightly smaller than
        2562             : !  vwc_opt, so trn_fsh_vpr_soi_atm is usually either 0 or 1 and intermediate
        2563             : !  efficiencies occur over only a relatively small range of VWC.
        2564             : !
        2565             : !  When vwc_sfc < vwc_dry, the soil matrix is subsaturated and acts as a
        2566             : !  one-way sink for vapor through osmotic and capillary potentials.
        2567             : !  In this case trn_fsh_vpr_soi_atm = 0, which would cause the surface
        2568             : !  resistance rss_vpr_sfc to blow up, but this is guarded against and
        2569             : !  rss_sfc_vpr is set to ~1.0e6*rss_aer_vpr instead.
        2570             : !
        2571             : !  Note that this formulation does not seem to allow vapor transfer from
        2572             : !  the atmosphere to the soil when vwc_sfc < vwc_dry, even when
        2573             : !  e_atm > esat(Tg).
        2574             : !
        2575             : !  Air at the apparent sink for moisture is has vapor pressure e_sfc
        2576             : !  e_atm = Vapor pressure of ambient air at z = hgt_mdp
        2577             : !  e_sfc = Vapor pressure at apparent sink for moisture at z = zpd + rgh_vpr
        2578             : !  e_gnd = Vapor pressure at air/ground interface temperature
        2579             : !  Air at the soil interface is assumed saturated, i.e., e_gnd = esat(Tg)
        2580             : !
        2581             : !  Arguments as Input:
        2582             : !  ============================================================================
        2583             : !  (1 ) FLG_MBL             (LOGICAL) : Mobilization candidate flag [unitless]
        2584             : !  (2 ) TPT_SOI             (REAL*8 ) : Soil temperature            [K       ]
        2585             : !  (3 ) TPT_SOI_FRZ         (REAL*8 ) : Temperature of frozen soil  [K       ]
        2586             : !  (5 ) VWC_DRY             (REAL*8 ) : Dry volumetric WC (no E-T)  [m3/m3   ]
        2587             : !  (6 ) VWC_OPT             (REAL*8 ) : E-T optimal volumetric WC   [m3/m3   ]
        2588             : !  (7 ) VWC_SFC             (REAL*8 ) : Volumetric water content    [m3/m3   ]
        2589             : !
        2590             : !  Arguments as Output:
        2591             : !  ============================================================================
        2592             : !  (4 ) TRN_FSH_VPR_SOI_ATM (REAL*8 ) : Transfer efficiency of vapor from
        2593             : !                                       soil to atmosphere [fraction]
        2594             : !
        2595             : !  NOTES:
        2596             : !  (1 ) Updated comments, cosmetic changes.  Also force double-precision
        2597             : !        with "D" exponents. (tdf, bmy, 3/30/04)
        2598             : !******************************************************************************
        2599             : !
        2600             :
        2601             :       !----------------
        2602             :       ! Arguments
        2603             :       !----------------
        2604             :       TYPE(HCO_State), POINTER :: HCoState
        2605             :       LOGICAL, INTENT(IN)  :: FLG_MBL(HcoState%NX)
        2606             :       REAL*8,  INTENT(IN)  :: TPT_SOI(HcoState%NX)
        2607             :       REAL*8,  INTENT(IN)  :: TPT_SOI_FRZ
        2608             :       REAL*8,  INTENT(IN)  :: VWC_DRY(HcoState%NX)
        2609             :       REAL*8,  INTENT(IN)  :: VWC_OPT(HcoState%NX)
        2610             :       REAL*8,  INTENT(IN)  :: VWC_SFC(HcoState%NX)
        2611             :       REAL*8,  INTENT(OUT) :: TRN_FSH_VPR_SOI_ATM(HcoState%NX)
        2612             :
        2613             :       !----------------
        2614             :       ! Parameters
        2615             :       !----------------
        2616             :
        2617             :       ! Transfer efficiency of vapor from frozen soil to
        2618             :       ! atmosphere CCM:lsm/surphy()  [fraction]
        2619             :       REAL*8, PARAMETER    :: TRN_FSH_VPR_SOI_ATM_FRZ = 0.01D0
        2620             :
        2621             :       !-----------------
        2622             :       ! Local variables
        2623             :       !-----------------
        2624             :       INTEGER              :: LON_IDX
        2625             :
        2626             :       !=================================================================
        2627             :       ! TRN_FSH_VPR_SOI_ATM_GET
        2628             :       !=================================================================
        2629             :       TRN_FSH_VPR_SOI_ATM(:) = 0.0D0
        2630             :
        2631             :       ! Loop over longitudes
        2632             :       DO LON_IDX = 1, HcoState%NX
        2633             :
        2634             :          ! If this is a mobilization candidate ...
        2635             :          IF ( FLG_MBL(LON_IDX) ) THEN
        2636             :
        2637             :            ! ... and if the soil is above freezing ...
        2638             :            IF ( TPT_SOI(LON_IDX) > TPT_SOI_FRZ ) THEN
        2639             :
        2640             :               ! Transfer efficiency of cvapor from soil to atmosphere [frac]
        2641             :               ! CCM:lsm/surphys Bon96 p. 59
        2642             :               TRN_FSH_VPR_SOI_ATM(LON_IDX) =
        2643             :      &             MIN ( MAX(VWC_SFC(LON_IDX)-VWC_DRY(LON_IDX), 0.0D0)
        2644             :      &             /(VWC_OPT(LON_IDX)-VWC_DRY(LON_IDX)), 1.0D0)
        2645             :
        2646             :            ELSE
        2647             :
        2648             :               ! [frc] Bon96 p. 59
        2649             :               TRN_FSH_VPR_SOI_ATM(LON_IDX) = TRN_FSH_VPR_SOI_ATM_FRZ
        2650             :
        2651             :            ENDIF
        2652             :          ENDIF
        2653             :       ENDDO
        2654             :
        2655             :       ! Return to calling program
        2656             :       END SUBROUTINE TRN_FSH_VPR_SOI_ATM_GET
        2657             :
        2658             : !------------------------------------------------------------------------------
        2659             :
        2660           0 :       SUBROUTINE BLM_MBL( HcoState, FLG_MBL, RGH_MMN,
        2661           0 :      &                    WND_10M,  MNO_LNG, WND_FRC, RC )
        2662             : !
        2663             : !******************************************************************************
        2664             : !  Subroutine BLM_MBL computes the boundary-layer exchange properties, given
        2665             : !  the meteorology at the GEOS-CHEM layer midpoint.  This routine is optimized
        2666             : !  for dust source regions: dry, bare, uncovered land.  Theory and algorithms:
        2667             : !  Bonan (1996) CCM:lsm/surtem().  Stripped down version, based on adiabatic
        2668             : !  approximation to U*.  (tdf, bmy, 3/30/04)
        2669             : !
        2670             : !  Arguments as Input:
        2671             : !  ============================================================================
        2672             : !  (1 ) FLG_MBL (LOGICAL) : Mobilization candidate flag  [unitless]
        2673             : !  (2 ) RGH_MMN (REAL*8 ) : Roughness length momentum    [m       ]
        2674             : !  (3 ) WND_10M (REAL*8 ) : 10 m wind speed              [m/s     ]
        2675             : !
        2676             : !  Arguments as Output:
        2677             : !  ============================================================================
        2678             : !  (4 ) MNO_LNG (REAL*8 ) : Monin-Obukhov length         [m       ]
        2679             : !  (5 ) WND_FRC (REAL*8 ) : Surface friction velocity    [m/s     ]
        2680             : !
        2681             : !  NOTES:
        2682             : !  (1 ) Updated comments, cosmetic changes.  Also force double-precision with
        2683             : !        "D" exponents. (tdf, bmy, 3/30/04)
        2684             : !******************************************************************************
        2685             : !
        2686             :       !-----------------
        2687             :       ! Arguments
        2688             :       !-----------------
        2689             :       TYPE(HCO_State), POINTER :: HcoState
        2690             :       LOGICAL, INTENT(IN)  :: FLG_MBL(HcoState%NX)
        2691             :       REAL*8,  INTENT(IN)  :: RGH_MMN(HcoState%NX)
        2692             :       REAL*8,  INTENT(IN)  :: WND_10M(HcoState%NX)
        2693             :       REAL*8,  INTENT(OUT) :: MNO_LNG(HcoState%NX)
        2694             :       REAL*8,  INTENT(OUT) :: WND_FRC(HcoState%NX)
        2695             :       INTEGER, INTENT(INOUT) :: RC
        2696             :
        2697             :       !-----------------
        2698             :       ! Parameters
        2699             :       !-----------------
        2700             :
        2701             :       ! Prevents division by zero [unitless]
        2702             :       REAL*8,  PARAMETER  :: EPS_DBZ     = 1.0d-6
        2703             :
        2704             :       ! Minimum windspeed used for mobilization [m/s]
        2705             :       REAL*8,  PARAMETER  :: WND_MIN_MBL = 1.0d0
        2706             :
        2707             :       ! Roughness length momentum for erodible surfaces [m]
        2708             :       ! MaB95 p. 16420, GMB98 p. 6205
        2709             :       REAL*8,  PARAMETER  :: RGH_MMN_MBL  = 100.0d-6
        2710             :
        2711             :       ! Reference height for mobilization processes [m]
        2712             :       REAL*8, PARAMETER   :: HGT_RFR       = 10.0d0
        2713             :
        2714             :       !-----------------
        2715             :       ! Local variables
        2716             :       !-----------------
        2717             :
        2718             :       ! Counting index for lon
        2719             :       INTEGER             :: LON_IDX
        2720             :
        2721             :       ! Denominator of Monin-Obukhov length Bon96 p. 49
        2722             :       REAL*8              :: MNO_DNM
        2723             :
        2724             :       ! Surface layer mean wind speed [m/s]
        2725           0 :       REAL*8              :: WND_MDP_BND(HcoState%NX)
        2726             :
        2727             :       ! denominator for wind friction velocity
        2728             :       REAL*8              :: WND_FRC_DENOM
        2729             :
        2730             :       ! For error handling
        2731             :       CHARACTER(LEN=255)  :: MSG
        2732             :
        2733             :       !=================================================================
        2734             :       ! BLM_MBL begins here!
        2735             :       !=================================================================
        2736             :
        2737             :       ! Initialize
        2738           0 :       MNO_LNG(:) = 0.0D0
        2739           0 :       WND_FRC(:) = 0.0D0
        2740             :
        2741             :       ! Loop over longitudes
        2742           0 :       DO LON_IDX = 1, HcoState%NX
        2743             :
        2744             :          ! Surface layer mean wind speed bounded [m/s]
        2745           0 :          WND_MDP_BND(LON_IDX) =
        2746           0 :      &        MAX(WND_10M(LON_IDX), WND_MIN_MBL)
        2747             :
        2748             :          ! Friction velocity (adiabatic approximation  S&P equ. 16.57,
        2749             :          ! tdf 10/27/2K3 -- Sanity check
        2750           0 :          IF ( RGH_MMN(LON_IDX) <= 0.0 ) THEN
        2751           0 :             MSG = 'RGH_MMN <= 0.0'
        2752           0 :             CALL HCO_ERROR(MSG,RC,THISLOC='BLM_MBL')
        2753           0 :             RETURN
        2754             :          ENDIF
        2755             :
        2756             :          ! Distinguish between mobilisation candidates and noncandidates
        2757           0 :          IF ( FLG_MBL(LON_IDX) ) THEN
        2758             :             WND_FRC_DENOM = HGT_RFR / RGH_MMN_MBL      ! z = 10 m
        2759             :          ELSE
        2760           0 :             WND_FRC_DENOM = HGT_RFR / RGH_MMN(LON_IDX) ! z = 10 m
        2761             :          ENDIF
        2762             :
        2763             :          ! Sanity check
        2764           0 :          IF ( WND_FRC_DENOM <= 0.0 ) THEN
        2765           0 :             MSG = 'WND_FRC_DENOM <= 0.0'
        2766           0 :             CALL HCO_ERROR(MSG,RC,THISLOC='BLM_MBL')
        2767           0 :             RETURN
        2768             :          ENDIF
        2769             :
        2770             :          ! Take natural LOG of WND_FRC_DENOM
        2771           0 :          WND_FRC_DENOM    = LOG(WND_FRC_DENOM)
        2772             :
        2773             :          ! Convert to [m/s]
        2774             :          WND_FRC(LON_IDX) = WND_MDP_BND(LON_IDX) * CST_VON_KRM
        2775           0 :      &                    / WND_FRC_DENOM
        2776             :
        2777             :          ! Denominator of Monin-Obukhov length Bon96 p. 49
        2778             :          ! Set denominator of Monin-Obukhov length to minimum value
        2779           0 :          MNO_DNM = EPS_DBZ
        2780             :
        2781             :          ! Monin-Obukhov length Bon96 p. 49 [m]
        2782             :          MNO_LNG(LON_IDX) = -1.0D0 * (WND_FRC(LON_IDX)**3.0D0)
        2783           0 :      &                       /MNO_DNM
        2784             :
        2785             :          ! Override for non mobilisation candidates
        2786           0 :          IF ( .NOT. FLG_MBL(LON_IDX) ) THEN
        2787           0 :             WND_FRC(LON_IDX) = 0.0D0
        2788             :          ENDIF
        2789             :       ENDDO
        2790             :
        2791             :       ! Return w/ success
        2792           0 :       RC = HCO_SUCCESS
        2793             :
        2794             :       END SUBROUTINE BLM_MBL
        2795             :
        2796             : !------------------------------------------------------------------------------
        2797             :
        2798           0 :       LOGICAL FUNCTION ORO_IS_OCN( ORO_VAL )
        2799             : !
        2800             : !******************************************************************************
        2801             : !  Function ORO_IS_OCN returns TRUE if a grid box contains more than 50%
        2802             : !  ocean. (tdf, bmy, 3/30/04)
        2803             : !
        2804             : !  Arguments as Input:
        2805             : !  ============================================================================
        2806             : !  (1 ) ORO_VAL (REAL*8) : Orography at a grid box (0=ocean; 1=land; 2=ice)
        2807             : !
        2808             : !  NOTES:
        2809             : !******************************************************************************
        2810             : !
        2811             :       ! Arguments
        2812             :       REAL*8, INTENT(IN) :: ORO_VAL
        2813             :
        2814             :       !=================================================================
        2815             :       ! ORO_IS_OCN begins here!
        2816             :       !=================================================================
        2817           0 :       ORO_IS_OCN = ( NINT( ORO_VAL ) == 0 )
        2818             :
        2819             :       ! Return to calling program
        2820           0 :       END FUNCTION ORO_IS_OCN
        2821             :
        2822             : !------------------------------------------------------------------------------
        2823             :
        2824           0 :       LOGICAL FUNCTION ORO_IS_LND( ORO_VAL )
        2825             : !
        2826             : !******************************************************************************
        2827             : !  Function ORO_IS_LND returns TRUE if a grid box contains more than 50%
        2828             : !  land. (tdf, bmy, 3/30/04, 3/1/05)
        2829             : !
        2830             : !  Arguments as Input:
        2831             : !  ============================================================================
        2832             : !  (1 ) ORO_VAL (REAL*8) : Orography at a grid box (0=ocean; 1=land; 2=ice)
        2833             : !
        2834             : !  NOTES:
        2835             : !  (1 ) Bug fix: Replaced ": :" with "::" in order to prevent compile error
        2836             : !        on Linux w/ PGI compiler.  (bmy, 3/1/05)
        2837             : !******************************************************************************
        2838             : !
        2839             :       ! Arguments
        2840             :       REAL*8, INTENT(IN) :: ORO_VAL
        2841             :
        2842             :       !=================================================================
        2843             :       ! ORO_IS_OCN begins here!
        2844             :       !=================================================================
        2845           0 :       ORO_IS_LND = ( NINT( ORO_VAL ) == 1 )
        2846             :
        2847             :       ! Return to calling program
        2848           0 :       END FUNCTION ORO_IS_LND
        2849             :
        2850             : !------------------------------------------------------------------------------
        2851             :
        2852           0 :       LOGICAL FUNCTION ORO_IS_ICE( ORO_VAL )
        2853             : !
        2854             : !******************************************************************************
        2855             : !  Function ORO_IS_LND returns TRUE if a grid box contains more than 50%
        2856             : !  ice. (tdf, bmy, 3/30/04)
        2857             : !
        2858             : !  Arguments as Input:
        2859             : !  ============================================================================
        2860             : !  (1 ) ORO_VAL (REAL*8) : Orography at a grid box (0=ocean; 1=land; 2=ice)
        2861             : !
        2862             : !  NOTES:
        2863             : !******************************************************************************
        2864             : !
        2865             :       ! Arguments
        2866             :       REAL*8, INTENT(IN) :: ORO_VAL
        2867             :
        2868             :       !=================================================================
        2869             :       ! ORO_IS_ICE begins here!
        2870             :       !=================================================================
        2871           0 :       ORO_IS_ICE = ( NINT( ORO_VAL ) == 2 )
        2872             :
        2873             :       ! Return to calling program
        2874           0 :       END FUNCTION ORO_IS_ICE
        2875             :
        2876             : !------------------------------------------------------------------------------
        2877             :
        2878             :       REAL*8 FUNCTION MNO_STB_CRC_HEAT_UNS_GET( SML_FNC_MMN_UNS_RCP )
        2879             : !
        2880             : !******************************************************************************
        2881             : !  Function MNO_STB_CRC_HEAT_UNS_GET returns the stability correction factor
        2882             : !  for heat (usually called PSI), given the reciprocal of the Monin-Obukhov
        2883             : !  similarity function  (usually called PHI) for momentum in an unstable
        2884             : !  atmosphere. (tdf, bmy, 3/30/04)
        2885             : !
        2886             : !  Arguments as Input:
        2887             : !  ============================================================================
        2888             : !  (1 ) sml_fnc_mmn_uns_rcp (REAL*8) : 1/(M-O similarity function) [fraction]
        2889             : !
        2890             : !  References:
        2891             : !  ============================================================================
        2892             : !  References are Ary88 p. 167, Bru82 p. 71, SeP97 p. 869,
        2893             : !  Bon96 p. 52, BKL97 p. F1, LaP81 p. 325, LaP82 p. 466
        2894             : !  Currently this function is BFB with CCM:dom/flxoce()
        2895             : !
        2896             : !  NOTES:
        2897             : !  (1 ) Updated comments, cosmetic changes (bmy, 3/30/04)
        2898             : !******************************************************************************
        2899             : !
        2900             :       ! Arguments
        2901             :       REAL*8, INTENT(IN) :: SML_FNC_MMN_UNS_RCP
        2902             :
        2903             :       !=================================================================
        2904             :       ! MNO_STB_CRC_HEAT_UNS_GET
        2905             :       !=================================================================
        2906             :       MNO_STB_CRC_HEAT_UNS_GET = 2.0D0 *
        2907             :      & LOG( ( 1.0D0+SML_FNC_MMN_UNS_RCP * SML_FNC_MMN_UNS_RCP) / 2.0D0 )
        2908             :
        2909             :       ! Return to calling program
        2910             :       END FUNCTION MNO_STB_CRC_HEAT_UNS_GET
        2911             :
        2912             : !------------------------------------------------------------------------------
        2913             :
        2914             :       REAL*8 FUNCTION MNO_STB_CRC_MMN_UNS_GET( SML_FNC_MMN_UNS_RCP )
        2915             : !
        2916             : !******************************************************************************
        2917             : !  Function MNO_STB_CRC_MMN_UNS_GET returns the  stability correction factor
        2918             : !  for momentum (usually called PSI), given the reciprocal of the
        2919             : !  Monin-Obukhov similarity function (usually called PHI), for momentum in
        2920             : !  an unstable atmosphere. (tdf, bmy, 3/30/04)
        2921             : !
        2922             : !  Arguments as Input:
        2923             : !  ============================================================================
        2924             : !  (1 ) SML_FNC_MMN_UNS_RCP (REAL*8) : 1/(M-O similarity function) [fraction]
        2925             : !
        2926             : !  References:
        2927             : !  ============================================================================
        2928             : !  References are Ary88 p. 167, Bru82 p. 71, SeP97 p. 869,
        2929             : !  Bon96 p. 52, BKL97 p. F1, LaP81 p. 325, LaP82 p. 466
        2930             : !  Currently this function is BFB with CCM:dom/flxoce()
        2931             : !
        2932             : !  NOTES:
        2933             : !  (1 ) Updated comments, cosmetic changes (bmy, 3/30/04)
        2934             : !******************************************************************************
        2935             : !
        2936             :       ! Arguments
        2937             :       REAL*8, INTENT(IN) :: SML_FNC_MMN_UNS_RCP
        2938             :
        2939             :       !=================================================================
        2940             :       ! MNO_STB_CRC_MMN_UNS_GET begins here!
        2941             :       !=================================================================
        2942             :       MNO_STB_CRC_MMN_UNS_GET =
        2943             :      &    LOG((1.0D0+SML_FNC_MMN_UNS_RCP*(2.0D0+SML_FNC_MMN_UNS_RCP))
        2944             :      &       *(1.0D0+SML_FNC_MMN_UNS_RCP*SML_FNC_MMN_UNS_RCP)/8.0D0)
        2945             :      &       -2.0D0*ATAN(SML_FNC_MMN_UNS_RCP)+1.571D0
        2946             :
        2947             :       ! Return to calling program
        2948             :       END FUNCTION MNO_STB_CRC_MMN_UNS_GET
        2949             :
        2950             : !------------------------------------------------------------------------------
        2951             :
        2952           0 :       REAL*8 FUNCTION XCH_CFF_MMN_OCN_NTR_GET( WND_10M_NTR )
        2953             : !
        2954             : !******************************************************************************
        2955             : !  Function XCH_CFF_MMN_OCN_NTR_GET returns the Neutral 10m drag coefficient
        2956             : !  over oceans. (tdf, bmy, 3/30/04)
        2957             : !
        2958             : !  Arguments as Input:
        2959             : !  ============================================================================
        2960             : !  (1 ) WIND_10M_NTR (REAL*8) : Wind speed @ 10 m[m/s]
        2961             : !
        2962             : !  References:
        2963             : !  ============================================================================
        2964             : !  LaP82 CCM:dom/flxoce(), NOS97 p. I2
        2965             : !
        2966             : !  NOTES:
        2967             : !  (1 ) Updated comments, cosmetic changes (bmy, 3/30/04)
        2968             : !******************************************************************************
        2969             : !
        2970             :       ! Arguments
        2971             :       REAL*8, INTENT(IN) :: WND_10M_NTR
        2972             :
        2973             :       !=================================================================
        2974             :       ! XCH_CFF_MMN_OCN_NTR_GET begins here!
        2975             :       !=================================================================
        2976             :       XCH_CFF_MMN_OCN_NTR_GET = 0.0027D0    / WND_10M_NTR + 0.000142D0
        2977           0 :      &                        + 0.0000764D0 * WND_10M_NTR
        2978             :
        2979             :       ! REturn to calling program
        2980           0 :       END FUNCTION XCH_CFF_MMN_OCN_NTR_GET
        2981             :
        2982             : !------------------------------------------------------------------------------
        2983             :
        2984           0 :       SUBROUTINE RGH_MMN_GET( HcoState,Inst,ORO, RGH_MMN,
        2985           0 :      &                        SFC_TYP_SLC, SNW_FRC, WND_10M, RC )
        2986             : !
        2987             : !******************************************************************************
        2988             : !  Subroutine RGH_MMN_GET sets the roughness length. (tdf, bmy, 3/30/04)
        2989             : !
        2990             : !  Arguments as Input:
        2991             : !  ============================================================================
        2992             : !  (1 ) ORO     (INTEGER) : Orography (0=ocean; 1=land; 2=ice)    [unitless]
        2993             : !  (3 ) SFC_TYP (REAL*8 ) : LSM surface type (0..28)              [unitless]
        2994             : !  (4 ) SNW_FRC (REAL*8 ) : Fraction of surface covered by snow   [fraction]
        2995             : !  (5 ) WND_10M (REAL*8 ) : 10 m wind speed                       [m/s     ]
        2996             : !
        2997             : !  Arguments as Output:
        2998             : !  ============================================================================
        2999             : !  (2 ) RGH_MMN (REAL*8 ) : Roughness length momentu              [m       ]
        3000             : !
        3001             : !  NOTES:
        3002             : !  (1 ) Updated comments, cosmetic changes.  Also now force double-precision
        3003             : !        with "D" exponents (bmy, 3/30/04)
        3004             : !******************************************************************************
        3005             : !
        3006             :
        3007             :       !-----------------
        3008             :       ! Arguments
        3009             :       !-----------------
        3010             :       TYPE(HCO_State), POINTER  :: HcoState
        3011             :       TYPE(MyInst),    POINTER  :: Inst
        3012             :       INTEGER, INTENT(IN)  :: SFC_TYP_SLC(HcoState%NX)
        3013             :       REAL*8,  INTENT(IN)  :: ORO(HcoState%NX)
        3014             :       REAL*8,  INTENT(IN)  :: SNW_FRC(HcoState%NX)
        3015             :       REAL*8,  INTENT(IN)  :: WND_10M(HcoState%NX)
        3016             :       REAL*8,  INTENT(OUT) :: RGH_MMN(HcoState%NX)
        3017             :       INTEGER, INTENT(INOUT) :: RC
        3018             :
        3019             :       !-----------------
        3020             :       ! Parameters
        3021             :       !-----------------
        3022             :
        3023             :       ! Roughness length over frozen lakes Bon96 p. 59 [m]
        3024             :       REAL*8,  PARAMETER   :: RGH_MMN_ICE_LAK = 0.04d0
        3025             :
        3026             :       ! Roughness length over ice, bare ground, wetlands Bon96 p. 59 [m]
        3027             :       REAL*8,  PARAMETER   :: RGH_MMN_ICE_LND = 0.05d0
        3028             :
        3029             :       ! Roughness length over sea ice BKL97 p. F-3 [m]
        3030             :       REAL*8,  PARAMETER   :: RGH_MMN_ICE_OCN = 0.0005d0
        3031             :
        3032             :       ! Roughness length over unfrozen lakes Bon96 p. 59 [m]
        3033             :       REAL*8,  PARAMETER   :: RGH_MMN_LAK_WRM = 0.001d0
        3034             :
        3035             :       ! Roughness length over snow Bon96 p. 59 CCM:lsm/snoconi.F ! [m]
        3036             :       REAL*8,  PARAMETER   :: RGH_MMN_SNW     = 0.04d0
        3037             :
        3038             :       ! Minimum windspeed for momentum exchange
        3039             :       REAL*8,  PARAMETER   :: WND_MIN_DPS     = 1.0d0
        3040             :
        3041             :       !-----------------
        3042             :       ! Local variables
        3043             :       !-----------------
        3044             :
        3045             :       ! [idx] Longitude index array (sea ice)
        3046           0 :       INTEGER              :: ICE_IDX(HcoState%NX)
        3047             :
        3048             :       ! [nbr] Number of sea ice points
        3049             :       INTEGER              :: ICE_NBR
        3050             :
        3051             :       ! [Idx] Counting index
        3052             :       INTEGER              :: IDX_IDX
        3053             :
        3054             :       ! [idx] Longitude index array (land)
        3055           0 :       INTEGER              :: LND_IDX(HcoState%NX)
        3056             :
        3057             :       ! [nbr] Number of land points
        3058             :       INTEGER              :: LND_NBR
        3059             :
        3060             :       ! [idx] Counting index
        3061             :       INTEGER              :: LON_IDX
        3062             :
        3063             :       ! [idx] Longitude index array (ocean)
        3064           0 :       INTEGER              :: OCN_IDX(HcoState%NX)
        3065             :
        3066             :       ! [nbr] Number of ocean points
        3067             :       INTEGER              :: OCN_NBR
        3068             :
        3069             :       ! [idx] Plant type index
        3070             :       INTEGER              :: PLN_TYP_IDX
        3071             :
        3072             :       ! [idx] Surface type index
        3073             :       INTEGER              :: SFC_TYP_IDX
        3074             :
        3075             :       ! [idx] Surface sub-gridscale index
        3076             :       INTEGER              :: SGS_IDX
        3077             :
        3078             :       ! [m] Roughness length of current sub-gridscale
        3079             :       REAL*8               :: RLM_CRR
        3080             :
        3081             :       ! [m s-1] Bounded wind speed at 10 m
        3082             :       REAL*8               :: WND_10M_BND
        3083             :
        3084             :       ! [frc] Neutral 10 m drag coefficient over ocean
        3085             :       REAL*8               :: XCH_CFF_MMN_OCN_NTR
        3086             :
        3087             :       ! Momentum roughness length [m]
        3088             :       REAL*8 :: Z0MVT(MVT) = (/ 0.94d0, 0.77d0, 2.62d0, 1.10d0, 0.99d0,
        3089             :      &                          0.06d0, 0.06d0, 0.06d0, 0.06d0, 0.06d0,
        3090             :      &                          0.06d0, 0.06d0, 0.06d0, 0.00d0 /)
        3091             :
        3092             :       ! Displacement height (fn of plant type)
        3093             :       REAL*8 :: ZPDVT(MVT)  = (/ 11.39d0, 9.38d0, 23.45d0, 13.40d0,
        3094             :      &                           12.06d0, 0.34d0,  0.34d0,  0.34d0,
        3095             :      &                            0.34d0, 0.34d0,  0.34d0,  0.34d0,
        3096             :      &                            0.34d0, 0.00d0 /)
        3097             :
        3098             :       !=================================================================
        3099             :       ! RGH_MMN_GET begins here
        3100             :       !=================================================================
        3101           0 :       RGH_MMN(:) = 0.0D0
        3102             :
        3103             :       ! Count ocean grid boxes
        3104           0 :       OCN_NBR = 0
        3105           0 :       DO LON_IDX = 1, HcoState%NX
        3106           0 :          IF ( ORO_IS_OCN( ORO(LON_IDX) ) ) THEN
        3107           0 :             OCN_NBR          = OCN_NBR + 1
        3108           0 :             OCN_IDX(OCN_NBR) = LON_IDX
        3109             :          ENDIF
        3110             :       ENDDO
        3111             :
        3112             :       ! Count ice grid boxes
        3113           0 :       ICE_NBR = 0
        3114           0 :       DO LON_IDX = 1, HcoState%NX
        3115           0 :          IF ( ORO_IS_ICE( ORO(LON_IDX) ) ) THEN
        3116           0 :             ICE_NBR          = ICE_NBR+1
        3117           0 :             ICE_IDX(ICE_NBR) = LON_IDX
        3118             :          ENDIF
        3119             :       ENDDO
        3120             :
        3121             :       ! Count land grid boxes
        3122           0 :       LND_NBR = 0
        3123           0 :       DO LON_IDX = 1, HcoState%NX
        3124           0 :          IF ( ORO_IS_LND( ORO(LON_IDX) ) ) THEN
        3125           0 :             LND_NBR          = LND_NBR + 1
        3126           0 :             LND_IDX(LND_NBR) = LON_IDX
        3127             :          ENDIF
        3128             :       ENDDO
        3129             :
        3130             :       !=================================================================
        3131             :       ! Ocean points
        3132             :       !=================================================================
        3133           0 :       DO IDX_IDX = 1, OCN_NBR
        3134             :
        3135             :          ! Longitude index of the ocean point
        3136           0 :          LON_IDX = OCN_IDX(IDX_IDX)
        3137             :
        3138             :          ! Convert wind speed to roughness length over ocean [m/s]
        3139           0 :          WND_10M_BND = MAX( WND_MIN_DPS, WND_10M(LON_IDX) )
        3140             :
        3141             :          !Approximation: neutral 10 m wind speed unavailable,
        3142             :          ! use 10 m wind speed [fraction]
        3143           0 :          XCH_CFF_MMN_OCN_NTR = XCH_CFF_MMN_OCN_NTR_GET(WND_10M_BND)
        3144             :
        3145             :          ! BKL97 p. F-4, LaP81 p. 327 (14)  Ocean Points [m]
        3146             :          RGH_MMN(LON_IDX)=10.0D0
        3147           0 :      &       * EXP(-CST_VON_KRM / SQRT(XCH_CFF_MMN_OCN_NTR))
        3148             :       ENDDO
        3149             :
        3150             :       !=================================================================
        3151             :       ! Sea ice points
        3152             :       !=================================================================
        3153           0 :       DO IDX_IDX = 1, ICE_NBR
        3154           0 :          LON_IDX = ICE_IDX(IDX_IDX)
        3155           0 :          RGH_MMN(LON_IDX) = SNW_FRC(LON_IDX) * RGH_MMN_SNW
        3156           0 :      &      +(1.0D0-SNW_FRC(LON_IDX)) * RGH_MMN_ICE_OCN ! [m] Bon96 p. 59
        3157             :       ENDDO
        3158             :
        3159             :       !=================================================================
        3160             :       ! Land points
        3161             :       !=================================================================
        3162           0 :       DO IDX_IDX = 1, LND_NBR
        3163             :
        3164             :          ! Longitude
        3165           0 :          LON_IDX = LND_IDX(IDX_IDX)
        3166             :
        3167             :          ! Store surface blend for current gridpoint, sfc_typ(lon_idx)
        3168           0 :          SFC_TYP_IDX = SFC_TYP_SLC(LON_IDX)
        3169             :
        3170             :          ! Inland lakes
        3171           0 :          IF ( SFC_TYP_IDX == 0 ) THEN
        3172             :
        3173             :             !fxm: Add temperature input and so ability to discriminate warm
        3174             :             !     from frozen lakes here [m] Bon96 p. 59
        3175           0 :             RGH_MMN(LON_IDX) = RGH_MMN_LAK_WRM
        3176             :
        3177             :          ! Land ice
        3178           0 :          ELSE IF ( SFC_TYP_IDX == 1 ) THEN
        3179             :
        3180             :            ! [m] Bon96 p. 59
        3181             :            RGH_MMN(LON_IDX) = SNW_FRC(LON_IDX)*RGH_MMN_SNW
        3182           0 :      &        + (1.0D0-SNW_FRC(LON_IDX))*RGH_MMN_ICE_LND
        3183             :
        3184             :
        3185             :          ! Normal land
        3186             :          ELSE
        3187           0 :            DO SGS_IDX = 1, 3
        3188             :
        3189             :               ! Bare ground is pln_typ=14, ocean is pln_typ=0
        3190           0 :               PLN_TYP_IDX = Inst%PLN_TYP(SFC_TYP_IDX,SGS_IDX)
        3191             :
        3192             :               ! Bare ground
        3193           0 :               IF ( PLN_TYP_IDX == 14 ) THEN
        3194             :
        3195             :                  ! Bon96 p. 59 (glacial ice is same as bare ground)
        3196             :                  RLM_CRR = SNW_FRC(LON_IDX) * RGH_MMN_SNW
        3197           0 :      &           + (1.0D0-SNW_FRC(LON_IDX)) * RGH_MMN_ICE_LND ! [m]
        3198             :
        3199             :               ! Regular plant type
        3200           0 :               ELSE IF ( PLN_TYP_IDX > 0 ) THEN
        3201             :                  RLM_CRR = SNW_FRC(LON_IDX) * RGH_MMN_SNW
        3202           0 :      &           + (1.0D0-SNW_FRC(LON_IDX)) * Z0MVT(PLN_TYP_IDX)
        3203             :                                                       ! [m] Bon96 p. 59
        3204             :
        3205             :               ! Presumably ocean snuck through
        3206             :               ELSE
        3207             :                  CALL HCO_ERROR(
        3208             :      &                          'pln_typ_idx == 0', RC,
        3209           0 :      &                           THISLOC='RGH_MMN_GET' )
        3210             :                  RETURN
        3211             :               ENDIF            ! endif
        3212             :
        3213             :               ! Roughness length for normal land
        3214             :               RGH_MMN(LON_IDX) = RGH_MMN(LON_IDX)       ! [m]
        3215           0 :      &              + Inst%PLN_FRC(SFC_TYP_IDX,SGS_IDX) ! [frc]
        3216           0 :      &              * RLM_CRR                           ! [m]
        3217             :
        3218             :            ENDDO
        3219             :          ENDIF
        3220             :       ENDDO
        3221             :
        3222             :       ! Return w/ success
        3223           0 :       RC = HCO_SUCCESS
        3224             :
        3225             :       ! Return to calling program
        3226             :       END SUBROUTINE RGH_MMN_GET
        3227             :
        3228             : !------------------------------------------------------------------------------
        3229             :
        3230           0 :       SUBROUTINE SNW_FRC_GET( HcoState, SNW_HGT_LQD, SNW_FRC )
        3231             : !
        3232             : !******************************************************************************
        3233             : !  Subroutine SNW_FRC_GET converts equivalent liquid water snow depth to
        3234             : !  fractional snow cover.  Uses the snow thickness -> fraction algorithm of
        3235             : !  Bon96.  (tdf bmy, 3/30/04)
        3236             : !
        3237             : !  Arguments as Input:
        3238             : !  ===========================================================================
        3239             : !  (1 ) snw_hgt_lqd (REAL*8) : Equivalent liquid water snow depth [m]
        3240             : !
        3241             : !  Arguments as Output:
        3242             : !  ===========================================================================
        3243             : !  (2 ) snw_frc     (REAL*8 ) : Fraction of surface covered by snow
        3244             : !
        3245             : !  NOTES:
        3246             : !  (1 ) Updated comments, cosmetic changes.  Also now force double-precision
        3247             : !        with "D" exponents. (bmy, 3/30/04)
        3248             : !******************************************************************************
        3249             : !
        3250             :
        3251             :       !----------------
        3252             :       ! Arguments
        3253             :       !----------------
        3254             :       TYPE(HCO_State), POINTER :: HcoState
        3255             :       REAL*8, INTENT(IN)  :: SNW_HGT_LQD(HcoState%NX)
        3256             :       REAL*8, INTENT(OUT) :: SNW_FRC(HcoState%NX)
        3257             :
        3258             :       !----------------
        3259             :       ! Parameters
        3260             :       !----------------
        3261             :
        3262             :       ! Note disparity in bulk snow density between CCM and LSM
        3263             :       ! WiW80 p. 2724, 2725 has some discussion of bulk snow density
        3264             :       !
        3265             :       ! Bulk density of snow [kg m-3]
        3266             :       REAL*8,  PARAMETER  :: DNS_H2O_SNW_GND_LSM = 250.0D0
        3267             :
        3268             :       ! Standard bulk density of snow on ground [kg m-3]
        3269             :       REAL*8,  PARAMETER  :: DNS_H2O_SNW_GND_STD = 100.0D0
        3270             :
        3271             :       ! Geometric snow thickness for 100% coverage ! [m]
        3272             :       REAL*8,  PARAMETER  :: SNW_HGT_THR         = 0.05D0
        3273             :
        3274             :       ! Liquid water density! [kg/m3]
        3275             :       REAL*8,  PARAMETER  :: DNS_H2O_LQD_STD     = 1000.0D0
        3276             :
        3277             :       !-----------------
        3278             :       ! Local variables
        3279             :       !-----------------
        3280             :
        3281             :       ! [idx] Counting index for lon
        3282             :       INTEGER             :: LON_IDX
        3283             :
        3284             :       ! [m] Geometric bulk thickness of snow
        3285           0 :       REAL*8              :: SNW_HGT(HcoState%NX)
        3286             :
        3287             :       ! Conversion factor from liquid water depth
        3288             :       ! to geometric snow thickness [fraction]
        3289             :       REAL*8              :: HGT_LQD_SNW_CNV
        3290             :
        3291             :       !=================================================================
        3292             :       ! SNW_FRC_GET begins here!
        3293             :       !=================================================================
        3294             :
        3295             :       ! Conversion factor from liquid water depth to
        3296             :       ! geometric snow thickness [fraction]
        3297             :       HGT_LQD_SNW_CNV = DNS_H2O_LQD_STD
        3298           0 :      &                / DNS_H2O_SNW_GND_STD
        3299             :
        3300             :       ! Fractional snow cover
        3301           0 :       DO LON_IDX = 1, HcoState%NX
        3302             :
        3303             :          ! Snow height [m]
        3304           0 :          SNW_HGT(LON_IDX) = SNW_HGT_LQD(LON_IDX)
        3305           0 :      &                    * HGT_LQD_SNW_CNV
        3306             :
        3307             :          ! Snow fraction
        3308             :          ! NB: CCM and LSM seem to disagree on this
        3309           0 :          SNW_FRC(LON_IDX) = MIN(SNW_HGT(LON_IDX)/SNW_HGT_THR, 1.0D0)
        3310             :       ENDDO
        3311             :
        3312             :       ! Return to calling program
        3313           0 :       END SUBROUTINE SNW_FRC_GET
        3314             :
        3315             : !------------------------------------------------------------------------------
        3316             :
        3317             :       SUBROUTINE WND_RFR_GET( HcoState, FLG_ORO, HGT_MDP, HGT_RFR,
        3318             :      &                        HGT_ZPD,  MNO_LNG, WND_FRC, WND_MDP,
        3319             :      &                        WND_MIN,  WND_RFR )
        3320             : !
        3321             : !******************************************************************************
        3322             : !  Subroutine WND_RFR_GET interpolates wind speed at given height to wind
        3323             : !  speed at reference height. (tdf, bmy, 3/30/04)
        3324             : !
        3325             : !  Arguments as Input:
        3326             : !  ===========================================================================
        3327             : !  (1 ) FLG_ORO (LOGICAL)  : Orography flag (mobilization flag)       [flag]
        3328             : !  (2 ) HGT_MDP (REAL*8 )  : Midpoint height above surface            [m   ]
        3329             : !  (3 ) HGT_RFR (REAL*8 )  : Reference height                         [m   ]
        3330             : !  (4 ) HGT_ZPD (REAL*8 )  : Zero plane displacement                  [m   ]
        3331             : !  (5 ) MNO_LNG (REAL*8 )  : Monin-Obukhov length                     [m   ]
        3332             : !  (6 ) WND_FRC (REAL*8 )  : Surface friction velocity                [m/s ]
        3333             : !  (7 ) WND_MDP (REAL*8 )  : Surface layer mean wind speed            [m/s ]
        3334             : !  (8 ) WND_MIN (REAL*8 )  : Minimum windspeed                        [m/s ]
        3335             : !
        3336             : !  Arguments as Output:
        3337             : !  ===========================================================================
        3338             : !  (9 ) WND_RFR (REAL*8 )  : Wind speed at reference height           [m/s ]
        3339             : !
        3340             : !  NOTES:
        3341             : !  (1 ) Updated comments, cosmetic changes.  Also now force double-precision
        3342             : !        with "D" exponents. (bmy, 3/30/04)
        3343             : !******************************************************************************
        3344             : !
        3345             :
        3346             :       !------------------
        3347             :       ! Arguments
        3348             :       !------------------
        3349             :       TYPE(HCO_State), POINTER :: HcoState
        3350             :       LOGICAL, INTENT(IN)  :: FLG_ORO(HcoState%NX)
        3351             :       REAL*8,  INTENT(IN)  :: HGT_MDP(HcoState%NX)
        3352             :       REAL*8,  INTENT(IN)  :: HGT_RFR
        3353             :       REAL*8,  INTENT(IN)  :: HGT_ZPD(HcoState%NX)
        3354             :       REAL*8,  INTENT(IN)  :: MNO_LNG(HcoState%NX)
        3355             :       REAL*8,  INTENT(IN)  :: WND_FRC(HcoState%NX)
        3356             :       REAL*8,  INTENT(IN)  :: WND_MDP(HcoState%NX)
        3357             :       REAL*8,  INTENT(IN)  :: WND_MIN
        3358             :       REAL*8,  INTENT(OUT) :: WND_RFR(HcoState%NX)
        3359             :
        3360             :       !------------------
        3361             :       ! Parameters
        3362             :       !------------------
        3363             :
        3364             :       ! Named index for lower (target) hght
        3365             :       INTEGER, PARAMETER   :: RFR_HGT_IDX=1
        3366             :
        3367             :       ! Named index for upper (known) hght
        3368             :       INTEGER, PARAMETER   :: GCM_HGT_IDX=2
        3369             :
        3370             :       !------------------
        3371             :       ! Local variables
        3372             :       !------------------
        3373             :
        3374             :       ! [idx] Counting index
        3375             :       INTEGER              :: IDX_IDX
        3376             :
        3377             :       ! [idx] Counting index for lon
        3378             :       INTEGER              :: LON_IDX
        3379             :
        3380             :       ! Stability computation loop index
        3381             :       INTEGER              :: LVL_IDX
        3382             :
        3383             :       ! Valid indices
        3384             :       INTEGER              :: VLD_IDX(HcoState%NX)
        3385             :
        3386             :       ! [nbr] Number of valid indices
        3387             :       INTEGER              :: VLD_NBR
        3388             :
        3389             :       ! [frc] Monin-Obukhov stability correction momentum
        3390             :       REAL*8               :: MNO_STB_CRC_MMN(HcoState%NX,2)
        3391             :
        3392             :       ! [frc] Monin-Obukhov stability parameter
        3393             :       REAL*8               :: MNO_STB_PRM(HcoState%NX,2)
        3394             :
        3395             :       ! [frc] Reciprocal of similarity function
        3396             :       !       for momentum, unstable atmosphere
        3397             :       REAL*8               :: SML_FNC_MMN_UNS_RCP
        3398             :
        3399             :       ! Term in stability correction computation
        3400             :       REAL*8               :: TMP2
        3401             :
        3402             :       ! Term in stability correction computation
        3403             :       REAL*8               :: TMP3
        3404             :
        3405             :       ! Term in stability correction computation
        3406             :       REAL*8               :: TMP4
        3407             :
        3408             :       ! [frc] Wind correction factor
        3409             :       REAL*8               :: WND_CRC_FCT(HcoState%NX)
        3410             :
        3411             :       ! [m-1] Reciprocal of reference height
        3412             :       REAL*8               :: HGT_RFR_RCP
        3413             :
        3414             :       !=================================================================
        3415             :       ! WND_RFR_GET begins here!
        3416             :       !=================================================================
        3417             :
        3418             :       HGT_RFR_RCP = 1.0D0 / HGT_RFR ! [m-1]
        3419             :       WND_RFR = WND_MIN             ! [m s-1]
        3420             :
        3421             :       ! Compute horizontal wind speed at reference height
        3422             :       DO LON_IDX = 1, HcoState%NX
        3423             :          IF (FLG_ORO(LON_IDX) .AND. HGT_ZPD(LON_IDX) < HGT_RFR) THEN
        3424             :
        3425             :             ! Code uses notation of Bon96 p. 50, where lvl_idx=1
        3426             :             ! is 10 m ref. hgt, lvl_idx=2 is atm. hgt
        3427             :             MNO_STB_PRM(LON_IDX,RFR_HGT_IDX) =
        3428             :      &           MIN((HGT_RFR-HGT_ZPD(LON_IDX))
        3429             :      &           /MNO_LNG(LON_IDX),1.0D0) ! [frc]
        3430             :
        3431             :             MNO_STB_PRM(LON_IDX,GCM_HGT_IDX) =
        3432             :      &           MIN((HGT_MDP(LON_IDX)-HGT_ZPD(LON_IDX))
        3433             :      &           /MNO_LNG(LON_IDX),1.0D0) ! [frc]
        3434             :
        3435             :             DO LVL_IDX = 1, 2
        3436             :                IF (MNO_STB_PRM(LON_IDX,LVL_IDX) < 0.0D0) THEN
        3437             :                   SML_FNC_MMN_UNS_RCP = (1.0D0 - 16.0D0
        3438             :      &                 * MNO_STB_PRM(LON_IDX,LVL_IDX))**0.25D0
        3439             :                   TMP2 = LOG((1.0D0 + SML_FNC_MMN_UNS_RCP
        3440             :      &                 * SML_FNC_MMN_UNS_RCP)/2.0D0)
        3441             :                   TMP3 = LOG((1.0D0 + SML_FNC_MMN_UNS_RCP)/2.0D0)
        3442             :                   MNO_STB_CRC_MMN(LON_IDX,LVL_IDX) =
        3443             :      &                 2.0D0 * TMP3 + TMP2 - 2.0D0
        3444             :      &                 * ATAN(SML_FNC_MMN_UNS_RCP) + 1.5707963
        3445             :                ELSE             ! not stable
        3446             :                   MNO_STB_CRC_MMN(LON_IDX,LVL_IDX) = -5.0D0
        3447             :      &                 * MNO_STB_PRM(LON_IDX,LVL_IDX)
        3448             :                ENDIF            ! stable
        3449             :             ENDDO              ! end loop over lvl_idx
        3450             :
        3451             :            TMP4 = LOG( (HGT_MDP(LON_IDX)-HGT_ZPD(LON_IDX))
        3452             :      &          / (HGT_RFR-HGT_ZPD(LON_IDX)) )
        3453             :
        3454             :            ! Correct neutral stability assumption
        3455             :            WND_CRC_FCT(LON_IDX) = TMP4
        3456             :      &             - MNO_STB_CRC_MMN(LON_IDX,GCM_HGT_IDX)
        3457             :      &             + MNO_STB_CRC_MMN(LON_IDX,RFR_HGT_IDX) ! [frc]
        3458             :            WND_RFR(LON_IDX) = WND_MDP(LON_IDX)-WND_FRC(LON_IDX)
        3459             :      &             * CST_VON_KRM_RCP * WND_CRC_FCT(LON_IDX) ! [m s-1]
        3460             :            WND_RFR(LON_IDX) = MAX(WND_RFR(LON_IDX),WND_MIN) ! [m s-1]
        3461             :          ENDIF
        3462             :       ENDDO
        3463             :
        3464             :       ! Return to calling program
        3465             :       END SUBROUTINE WND_RFR_GET
        3466             :
        3467             : !------------------------------------------------------------------------------
        3468             :
        3469           0 :       SUBROUTINE WND_FRC_THR_SLT_GET( HcoState, FLG_MBL,
        3470           0 :      &                                DNS_MDP, WND_FRC_THR_SLT, RC )
        3471             : !
        3472             : !******************************************************************************
        3473             : !  Subroutine WND_FRC_THR_SLT_GET ccmputes the dry threshold friction velocity
        3474             : !  for saltation -- See Zender et al. expression (1) (tdf, bmy, 3/30/04)
        3475             : !
        3476             : !  Arguments as Input:
        3477             : !  ===========================================================================
        3478             : !  (1 ) FLG_MBL         (LOGICAL) : mobilisation flag
        3479             : !  (2 ) DNS_MDP         (REAL*8 ) : Midlayer density [kg/m3]
        3480             : !
        3481             : !  Arguments as Output:
        3482             : !  ===========================================================================
        3483             : !  (3 ) WND_FRC_THR_SLT (REAL*8 ) : Threshold friction velocity
        3484             : !                                    for saltation [m/s]
        3485             : !
        3486             : !  NOTES:
        3487             : !  (1 ) Updated comments, cosmetic changes.  Also now force double-precision
        3488             : !        with "D" exponents. (bmy, 3/30/04)
        3489             : !******************************************************************************
        3490             : !
        3491             :
        3492             :       !----------------
        3493             :       ! Arguments
        3494             :       !----------------
        3495             :       TYPE(HCO_State), POINTER :: HcoState
        3496             :       LOGICAL, INTENT(IN)  :: FLG_MBL(HcoState%NX)
        3497             :       REAL*8,  INTENT(IN)  :: DNS_MDP(HcoState%NX)
        3498             :       REAL*8,  INTENT(OUT) :: WND_FRC_THR_SLT(HcoState%NX)
        3499             :       INTEGER, INTENT(INOUT) :: RC
        3500             :
        3501             :       !-----------------
        3502             :       ! Parameters
        3503             :       !-----------------
        3504             :
        3505             :       ! [m] Optimal diameter for saltation,
        3506             :       ! IvW82 p. 117 Fgr. 8, Pye87 p. 31, MBA97 p. 4388, SRL96 (2)
        3507             :       REAL*8,  PARAMETER   :: DMT_SLT_OPT = 75.0d-6
        3508             :
        3509             :       ! [kg m-3] Density of optimal saltation particles,
        3510             :       ! MBA97 p. 4388 friction velocity for saltation
        3511             :       REAL*8,  PARAMETER   :: DNS_SLT     = 2650.0d0
        3512             :
        3513             :       !-----------------
        3514             :       ! Local variables
        3515             :       !-----------------
        3516             :
        3517             :       ! [idx] Longitude Counting Index
        3518             :       INTEGER              :: LON_IDX
        3519             :
        3520             :       ! Threshold friction Reynolds number
        3521             :       ! approximation for optimal size [frc]
        3522             :       REAL*8               :: RYN_NBR
        3523             :
        3524             :       !  Density ratio factor for saltation calculation
        3525             :       REAL*8               :: DNS_FCT
        3526             :
        3527             :       ! Interparticle cohesive forces factor for saltation calculation
        3528             :       REAL*8               :: ALPHA, BETA, GAMMA, TMP1
        3529             :
        3530             :
        3531             :       !=================================================================
        3532             :       ! WND_FRC_THR_SLT_GET begins here!
        3533             :       !=================================================================
        3534             :
        3535             :       ! Initialize some variables
        3536             :       ! MaB95 pzn. for Re*t(D_opt) circumvents iterative solution
        3537             :       ! [frc] "B" MaB95 p. 16417 (5)
        3538             :
        3539             :       ! [m/s] Threshold velocity
        3540           0 :       WND_FRC_THR_SLT(:) = 0.0D0
        3541             :
        3542             :       ! Threshold friction Reynolds number approximation for optimal size
        3543             :       RYN_NBR = 0.38D0 + 1331.0D0
        3544           0 :      &        * (100.0D0*DMT_SLT_OPT)**1.56D0
        3545             :
        3546             :       ! tdf NB conversion of Dp to [cm]
        3547             :       ! Given Re*t(D_opt), compute time independent factors contributing
        3548             :       ! to u*t. IvW82 p. 115 (6) MaB95 p. 16417 (4) Interparticle cohesive
        3549             :       ! forces. see Zender et al., Equ. (1).
        3550             :
        3551             :       ! tdf introduced beta [fraction]
        3552           0 :       BETA = 1.0D0+6.0D-07 / (DNS_SLT*GRV_SFC*(DMT_SLT_OPT**2.5D0))
        3553             :
        3554             :       ! IvW82 p. 115 (6) MaB95 p. 16417 (4)
        3555           0 :       DNS_FCT = DNS_SLT * GRV_SFC * DMT_SLT_OPT
        3556             :
        3557             :       ! Error check
        3558             :       IF ( RYN_NBR < 0.03D0 ) THEN
        3559             :          CALL HCO_ERROR ( 'RYN_NBR < 0.03', RC,
        3560             :      &      THISLOC='WND_FRC_THR_SLT_GET' )
        3561             :          RETURN
        3562             :
        3563             :       ELSE IF ( RYN_NBR < 10.0D0 ) THEN
        3564             :
        3565             :         ! IvW82 p. 114 (3), MaB95 p. 16417 (6)
        3566             :         ! tdf introduced gamma [fraction]
        3567           0 :         GAMMA = -1.0D0 + 1.928D0 * (RYN_NBR**0.0922D0)
        3568             :         TMP1 = 0.129D0*0.129D0 * BETA / GAMMA
        3569             :
        3570             :       ELSE
        3571             :
        3572             :         ! ryn_nbr > 10.0D0
        3573             :         ! IvW82 p. 114 (3), MaB95 p. 16417 (7)
        3574             :         ! tdf introduced gamma [fraction]
        3575             :         GAMMA = 1.0D0-0.0858D0 * EXP(-0.0617D0*(RYN_NBR-10.0D0))
        3576             :         TMP1 = 0.12D0*0.12D0 * BETA * GAMMA * GAMMA
        3577             :
        3578             :       ENDIF
        3579             :
        3580           0 :       DO LON_IDX = 1, HcoState%NX
        3581             :
        3582             :          ! Threshold friction velocity for saltation dry ground
        3583             :          ! tdf introduced alpha
        3584           0 :          ALPHA = DNS_FCT / DNS_MDP(LON_IDX)
        3585             :
        3586             :          ! Added mobilisation constraint
        3587           0 :          IF ( FLG_MBL(LON_IDX) ) THEN
        3588           0 :             WND_FRC_THR_SLT(LON_IDX) =  SQRT(TMP1) * SQRT(ALPHA) ! [m s-1]
        3589             :          ENDIF
        3590             :       ENDDO
        3591             :
        3592             :       ! Return w/ success
        3593           0 :       RC = HCO_SUCCESS
        3594             :
        3595             :       END SUBROUTINE WND_FRC_THR_SLT_GET
        3596             :
        3597             : !------------------------------------------------------------------------------
        3598             :
        3599             :       SUBROUTINE WND_RFR_THR_SLT_GET( HcoState, WND_FRC,
        3600             :      &                                WND_FRC_THR_SLT, WND_MDP, WND_RFR,
        3601             :      &                                WND_RFR_THR_SLT )
        3602             : !
        3603             : !******************************************************************************
        3604             : !  Subroutine WND_RFR_THR_SLT_GET computes the threshold horizontal wind
        3605             : !  speed at reference height for saltation. (tdf, bmy, 3/30/04)
        3606             : !
        3607             : !  Arguments as Input:
        3608             : !  ============================================================================
        3609             : !  (1 ) wnd_frc         (REAL*8) : Surface friction velocity              [m/s]
        3610             : !  (2 ) wnd_frc_thr_slt (REAL*8) : Threshold friction vel. for saltation  [m/s]
        3611             : !  (3 ) wnd_mdp         (REAL*8) : Surface layer mean wind speed          [m/s]
        3612             : !  (4 ) wnd_rfr         (REAL*8) : Wind speed at reference height         [m/s]
        3613             : !
        3614             : !  Arguments as Output:
        3615             : !  ============================================================================
        3616             : !  (5 ) wnd_rfr_thr_slt (REAL*8) : Threshold 10m wind speed for saltation [m/s]
        3617             : !
        3618             : !  NOTES:
        3619             : !  (1 ) Updated comments, cosmetic changes.
        3620             : !******************************************************************************
        3621             : !
        3622             :       ! Arguments
        3623             :       TYPE(HCO_State), POINTER :: HcoState
        3624             :       REAL*8, INTENT(IN)  :: WND_FRC(HcoState%NX)
        3625             :       REAL*8, INTENT(IN)  :: WND_FRC_THR_SLT(HcoState%NX)
        3626             :       REAL*8, INTENT(IN)  :: WND_MDP(HcoState%NX)
        3627             :       REAL*8, INTENT(IN)  :: WND_RFR(HcoState%NX)
        3628             :       REAL*8, INTENT(OUT) :: WND_RFR_THR_SLT(HcoState%NX)
        3629             :
        3630             :       ! Local variables
        3631             :       INTEGER             :: I
        3632             :
        3633             :       !=================================================================
        3634             :       ! WND_RFR_THR_SLT_GET begins here
        3635             :       !=================================================================
        3636             :       DO I = 1, HcoState%NX
        3637             :
        3638             :          ! A more complicated procedure would recompute mno_lng for
        3639             :          ! wnd_frc_thr, and then integrate vertically from rgh_mmn+hgt_zpd
        3640             :          ! to hgt_rfr.
        3641             :          !
        3642             :          ! wnd_crc_fct is (1/k)*[ln(z-D)/z0 - psi(zeta2) + psi(zeta1)]
        3643             :          WND_RFR_THR_SLT(I) = WND_FRC_THR_SLT(I)
        3644             :      &                      * WND_RFR(I) / WND_FRC(I)
        3645             :
        3646             :       ENDDO
        3647             :
        3648             :       ! Return to calling program
        3649             :       END SUBROUTINE WND_RFR_THR_SLT_GET
        3650             :
        3651             : !------------------------------------------------------------------------------
        3652             :
        3653           0 :       SUBROUTINE VWC2GWC( HcoState, FLG_MBL, GWC_SFC, VWC_SAT, VWC_SFC )
        3654             : !
        3655             : !******************************************************************************
        3656             : !  Subroutine VWC2GWC converts volumetric water content to gravimetric water
        3657             : !  content -- assigned only for mobilisation candidates. (tdf, bmy, 3/30/04)
        3658             : !
        3659             : !  Arguments as Input:
        3660             : !  ===========================================================================
        3661             : !  (1 ) FLG_MBL (LOGICAL) : Mobilization candidate flag     [flag]
        3662             : !  (3 ) VWC_SAT (REAL*8 ) : Saturated VWC (sand-dependent)  [m3/m3]
        3663             : !  (4 ) VWC_SFC (REAL*8 ) : Volumetric water content!       [m3/m3
        3664             : !
        3665             : !  Arguments as Output:
        3666             : !  ===========================================================================
        3667             : !  (2 ) gwc_sfc (REAL*8 ) : Gravimetric water content       [kg/kg]
        3668             : !
        3669             : !  NOTES:
        3670             : !  (1 ) Updated comments, cosmetic changes.  Also now forces double-precision
        3671             : !        with "D" exponents. (tdf, bmy, 3/30/04)
        3672             : !******************************************************************************
        3673             : !
        3674             :
        3675             :       !----------------
        3676             :       ! Arguments
        3677             :       !----------------
        3678             :       TYPE(HCO_State), POINTER :: HcoState
        3679             :       LOGICAL, INTENT(IN)  :: FLG_MBL(HcoState%NX)
        3680             :       REAL*8,  INTENT(IN)  :: VWC_SAT(HcoState%NX)
        3681             :       REAL*8,  INTENT(IN)  :: VWC_SFC(HcoState%NX)
        3682             :       REAL*8,  INTENT(OUT) :: GWC_SFC(HcoState%NX)
        3683             :
        3684             :       !----------------
        3685             :       ! Parameters
        3686             :       !----------------
        3687             :
        3688             :       ! Dry density of soil ! particles (excluding pores) [kg/m3]
        3689             :       REAL*8,  PARAMETER   :: DNS_PRT_SFC     = 2650.0d0
        3690             :
        3691             :       ! liq. H2O density [kg/m3]
        3692             :       REAL*8,  PARAMETER   :: DNS_H2O_LQD_STD = 1000.0d0
        3693             :
        3694             :       !-----------------
        3695             :       ! Local variables
        3696             :       !-----------------
        3697             :
        3698             :       ! Longitude index
        3699             :       INTEGER              :: LON_IDX
        3700             :
        3701             :       ! [kg m-3] Bulk density of dry surface soil
        3702           0 :       REAL*8               :: DNS_BLK_DRY(HcoState%NX)
        3703             :
        3704             :       !=================================================================
        3705             :       ! VWC2GWC begins here!
        3706             :       !=================================================================
        3707           0 :       GWC_SFC(:)     = 0.0D0
        3708           0 :       DNS_BLK_DRY(:) = 0.0D0
        3709             :
        3710             :       ! Loop over longitudes
        3711           0 :       DO LON_IDX = 1, HcoState%NX
        3712             :
        3713             :          ! If this is a mobilization candidate then...
        3714           0 :          IF ( FLG_MBL(LON_IDX) ) THEN
        3715             :
        3716             :             ! Assume volume of air pores when dry equals saturated VWC
        3717             :             ! This implies air pores are completely filled by water in
        3718             :             ! saturated soil
        3719             :
        3720             :             ! Bulk density of dry surface soil  [kg m-3]
        3721             :             DNS_BLK_DRY(LON_IDX) = DNS_PRT_SFC
        3722           0 :      &                           * ( 1.0d0 - VWC_SAT(LON_IDX) )
        3723             :
        3724             :             ! Gravimetric water content [ kg kg-1]
        3725             :             GWC_SFC(LON_IDX) = VWC_SFC(LON_IDX)
        3726             :      &                       * DNS_H2O_LQD_STD
        3727           0 :      &                       / DNS_BLK_DRY(LON_IDX)
        3728             :
        3729             :          ENDIF
        3730             :       ENDDO
        3731             :
        3732             :       ! Return to calling program
        3733           0 :       END SUBROUTINE VWC2GWC
        3734             :
        3735             : !------------------------------------------------------------------------------
        3736             :
        3737           0 :       SUBROUTINE FRC_THR_NCR_WTR_GET( HcoState,    FLG_MBL,
        3738           0 :      &               FRC_THR_NCR_WTR, MSS_FRC_CLY_SLC, GWC_SFC )
        3739             : !
        3740             : !******************************************************************************
        3741             : !  Subroutine FRC_THR_NCR_WTR_GET computes the factor by which soil moisture
        3742             : !  increases threshold friction velocity. This parameterization is based on
        3743             : !  FMB99. Zender et al., exp. (5). (tdf, bmy, 4/5/04)
        3744             : !
        3745             : !  Arguments as Input:
        3746             : !  ===========================================================================
        3747             : !  (1 ) FLG_MBL         (LOGICAL) : Mobilization candidate flag  [flags   ]
        3748             : !  (3 ) MSS_FRC_CLY     (REAL*8 ) : Mass fraction of clay        [fraction]
        3749             : !  (4 ) GWC_SFC         (REAL*8 ) : Gravimetric water content    [kg/kg   ]
        3750             : !
        3751             : !  Arguments as Output:
        3752             : !  ===========================================================================
        3753             : !  (2 ) FRC_THR_NCR_WTR (REAL*8 ) : Factor by which moisture increases
        3754             : !                                    threshold friction velocity [fraction]
        3755             : !
        3756             : !  NOTES:
        3757             : !  (1 ) Updated comments, cosmetic changes.  Also now forces double-precision
        3758             : !        with "D" exponents. (tdf, bmy, 4/5/04)
        3759             : !******************************************************************************
        3760             : !
        3761             :
        3762             :       ! Arguments
        3763             :       TYPE(HCO_State), POINTER :: HcoState
        3764             :       LOGICAL, INTENT(IN)  :: FLG_MBL(HcoState%NX)
        3765             :       REAL*8,  INTENT(IN)  :: MSS_FRC_CLY_SLC(HcoState%NX)
        3766             :       REAL*8,  INTENT(IN)  :: GWC_SFC(HcoState%NX)
        3767             :       REAL*8,  INTENT(OUT) :: FRC_THR_NCR_WTR(HcoState%NX)
        3768             :
        3769             :       ! local variables
        3770             :       INTEGER              :: LON_IDX        ! [idx] Counting index
        3771           0 :       REAL*8               :: GWC_THR(HcoState%NX) ! [kg/kg] Threshold GWC
        3772             :
        3773             :       !=================================================================
        3774             :       ! FRC_THR_NCR_WTR_GET begins here!
        3775             :       !=================================================================
        3776             :
        3777             :       ! Initialize
        3778           0 :       frc_thr_ncr_wtr(:) = 1.0D0
        3779           0 :       gwc_thr(:)         = 0.0D0
        3780             :
        3781             :       ! Loop over longitudes
        3782           0 :       DO LON_IDX = 1, HcoState%NX
        3783             :
        3784             :          ! If this is a candidate for mobilization...
        3785           0 :          IF ( FLG_MBL(LON_IDX) ) THEN
        3786             :
        3787             :             !===========================================================
        3788             :             ! Adjust threshold velocity for inhibition by moisture
        3789             :             ! frc_thr_ncr_wtr(lon_idx)=exp(22.7D0*vwc_sfc(lon_idx))
        3790             :             ! [frc] SRL96
        3791             :             !
        3792             :             ! Compute threshold soil moisture based on clay content
        3793             :             ! GWC_THR=MSS_FRC_CLY*(0.17D0+0.14D0*MSS_FRC_CLY) [m3/m3]
        3794             :             ! FMB99 p. 155 (14)
        3795             :             !
        3796             :             ! 19991105 remove factor of mss_frc_cly from gwc_thr to
        3797             :             ! improve large scale behavior.
        3798             :             !===========================================================
        3799             :
        3800             :             ! [m3 m-3]
        3801           0 :             GWC_THR(LON_IDX) = 0.17D0 + 0.14D0* MSS_FRC_CLY_SLC(LON_IDX)
        3802             :
        3803           0 :             IF ( GWC_SFC(LON_IDX) > GWC_THR(LON_IDX) )
        3804             :      &           FRC_THR_NCR_WTR(LON_IDX) = SQRT(1.0D0+1.21D0
        3805             :      &           * (100.0D0 * (GWC_SFC(LON_IDX)-GWC_THR(LON_IDX)))
        3806           0 :      &           ** 0.68D0)     ! [frc] FMB99 p. 155 (15)
        3807             :          ENDIF
        3808             :       ENDDO
        3809             :
        3810             :       ! Return to calling program
        3811           0 :       END SUBROUTINE FRC_THR_NCR_WTR_GET
        3812             :
        3813             : !------------------------------------------------------------------------------
        3814             :
        3815             :       SUBROUTINE FRC_THR_NCR_DRG_GET( HcoState, FRC_THR_NCR_DRG,
        3816             :      &                                FLG_MBL,  Z0M, ZS0M, RC )
        3817             : !
        3818             : !******************************************************************************
        3819             : !  Subroutine FRC_THR_NCR_DRG_GET computes factor by which surface roughness
        3820             : !  increases threshold friction velocity. Zender et al., expression (3)
        3821             : !  This parameterization is based on MaB95 and GMB98. (tdf, bmy, 4/5/04)
        3822             : !
        3823             : !  Arguments as Input:
        3824             : !  ===========================================================================
        3825             : !  (2 ) FLG_MBL         (LOGICAL) : Mobilization candidate flag
        3826             : !  (3 ) Z0M             (REAL*8 ) : Roughness length momentum
        3827             : !                                 :  for erodible surfaces [m]
        3828             : !  (4 ) ZS0M            (REAL*8 ) : Smooth roughness length [m]
        3829             : !
        3830             : !  Arguments as Output:
        3831             : !  ===========================================================================
        3832             : !  (1 ) FRC_THR_NCR_DRG (REAL*8 ) : Factor by which surface roughness
        3833             : !                                    increases threshold fric. velocity [frac]
        3834             : !
        3835             : !  NOTES:
        3836             : !  (1 ) Updated comments, cosmetic changes.  Also now forces double-precision
        3837             : !        with "D" exponents. (tdf, bmy, 4/5/04)
        3838             : !******************************************************************************
        3839             : !
        3840             :
        3841             :       !-----------------
        3842             :       ! Arguments
        3843             :       !-----------------
        3844             :       TYPE(HCO_State), POINTER :: HcoState
        3845             :       LOGICAL, INTENT(IN)  :: FLG_MBL(HcoState%NX)
        3846             :       REAL*8,  INTENT(IN)  :: Z0M
        3847             :       REAL*8,  INTENT(IN)  :: ZS0M
        3848             :       REAL*8,  INTENT(OUT) :: FRC_THR_NCR_DRG(HcoState%NX)
        3849             :       INTEGER, INTENT(INOUT) :: RC
        3850             :
        3851             :       !-----------------
        3852             :       ! Local variables
        3853             :       !-----------------
        3854             :
        3855             :       ! [idx] Counting index
        3856             :       integer lon_idx
        3857             :
        3858             :       ! [frc] Efficient fraction of wind friction
        3859             :       real*8 Feff
        3860             :
        3861             :       ! [frc] Reciprocal of Feff
        3862             :       real*8 Feff_rcp
        3863             :
        3864             :       ! for error handling
        3865             :       CHARACTER(LEN=255) :: MSG
        3866             :
        3867             :       !=================================================================
        3868             :       ! FRC_THR_NCR_DRG_GET begins here!
        3869             :       !=================================================================
        3870             :
        3871             :       FRC_THR_NCR_DRG(:) = 1.0D0
        3872             :
        3873             :       ! Adjust threshold velocity for inhibition by roughness elements
        3874             :       ! Zender et al. Equ. (3), fd.
        3875             :
        3876             :       ! [frc] MaB95 p. 16420, GMB98 p. 6207
        3877             :       FEFF = 1.0D0  - LOG( Z0M /ZS0M )
        3878             :      &              / LOG( 0.35D0*( (0.1D0/ZS0M)**0.8D0) )
        3879             :
        3880             :       ! Error check
        3881             :       if ( FEFF <= 0.0D0 .OR. FEFF > 1.0D0 ) THEN
        3882             :          MSG = 'Feff out of range!'
        3883             :          CALL HCO_ERROR(MSG, RC,
        3884             :      &      THISLOC='FRC_THR_NC_DRG_GET' )
        3885             :          RETURN
        3886             :       ENDIF
        3887             :
        3888             :       ! Reciprocal of FEFF [fraction]
        3889             :       FEFF_RCP = 1.0D0 / FEFF
        3890             :
        3891             :       ! Loop over longitudes
        3892             :       DO LON_IDX = 1, HcoState%NX
        3893             :
        3894             :          ! If this is a mobilization candidate...
        3895             :          IF ( FLG_MBL(LON_IDX) ) THEN
        3896             :
        3897             :             ! Save into FRC_THR_NCR_DRG
        3898             :             FRC_THR_NCR_DRG(LON_IDX) = FEFF_RCP
        3899             :
        3900             :             ! fxm: 19991012
        3901             :             ! Set frc_thr_ncr_drg=1.0, equivalent to assuming mobilization
        3902             :             ! takes place at smooth roughness length
        3903             :             FRC_THR_NCR_DRG(LON_IDX) = 1.0D0
        3904             :
        3905             :          ENDIF
        3906             :       ENDDO
        3907             :
        3908             :       ! Return w/ success
        3909             :       RC = HCO_SUCCESS
        3910             :
        3911             :       END SUBROUTINE FRC_THR_NCR_DRG_GET
        3912             :
        3913             : !------------------------------------------------------------------------------
        3914             :
        3915           0 :       SUBROUTINE WND_FRC_SLT_GET( HcoState, FLG_MBL, WND_FRC,
        3916           0 :      &                            WND_FRC_SLT, WND_RFR, WND_RFR_THR_SLT)
        3917             : !
        3918             : !******************************************************************************
        3919             : !  Subroutine WND_FRC_SLT_GET computes the saltating friction velocity.
        3920             : !  Saltation increases friction speed by roughening surface, AKA "Owen's
        3921             : !  effect".  This acts as a positive feedback to the friction speed.  GMB98
        3922             : !  parameterized this feedback in terms of 10 m windspeeds, Zender et al.
        3923             : !  equ. (4).  (tdf, bmy, 4/5/04, 1/25/07)
        3924             : !
        3925             : !  Arguments as Input:
        3926             : !  ===========================================================================
        3927             : !  (1 ) FLG_MBL         (LOGICAL) : Mobilization candidate flag
        3928             : !  (2 ) WND_FRC         (REAL*8 ) : Surface friction velocity            [m/s]
        3929             : !  (4 ) WND_RFR         (REAL*8 ) : Wind speed at reference height       [m/s]
        3930             : !  (5 ) WND_RFR_THR_SLT (REAL*8 ) : Thresh. 10m wind speed for saltation [m/s]
        3931             : !
        3932             : !  Arguments as Output:
        3933             : !  ===========================================================================
        3934             : !  (3 ) WND_FRC_SLT     (REAL*8 ) : Saltating friction velocity          [m/s]
        3935             : !
        3936             : !  NOTES:
        3937             : !  (1 ) Updated comments, cosmetic changes.  Also now forces double-precision
        3938             : !        with "D" exponents. (tdf, bmy, 4/5/04)
        3939             : !  (2 ) Now eliminate Owen effect (tdf, bmy, 1/25/07)
        3940             : !******************************************************************************
        3941             : !
        3942             :
        3943             :       !-------------------
        3944             :       ! Arguments
        3945             :       !-------------------
        3946             :       TYPE(HCO_State), POINTER :: HcoState
        3947             :       LOGICAL, INTENT(IN)  :: FLG_MBL(HcoState%NX)
        3948             :       REAL*8,  INTENT(IN)  :: WND_FRC(HcoState%NX)
        3949             :       REAL*8,  INTENT(IN)  :: WND_RFR(HcoState%NX)
        3950             :       REAL*8,  INTENT(IN)  :: WND_RFR_THR_SLT(HcoState%NX)
        3951             :       REAL*8,  INTENT(OUT) :: WND_FRC_SLT(HcoState%NX)
        3952             :
        3953             :       !-------------------
        3954             :       ! Local variables
        3955             :       !-------------------
        3956             :
        3957             :       ! [idx] Counting index
        3958             :       INTEGER              :: LON_IDX
        3959             :
        3960             :       !---------------------------------------------------------------------
        3961             :       ! Prior to 1/25/07:
        3962             :       ! Eliminate Owen effect, so comment out this code (tdf, bmy, 1/25/07)
        3963             :       !
        3964             :       ! %%%%% DO NOT DELETE -- LEAVE THIS CODE COMMENTED OUT %%%%%
        3965             :       !
        3966             :       !! [m/s] Reference windspeed excess over threshold
        3967             :       !REAL*8               :: WND_RFR_DLT
        3968             :       !
        3969             :       !! [m/s] Friction velocity increase from saltation
        3970             :       !REAL*8               :: WND_FRC_SLT_DLT
        3971             :       !---------------------------------------------------------------------
        3972             :
        3973             :       !=================================================================
        3974             :       ! WND_FRC_SLT_GET begins here!
        3975             :       !=================================================================
        3976             :
        3977             :       ! [m/s] Saltating friction velocity
        3978           0 :       WND_FRC_SLT(:) = WND_FRC(:)
        3979             :
        3980             : !------------------------------------------------------------------------------
        3981             : ! Prior to 1/25/07:
        3982             : ! Eliminate the Owen effect.  Note that the more computationally
        3983             : ! efficient way to do this is to just comment out the entire IF block.
        3984             : ! (tdf, bmy, 1/25/07)
        3985             : !
        3986             : ! %%%%% DO NOT DELETE -- LEAVE THIS CODE COMMENTED OUT %%%%%
        3987             : !
        3988             : !      ! Loop over longitudes
        3989             : !      DO LON_IDX = 1, HcoState%NX
        3990             : !
        3991             : !         ! If this is a mobilization candidate, then only
        3992             : !         ! only apply Owen effect only when Uref > Ureft (tdf 4/5/04)
        3993             : !         IF ( FLG_MBL(LON_IDX) .AND.
        3994             : !     &        WND_RFR(LON_IDX) >= WND_RFR_THR_SLT(LON_IDX) ) THEN
        3995             : !
        3996             : !            !==================================================================
        3997             : !            ! Saltation roughens the boundary layer, AKA "Owen's effect"
        3998             : !            ! GMB98 p. 6206 Fig. 1 shows observed/computed u* dependence
        3999             : !            ! on observed U(1 m).  GMB98 p. 6209 (12) has u* in cm s-1 and
        4000             : !            ! U, Ut in m s-1, personal communication, D. Gillette, 19990529
        4001             : !            ! With everything in MKS, the 0.3 coefficient in GMB98 (12)
        4002             : !            ! becomes 0.003.  Increase in friction velocity due to saltation
        4003             : !            ! varies as square of difference between reference wind speed
        4004             : !            ! and reference threshold speed.
        4005             : !            !==================================================================
        4006             : !            WND_RFR_DLT = WND_RFR(LON_IDX) - WND_RFR_THR_SLT(LON_IDX)
        4007             : !
        4008             : !            ! Friction velocity increase from saltation GMB98 p. 6209 [m/s]
        4009             : !            wnd_frc_slt_dlt = 0.003D0 * wnd_rfr_dlt * wnd_rfr_dlt
        4010             : !
        4011             : !            ! Saltation friction velocity, U*,s, Zender et al. Equ. (4).
        4012             : !            WND_FRC_SLT(LON_IDX) = WND_FRC(LON_IDX)
        4013             : !     &                           + WND_FRC_SLT_DLT ! [m s-1]
        4014             : !
        4015             : !            !
        4016             : !ctdf Eliminate Owen effect                        tdf 01/13/2K5
        4017             : !            wnd_frc_slt(:) = wnd_frc(:)
        4018             : !
        4019             : !         ENDIF
        4020             : !      ENDDO
        4021             : !------------------------------------------------------------------------------
        4022             :
        4023             :       ! Return to calling program
        4024           0 :       END SUBROUTINE WND_FRC_SLT_GET
        4025             :
        4026             : !------------------------------------------------------------------------------
        4027             :
        4028             :       SUBROUTINE FLX_MSS_CACO3_MSK( HcoState, ExtState,
        4029             :      &                              DMT_VWR,
        4030             :      &                              FLG_MBL,
        4031             :      &                              FLX_MSS_VRT_DST_CACO3,
        4032             :      &                              MSS_FRC_CACO3_SLC,
        4033             :      &                              MSS_FRC_CLY_SLC,
        4034             :      &                              MSS_FRC_SND_SLC, RC )
        4035             : !
        4036             : !******************************************************************************
        4037             : !  Subroutine FLX_MSS_CACO3_MSK masks dust mass flux by CaCO3 mass fraction at
        4038             : !  source.  Theory: Uses soil CaCO3 mass fraction from Global Soil Data Task,
        4039             : !  1999 (Sch99).  Uses size dependent apportionment of CaCO3 from Claquin et
        4040             : !  al, 1999 (CSB99). (tdf, bmy, 4/5/04)
        4041             : !
        4042             : !  Arguments as Input:
        4043             : !  ===========================================================================
        4044             : !  (1 ) DMT_VWR               (REAL*8 ) : Mass weighted diameter resolved [m]
        4045             : !  (2 ) FLG_MBL               (LOGICAL) : Mobilization candidate flag
        4046             : !  (3 ) FLX_MSS_VRT_DST_CACO3 (REAL*8 ) : Vert. mass flux of dust [kg/m2/s ]
        4047             : !  (4 ) MSS_FRC_CACO3         (REAL*8 ) : Mass fraction of CaCO3  [fraction]
        4048             : !  (5 ) MSS_FRC_CLY           (REAL*8 ) : Mass fraction of clay   [fraction]
        4049             : !  (6 ) MSS_FRC_SND           (REAL*8 ) : Mass fraction of sand   [fraction]
        4050             : !
        4051             : !  Arguments as Output:
        4052             : !  ===========================================================================
        4053             : !  (3 ) FLX_MSS_VRT_DST_CACO3 (REAL*8 ) : Vertical mass flux of CaCO3 [kg/m2/s]
        4054             : !
        4055             : !  NOTES:
        4056             : !  (1 ) Updated comments, cosmetic changes.  Also now forces double-precision
        4057             : !        with "D" exponents. (tdf, bmy, 4/5/04)
        4058             : !******************************************************************************
        4059             : !
        4060             :
        4061             :       !------------------
        4062             :       ! Arguments
        4063             :       !------------------
        4064             :       TYPE(HCO_State), POINTER :: HcoState
        4065             :       TYPE(Ext_State), POINTER :: ExtState
        4066             :       LOGICAL, INTENT(IN)    :: FLG_MBL(HcoState%NX)
        4067             :       REAL*8,  INTENT(IN)    :: DMT_VWR(NBINS)
        4068             :       REAL*8,  INTENT(IN)    :: MSS_FRC_CACO3_SLC(HcoState%NX)
        4069             :       REAL*8,  INTENT(IN)    :: MSS_FRC_CLY_SLC(HcoState%NX)
        4070             :       REAL*8,  INTENT(IN)    :: MSS_FRC_SND_SLC(HcoState%NX)
        4071             :       REAL*8,  INTENT(INOUT) :: FLX_MSS_VRT_DST_CACO3(HcoState%NX,NBINS)
        4072             :       INTEGER, INTENT(INOUT) :: RC
        4073             :
        4074             :       !------------------
        4075             :       ! Parameters
        4076             :       !------------------
        4077             :
        4078             :       ! Maximum diameter of Clay soil texture CSB99 p. 22250 [m]
        4079             :       REAL*8, PARAMETER      :: DMT_CLY_MAX = 2.0d-6
        4080             :
        4081             :       ! Maximum diameter of Silt soil texture CSB99 p. 22250 [m]
        4082             :       REAL*8, PARAMETER      :: DMT_SLT_MAX = 50.0d-6
        4083             :
        4084             :       ! Density of CaCO3 http://www.ssc.on.ca/mandm/calcit.htm [kg/m3]
        4085             :       REAL*8, PARAMETER      :: DNS_CACO3 = 2950.0d0
        4086             :
        4087             :       !------------------
        4088             :       ! Local variables
        4089             :       !------------------
        4090             :
        4091             :       ! [idx] Counting index
        4092             :       INTEGER                :: M
        4093             :
        4094             :       ! [idx] Counting index for lon
        4095             :       INTEGER                :: LON_IDX
        4096             :
        4097             :       ! [frc] Mass fraction of silt
        4098             :       REAL*8                 :: MSS_FRC_SLT_SLC(HcoState%NX)
        4099             :
        4100             :       ! [frc] Fraction of soil CaCO3 in size bin
        4101             :       REAL*8                 :: MSS_FRC_CACO3_SZ_CRR
        4102             :
        4103             :       ! [frc] Fraction of CaCO3 in clay
        4104             :       REAL*8                 :: MSS_FRC_CACO3_CLY
        4105             :
        4106             :       ! [frc] Fraction of CaCO3 in silt
        4107             :       REAL*8                 :: MSS_FRC_CACO3_SLT
        4108             :
        4109             :       ! [frc] Fraction of CaCO3 in sand
        4110             :       REAL*8                 :: MSS_FRC_CACO3_SND
        4111             :
        4112             :       ! Error handling
        4113             :       CHARACTER(LEN=255)     :: MSG
        4114             :
        4115             :       !=================================================================
        4116             :       ! FLX_MSS_CACO3_MSK
        4117             :       !=================================================================
        4118             :
        4119             :       ! INITIALIZE
        4120             :       MSS_FRC_SLT_SLC(:) = 0.0D0
        4121             :
        4122             :       ! Loop over dust bins
        4123             :       DO M = 1, NBINS
        4124             :
        4125             :          ! Loop over longitudes
        4126             :          DO LON_IDX = 1, HcoState%NX
        4127             :
        4128             :             !===========================================================
        4129             :             ! Simple technique is to mask dust mass by tracer mass
        4130             :             ! fraction.  The model transports (hence conserves) CaCO3
        4131             :             ! rather than total dust itself.  The method assumes source,
        4132             :             ! transport, and removal processes are linear with tracer
        4133             :             ! mass
        4134             :             !===========================================================
        4135             :
        4136             :             ! If this is a mobilization candidate, then...
        4137             :             IF ( FLG_MBL(LON_IDX) ) THEN
        4138             :
        4139             :                ! 20000320: Currently this is only process in
        4140             :                ! dust model requiring mss_frc_slt
        4141             :
        4142             :                ! [frc] Mass fraction of silt
        4143             :                MSS_FRC_SLT_SLC(LON_IDX) =
        4144             :      &              MAX(0.0D0, 1.0D0 -MSS_FRC_CLY_SLC(LON_IDX)
        4145             :      &                               -MSS_FRC_SND_SLC(LON_IDX))
        4146             :
        4147             :                ! CSB99 showed that CaCO3 is not uniformly distributed
        4148             :                ! across sizes.  There is more CaCO3 per unit mass of
        4149             :                ! silt than per unit mass of clay.
        4150             :
        4151             :                ! Fraction of CaCO3 in clay CSB99 p. 22249 Figure 1b
        4152             :                MSS_FRC_CACO3_CLY = MAX(0.0D0,-0.045D0+0.5D0
        4153             :      &                           * MIN(0.5D0,MSS_FRC_CLY_SLC(LON_IDX)))
        4154             :
        4155             :                ! Fraction of CaCO3 in silt CSB99 p. 22249 Figure 1a
        4156             :                MSS_FRC_CACO3_SLT = MAX(0.0D0,-0.175D0+1.4D0
        4157             :      &                           * MIN(0.5D0,MSS_FRC_SLT_SLC(LON_IDX)))
        4158             :
        4159             :                ! Fraction of CaCO3 in sand CSB99 p. 22249 Figure 1a
        4160             :                MSS_FRC_CACO3_SND = 1.0D0 - MSS_FRC_CACO3_CLY
        4161             :      &                           - MSS_FRC_CACO3_SND
        4162             :
        4163             :                ! Set CaCO3 fraction of total CaCO3 for each transport bin
        4164             :                IF ( DMT_VWR(M) < DMT_CLY_MAX ) THEN
        4165             :
        4166             :                   ! Transport bin carries Clay
        4167             :                   ! Fraction of soil CaCO3 in size bin
        4168             :                   MSS_FRC_CACO3_SZ_CRR = MSS_FRC_CACO3_CLY
        4169             :
        4170             :                ELSE IF ( DMT_VWR(M) < DMT_SLT_MAX ) THEN
        4171             :
        4172             :                   ! Transport bin carries Silt
        4173             :                   ! Fraction of soil CaCO3 in size bin
        4174             :                   MSS_FRC_CACO3_SZ_CRR = MSS_FRC_CACO3_SLT
        4175             :
        4176             :                ELSE
        4177             :
        4178             :                   ! Transport bin carries Sand
        4179             :                   ! Fraction of soil CaCO3 in size bin
        4180             :                   MSS_FRC_CACO3_SZ_CRR = MSS_FRC_CACO3_SND
        4181             :
        4182             :                ENDIF
        4183             :
        4184             :                ! Error checks
        4185             :                IF ( MSS_FRC_CACO3_SZ_CRR < 0.0D0  .OR.
        4186             :      &              MSS_FRC_CACO3_SZ_CRR > 1.0D0 ) THEN
        4187             :                   MSG = 'mss_frc_CaC_s < 0.0.or.mss_frc_CaC_s > 1.0!'
        4188             :                   CALL HCO_ERROR(MSG, RC,
        4189             :      &               THISLOC='FLX_MSS_CACO3_MSK' )
        4190             :                   RETURN
        4191             :                ENDIF
        4192             :
        4193             :                IF ( MSS_FRC_CACO3_SLC(LON_IDX) < 0.0D0  .OR.
        4194             :      &              MSS_FRC_CACO3_SLC(LON_IDX) > 1.0D0 ) THEN
        4195             :                   MSG = 'mss_frc_CaCO3_s < 0.0.or.mss_frc_CaCO3 > 1.0!'
        4196             :                   CALL HCO_ERROR(MSG, RC,
        4197             :      &               THISLOC='FLX_MSS_CACO3_MSK' )
        4198             :                   RETURN
        4199             :                ENDIF
        4200             :
        4201             :                ! Convert dust flux to CaCO3 flux
        4202             :                FLX_MSS_VRT_DST_CACO3(LON_IDX,M) =
        4203             :      &              FLX_MSS_VRT_DST_CACO3(LON_IDX,M) ! [KG m-2 s-1]
        4204             :      &              * MSS_FRC_CACO3_SLC(LON_IDX) ! [frc] Mass fraction of
        4205             :                                             !       CaCO3 (at this location)
        4206             :                     ! 20020925 fxm: Remove size dependence of CaCO3
        4207             :      &              * 1.0D0
        4208             :
        4209             :             ENDIF
        4210             :          ENDDO
        4211             :       ENDDO
        4212             :
        4213             :       ! Return w/ success
        4214             :       RC = HCO_SUCCESS
        4215             :
        4216             :       END SUBROUTINE FLX_MSS_CACO3_MSK
        4217             :
        4218             : !------------------------------------------------------------------------------
        4219             :
        4220           0 :       SUBROUTINE FLX_MSS_HRZ_SLT_TTL_WHI79_GET( HcoState, DNS_MDP,
        4221           0 :      &                                    FLG_MBL, QS_TTL,  U_S,  U_ST )
        4222             : !
        4223             : !******************************************************************************
        4224             : !  Subroutine FLX_MSS_HRZ_SLT_TTL_WHI79_GET computes vertically integrated
        4225             : !  streamwise mass flux of particles.  Theory: Uses method proposed by White
        4226             : !  (1979). See Zender et al., expr (10).  fxm: use surface air density not
        4227             : !  midlayer density (tdf, bmy, 4/5/04)
        4228             : !
        4229             : !  Arguments as Input:
        4230             : !  ============================================================================
        4231             : !  (1 ) DNS_MDP (REAL*8 ) : Midlayer density                           [g/m3  ]
        4232             : !  (2 ) FLG_MBL (LOGICAL) : Mobilization candidate flag                [flag  ]
        4233             : !  (4 ) U_S     (REAL*8 ) : Surface friction velocity                  [m/s   ]
        4234             : !  (5 ) U_ST    (REAL*8 ) : Threshold friction spd for saltation       [m/s   ]
        4235             : !
        4236             : !  Arguments as Output:
        4237             : !  ============================================================================
        4238             : !  (3 ) QS_TTL  (REAL*8 ) : Vertically integrated streamwise mass flux [kg/m/s]
        4239             : !
        4240             : !  NOTES:
        4241             : !  (1 ) Updated comments, cosmetic changes.  Also now forces double-precision
        4242             : !        with "D" exponents. (tdf, bmy, 4/5/04)
        4243             : !******************************************************************************
        4244             : !
        4245             :
        4246             :       !------------------
        4247             :       ! Arguments
        4248             :       !------------------
        4249             :       TYPE(HCO_State), POINTER :: HcoState
        4250             :       LOGICAL, INTENT(IN)  :: FLG_MBL(HcoState%NX)
        4251             :       REAL*8,  INTENT(IN)  :: DNS_MDP(HcoState%NX)
        4252             :       REAL*8,  INTENT(IN)  :: U_S(HcoState%NX)
        4253             :       REAL*8,  INTENT(IN)  :: U_ST(HcoState%NX)
        4254             :       REAL*8,  INTENT(OUT) :: QS_TTL(HcoState%NX)
        4255             :
        4256             :       !------------------
        4257             :       ! Parameters
        4258             :       !------------------
        4259             :
        4260             :       ! [frc] Saltation constant Whi79 p. 4648, MaB97 p. 16422
        4261             :       REAL*8,  PARAMETER   :: CST_SLT = 2.61d0
        4262             :
        4263             :       !------------------
        4264             :       ! Local variables
        4265             :       !------------------
        4266             :
        4267             :       ! [frc] Ratio of wind friction threshold to wind friction
        4268             :       real*8               :: U_S_rat
        4269             :
        4270             :       ! [idx] Counting index for lon
        4271             :       integer              :: lon_idx
        4272             :
        4273             :       !=================================================================
        4274             :       ! FLX_MSS_HRZ_SLT_TTL_WHI79_GET begins here!
        4275             :       !=================================================================
        4276             :
        4277             :       ! Initialize
        4278           0 :       QS_TTL(:) = 0.0D0
        4279             :
        4280             :       ! Loop over longitudes
        4281           0 :       DO LON_IDX = 1, HcoState%NX
        4282             :
        4283             :          ! If this is a mobilization candidate and the friction
        4284             :          ! velocity is above the threshold for saltation...
        4285           0 :          IF ( FLG_MBL(LON_IDX) .AND.
        4286           0 :      &        U_S(LON_IDX) > U_ST(LON_IDX) ) THEN
        4287             :
        4288             :             ! Ratio of wind friction threshold to wind friction
        4289           0 :             U_S_RAT = U_ST(LON_IDX) / U_S(LON_IDX)
        4290             :
        4291             :             ! Whi79 p. 4648 (19), MaB97 p. 16422 (28)
        4292             :             QS_TTL(LON_IDX) =   ! [kg m-1 s-1]
        4293             :      &           CST_SLT * DNS_MDP(LON_IDX) * (U_S(LON_IDX)**3.0D0)
        4294             :      &           * (1.0D0-U_S_RAT) * (1.0D0+U_S_RAT)
        4295           0 :      &            * (1.0D0+U_S_RAT) / GRV_SFC
        4296             :
        4297             :          ENDIF
        4298             :       ENDDO
        4299             :
        4300             :       ! Return to calling program
        4301           0 :       END SUBROUTINE FLX_MSS_HRZ_SLT_TTL_WHI79_GET
        4302             :
        4303             : !------------------------------------------------------------------------------
        4304             :
        4305           0 :       SUBROUTINE FLX_MSS_VRT_DST_TTL_MAB95_GET( HcoState,
        4306           0 :      &                                          DST_SLT_FLX_RAT_TTL,
        4307           0 :      &                                          FLG_MBL,
        4308           0 :      &                                          FLX_MSS_HRZ_SLT_TTL,
        4309           0 :      &                                          FLX_MSS_VRT_DST_TTL,
        4310           0 :      &                                          MSS_FRC_CLY_SLC )
        4311             : !
        4312             : !******************************************************************************
        4313             : !  Subroutine FLX_MSS_VRT_DST_TTL_MAB95_GET diagnoses total vertical mass flux
        4314             : !  of dust from vertically integrated streamwise mass flux, Zender et al.,
        4315             : !  expr. (11). (tdf, bmy, 4/5/04)
        4316             : !
        4317             : !  Theory: Uses clay-based method proposed by Marticorena & Bergametti (1995)
        4318             : !  Their parameterization is based only on data for mss_frc_cly < 0.20
        4319             : !  For clayier soils, dst_slt_flx_rat_ttl may behave dramatically differently
        4320             : !  Whether this behavior changes when mss_frc_cly > 0.20 is unknown
        4321             : !  Anecdotal evidence suggests vertical flux decreases for mss_frc_cly > 0.20
        4322             : !  Thus we use min[mss_frc_cly,0.20] in MaB95 parameterization
        4323             : !
        4324             : !  Arguments as Input:
        4325             : !  ============================================================================
        4326             : !  (2 ) FLG_MBL             (LOGICAL) : Mobilization candidate flag
        4327             : !  (3 ) FLX_MSS_HRZ_SLT_TTL (REAL*8 ) : Vertically integrated streamwise
        4328             : !                                        mass flux [kg/m/s]
        4329             : !  (5 ) MSS_FRC_CLY         (REAL*8 ) : Mass fraction clay [fraction]
        4330             : !
        4331             : !  Arguments as Output:
        4332             : !  ============================================================================
        4333             : !  (1 ) DST_SLT_FLX_RAT_TTL (REAL*8 ) : Ratio of vertical dust flux t
        4334             : !                                       to streamwise mass flux [1/m]
        4335             : !  (4 ) FX_MSS_VRT_DST_TTL  (REAL*8 ) : Total vert. mass flux of dust [kg/m2/s]
        4336             : !
        4337             : !  NOTES:
        4338             : !  (1 ) Updated comments, cosmetic changes.  Also now forces double-precision
        4339             : !        with "D" exponents. (tdf, bmy, 4/5/04)
        4340             : !******************************************************************************
        4341             : !
        4342             :
        4343             :       !-----------------
        4344             :       ! Arguments
        4345             :       !-----------------
        4346             :       TYPE(HCO_State), POINTER :: HcoState
        4347             :       LOGICAL, INTENT(IN)  :: FLG_MBL(HcoState%NX)
        4348             :       REAL*8,  INTENT(IN)  :: FLX_MSS_HRZ_SLT_TTL(HcoState%NX)
        4349             :       REAL*8,  INTENT(IN)  :: MSS_FRC_CLY_SLC(HcoState%NX)
        4350             :       REAL*8,  INTENT(OUT) :: DST_SLT_FLX_RAT_TTL(HcoState%NX)
        4351             :       REAL*8,  INTENT(OUT) :: FLX_MSS_VRT_DST_TTL(HcoState%NX)
        4352             :
        4353             :       !-----------------
        4354             :       ! Local variables
        4355             :       !-----------------
        4356             :
        4357             :       ! [idx] Counting index for lon
        4358             :       INTEGER              :: LON_IDX
        4359             :
        4360             :       ! [frc] Mass fraction clay limited to 0.20
        4361             :       REAL*8               :: MSS_FRC_CLY_VLD
        4362             :
        4363             :       ! [frc] Natural log of 10
        4364             :       REAL*8               :: LN10
        4365             :
        4366             :       !=================================================================
        4367             :       ! FLX_MSS_VRT_DST_TTL_MAB95_GET
        4368             :       !=================================================================
        4369             :
        4370             :       ! Initialize
        4371           0 :       LN10                   = LOG(10.0D0)
        4372           0 :       DST_SLT_FLX_RAT_TTL(:) = 0.0D0
        4373           0 :       FLX_MSS_VRT_DST_TTL(:) = 0.0D0
        4374             :
        4375             :       ! Loop over longitudes
        4376           0 :       DO LON_IDX = 1, HcoState%NX
        4377             :
        4378             :          ! If this is a mobilization candidate...
        4379           0 :          IF ( FLG_MBL(LON_IDX) ) then
        4380             :
        4381             :             ! 19990603: fxm: Dust production is EXTREMELY sensitive to
        4382             :             ! this parameter, which changes flux by 3 orders of magnitude
        4383             :             ! in 0.0 < mss_frc_cly < 0.20
        4384           0 :             MSS_FRC_CLY_VLD = MIN(MSS_FRC_CLY_SLC(LON_IDX),0.2D0)  ! [frc]
        4385             :
        4386             :             DST_SLT_FLX_RAT_TTL(LON_IDX) =           ! [m-1]
        4387           0 :      &         100.0D0 * EXP(LN10*(13.4D0*MSS_FRC_CLY_VLD-6.0D0))
        4388             :                                                      ! MaB95 p. 16423 (47)
        4389             :
        4390             :             FLX_MSS_VRT_DST_TTL(LON_IDX) =           ! [kg M-1 s-1]
        4391             :      &           FLX_MSS_HRZ_SLT_TTL(LON_IDX)
        4392           0 :      &         * DST_SLT_FLX_RAT_TTL(LON_IDX)
        4393             :
        4394             :          ENDIF
        4395             :       ENDDO
        4396             :
        4397             :       ! Return to calling program
        4398           0 :       END SUBROUTINE FLX_MSS_VRT_DST_TTL_MAB95_GET
        4399             :
        4400             : !------------------------------------------------------------------------------
        4401             :
        4402           0 :       SUBROUTINE DST_PSD_MSS( OVR_SRC_SNK_FRC, MSS_FRC_SRC,
        4403           0 :      &                        OVR_SRC_SNK_MSS, NBINS, DST_SRC_NBR )
        4404             : !
        4405             : !******************************************************************************
        4406             : !  Subroutine DST_PSD_MSS computes OVR_SRC_SNK_MSS from OVR_SRC_SNK_FRC
        4407             : !  and MSS_FRC_SRC. (tdf, bmy, 4/5/04)
        4408             : !
        4409             : !  Multiply ovr_src_snk_frc(src_idx,*) by mss_frc(src_idx) to obtain
        4410             : !  absolute mass fraction mapping from source dists. to sink bins
        4411             : !
        4412             : !  Arguments as Input:
        4413             : !  ============================================================================
        4414             : !  (1 ) OVR_SRC_SNK_FRC (REAL*8 ) : Mass overlap, Mij, Zender p. 5, Equ. 12
        4415             : !  (2 ) MSS_FRC_SRC     (REAL*8 ) : Mass fraction in each mode (Table 1, M)
        4416             : !  (4 ) NBINS         (INTEGER) : Number of GEOS_CHEM dust bins
        4417             : !  (5 ) DST_SRC_NBR     (INTEGER) : Number of source modes
        4418             : !
        4419             : !  Arguments as Output:
        4420             : !  ============================================================================
        4421             : !  (3 ) OVR_SRC_SNK_MSS (REAL*8 ) : Mass of stuff ???
        4422             : !
        4423             : !  NOTES:
        4424             : !  (1 ) Updated comments, cosmetic changes.  Also now forces double-precision
        4425             : !        with "D" exponents. (tdf, bmy, 4/5/04)
        4426             : !******************************************************************************
        4427             : !
        4428             :       !-----------------
        4429             :       ! Arguments
        4430             :       !-----------------
        4431             :       INTEGER, INTENT(IN)  :: DST_SRC_NBR, NBINS
        4432             :       REAL*8,  INTENT(IN)  :: OVR_SRC_SNK_FRC(DST_SRC_NBR,NBINS)
        4433             :       REAL*8,  INTENT(IN)  :: MSS_FRC_SRC(DST_SRC_NBR)
        4434             :       REAL*8,  INTENT(OUT) :: OVR_SRC_SNK_MSS(DST_SRC_NBR,NBINS)
        4435             :
        4436             :       !-----------------
        4437             :       ! Local variables
        4438             :       !-----------------
        4439             :       INTEGER              :: SRC_IDX, SNK_IDX
        4440           0 :       REAL*8               :: MSS_FRC_TRN_DST_SRC(NBINS)
        4441             :       REAL*8               :: OVR_SRC_SNK_MSS_TTL
        4442             :
        4443             :       !=================================================================
        4444             :       ! DST_PSD_MSS begins here!
        4445             :       !=================================================================
        4446             :
        4447             :       ! Fraction of vertical dust flux which is transported
        4448           0 :       OVR_SRC_SNK_MSS_TTL = 0.0D0
        4449             :
        4450             :       ! Fraction of transported dust mass at source
        4451           0 :       DO SNK_IDX = 1, NBINS
        4452           0 :          MSS_FRC_TRN_DST_SRC(SNK_IDX) = 0.0D0
        4453             :       ENDDO
        4454             :
        4455           0 :       DO SNK_IDX = 1, NBINS
        4456           0 :       DO SRC_IDX = 1, DST_SRC_NBR
        4457           0 :          OVR_SRC_SNK_MSS (SRC_IDX,SNK_IDX) = ! [frc]
        4458             :      &        OVR_SRC_SNK_FRC (SRC_IDX,SNK_IDX)
        4459           0 :      &        * MSS_FRC_SRC (SRC_IDX) ! [frc]
        4460             :       ENDDO
        4461             :       ENDDO
        4462             :
        4463             :       ! Split double do loop into 2 parts      tdf 10/22/2K3
        4464           0 :       DO SNK_IDX = 1, NBINS
        4465           0 :       DO SRC_IDX = 1, DST_SRC_NBR
        4466             :
        4467             :          ! [frc] Fraction of transported dust mass at source
        4468           0 :          MSS_FRC_TRN_DST_SRC(SNK_IDX) =
        4469             :      &        MSS_FRC_TRN_DST_SRC(SNK_IDX)
        4470           0 :      &        + OVR_SRC_SNK_MSS(SRC_IDX,SNK_IDX)
        4471             :
        4472             :          ! [frc] Compute total transported mass fraction of dust flux
        4473             :          OVR_SRC_SNK_MSS_TTL = OVR_SRC_SNK_MSS_TTL
        4474           0 :      &                       + OVR_SRC_SNK_MSS (SRC_IDX,snk_idx)
        4475             :       ENDDO
        4476             :       ENDDO
        4477             :
        4478             :       ! Convert fraction of mobilized mass to fraction of transported mass
        4479           0 :       DO SNK_IDX = 1, NBINS
        4480           0 :          MSS_FRC_TRN_DST_SRC (SNK_IDX) =
        4481           0 :      &        MSS_FRC_TRN_DST_SRC (SNK_IDX) / OVR_SRC_SNK_MSS_TTL
        4482             :       ENDDO
        4483             :
        4484             :       ! Return to calling program
        4485           0 :       END SUBROUTINE DST_PSD_MSS
        4486             :
        4487             : !------------------------------------------------------------------------------
        4488             :
        4489           0 :       SUBROUTINE FLX_MSS_VRT_DST_PRT( Inst, NX, FLG_MBL,
        4490           0 :      &                                FLX_MSS_VRT_DST,
        4491           0 :      &                                FLX_MSS_VRT_DST_TTL )
        4492             : !
        4493             : !******************************************************************************
        4494             : !  Subroutine FLX_MSS_VRT_DST_PRT partitions total vertical mass flux of dust
        4495             : !  into transport bins.  Assumes a trimodal lognormal probability density
        4496             : !  function (see Zender et al., p. 5). (tdf, bmy, 4/5/04)
        4497             : !
        4498             : !  DST_SRC_NBR  = 3 - trimodal size distribution in source c regions (p. 5)
        4499             : !  OVR_SRC_SNK_MSS  [frc] computed in dst_psd_mss, called from dust_mod.f
        4500             : !
        4501             : !  Arguments as Input:
        4502             : !  ============================================================================
        4503             : !  (1 ) FLG_MBL             (LOGICAL) : Mobilization candidate flag
        4504             : !  (3 ) FLX_MSS_VRT_DST_TTL (REAL*8 ) : Total vert. mass flux of dust [kg/m2/s]
        4505             : !
        4506             : !  Arguments as Output:
        4507             : !  ============================================================================
        4508             : !  (2 ) FLX_MSS_VRT_DST     (REAL*8 ) : Vertical mass flux of dust [kg/m2/s]
        4509             : !
        4510             : !  NOTES:
        4511             : !  (1 ) Updated comments, cosmetic changes.  Also now forces double-precision
        4512             : !        with "D" exponents. (tdf, bmy, 4/5/04)
        4513             : !******************************************************************************
        4514             : !
        4515             :
        4516             :       ! Arguments
        4517             :       TYPE(MyInst), POINTER :: Inst
        4518             :       INTEGER, INTENT(IN)   :: NX
        4519             :       LOGICAL, INTENT(IN)   :: FLG_MBL(NX)
        4520             :       REAL*8,  INTENT(IN)   :: FLX_MSS_VRT_DST_TTL(NX)
        4521             :       REAL*8,  INTENT(OUT)  :: FLX_MSS_VRT_DST(NX,NBINS)
        4522             :
        4523             :       ! Local variables
        4524             :       INTEGER               :: LON_IDX   ! [idx] Counting index for lon
        4525             :       INTEGER               :: SRC_IDX   ! [idx] Counting index for src
        4526             :       INTEGER               :: SNK_IDX   ! [idx] Counting index for snk
        4527             :       INTEGER               :: SNK_NBR   ! [nbr] Dimension size
        4528             :
        4529             :       !=================================================================
        4530             :       ! FLX_MSS_VRT_DST_PRT begins here!
        4531             :       !=================================================================
        4532             :
        4533             :       ! Initialize
        4534           0 :       FLX_MSS_VRT_DST(:,:) = 0.0D0    ! [frc]
        4535             :
        4536             :       ! Loop over longitudes (NB: Inefficient loop order)
        4537           0 :       DO LON_IDX = 1, NX
        4538             :
        4539             :          ! If this is a mobilization candidate...
        4540           0 :          IF ( FLG_MBL(LON_IDX) ) THEN
        4541             :
        4542             :             ! Loop over source & sink indices
        4543           0 :             DO SNK_IDX = 1, NBINS
        4544           0 :             DO SRC_IDX = 1, DST_SRC_NBR
        4545           0 :                FLX_MSS_VRT_DST(LON_IDX,SNK_IDX) = ! [kg m-2 s-1]
        4546             :      &              FLX_MSS_VRT_DST(LON_IDX,SNK_IDX)
        4547           0 :      &              + Inst%OVR_SRC_SNK_MSS(SRC_IDX,SNK_IDX)
        4548           0 :      &              * FLX_MSS_VRT_DST_TTL(LON_IDX)
        4549             :             ENDDO
        4550             :             ENDDO
        4551             :          ENDIF
        4552             :       ENDDO
        4553             :
        4554             :       ! Return to calling program
        4555           0 :       END SUBROUTINE FLX_MSS_VRT_DST_PRT
        4556             :
        4557             : !------------------------------------------------------------------------------
        4558             :
        4559             :       SUBROUTINE TM_2_IDX_WGT()
        4560             :
        4561             :       ! routine eliminated: see original code
        4562             :       END SUBROUTINE TM_2_IDX_WGT
        4563             :
        4564             : !------------------------------------------------------------------------------
        4565             :
        4566           0 :       SUBROUTINE LND_FRC_MBL_GET( HcoState,    DOY,
        4567           0 :      &                            FLG_MBL,     LAT_RDN,
        4568           0 :      &                            LND_FRC_DRY_SLC, LND_FRC_MBL, MBL_NBR,
        4569           0 :      &                            ORO,         SFC_TYP_SLC,     SNW_FRC,
        4570           0 :      &                            TPT_SOI,     TPT_SOI_FRZ, VAI_DST_SLC,
        4571             :      &                            RC)
        4572             : !
        4573             : !******************************************************************************
        4574             : !  Subroutine LND_FRC_MBL_GET returns the fraction of each GEOS-CHEM grid
        4575             : !  box which is suitable for dust mobilization.  This routine is called
        4576             : !  by DST_MBL. (tdf, bmy, 4/5/04, 1/13/10)
        4577             : !
        4578             : !  The DATE is used to obtain the time-varying vegetation cover.
        4579             : !  Routine currently uses latitude slice of VAI from time-dependent surface
        4580             : !  boundary dataset (tdf, 10/27/03).  LAI/VAI algorithm is from CCM:lsm/phenol
        4581             : !  () Bon96.  The LSM data are mid-month values, i.e., valid on the 15th of !
        4582             : !  the month.!
        4583             : !
        4584             : !  Criterion for mobilisation candidate (tdf, 4/5/04):
        4585             : !  (1) first, must be a land point, not ocean, not ice
        4586             : !  (2) second, it cannot be an inland lake, wetland or ice
        4587             : !  (3) modulated by vegetation type
        4588             : !  (4) modulated by subgridscale wetness
        4589             : !  (5) cannot be snow covered
        4590             : !
        4591             : !  Arguments as Input:
        4592             : !  ============================================================================
        4593             : !  (1 ) DOY         (REAL*8 ) : Day of year                         [1.0-366.0]
        4594             : !  (3 ) LAT_RDN     (REAL*8 ) : Latitude                            [radians  ]
        4595             : !  (4 ) LND_FRC_DRY (REAL*8 ) : Dry land fraction                   [fraction ]
        4596             : !  (7 ) ORO         (REAL*8 ) : Orography: land/ocean/ice           [flags    ]
        4597             : !  (8 ) SFC_TYP     (INTEGER) : LSM surface type (0..28)            [unitless ]
        4598             : !  (9 ) SNW_FRC     (REAL*8 ) : Fraction of surface covered by snow [fraction ]
        4599             : !  (10) TPT_SOI     (REAL*8 ) : Soil temperature                    [K        ]
        4600             : !  (11) TPT_SOI_FRZ (REAL*8 ) : Temperature of frozen soil          [K        ]
        4601             : !  (12) VAI_DST     (REAL*8 ) : Vegetation area index, one-sided    [m2/m2    ]
        4602             : !
        4603             : !  Arguments as Output:
        4604             : !  ============================================================================
        4605             : !  (2 ) FLG_MBL     (LOGICAL) : Mobilization candidate flag         [flag     ]
        4606             : !  (5 ) LND_FRC_MBL (REAL*8 ) : Bare ground fraction                [fraction ]
        4607             : !  (6 ) MBL_NBR     (INTEGER) : Number of mobilization candidates   [unitless ]
        4608             : !
        4609             : !  NOTES:
        4610             : !  (1 ) Updated comments, cosmetic changes.  Also now forces double-precision
        4611             : !        with "D" exponents. (tdf, bmy, 4/5/04)
        4612             : !  (2 ) For the GOCART source function, we don't use VAI, so set FLG_VAI_TVBDS
        4613             : !         = .FALSE. and disable calls to ERROR_STOP (tdf, bmy, 1/25/07)
        4614             : !  (3 ) Modification for GEOS-4 1 x 1.25 grids (lok, bmy, 1/13/10)
        4615             : !******************************************************************************
        4616             : !
        4617             :
        4618             :       !------------------
        4619             :       ! Arguments
        4620             :       !------------------
        4621             :       TYPE(HCO_State), POINTER  :: HcoState
        4622             :       INTEGER, INTENT(IN)  :: SFC_TYP_SLC(HcoState%NX)
        4623             :       REAL*8,  INTENT(IN)  :: DOY
        4624             :       REAL*8,  INTENT(IN)  :: LAT_RDN
        4625             :       REAL*8,  INTENT(IN)  :: LND_FRC_DRY_SLC(HcoState%NX)
        4626             :       REAL*8,  INTENT(IN)  :: ORO(HcoState%NX)
        4627             :       REAL*8,  INTENT(IN)  :: SNW_FRC(HcoState%NX)
        4628             :       REAL*8,  INTENT(IN)  :: TPT_SOI(HcoState%NX)
        4629             :       REAL*8,  INTENT(IN)  :: TPT_SOI_FRZ
        4630             :       REAL*8,  INTENT(IN)  :: VAI_DST_SLC(HcoState%NX)
        4631             :       INTEGER, INTENT(OUT) :: MBL_NBR
        4632             :       LOGICAL, INTENT(OUT) :: FLG_MBL(HcoState%NX)
        4633             :       REAL*8,  INTENT(OUT) :: LND_FRC_MBL(HcoState%NX)
        4634             :       INTEGER, INTENT(INOUT) :: RC
        4635             :
        4636             :       !------------------
        4637             :       ! Parameters
        4638             :       !------------------
        4639             :
        4640             :       ! VAI threshold quench [m2/m2]
        4641             :       REAL*8,  PARAMETER   :: VAI_MBL_THR = 0.30D0
        4642             :
        4643             :       !------------------
        4644             :       ! Local variables
        4645             :       !------------------
        4646             :
        4647             :       ! [idx] Counting index
        4648             :       INTEGER              :: IDX_IDX
        4649             :
        4650             :       ! [idx] Interpolation month, future
        4651             :       INTEGER              :: IDX_MTH_GLB
        4652             :
        4653             :       ! [idx] Interpolation month, past
        4654             :       INTEGER              :: IDX_MTH_LUB
        4655             :
        4656             :       ! [idx] Longitude index array (land)
        4657           0 :       INTEGER              :: LND_IDX(HcoState%NX)
        4658             :
        4659             :       ! [nbr] Number of land points
        4660             :       INTEGER              :: LND_NBR
        4661             :
        4662             :       ! [idx] Counting index for longitude
        4663             :       INTEGER              :: LON_IDX
        4664             :
        4665             :       ! [idx] Surface type index
        4666             :       INTEGER              :: SFC_TYP_IDX
        4667             :
        4668             :       ! [idx] Surface sub-gridscale index
        4669             :       INTEGER              :: SGS_IDX
        4670             :
        4671             :       !-------------------------------------------------------------------
        4672             :       ! Prior to 1/25/07:
        4673             :       ! For GOCART source function, we don't use VAI (tdf, bmy, 1/25/07)
        4674             :       !
        4675             :       ! %%%%% DO NOT DELETE -- LEAVE THIS CODE COMMENTED OUT %%%%%
        4676             :       !
        4677             :       !! [flg] Use VAI data from time-varying boundary dataset
        4678             :       ! LOGICAL              :: FLG_VAI_TVBDS = .TRUE.
        4679             :       !-------------------------------------------------------------------
        4680             :
        4681             :       ! For GOCART source function, we do not use VAI (tdf, bmy, 1/25/07)
        4682             :       LOGICAL              :: FLG_VAI_TVBDS = .FALSE.
        4683             :
        4684             :       ! [flg] Add 182 days in southern hemisphere
        4685             :       LOGICAL              :: FLG_SH_ADJ = .TRUE.
        4686             :
        4687             :       ! [dgr] Latitude
        4688             :       REAL*8               :: LAT_DGR
        4689             :
        4690             :       ! [m2 m-2] Leaf + stem area index, one-sided
        4691             :       REAL*8               :: VAI_SGS
        4692             :
        4693             :       ! Error handling
        4694             :       CHARACTER(LEN=255)   :: MSG
        4695             :
        4696             :       !=================================================================
        4697             :       ! LND_FRC_MBL_GET begins here!
        4698             :       !=================================================================
        4699             :
        4700             :       ! Error check
        4701             :       IF ( VAI_MBL_THR <= 0.0d0 ) THEN
        4702             :          MSG = 'VAI_MBL_THR <= 0.0'
        4703             :          CALL HCO_ERROR(MSG, RC,
        4704             :      &        THISLOC='LND_FRC_MBL_GET' )
        4705             :          RETURN
        4706             :       ENDIF
        4707             :
        4708             :       ! Latitude (degrees)
        4709           0 :       LAT_DGR = 180.0D0 * LAT_RDN/HcoState%Phys%PI
        4710             :
        4711             :       ! Initialize outputs
        4712           0 :       MBL_NBR = 0
        4713             :
        4714           0 :       DO LON_IDX = 1, HcoState%NX
        4715           0 :          FLG_MBL(LON_IDX) = .FALSE.
        4716             :       ENDDO
        4717             :
        4718           0 :       LND_FRC_MBL(:) = 0.0D0
        4719             :
        4720             :       !=================================================================
        4721             :       ! For dust mobilisation, we need to have land!  tdf 10/27/2K3
        4722             :       ! Set up lnd_idx to hold the longitude indices for land
        4723             :       ! Land ahoy!
        4724             :       !=================================================================
        4725           0 :       LND_NBR = 0
        4726           0 :       DO LON_IDX = 1, HcoState%NX
        4727           0 :          IF ( ORO_IS_LND( ORO(LON_IDX)) ) THEN
        4728           0 :             LND_NBR          = LND_NBR + 1
        4729           0 :             LND_IDX(LND_NBR) = LON_IDX
        4730             :          ENDIF
        4731             :       ENDDO
        4732             :
        4733             :       ! Much ado about nothing (no land points)
        4734           0 :       IF ( LND_NBR == 0 ) RETURN
        4735             :
        4736             : !-----------------------------------------------------------------------------
        4737             : ! Prior to 1/25/07:
        4738             : ! When GOCART source function is used, VAI flag is NOT used, so
        4739             : ! we need to disable the ERROR_STOP call (tdf, bmy, 1/25/07)
        4740             : !
        4741             : ! %%%%% DO NOT DELETE -- LEAVE THIS CODE COMMENTED OUT %%%%%
        4742             : !
        4743             : !      ! Introduce error message for flg_vai_tvbds=F (VAI not used!)
        4744             : !      IF ( .not. FLG_VAI_TVBDS ) THEN
        4745             : !c         print *,' FLG_VAI_TVBDS is false: GOCART source function used'
        4746             : !         CALL ERROR_STOP( 'FLG_VAI_TVBDS=F',
        4747             : !     &                    'LND_FRC_MBL_GET ("dust_dead_mod.f")' )
        4748             : !      ENDIF
        4749             : !-----------------------------------------------------------------------------
        4750             :
        4751             :       !=================================================================
        4752             :       ! Only land points are possible candidates for dust mobilization
        4753             :       !=================================================================
        4754             :
        4755             :       ! Loop over land points
        4756           0 :       DO IDX_IDX = 1, LND_NBR
        4757           0 :          LON_IDX = LND_IDX(IDX_IDX)
        4758             :
        4759             :          ! Store surface blend of current gridpoint
        4760           0 :          SFC_TYP_IDX = SFC_TYP_SLC(LON_IDX)
        4761             :
        4762             :          ! Check for wet or frozen conditions - no mobilisation allowed
        4763             :          ! Surface type 1  = inland lakes & land ice
        4764             :          ! Surface type 27 = wetlands
        4765           0 :          IF ( SFC_TYP_IDX <= 1  .OR. SFC_TYP_IDX >= 27 .OR.
        4766             :      &        TPT_SOI(LON_IDX) < TPT_SOI_FRZ )          THEN
        4767             :
        4768             :               ! SET bare ground fraction to zero
        4769           0 :               LND_FRC_MBL(LON_IDX) = 0.0D0
        4770             :
        4771             :          ELSE
        4772             :
        4773             :            !-------------------------
        4774             :            ! If we are using VAI...
        4775             :            !-------------------------
        4776           0 :            IF ( FLG_VAI_TVBDS ) THEN
        4777             :
        4778             :               ! "bare ground" fraction of current gridcell decreases
        4779             :               ! linearly from 1.0 to 0.0 as VAI increases from 0.0 to
        4780             :               ! vai_mbl_thr.  NOTE: vai_mbl_thr set to 0.3  (tdf, 4/5/04)
        4781             :               LND_FRC_MBL(LON_IDX) =
        4782             :      &            1.0D0 - MIN(1.0D0, MIN(VAI_DST_SLC(LON_IDX),
        4783           0 :      &                       VAI_MBL_THR) / VAI_MBL_THR)
        4784             :
        4785             :            !---------------------------
        4786             :            ! If we're not using VAI...
        4787             :            !---------------------------
        4788             :            ELSE
        4789             :
        4790             : !-----------------------------------------------------------------------------
        4791             : ! Prior to 1/25/07:
        4792             : ! When GOCART source function is used, VAI flag is NOT used, so
        4793             : ! we need to disable the ERROR_STOP call. (tdf, bmy, 1/25/07)
        4794             : !
        4795             : ! %%%%% DO NOT DELETE -- LEAVE THIS CODE COMMENTED OUT %%%%%
        4796             : !
        4797             : !              CALL ERROR_STOP( 'FLG_VAI_TVBDS=F',
        4798             : !     &                         'LND_FRC_MBL_GET ("dust_dead_mod.f")' )
        4799             : !-----------------------------------------------------------------------------
        4800             :
        4801             :               ! For GOCART source function, set the bare
        4802             :               ! ground fraction to 1 (tdf, bmy, 1/25/07)
        4803           0 :               LND_FRC_MBL(LON_IDX) = 1.0D0
        4804             :
        4805             :            ENDIF
        4806             :
        4807             :          ENDIF                 ! endif normal land
        4808             :
        4809             :          !==============================================================
        4810             :          ! We have now filled "lnd_frc_mbl" the land fraction suitable
        4811             :          ! for mobilisation.  Adjust for factors which constrain entire
        4812             :          ! gridcell  LND_FRC_MBL modulated by LND_FRC_DRY and SNW_FRC.
        4813             :          ! (tdf, 4/5/04)
        4814             :          !==============================================================
        4815             :
        4816             :          ! Take the bare ground fraction, multiply by the fraction
        4817             :          ! that is dry and that is NOT covered by snow
        4818             :          LND_FRC_MBL(LON_IDX) = LND_FRC_MBL(LON_IDX)
        4819             :      &                        * LND_FRC_DRY_SLC(LON_IDX)
        4820           0 :      &                        * ( 1.0D0 - SNW_FRC(LON_IDX) )
        4821             :
        4822             :          ! Temporary fix for 1 x 1.25 grids -- Lok Lamsal 1/13/10
        4823           0 :          IF ( LND_FRC_MBL(LON_IDX) .GT. 1.0D0 ) THEN
        4824           0 :             LND_FRC_MBL(LON_IDX) = 0.99D0
        4825             :          ENDIF
        4826             :
        4827             :          ! Error check
        4828           0 :          IF ( LND_FRC_MBL(lon_idx) > 1.0D0 ) THEN
        4829           0 :             MSG = 'LND_FRC_MBL > 1'
        4830             :             CALL HCO_ERROR(MSG, RC,
        4831           0 :      &         THISLOC='LND_FRC_MBL_GET' )
        4832           0 :             RETURN
        4833             :          ENDIF
        4834             :
        4835           0 :          IF ( LND_FRC_MBL(LON_IDX) < 0.0D0 )   then
        4836           0 :             MSG = 'LND_FRC_MBL < 0'
        4837             :             CALL HCO_ERROR(MSG, RC,
        4838           0 :      &         THISLOC='LND_FRC_MBL_GET' )
        4839           0 :             RETURN
        4840             :          ENDIF
        4841             :
        4842             :          ! If there is dry land in this longitude
        4843           0 :          if ( LND_FRC_MBL(LON_IDX) > 0.0D0 ) then
        4844             :
        4845             :             ! Set flag, we have a candidate!
        4846           0 :             FLG_MBL(LON_IDX) = .TRUE.
        4847             :
        4848             :             ! Increment # of candidates
        4849           0 :             MBL_NBR          = MBL_NBR + 1
        4850             :          ENDIF
        4851             :
        4852             :       ENDDO
        4853             :
        4854             :       ! Return w/ success
        4855           0 :       RC = HCO_SUCCESS
        4856             :
        4857             :       ! Return to calling program
        4858             :       END SUBROUTINE LND_FRC_MBL_GET
        4859             :
        4860             : !------------------------------------------------------------------------------
        4861             :
        4862             :       SUBROUTINE DST_ADD_LON( NX, NBINS, Q, Q_TTL )
        4863             : !
        4864             : !******************************************************************************
        4865             : !  Subroutine DST_ADD_LON dst_add_lon() computes and returns the total
        4866             : !  property (e.g., mixing ratio, flux), obtained by simply adding along the
        4867             : !  (dust) constituent dimension, when given an 3-D array of an additive
        4868             : !  property (e.g., mixing ratio, flux). (tdf, bmy, 4/5/04)
        4869             : !
        4870             : !  Arguments as Input:
        4871             : !  ============================================================================
        4872             : !  (1 ) q     (REAL*8) : Total property
        4873             : !
        4874             : !  Arguments as Output:
        4875             : !  ============================================================================
        4876             : !  (2 ) q_ttl (REAL*8) : Property for each size class
        4877             : !
        4878             : !  NOTES:
        4879             : !  (1 ) Updated comments, cosmetic changes.  Also now forces double-precision
        4880             : !        with "D" exponents. (tdf, bmy, 4/5/04)
        4881             : !******************************************************************************
        4882             : !
        4883             :
        4884             :       ! Arguments
        4885             :       INTEGER, INTENT(IN) :: NX, NBINS
        4886             :       REAL*8, INTENT(IN)  :: Q(NX,NBINS)
        4887             :       REAL*8, INTENT(OUT) :: Q_TTL(NX)
        4888             :
        4889             :       ! Local variables
        4890             :       INTEGER             :: I, M
        4891             :
        4892             :       !=================================================================
        4893             :       ! DST_ADD_LON begins here!
        4894             :       !=================================================================
        4895             :
        4896             :       ! Initialize
        4897             :       Q_TTL = 0d0
        4898             :
        4899             :       ! Loop over dust bins
        4900             :       DO M = 1, NBINS
        4901             :
        4902             :          ! Loop over longitudes
        4903             :          DO I = 1, NX
        4904             :
        4905             :             ! Integrate!
        4906             :             Q_TTL(I) = Q_TTL(I) + Q(I,M)
        4907             :
        4908             :          ENDDO
        4909             :       ENDDO
        4910             :
        4911             :       ! Return to calling program
        4912             :       END SUBROUTINE DST_ADD_LON
        4913             :
        4914             : !------------------------------------------------------------------------------
        4915             :
        4916           0 :       SUBROUTINE DST_TVBDS_GET( Inst, NX, LAT_IDX, VAI_DST_OUT )
        4917             : !
        4918             : !******************************************************************************
        4919             : !  Subroutine DST_TVBDS_GET returns a specifed latitude slice of VAI data.
        4920             : !  (tdf, bmy, 4/5/04)
        4921             : !
        4922             : !  Arguments as Input:
        4923             : !  ============================================================================
        4924             : !  (1 ) LAT_IDX     (INTEGER) : Latitude index
        4925             : !
        4926             : !  Arguments as Output:
        4927             : !  ============================================================================
        4928             : !  (2 ) VAI_DST_OUT (REAL*8 ) : Vegetation area index, 1-sided, current [m2/m2]
        4929             : !
        4930             : !  NOTES:
        4931             : !  (1 ) Updated comments, cosmetic changes.  Also now forces double-precision
        4932             : !        with "D" exponents. (tdf, bmy, 4/5/04)
        4933             : !******************************************************************************
        4934             : !
        4935             :
        4936             :       ! Arguments
        4937             :       TYPE(MyInst), POINTER  :: Inst
        4938             :       INTEGER, INTENT(IN)    :: NX
        4939             :       INTEGER, INTENT(IN)    :: LAT_IDX
        4940             :       REAL*8,  INTENT(OUT)   :: VAI_DST_OUT(:)
        4941             :
        4942             :       ! Local variables
        4943             :       INTEGER              :: LON_IDX
        4944             :
        4945             :       !=================================================================
        4946             :       ! DST_TVBDS_GET begins here!
        4947             :       !=================================================================
        4948             :
        4949             :       ! Return lat slice of VAI [m2/m2]
        4950           0 :       DO LON_IDX = 1, NX
        4951           0 :          VAI_DST_OUT(LON_IDX) = Inst%VAI_DST(LON_IDX,LAT_IDX)
        4952             :       ENDDO
        4953             :
        4954             :       ! Return to calling program
        4955           0 :       END SUBROUTINE DST_TVBDS_GET
        4956             :
        4957             : !------------------------------------------------------------------------------
        4958             :
        4959           0 :       SUBROUTINE OVR_SRC_SNK_FRC_GET( HcoState,
        4960           0 :      &                                SRC_NBR,         MDN_SRC,
        4961           0 :      &                                GSD_SRC,         SNK_NBR,
        4962           0 :      &                                DMT_MIN_SNK,     DMT_MAX_SNK,
        4963           0 :      &                                OVR_SRC_SNK_FRC, RC )
        4964             :
        4965             :       USE HCO_CLOCK_MOD, ONLY : HcoClock_First
        4966             : !
        4967             : !******************************************************************************
        4968             : !  Subroutine OVR_SRC_SNK_FRC_GET, given one set (the "source") of lognormal
        4969             : !  distributions, and one set of bin boundaries (the "sink"), computes and
        4970             : !  returns the overlap factors between the source distributions and the sink
        4971             : !  bins.  (tdf, bmy, 4/5/04)
        4972             : !
        4973             : !  The output is a matrix, Mij, OVR_SRC_SNK_FRC(SRC_NBR,SNK_NBR)
        4974             : !  Element ovr_src_snk_frc(i,j) is the fraction of size distribution i
        4975             : !  in group src that overlaps sink bin j
        4976             : !
        4977             : !  Arguments as Input:
        4978             : !  ============================================================================
        4979             : !  (1 ) SRC_NBR        (INTEGER)  : Dimension size                [unitless]
        4980             : !  (2 ) MDN_SRC        (REAL*8 )  : Mass median particle size     [m       ]
        4981             : !  (3 ) GSD_SRC        (REAL*8 )  : Geometric standard deviation  [fraction]
        4982             : !  (4 ) SNK_NBR        (INTEGER)  : Dimension size                [unitless]
        4983             : !  (5 ) DMT_MIN_SNK    (REAL*8 )  : Minimum diameter in bin       [m       ]
        4984             : !  (6 ) DMT_MAX_SNK    (REAL*8 )  : Maximum diameter in bin       [m       ]
        4985             : !
        4986             : !  Arguments as Output:
        4987             : !  ============================================================================
        4988             : !  (7 ) OVR_SRC_SNK_FRC (REAL*8 ) : Fractional overlap of src with snk, Mij.
        4989             : !
        4990             : !  NOTES
        4991             : !  (1 ) Updated comments, cosmetic changes.  Also now forces double-precision
        4992             : !        with "D" exponents. (tdf, bmy, 4/5/04)
        4993             : !******************************************************************************
        4994             : !
        4995             :
        4996             :       ! Arguments
        4997             :       TYPE(HCO_State), POINTER :: HcoState
        4998             :       INTEGER, INTENT(IN)      :: SRC_NBR
        4999             :       REAL*8,  INTENT(IN)      :: MDN_SRC(SRC_NBR)
        5000             :       REAL*8,  INTENT(IN)      :: GSD_SRC(SRC_NBR)
        5001             :       INTEGER, INTENT(IN)      :: SNK_NBR
        5002             :       REAL*8,  INTENT(IN)      :: DMT_MIN_SNK(SNK_NBR)
        5003             :       REAL*8,  INTENT(IN)      :: DMT_MAX_SNK(SNK_NBR)
        5004             :       REAL*8,  INTENT(OUT)     :: OVR_SRC_SNK_FRC(SRC_NBR,SNK_NBR)
        5005             :       INTEGER, INTENT(INOUT)   :: RC
        5006             :
        5007             :       ! Local
        5008             : !      LOGICAL              :: FIRST = .TRUE.
        5009             :       INTEGER              :: SRC_IDX         ! [idx] Counting index for src
        5010             :       INTEGER              :: SNK_IDX         ! [idx] Counting index for snk
        5011             :       REAL*8               :: LN_GSD          ! [frc] ln(gsd)
        5012             :       REAL*8               :: SQRT2LNGSDI     ! [frc] Factor in erf() argument
        5013             :       REAL*8               :: LNDMAXJOVRDMDNI ! [frc] Factor in erf() argument
        5014             :       REAL*8               :: LNDMINJOVRDMDNI ! [frc] Factor in erf() argument
        5015             :       CHARACTER(LEN=255)   :: MSG
        5016             :
        5017             :       !=================================================================
        5018             :       ! OVR_SRC_SNK_FRC_GET begins here
        5019             :       !=================================================================
        5020             :
        5021           0 :       IF ( HcoClock_First(HcoState%Clock,.TRUE.) ) THEN
        5022             :
        5023             :          ! Test if ERF is implemented OK on this platform
        5024             :          ! 19990913: erf() in SGI /usr/lib64/mips4/libftn.so is bogus
        5025           0 :          IF ( ABS( 0.8427d0 - ERF(1.0d0) ) / 0.8427d0 > 0.001d0 ) THEN
        5026           0 :             MSG = 'ERF error 1 in OVR_SRC_SNK_FRC_GET!'
        5027             :             CALL HCO_ERROR(MSG, RC,
        5028           0 :      &         THISLOC='OVR_SRC_SNK_FRC_GET' )
        5029           0 :             RETURN
        5030             :          ENDIF
        5031             :
        5032             :          ! Another ERF check
        5033           0 :          IF ( ERF( 0.0D0 ) /= 0.0D0 ) THEN
        5034           0 :             MSG = 'ERF error 2 in OVR_SRC_SNK_FRC_GET!'
        5035             :             CALL HCO_ERROR(MSG, RC,
        5036           0 :      &         THISLOC='OVR_SRC_SNK_FRC_GET' )
        5037           0 :             RETURN
        5038             :          ENDIF
        5039             :
        5040             :          ! Reset first-time flag
        5041             :          !FIRST = .FALSE.
        5042             :       ENDIF
        5043             :
        5044             :
        5045             :       ! Loop over source index (cf Zender et al eq 12)
        5046           0 :       DO SRC_IDX = 1, SRC_NBR
        5047             :
        5048             :          ! Fraction
        5049           0 :          SQRT2LNGSDI = SQRT(2.0D0) * LOG( GSD_SRC(SRC_IDX) )
        5050             :
        5051             :          ! Loop over sink index
        5052           0 :          DO SNK_IDX = 1, SNK_NBR
        5053             :
        5054             :             ! [fraction]
        5055           0 :             LNDMAXJOVRDMDNI = LOG(DMT_MAX_SNK(SNK_IDX)/MDN_SRC(SRC_IDX))
        5056             :
        5057             :             ! [fraction]
        5058           0 :             LNDMINJOVRDMDNI = LOG(DMT_MIN_SNK(SNK_IDX)/MDN_SRC(SRC_IDX))
        5059             :
        5060             :             ! [fraction]
        5061             :             OVR_SRC_SNK_FRC (SRC_IDX,SNK_IDX)=  ! [frc]
        5062             :      &            0.5D0 * (ERF(LNDMAXJOVRDMDNI/SQRT2LNGSDI)
        5063           0 :      &                   - ERF(LNDMINJOVRDMDNI/SQRT2LNGSDI) )
        5064             :          ENDDO
        5065             :       ENDDO
        5066             :
        5067             :       ! Return w/ success
        5068           0 :       RC = HCO_SUCCESS
        5069             :
        5070             :       END SUBROUTINE OVR_SRC_SNK_FRC_GET
        5071             :
        5072             : !------------------------------------------------------------------------------
        5073             :
        5074           0 :        FUNCTION ERF( X ) RESULT( ERF_VAL )
        5075             : !
        5076             : !******************************************************************************
        5077             : !  Function ERF returns the error function erf(x).  See comments heading
        5078             : !  routine CALERF below.  Author/Date: W. J. Cody, January 8, 1985
        5079             : !  (tdf, bmy, 4/5/04)
        5080             : !
        5081             : !  Arguments as Input:
        5082             : !  ============================================================================
        5083             : !  (1 ) X (REAL*8) : Argument to erf(x)
        5084             : !
        5085             : !  NOTES:
        5086             : !  (1 ) Updated comments (bmy, 4/5/04)
        5087             : !******************************************************************************
        5088             : !
        5089             :        IMPLICIT NONE
        5090             :
        5091             :        ! Arguments
        5092             :        REAL*8, INTENT(IN) :: X
        5093             :
        5094             :        ! Local variables
        5095             :        INTEGER            :: JINT
        5096             :        REAL*8             :: RESULT, ERF_VAL
        5097             :
        5098             :        !================================================================
        5099             :        ! ERF begins here!
        5100             :        !================================================================
        5101           0 :        JINT = 0
        5102           0 :        CALL CALERF( X, RESULT, JINT )
        5103           0 :        ERF_VAL = RESULT
        5104             :
        5105             :        ! Return to calling program
        5106           0 :        END FUNCTION ERF
        5107             :
        5108             : !------------------------------------------------------------------------------
        5109             :
        5110           0 :        SUBROUTINE CALERF( ARG, RESULT, JINT )
        5111             : !
        5112             : !******************************************************************************
        5113             : !  This packet evaluates erf(x), erfc(x), and exp(x*x)*erfc(x)
        5114             : !  for a real argument  x.  It contains three function type
        5115             : !  subprograms: erf, erfc, and erfcx (or derf, derfc, and derfcx),
        5116             : !  and one subroutine type subprogram, calerf.  The calling
        5117             : !  statements for the primary entries are:
        5118             : !
        5119             : !  y=erf(x)     (or   y=derf(x)),
        5120             : !  y=erfc(x)    (or   y=derfc(x)),
        5121             : !  and
        5122             : !  y=erfcx(x)   (or   y=derfcx(x)).
        5123             : !
        5124             : !  The routine  calerf  is intended for internal packet use only,
        5125             : !  all computations within the packet being concentrated in this
        5126             : !  routine.  The function subprograms invoke  calerf  with the
        5127             : !  statement
        5128             : !  call calerf(arg,result,jint)
        5129             : !  where the parameter usage is as follows
        5130             : !
        5131             : !  Function                     Parameters for calerf
        5132             : !  Call              Arg                  Result          Jint
        5133             : !
        5134             : !  erf(arg)      any real argument         erf(arg)          0
        5135             : !  erfc(arg)     abs(arg)  <  xbig        erfc(arg)          1
        5136             : !  erfcx(arg)    xneg  <  arg  <  xmax   erfcx(arg)          2
        5137             : !
        5138             : !  The main computation evaluates near-minimax approximations:
        5139             : !  from "Rational Chebyshev Approximations for the Error Function"
        5140             : !  by W. J. Cody, Math. Comp., 1969, pp. 631-638.  This
        5141             : !  transportable program uses rational functions that theoretically
        5142             : !  approximate  erf(x)  and  erfc(x)  to at least 18 significant
        5143             : !  decimal digits.  The accuracy achieved depends on the arithmetic
        5144             : !  system, the compiler, the intrinsic functions, and proper
        5145             : !  selection of the machine-dependent constants.
        5146             : !
        5147             : !  Explanation of machine-dependent constants:
        5148             : !  xmin   = The smallest positive floating-point number.
        5149             : !  xinf   = The largest positive finite floating-point number.
        5150             : !  xneg   = The largest negative argument acceptable to erfcx;
        5151             : !  the negative of the solution to the equation
        5152             : !  2*exp(x*x) = xinf.
        5153             : !  xsmall = Argument below which erf(x) may be represented by
        5154             : !  2*x/sqrt(pi)  and above which  x*x  will not underflow.
        5155             : !  A conservative value is the largest machine number x
        5156             : !  such that   1.0 + x = 1.0   to machine precision.
        5157             : !  xbig   = Largest argument acceptable to erfc;  solution to
        5158             : !  the equation:  w(x)* (1-0.5/x**2) = xmin,  where
        5159             : !  w(x) = exp(-x*x)/[x*sqrt(pi)].
        5160             : !  xhuge  = Argument above which  1.0 - 1/(2*x*x) = 1.0  to
        5161             : !  machine precision.  a conservative value is
        5162             : !  1/[2*sqrt(xsmall)]
        5163             : !  xmax   = Largest acceptable argument to erfcx; the minimum
        5164             : !  of xinf and 1/[sqrt(pi)*xmin].
        5165             : !
        5166             : !  Approximate values for some important machines are:
        5167             : !  xmin       xinf        xneg     xsmall
        5168             : !  CDC 7600      (s.p.)  3.13e-294   1.26e+322   -27.220  7.11e-15
        5169             : !  Cray-1        (s.p.)  4.58e-2467  5.45e+2465  -75.345  7.11e-15
        5170             : !  IEEE (IBM/XT,
        5171             : !  Sun, etc.)  (s.p.)  1.18e-38    3.40e+38     -9.382  5.96e-8
        5172             : !  IEEE (IBM/XT,
        5173             : !  Sun, etc.)  (d.p.)  2.23d-308   1.79d+308   -26.628  1.11d-16
        5174             : !  IBM 195       (d.p.)  5.40d-79    7.23e+75    -13.190  1.39d-17
        5175             : !  Univac 1108   (d.p.)  2.78d-309   8.98d+307   -26.615  1.73d-18
        5176             : !  Vax d-format  (d.p.)  2.94d-39    1.70d+38     -9.345  1.39d-17
        5177             : !  Vax g-format  (d.p.)  5.56d-309   8.98d+307   -26.615  1.11d-16
        5178             : !
        5179             : !  xbig       xhuge       xmax
        5180             : !  CDC 7600      (s.p.)  25.922      8.39e+6     1.80x+293
        5181             : !  Cray-1        (s.p.)  75.326      8.39e+6     5.45e+2465
        5182             : !  IEEE (IBM/XT,
        5183             : !  Sun, etc.)  (s.p.)   9.194      2.90e+3     4.79e+37
        5184             : !  IEEE (IBM/XT,
        5185             : !  Sun, etc.)  (d.p.)  26.543      6.71d+7     2.53d+307
        5186             : !  IBM 195       (d.p.)  13.306      1.90d+8     7.23e+75
        5187             : !  Univac 1108   (d.p.)  26.582      5.37d+8     8.98d+307
        5188             : !  Vax d-format  (d.p.)   9.269      1.90d+8     1.70d+38
        5189             : !  Vax g-format  (d.p.)  26.569      6.71d+7     8.98d+307
        5190             : !
        5191             : !  Error returns:
        5192             : !  The program returns  erfc = 0      for  arg  >=  xbig;
        5193             : !  erfcx = xinf  for  arg  <  xneg;
        5194             : !  and
        5195             : !  erfcx = 0     for  arg  >=  xmax.
        5196             : !
        5197             : !  Intrinsic functions required are:
        5198             : !  abs, aint, exp
        5199             : !
        5200             : !  Author: W. J. Cody
        5201             : !  Mathematics And Computer Science Division
        5202             : !  Argonne National Laboratory
        5203             : !  Argonne, IL 60439
        5204             : !  Latest modification: March 19, 1990
        5205             : !
        5206             : !  NOTES:
        5207             : !  (1 ) Now force double-precision w/ "D" exponents (bmy, 4/5/04)
        5208             : !******************************************************************************
        5209             : !
        5210             :       IMPLICIT NONE
        5211             :       INTEGER I,JINT
        5212             :       REAL*8  A,ARG,B,C,D,DEL,FOUR,HALF,P,ONE,Q,RESULT,SIXTEN,SQRPI,
        5213             :      &   TWO,THRESH,X,XBIG,XDEN,XHUGE,XINF,XMAX,XNEG,XNUM,XSMALL,
        5214             :      &   Y,YSQ,ZERO
        5215             :       DIMENSION A(5),B(4),C(9),D(8),P(6),Q(5)
        5216             :
        5217             :       ! Mathematical constants
        5218             :       data four,one,half,two,zero/4.0d0,1.0d0,0.5d0,2.0d0,0.0d0/,
        5219             :      &         sqrpi/5.6418958354775628695d-1/,thresh/0.46875d0/,
        5220             :      &         sixten/16.0d0/
        5221             :
        5222             :       ! Machine-dependent constants
        5223             :       data xinf,xneg,xsmall/3.40d+38,-9.382d0,5.96d-8/,
        5224             :      &      xbig,xhuge,xmax/9.194d0,2.90d3,4.79d37/
        5225             :
        5226             :       ! Coefficients for approximation to  erf  in first interval
        5227             :       data a /3.16112374387056560d00,1.13864154151050156d02,
        5228             :      &     3.77485237685302021d02,3.20937758913846947d03,
        5229             :      &     1.85777706184603153d-1/
        5230             :
        5231             :       data b /2.36012909523441209d01,2.44024637934444173d02,
        5232             :      &     1.28261652607737228d03,2.84423683343917062d03/
        5233             :
        5234             :       ! Coefficients for approximation to  erfc  in second interval
        5235             :       data c /5.64188496988670089d-1,8.88314979438837594d0,
        5236             :      &     6.61191906371416295d01,2.98635138197400131d02,
        5237             :      &     8.81952221241769090d02,1.71204761263407058d03,
        5238             :      &     2.05107837782607147d03,1.23033935479799725d03,
        5239             :      &     2.15311535474403846d-8/
        5240             :
        5241             :       data d /1.57449261107098347d01,1.17693950891312499d02,
        5242             :      &     5.37181101862009858d02,1.62138957456669019d03,
        5243             :      &     3.29079923573345963d03,4.36261909014324716d03,
        5244             :      &     3.43936767414372164d03,1.23033935480374942d03/
        5245             :
        5246             :       ! Coefficients for approximation to  erfc  in third interval
        5247             :       data p /3.05326634961232344d-1,3.60344899949804439d-1,
        5248             :      &     1.25781726111229246d-1,1.60837851487422766d-2,
        5249             :      &     6.58749161529837803d-4,1.63153871373020978d-2/
        5250             :
        5251             :       data q /2.56852019228982242d00,1.87295284992346047d00,
        5252             :      &     5.27905102951428412d-1,6.05183413124413191d-2,
        5253             :      &     2.33520497626869185d-3/
        5254             :
        5255             : c Main Code
        5256           0 :       x=arg
        5257           0 :       y=abs(x)
        5258           0 :       if (y <= thresh) then
        5259             : c Evaluate  erf  for  |x| <= 0.46875
        5260           0 :         ysq=zero
        5261           0 :         if (y > xsmall) ysq=y*y
        5262           0 :         xnum=a(5)*ysq
        5263           0 :         xden=ysq
        5264           0 :         do i=1,3
        5265           0 :           xnum=(xnum+a(i))*ysq
        5266           0 :           xden=(xden+b(i))*ysq
        5267             :         end do
        5268           0 :         result=x*(xnum+a(4))/(xden+b(4))
        5269           0 :         if (jint /= 0) result=one-result
        5270           0 :         if (jint == 2) result=exp(ysq)*result
        5271             :         go to 800
        5272             :
        5273             : c Evaluate  erfc  for 0.46875 <= |x| <= 4.0
        5274           0 :       else if (y <= four) then
        5275           0 :         xnum=c(9)*y
        5276           0 :         xden=y
        5277           0 :         do i=1,7
        5278           0 :           xnum=(xnum+c(i))*y
        5279           0 :           xden=(xden+d(i))*y
        5280             :         end do
        5281           0 :         result=(xnum+c(8))/(xden+d(8))
        5282           0 :         if (jint /= 2) then
        5283           0 :           ysq=aint(y*sixten)/sixten
        5284           0 :           del=(y-ysq)*(y+ysq)
        5285           0 :           result=exp(-ysq*ysq)*exp(-del)*result
        5286             :         end if
        5287             :
        5288             : c Evaluate  erfc  for |x| > 4.0
        5289             :       else
        5290           0 :         result=zero
        5291           0 :         if (y >= xbig) then
        5292           0 :           if ((jint /= 2).or.(y >= xmax)) go to 300
        5293           0 :           if (y >= xhuge) then
        5294           0 :              result=sqrpi/y
        5295           0 :              go to 300
        5296             :           end if
        5297             :         end if
        5298           0 :         ysq=one/(y*y)
        5299           0 :         xnum=p(6)*ysq
        5300           0 :         xden=ysq
        5301           0 :         do i=1,4
        5302           0 :           xnum=(xnum+p(i))*ysq
        5303           0 :           xden=(xden+q(i))*ysq
        5304             :         end do
        5305           0 :         result=ysq*(xnum+p(5))/(xden+q(5))
        5306           0 :         result=(sqrpi-result)/y
        5307           0 :         if (jint /= 2) then
        5308           0 :           ysq=aint(y*sixten)/sixten
        5309           0 :           del=(y-ysq)*(y+ysq)
        5310           0 :           result=exp(-ysq*ysq)*exp(-del)*result
        5311             :         end if
        5312             :       end if
        5313             :
        5314             : c Fix up for negative argument, erf, etc.
        5315           0 :   300 if (jint == 0) then
        5316           0 :         result=(half-result)+half
        5317           0 :         if (x < zero) result=-result
        5318           0 :       else if (jint == 1) then
        5319           0 :         if (x < zero) result=two-result
        5320             :       else
        5321           0 :         if (x < zero) then
        5322           0 :           if (x < xneg) then
        5323           0 :              result=xinf
        5324             :           else
        5325           0 :              ysq=aint(x*sixten)/sixten
        5326           0 :              del=(x-ysq)*(x+ysq)
        5327           0 :              y=exp(ysq*ysq)*exp(del)
        5328           0 :              result=(y+y)-result
        5329             :           end if
        5330             :         end if
        5331             :       end if
        5332           0 :   800 return
        5333             :
        5334             :       ! Return to calling program
        5335             :       END SUBROUTINE CALERF
        5336             :
        5337             : !------------------------------------------------------------------------------
        5338             :
        5339           0 :       SUBROUTINE PLN_TYP_GET( PLN_TYP, PLN_FRC, TAI )
        5340             :
        5341             : !
        5342             : !******************************************************************************
        5343             : !  Subroutine PLN_TYPE_GET returns LSM information needed by the DEAD
        5344             : !  dust parameterization. (tdf, bmy, 4/5/04)
        5345             : !
        5346             : !  Arguments as Output:
        5347             : !  ============================================================================
        5348             : !  (1 ) PLN_TYP (INTEGER) : LSM plant type index (1..14)
        5349             : !  (2 ) PLN_TYP (REAL*8 ) : Weight of corresponding plant type (sums to 1.0)
        5350             : !  (3 ) TAI     (REAL*8 ) : Leaf-area index (one sided) [index]
        5351             : !
        5352             : !  NOTES:
        5353             : !  (1 ) Updated comments.  Now force double-precision w/ "D" exponents.
        5354             : !        (bmy, 4/5/04)
        5355             : !******************************************************************************
        5356             : !
        5357             :       ! Arguments
        5358             :       INTEGER, INTENT(OUT) :: PLN_TYP(0:28,3)
        5359             :       REAL*8,  INTENT(OUT) :: PLN_FRC(0:28,3)
        5360             :       REAL*8,  INTENT(OUT) :: TAI(14,12)
        5361             :
        5362             :       ! Local variables
        5363             :       INTEGER              :: I, J
        5364             :
        5365             :       !=================================================================
        5366             :       ! There are 29 land surface types: 0 = ocean, 1 to 28 = land.
        5367             :       ! Each land point has up to three vegetation types, ranging in
        5368             :       ! value from 1 to 14.  PLN_TYPE contains the vegetation type of
        5369             :       ! the 3 subgrid points for each surface type.  PLN_FRC contains
        5370             :       ! the fractional area of the 3 subgrid points for each surface
        5371             :       ! type.
        5372             :       !=================================================================
        5373             :       PLN_TYP(0:28,1) = (/   0,
        5374             :      &                      14,  14,   1,   2,   4,   1  , 1,
        5375             :      &                       4,   1,   3,   5,  13,   1,   2,
        5376             :      &                      11,  11,   6,  13,   9,   7,   8,
        5377           0 :      &                       8,  12,  11,  12,  11,   3,  14/)
        5378             :
        5379             :       PLN_FRC(0:28,1) = (/ 0.00d0,
        5380             :      &                     1.00d0, 1.00d0, 0.75d0, 0.50d0,
        5381             :      &                     0.75d0, 0.37d0, 0.75d0,
        5382             :      &                     0.75d0, 0.37d0, 0.95d0, 0.75d0,
        5383             :      &                     0.70d0, 0.25d0, 0.25d0,
        5384             :      &                     0.40d0, 0.40d0, 0.60d0, 0.60d0,
        5385             :      &                     0.30d0, 0.80d0, 0.80d0,
        5386             :      &                     0.10d0, 0.85d0, 0.85d0, 0.85d0,
        5387           0 :      &                     0.85d0, 0.80d0, 1.00d0/)
        5388             :
        5389             :
        5390             :       PLN_TYP(0:28,2) = (/   0,
        5391             :      &                      14,  14,  14,  14,  14,   4  ,14,
        5392             :      &                      14,   4,  14,  14,   5,  10,  10,
        5393             :      &                       4,   4,  13,   6,  10,  14,  14,
        5394           0 :      &                      14,  14,  14,  14,  14,  14,  14/)
        5395             :
        5396             :       PLN_FRC(0:28,2) = (/ 0.00d0,
        5397             :      &                     0.00d0, 0.00d0, 0.25d0, 0.50d0,
        5398             :      &                     0.25d0, 0.37d0, 0.25d0,
        5399             :      &                     0.25d0, 0.37d0, 0.05d0, 0.25d0,
        5400             :      &                     0.30d0, 0.25d0, 0.25d0,
        5401             :      &                     0.30d0, 0.30d0, 0.20d0, 0.20d0,
        5402             :      &                     0.30d0, 0.20d0, 0.20d0,
        5403             :      &                     0.90d0, 0.15d0, 0.15d0, 0.15d0,
        5404           0 :      &                     0.15d0, 0.20d0, 0.00d0/)
        5405             :
        5406             :       PLN_TYP(0:28,3) = (/   0,
        5407             :      &                      14,  14,  14,  14,  14,  14,  14,
        5408             :      &                      14,  14,  14,  14,  14,  14,  14,
        5409             :      &                       1,   1,  14,  14,  14,  14,  14,
        5410           0 :      &                      14,  14,  14,  14,  14,  14,  14/)
        5411             :
        5412             :       PLN_FRC(0:28,3) = (/ 0.00d0,
        5413             :      &                     0.00d0, 0.00d0, 0.00d0, 0.00d0,
        5414             :      &                     0.00d0, 0.26d0, 0.00d0,
        5415             :      &                     0.00d0, 0.26d0, 0.00d0, 0.00d0,
        5416             :      &                     0.00d0, 0.50d0, 0.50d0,
        5417             :      &                     0.30d0, 0.30d0, 0.20d0, 0.20d0,
        5418             :      &                     0.40d0, 0.00d0, 0.00d0,
        5419             :      &                     0.00d0, 0.00d0, 0.00d0, 0.00d0,
        5420           0 :      &                     0.00d0, 0.00d0, 0.00d0/)
        5421             :
        5422             :       !=================================================================
        5423             :       ! ----------------------------------------------------------------
        5424             :       ! description of the 29 surface types
        5425             :       ! ----------------------------------------------------------------
        5426             :       !
        5427             :       ! no vegetation
        5428             :       ! -------------
        5429             :       !  0 ocean
        5430             :       !  1 land ice (glacier)
        5431             :       !  2 desert
        5432             :       !
        5433             :       ! forest vegetation
        5434             :       ! -----------------
        5435             :       !  3 cool needleleaf evergreen tree
        5436             :       !  4 cool needleleaf deciduous tree
        5437             :       !  5 cool broadleaf  deciduous tree
        5438             :       !  6 cool mixed needleleaf evergreen and broadleaf deciduous tree
        5439             :       !  7 warm needleleaf evergreen tree
        5440             :       !  8 warm broadleaf  deciduous tree
        5441             :       !  9 warm mixed needleleaf evergreen and broadleaf deciduous tree
        5442             :       ! 10 tropical broadleaf evergreen tree
        5443             :       ! 11 tropical seasonal deciduous tree
        5444             :       !
        5445             :       ! interrupted woods
        5446             :       ! ----------------
        5447             :       ! 12 savanna
        5448             :       ! 13 evergreen forest tundra
        5449             :       ! 14 deciduous forest tundra
        5450             :       ! 15 cool forest crop
        5451             :       ! 16 warm forest crop
        5452             :       !
        5453             :       ! non-woods
        5454             :       ! ---------
        5455             :       ! 17 cool grassland
        5456             :       ! 18 warm grassland
        5457             :       ! 19 tundra
        5458             :       ! 20 evergreen shrub
        5459             :       ! 21 deciduous shrub
        5460             :       ! 22 semi-desert
        5461             :       ! 23 cool irrigated crop
        5462             :       ! 24 cool non-irrigated crop
        5463             :       ! 25 warm irrigated crop
        5464             :       ! 26 warm non-irrigated crop
        5465             :       !
        5466             :       ! wetlands
        5467             :       ! --------
        5468             :       ! 27 forest (mangrove)
        5469             :       ! 28 non-forest
        5470             :       !
        5471             :       ! ----------------------------------------------------------------
        5472             :       ! description of the 14 plant types. see vegconi.F for
        5473             :       ! parameters that depend on vegetation type
        5474             :       ! ----------------------------------------------------------------
        5475             :       !
        5476             :       !  1 = needleleaf evergreen tree
        5477             :       !  2 = needleleaf deciduous tree
        5478             :       !  3 = broadleaf evergreen tree
        5479             :       !  4 = broadleaf deciduous tree
        5480             :       !  5 = tropical seasonal tree
        5481             :       !  6 = cool grass (c3)
        5482             :       !  7 = evergreen shrub
        5483             :       !  8 = deciduous shrub
        5484             :       !  9 = arctic deciduous shrub
        5485             :       ! 10 = arctic grass
        5486             :       ! 11 = crop
        5487             :       ! 12 = irrigated crop
        5488             :       ! 13 = warm grass (c4)
        5489             :       ! 14 = not vegetated
        5490             :       !=================================================================
        5491             :
        5492             :       ! TAI = monthly leaf area index + stem area index, one-sided
        5493             :       TAI(1,1:12) =  (/ 4.5d0, 4.7d0, 5.0d0, 5.1d0, 5.3d0, 5.5d0,
        5494           0 :      &                  5.3d0, 5.3d0, 5.2d0, 4.9d0, 4.6d0, 4.5d0 /)
        5495             :
        5496             :       TAI(2,1:12) =  (/ 0.3d0, 0.3d0, 0.3d0, 1.0d0, 1.6d0, 2.4d0,
        5497           0 :      &                  4.3d0, 2.9d0, 2.0d0, 1.3d0, 0.8d0, 0.5d0 /)
        5498             :
        5499             :       TAI(3,1:12) =  (/ 5.0d0, 5.0d0, 5.0d0, 5.0d0, 5.0d0, 5.0d0,
        5500           0 :      &                  5.0d0, 5.0d0, 5.0d0, 5.0d0, 5.0d0, 5.0d0 /)
        5501             :
        5502             :       TAI(4,1:12) =  (/ 0.4d0, 0.4d0, 0.7d0, 1.6d0, 3.5d0, 5.1d0,
        5503           0 :      &                  5.4d0, 4.8d0, 3.8d0, 1.7d0, 0.6d0, 0.4d0 /)
        5504             :
        5505             :       TAI(5,1:12) =  (/ 1.2d0, 1.0d0, 0.9d0, 0.8d0, 0.8d0, 1.0d0,
        5506           0 :      &                  2.0d0, 3.7d0, 3.2d0, 2.7d0, 1.9d0, 1.2d0 /)
        5507             :
        5508             :       TAI(6,1:12) =  (/ 0.7d0, 0.8d0, 0.9d0, 1.0d0, 1.5d0, 3.4d0,
        5509           0 :      &                  4.3d0, 3.8d0, 1.8d0, 1.0d0, 0.9d0, 0.8d0 /)
        5510             :
        5511             :       TAI(7,1:12) =  (/ 1.3d0, 1.3d0, 1.3d0, 1.3d0, 1.3d0, 1.3d0,
        5512           0 :      &                  1.3d0, 1.3d0, 1.3d0, 1.3d0, 1.3d0, 1.3d0 /)
        5513             :
        5514             :       TAI(8,1:12) =  (/ 1.0d0, 1.0d0, 0.8d0, 0.3d0, 0.6d0, 0.0d0,
        5515           0 :      &                  0.1d0, 0.3d0, 0.5d0, 0.6d0, 0.7d0, 0.9d0 /)
        5516             :
        5517             :       TAI(9,1:12) =  (/ 0.1d0, 0.1d0, 0.1d0, 0.1d0, 0.1d0, 0.3d0,
        5518           0 :      &                  1.5d0, 1.7d0, 1.4d0, 0.1d0, 0.1d0, 0.1d0 /)
        5519             :
        5520             :       TAI(10,1:12) = (/ 0.7d0, 0.8d0, 0.9d0, 1.0d0, 1.5d0, 3.4d0,
        5521           0 :      &                  4.3d0, 3.8d0, 1.8d0, 1.0d0, 0.9d0, 0.8d0 /)
        5522             :
        5523             :       TAI(11,1:12) = (/ 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.0d0, 2.0d0,
        5524           0 :      &                  3.0d0, 3.0d0, 1.5d0, 0.0d0, 0.0d0, 0.0d0 /)
        5525             :
        5526             :       TAI(12,1:12) = (/ 0.0d0, 0.0d0, 0.0d0, 0.0d0, 1.0d0, 2.0d0,
        5527           0 :      &                  3.0d0, 3.0d0, 1.5d0, 0.0d0, 0.0d0, 0.0d0 /)
        5528             :
        5529             :       TAI(13,1:12) = (/ 0.7d0, 0.8d0, 0.9d0, 1.0d0, 1.5d0, 3.4d0,
        5530           0 :      &                  4.3d0, 3.8d0, 1.8d0, 1.0d0, 0.9d0, 0.8d0 /)
        5531             :
        5532             :       TAI(14,1:12) = (/ 0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0,
        5533           0 :      &                  0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0, 0.0d0 /)
        5534             :
        5535             :       ! Return to calling program
        5536           0 :       END SUBROUTINE PLN_TYP_GET
        5537             :
        5538             : !******************************************************************************
        5539             : !------------------------------------------------------------------------------
        5540             : !                   Harmonized Emissions Component (HEMCO)                    !
        5541             : !------------------------------------------------------------------------------
        5542             : !BOP
        5543             : !
        5544             : ! !IROUTINE: InstGet
        5545             : !
        5546             : ! !DESCRIPTION: Subroutine InstGet returns a pointer to the desired instance.
        5547             : !\\
        5548             : !\\
        5549             : ! !INTERFACE:
        5550             : !
        5551           0 :       SUBROUTINE InstGet ( Instance, Inst, RC, PrevInst )
        5552             : !
        5553             : ! !INPUT PARAMETERS:
        5554             : !
        5555             :       INTEGER                             :: Instance
        5556             :       TYPE(MyInst),     POINTER           :: Inst
        5557             :       INTEGER                             :: RC
        5558             :       TYPE(MyInst),     POINTER, OPTIONAL :: PrevInst
        5559             : !
        5560             : ! !REVISION HISTORY:
        5561             : !  18 Feb 2016 - C. Keller   - Initial version
        5562             : !  See https://github.com/geoschem/hemco for complete history
        5563             : !EOP
        5564             : !------------------------------------------------------------------------------
        5565             : !BOC
        5566             :       TYPE(MyInst),     POINTER    :: PrvInst
        5567             :
        5568             :       !=================================================================
        5569             :       ! InstGet begins here!
        5570             :       !=================================================================
        5571             :
        5572             :       ! Get instance. Also archive previous instance.
        5573           0 :       PrvInst => NULL()
        5574           0 :       Inst    => AllInst
        5575           0 :       DO WHILE ( ASSOCIATED(Inst) )
        5576           0 :          IF ( Inst%Instance == Instance ) EXIT
        5577           0 :          PrvInst => Inst
        5578           0 :          Inst    => Inst%NextInst
        5579             :       END DO
        5580           0 :       IF ( .NOT. ASSOCIATED( Inst ) ) THEN
        5581           0 :          RC = HCO_FAIL
        5582           0 :          RETURN
        5583             :       ENDIF
        5584             :
        5585             :       ! Pass output arguments
        5586           0 :       IF ( PRESENT(PrevInst) ) PrevInst => PrvInst
        5587             :
        5588             :       ! Cleanup & Return
        5589           0 :       PrvInst => NULL()
        5590           0 :       RC = HCO_SUCCESS
        5591             :
        5592             :       END SUBROUTINE InstGet
        5593             : !EOC
        5594             : !------------------------------------------------------------------------------
        5595             : !                   Harmonized Emissions Component (HEMCO)                    !
        5596             : !------------------------------------------------------------------------------
        5597             : !BOP
        5598             : !
        5599             : ! !IROUTINE: InstCreate
        5600             : !
        5601             : ! !DESCRIPTION: Subroutine InstCreate creates a new instance.
        5602             : !\\
        5603             : !\\
        5604             : ! !INTERFACE:
        5605             : !
        5606           0 :       SUBROUTINE InstCreate ( ExtNr, Instance, Inst, RC )
        5607             : !
        5608             : ! !INPUT PARAMETERS:
        5609             : !
        5610             :       INTEGER,       INTENT(IN)       :: ExtNr
        5611             : !
        5612             : ! !OUTPUT PARAMETERS:
        5613             : !
        5614             :       INTEGER,       INTENT(  OUT)    :: Instance
        5615             :       TYPE(MyInst),  POINTER          :: Inst
        5616             : !
        5617             : ! !INPUT/OUTPUT PARAMETERS:
        5618             : !
        5619             :       INTEGER,       INTENT(INOUT)    :: RC
        5620             : !
        5621             : ! !REVISION HISTORY:
        5622             : !  18 Feb 2016 - C. Keller   - Initial version
        5623             : !  See https://github.com/geoschem/hemco for complete history
        5624             : !EOP
        5625             : !------------------------------------------------------------------------------
        5626             : !BOC
        5627             :       TYPE(MyInst), POINTER          :: TmpInst
        5628             :       INTEGER                        :: nnInst
        5629             :
        5630             :       !=================================================================
        5631             :       ! InstCreate begins here!
        5632             :       !=================================================================
        5633             :
        5634             :       ! ----------------------------------------------------------------
        5635             :       ! Generic instance initialization
        5636             :       ! ----------------------------------------------------------------
        5637             :
        5638             :       ! Initialize
        5639           0 :       Inst => NULL()
        5640             :
        5641             :       ! Get number of already existing instances
        5642           0 :       TmpInst => AllInst
        5643           0 :       nnInst = 0
        5644           0 :       DO WHILE ( ASSOCIATED(TmpInst) )
        5645           0 :          nnInst  =  nnInst + 1
        5646           0 :          TmpInst => TmpInst%NextInst
        5647             :       END DO
        5648             :
        5649             :       ! Create new instance
        5650           0 :       ALLOCATE(Inst)
        5651           0 :       Inst%Instance = nnInst + 1
        5652           0 :       Inst%ExtNr    = ExtNr
        5653             :
        5654             :       ! Attach to instance list
        5655           0 :       Inst%NextInst => AllInst
        5656           0 :       AllInst       => Inst
        5657             :
        5658             :       ! Update output instance
        5659           0 :       Instance = Inst%Instance
        5660             :
        5661             :       ! ----------------------------------------------------------------
        5662             :       ! Type specific initialization statements follow below
        5663             :       ! ----------------------------------------------------------------
        5664           0 :       Inst%ERD_FCT_GEO     => NULL()
        5665           0 :       Inst%SRCE_FUNC       => NULL()
        5666           0 :       Inst%LND_FRC_DRY     => NULL()
        5667           0 :       Inst%MSS_FRC_CACO3   => NULL()
        5668           0 :       Inst%MSS_FRC_SND     => NULL()
        5669           0 :       Inst%SFC_TYP         => NULL()
        5670           0 :       Inst%VAI_DST         => NULL()
        5671             :
        5672             :       ! Return w/ success
        5673           0 :       RC = HCO_SUCCESS
        5674             :
        5675           0 :       END SUBROUTINE InstCreate
        5676             : !EOC
        5677             : !------------------------------------------------------------------------------
        5678             : !                   Harmonized Emissions Component (HEMCO)                    !
        5679             : !------------------------------------------------------------------------------
        5680             : !BOP
        5681             : !
        5682             : ! !IROUTINE: InstRemove
        5683             : !
        5684             : ! !DESCRIPTION: Subroutine InstRemove creates a new instance.
        5685             : !\\
        5686             : !\\
        5687             : ! !INTERFACE:
        5688             : !
        5689           0 :       SUBROUTINE InstRemove ( Instance )
        5690             : !
        5691             : ! !INPUT PARAMETERS:
        5692             : !
        5693             :       INTEGER                         :: Instance
        5694             : !
        5695             : ! !REVISION HISTORY:
        5696             : !  18 Feb 2016 - C. Keller   - Initial version
        5697             : !  See https://github.com/geoschem/hemco for complete history
        5698             : !EOP
        5699             : !------------------------------------------------------------------------------
        5700             : !BOC
        5701             :       INTEGER                     :: RC
        5702             :       TYPE(MyInst), POINTER       :: PrevInst
        5703             :       TYPE(MyInst), POINTER       :: Inst
        5704             :
        5705             :       !=================================================================
        5706             :       ! InstRemove begins here!
        5707             :       !=================================================================
        5708             :
        5709             :       ! Get instance. Also archive previous instance.
        5710           0 :       PrevInst => NULL()
        5711           0 :       Inst     => NULL()
        5712           0 :       CALL InstGet ( Instance, Inst, RC, PrevInst=PrevInst )
        5713             :
        5714             :       ! Instance-specific deallocation
        5715           0 :       IF ( ASSOCIATED(Inst) ) THEN
        5716             :
        5717             :          !--------------------------------------------------------------
        5718             :          ! Deallocate fields of Inst before popping off from the list
        5719             :          ! in order to avoid memory leaks (Bob Yantosca (17 Aug 2022)
        5720             :          !--------------------------------------------------------------
        5721           0 :          IF ( ASSOCIATED( Inst%ERD_FCT_GEO ) ) THEN
        5722           0 :             DEALLOCATE(Inst%ERD_FCT_GEO  )
        5723             :          ENDIF
        5724           0 :          Inst%ERD_FCT_GEO => NULL()
        5725             :
        5726           0 :          IF ( ASSOCIATED( Inst%SRCE_FUNC ) ) THEN
        5727           0 :             DEALLOCATE(Inst%SRCE_FUNC )
        5728             :          ENDIF
        5729           0 :          Inst%SRCE_FUNC => NULL()
        5730             :
        5731           0 :          IF ( ASSOCIATED( Inst%LND_FRC_DRY ) ) THEN
        5732           0 :             DEALLOCATE(Inst%LND_FRC_DRY )
        5733             :          ENDIF
        5734           0 :          Inst%LND_FRC_DRY   => NULL()
        5735             :
        5736           0 :          IF ( ASSOCIATED( Inst%MSS_FRC_CACO3 ) ) THEN
        5737           0 :             DEALLOCATE(Inst%MSS_FRC_CACO3)
        5738             :          ENDIF
        5739           0 :          Inst%MSS_FRC_CACO3 => NULL()
        5740             :
        5741           0 :          IF ( ASSOCIATED( Inst%MSS_FRC_CLY ) ) THEN
        5742           0 :             DEALLOCATE(Inst%MSS_FRC_CLY)
        5743             :          ENDIF
        5744           0 :          Inst%MSS_FRC_CLY => NULL()
        5745             :
        5746           0 :          IF ( ASSOCIATED( Inst%MSS_FRC_SND ) ) THEN
        5747           0 :             DEALLOCATE(Inst%MSS_FRC_SND )
        5748             :          ENDIF
        5749           0 :          Inst%MSS_FRC_SND => NULL()
        5750             :
        5751           0 :          IF ( ASSOCIATED( Inst%SFC_TYP ) ) THEN
        5752           0 :             DEALLOCATE(Inst%SFC_TYP )
        5753             :          ENDIF
        5754           0 :          Inst%SFC_TYP => NULL()
        5755             :
        5756           0 :          IF ( ASSOCIATED( Inst%VAI_DST ) ) THEN
        5757           0 :             DEALLOCATE(Inst%VAI_DST )
        5758             :          ENDIF
        5759           0 :          Inst%VAI_DST => NULL()
        5760             :
        5761           0 :          IF ( ALLOCATED( Inst%PLN_TYP ) ) THEN
        5762           0 :             DEALLOCATE( Inst%PLN_TYP )
        5763             :          ENDIF
        5764             :
        5765           0 :          IF ( ALLOCATED( Inst%PLN_FRC ) ) THEN
        5766           0 :             DEALLOCATE( Inst%PLN_FRC )
        5767             :          ENDIF
        5768             :
        5769           0 :          IF ( ALLOCATED( Inst%TAI ) ) THEN
        5770           0 :             DEALLOCATE( Inst%TAI )
        5771             :          ENDIF
        5772             :
        5773           0 :          IF ( ALLOCATED( Inst%DMT_VWR ) ) THEN
        5774           0 :             DEALLOCATE( Inst%DMT_VWR )
        5775             :          ENDIF
        5776             :
        5777           0 :          IF ( ALLOCATED( Inst%OVR_SRC_SNK_FRC ) ) THEN
        5778           0 :             DEALLOCATE( Inst%OVR_SRC_SNK_FRC )
        5779             :          ENDIF
        5780             :
        5781           0 :          IF ( ALLOCATED( Inst%OVR_SRC_SNK_MSS ) ) THEN
        5782           0 :             DEALLOCATE( Inst%OVR_SRC_SNK_MSS )
        5783             :          ENDIF
        5784             :
        5785           0 :          IF ( ALLOCATED( Inst%DMT_MIN ) ) THEN
        5786           0 :             DEALLOCATE( Inst%DMT_MIN )
        5787             :          ENDIF
        5788             :
        5789           0 :          IF ( ALLOCATED( Inst%DMT_MAX ) ) THEN
        5790           0 :             DEALLOCATE( Inst%DMT_MAX )
        5791             :          ENDIF
        5792             :
        5793           0 :          IF ( ALLOCATED( Inst%DMT_VMA_SRC ) ) THEN
        5794           0 :             DEALLOCATE( Inst%DMT_VMA_SRC )
        5795             :          ENDIF
        5796             :
        5797           0 :          IF ( ALLOCATED( Inst%GSD_ANL_SRC ) ) THEN
        5798           0 :             DEALLOCATE( Inst%GSD_ANL_SRC )
        5799             :          ENDIF
        5800             :
        5801           0 :          IF ( ALLOCATED( Inst%MSS_FRC_SRC ) ) THEN
        5802           0 :             DEALLOCATE( Inst%MSS_FRC_SRC )
        5803             :          ENDIF
        5804             :
        5805           0 :          IF ( ALLOCATED( Inst%HcoIDs ) ) THEN
        5806           0 :             DEALLOCATE( Inst%HcoIDs )
        5807             :          ENDIF
        5808             :
        5809           0 :          IF ( ALLOCATED( Inst%HcoIDsALK ) ) THEN
        5810           0 :             DEALLOCATE( Inst%HcoIDsALK )
        5811             :          ENDIF
        5812             :
        5813             :          !--------------------------------------------------------------
        5814             :          ! Pop off instance from list
        5815             :          !--------------------------------------------------------------
        5816           0 :          IF ( ASSOCIATED(PrevInst) ) THEN
        5817           0 :             PrevInst%NextInst => Inst%NextInst
        5818             :          ELSE
        5819           0 :             AllInst => Inst%NextInst
        5820             :          ENDIF
        5821           0 :          DEALLOCATE(Inst)
        5822             :
        5823             :       ENDIF
        5824             :
        5825             :       ! Free pointers before exiting
        5826           0 :       PrevInst => NULL()
        5827           0 :       Inst     => NULL()
        5828             :
        5829           0 :       END SUBROUTINE InstRemove
        5830             : !EOC
        5831             : #if defined ( MODEL_GEOS )
        5832             : !------------------------------------------------------------------------------
        5833             :       SUBROUTINE ReadTuningFactor(HcoState, TuningTable, FCT, RC )
        5834             : !
        5835             :       USE HCO_CharTools_Mod
        5836             :       USE HCO_inquireMod,   ONLY : findFreeLUN
        5837             :
        5838             :       ! Arguments
        5839             :       TYPE(HCO_State),  POINTER        :: HcoState    ! Hemco state
        5840             :       CHARACTER(LEN=*), INTENT(IN)     :: TuningTable
        5841             :       REAL*8          , INTENT(INOUT)  :: FCT
        5842             :       INTEGER         , INTENT(INOUT)  :: RC
        5843             :
        5844             :       ! Return value
        5845             :
        5846             :       ! Local variables
        5847             :       REAL(hp)           :: AM2, RES
        5848             :       INTEGER            :: IU, IDX
        5849             :       CHARACTER(LEN=7)   :: CSLABEL, FNDLABEL
        5850             :       CHARACTER(LEN=255) :: MSG, LINE, ICSL
        5851             :       LOGICAL            :: EX, EOF
        5852             :
        5853             :       CHARACTER(LEN=255), PARAMETER :: LOC =
        5854             :      &                           'ReadTuningFactor (hcox_dustdead_mod)'
        5855             :
        5856             :       !================================================================
        5857             :       ! ReadTuningFactor begins here!
        5858             :       !================================================================
        5859             :
        5860             :       ! Enter
        5861             :       CALL HCO_ENTER ( HcoState%Config%Err, LOC, RC )
        5862             :
        5863             :       ! Init
        5864             :       FCT = -999.0
        5865             :
        5866             :       ! Determine resolution based on grid cell area
        5867             :       CSLABEL  = 'UNKNOWN'
        5868             :       FNDLABEL = TRIM(CSLABEL)
        5869             :       IF ( .NOT. HcoState%Grid%AREA_M2%Alloc ) THEN
        5870             :          MSG = 'Warning: AREA_M2 not found, will use default number'
        5871             :          CALL HCO_WARNING( MSG, RC, .TRUE., LOC )
        5872             :       ELSE
        5873             :          AM2 = SUM(HcoState%Grid%AREA_M2%Val)/(HcoState%NX*HcoState%NY)
        5874             :          RES = SQRT(AM2)
        5875             :          IF ( RES > 280.0_hp ) THEN
        5876             :             CSLABEL = 'C24'
        5877             :          ELSEIF ( RES > 140.0_hp .AND. RES <=  280.0_hp ) THEN
        5878             :             CSLABEL = 'C48'
        5879             :          ELSEIF ( RES > 70.0_hp .AND. RES <=  140.0_hp ) THEN
        5880             :             CSLABEL = 'C90'
        5881             :          ELSEIF ( RES > 35.0_hp .AND. RES <=  70.0_hp ) THEN
        5882             :             CSLABEL = 'C180'
        5883             :          ELSEIF ( RES > 17.5_hp .AND. RES <=  35.0_hp ) THEN
        5884             :             CSLABEL = 'C360'
        5885             :          ELSEIF ( RES > 8.75_hp .AND. RES <=  17.5_hp ) THEN
        5886             :             CSLABEL = 'C720'
        5887             :          ELSEIF ( RES > 4.375_hp .AND. RES <= 8.75_hp ) THEN
        5888             :             CSLABEL = 'C1440'
        5889             :          ELSEIF ( RES <= 4.375_hp ) THEN
        5890             :             CSLABEL = 'C2880'
        5891             :          ENDIF
        5892             :       ENDIF
        5893             :
        5894             :       ! Open file
        5895             :       INQUIRE( FILE=TRIM(TuningTable), EXIST=EX )
        5896             :       IF ( .NOT. EX ) THEN
        5897             :           MSG = 'FILE NOT FOUND: '//TRIM(TuningTable)
        5898             :           CALL HCO_ERROR( MSG, RC, THISLOC=LOC )
        5899             :          RETURN
        5900             :       ENDIF
        5901             :       IU = findFreeLUN()
        5902             :       OPEN( IU, FILE=TRIM(TuningTable) )
        5903             :
        5904             :       ! Search for resolution entry in file, assuming they are listed as follows:
        5905             :       ! C360: 1.0
        5906             :       ! C48: 2.0e2
        5907             :       ! C90: 1.0e-4
        5908             :       DO
        5909             :          CALL HCO_ReadLine ( IU, LINE, EOF, RC )
        5910             :          IF ( EOF ) EXIT
        5911             :          IDX = INDEX( LINE, ':' )
        5912             :          IF ( IDX > 0 ) ICSL = ADJUSTL(LINE(1:(IDX-1)))
        5913             :          ! If cube-sphere label matches current resolution, read factor
        5914             :          IF ( TRIM(ICSL)==TRIM(CSLABEL) ) THEN
        5915             :             READ(LINE(IDX+1:LEN(LINE)),*) FCT
        5916             :             FNDLABEL = TRIM(ICSL)
        5917             :             EXIT
        5918             :          ENDIF
        5919             :       ENDDO
        5920             :
        5921             :       ! All done
        5922             :       CLOSE ( IU )
        5923             :
        5924             :       ! Verbose
        5925             :       IF ( HcoState%amIRoot ) THEN
        5926             :          MSG = 'Read dust tuning factor from '//TRIM(TuningTable)
        5927             :          CALL HCO_MSG(HcoState%Config%Err,MSG, SEP1='-' )
        5928             :          MSG = 'Model resolution: '//TRIM(CSLABEL)
        5929             :          CALL HCO_MSG(HcoState%Config%Err,MSG, SEP1='-' )
        5930             :          MSG = 'Resolution label in file: '//TRIM(FNDLABEL)
        5931             :          CALL HCO_MSG(HcoState%Config%Err,MSG, SEP1='-' )
        5932             :          WRITE(MSG,*) 'Scale factor: ',FCT
        5933             :          CALL HCO_MSG(HcoState%Config%Err,MSG, SEP1='-' )
        5934             :       ENDIF
        5935             :
        5936             :       ! Leave
        5937             :       CALL HCO_LEAVE( HcoState%Config%Err, RC )
        5938             :
        5939             :       END SUBROUTINE ReadTuningFactor
        5940             : #endif
        5941           0 :       END MODULE HCOX_DUSTDEAD_MOD
        5942             : !EOM

Generated by: LCOV version 1.14