epbl_lf17_wave_state Subroutine

public pure subroutine epbl_lf17_wave_state(ustar_w, rho_ocn, u10, ustokes, kphil)

LF17 statistical wave state from the water-side friction velocity alone: COARE 3.5 fixed-point inversion u* -> U10 (Edson et al. 2013), then the Pierson-Moskowitz-based surface Stokes drift and Phillips peak wavenumber (Li & Fox-Kemper 2017; Breivik et al. 2016). BLD-independent — call once per column, outside the MLD iteration.

Arguments

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

Water-side u* (m/s), > 0 (caller floors it).

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

Seawater reference density (kg/m^3).

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

10-m wind speed (m/s).

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

Surface Stokes drift (m/s).

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

Phillips-spectrum peak wavenumber (1/m).


Called by

proc~~epbl_lf17_wave_state~~CalledByGraph proc~epbl_lf17_wave_state epbl_lf17_wave_state proc~epbl_column_kernel epbl_column_kernel proc~epbl_column_kernel->proc~epbl_lf17_wave_state proc~epbl_compute epbl_compute proc~epbl_compute->proc~epbl_column_kernel proc~vmix_apply_in_stage vmix_apply_in_stage proc~vmix_apply_in_stage->proc~epbl_compute proc~run_stage run_stage proc~run_stage->proc~vmix_apply_in_stage proc~run_stage_split run_stage_split proc~run_stage_split->proc~vmix_apply_in_stage proc~ocean_dyn_step ocean_dyn_step proc~ocean_dyn_step->proc~run_stage proc~ocean_dyn_step_split ocean_dyn_step_split proc~ocean_dyn_step_split->proc~run_stage_split

Variables

Type Visibility Attributes Name Initial
real(kind=wp), private :: alpha_ch
logical, private :: converged
real(kind=wp), private :: f_mean
real(kind=wp), private :: hm0
integer, private :: itt
real(kind=wp), private :: u10_new
real(kind=wp), private :: ustar_air
real(kind=wp), private :: vstokes
real(kind=wp), private :: z0_smooth
real(kind=wp), private :: z0w

Source Code

   pure subroutine epbl_lf17_wave_state(ustar_w, rho_ocn, u10, ustokes, kphil)
      !! LF17 statistical wave state from the water-side friction
      !! velocity alone: COARE 3.5 fixed-point inversion u* -> U10
      !! (Edson et al. 2013), then the Pierson-Moskowitz-based
      !! surface Stokes drift and Phillips peak wavenumber (Li &
      !! Fox-Kemper 2017; Breivik et al. 2016).  BLD-independent —
      !! call once per column, outside the MLD iteration.
      !$acc routine seq
      real(wp), intent(in) :: ustar_w
         !! Water-side u* (m/s), > 0 (caller floors it).
      real(wp), intent(in) :: rho_ocn
         !! Seawater reference density (kg/m^3).
      real(wp), intent(out) :: u10
         !! 10-m wind speed (m/s).
      real(wp), intent(out) :: ustokes
         !! Surface Stokes drift (m/s).
      real(wp), intent(out) :: kphil
         !! Phillips-spectrum peak wavenumber (1/m).

      real(wp) :: ustar_air, z0_smooth, z0w, alpha_ch, u10_new
      real(wp) :: hm0, f_mean, vstokes
      integer :: itt
      logical :: converged

      ustar_air = ustar_w*sqrt(rho_ocn/LT_RHO_AIR)
      z0_smooth = 0.11_wp*LT_NU_AIR/ustar_air
      u10 = ustar_air*sqrt(1000.0_wp)
      converged = .false.
      do itt = 1, 20
         alpha_ch = min(LT_CHARNOCK_MIN, LT_CHARNOCK_SLOPE*u10 + LT_CHARNOCK_ICPT)
         ! alpha can go negative below U10 ~ 3 m/s; clamp z0 positive
         ! before the log.
         z0w = max(z0_smooth + alpha_ch*ustar_air**2/GRAVITY, 1.0e-10_wp)
         u10_new = ustar_air*log(10.0_wp/z0w)/LT_VONKAR_WAVES
         if (abs(u10_new - u10) <= 1.0e-3_wp*u10) then
            u10 = u10_new
            converged = .true.
            exit
         end if
         u10 = u10_new
      end do
      if (.not. converged) u10 = 25.82_wp*ustar_air

      ustokes = LT_US_TO_U10*u10
      hm0 = LT_SWH_FROM_U10SQ*u10*u10
      f_mean = LT_FM_INTO_FP*0.877_wp*GRAVITY/ &
               (2.0_wp*LT_PI*LT_U19P5_TO_U10*u10)
      vstokes = 0.125_wp*LT_PI*LT_R_LOSS*f_mean*hm0*hm0
      kphil = 0.176_wp*ustokes/max(vstokes, 1.0e-30_wp)
   end subroutine epbl_lf17_wave_state