call perf_start('interp_pv_upwind')
associate (mesh => block%mesh , &
un => dstate%u_lon , & ! in
vn => dstate%v_lat , & ! in
ut => block%aux%u_lat , & ! in
vt => block%aux%v_lon , & ! in
pv => block%aux%pv , & ! in
pv_lon => block%aux%pv_lon, & ! out
pv_lat => block%aux%pv_lat) ! out
select case (upwind_order_pv)
case (1)
do k = mesh%full_kds, mesh%full_kde
do j = mesh%full_jds_no_pole, mesh%full_jde_no_pole
do i = mesh%half_ids, mesh%half_ide
b = abs(vt%d(i,j,k)) / (sqrt(un%d(i,j,k)**2 + vt%d(i,j,k)**2) + eps)
pv_lon%d(i,j,k) = b * upwind1(sign(1.0_r8, vt%d(i,j,k)), upwind_wgt_pv, pv%d(i,j-1:j,k)) + &
(1 - b) * 0.5_r8 * (pv%d(i,j-1,k) + pv%d(i,j,k))
end do
end do
do j = mesh%half_jds, mesh%half_jde
do i = mesh%full_ids, mesh%full_ide
b = abs(ut%d(i,j,k)) / (sqrt(ut%d(i,j,k)**2 + vn%d(i,j,k)**2) + eps)
pv_lat%d(i,j,k) = b * upwind1(sign(1.0_r8, ut%d(i,j,k)), upwind_wgt_pv, pv%d(i-1:i,j,k)) + &
(1 - b) * 0.5_r8 * (pv%d(i-1,j,k) + pv%d(i,j,k))
end do
end do
end do
case (3)
do k = mesh%full_kds, mesh%full_kde
do j = mesh%full_jds_no_pole, mesh%full_jde_no_pole
do i = mesh%half_ids, mesh%half_ide
b = abs(vt%d(i,j,k)) / (sqrt(un%d(i,j,k)**2 + vt%d(i,j,k)**2) + eps)
pv_lon%d(i,j,k) = b * upwind3(sign(1.0_r8, vt%d(i,j,k)), upwind_wgt_pv, pv%d(i,j-2:j+1,k)) + &
(1 - b) * 0.5_r8 * (pv%d(i,j-1,k) + pv%d(i,j,k))
end do
end do
do j = mesh%half_jds, mesh%half_jde
do i = mesh%full_ids, mesh%full_ide
b = abs(ut%d(i,j,k)) / (sqrt(ut%d(i,j,k)**2 + vn%d(i,j,k)**2) + eps)
pv_lat%d(i,j,k) = b * upwind3(sign(1.0_r8, ut%d(i,j,k)), upwind_wgt_pv, pv%d(i-2:i+1,j,k)) + &
(1 - b) * 0.5_r8 * (pv%d(i-1,j,k) + pv%d(i,j,k))
end do
end do
end do
case (5)
do k = mesh%full_kds, mesh%full_kde
do j = mesh%full_jds_no_pole, mesh%full_jde_no_pole
do i = mesh%half_ids, mesh%half_ide
b = abs(vt%d(i,j,k)) / (sqrt(un%d(i,j,k)**2 + vt%d(i,j,k)**2) + eps)
pv_lon%d(i,j,k) = b * upwind5(sign(1.0_r8, vt%d(i,j,k)), upwind_wgt_pv, pv%d(i,j-3:j+2,k)) + &
(1 - b) * 0.5_r8 * (pv%d(i,j-1,k) + pv%d(i,j,k))
end do
end do
do j = mesh%half_jds, mesh%half_jde
do i = mesh%full_ids, mesh%full_ide
b = abs(ut%d(i,j,k)) / (sqrt(ut%d(i,j,k)**2 + vn%d(i,j,k)**2) + eps)
pv_lat%d(i,j,k) = b * upwind5(sign(1.0_r8, ut%d(i,j,k)), upwind_wgt_pv, pv%d(i-3:i+2,j,k)) + &
(1 - b) * 0.5_r8 * (pv%d(i-1,j,k) + pv%d(i,j,k))
end do
end do
end do
end select
call fill_halo(pv_lon, east_halo=.false., south_halo=.false.)
call fill_halo(pv_lat, west_halo=.false., north_halo=.false.)
end associate
call perf_stop('interp_pv_upwind')
Funcion name:
subroutine interp_pv_upwind(block, dstate, dt, substep)
This function costs a lot in swm_xxx.
Mainly because these loops (Line 910-967):