Set south and north wall-face per-layer v. Mirror of
apply_zonal_baroclinic for the y-direction.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| real(kind=wp), | intent(inout) | :: | v_layer(nx_total,ny_total+1,nz) |
v_face_y_layer, shape (nx_total, ny_total+1, nz). |
||
| real(kind=wp), | intent(in) | :: | h_layer(nx_total,ny_total,nz) | |||
| real(kind=wp), | intent(in) | :: | vbt_end(nx_total,ny_total+1) | |||
| integer, | intent(in) | :: | nx_total | |||
| integer, | intent(in) | :: | ny_total | |||
| integer, | intent(in) | :: | nz | |||
| integer, | intent(in) | :: | i0 |
first / last physical i-cell |
||
| integer, | intent(in) | :: | i1 |
first / last physical i-cell |
||
| integer, | intent(in) | :: | j_s |
south / north physical wall-face indices |
||
| integer, | intent(in) | :: | j_n |
south / north physical wall-face indices |
||
| integer, | intent(in) | :: | bc_s | |||
| integer, | intent(in) | :: | bc_n | |||
| real(kind=wp), | intent(in) | :: | clamp_v_s | |||
| real(kind=wp), | intent(in) | :: | clamp_v_n |
| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| real(kind=wp), | private | :: | h_tot | ||||
| integer, | private | :: | i | ||||
| integer, | private | :: | j_int_n | ||||
| integer, | private | :: | j_int_s | ||||
| integer, | private | :: | k | ||||
| real(kind=wp), | private | :: | v_bar | ||||
| real(kind=wp), | private | :: | v_int |
pure subroutine apply_meridional_baroclinic(v_layer, h_layer, vbt_end, & nx_total, ny_total, nz, & i0, i1, j_s, j_n, & bc_s, bc_n, clamp_v_s, clamp_v_n) !! Set south and north wall-face per-layer v. Mirror of !! `apply_zonal_baroclinic` for the y-direction. integer, intent(in) :: nx_total, ny_total, nz real(wp), intent(inout) :: v_layer(nx_total, ny_total + 1, nz) !! v_face_y_layer, shape (nx_total, ny_total+1, nz). real(wp), intent(in) :: h_layer(nx_total, ny_total, nz) real(wp), intent(in) :: vbt_end(nx_total, ny_total + 1) integer, intent(in) :: i0, i1 !! first / last physical i-cell integer, intent(in) :: j_s, j_n !! south / north physical wall-face indices integer, intent(in) :: bc_s, bc_n real(wp), intent(in) :: clamp_v_s, clamp_v_n integer :: i, k real(wp) :: h_tot, v_bar, v_int integer :: j_int_s, j_int_n j_int_s = j_s + 1 j_int_n = j_n - 1 ! ---- South wall ---- if (bc_s == OBC_CLAMPED) then do concurrent(k=1:nz, i=i0:i1) v_layer(i, j_s, k) = clamp_v_s end do else if (is_radiating(bc_s)) then do concurrent(i=i0:i1) local(k, h_tot, v_bar, v_int) h_tot = 0.0_wp v_bar = 0.0_wp do k = 1, nz h_tot = h_tot + h_layer(i, j_s, k) v_bar = v_bar + v_layer(i, j_int_s, k)*h_layer(i, j_s, k) end do if (h_tot > 0.0_wp) then v_bar = v_bar/h_tot else v_bar = 0.0_wp end if do k = 1, nz v_int = v_layer(i, j_int_s, k) v_layer(i, j_s, k) = vbt_end(i, j_s) + (v_int - v_bar) end do end do end if ! ---- North wall ---- if (bc_n == OBC_CLAMPED) then do concurrent(k=1:nz, i=i0:i1) v_layer(i, j_n, k) = clamp_v_n end do else if (is_radiating(bc_n)) then do concurrent(i=i0:i1) local(k, h_tot, v_bar, v_int) h_tot = 0.0_wp v_bar = 0.0_wp do k = 1, nz h_tot = h_tot + h_layer(i, j_n - 1, k) v_bar = v_bar + v_layer(i, j_int_n, k)*h_layer(i, j_n - 1, k) end do if (h_tot > 0.0_wp) then v_bar = v_bar/h_tot else v_bar = 0.0_wp end if do k = 1, nz v_int = v_layer(i, j_int_n, k) v_layer(i, j_n, k) = vbt_end(i, j_n) + (v_int - v_bar) end do end do end if end subroutine apply_meridional_baroclinic