dyn_mpas_exchange_halo Subroutine

private subroutine dyn_mpas_exchange_halo(self, field_name)

Uses

    • mpas_dmpar
    • mpas_derived_types
    • mpas_pool_routines
  • proc~~dyn_mpas_exchange_halo~~UsesGraph proc~dyn_mpas_exchange_halo mpas_dynamical_core_type%dyn_mpas_exchange_halo mpas_derived_types mpas_derived_types proc~dyn_mpas_exchange_halo->mpas_derived_types mpas_dmpar mpas_dmpar proc~dyn_mpas_exchange_halo->mpas_dmpar mpas_pool_routines mpas_pool_routines proc~dyn_mpas_exchange_halo->mpas_pool_routines

Given a field name that is defined in MPAS registry, this subroutine updates the halo layers for that field. Ported and refactored for CAM-SIMA. (KCW, 2024-03-18)

Type Bound

mpas_dynamical_core_type

Arguments

Type IntentOptional Attributes Name
class(mpas_dynamical_core_type), intent(in) :: self
character(len=*), intent(in) :: field_name

Calls

proc~~dyn_mpas_exchange_halo~~CallsGraph proc~dyn_mpas_exchange_halo mpas_dynamical_core_type%dyn_mpas_exchange_halo mpas_dmpar_exch_halo_field mpas_dmpar_exch_halo_field proc~dyn_mpas_exchange_halo->mpas_dmpar_exch_halo_field mpas_pool_get_field mpas_pool_get_field proc~dyn_mpas_exchange_halo->mpas_pool_get_field mpas_pool_get_field_info mpas_pool_get_field_info proc~dyn_mpas_exchange_halo->mpas_pool_get_field_info proc~dyn_mpas_debug_print mpas_dynamical_core_type%dyn_mpas_debug_print proc~dyn_mpas_exchange_halo->proc~dyn_mpas_debug_print proc~stringify stringify proc~dyn_mpas_exchange_halo->proc~stringify proc~dyn_mpas_debug_print->proc~stringify

Called by

proc~~dyn_mpas_exchange_halo~~CalledByGraph proc~dyn_mpas_exchange_halo mpas_dynamical_core_type%dyn_mpas_exchange_halo none~set_mpas_physics_tendency_rho set_mpas_physics_tendency_rho none~set_mpas_physics_tendency_rho->proc~dyn_mpas_exchange_halo none~set_mpas_physics_tendency_rtheta set_mpas_physics_tendency_rtheta none~set_mpas_physics_tendency_rtheta->proc~dyn_mpas_exchange_halo none~set_mpas_state_rho_base_theta_base set_mpas_state_rho_base_theta_base none~set_mpas_state_rho_base_theta_base->proc~dyn_mpas_exchange_halo none~set_mpas_state_rho_theta set_mpas_state_rho_theta none~set_mpas_state_rho_theta->proc~dyn_mpas_exchange_halo none~set_mpas_state_scalars set_mpas_state_scalars none~set_mpas_state_scalars->proc~dyn_mpas_exchange_halo none~set_mpas_state_w set_mpas_state_w none~set_mpas_state_w->proc~dyn_mpas_exchange_halo proc~dyn_exchange_constituent_states dyn_exchange_constituent_states proc~dyn_exchange_constituent_states->proc~dyn_mpas_exchange_halo proc~dyn_mpas_compute_edge_wind mpas_dynamical_core_type%dyn_mpas_compute_edge_wind proc~dyn_mpas_compute_edge_wind->proc~dyn_mpas_exchange_halo proc~dyn_mpas_read_write_stream mpas_dynamical_core_type%dyn_mpas_read_write_stream proc~dyn_mpas_read_write_stream->proc~dyn_mpas_exchange_halo proc~dyn_variable_dump dyn_variable_dump proc~dyn_variable_dump->proc~dyn_mpas_exchange_halo proc~dyn_variable_dump->proc~dyn_mpas_read_write_stream none~set_mpas_physics_tendency_ru set_mpas_physics_tendency_ru none~set_mpas_physics_tendency_ru->proc~dyn_mpas_compute_edge_wind none~set_mpas_state_u set_mpas_state_u none~set_mpas_state_u->proc~dyn_mpas_compute_edge_wind none~set_physics_state_external set_physics_state_external none~set_physics_state_external->proc~dyn_exchange_constituent_states proc~dyn_final dyn_final proc~dyn_final->proc~dyn_variable_dump proc~dyn_init dyn_init proc~dyn_init->proc~dyn_exchange_constituent_states proc~dyn_init->proc~dyn_mpas_read_write_stream proc~set_analytic_initial_condition set_analytic_initial_condition proc~dyn_init->proc~set_analytic_initial_condition proc~dynamics_to_physics_coupling dynamics_to_physics_coupling proc~dynamics_to_physics_coupling->proc~dyn_exchange_constituent_states proc~dynamics_to_physics_coupling->none~set_physics_state_external proc~model_grid_init model_grid_init proc~model_grid_init->proc~dyn_mpas_read_write_stream proc~physics_to_dynamics_coupling physics_to_dynamics_coupling proc~physics_to_dynamics_coupling->none~set_mpas_physics_tendency_rho proc~physics_to_dynamics_coupling->none~set_mpas_physics_tendency_rtheta proc~physics_to_dynamics_coupling->proc~dyn_exchange_constituent_states proc~physics_to_dynamics_coupling->none~set_mpas_physics_tendency_ru proc~set_analytic_initial_condition->none~set_mpas_state_rho_base_theta_base proc~set_analytic_initial_condition->none~set_mpas_state_rho_theta proc~set_analytic_initial_condition->none~set_mpas_state_scalars proc~set_analytic_initial_condition->none~set_mpas_state_w proc~set_analytic_initial_condition->none~set_mpas_state_u proc~stepon_final stepon_final proc~stepon_final->proc~dyn_final proc~stepon_run2 stepon_run2 proc~stepon_run2->proc~physics_to_dynamics_coupling proc~stepon_timestep_init stepon_timestep_init proc~stepon_timestep_init->proc~dynamics_to_physics_coupling

Variables

Type Visibility Attributes Name Initial
type(field1dinteger), private, pointer :: field_1d_integer
type(field1dreal), private, pointer :: field_1d_real
type(field2dinteger), private, pointer :: field_2d_integer
type(field2dreal), private, pointer :: field_2d_real
type(field3dinteger), private, pointer :: field_3d_integer
type(field3dreal), private, pointer :: field_3d_real
type(field4dreal), private, pointer :: field_4d_real
type(field5dreal), private, pointer :: field_5d_real
type(mpas_pool_field_info_type), private :: mpas_pool_field_info
character(len=*), private, parameter :: subname = 'dyn_mpas_subdriver::dyn_mpas_exchange_halo'

Source Code

    subroutine dyn_mpas_exchange_halo(self, field_name)
        ! Module(s) from MPAS.
        use mpas_derived_types, only: field1dinteger, field2dinteger, field3dinteger, &
                                      field1dreal, field2dreal, field3dreal, field4dreal, field5dreal, &
                                      mpas_pool_field_info_type, mpas_pool_integer, mpas_pool_real
        use mpas_dmpar, only: mpas_dmpar_exch_halo_field
        use mpas_pool_routines, only: mpas_pool_get_field, mpas_pool_get_field_info

        class(mpas_dynamical_core_type), intent(in) :: self
        character(*), intent(in) :: field_name

        character(*), parameter :: subname = 'dyn_mpas_subdriver::dyn_mpas_exchange_halo'
        type(field1dinteger), pointer :: field_1d_integer
        type(field2dinteger), pointer :: field_2d_integer
        type(field3dinteger), pointer :: field_3d_integer
        type(field1dreal), pointer :: field_1d_real
        type(field2dreal), pointer :: field_2d_real
        type(field3dreal), pointer :: field_3d_real
        type(field4dreal), pointer :: field_4d_real
        type(field5dreal), pointer :: field_5d_real
        type(mpas_pool_field_info_type) :: mpas_pool_field_info

        call self % debug_print(log_level_debug, subname // ' entered')

        nullify(field_1d_integer)
        nullify(field_2d_integer)
        nullify(field_3d_integer)
        nullify(field_1d_real)
        nullify(field_2d_real)
        nullify(field_3d_real)
        nullify(field_4d_real)
        nullify(field_5d_real)

        call self % debug_print(log_level_info, 'Inquiring field information for "' // trim(adjustl(field_name)) // '"')

        call mpas_pool_get_field_info(self % domain_ptr % blocklist % allfields, &
            trim(adjustl(field_name)), mpas_pool_field_info)

        if (mpas_pool_field_info % fieldtype == -1 .or. &
            mpas_pool_field_info % ndims == -1 .or. &
            mpas_pool_field_info % nhalolayers == -1) then
            call self % model_error('Invalid field information for "' // trim(adjustl(field_name)) // '"', subname, __LINE__)
        end if

        ! No halo layers to exchange. This field is not decomposed.
        if (mpas_pool_field_info % nhalolayers == 0) then
            call self % debug_print(log_level_info, 'Skipping field "' // trim(adjustl(field_name)) // &
                '" due to not decomposed')

            return
        end if

        call self % debug_print(log_level_info, 'Exchanging halo layers for "' // trim(adjustl(field_name)) // '"')

        select case (mpas_pool_field_info % fieldtype)
            case (mpas_pool_integer)
                select case (mpas_pool_field_info % ndims)
                    case (1)
                        call mpas_pool_get_field(self % domain_ptr % blocklist % allfields, &
                            trim(adjustl(field_name)), field_1d_integer, timelevel=1)

                        if (.not. associated(field_1d_integer)) then
                            call self % model_error('Failed to find field "' // trim(adjustl(field_name)) // &
                                '"', subname, __LINE__)
                        end if

                        call mpas_dmpar_exch_halo_field(field_1d_integer)

                        nullify(field_1d_integer)
                    case (2)
                        call mpas_pool_get_field(self % domain_ptr % blocklist % allfields, &
                            trim(adjustl(field_name)), field_2d_integer, timelevel=1)

                        if (.not. associated(field_2d_integer)) then
                            call self % model_error('Failed to find field "' // trim(adjustl(field_name)) // &
                                '"', subname, __LINE__)
                        end if

                        call mpas_dmpar_exch_halo_field(field_2d_integer)

                        nullify(field_2d_integer)
                    case (3)
                        call mpas_pool_get_field(self % domain_ptr % blocklist % allfields, &
                            trim(adjustl(field_name)), field_3d_integer, timelevel=1)

                        if (.not. associated(field_3d_integer)) then
                            call self % model_error('Failed to find field "' // trim(adjustl(field_name)) // &
                                '"', subname, __LINE__)
                        end if

                        call mpas_dmpar_exch_halo_field(field_3d_integer)

                        nullify(field_3d_integer)
                    case default
                        call self % model_error('Unsupported field rank ' // stringify([mpas_pool_field_info % ndims]), &
                            subname, __LINE__)
                end select
            case (mpas_pool_real)
                select case (mpas_pool_field_info % ndims)
                    case (1)
                        call mpas_pool_get_field(self % domain_ptr % blocklist % allfields, &
                            trim(adjustl(field_name)), field_1d_real, timelevel=1)

                        if (.not. associated(field_1d_real)) then
                            call self % model_error('Failed to find field "' // trim(adjustl(field_name)) // &
                                '"', subname, __LINE__)
                        end if

                        call mpas_dmpar_exch_halo_field(field_1d_real)

                        nullify(field_1d_real)
                    case (2)
                        call mpas_pool_get_field(self % domain_ptr % blocklist % allfields, &
                            trim(adjustl(field_name)), field_2d_real, timelevel=1)

                        if (.not. associated(field_2d_real)) then
                            call self % model_error('Failed to find field "' // trim(adjustl(field_name)) // &
                                '"', subname, __LINE__)
                        end if

                        call mpas_dmpar_exch_halo_field(field_2d_real)

                        nullify(field_2d_real)
                    case (3)
                        call mpas_pool_get_field(self % domain_ptr % blocklist % allfields, &
                            trim(adjustl(field_name)), field_3d_real, timelevel=1)

                        if (.not. associated(field_3d_real)) then
                            call self % model_error('Failed to find field "' // trim(adjustl(field_name)) // &
                                '"', subname, __LINE__)
                        end if

                        call mpas_dmpar_exch_halo_field(field_3d_real)

                        nullify(field_3d_real)
                    case (4)
                        call mpas_pool_get_field(self % domain_ptr % blocklist % allfields, &
                            trim(adjustl(field_name)), field_4d_real, timelevel=1)

                        if (.not. associated(field_4d_real)) then
                            call self % model_error('Failed to find field "' // trim(adjustl(field_name)) // &
                                '"', subname, __LINE__)
                        end if

                        call mpas_dmpar_exch_halo_field(field_4d_real)

                        nullify(field_4d_real)
                    case (5)
                        call mpas_pool_get_field(self % domain_ptr % blocklist % allfields, &
                            trim(adjustl(field_name)), field_5d_real, timelevel=1)

                        if (.not. associated(field_5d_real)) then
                            call self % model_error('Failed to find field "' // trim(adjustl(field_name)) // &
                                '"', subname, __LINE__)
                        end if

                        call mpas_dmpar_exch_halo_field(field_5d_real)

                        nullify(field_5d_real)
                    case default
                        call self % model_error('Unsupported field rank ' // stringify([mpas_pool_field_info % ndims]), &
                            subname, __LINE__)
                end select
            case default
                call self % model_error('Unsupported field type (Must be one of: integer, real)', subname, __LINE__)
        end select

        call self % debug_print(log_level_debug, subname // ' completed')
    end subroutine dyn_mpas_exchange_halo