Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -54,5 +54,6 @@ elseif(
)
endif()

add_subdirectory(util)
add_subdirectory(src)
add_subdirectory(tests)
5 changes: 5 additions & 0 deletions src/api/catchem.F90
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,11 @@ module CATChem
use CCPr_DryDep_mod, only: cc_drydep_init => CCPr_DryDep_Init !< DryDep Process Initialization Routine
use CCPr_DryDep_mod, only: cc_drydep_run => CCPr_DryDep_Run !< DryDep Process Run Routine
use CCPr_DryDep_mod, only: cc_drydep_finalize => CCPr_DryDep_Finalize !< DryDep Process Finalization Routine
! SUVolcanicEmissions
use CCPr_SUVolcanicEmissions_mod, only: SUVolcanicEmissionsStateType !< SUVolcanicEmissions State
use CCPr_SUVolcanicEmissions_mod, only: cc_suvolcanic_init => CCPr_SUVolcanicEmissions_Init !< SUVolcanicEmissions Process Initialization Routine
use CCPr_SUVolcanicEmissions_mod, only: cc_suvolcanic_run => CCPr_SUVolcanicEmissions_Run !< SUVolcanicEmissions Process Run Routine
use CCPr_SUVolcanicEmissions_mod, only: cc_suvolcanic_finalize => CCPr_SUVolcanicEmissions_Finalize !< SUVolcanicEmissions Process Finalization Routine

implicit none

Expand Down
21 changes: 20 additions & 1 deletion src/core/chemstate_mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ module ChemState_Mod
!! \param nSpeciesGas: The number of gas species.
!! \param nSpeciesAero: The number of aerosol species.
!! \param nSpeciesDust: The number of dust species.
!! \param nSpeicesSeaSalt: The number of sea salt species.
!! \param nSpeciesSeaSalt: The number of sea salt species.
!! \param SpeciesIndex: An array containing the total species index.
!! \param AeroIndex: An array containing the aerosol species index.
!! \param GasIndex: An array containing the gas species index.
Expand All @@ -66,13 +66,15 @@ module ChemState_Mod
INTEGER :: nSpeciesTracer !< Number of Tracer Species
INTEGER :: nSpeciesDust !< Number of Dust Species
INTEGER :: nSpeciesSeaSalt !< Number of SeaSalt Species
INTEGER :: nSpeciesSUVolcanic !< Number of Volcanic Sulfur Species
INTEGER, ALLOCATABLE :: SpeciesIndex(:) !< Total Species Index
INTEGER, ALLOCATABLE :: TracerIndex(:) !< Tracer Species Index
INTEGER, ALLOCATABLE :: AeroIndex(:) !< Aerosol Species Index
INTEGER, ALLOCATABLE :: GasIndex(:) !< Gas Species Index
INTEGER, ALLOCATABLE :: DustIndex(:) !< Dust Species Index
INTEGER, ALLOCATABLE :: SeaSaltIndex(:) !< SeaSalt Species Index
INTEGER, ALLOCATABLE :: DryDepIndex(:) !< SeaSalt Species Index
INTEGER, ALLOCATABLE :: SUVolcanicIndex(:) !< Volcanic sulfur Species Index
CHARACTER(len=50), ALLOCATABLE :: SpeciesNames(:) !< Species Names

!---------------------------------------------------------------------
Expand Down Expand Up @@ -183,6 +185,7 @@ subroutine Find_Number_of_Species(ChemState, RC)
ChemState%nSpeciesGas = 0
ChemState%nSpeciesSeaSalt = 0
ChemState%nSpeciesTracer = 0
ChemState%nSpeciesSUVolcanic = 0

! Count number of species
do i = 1, ChemState%nSpecies
Expand All @@ -204,6 +207,9 @@ subroutine Find_Number_of_Species(ChemState, RC)
if (ChemState%ChemSpecies(i)%is_drydep .eqv. .true.) then
ChemState%nSpeciesAeroDryDep = ChemState%nSpeciesAeroDryDep + 1
endif
if (ChemState%ChemSpecies(i)%is_suvolcanic .eqv. .true.) then
ChemState%nSpeciesSUVolcanic = ChemState%nSpeciesSUVolcanic + 1
endif
enddo

end subroutine Find_Number_of_Species
Expand Down Expand Up @@ -238,6 +244,7 @@ subroutine Find_Index_of_Species(ChemState, RC)
integer :: seasalt_index ! Current Seas Salt Index
integer :: tracer_index ! Current Tracer Index
integer :: drydep_index ! Current DryDep Index
integer :: suvolcanic_index ! Current SUVolcanic Index


! Initialize
Expand All @@ -253,6 +260,7 @@ subroutine Find_Index_of_Species(ChemState, RC)
seasalt_index = 1
tracer_index = 1
drydep_index = 1
suvolcanic_index = 1

! Allocate index arrays
ALLOCATE(Chemstate%AeroIndex(ChemState%nSpeciesAero), STAT=RC)
Expand Down Expand Up @@ -297,6 +305,13 @@ subroutine Find_Index_of_Species(ChemState, RC)
RETURN
ENDIF

ALLOCATE(Chemstate%SUVolcanicIndex(ChemState%nSpeciesSUVolcanic), STAT=RC)
IF ( RC /= CC_SUCCESS ) THEN
errMsg = 'Error allocating Chemstate%SUVolcanicIndex'
call CC_Error(errMsg, RC, thisLoc)
RETURN
ENDIF

! Find indices for species groups
do n = 1, ChemState%nSpecies
if (ChemState%ChemSpecies(n)%is_aerosol .eqv. .true.) then
Expand All @@ -323,6 +338,10 @@ subroutine Find_Index_of_Species(ChemState, RC)
Chemstate%DryDepIndex(drydep_index) = n
drydep_index = drydep_index + 1
endif
if (ChemState%ChemSpecies(n)%is_suvolcanic .eqv. .true.) then
Chemstate%SUVolcanicIndex(suvolcanic_index) = n
suvolcanic_index = suvolcanic_index + 1
endif
enddo

end subroutine Find_index_of_Species
Expand Down
85 changes: 85 additions & 0 deletions src/core/config_mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,15 @@ SUBROUTINE Read_Input_File( Config , GridState, EmisState, ChemState, RC, Config
RETURN
ENDIF

call Config_Process_SUVolcanicEmissions(ConfigInput, Config, RC)
IF ( RC /= CC_SUCCESS ) THEN
errMsg = 'Error in "Config_Process_SUVolcanicEmissions"!'
CALL CC_Error( errMsg, RC, thisLoc )
CALL QFYAML_CleanUp( ConfigInput )
CALL QFYAML_CleanUp( ConfigAnchored )
RETURN
ENDIF


!========================================================================
! Config ChemState
Expand Down Expand Up @@ -569,6 +578,8 @@ SUBROUTINE Config_Chem_State( filename, GridState, ChemState, RC )
write(*,*) '| number of tracers: ', ChemState%nSpeciesTracer
write(*,*) '| number of dust: ', ChemState%nSpeciesDust
write(*,*) '| number of seasalt: ', ChemState%nSpeciesSeaSalt
write(*,*) '| number of volcanic: ', ChemState%nSpeciesSUVolcanic

write(*,*) '========================================================='

END SUBROUTINE Config_Chem_State
Expand Down Expand Up @@ -1373,4 +1384,78 @@ SUBROUTINE Config_Process_DryDep( ConfigInput, Config, RC )
END SUBROUTINE Config_Process_DryDep


!> \brief Process SUVolcanicEmissions configuration
!!
!! This function processes the SUVolcanic configuration and performs the necessary actions based on the configuration.
!!
!! \param[in] ConfigInput The YAML configuration object
!! \param[inout] Config The configuration object
!! \param[out] RC The return code
!!
!! \ingroup core_modules
!!!>
SUBROUTINE Config_Process_SUVolcanicEmissions( ConfigInput, Config, RC )
USE CharPak_Mod, ONLY : StrSplit
USE Error_Mod
USE Config_Opt_Mod, ONLY : ConfigType

TYPE(QFYAML_t), INTENT(INOUT) :: ConfigInput ! YAML Config object
TYPE(ConfigType), INTENT(INOUT) :: Config ! Input options

!
! !OUTPUT PARAMETERS:
!
INTEGER, INTENT(OUT) :: RC ! Success or failure

! !LOCAL VARIABLES:
!
! Scalars
LOGICAL :: v_bool
INTEGER :: v_int

! Strings
CHARACTER(LEN=255) :: thisLoc
CHARACTER(LEN=512) :: errMsg
CHARACTER(LEN=QFYAML_StrLen) :: key

!========================================================================
! Config_Process_SUVolcanicEmissions begins here!
!========================================================================

! Initialize
RC = CC_SUCCESS
thisLoc = ' -> at Config_Process_SUVolcanicEmissions (in CATChem/src/core/config_mod.F90)'
errMsg = ''

! TODO #105 Fix reading of config file
key = "process%SUVolcanicEmissions%activate"
v_bool = MISSING_BOOL
CALL QFYAML_Add_Get( ConfigInput, TRIM( key ), v_bool, "", RC )
IF ( RC /= CC_SUCCESS ) THEN
errMsg = 'Error parsing ' // TRIM( key ) // '!'
CALL CC_Error( errMsg, RC, thisLoc )
RETURN
ENDIF
Config%SUVolcanicEmissions_activate = v_bool


key = "process%SUVolcanicEmissions%scheme_opt"
v_int = MISSING_INT
CALL QFYAML_Add_Get( ConfigInput, TRIM( key ), v_int, "", RC )
IF ( RC /= CC_SUCCESS ) THEN
errMsg = TRIM( key ) // 'Not Found, Setting Default to 1'
v_int = 1 ! default is one
RETURN
ENDIF
Config%SUVolcanicEmissions_scheme = v_int


write(*,*) "SUVolcanicEmissions Configuration"
write(*,*) '------------------------------------'
write(*,*) 'Config%SUVolcanicEmissions_activate = ', Config%SUVolcanicEmissions_activate
write(*,*) 'Config%SUVolcanicEmissions_scheme = ', Config%SUVolcanicEmissions_scheme
write(*,*) '------------------------------------'

END SUBROUTINE Config_Process_SUVolcanicEmissions

END MODULE config_mod
10 changes: 10 additions & 0 deletions src/core/config_opt_mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ MODULE Config_Opt_Mod
!! - `drydep_activate` : Activate drydep process
!! - `drydep_scheme` : Scheme option for drydep process
!! - `drydep_resuspension` : Activate resuspension
!! - `SUVolcanicEmissions_activate` : Activate SU Volcanic process
!! - `SUVolcanicEmissions_scheme` : Scheme option for SU Volcanic process
!!
!! \ingroup core_modules
!!!>
Expand Down Expand Up @@ -102,6 +104,10 @@ MODULE Config_Opt_Mod
INTEGER :: drydep_scheme
LOGICAL :: drydep_resuspension !< Turn on resuspension

! SUVolcanicEmissions Process
LOGICAL :: SUVolcanicEmissions_activate
INTEGER :: SUVolcanicEmissions_scheme

END TYPE ConfigType

CONTAINS
Expand Down Expand Up @@ -176,6 +182,10 @@ SUBROUTINE Set_Config( am_I_Root, Config, RC )
Config%drydep_scheme = 1
Config%drydep_resuspension = .FALSE.

! SU Volcanic Process
Config%SUVolcanicEmissions_activate = .FALSE.
Config%SUVolcanicEmissions_scheme = 1

END SUBROUTINE Set_Config
!> \brief Cleanup the Config options
!!
Expand Down
2 changes: 2 additions & 0 deletions src/core/metstate_mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ MODULE MetState_Mod
! TIMESTEP
!---------
REAL(fp) :: TSTEP !< Time step [s]
INTEGER :: YMD ! Year, month, day
INTEGER :: HMS ! Hour, minute, second

! Logicals
!---------
Expand Down
2 changes: 2 additions & 0 deletions src/core/species_mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ module species_mod
logical :: is_gocart_aero !< if true, species is a GOCART aerosol species
logical :: is_dust !< if true, species is a dust
logical :: is_seasalt !< if true, species is a seasalt
logical :: is_suvolcanic

! Numerical properties
real(kind=fp) :: mw_g !< gaseous molecular weight
Expand All @@ -59,6 +60,7 @@ module species_mod
integer :: drydep_index !< drydep index in drydep array
integer :: photolysis_index !< photolysis index in photolysis array
integer :: gocart_aero_index !< gocart_aero index in gocart_aero array
integer :: suvolcanic_index !< drydep index in drydep array

! Concentration
real(kind=fp), ALLOCATABLE :: conc(:) !< species concentration [v/v] or kg/kg
Expand Down
1 change: 1 addition & 0 deletions src/process/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ add_subdirectory(dust)
add_subdirectory(seasalt)
add_subdirectory(plumerise)
add_subdirectory(drydep)
add_subdirectory(SUVolcanicEmissions)
Loading
Loading