Repository navigation
Penetrative radiation interface in Forcings and practical application in CATKE - #6099
Conversation
| base, so that the convective velocity scale is ``w★³ = h (Jᵇ + Jʳ T(h)) - 2 Jʳ ∫₀ʰ T(d) dd``. | ||
| The column convects when ``Jᵇ > 0``. The radiation type extends | ||
| `surface_radiative_buoyancy_flux`, `transmitted_fraction`, | ||
| `transmitted_fraction_derivative` and `transmitted_thickness`. Default: `nothing`. |
There was a problem hiding this comment.
How does this interact with single column mode / ensemble calibration? (thinking about this a bit, perhaps it would be a single specification for all columns?)
Perhaps the more important question is how this would work if the absorption depends on a prognostic variable like chlorophyll. It looks to me like the type of penetrative_radiation somehow has to be able to compute things like transmitted_thickness?
A separate but related comment is whether this better belongs all the way up in the model struct itself. For example in Breeze:
I think the main question is whether a bespoke interface for radiative fluxes would be used by any other closure except CATKE.
Another option is to generalize (further....) this CATKE implementation to incorporate all temperature (thus energy) forcings. In that case one could take a more minimal approach with the closure option itself, something like radiation_adjustment=true or something...
There was a problem hiding this comment.
CATKE implementation to incorporate all temperature (thus energy) forcings.
I am testing this generalization, but it requires a bit of a complication. If we do not have a closed-form vertical integral apparently we need to perform a complicated bisection on the column to find h which requires an extra memory field allocation and an additional kernel.
There was a problem hiding this comment.
I think the main question is whether a bespoke interface for radiative fluxes would be used by any other closure except CATKE.
Maybe we can generalize the radiation interface all closures? This could probably be done easily. How the closure ingests this interface is then closure-dependent.
There was a problem hiding this comment.
The last equation should have w*^3 rather than w^*. Other than that, we should generalize the expression to allow for entrainment. As for whether the formulation should be extended to apply to atmospheres, I am not sure it would be very useful, because we implicitly assume the flux is destabilizing throughout the whole water column. This would not apply in an atmosphere where the radiative flux can be non-monotonic.
|
I have moved the interface to the parent module |
I believe the interface belongs in |
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #6099 +/- ##
==========================================
- Coverage 74.72% 73.60% -1.12%
==========================================
Files 443 444 +1
Lines 28008 28055 +47
==========================================
- Hits 20928 20651 -277
- Misses 7080 7404 +324
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
…eananigans.jl into ss/catke-penetrative-convection
Applies the diff of ss/catke-penetrative-convection against its merge-base with main. The mixing-length functions take closure_fields (Jᵇ, Jʳ) instead of surface_buoyancy_flux; the Cᶠ geometric-floor weighting and Cᵘⁿᵇ of this branch are kept on top. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>
|
The error in the CI will heal after #6412 is merged. |
…convection # Conflicts: # src/Models/HydrostaticFreeSurfaceModels/hydrostatic_free_surface_model.jl # src/Models/NonhydrostaticModels/nonhydrostatic_model.jl
Forcings and practical application in CATKE
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This PR adds a penetrative radiation correction to the convecting path of CATKE. In practice the convective velocity scale$w_\bigstar$ should depend on the external bouyancy forcing which, with penetrative radiation, is not constrained only on the surface but penetrates inside the mixed layer. Therefore, we should account for the integral of this forcing within the mixed layer. We also need to compute the convective length scale, which in CATKE is a measure of the mixed layer depth, and in the case of penetrative radiation requires an inversion to compute. Here it is implemented with 3 Newton iterations which (claude) verified is enough for any practical case.
To be more detailed, in a convection event, CATKE need a measure of$w_\bigstar$ and a measure of the convective mixing length. The latter is just an estimate of the mixed layer so I will call it $h$ .
As per Wagner et al 2025, the assumed relation is
which comes from the assumption that the turbulent flux$w^\prime b^\prime$ is linear inside the mixed layer ($b$ is uniform) and $J^b$ is the (positive) buoyancy flux at the surface.
Now, if we introduce radiation, the balance above changes Let's start with the buoyancy budget
where
Note that$J^r$ is always negative as the solar radiation is the only penetrating radiation and $|J^{bc}| > |J^r|$ with $J^{bc}$ positive since we are in a convecting regime (solar radiation at the surface reduces convection).
Again, we assume that (1) the layer is well mixed ($b$ is uniform in $-h < z < 0$ ) then $F$ should be linear in $z$ , and (2) there is no entrainment at the bottom of the mixed layer (same assumption of base CATKE) which means that $\overline{w'b'}(-h) = 0$ and the flux at the bottom of the mixed layer is just the penetrating radiation
where$\mathcal{T}$ is the trasmitted fraction of the (surface) penetrating radiation $J^r$ .$F$ is easily computed as
Then a linear
and the turbulent flux is therefore
We then integrate in the layer the turbulent flux to get
we normalize by 2 to keep the same scaling of the original CATKE implementation with no radiation.
In the limit of radiation absorbed at the surface$\mathcal{T}(-h) = 0$ and $\int_{-h}^0\mathcal{T}dz = 0$ returns back the previous formulation and in the limit of radiation passing through ($\mathcal{T}(h) = 1$ and $\int_{-h}^0 \mathcal{T} dz = h$ ) we recover $w_\bigstar^3 = h(J^b - J^r) = hJ^{bc}$ meaning that radiation is not accounted for in the mixed layer buoyancy budget at all.
Now, this formulation is a bit more complicated and requires a newton solve to find$h$ which is out convective mixing length. cc @rafferrari
@glwagner I would need your expertise here to understand if this implementation is sensible or not.