Fix cvmix_KPP ice scaling: apply (1-Aice) to ustar and Stokes wind velocity#945
Open
patrickscholz wants to merge 2 commits into
Open
Fix cvmix_KPP ice scaling: apply (1-Aice) to ustar and Stokes wind velocity#945patrickscholz wants to merge 2 commits into
patrickscholz wants to merge 2 commits into
Conversation
When kpp_reduce_tauuice is enabled, ustar was scaled by (1-Aice)^2 but wind_norm and the wind components passed to compute_stokes_velocities_MOM6style were left at their full open-ocean values. This caused LaSL = sqrt(ustar/us) to collapse toward zero under high ice fractions (ustar->0, us finite), driving EFactor = sqrt(1 + c/LaSL^4) toward infinity — spurious infinite Langmuir turbulence enhancement directly under sea ice. Changes: - ustar scaling: (1-Aice)^2 -> (1-Aice), consistent with the physical argument that effective wind speed is reduced by (1-Aice), giving stress ~ (1-Aice)^2 and thus ustar = sqrt(tau/rho) ~ (1-Aice). Original ^2 kept as a comment. - New u_wind_eff/v_wind_eff variables scaled by (1-Aice) when kpp_reduce_tauuice is active; all Stokes drift inputs (compute_stokes_velocities_MOM6style x3, wind_norm) now use these instead of raw u_wind/v_wind. Using the same factor on both ustar and wind_norm preserves LaSL = sqrt(ustar/us) and keeps EFactor finite.
patrickscholz
force-pushed
the
workbench_fix_kpp_ice_wind_scaling
branch
from
June 26, 2026 09:52
4236b95 to
06b6ee1
Compare
Collaborator
|
Verified the bug and fix end-to-end. Should we have a test run of this? |
Contributor
Author
|
Xuejing Chen found that i think she will make some test, i dont think anybody else except her is using this in moment. Also our default option for kpp_reduce_tauuice=.false. so far! |
JanStreffing
approved these changes
Jun 29, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Affects only the cvmix_KPP mixing scheme (
kpp_reduce_tauuice = .true.). All other mixing schemes (PP, TKE, etc.) are unaffected.When
kpp_reduce_tauuice = .true., the friction velocityustarwas scaled by(1-Aice)^2to suppress wind-driven boundary layer turbulence under sea ice, but the wind speed inputs to the Stokes drift / Langmuir turbulence parameterisation (wind_norm,u_wind,v_wind) were left at their full open-ocean values. This created two problems:1. EFactor blow-up under high ice concentration
The Langmuir enhancement factor is
EFactor = sqrt(1 + c/LaSL^4)whereLaSL = sqrt(ustar / uv_SLmean)anduv_SLmean ∝ 0.0162 * wind_norm. Asa_ice → 1,ustar → 0whileuv_SLmeanremained finite, drivingLaSL → 0andEFactor → ∞— spurious infinite Langmuir turbulence enhancement directly under sea ice.2. Unphysical Stokes drift under ice
The Stokes drift parameterisation uses a Pierson-Moskowitz fully-developed sea approximation, which assumes waves are locally generated by the local wind. Sea ice suppresses local wave growth, so applying the full open-ocean wind speed in ice-covered cells is physically inconsistent.
Changes (
src/cvmix_driver/gen_modules_cvmix_kpp.F90)ustarscaling corrected:(1-Aice)^2→(1-Aice). Physical basis: effective wind speed at the ocean surface is reduced by(1-Aice)due to ice sheltering →tau ∝ (1-Aice)^2→ustar = sqrt(tau/rho) ∝ (1-Aice). The original^2line is retained as a comment (it was ported from MPIOM without prior testing in FESOM).u_wind_eff/v_wind_effvariables: scaled by(1-Aice)whenkpp_reduce_tauuice = .true., otherwise equal tou_wind/v_wind. Using the same factor asustarpreservesLaSL = sqrt(ustar/us)— both numerator and denominator scale identically, keeping EFactor finite.wind_norm(feedscvmix_kpp_ustokes_SL_modelandcompute_Efactor, called twice)compute_stokes_velocities_MOM6style(two in the StokesMOSTdo nzloop, one after OBL depth is known)Notes
kpp_reduce_tauuice = .false.(default);u_wind_eff = u_windexactly.tke_dolangmuir) is unaffected — it derives its Stokes proxy from the wind stress, which is inherently reduced under ice.lamult = 1) above a 5% ice threshold at the coupler level rather than scaling wind inputs inside KPP.