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

              Line data    Source code
           1             : !------------------------------------------------------------------------------
           2             : !                   Harmonized Emissions Component (HEMCO)                    !
           3             : !------------------------------------------------------------------------------
           4             : !BOP
           5             : !
           6             : ! !MODULE: hcox_seaflux_mod.F90
           7             : !
           8             : ! !DESCRIPTION: Module HCOX\_SeaFlux\_Mod contains routines to calculate
           9             : ! the oceanic emissions of a number of defined species.
          10             : ! The oceanic flux is parameterized according to Liss and Slater, 1974:
          11             : ! F = Kg * ( Cair - H Cwater )
          12             : ! where F is the net flux, Kg is the exchange velocity, Cair and Cwater
          13             : ! are the air and aqueous concentrations, respectively, and H is the
          14             : ! dimensionless air over water Henry constant.
          15             : !\\
          16             : !\\
          17             : ! This module calculates the source and sink terms separately. The source
          18             : ! is given as flux, the sink as deposition rate:
          19             : ! source = Kg * H * Cwater     [kg m-2 s-1]
          20             : ! sink   = Kg / DEPHEIGHT      [s-1]
          21             : !
          22             : ! The deposition rate is obtained by dividing the exchange velocity Kg
          23             : ! by the deposition height DEPHEIGHT, e.g. the height over which
          24             : ! deposition occurs. This can be either the first grid box only, or the
          25             : ! entire planetary boundary layer. The HEMCO option 'PBL\_DRYDEP' determines
          26             : ! which option is being used.
          27             : !\\
          28             : !\\
          29             : ! Kg is calculated following Johnson, 2010, which is largely based on
          30             : ! the work of Nightingale et al., 2000a/b.
          31             : ! The salinity and seawater pH are currently set to constant global values
          32             : ! of 35 ppt and 8.0, respectively.
          33             : ! Since Kg is only little sensitive to these variables, this should not
          34             : ! introduce a notable error.
          35             : !\\
          36             : !\\
          37             : ! This is a HEMCO extension module that uses many of the HEMCO core
          38             : ! utilities.
          39             : !\\
          40             : !\\
          41             : ! Air-sea exchange is calculated for all species defined during
          42             : ! extension initialization. For each species, the following parameter
          43             : ! must be specified: species name, model species ID (i.e. ID of this
          44             : ! species in the external model), parameterization type of Schmidt
          45             : ! number in water, liquid molar volume of species, and the name of the
          46             : ! field containing species sea-water concentrations. See initialization
          47             : ! routine for more details.
          48             : ! To add new species to this module, the abovementioned arrays have to
          49             : ! be extended accordingly.
          50             : !\\
          51             : !\\
          52             : ! References:
          53             : ! \begin{itemize}
          54             : ! \item Johnson, M.: A numerical scheme to calculate temperature and salinity
          55             : !    dependent air-water transfer velocities for any gas, Ocean Science, 6,
          56             : !    2010.
          57             : ! \item Liss and Slater: Flux of gases across the air-sea interface, Nature,
          58             : !    247, 1974.
          59             : ! \item Nightingale et al.: In situ evaluation of air-sea gas exchange
          60             : !    parameterizations using novel conservative and volatile tracers,
          61             : !    Global Biogeochemical Cycles, 14, 2000a.
          62             : ! \item Nightingale et al.: Measurements of air-sea gas transfer during an
          63             : !    open ocean algal bloom, Geophys. Res. Lett., 27, 2000b.
          64             : ! \item Saltzman et al.: Experimental determination of the diffusion
          65             : !    coefficient of dimethylsulfide in water, J. Geophys. Res., 98, 1993.
          66             : ! \end{itemize}
          67             : !
          68             : ! !INTERFACE:
          69             : !
          70             : MODULE HCOX_SeaFlux_Mod
          71             : !
          72             : ! !USES:
          73             : !
          74             :   USE HCO_Error_MOD
          75             :   USE HCO_Diagn_MOD
          76             :   USE HCO_State_MOD,  ONLY : HCO_State
          77             :   USE HCOX_State_MOD, ONLY : Ext_State
          78             :
          79             :   IMPLICIT NONE
          80             :   PRIVATE
          81             : !
          82             : ! !PUBLIC MEMBER FUNCTIONS:
          83             : !
          84             :   PUBLIC  :: HCOX_SeaFlux_Init
          85             :   PUBLIC  :: HCOX_SeaFlux_Run
          86             :   PUBLIC  :: HCOX_SeaFlux_Final
          87             : !
          88             : ! !PRIVATE MEMBER FUNCTIONS:
          89             : !
          90             :   PRIVATE :: Calc_SeaFlux
          91             : !
          92             : ! !REVISION HISTORY:
          93             : !  16 Apr 2013 - C. Keller   - Initial version
          94             : !  See https://github.com/geoschem/hemco for complete history
          95             : !EOP
          96             : !------------------------------------------------------------------------------
          97             : !
          98             : ! !PRIVATE TYPES:
          99             : !
         100             :   ! Ocean species
         101             :   TYPE :: OcSpec
         102             :      INTEGER            :: HcoID        ! HEMCO species ID
         103             :      CHARACTER(LEN=31)  :: OcSpcName    ! oc. species name
         104             :      CHARACTER(LEN=31)  :: OcDataName   ! seawater conc. field name
         105             :      REAL*8             :: LiqVol       ! liq. molecular volume
         106             :      INTEGER            :: SCWPAR       ! Schmidt # parameterization type
         107             :   END TYPE OcSpec
         108             :
         109             :   TYPE :: MyInst
         110             :    ! Tracer IDs
         111             :    INTEGER                :: Instance
         112             :    ! Variables carrying information about ocean species
         113             :    INTEGER                :: ExtNr
         114             :    INTEGER                :: nOcSpc            ! # of ocean species
         115             :    TYPE(OcSpec), POINTER  :: OcSpecs(:)
         116             :    TYPE(MyInst), POINTER  :: NextInst => NULL()
         117             :   END TYPE MyInst
         118             :
         119             :   ! Pointer to instances
         120             :   TYPE(MyInst), POINTER   :: AllInst => NULL()
         121             :
         122             : CONTAINS
         123             : !EOC
         124             : !------------------------------------------------------------------------------
         125             : !                   Harmonized Emissions Component (HEMCO)                    !
         126             : !------------------------------------------------------------------------------
         127             : !BOP
         128             : !
         129             : ! !IROUTINE: HCOX_SeaFlux_Run
         130             : !
         131             : ! !DESCRIPTION: Subroutine HcoX\_SeaFlux\_Run is the run routine to
         132             : ! calculate oceanic emissions for the current time step.
         133             : !\\
         134             : !\\
         135             : ! !INTERFACE:
         136             : !
         137           0 :   SUBROUTINE HCOX_SeaFlux_Run( ExtState, HcoState, RC )
         138             : !
         139             : ! !USES:
         140             : !
         141             :     USE HCO_FLUXARR_MOD,  ONLY : HCO_EmisAdd
         142             :     USE HCO_FLUXARR_MOD,  ONLY : HCO_DepvAdd
         143             :     USE HCO_CALC_MOD,     ONLY : HCO_EvalFld
         144             : !    USE HCO_EMISLIST_MOD, ONLY : HCO_GetPtr
         145             : !
         146             : ! !INPUT PARAMETERS:
         147             : !
         148             :     TYPE(HCO_State), POINTER       :: HcoState   ! Output obj
         149             :     TYPE(Ext_State), POINTER       :: ExtState  ! Module options
         150             : !
         151             : ! !INPUT/OUTPUT PARAMETERS:
         152             : !
         153             :     INTEGER,         INTENT(INOUT) :: RC         ! Success or failure?
         154             : !
         155             : ! !REVISION HISTORY:
         156             : !  16 Apr 2013 - C. Keller - Initial version
         157             : !  See https://github.com/geoschem/hemco for complete history
         158             : !EOP
         159             : !------------------------------------------------------------------------------
         160             : !BOC
         161             : !
         162             : ! !LOCAL VARIABLES:
         163             : !
         164             :     ! Scalars
         165             :     TYPE(MyInst), POINTER :: Inst
         166             :     INTEGER               :: OcID, HcoID
         167           0 :     REAL(hp), TARGET      :: SOURCE(HcoState%NX,HcoState%NY)
         168           0 :     REAL(hp), TARGET      :: SINK  (HcoState%NX,HcoState%NY)
         169           0 :     REAL(hp), TARGET      :: SeaConc(HcoState%NX,HcoState%NY)
         170             :     CHARACTER(LEN=255)    :: ContName
         171             :     CHARACTER(LEN=255)    :: MSG, LOC
         172             :     LOGICAL               :: VERBOSE
         173             :
         174             :     ! Pointers
         175           0 :     REAL(hp), POINTER     :: Arr2D(:,:)
         176             :
         177             :     !=================================================================
         178             :     ! HCOX_SeaFlux_Run begins here!
         179             :     !=================================================================
         180           0 :     LOC = 'HCOX_SeaFlux_Run (HCOX_SEAFLUX_MOD.F90)'
         181             :
         182             :     ! Enter
         183           0 :     CALL HCO_ENTER( HcoState%Config%Err, LOC, RC )
         184           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         185           0 :         CALL HCO_ERROR( 'ERROR 0', RC, THISLOC=LOC )
         186           0 :         RETURN
         187             :     ENDIF
         188             :
         189             :     ! Return if extension disabled
         190           0 :     IF ( ExtState%SeaFlux <= 0 ) RETURN
         191             :
         192             :     ! Verbose?
         193           0 :     verbose = HCO_IsVerb( HcoState%Config%Err )
         194             :
         195             :     ! Nullify
         196           0 :     Arr2D => NULL()
         197             :
         198             :     ! Get instance
         199           0 :     Inst => NULL()
         200           0 :     CALL InstGet ( ExtState%SeaFlux, Inst, RC )
         201           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         202           0 :        WRITE(MSG,*) 'Cannot find SeaFlux instance Nr. ', ExtState%SeaFlux
         203           0 :        CALL HCO_ERROR(MSG,RC)
         204           0 :        RETURN
         205             :     ENDIF
         206             :
         207             :     ! ---------------------------------------------------------------
         208             :     ! Calculate emissions
         209             :     ! ---------------------------------------------------------------
         210             :
         211             :     ! Loop over all model species
         212           0 :     DO OcID = 1, Inst%nOcSpc
         213             :
         214             :        ! Get HEMCO species ID
         215           0 :        HcoID = Inst%OcSpecs(OcID)%HcoID
         216             :
         217             :        ! Skip this species if it has no corresponding HEMCO and/or
         218             :        ! model species
         219           0 :        IF ( HcoID                     < 0 ) CYCLE
         220           0 :        IF ( HcoState%Spc(HcoID)%ModID < 0 ) CYCLE
         221             :
         222           0 :        IF ( verbose ) THEN
         223             :           WRITE(MSG,'(A40,I5)') &
         224           0 :                'Calculate air-sea flux for HEMCO species', HcoID
         225           0 :           CALL HCO_MSG(HcoState%Config%Err,MSG)
         226           0 :           WRITE(MSG,*) 'Module species name: ', &
         227           0 :                         TRIM(Inst%OcSpecs(OcID)%OcSpcName)
         228           0 :           CALL HCO_MSG(HcoState%Config%Err,MSG)
         229             :        ENDIF
         230             :
         231             :        ! Get seawater concentration of given compound (from HEMCO core).
         232           0 :        ContName = TRIM(Inst%OcSpecs(OcID)%OcDataName)
         233           0 :        CALL HCO_EvalFld ( HcoState, ContName, SeaConc, RC )
         234           0 :        IF ( RC /= HCO_SUCCESS ) THEN
         235           0 :            CALL HCO_ERROR( 'ERROR 1', RC, THISLOC=LOC )
         236           0 :            RETURN
         237             :        ENDIF
         238             :
         239             :        ! Calculate oceanic source (kg/m2/s) as well as the deposition
         240             :        ! velocity (1/s).
         241             :        CALL Calc_SeaFlux ( HcoState, ExtState, Inst,    &
         242             :                            SOURCE,   SINK,     SeaConc, &
         243           0 :                            OcID,     HcoID,    RC       )
         244           0 :        IF ( RC /= HCO_SUCCESS ) THEN
         245           0 :            CALL HCO_ERROR( 'ERROR 2', RC, THISLOC=LOC )
         246           0 :            RETURN
         247             :        ENDIF
         248             :
         249             :        ! Set flux in HEMCO object [kg/m2/s]
         250           0 :        CALL HCO_EmisAdd ( HcoState, SOURCE, HcoID, RC, ExtNr=Inst%ExtNr )
         251           0 :        IF ( RC /= HCO_SUCCESS ) THEN
         252           0 :           MSG = 'HCO_EmisAdd error: ' // TRIM(Inst%OcSpecs(OcID)%OcSpcName)
         253           0 :           CALL HCO_ERROR(MSG, RC )
         254           0 :           RETURN
         255             :        ENDIF
         256             :        IF ( RC /= HCO_SUCCESS ) THEN
         257             :            CALL HCO_ERROR( 'ERROR 3', RC, THISLOC=LOC )
         258             :            RETURN
         259             :        ENDIF
         260             :
         261             :        ! Set deposition velocity in HEMCO object [1/s]
         262           0 :        CALL HCO_DepvAdd ( HcoState, SINK, HcoID, RC )
         263           0 :        IF ( RC /= HCO_SUCCESS ) THEN
         264           0 :            CALL HCO_ERROR( 'ERROR 4', RC, THISLOC=LOC )
         265           0 :            RETURN
         266             :        ENDIF
         267             :
         268             :        ! Free pointers
         269             :        !SeaConc => NULL()
         270             :
         271             :        ! Eventually add to dry deposition diagnostics
         272           0 :        ContName = 'DRYDEP_VEL_' // TRIM(HcoState%Spc(HcoID)%SpcName)
         273           0 :        Arr2D    => SINK
         274             :        CALL Diagn_Update( HcoState,                 &
         275             :                           cName   = TRIM(ContName), &
         276             :                           Array2D = Arr2D,          &
         277             :                           COL     = -1,             &
         278           0 :                           RC      = RC              )
         279           0 :        Arr2D => NULL()
         280             :     ENDDO !SpcID
         281             :
         282             :     ! Cleanup
         283           0 :     Inst => NULL()
         284             :
         285             :     ! Leave w/ success
         286           0 :     CALL HCO_LEAVE( HcoState%Config%Err,RC )
         287             :
         288           0 :   END SUBROUTINE HCOX_SeaFlux_Run
         289             : !EOC
         290             : !------------------------------------------------------------------------------
         291             : !                   Harmonized Emissions Component (HEMCO)                    !
         292             : !------------------------------------------------------------------------------
         293             : !BOP
         294             : !
         295             : ! !IROUTINE: Calc_SeaFlux
         296             : !
         297             : ! !DESCRIPTION: Subroutine CALC\_SEAFLUX calculates oceanic emissions
         298             : ! of the specified tracer using the parameterization described in
         299             : ! Johnson, 2010.
         300             : !\\
         301             : !\\
         302             : ! The net emission flux is given by F = - Kg ( Cg - Caq*H ). Here, we
         303             : ! calculate the source term ( Kg * H * Caq ) in units of kg/m2/s as
         304             : ! well as the deposition velocity Kg in m/s.
         305             : !\\
         306             : !\\
         307             : ! !INTERFACE:
         308             : !
         309           0 :   SUBROUTINE Calc_SeaFlux( HcoState, ExtState,           &
         310           0 :                            Inst,     SOURCE,   SINK,     &
         311           0 :                            SeaConc,  OcID,     HcoID, RC )
         312             : !
         313             : ! !USES:
         314             : !
         315             :     USE ieee_arithmetic,    ONLY : ieee_is_finite
         316             :     USE Ocean_ToolBox_Mod,  ONLY : CALC_KG
         317             :     USE Hco_Henry_Mod,      ONLY : CALC_KH, CALC_HEFF
         318             :     USE HCO_CALC_MOD,       ONLY : HCO_CheckDepv
         319             :     USE HCO_GeoTools_Mod,   ONLY : HCO_LANDTYPE
         320             : !
         321             : ! !INPUT PARAMETERS:
         322             : !
         323             :     INTEGER,         INTENT(IN   ) :: OcID                ! ocean species ID
         324             :     INTEGER,         INTENT(IN   ) :: HcoID               ! HEMCO species ID
         325             :     TYPE(HCO_State), POINTER       :: HcoState            ! Output obj
         326             :     TYPE(Ext_State), POINTER       :: ExtState
         327             :     TYPE(MyInst),    POINTER       :: Inst
         328             : !
         329             : ! !OUTPUT PARAMETERS:
         330             : !
         331             :     REAL(hp),        INTENT(  OUT) :: SOURCE(HcoState%NX,HcoState%NY )
         332             :     REAL(hp),        INTENT(  OUT) :: SINK  (HcoState%NX,HcoState%NY )
         333             : !
         334             : ! !INPUT/OUTPUT PARAMETERS:
         335             : !
         336             :     REAL(hp),        INTENT(INOUT) :: SeaConc(HcoState%NX,HcoState%NY )
         337             :     INTEGER,         INTENT(INOUT) :: RC                 ! Error stat
         338             :
         339             : !
         340             : ! !REMARKS:
         341             : !  For now, the salinity and pH of seawater are prescribed to 35ppt and 8.0,
         342             : !  respectively.  The oceanic flux is not expected to be sensitive to these
         343             : !  parameters (which have only little variations anyway), but we may use
         344             : !  climatologies for these parameter at some point nevertheless!
         345             : !
         346             : ! !REVISION HISTORY:
         347             : !  16 Apr 2013 - C. Keller   - Initial version
         348             : !  See https://github.com/geoschem/hemco for complete history
         349             : !EOP
         350             : !------------------------------------------------------------------------------
         351             : !BOC
         352             : !
         353             : ! !LOCAL VARIABLES:
         354             : !
         355             :     INTEGER             :: I, J, L, N
         356             :     REAL*8              :: IJSRC
         357             :     INTEGER             :: SCW
         358             :     REAL*8              :: P, V, VB, MW, KG
         359             :     REAL*8              :: K0, CR, PKA
         360             :     REAL*8              :: KH, HEFF
         361             :     REAL*8              :: TK, TC
         362             :     REAL(hp)            :: DEP_HEIGHT
         363             :     INTEGER             :: OLDWARN
         364             :     INTEGER             :: PBL_MAX
         365             :     INTEGER, SAVE       :: WARN = 0
         366             :
         367             :     ! For now, hardcode salinity
         368             :     REAL(dp), PARAMETER :: S = 35.0_dp
         369             :
         370             :     ! Set seawater PH to constant value of 8
         371             :     REAL(dp), PARAMETER :: PH = 8.0_dp
         372             :
         373             :     ! Maximum allowed temperature (to avoid neg. Schmidt number)
         374             :     ! Set to 45 C (= 318.15 K)
         375             :     REAL(dp), PARAMETER :: TMAX = 318.15_dp
         376             :
         377             :     ! Error handling
         378             :     CHARACTER(LEN=255)  :: MSG, LOC
         379             :
         380             :     !=================================================================
         381             :     ! CALC_SEAFLUX begins here!
         382             :     !=================================================================
         383           0 :     LOC = 'CALC_SEAFLUX (HCOX_SEAFLUX_MOD.F90)'
         384             :
         385             :     ! Enter
         386           0 :     CALL HCO_ENTER( HcoState%Config%Err, LOC, RC )
         387           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         388           0 :         CALL HCO_ERROR( 'ERROR 5', RC, THISLOC=LOC )
         389           0 :         RETURN
         390             :     ENDIF
         391             :
         392             :     ! Init
         393           0 :     SOURCE  = 0.0_hp
         394           0 :     SINK    = 0.0_hp
         395             :
         396             :     ! Extract Henry coefficients
         397           0 :     K0      = HcoState%Spc(HcoID)%HenryK0
         398           0 :     CR      = HcoState%Spc(HcoID)%HenryCR
         399           0 :     PKA     = HcoState%Spc(HcoID)%HenryPKA
         400             :
         401             :     ! molecular weight [g/mol]
         402             :     ! Use real species molecular weight and not the emitted
         403             :     ! molecular weight. The molecular weight is only needed to
         404             :     ! calculate the air-side Schmidt number, which should be
         405             :     ! using the actual species MW.
         406           0 :     MW      = HcoState%Spc(HcoID)%MW_g
         407             :
         408             :     ! Liquid molar volume at boiling point [cm3/mol]
         409           0 :     VB      = Inst%OcSpecs(OcID)%LiqVol
         410             :
         411             :     ! Get parameterization type for Schmidt number in water
         412           0 :     SCW     = Inst%OcSpecs(OcID)%SCWPAR
         413             :
         414             :     ! Model surface layer
         415           0 :     L       = 1
         416             :
         417             :     ! Write out original warning status
         418           0 :     OLDWARN = WARN
         419             :
         420             :     ! Loop over all grid boxes. Only emit into lowest layer
         421             :
         422             : !$OMP PARALLEL DO                                     &
         423             : !$OMP DEFAULT( SHARED )                               &
         424             : !$OMP PRIVATE( I,  J,     N,        TK,        TC   ) &
         425             : !$OMP PRIVATE( P,  V,     KH,       RC,        HEFF ) &
         426             : !$OMP PRIVATE( KG, IJSRC, PBL_MAX,  DEP_HEIGHT      ) &
         427             : !$OMP SCHEDULE( DYNAMIC )
         428             :
         429           0 :     DO J = 1, HcoState%NY
         430           0 :     DO I = 1, HcoState%NX
         431             :
         432             :        ! Make sure we have no negative seawater concentrations
         433           0 :        IF ( SeaConc(I,J) < 0.0_hp ) SeaConc(I,J) = 0.0_hp
         434             :
         435             :        ! Do only over the ocean:
         436           0 :        IF ( HCO_LANDTYPE( ExtState%FRLAND%Arr%Val(I,J),   &
         437           0 :                           ExtState%FRLANDIC%Arr%Val(I,J), &
         438           0 :                           ExtState%FROCEAN%Arr%Val(I,J),  &
         439           0 :                           ExtState%FRSEAICE%Arr%Val(I,J), &
         440           0 :                           ExtState%FRLAKE%Arr%Val(I,J)) == 0 ) THEN
         441             :
         442             :           !-----------------------------------------------------------
         443             :           ! Get grid box and species specific quantities
         444             :           !-----------------------------------------------------------
         445             :
         446             :           ! skin surface temp in K
         447           0 :           TK = ExtState%TSKIN%Arr%Val(I,J)
         448             :
         449             :           ! Error check: the Schmidt number may become negative for
         450             :           ! very high temperatures - hence cap temperature at specified
         451             :           ! limit
         452           0 :           IF ( TK > TMAX ) THEN
         453           0 :              WARN = 1
         454           0 :              TK   = TMAX
         455             :           ENDIF
         456             :
         457             :           ! Temperature in C
         458           0 :           TC = TK - 273.15d0
         459             :
         460             :           ! Assume no air-sea exchange for temperatures below -10 deg C.
         461             :           ! This is rather arbitrary, but seawater should be frozen at
         462             :           ! that temperature anyways. Also, this ensures that the cal-
         463             :           ! culation of KG doesn't produce an overflow error, which occurs
         464             :           ! at temperatures of -10.7 to -10.9 deg C.
         465           0 :           IF ( TC < -10.0d0 ) CYCLE
         466             :
         467             :           ! surface pressure [Pa]
         468           0 :           P = HcoState%Grid%PEDGE%Val(I,J,L)
         469             :
         470             :           ! 10-m wind speed [m/s]
         471           0 :           V = ExtState%U10M%Arr%Val(I,J)**2 + &
         472           0 :               ExtState%V10M%Arr%Val(I,J)**2
         473           0 :           V = SQRT(V)
         474             :
         475             :           ! Henry gas over liquid dimensionless constant and
         476             :           ! effective Henry constant [both unitless].
         477           0 :           CALL CALC_KH ( K0, CR, TK, KH, RC )  ! liquid over gas
         478             :           ! Exit here if error. Use error flags from henry_mod.F!
         479           0 :           IF ( RC /= 0 ) THEN
         480           0 :              RC  = HCO_FAIL
         481           0 :              WRITE(MSG,*) 'Cannot calculate KH: ', K0, CR, TK
         482           0 :              EXIT
         483             :           ENDIF
         484           0 :           CALL CALC_HEFF ( PKA, PH, KH, HEFF, RC )  ! liquid over gas
         485             :           ! Exit here if error. Use error flags from henry_mod.F!
         486           0 :           IF ( RC /= 0 ) THEN
         487           0 :              RC  = HCO_FAIL
         488           0 :              WRITE(MSG,*) 'Cannot calculate HEFF: ', PKA, PH, KH
         489           0 :              EXIT
         490             :           ENDIF
         491             :
         492             :           ! Gas over liquid
         493           0 :           KH   = 1d0 / KH
         494           0 :           HEFF = 1d0 / HEFF
         495             :
         496             :           !-----------------------------------------------------------
         497             :           ! Calculate exchange velocity KG in [m s-1]
         498             :           !-----------------------------------------------------------
         499             :
         500             :           ! Get exchange velocity KG (m/s) following Johnson, 2010.
         501             :           ! Kg is defined as 1 / (1/k_air + H/k_water). Note that Kg
         502             :           ! is denoted Ka in Johnson, 2010!
         503             :           ! Use effective Henry constant here to account for
         504             :           ! hydrolysis!
         505           0 :           CALL CALC_KG( TC, P, V, S, HEFF, VB, MW, SCW, KG, RC )
         506           0 :           IF ( RC /= 0 ) THEN
         507           0 :              RC = HCO_FAIL
         508           0 :              WRITE(MSG,*) 'Cannot calculate KG: ', TC, P, V, S, HEFF
         509           0 :              EXIT
         510             :           ENDIF
         511             :
         512             :           !-----------------------------------------------------------
         513             :           ! Calculate flux from the ocean (kg m-2 s-1):
         514             :           !-----------------------------------------------------------
         515             :
         516             :           ! Fwa = KG * Cwater * H (Liss and Slater, 1974)
         517             :           ! Oceanic concentration is im [kg m-3], H is
         518             :           ! dimensionless, and KG is [m s-1], so IJSRC is
         519             :           ! [kg m-2 s-1].
         520             :           ! OcArr already accounts for pH effects, so apply the
         521             :           ! 'regular' Henry constant H here.
         522           0 :           IJSRC = KG * KH * SeaConc(I,J)
         523             :
         524             :           ! Pass to flux array
         525           0 :           SOURCE(I,J) = IJSRC
         526             :
         527             :           !-----------------------------------------------------------
         528             :           ! Calculate deposition rate to the ocean (s-1):
         529             :           !-----------------------------------------------------------
         530             :
         531             :           ! Determine deposition height based on HEMCO option regarding
         532             :           ! the deposition length scale.
         533           0 :           IF ( HcoState%Options%PBL_DRYDEP ) THEN
         534           0 :              DO N = HcoState%NZ, 1, -1
         535           0 :                 IF ( ExtState%FRAC_OF_PBL%Arr%Val(I,J,N) > 0.0_hp ) THEN
         536             :                    PBL_MAX = N
         537             :                    EXIT
         538             :                 ENDIF
         539             :              ENDDO
         540             :           ELSE
         541             :              PBL_MAX = 1
         542             :           ENDIF
         543           0 :           DEP_HEIGHT = SUM(HcoState%Grid%BXHEIGHT_M%Val(I,J,1:PBL_MAX))
         544             :
         545             :           ! Now calculate deposition rate from velocity and deposition
         546             :           ! height: [s-1] = [m s-1] / [m].
         547           0 :           SINK(I,J) = KG / DEP_HEIGHT
         548             :
         549             :           ! Check validity of value
         550             :           CALL HCO_CheckDepv( HcoState, SINK(I,J), RC )
         551             :
         552             :        ENDIF !Over ocean
         553             :     ENDDO !I
         554             :     ENDDO !J
         555             : !$OMP END PARALLEL DO
         556             :
         557             :
         558             :     ! Check exit status
         559           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         560           0 :        CALL HCO_ERROR(MSG, RC )
         561           0 :        RETURN
         562             :     ENDIF
         563             :
         564             :     ! Warning?
         565           0 :     IF ( WARN /= OLDWARN ) THEN
         566           0 :        WRITE(MSG,*) 'Temperature limited to ', TMAX, 'K'
         567           0 :        CALL HCO_WARNING(HcoState%Config%Err, MSG, RC )
         568             :     ENDIF
         569             :
         570             :     ! Leave w/ success
         571           0 :     CALL HCO_LEAVE( HcoState%Config%Err,RC )
         572             :
         573           0 :   END SUBROUTINE Calc_SeaFlux
         574             : !EOC
         575             : !------------------------------------------------------------------------------
         576             : !                   Harmonized Emissions Component (HEMCO)                    !
         577             : !------------------------------------------------------------------------------
         578             : !BOP
         579             : !
         580             : ! !IROUTINE: HCOX_SeaFlux_Init
         581             : !
         582             : ! !DESCRIPTION: Subroutine HCOX\_SeaFlux\_Init initializes all module
         583             : ! variables, including all species - specific parameter such as
         584             : ! the liquid molar volume (Vb), the parameterization type for the
         585             : ! Schmidt number in water (SCWPAR) and the name of the field containing
         586             : ! oceanic concentrations.
         587             : !\\
         588             : !\\
         589             : ! LiqVol is the liquid molar volume [cm3/mol]. If not stated otherwise,
         590             : ! it is calculated using the Schroeder additive method as described in
         591             : ! Johnson, 2010. Note that experimental values for LiqVol should be used
         592             : ! if available!
         593             : !\\
         594             : !\\
         595             : ! Table 3 of Johnson, 2010: Schroeder additive method for calculating
         596             : ! Vb. For all atoms/structural items a molecule contains, the sum of the
         597             : ! incre- ments will give the molar volume. e.g. CH2=CH2 contains 2 car-
         598             : ! bon atoms, 4 hydrogen atoms and 1 double bond so the Schroeder
         599             : ! Vb is 2x7 + 4x7 + 7 = 49cm3mol-1. * applies to all kinds of cyclic features
         600             : ! and is applied only once to ring-containing compounds irrespective
         601             : ! of the number of rings present.
         602             : !
         603             : ! \begin{itemize}
         604             : ! \item Atom/feature Increment/cm3mole-1
         605             : ! \item Carbon       7.0
         606             : ! \item Hydrogen     7.0
         607             : ! \item Oxygen       7.0
         608             : ! \item Nitrogen     7.0
         609             : ! \item Bromine     31.5
         610             : ! \item Chlorine    24.5
         611             : ! \item Fluorine    10.5
         612             : ! \item Iodine      38.5
         613             : ! \item Sulfur      21.0
         614             : ! \item Ring*       -7.0
         615             : ! \item Double bond  7.0
         616             : ! \item Triple bond 14.0
         617             : ! \end{itemize}
         618             : !
         619             : ! SCWPAR denotes which parameterization will be used to calculate the
         620             : ! Schmidt number in water (in ocean\_toolbox\_mod). The following
         621             : ! parameterizations are currently supported:
         622             : !
         623             : ! \begin{enumerate}
         624             : ! \item Parameterization as in Johnson, 2010 (default).
         625             : ! \item Parameterization for DMS according to Saltzman et al., 1993.
         626             : ! \item Parameterization for Acetone as in former acetone\_mod.F in GC.
         627             : ! \item Parameterization for Acetaldehyde as in ald2\_mod.F from D. Millet
         628             : ! \item Parameterization for MENO3, ETNO3 as in Fisher et al., 2018
         629             : ! \end{enumerate}
         630             :
         631             : ! The oceanic surface concentrations of all species are obtained from
         632             : ! external fields. These field names are specified in array OcDataName.
         633             : ! For now, we obtain these concentrations from netCDF-files through the
         634             : ! HEMCO core module, i.e. for each species there need to be a
         635             : ! corresponding seawater concentration data file specified in the HEMCO
         636             : ! configuration file. Once we use a coupled (ESMF) system, these names
         637             : ! may be used to refer to the names of the concentration fields imported
         638             : ! from the ocean model component.
         639             : !\\
         640             : !\\
         641             : ! !INTERFACE:
         642             : !
         643           0 :   SUBROUTINE HCOX_SeaFlux_Init( HcoState, ExtName, ExtState, RC )
         644             : !
         645             : ! !USES:
         646             : !
         647           0 :     USE HCO_ExtList_Mod,        ONLY : GetExtNr
         648             :     USE HCO_STATE_MOD,          ONLY : HCO_GetExtHcoID
         649             : !
         650             : ! !INPUT PARAMETERS:
         651             : !
         652             :     TYPE(HCO_State),  POINTER        :: HcoState     ! Hemco State obj.
         653             :     CHARACTER(LEN=*), INTENT(IN   )  :: ExtName      ! Extension name
         654             :     TYPE(Ext_State),  POINTER        :: ExtState       ! Ext. obj.
         655             : !
         656             : ! !INPUT/OUTPUT PARAMETERS:
         657             : !
         658             :     INTEGER,          INTENT(INOUT)  :: RC           ! Return status
         659             : !
         660             : ! !REVISION HISTORY:
         661             : !  16 Apr 2013 - C. Keller - Initial version
         662             : !  See https://github.com/geoschem/hemco for complete history
         663             : !EOP
         664             : !------------------------------------------------------------------------------
         665             : !BOC
         666             : !
         667             : ! !LOCAL VARIABLES
         668             : !
         669             :     ! Scalars
         670             :     TYPE(MyInst), POINTER          :: Inst
         671             :     INTEGER                        :: ExtNr, I, J, nSpc
         672             :     CHARACTER(LEN=255)             :: NAME_OC, MSG, ERR, LOC
         673             :
         674             :     ! Arrays
         675           0 :     INTEGER,           ALLOCATABLE :: HcoIDs(:)
         676           0 :     CHARACTER(LEN=31), ALLOCATABLE :: SpcNames(:)
         677             :
         678             :     !=================================================================
         679             :     ! HCOX_SeaFlux_Init begins here!
         680             :     !=================================================================
         681           0 :     LOC = 'HCOX_SeaFlux_Init (HCOX_SEAFLUX_MOD.F90)'
         682             :
         683             :     ! Extension Nr.
         684           0 :     ExtNr = GetExtNr( HcoState%Config%ExtList, TRIM(ExtName) )
         685           0 :     IF ( ExtNr <= 0 ) RETURN
         686             :
         687             :     ! Enter
         688           0 :     CALL HCO_ENTER( HcoState%Config%Err, LOC, RC )
         689           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         690           0 :         CALL HCO_ERROR( 'ERROR 6', RC, THISLOC=LOC )
         691           0 :         RETURN
         692             :     ENDIF
         693           0 :     ERR = 'nOcSpc too low!'
         694             :
         695             :     ! Create instance for this simulation
         696           0 :     CALL InstCreate ( ExtNr, ExtState%SeaFlux, Inst, RC )
         697           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         698           0 :        CALL HCO_ERROR ( 'Cannot create SeaFlux instance', RC )
         699           0 :        RETURN
         700             :     ENDIF
         701             :
         702             :     ! Verbose mode
         703           0 :     IF ( HcoState%amIRoot ) THEN
         704             :
         705             :        ! Write the name of the extension regardless of the verbose setting
         706           0 :        msg = 'Using HEMCO extension: SeaFlux (air-sea flux emissions)'
         707           0 :        IF ( HCO_IsVerb( HcoState%Config%Err ) ) THEN
         708           0 :           CALL HCO_Msg( HcoState%Config%Err, msg, sep1='-' ) ! With separator
         709             :        ELSE
         710           0 :           CALL HCO_Msg( msg, verb=.TRUE.                   ) ! W/o separator
         711             :        ENDIF
         712             :
         713             :        ! Write all other messages as debug printout only
         714           0 :        MSG = '   - Use species:'
         715           0 :        CALL HCO_MSG(HcoState%Config%Err,MSG )
         716             :     ENDIF
         717             :
         718             :     ! ----------------------------------------------------------------------
         719             :     ! Get species IDs and settings
         720             :     ! ----------------------------------------------------------------------
         721             :
         722             :     ! # of species for which air-sea exchange will be calculated
         723           0 :     Inst%nOcSpc = 7  ! updated to include MENO3, ETNO3, MOH
         724             :
         725             :     ! Initialize vector w/ species information
         726           0 :     ALLOCATE ( Inst%OcSpecs(Inst%nOcSpc) )
         727           0 :     DO I = 1, Inst%nOcSpc
         728           0 :        Inst%OcSpecs(I)%HcoID      = -1
         729           0 :        Inst%OcSpecs(I)%OcSpcName  = ''
         730           0 :        Inst%OcSpecs(I)%OcDataName = ''
         731           0 :        Inst%OcSpecs(I)%LiqVol     = 0d0
         732           0 :        Inst%OcSpecs(I)%SCWPAR     = 1
         733             :     ENDDO
         734             :
         735             :     ! Counter
         736             :     I = 0
         737             :
         738             :     ! ----------------------------------------------------------------------
         739             :     ! CH3I:
         740             :     ! ----------------------------------------------------------------------
         741             :
         742           0 :     I = I + 1
         743           0 :     IF ( I > Inst%nOcSpc ) THEN
         744           0 :        CALL HCO_ERROR ( ERR, RC )
         745           0 :        RETURN
         746             :     ENDIF
         747             :
         748           0 :     Inst%OcSpecs(I)%OcSpcName  = 'CH3I'
         749           0 :     Inst%OcSpecs(I)%OcDataName = 'CH3I_SEAWATER'
         750           0 :     Inst%OcSpecs(I)%LiqVol     = 1d0*7d0 + 3d0*7d0 + 1d0*38.5d0 ! Johnson, 2010
         751           0 :     Inst%OcSpecs(I)%SCWPAR     = 1 ! Schmidt number following Johnson, 2010
         752             :
         753             :     ! ----------------------------------------------------------------------
         754             :     ! DMS:
         755             :     ! ----------------------------------------------------------------------
         756             :
         757           0 :     I = I + 1
         758           0 :     IF ( I > Inst%nOcSpc ) THEN
         759           0 :        CALL HCO_ERROR ( ERR, RC )
         760           0 :        RETURN
         761             :     ENDIF
         762             :
         763           0 :     Inst%OcSpecs(I)%OcSpcName  = 'DMS'
         764           0 :     Inst%OcSpecs(I)%OcDataName = 'DMS_SEAWATER'
         765           0 :     Inst%OcSpecs(I)%LiqVol     = 2d0*7d0 + 6d0*7d0 + 1d0*21.0d0 ! Johnson, 2010
         766           0 :     Inst%OcSpecs(I)%SCWPAR     = 2 ! Schmidt number following Saltzman et al., 1993
         767             :
         768             :     ! ----------------------------------------------------------------------
         769             :     ! Acetone:
         770             :     ! ----------------------------------------------------------------------
         771             :
         772           0 :     I = I + 1
         773           0 :     IF ( I > Inst%nOcSpc ) THEN
         774           0 :        CALL HCO_ERROR ( ERR, RC )
         775           0 :        RETURN
         776             :     ENDIF
         777             :
         778           0 :     Inst%OcSpecs(I)%OcSpcName  = 'ACET'
         779           0 :     Inst%OcSpecs(I)%OcDataName = 'ACET_SEAWATER'
         780           0 :     Inst%OcSpecs(I)%LiqVol     = 3d0*7d0 + 6d0*7d0 + 1d0*7d0 + 1d0*7d0 ! Johnson, 2010
         781           0 :     Inst%OcSpecs(I)%SCWPAR     = 3 ! Schmidt number of acetone
         782             :
         783             :     ! ----------------------------------------------------------------------
         784             :     ! Methanol:
         785             :     ! ----------------------------------------------------------------------
         786             :
         787           0 :     I = I + 1
         788           0 :     IF ( I > Inst%nOcSpc ) THEN
         789           0 :        CALL HCO_ERROR ( ERR, RC )
         790           0 :        RETURN
         791             :     ENDIF
         792             :
         793           0 :     Inst%OcSpecs(I)%OcSpcName  = 'MOH'
         794           0 :     Inst%OcSpecs(I)%OcDataName = 'MOH_SEAWATER'
         795           0 :     Inst%OcSpecs(I)%LiqVol     = 1d0*7d0 + 4d0*7d0 + 1d0*7d0 ! Johnson, 2010
         796           0 :     Inst%OcSpecs(I)%SCWPAR     = 1 ! Schmidt number of methanol
         797             :
         798             :     ! ----------------------------------------------------------------------
         799             :     ! Acetaldehyde:
         800             :     ! ----------------------------------------------------------------------
         801             :
         802           0 :     I = I + 1
         803           0 :     IF ( I > Inst%nOcSpc ) THEN
         804           0 :        CALL HCO_ERROR ( ERR, RC )
         805           0 :        RETURN
         806             :     ENDIF
         807             :
         808           0 :     Inst%OcSpecs(I)%OcSpcName  = 'ALD2'
         809           0 :     Inst%OcSpecs(I)%OcDataName = 'ALD2_SEAWATER'
         810           0 :     Inst%OcSpecs(I)%LiqVol     = 2d0*7d0 + 4d0*7d0 + 1d0*7d0 + 1d0*7d0 ! Johnson, 2010
         811           0 :     Inst%OcSpecs(I)%SCWPAR     = 4 ! Schmidt number of acetaldehyde
         812             :
         813             :     ! ----------------------------------------------------------------------
         814             :     ! Methyl nitrate:
         815             :     ! ----------------------------------------------------------------------
         816             :
         817           0 :     I = I + 1
         818           0 :     IF ( I > Inst%nOcSpc ) THEN
         819           0 :        CALL HCO_ERROR ( ERR, RC )
         820           0 :        RETURN
         821             :     ENDIF
         822             :
         823           0 :     Inst%OcSpecs(I)%OcSpcName  = 'MENO3'
         824           0 :     Inst%OcSpecs(I)%OcDataName = 'MENO3_SEAWATER'
         825           0 :     Inst%OcSpecs(I)%LiqVol     = 64d0 ! Kornilov & Klselev 2015
         826           0 :     Inst%OcSpecs(I)%SCWPAR     = 1
         827             :
         828             :     ! ----------------------------------------------------------------------
         829             :     ! Ethyl nitrate:
         830             :     ! ----------------------------------------------------------------------
         831             :
         832           0 :     I = I + 1
         833           0 :     IF ( I > Inst%nOcSpc ) THEN
         834           0 :        CALL HCO_ERROR ( ERR, RC )
         835           0 :        RETURN
         836             :     ENDIF
         837             :
         838           0 :     Inst%OcSpecs(I)%OcSpcName  = 'ETNO3'
         839           0 :     Inst%OcSpecs(I)%OcDataName = 'ETNO3_SEAWATER'
         840           0 :     Inst%OcSpecs(I)%LiqVol     = 82.2d0 ! Kornilov & Klselev 2015
         841           0 :     Inst%OcSpecs(I)%SCWPAR     = 1
         842             :
         843             :     ! ----------------------------------------------------------------------
         844             :     ! Match module species with species assigned to this module in config.
         845             :     ! file
         846             :     ! ----------------------------------------------------------------------
         847             :
         848             :     ! HEMCO species IDs of species names defined in config. file
         849           0 :     CALL HCO_GetExtHcoID( HcoState, ExtNr, HcoIDs, SpcNames, nSpc, RC )
         850           0 :     IF ( RC /= HCO_SUCCESS ) THEN
         851           0 :         CALL HCO_ERROR( 'ERROR 7', RC, THISLOC=LOC )
         852           0 :         RETURN
         853             :     ENDIF
         854             :
         855             :     ! Set information in module variables
         856           0 :     DO I = 1, Inst%nOcSpc
         857             :
         858             :        ! Append ocean tag '__OC' to this species name to make sure
         859             :        ! that we will also register non-tagged species.
         860           0 :        NAME_OC = TRIM(Inst%OcSpecs(I)%OcSpcName) // '__OC'
         861             :
         862           0 :        DO J = 1, nSpc
         863             :
         864             :           ! Compare model species names against defined module species.
         865             :           ! Also accept species names without the tag __OC, e.g.
         866             :           ! 'ACET' only instead of 'ACET__OC'.
         867           0 :           IF ( TRIM(SpcNames(J)) == TRIM(Inst%OcSpecs(I)%OcSpcName) .OR. &
         868           0 :                TRIM(SpcNames(J)) == TRIM(NAME_OC)              ) THEN
         869           0 :              Inst%OcSpecs(I)%HcoID = HcoIDs(J)
         870           0 :              EXIT
         871             :           ENDIF
         872             :        ENDDO !J
         873             :
         874             :        ! verbose
         875           0 :        IF ( Inst%OcSpecs(I)%HcoID > 0 .AND. HcoState%amIRoot ) THEN
         876           0 :           WRITE(MSG,*) '   - ', &
         877           0 :                TRIM(Inst%OcSpecs(I)%OcSpcName), Inst%OcSpecs(I)%HcoID
         878           0 :           CALL HCO_MSG(HcoState%Config%Err,MSG)
         879             :        ENDIF
         880             :     ENDDO !I
         881             :
         882             :     ! Set met fields
         883           0 :     ExtState%U10M%DoUse        = .TRUE.
         884           0 :     ExtState%V10M%DoUse        = .TRUE.
         885           0 :     ExtState%TSKIN%DoUse       = .TRUE.
         886           0 :     ExtState%FRLAND%DoUse      = .TRUE.
         887           0 :     ExtState%FRLANDIC%DoUse    = .TRUE.
         888           0 :     ExtState%FROCEAN%DoUse     = .TRUE.
         889           0 :     ExtState%FRSEAICE%DoUse    = .TRUE.
         890           0 :     ExtState%FRLAKE%DoUse      = .TRUE.
         891           0 :     IF ( HcoState%Options%PBL_DRYDEP ) THEN
         892           0 :        ExtState%FRAC_OF_PBL%DoUse = .TRUE.
         893             :     ENDIF
         894             : !    ExtState%FRCLND%DoUse      = .TRUE.
         895             :
         896             :     ! Enable extensions
         897             :     !ExtState%SeaFlux = .TRUE.
         898             :
         899             :     ! Return w/ success
         900           0 :     IF ( ALLOCATED(HcoIDs  ) ) DEALLOCATE(HcoIDs  )
         901           0 :     IF ( ALLOCATED(SpcNames) ) DEALLOCATE(SpcNames)
         902           0 :     CALL HCO_LEAVE( HcoState%Config%Err,RC )
         903             :
         904           0 :   END SUBROUTINE HCOX_SeaFlux_Init
         905             : !EOC
         906             : !------------------------------------------------------------------------------
         907             : !                   Harmonized Emissions Component (HEMCO)                    !
         908             : !------------------------------------------------------------------------------
         909             : !BOP
         910             : !
         911             : ! !IROUTINE: HCOX_SeaFlux_Final
         912             : !
         913             : ! !DESCRIPTION: Subroutine HCOX\_SeaFlux\_Final deallocates
         914             : !  all module arrays.
         915             : !\\
         916             : !\\
         917             : ! !INTERFACE:
         918             : !
         919           0 :   SUBROUTINE HCOX_SeaFlux_Final( ExtState )
         920             : !
         921             : ! !INPUT PARAMETERS:
         922             : !
         923             :     TYPE(Ext_State),  POINTER       :: ExtState   ! Module options
         924             : !
         925             : ! !REVISION HISTORY:
         926             : !  16 Apr 2013 - C. Keller - Initial version
         927             : !  See https://github.com/geoschem/hemco for complete history
         928             : !EOP
         929             : !------------------------------------------------------------------------------
         930             : !BOC
         931             : !
         932             :     !=================================================================
         933             :     ! HCOX_SeaFlux_Final begins here!
         934             :     !=================================================================
         935           0 :     CALL InstRemove( ExtState%SeaFlux )
         936             :
         937             :     !IF ( ASSOCIATED( OcSpecs )) DEALLOCATE( OcSpecs )
         938             :
         939           0 :   END SUBROUTINE HCOX_SeaFlux_Final
         940             : !EOC
         941             : !------------------------------------------------------------------------------
         942             : !                   Harmonized Emissions Component (HEMCO)                    !
         943             : !------------------------------------------------------------------------------
         944             : !BOP
         945             : !
         946             : ! !IROUTINE: InstGet
         947             : !
         948             : ! !DESCRIPTION: Subroutine InstGet returns a poiner to the desired instance.
         949             : !\\
         950             : !\\
         951             : ! !INTERFACE:
         952             : !
         953           0 :   SUBROUTINE InstGet ( Instance, Inst, RC, PrevInst )
         954             : !
         955             : ! !INPUT PARAMETERS:
         956             : !
         957             :     INTEGER                             :: Instance
         958             :     TYPE(MyInst),     POINTER           :: Inst
         959             :     INTEGER                             :: RC
         960             :     TYPE(MyInst),     POINTER, OPTIONAL :: PrevInst
         961             : !
         962             : ! !REVISION HISTORY:
         963             : !  18 Feb 2016 - C. Keller   - Initial version
         964             : !  See https://github.com/geoschem/hemco for complete history
         965             : !EOP
         966             : !------------------------------------------------------------------------------
         967             : !BOC
         968             :     TYPE(MyInst),     POINTER    :: PrvInst
         969             :
         970             :     !=================================================================
         971             :     ! InstGet begins here!
         972             :     !=================================================================
         973             :
         974             :     ! Get instance. Also archive previous instance.
         975           0 :     PrvInst => NULL()
         976           0 :     Inst    => AllInst
         977           0 :     DO WHILE ( ASSOCIATED(Inst) )
         978           0 :        IF ( Inst%Instance == Instance ) EXIT
         979           0 :        PrvInst => Inst
         980           0 :        Inst    => Inst%NextInst
         981             :     END DO
         982           0 :     IF ( .NOT. ASSOCIATED( Inst ) ) THEN
         983           0 :        RC = HCO_FAIL
         984           0 :        RETURN
         985             :     ENDIF
         986             :
         987             :     ! Pass output arguments
         988           0 :     IF ( PRESENT(PrevInst) ) PrevInst => PrvInst
         989             :
         990             :     ! Cleanup & Return
         991           0 :     PrvInst => NULL()
         992           0 :     RC = HCO_SUCCESS
         993             :
         994             :   END SUBROUTINE InstGet
         995             : !EOC
         996             : !------------------------------------------------------------------------------
         997             : !                   Harmonized Emissions Component (HEMCO)                    !
         998             : !------------------------------------------------------------------------------
         999             : !BOP
        1000             : !
        1001             : ! !IROUTINE: InstCreate
        1002             : !
        1003             : ! !DESCRIPTION: Subroutine InstCreate creates a new instance.
        1004             : !\\
        1005             : !\\
        1006             : ! !INTERFACE:
        1007             : !
        1008           0 :   SUBROUTINE InstCreate ( ExtNr, Instance, Inst, RC )
        1009             : !
        1010             : ! !INPUT PARAMETERS:
        1011             : !
        1012             :     INTEGER,       INTENT(IN)       :: ExtNr
        1013             : !
        1014             : ! !OUTPUT PARAMETERS:
        1015             : !
        1016             :     INTEGER,       INTENT(  OUT)    :: Instance
        1017             :     TYPE(MyInst),  POINTER          :: Inst
        1018             : !
        1019             : ! !INPUT/OUTPUT PARAMETERS:
        1020             : !
        1021             :     INTEGER,       INTENT(INOUT)    :: RC
        1022             : !
        1023             : ! !REVISION HISTORY:
        1024             : !  18 Feb 2016 - C. Keller   - Initial version
        1025             : !  See https://github.com/geoschem/hemco for complete history
        1026             : !EOP
        1027             : !------------------------------------------------------------------------------
        1028             : !BOC
        1029             :     TYPE(MyInst), POINTER          :: TmpInst
        1030             :     INTEGER                        :: nnInst
        1031             :
        1032             :     !=================================================================
        1033             :     ! InstCreate begins here!
        1034             :     !=================================================================
        1035             :
        1036             :     ! ----------------------------------------------------------------
        1037             :     ! Generic instance initialization
        1038             :     ! ----------------------------------------------------------------
        1039             :
        1040             :     ! Initialize
        1041           0 :     Inst => NULL()
        1042             :
        1043             :     ! Get number of already existing instances
        1044           0 :     TmpInst => AllInst
        1045           0 :     nnInst = 0
        1046             :
        1047           0 :     DO WHILE ( ASSOCIATED(TmpInst) )
        1048           0 :        nnInst  =  nnInst + 1
        1049           0 :        TmpInst => TmpInst%NextInst
        1050             :     END DO
        1051             :
        1052             :     ! Create new instance
        1053           0 :     ALLOCATE(Inst)
        1054           0 :     Inst%Instance = nnInst + 1
        1055           0 :     Inst%ExtNr    = ExtNr
        1056             :
        1057             :     ! Attach to instance list
        1058           0 :     Inst%NextInst => AllInst
        1059           0 :     AllInst       => Inst
        1060             :
        1061             :     ! Update output instance
        1062           0 :     Instance = Inst%Instance
        1063             :
        1064             :     ! ----------------------------------------------------------------
        1065             :     ! Type specific initialization statements follow below
        1066             :     ! ----------------------------------------------------------------
        1067             :
        1068             :     ! Return w/ success
        1069           0 :     RC = HCO_SUCCESS
        1070             :
        1071           0 :   END SUBROUTINE InstCreate
        1072             : !EOC
        1073             : !------------------------------------------------------------------------------
        1074             : !                   Harmonized Emissions Component (HEMCO)                    !
        1075             : !------------------------------------------------------------------------------
        1076             : !BOP
        1077             : !
        1078             : ! !IROUTINE: InstRemove
        1079             : !
        1080             : ! !DESCRIPTION: Subroutine InstRemove creates a new instance.
        1081             : !\\
        1082             : !\\
        1083             : ! !INTERFACE:
        1084             : !
        1085           0 :   SUBROUTINE InstRemove ( Instance )
        1086             : !
        1087             : ! !INPUT PARAMETERS:
        1088             : !
        1089             :     INTEGER                         :: Instance
        1090             : !
        1091             : ! !REVISION HISTORY:
        1092             : !  18 Feb 2016 - C. Keller   - Initial version
        1093             : !  See https://github.com/geoschem/hemco for complete history
        1094             : !EOP
        1095             : !------------------------------------------------------------------------------
        1096             : !BOC
        1097             :     INTEGER                     :: RC
        1098             :     TYPE(MyInst), POINTER       :: PrevInst
        1099             :     TYPE(MyInst), POINTER       :: Inst
        1100             :
        1101             :     !=================================================================
        1102             :     ! InstRemove begins here!
        1103             :     !=================================================================
        1104             :
        1105             :     ! Init
        1106           0 :     PrevInst => NULL()
        1107           0 :     Inst     => NULL()
        1108             :
        1109             :     ! Get instance. Also archive previous instance.
        1110           0 :     CALL InstGet ( Instance, Inst, RC, PrevInst=PrevInst )
        1111             :
        1112             :     ! Instance-specific deallocation
        1113           0 :     IF ( ASSOCIATED(Inst) ) THEN
        1114             :
        1115             :        !---------------------------------------------------------------------
        1116             :        ! Deallocate fields of Inst before popping off from the list
        1117             :        ! in order to avoid memory leaks (Bob Yantosca (17 Aug 2022)
        1118             :        !---------------------------------------------------------------------
        1119           0 :        IF ( ASSOCIATED( Inst%OcSpecs ) ) THEN
        1120           0 :           DEALLOCATE( Inst%OcSpecs )
        1121             :        ENDIF
        1122           0 :        Inst%OcSpecs => NULL()
        1123             :
        1124             :        !---------------------------------------------------------------------
        1125             :        ! Pop off instance from list
        1126             :        !---------------------------------------------------------------------
        1127           0 :        IF ( ASSOCIATED(PrevInst) ) THEN
        1128           0 :           PrevInst%NextInst => Inst%NextInst
        1129             :        ELSE
        1130           0 :           AllInst => Inst%NextInst
        1131             :        ENDIF
        1132           0 :        DEALLOCATE(Inst)
        1133             :     ENDIF
        1134             :
        1135             :     ! Free pointers before exiting
        1136           0 :     PrevInst => NULL()
        1137           0 :     Inst     => NULL()
        1138             :
        1139           0 :    END SUBROUTINE InstRemove
        1140             : !EOC
        1141           0 : END MODULE HCOX_SeaFlux_Mod
        1142             : !EOM

Generated by: LCOV version 1.14