recon_rung_for_face Function

public pure function recon_rung_for_face(avail_up, avail_down, rung_max) result(rung)

Return the highest feasible reconstruction rung for one face.

Internal rung scale (higher = more accurate): 4 = WENO9 (needs avail_up >= 5, avail_down >= 4) 3 = WENO7 (needs avail_up >= 4, avail_down >= 3) 2 = WENO5 (needs avail_up >= 3, avail_down >= 2) 1 = PLM (needs avail_up >= 2, avail_down >= 1) 0 = donor (needs avail_up >= 1) -1 = no data (should never happen at interior cells)

rung_max is the PUBLIC TRACER_RECON_* code plus one: WENO5(1) → rung_max_internal = 2 WENO7(2) → rung_max_internal = 3 WENO9(3) → rung_max_internal = 4 The kernel maps the public code to rung_max with recon + 1.

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: avail_up

Interior cells from domain-west to face (including upwind cell c).

integer, intent(in) :: avail_down

Interior cells from face downwind side to domain-east.

integer, intent(in) :: rung_max

Maximum internal rung allowed (4 = WENO9, 3 = WENO7, 2 = WENO5).

Return Value integer


Called by

proc~~recon_rung_for_face~~CalledByGraph proc~recon_rung_for_face recon_rung_for_face proc~weno_face_conc_x weno_face_conc_x proc~weno_face_conc_x->proc~recon_rung_for_face proc~weno_face_conc_y weno_face_conc_y proc~weno_face_conc_y->proc~recon_rung_for_face proc~drain_swept_flux_x_weno drain_swept_flux_x_weno proc~drain_swept_flux_x_weno->proc~weno_face_conc_x proc~drain_swept_flux_y_weno drain_swept_flux_y_weno proc~drain_swept_flux_y_weno->proc~weno_face_conc_y proc~continuity_tracer_drain continuity_tracer_drain proc~continuity_tracer_drain->proc~drain_swept_flux_x_weno proc~continuity_tracer_drain->proc~drain_swept_flux_y_weno proc~ocean_dyn_flush_tracer_window ocean_dyn_flush_tracer_window proc~ocean_dyn_flush_tracer_window->proc~continuity_tracer_drain proc~ocean_dyn_step ocean_dyn_step proc~ocean_dyn_step->proc~continuity_tracer_drain proc~ocean_dyn_step_split ocean_dyn_step_split proc~ocean_dyn_step_split->proc~continuity_tracer_drain proc~driver_run_ocean driver_run_ocean proc~driver_run_ocean->proc~ocean_dyn_flush_tracer_window proc~engine_step engine_step proc~engine_step->proc~ocean_dyn_step proc~engine_step->proc~ocean_dyn_step_split proc~rdb_ocean_set_tracer rdb_ocean_set_tracer proc~rdb_ocean_set_tracer->proc~ocean_dyn_flush_tracer_window

Source Code

   pure function recon_rung_for_face(avail_up, avail_down, rung_max) result(rung)
      !! Return the highest feasible reconstruction rung for one face.
      !!
      !! Internal rung scale (higher = more accurate):
      !!   4 = WENO9 (needs avail_up >= 5, avail_down >= 4)
      !!   3 = WENO7 (needs avail_up >= 4, avail_down >= 3)
      !!   2 = WENO5 (needs avail_up >= 3, avail_down >= 2)
      !!   1 = PLM   (needs avail_up >= 2, avail_down >= 1)
      !!   0 = donor (needs avail_up >= 1)
      !!  -1 = no data (should never happen at interior cells)
      !!
      !! rung_max is the PUBLIC TRACER_RECON_* code plus one:
      !!   WENO5(1) → rung_max_internal = 2
      !!   WENO7(2) → rung_max_internal = 3
      !!   WENO9(3) → rung_max_internal = 4
      !! The kernel maps the public code to rung_max with `recon + 1`.
      !$acc routine seq
      integer, intent(in) :: avail_up
         !! Interior cells from domain-west to face (including upwind cell c).
      integer, intent(in) :: avail_down
         !! Interior cells from face downwind side to domain-east.
      integer, intent(in) :: rung_max
         !! Maximum internal rung allowed (4 = WENO9, 3 = WENO7, 2 = WENO5).
      integer :: rung
      if (rung_max >= 4 .and. avail_up >= 5 .and. avail_down >= 4) then
         rung = 4
      else if (rung_max >= 3 .and. avail_up >= 4 .and. avail_down >= 3) then
         rung = 3
      else if (rung_max >= 2 .and. avail_up >= 3 .and. avail_down >= 2) then
         rung = 2
      else if (avail_up >= 2 .and. avail_down >= 1) then
         rung = 1
      else if (avail_up >= 1) then
         rung = 0
      else
         rung = -1
      end if
   end function recon_rung_for_face