Skip to content

update to fluxes.py to contain net radiation function - #2502

Open
Simon Osborne (mo-sro) wants to merge 11 commits into
mainfrom
net-radiative-flux-clean
Open

Simon Osborne (mo-sro) wants to merge 11 commits into
mainfrom
net-radiative-flux-clean

Conversation

@mo-sro

@mo-sro Simon Osborne (mo-sro) commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

Adds a new fluxes.net_radiative_flux operator which calculates:

Fnet = Fdown - Fup

and automatically identifies shortwave and longwave fluxes,
producing:

net_downward_shortwave_flux
net_downward_longwave_flux

Includes unit tests. Although intended for surface fluxes, the function will work for any level.

Contribution checklist

Aim to have all relevant checks ticked off before merging. See the developer's guide for more detail.

  • Documentation has been updated to reflect change.
  • New code has tests, and affected old tests have been updated.
  • All tests and CI checks pass.
  • Ensured the pull request title is descriptive.
  • Attributed any Generative AI, such as GitHub Copilot, used in this PR.
  • Marked the PR as ready to review.

@github-actions

github-actions Bot commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor
Total coverage: 93% (HTML report)
Name                                                              Stmts   Miss Branch BrPart  Cover
---------------------------------------------------------------------------------------------------
src/CSET/__init__.py                                                113      4     14      0    97%
src/CSET/_common.py                                                 156      0     54      0   100%
src/CSET/cset_workflow/app/fetch_fcst/bin/fetch_data.py             117     28     26      0    78%
src/CSET/cset_workflow/app/fetch_nimrod/bin/fetch_nimrod.py          81      8     28     11    83%
src/CSET/cset_workflow/app/finish_website/bin/finish_website.py      79      2      8      2    95%
src/CSET/cset_workflow/app/parbake_recipes/bin/parbake.py            29      0      8      0   100%
src/CSET/cset_workflow/app/send_email/bin/send_email.py              25      0      4      0   100%
src/CSET/cset_workflow/lib/python/jinja_utils.py                     17      0      6      0   100%
src/CSET/extract_workflow.py                                        105      1     26      1    98%
src/CSET/graph.py                                                    44      0     14      0   100%
src/CSET/operators/__init__.py                                       89      0     26      0   100%
src/CSET/operators/_atmospheric_constants.py                          9      0      0      0   100%
src/CSET/operators/_colormaps.py                                    249      3     72      4    98%
src/CSET/operators/_stash_to_lfric.py                                 3      0      0      0   100%
src/CSET/operators/_utils.py                                        200      8     74      6    95%
src/CSET/operators/ageofair.py                                      142      7     64      5    94%
src/CSET/operators/aggregate.py                                     184      8     60      7    94%
src/CSET/operators/aviation.py                                       61      0     18      0   100%
src/CSET/operators/collapse.py                                      162      8     80      3    94%
src/CSET/operators/constraints.py                                   115      7     50      2    93%
src/CSET/operators/convection.py                                     38      4     10      2    88%
src/CSET/operators/ensembles.py                                      27      0     14      0   100%
src/CSET/operators/feature.py                                        44      0     10      0   100%
src/CSET/operators/filters.py                                        67      2     30      0    98%
src/CSET/operators/fluxes.py                                         60      1     18      1    97%
src/CSET/operators/humidity.py                                      135      0     52      0   100%
src/CSET/operators/imageprocessing.py                                57      0     16      0   100%
src/CSET/operators/mesoscale.py                                      18      0      2      0   100%
src/CSET/operators/misc.py                                          172      1     72      3    98%
src/CSET/operators/plot.py                                         1172    155    438     70    84%
src/CSET/operators/power_spectrum.py                                156     10     60      8    91%
src/CSET/operators/precipitation.py                                 204      2     92      2    99%
src/CSET/operators/pressure.py                                       41      0     12      0   100%
src/CSET/operators/read.py                                          453     25    200     15    94%
src/CSET/operators/regrid.py                                        147      1     70      3    98%
src/CSET/operators/scoreswrappers.py                                226     22     74      6    89%
src/CSET/operators/temperature.py                                   121      0     32      0   100%
src/CSET/operators/transect.py                                       63      0     24      0   100%
src/CSET/operators/wind.py                                           46      3     10      2    91%
src/CSET/operators/write.py                                          15      0      6      0   100%
src/CSET/recipes/__init__.py                                        104      0     28      0   100%
src/CSET/sample_data/__init__.py                                      0      0      0      0   100%
---------------------------------------------------------------------------------------------------
TOTAL                                                              5346    310   1902    153    93%

@mo-sro Simon Osborne (mo-sro) changed the title new branch for updated fluxes.py to contain net radiation function update to fluxes.py to contain net radiation function Oct 6, 2026
@mo-sro Simon Osborne (mo-sro) self-assigned this Oct 6, 2026
@mo-sro
Simon Osborne (mo-sro) requested review from David Flack (daflack) and a balanced review from Copilot October 6, 2026 11:10

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

Band validation can reject valid inputs, and non-surface inputs receive incorrect surface metadata.

Review effort: Balanced
Findings: 2 Medium severity

Open (2)
What changed in this PR

Adds a radiative-flux operator that calculates net downward flux.

Changes:

  • Computes downwelling minus upwelling radiation.
  • Assigns shortwave or longwave output metadata.
  • Adds scalar, validation, naming, and CubeList tests.
File Description
src/​CSET/​operators/​fluxes.py Implements the net radiative flux operator.
tests/​operators/​test_fluxes.py Tests calculation, naming, errors, and CubeLists.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread src/CSET/operators/fluxes.py Outdated
Comment thread src/CSET/operators/fluxes.py Outdated

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

Band inference ignores the upwelling name, and the documented output names no longer match the implementation.

Review effort: Balanced
Findings: 1 Medium severity · 1 Low severity

Open (2)
Resolved since last review (2)

Comment on lines +197 to +211
down_name = down_cube.name().lower()
up_name = up_cube.name().lower()
if ("shortwave" in down_name and "longwave" in up_name) or (
"longwave" in down_name and "shortwave" in up_name
):
raise ValueError("Cannot combine shortwave and longwave fluxes")

net_flux = down_cube - up_cube
name = down_cube.name().lower()
if "shortwave" in name:
output_name = "net_downward_shortwave_flux"
elif "longwave" in name:
output_name = "net_downward_longwave_flux"
else:
output_name = "net_downward_radiative_flux"
Comment thread src/CSET/operators/fluxes.py

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants