PPM continuous edge reconstruction of a layer scalar to interfaces
(MOM6 interface_scalar with i_method=2). edge(1)=surface,
edge(nk+1)=bed in the MOM6 top-down sense (see module header on the
deferred k-flip).
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer, | intent(in) | :: | nk | |||
| real(kind=wp), | intent(in) | :: | h(nk) |
layer thicknesses |
||
| real(kind=wp), | intent(in) | :: | tr(nk) |
layer scalar (e.g. T) |
||
| real(kind=wp), | intent(out) | :: | edge(nk+1) |
interface scalar |
||
| real(kind=wp), | intent(in), | optional | :: | h_neglect |
negligible thickness (default 1e-30) |
| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| real(kind=wp), | private | :: | diff(NZ_STACK_MAX) |
fixed-size device stack (dummy-sized automatic crashes on -stdpar=gpu) |
|||
| real(kind=wp), | private | :: | hn | ||||
| integer, | private | :: | k | ||||
| integer, | private | :: | km2 | ||||
| integer, | private | :: | kp1 |
pure subroutine redi_interface_scalar(nk, h, tr, edge, h_neglect) !$acc routine seq integer, intent(in) :: nk real(wp), intent(in) :: h(nk) !! layer thicknesses real(wp), intent(in) :: tr(nk) !! layer scalar (e.g. T) real(wp), intent(out) :: edge(nk + 1) !! interface scalar real(wp), intent(in), optional :: h_neglect !! negligible thickness (default 1e-30) real(wp) :: diff(NZ_STACK_MAX) !! fixed-size device stack (dummy-sized automatic crashes on -stdpar=gpu) real(wp) :: hn integer :: k, km2, kp1 hn = 1.0e-30_wp if (present(h_neglect)) hn = h_neglect call redi_plm_diff(nk, h, tr, diff) edge(1) = tr(1) - 0.5_wp*diff(1) do k = 2, nk km2 = max(1, k - 2) kp1 = min(nk, k + 1) edge(k) = redi_ppm_edge(h(km2), h(k - 1), h(k), h(kp1), & tr(k - 1), tr(k), diff(k - 1), diff(k), hn) end do edge(nk + 1) = tr(nk) + 0.5_wp*diff(nk) end subroutine redi_interface_scalar