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