Repository navigation
Apply first-cell penetrative radiation as a surface flux - #605
simone-silvestri wants to merge 17 commits into
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
|
What is the argument for not applying this fix to CATKE ? |
| Vertical closures build their surface buoyancy flux from the tracer boundary conditions, so this | ||
| part of the shortwave has to arrive there rather than as an interior source. Beer's law is evaluated |
There was a problem hiding this comment.
I'm not sure you should mention vertical closures in this docstring
|
I think a CATKE fix is better. We need to add a radiation handler in Oceananigans and modify the The solution here is a bit of a hack: it only considers part of the radiation as a stabilizing effect (as opposed to main which is completely blind to radiation). The correct formulation discounts the stabilizing effects of solar radiation based on the penetration depth. Basically, if we assume that the flux profile is linear during convection we have that which, after integration in the mixed layer leads to (with an absorption coefficient of where Also, |
TwoColorRadiation implements the penetrative-radiation interface of Oceananigans (CliMA/Oceananigans.jl#6099), whose functions live in Oceananigans.Forcings in our Oceananigans: penetrative_radiation, surface_radiative_buoyancy_flux, transmitted_fraction, transmitted_fraction_derivative and transmitted_thickness. The model constructor finds the radiation in the T forcing (ocean_simulation hands `(forcing.T, radiative_forcing)`, which `penetrative_radiation` searches; a nested MultipleForcings is searched too) and hands it to every CATKEVerticalDiffusivity. The whole shortwave is now absorbed in the interior, as in the PR: `shortwave_radiative_forcing` returns zero and the flux divergence no longer subtracts the surface cell's share, so the temperature boundary condition no longer carries it. This replaces the surface_absorbed_fraction routing of 5b981e5, which gave the CATKE the surface share through the boundary condition and would count that share twice now. Closures that read only the tracer boundary conditions (NEMO TKE) no longer see the shortwave absorbed in the surface cell; KPP already assumed the boundary condition holds none of it. test_radiative_forcing.jl is the PR's, importing the interface from Oceananigans.Forcings. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
| Forcings.penetrative_radiation(radiation::TwoColorRadiation) = radiation | ||
|
|
||
| @inline function two_color_parameters(R::TwoColorRadiation, i, j) | ||
| κ₂ = blue_green_absorption_coefficient(R.second_absorption_coefficient, i, j) |
| end | ||
|
|
||
| @inline function Forcings.transmitted_fraction_derivative(R::TwoColorRadiation, i, j, grid, d) | ||
| ϵ₁, κ₁, κ₂ = two_color_parameters(R, i, j) |
There was a problem hiding this comment.
| ϵ₁, κ₁, κ₂ = two_color_parameters(R, i, j) | |
| ϵ₁, κ₁, κ₂ = two_color_parameters(i, j, R) |
same for the rest
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
When using penetrative radiation, we apply it as a forcing rather than a surface flux.
This has a pretty large consequence for CATKE which does not see the stabilizing surface flux and believes that the column is convecting, injecting huge amounts of TKE in the surface layer.
Even with the two-color split and a surface cell 1.5 meter thick, all the red light is roughly absorbed in the first layer, so applying the surface cell forcing as a surface flux recovers ~55% of the stabilizing flux which is then threadded through CATKE to the TKE equation.
EDIT: This PR has been modified to follow the API introduced in CliMA/Oceananigans.jl#6099