volcfl_face Function

public pure elemental function volcfl_face(h_edge, dh, curv3, cfl) result(h_face)

MOM6 swept-volume continuity-PPM face thickness (Lin & Rood / MOM_continuity_PPM flux_elem). Integrates the donor cell’s reconstructed parabola over the swept volume rather than sampling the edge value, adding the O(CFL) correction:

h_face = h_edge + CFL·(0.5·dh + curv3·(CFL − 1.5))

h_edge is the donor’s downwind-facing PPM edge value (the CFL→0 limit), dh is the donor’s left-minus-right edge difference in the swept (upwind→downwind) orientation (MOM6 h_L − h_R for u>0, h_R_p1 − h_L_p1 for u<0), and curv3 = (h_L + h_R) − 2·h_centre is the parabola curvature measure. CFL = |u|·dt·dy_Cu·IareaT of the DONOR cell.

At CFL = 0 this returns exactly h_edge — i.e. the current CFL-free edge-value pick — so vol_cfl = .false. (which never calls this) and the CFL = 0 limit are bit-identical.

Consumer: rdb_ice_transport (sea-ice PR 4b) reuses this for the category-summed total-mass face transport — bit-for-bit SIS2’s zonal_mass_flux/meridional_mass_flux face integral (SIS_continuity.F90:1168).

Arguments

Type IntentOptional Attributes Name
real(kind=wp), intent(in) :: h_edge

downwind-facing donor PPM edge value

real(kind=wp), intent(in) :: dh

swept-oriented donor edge difference

real(kind=wp), intent(in) :: curv3

donor parabola curvature (h_L+h_R−2h)

real(kind=wp), intent(in) :: cfl

donor-cell Courant number (>= 0)

Return Value real(kind=wp)


Called by

proc~~volcfl_face~~CalledByGraph proc~volcfl_face volcfl_face proc~continuity_meridional_flux continuity_meridional_flux proc~continuity_meridional_flux->proc~volcfl_face proc~continuity_zonal_flux continuity_zonal_flux proc~continuity_zonal_flux->proc~volcfl_face proc~ice_cat_flux_x_impl ice_cat_flux_x_impl proc~ice_cat_flux_x_impl->proc~volcfl_face proc~ice_cat_flux_y_impl ice_cat_flux_y_impl proc~ice_cat_flux_y_impl->proc~volcfl_face proc~continuity_step_split continuity_step_split proc~continuity_step_split->proc~continuity_meridional_flux proc~continuity_step_split->proc~continuity_zonal_flux proc~continuity_tracer_step_split continuity_tracer_step_split proc~continuity_tracer_step_split->proc~continuity_meridional_flux proc~continuity_tracer_step_split->proc~continuity_zonal_flux proc~ice_pass_x ice_pass_x proc~ice_pass_x->proc~ice_cat_flux_x_impl proc~ice_pass_y ice_pass_y proc~ice_pass_y->proc~ice_cat_flux_y_impl proc~ice_transport_step ice_transport_step proc~ice_transport_step->proc~ice_pass_x proc~ice_transport_step->proc~ice_pass_y proc~run_continuity_chain run_continuity_chain proc~run_continuity_chain->proc~continuity_tracer_step_split proc~run_stage run_stage proc~run_stage->proc~continuity_tracer_step_split proc~engine_step_ice engine_step_ice proc~engine_step_ice->proc~ice_transport_step proc~ocean_dyn_step ocean_dyn_step proc~ocean_dyn_step->proc~run_stage proc~run_stage_split run_stage_split proc~run_stage_split->proc~run_continuity_chain proc~driver_run_ocean driver_run_ocean proc~driver_run_ocean->proc~engine_step_ice proc~engine_step engine_step proc~engine_step->proc~ocean_dyn_step proc~ocean_dyn_step_split ocean_dyn_step_split proc~ocean_dyn_step_split->proc~run_stage_split proc~rdb_ocean_step rdb_ocean_step proc~rdb_ocean_step->proc~engine_step_ice

Source Code

   pure elemental function volcfl_face(h_edge, dh, curv3, cfl) result(h_face)
      !$acc routine seq
      !! MOM6 swept-volume continuity-PPM face thickness (Lin & Rood
      !! / MOM_continuity_PPM `flux_elem`).  Integrates the donor
      !! cell's reconstructed parabola over the swept volume rather
      !! than sampling the edge value, adding the O(CFL) correction:
      !!
      !!   `h_face = h_edge + CFL·(0.5·dh + curv3·(CFL − 1.5))`
      !!
      !! `h_edge` is the donor's downwind-facing PPM edge value (the
      !! CFL→0 limit), `dh` is the donor's left-minus-right edge
      !! difference *in the swept (upwind→downwind) orientation*
      !! (MOM6 `h_L − h_R` for u>0, `h_R_p1 − h_L_p1` for u<0), and
      !! `curv3 = (h_L + h_R) − 2·h_centre` is the parabola curvature
      !! measure.  `CFL = |u|·dt·dy_Cu·IareaT` of the DONOR cell.
      !!
      !! At `CFL = 0` this returns exactly `h_edge` — i.e. the current
      !! CFL-free edge-value pick — so `vol_cfl = .false.` (which never
      !! calls this) and the `CFL = 0` limit are bit-identical.
      !!
      !! Consumer: `rdb_ice_transport` (sea-ice PR 4b) reuses this for the
      !! category-summed total-mass face transport — bit-for-bit SIS2's
      !! `zonal_mass_flux`/`meridional_mass_flux` face integral
      !! (`SIS_continuity.F90:1168`).
      real(wp), intent(in) :: h_edge  !! downwind-facing donor PPM edge value
      real(wp), intent(in) :: dh      !! swept-oriented donor edge difference
      real(wp), intent(in) :: curv3   !! donor parabola curvature (h_L+h_R−2h)
      real(wp), intent(in) :: cfl     !! donor-cell Courant number (>= 0)
      real(wp) :: h_face
      h_face = h_edge + cfl*(0.5_wp*dh + curv3*(cfl - 1.5_wp))
   end function volcfl_face