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.
| Type | Intent | Optional | 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). |
| 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 |
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