redi_fv_diff Function

private pure function redi_fv_diff(hkm1, hk, hkp1, skm1, sk, skp1) result(d)

Second-order centred finite-volume slope of a layer scalar (MOM6 fv_diff; Colella & Woodward 1984). Returns the cell-centred difference across layer k given the three layer thicknesses and values.

Arguments

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

layer thicknesses (above/centre/below)

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

layer thicknesses (above/centre/below)

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

layer thicknesses (above/centre/below)

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

layer scalar values

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

layer scalar values

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

layer scalar values

Return Value real(kind=wp)


Called by

proc~~redi_fv_diff~~CalledByGraph proc~redi_fv_diff redi_fv_diff proc~redi_plm_diff redi_plm_diff proc~redi_plm_diff->proc~redi_fv_diff proc~redi_interface_scalar redi_interface_scalar proc~redi_interface_scalar->proc~redi_plm_diff 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

Variables

Type Visibility Attributes Name Initial
real(kind=wp), private :: h_sum
real(kind=wp), private :: hm
real(kind=wp), private :: hp

Source Code

   pure function redi_fv_diff(hkm1, hk, hkp1, skm1, sk, skp1) result(d)
      !$acc routine seq
      real(wp), intent(in) :: hkm1, hk, hkp1  !! layer thicknesses (above/centre/below)
      real(wp), intent(in) :: skm1, sk, skp1  !! layer scalar values
      real(wp) :: d
      real(wp) :: h_sum, hp, hm

      h_sum = (hkm1 + hkp1) + hk
      if (h_sum /= 0.0_wp) h_sum = 1.0_wp/h_sum
      hm = hkm1 + hk
      if (hm /= 0.0_wp) hm = 1.0_wp/hm
      hp = hkp1 + hk
      if (hp /= 0.0_wp) hp = 1.0_wp/hp
      d = (hk*h_sum)*((2.0_wp*hkm1 + hk)*hp*(skp1 - sk) &
                      + (2.0_wp*hkp1 + hk)*hm*(sk - skm1))
   end function redi_fv_diff