redi_sublayer_dT Function

private pure function redi_sublayer_dT(nz, klt, klb, krt, krb, PoLt, PoLb, PoRt, PoRb, TlL, TiL, aLL, aRL, TlR, TiR, aLR, aRR) result(dT)

Along-neutral tracer difference for one sublayer (MOM6 neutral_surface_flux continuous branch). TOP-DOWN layer indices (klt/klb = KoL at the surface/bed bound of the sublayer; krt/krb mirror) and fractional positions. Returns dT_layer when the top/bottom/ave/layer triad is sign-consistent, else 0 (the down-gradient guard that prevents up-gradient transport).

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: nz
integer, intent(in) :: klt
integer, intent(in) :: klb
integer, intent(in) :: krt
integer, intent(in) :: krb
real(kind=wp), intent(in) :: PoLt
real(kind=wp), intent(in) :: PoLb
real(kind=wp), intent(in) :: PoRt
real(kind=wp), intent(in) :: PoRb
real(kind=wp), intent(in) :: TlL(NZ_STACK_MAX)
real(kind=wp), intent(in) :: TiL(NZ_STACK_MAX+1)
real(kind=wp), intent(in) :: aLL(NZ_STACK_MAX)
real(kind=wp), intent(in) :: aRL(NZ_STACK_MAX)
real(kind=wp), intent(in) :: TlR(NZ_STACK_MAX)
real(kind=wp), intent(in) :: TiR(NZ_STACK_MAX+1)
real(kind=wp), intent(in) :: aLR(NZ_STACK_MAX)
real(kind=wp), intent(in) :: aRR(NZ_STACK_MAX)

Return Value real(kind=wp)


Calls

proc~~redi_sublayer_dt~~CallsGraph proc~redi_sublayer_dt redi_sublayer_dT proc~redi_ppm_ave redi_ppm_ave proc~redi_sublayer_dt->proc~redi_ppm_ave proc~redi_signum1 redi_signum1 proc~redi_sublayer_dt->proc~redi_signum1

Called by

proc~~redi_sublayer_dt~~CalledByGraph proc~redi_sublayer_dt redi_sublayer_dT proc~redi_face_flux redi_face_flux proc~redi_face_flux->proc~redi_sublayer_dt proc~redi_apply_flux_impl redi_apply_flux_impl proc~redi_apply_flux_impl->proc~redi_face_flux proc~redi_apply_flux redi_apply_flux proc~redi_apply_flux->proc~redi_apply_flux_impl proc~run_continuity_chain run_continuity_chain proc~run_continuity_chain->proc~redi_apply_flux proc~run_stage_split run_stage_split proc~run_stage_split->proc~run_continuity_chain

Variables

Type Visibility Attributes Name Initial
real(kind=wp), private :: dT_ave
real(kind=wp), private :: dT_bot
real(kind=wp), private :: dT_layer
real(kind=wp), private :: dT_top
real(kind=wp), private :: tlay
real(kind=wp), private :: tlb
real(kind=wp), private :: tlt
real(kind=wp), private :: trb
real(kind=wp), private :: trlay
real(kind=wp), private :: trt

Source Code

   pure function redi_sublayer_dT(nz, klt, klb, krt, krb, &
                                  PoLt, PoLb, PoRt, PoRb, &
                                  TlL, TiL, aLL, aRL, TlR, TiR, aLR, aRR) result(dT)
      !$acc routine seq
      !! Along-neutral tracer difference for one sublayer (MOM6
      !! neutral_surface_flux continuous branch).  TOP-DOWN layer indices
      !! (klt/klb = KoL at the surface/bed bound of the sublayer; krt/krb
      !! mirror) and fractional positions.  Returns dT_layer when the
      !! top/bottom/ave/layer triad is sign-consistent, else 0 (the
      !! down-gradient guard that prevents up-gradient transport).
      integer, intent(in) :: nz, klt, klb, krt, krb
      real(wp), intent(in) :: PoLt, PoLb, PoRt, PoRb
      real(wp), intent(in) :: TlL(NZ_STACK_MAX), TiL(NZ_STACK_MAX + 1), aLL(NZ_STACK_MAX), aRL(NZ_STACK_MAX)
      real(wp), intent(in) :: TlR(NZ_STACK_MAX), TiR(NZ_STACK_MAX + 1), aLR(NZ_STACK_MAX), aRR(NZ_STACK_MAX)
      real(wp) :: dT
      real(wp) :: tlt, tlb, trt, trb, tlay, trlay, dT_top, dT_bot, dT_ave, dT_layer
      tlt = (1.0_wp - PoLt)*TiL(klt) + PoLt*TiL(klt + 1)
      tlb = (1.0_wp - PoLb)*TiL(klb) + PoLb*TiL(klb + 1)
      trt = (1.0_wp - PoRt)*TiR(krt) + PoRt*TiR(krt + 1)
      trb = (1.0_wp - PoRb)*TiR(krb) + PoRb*TiR(krb + 1)
      tlay = redi_ppm_ave(PoLt, PoLb + real(klb - klt, wp), aLL(klt), aRL(klt), TlL(klt))
      trlay = redi_ppm_ave(PoRt, PoRb + real(krb - krt, wp), aLR(krt), aRR(krt), TlR(krt))
      dT_top = trt - tlt
      dT_bot = trb - tlb
      dT_ave = 0.5_wp*(dT_top + dT_bot)
      dT_layer = trlay - tlay
      if (redi_signum1(dT_top)*redi_signum1(dT_bot) <= 0.0_wp .or. &
          redi_signum1(dT_ave)*redi_signum1(dT_layer) <= 0.0_wp) then
         dT = 0.0_wp
      else
         dT = dT_layer
      end if
   end function redi_sublayer_dT