redi_interface_scalar Subroutine

public pure subroutine redi_interface_scalar(nk, h, tr, edge, h_neglect)

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).

Arguments

Type IntentOptional 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)


Calls

proc~~redi_interface_scalar~~CallsGraph proc~redi_interface_scalar redi_interface_scalar proc~redi_plm_diff redi_plm_diff proc~redi_interface_scalar->proc~redi_plm_diff proc~redi_ppm_edge redi_ppm_edge proc~redi_interface_scalar->proc~redi_ppm_edge proc~redi_fv_diff redi_fv_diff proc~redi_plm_diff->proc~redi_fv_diff proc~redi_signum redi_signum proc~redi_plm_diff->proc~redi_signum

Called by

proc~~redi_interface_scalar~~CalledByGraph proc~redi_interface_scalar redi_interface_scalar proc~redi_build_column redi_build_column proc~redi_build_column->proc~redi_interface_scalar proc~redi_tracer_column redi_tracer_column proc~redi_tracer_column->proc~redi_interface_scalar proc~redi_face_coeffs redi_face_coeffs proc~redi_face_coeffs->proc~redi_build_column proc~redi_face_flux redi_face_flux proc~redi_face_flux->proc~redi_tracer_column proc~redi_apply_flux_impl redi_apply_flux_impl proc~redi_apply_flux_impl->proc~redi_face_flux proc~redi_calc_coeffs_x redi_calc_coeffs_x proc~redi_calc_coeffs_x->proc~redi_face_coeffs proc~redi_calc_coeffs_y redi_calc_coeffs_y proc~redi_calc_coeffs_y->proc~redi_face_coeffs proc~redi_apply_flux redi_apply_flux proc~redi_apply_flux->proc~redi_apply_flux_impl proc~redi_calc_coeffs redi_calc_coeffs proc~redi_calc_coeffs->proc~redi_calc_coeffs_x proc~redi_calc_coeffs->proc~redi_calc_coeffs_y proc~ocean_dyn_step_split ocean_dyn_step_split proc~ocean_dyn_step_split->proc~redi_calc_coeffs proc~run_continuity_chain run_continuity_chain proc~run_continuity_chain->proc~redi_apply_flux

Variables

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

Source Code

   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