ppm_jump_nonuniform Subroutine

private pure subroutine ppm_jump_nonuniform(h_l, h_c, h_r, q_l, q_c, q_r, dq)

Colella & Woodward (1984) eq (1.7) — the thickness-weighted second-order jump delta a across the cell, which eq (1.6) consumes. Returned UNLIMITED, deliberately.

CW84 feeds (1.6) the (1.8)-limited delta_m a, and MOM6’s explicit H4 edge estimate does not limit either. Here the unlimited estimate is the right choice for two reasons: the Colella-Woodward limiter this module already runs over the assembled edges (step 2 of remap_column_ppm) does that job downstream, and leaving (1.7) unlimited is what makes the whole non-uniform path reduce EXACTLY to the shipped (7/12, -1/12) estimate on an equal-thickness column, for ANY profile rather than only for a monotone one. That is the property that bounds how far a shipped answer can move when the knob is switched on: only by the non-uniformity it was introduced to fix.

Arguments

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

Thickness of the cell below.

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

Thickness of this cell.

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

Thickness of the cell above.

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

Cell mean below.

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

Cell mean here.

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

Cell mean above.

real(kind=wp), intent(out) :: dq

Full jump across the cell.


Called by

proc~~ppm_jump_nonuniform~~CalledByGraph proc~ppm_jump_nonuniform ppm_jump_nonuniform proc~remap_column_ppm remap_column_ppm proc~remap_column_ppm->proc~ppm_jump_nonuniform proc~remap_column remap_column proc~remap_column->proc~remap_column_ppm proc~remap_column_pqm remap_column_pqm proc~remap_column->proc~remap_column_pqm proc~remap_column_pqm->proc~remap_column_ppm proc~ocean_remap_tracer_column ocean_remap_tracer_column proc~ocean_remap_tracer_column->proc~remap_column proc~ocean_remap_tracer_field ocean_remap_tracer_field proc~ocean_remap_tracer_field->proc~remap_column proc~remap_layer_to_density_impl remap_layer_to_density_impl proc~remap_layer_to_density_impl->proc~remap_column proc~remap_layer_to_vcoord_impl remap_layer_to_vcoord_impl proc~remap_layer_to_vcoord_impl->proc~remap_column proc~remap_tracer_grounded remap_tracer_grounded proc~remap_tracer_grounded->proc~remap_column proc~remap_x_face_grounded remap_x_face_grounded proc~remap_x_face_grounded->proc~remap_column proc~remap_x_face_velocity remap_x_face_velocity proc~remap_x_face_velocity->proc~remap_column proc~remap_y_face_grounded remap_y_face_grounded proc~remap_y_face_grounded->proc~remap_column proc~remap_y_face_velocity remap_y_face_velocity proc~remap_y_face_velocity->proc~remap_column proc~ocean_apply_ale_remap_centres ocean_apply_ale_remap_centres proc~ocean_apply_ale_remap_centres->proc~ocean_remap_tracer_field proc~ocean_apply_ale_remap_faces ocean_apply_ale_remap_faces proc~ocean_apply_ale_remap_faces->proc~remap_x_face_velocity proc~ocean_apply_ale_remap_faces->proc~remap_y_face_velocity proc~ocean_apply_ale_remap_step ocean_apply_ale_remap_step proc~ocean_apply_ale_remap_step->proc~ocean_remap_tracer_field proc~ocean_apply_ale_remap_step->proc~remap_x_face_velocity proc~ocean_apply_ale_remap_step->proc~remap_y_face_velocity proc~ocean_apply_conservative_min_thickness ocean_apply_conservative_min_thickness proc~ocean_apply_conservative_min_thickness->proc~remap_tracer_grounded proc~ocean_apply_conservative_min_thickness->proc~remap_x_face_grounded proc~ocean_apply_conservative_min_thickness->proc~remap_y_face_grounded proc~remap_layer_to_density remap_layer_to_density proc~remap_layer_to_density->proc~remap_layer_to_density_impl proc~remap_layer_to_sigma remap_layer_to_sigma proc~remap_layer_to_sigma->proc~remap_layer_to_vcoord_impl proc~remap_layer_to_z remap_layer_to_z proc~remap_layer_to_z->proc~remap_layer_to_vcoord_impl proc~remap_layer_to_zstar remap_layer_to_zstar proc~remap_layer_to_zstar->proc~remap_layer_to_vcoord_impl proc~ocean_dyn_step_split ocean_dyn_step_split proc~ocean_dyn_step_split->proc~ocean_apply_ale_remap_step proc~run_continuity_chain run_continuity_chain proc~run_continuity_chain->proc~ocean_apply_conservative_min_thickness

Source Code

   pure subroutine ppm_jump_nonuniform(h_l, h_c, h_r, q_l, q_c, q_r, dq)
      !$acc routine seq
      !! Colella & Woodward (1984) eq (1.7) — the thickness-weighted
      !! second-order jump `delta a` across the cell, which eq (1.6)
      !! consumes.  Returned UNLIMITED, deliberately.
      !!
      !! CW84 feeds (1.6) the (1.8)-limited `delta_m a`, and MOM6's explicit
      !! H4 edge estimate does not limit either.  Here the unlimited estimate
      !! is the right choice for two reasons: the Colella-Woodward limiter
      !! this module already runs over the assembled edges (step 2 of
      !! `remap_column_ppm`) does that job downstream, and leaving (1.7)
      !! unlimited is what makes the whole non-uniform path reduce EXACTLY to
      !! the shipped `(7/12, -1/12)` estimate on an equal-thickness column,
      !! for ANY profile rather than only for a monotone one.  That is the
      !! property that bounds how far a shipped answer can move when the knob
      !! is switched on: only by the non-uniformity it was introduced to fix.
      real(wp), intent(in) :: h_l
         !! Thickness of the cell below.
      real(wp), intent(in) :: h_c
         !! Thickness of this cell.
      real(wp), intent(in) :: h_r
         !! Thickness of the cell above.
      real(wp), intent(in) :: q_l
         !! Cell mean below.
      real(wp), intent(in) :: q_c
         !! Cell mean here.
      real(wp), intent(in) :: q_r
         !! Cell mean above.
      real(wp), intent(out) :: dq
         !! Full jump across the cell.

      dq = (h_c/(h_l + h_c + h_r + H_DIV_EPS))* &
           ((2.0_wp*h_l + h_c)/(h_c + h_r + H_DIV_EPS)*(q_r - q_c) &
            + (h_c + 2.0_wp*h_r)/(h_l + h_c + H_DIV_EPS)*(q_c - q_l))
   end subroutine ppm_jump_nonuniform