Skip to content

File catchem.F90

File List > api > catchem.F90

Go to the documentation of this file

module catchem

   !---------------
   ! CATChem States
   !---------------
   use chemstate_mod,  only: chemstatetype    ! Chemical State
   ! use GridState_Mod,  only: GridStateType    ! Grid State (DEPRECATED - removed)
   use diagstate_mod,  only: diagstatetype    ! Diagnostic State
   use emisstate_mod,  only: emisstatetype    ! Emission State
   use metstate_mod,   only: metstatetype     ! Meteorology State
   use species_mod,    only: speciestype      ! Species State
   use config_opt_mod, only: configtype
   use state_mod,      only: statecontainertype, statebuildertype  ! Modern state management

   !------------------
   ! Grid Management
   !------------------
   use gridmanager_mod, only: gridmanagertype, gridgeometrytype, columniteratortype
   use columninterface_mod, only: virtualcolumntype, columnprocessortype

   !--------------------
   ! Process Management
   !--------------------
   use processinterface_mod, only: processinterface, columnprocessinterface
   use processmanager_mod, only: processmanagertype
   use processfactory_mod, only: processfactorytype

   !----------------
   ! Core routines
   !----------------
   ! chemstate
   use chemstate_mod, only: cc_find_species_by_name => findspecbyname
   use chemstate_mod, only: cc_get_species_conc => getspecconc
   use chemstate_mod, only: cc_get_species_conc_by_name => getspecconcbyname
   use chemstate_mod, only: cc_get_species_conc_by_index => getspecconcbyindex
   ! use ChemState_Mod, only: cc_allocate_chemstate => Chem_Allocate  ! DEPRECATED
   ! metstate
   ! use MetState_Mod, only: cc_allocate_metstate => Met_Allocate  ! DEPRECATED
   ! diagstate
   ! diagstate - Already modernized, use type-bound procedures:
   ! - DiagState%init() for initialization
   ! - DiagState%cleanup() for cleanup
   ! - DiagState%validate() for validation
   ! emisstate - All legacy functions removed. Use modern type-bound procedures:
   ! - EmisState%init() for initialization
   ! - EmisState%cleanup() for cleanup
   ! - EmisState%find_species() for species mapping
   ! - EmisState%apply_emissions() for applying emissions

   !-------------------
   ! Configuration Read
   !-------------------
   ! Legacy config_mod disabled - use modern ConfigManager instead:
   ! - ConfigManager%load_config() for configuration loading
   ! - ConfigManager%get_value() for accessing values

   !---------------
   ! Error Handling
   !---------------
   use error_mod, only: cc_check_var => cc_checkvar     ! Method for checking variables
   use error_mod, only: cc_emit_error => cc_error       ! Method for emitting errors
   use error_mod, only: cc_failure                      ! CATCHem Failure return code
   use error_mod, only: cc_success                      ! CATChem Successful return code
   use error_mod, only: cc_emit_warning => cc_warning   ! Method for emitting warnings
   !
   use init_mod, only: cc_init_diag => init_diag        ! Method for initializing the diag state
   use init_mod, only: cc_init_met => init_met          ! Method for initializing the met state
   use init_mod, only: cc_init_emis => init_emis        ! Method for initializing the emission state
   use run_mod, only: cc_init_process => init_process  ! Method for initializing the process state
   use run_mod,  only: cc_run_process => run_process    ! Method for running the processes
   use run_mod,  only: cc_finalize_process => finalize_process    ! Method for finalizing the processes

   !-----------------------------
   ! Column Virtualization API
   !-----------------------------
   public :: cc_init_grid_manager       ! Initialize grid manager with column virtualization
   public :: cc_create_virtual_column   ! Create a virtual column for processing
   public :: cc_run_column_processes    ! Run all column-based processes
   public :: cc_process_all_columns     ! Process all columns with specified process

   !------------------
   ! CATChem Precision
   !------------------
   use precision_mod, only: cc_rk => fp                 ! Real Precision

   !------------------
   ! CATChem Processes
   !------------------
   ! Dust
   use ccpr_dust_common_mod, only: duststatetype                                ! Dust State
   use ccpr_dust_mod, only: cc_dust_init => ccpr_dust_init                      ! Dust Process Initialization Routine
   use ccpr_dust_mod, only: cc_dust_run => ccpr_dust_run                        ! Dust Process Run Routine
   use ccpr_dust_mod, only: cc_dust_finalize => ccpr_dust_finalize              ! Dust Process Finalization Routine
   ! Seasalt
   use ccpr_seasalt_common_mod, only: seasaltstatetype                          ! SeaSalt State
   use ccpr_seasalt_mod, only: cc_seasalt_init => ccpr_seasalt_init             ! SeaSalt Process Initialization Routine
   use ccpr_seasalt_mod, only: cc_seasalt_run => ccpr_seasalt_run               ! SeaSalt Process Run Routine
   use ccpr_seasalt_mod, only: cc_seasalt_finalize => ccpr_seasalt_finalize     ! SeaSalt Process Finalization Routine
   ! Plumerise
   use ccpr_plumerise_mod, only: plumerisestatetype                               ! Plumerise State
   use ccpr_plumerise_mod, only: cc_plumerise_init => ccpr_plumerise_init         ! Plumerise Process Initialization Routine
   use ccpr_plumerise_mod, only: cc_plumerise_run => ccpr_plumerise_run           ! Plumerise Process Run Routine
   use ccpr_plumerise_mod, only: cc_plumerise_finalize => ccpr_plumerise_finalize ! Plumerise Process Finalization Routine
   ! Dry Dep
   use ccpr_drydep_mod, only: drydepstatetype                            ! DryDep State
   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
   ! Chemical mechanism solver (TODO: turn off now)
   !use CCPr_Chem_mod, only: cc_get_micm_version => get_micm_version

   implicit none

   public

contains

   subroutine cc_init_grid_manager(container, nx, ny, nz, rc)
      type(StateContainerType), intent(inout) :: container
      integer, intent(in) :: nx, ny, nz
      integer, intent(out) :: rc

      type(GridManagerType), pointer :: grid_mgr
      type(GridGeometryType) :: geometry

      ! Get grid manager from container
      grid_mgr => container%get_grid_manager()
      if (.not. associated(grid_mgr)) then
         rc = cc_failure
         return
      endif

      ! Initialize geometry
      call geometry%init(nx, ny, nz, rc)
      if (rc /= cc_success) return

      ! Initialize grid manager
      call grid_mgr%init(geometry, rc)
      if (rc /= cc_success) return

      rc = cc_success
   end subroutine cc_init_grid_manager

   subroutine cc_create_virtual_column(container, col_idx, virtual_col, rc)
      type(StateContainerType), intent(inout) :: container
      integer, intent(in) :: col_idx
      type(VirtualColumnType), intent(out) :: virtual_col
      integer, intent(out) :: rc

      type(GridManagerType), pointer :: grid_mgr

      ! Get grid manager from container
      grid_mgr => container%get_grid_manager()
      if (.not. associated(grid_mgr)) then
         rc = cc_failure
         return
      endif

      ! Create virtual column
      call grid_mgr%create_virtual_column(col_idx, virtual_col, rc)
      if (rc /= cc_success) return

      ! Extract data from container
      call virtual_col%extract_from_container(container, rc)
   end subroutine cc_create_virtual_column

   subroutine cc_run_column_processes(proc_mgr, container, rc)
      type(ProcessManagerType), intent(inout) :: proc_mgr
      type(StateContainerType), intent(inout) :: container
      integer, intent(out) :: rc

      call proc_mgr%run_column_processes(container, rc)
   end subroutine cc_run_column_processes

   subroutine cc_process_all_columns(proc_mgr, process_name, container, rc)
      type(ProcessManagerType), intent(inout) :: proc_mgr
      character(len=*), intent(in) :: process_name
      type(StateContainerType), intent(inout) :: container
      integer, intent(out) :: rc

      call proc_mgr%run_process(process_name, container, rc)
   end subroutine cc_process_all_columns

end module catchem