dyn_mpas_compute_edge_wind Subroutine

private subroutine dyn_mpas_compute_edge_wind(self, wind_tendency)

This subroutine computes the edge-normal wind vectors at edge points (i.e., the "u" variable in MPAS "state" pool) from the wind components at cell points (i.e., the "uReconstruct{Zonal,Meridional}" variables in MPAS "diag" pool). In MPAS, the former are PROGNOSTIC variables, while the latter are DIAGNOSTIC variables that are "reconstructed" from the former. This subroutine is essentially the inverse function of that reconstruction. The purpose is to provide an alternative way for MPAS to initialize from zonal and meridional wind components at cell points. If wind_tendency is .true., this subroutine operates on the wind tendency due to physics instead. Ported and refactored for CAM-SIMA. (KCW, 2024-05-08)

Type Bound

mpas_dynamical_core_type

Arguments

Type IntentOptional Attributes Name
class(mpas_dynamical_core_type), intent(in) :: self
logical, intent(in) :: wind_tendency

Calls

proc~~dyn_mpas_compute_edge_wind~~CallsGraph proc~dyn_mpas_compute_edge_wind mpas_dynamical_core_type%dyn_mpas_compute_edge_wind none~get_variable_pointer mpas_dynamical_core_type%get_variable_pointer proc~dyn_mpas_compute_edge_wind->none~get_variable_pointer proc~dyn_mpas_debug_print mpas_dynamical_core_type%dyn_mpas_debug_print proc~dyn_mpas_compute_edge_wind->proc~dyn_mpas_debug_print proc~dyn_mpas_exchange_halo mpas_dynamical_core_type%dyn_mpas_exchange_halo proc~dyn_mpas_compute_edge_wind->proc~dyn_mpas_exchange_halo proc~dyn_mpas_get_variable_pointer_c0 mpas_dynamical_core_type%dyn_mpas_get_variable_pointer_c0 none~get_variable_pointer->proc~dyn_mpas_get_variable_pointer_c0 proc~dyn_mpas_get_variable_pointer_c1 mpas_dynamical_core_type%dyn_mpas_get_variable_pointer_c1 none~get_variable_pointer->proc~dyn_mpas_get_variable_pointer_c1 proc~dyn_mpas_get_variable_pointer_i0 mpas_dynamical_core_type%dyn_mpas_get_variable_pointer_i0 none~get_variable_pointer->proc~dyn_mpas_get_variable_pointer_i0 proc~dyn_mpas_get_variable_pointer_i1 mpas_dynamical_core_type%dyn_mpas_get_variable_pointer_i1 none~get_variable_pointer->proc~dyn_mpas_get_variable_pointer_i1 proc~dyn_mpas_get_variable_pointer_i2 mpas_dynamical_core_type%dyn_mpas_get_variable_pointer_i2 none~get_variable_pointer->proc~dyn_mpas_get_variable_pointer_i2 proc~dyn_mpas_get_variable_pointer_i3 mpas_dynamical_core_type%dyn_mpas_get_variable_pointer_i3 none~get_variable_pointer->proc~dyn_mpas_get_variable_pointer_i3 proc~dyn_mpas_get_variable_pointer_l0 mpas_dynamical_core_type%dyn_mpas_get_variable_pointer_l0 none~get_variable_pointer->proc~dyn_mpas_get_variable_pointer_l0 proc~dyn_mpas_get_variable_pointer_r0 mpas_dynamical_core_type%dyn_mpas_get_variable_pointer_r0 none~get_variable_pointer->proc~dyn_mpas_get_variable_pointer_r0 proc~dyn_mpas_get_variable_pointer_r1 mpas_dynamical_core_type%dyn_mpas_get_variable_pointer_r1 none~get_variable_pointer->proc~dyn_mpas_get_variable_pointer_r1 proc~dyn_mpas_get_variable_pointer_r2 mpas_dynamical_core_type%dyn_mpas_get_variable_pointer_r2 none~get_variable_pointer->proc~dyn_mpas_get_variable_pointer_r2 proc~dyn_mpas_get_variable_pointer_r3 mpas_dynamical_core_type%dyn_mpas_get_variable_pointer_r3 none~get_variable_pointer->proc~dyn_mpas_get_variable_pointer_r3 proc~dyn_mpas_get_variable_pointer_r4 mpas_dynamical_core_type%dyn_mpas_get_variable_pointer_r4 none~get_variable_pointer->proc~dyn_mpas_get_variable_pointer_r4 proc~dyn_mpas_get_variable_pointer_r5 mpas_dynamical_core_type%dyn_mpas_get_variable_pointer_r5 none~get_variable_pointer->proc~dyn_mpas_get_variable_pointer_r5 proc~stringify stringify proc~dyn_mpas_debug_print->proc~stringify proc~dyn_mpas_exchange_halo->proc~dyn_mpas_debug_print 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_exchange_halo->proc~stringify mpas_pool_get_array mpas_pool_get_array proc~dyn_mpas_get_variable_pointer_c0->mpas_pool_get_array mpas_pool_get_config mpas_pool_get_config proc~dyn_mpas_get_variable_pointer_c0->mpas_pool_get_config proc~dyn_mpas_get_pool_pointer mpas_dynamical_core_type%dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_c0->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_c1->mpas_pool_get_array proc~dyn_mpas_get_variable_pointer_c1->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_i0->mpas_pool_get_array proc~dyn_mpas_get_variable_pointer_i0->mpas_pool_get_config mpas_pool_get_dimension mpas_pool_get_dimension proc~dyn_mpas_get_variable_pointer_i0->mpas_pool_get_dimension proc~dyn_mpas_get_variable_pointer_i0->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_i1->mpas_pool_get_array proc~dyn_mpas_get_variable_pointer_i1->mpas_pool_get_dimension proc~dyn_mpas_get_variable_pointer_i1->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_i2->mpas_pool_get_array proc~dyn_mpas_get_variable_pointer_i2->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_i3->mpas_pool_get_array proc~dyn_mpas_get_variable_pointer_i3->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_l0->mpas_pool_get_config proc~dyn_mpas_get_variable_pointer_l0->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_r0->mpas_pool_get_array proc~dyn_mpas_get_variable_pointer_r0->mpas_pool_get_config proc~dyn_mpas_get_variable_pointer_r0->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_r1->mpas_pool_get_array proc~dyn_mpas_get_variable_pointer_r1->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_r2->mpas_pool_get_array proc~dyn_mpas_get_variable_pointer_r2->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_r3->mpas_pool_get_array proc~dyn_mpas_get_variable_pointer_r3->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_r4->mpas_pool_get_array proc~dyn_mpas_get_variable_pointer_r4->proc~dyn_mpas_get_pool_pointer proc~dyn_mpas_get_variable_pointer_r5->mpas_pool_get_array proc~dyn_mpas_get_variable_pointer_r5->proc~dyn_mpas_get_pool_pointer mpas_pool_get_subpool mpas_pool_get_subpool proc~dyn_mpas_get_pool_pointer->mpas_pool_get_subpool

Called by

proc~~dyn_mpas_compute_edge_wind~~CalledByGraph proc~dyn_mpas_compute_edge_wind mpas_dynamical_core_type%dyn_mpas_compute_edge_wind 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 proc~physics_to_dynamics_coupling physics_to_dynamics_coupling proc~physics_to_dynamics_coupling->none~set_mpas_physics_tendency_ru proc~set_analytic_initial_condition set_analytic_initial_condition proc~set_analytic_initial_condition->none~set_mpas_state_u proc~dyn_init dyn_init proc~dyn_init->proc~set_analytic_initial_condition proc~stepon_run2 stepon_run2 proc~stepon_run2->proc~physics_to_dynamics_coupling

Variables

Type Visibility Attributes Name Initial
integer, private :: cell1
integer, private :: cell2
integer, private, pointer :: cellsonedge(:,:)
real(kind=rkind), private, pointer :: east(:,:)
real(kind=rkind), private, pointer :: edgenormalvectors(:,:)
integer, private :: i
integer, private, pointer :: nedges
real(kind=rkind), private, pointer :: north(:,:)
character(len=*), private, parameter :: subname = 'dyn_mpas_subdriver::dyn_mpas_compute_edge_wind'
real(kind=rkind), private, pointer :: ucellmeridional(:,:)
real(kind=rkind), private, pointer :: ucellzonal(:,:)
real(kind=rkind), private, pointer :: uedge(:,:)

Source Code

    subroutine dyn_mpas_compute_edge_wind(self, wind_tendency)
        class(mpas_dynamical_core_type), intent(in) :: self
        logical, intent(in) :: wind_tendency

        character(*), parameter :: subname = 'dyn_mpas_subdriver::dyn_mpas_compute_edge_wind'
        integer :: cell1, cell2, i
        integer, pointer :: cellsonedge(:, :)
        integer, pointer :: nedges
        real(rkind), pointer :: east(:, :), north(:, :)
        real(rkind), pointer :: edgenormalvectors(:, :)
        real(rkind), pointer :: ucellzonal(:, :), ucellmeridional(:, :)
        real(rkind), pointer :: uedge(:, :)

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

        nullify(nedges)

        nullify(ucellzonal, ucellmeridional)

        nullify(cellsonedge)
        nullify(east, north)
        nullify(edgenormalvectors)

        nullify(uedge)

        ! Make sure halo layers are up-to-date before computation.
        if (wind_tendency) then
            call self % exchange_halo('tend_uzonal')
            call self % exchange_halo('tend_umerid')
        else
            call self % exchange_halo('uReconstructZonal')
            call self % exchange_halo('uReconstructMeridional')
        end if

        ! Input.
        call self % get_variable_pointer(nedges, 'dim', 'nEdges')

        if (wind_tendency) then
            call self % get_variable_pointer(ucellzonal, 'tend_physics', 'tend_uzonal')
            call self % get_variable_pointer(ucellmeridional, 'tend_physics', 'tend_umerid')
        else
            call self % get_variable_pointer(ucellzonal, 'diag', 'uReconstructZonal')
            call self % get_variable_pointer(ucellmeridional, 'diag', 'uReconstructMeridional')
        end if

        call self % get_variable_pointer(cellsonedge, 'mesh', 'cellsOnEdge')
        call self % get_variable_pointer(east, 'mesh', 'east')
        call self % get_variable_pointer(north, 'mesh', 'north')
        call self % get_variable_pointer(edgenormalvectors, 'mesh', 'edgeNormalVectors')

        ! Output.
        if (wind_tendency) then
            call self % get_variable_pointer(uedge, 'tend_physics', 'tend_ru_physics')
        else
            call self % get_variable_pointer(uedge, 'state', 'u', time_level=1)
        end if

        if (wind_tendency) then
            call self % debug_print(log_level_info, 'Computing edge-normal wind tendency vectors')
        else
            call self % debug_print(log_level_info, 'Computing edge-normal wind vectors')
        end if

        do i = 1, nedges
            cell1 = cellsonedge(1, i)
            cell2 = cellsonedge(2, i)

            uedge(:, i) = ucellzonal(:, cell1) * 0.5_rkind * (edgenormalvectors(1, i) * east(1, cell1)  + &
                                                              edgenormalvectors(2, i) * east(2, cell1)  + &
                                                              edgenormalvectors(3, i) * east(3, cell1)) + &
                          ucellmeridional(:, cell1) * 0.5_rkind * (edgenormalvectors(1, i) * north(1, cell1)  + &
                                                                   edgenormalvectors(2, i) * north(2, cell1)  + &
                                                                   edgenormalvectors(3, i) * north(3, cell1)) + &
                          ucellzonal(:, cell2) * 0.5_rkind * (edgenormalvectors(1, i) * east(1, cell2)  + &
                                                              edgenormalvectors(2, i) * east(2, cell2)  + &
                                                              edgenormalvectors(3, i) * east(3, cell2)) + &
                          ucellmeridional(:, cell2) * 0.5_rkind * (edgenormalvectors(1, i) * north(1, cell2)  + &
                                                                   edgenormalvectors(2, i) * north(2, cell2)  + &
                                                                   edgenormalvectors(3, i) * north(3, cell2))
        end do

        nullify(nedges)

        nullify(ucellzonal, ucellmeridional)

        nullify(cellsonedge)
        nullify(east, north)
        nullify(edgenormalvectors)

        nullify(uedge)

        ! Make sure halo layers are up-to-date after computation.
        if (wind_tendency) then
            call self % exchange_halo('tend_ru_physics')
        else
            call self % exchange_halo('u')
        end if

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