Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
310 commits
Select commit Hold shift + click to select a range
ac18e11
Add SLURM batch script for core2 ocean test
JanStreffing Apr 9, 2026
ca35a25
Update XIOS XML: add u10m/v10m aliases, move evspsblpot/sbl to daily
JanStreffing Apr 9, 2026
da64d75
Add scale_and_integrate_pipeline, rules for hfyint, hfy, hfxint, hfx.
nwieters Apr 9, 2026
a317c28
Fix YAML configs: GLB casing, regex patterns, XIOS time_dimname
JanStreffing Apr 9, 2026
dfca6fe
Fix fx variable handling, XIOS time in secondary inputs, add shuffle …
JanStreffing Apr 9, 2026
59df215
Add TCo95 core_atm test config and SLURM batch script
JanStreffing Apr 9, 2026
7afa539
Added rule for 3hourly variable tauuo and tauvo in cap7_ocean.
nwieters Apr 10, 2026
cc90635
Update cap7_ocean todo file.
nwieters Apr 10, 2026
073c355
Fix units='-' parsing, time dimension handling, add year filtering an…
JanStreffing Apr 10, 2026
0d94c38
Add core_seaice test config and fix simass unit conversion
JanStreffing Apr 10, 2026
e8c9f28
Added msftm, msftmmpa (depth, density) variables to lrcs_ocean.
nwieters Apr 10, 2026
7d4de98
Added sfx, sfy variables.
nwieters Apr 10, 2026
ea2b9e5
Update lrcs_ocean todo.
nwieters Apr 10, 2026
3ed2fa1
Add rule for daily variable hfx and hfy.
nwieters Apr 10, 2026
cc900d8
Add lrcs_seaice test config, fix OOM and siflcondtop time mismatch
JanStreffing Apr 10, 2026
534ff40
Add lrcs_ocean CORE2 test config, fix msftbarot name bug and PSU units
JanStreffing Apr 10, 2026
aae7e72
lrcs_land test passes 6/6, update all test configs to cmip7_output_006
JanStreffing Apr 10, 2026
6245794
Add cap7_seaice test config (9/9 pass), fix unit conversions
JanStreffing Apr 10, 2026
f14bf13
Add veg_seaice test config (1/1 pass), fix sisnhc compound name
JanStreffing Apr 10, 2026
94480ba
Add veg_land test config (56/56 pass), fix LPJ-GUESS yearly save and …
JanStreffing Apr 11, 2026
1d6017a
Add veg_atm (26/26) and extra_land (13/13) test configs, fix bugs
JanStreffing Apr 11, 2026
d3434b1
Add extra_atm test config (21/21 pass), fix second_input_pattern glob…
JanStreffing Apr 11, 2026
c069007
Add lazy_write + streaming-write optimization, fix dask-backed time c…
JanStreffing Apr 12, 2026
c1d6eaf
Add cap7_atm CMIP7 config and lazy_write across 3D rules
JanStreffing Apr 12, 2026
2f3fff1
Added rule for siconca (daily, monthly). It uses oifs output for this…
nwieters Apr 13, 2026
8269e99
Added rule/pipeline for Snow Sublimation over sea ice. Uses oifs data…
nwieters Apr 13, 2026
fa28ea4
Add rule for daily siarea (north/southe).
nwieters Apr 13, 2026
54e9a30
Added daily siextent (noth, south) rule. Added threshhold option in i…
nwieters Apr 13, 2026
286331b
Add rule for constant variable sidragtop.
nwieters Apr 13, 2026
d213b4d
Add rule for sifllattop, siflsenstop.
nwieters Apr 13, 2026
00fc070
Add rule for variables daila, monthly sisnmass (North, South)
nwieters Apr 13, 2026
582ba98
Add rules for daily sivol (North, South) variables.
nwieters Apr 13, 2026
9a5bf81
Add rule for monthly rlds. Using iofs variable, regrid to fesom2 and …
nwieters Apr 13, 2026
62eadae
Add rules for rlus, rsds, rsus. Take vriable from oifs, regrid and ap…
nwieters Apr 13, 2026
51b95c8
Add table about status of cmorization coverage.
nwieters Apr 14, 2026
6afc320
Add cap7_ocean test config (9/9 pass), implement heat_transport pipeline
JanStreffing Apr 12, 2026
cbf604f
Standardize test config/script names, remove ad-hoc tests
JanStreffing Apr 12, 2026
db25714
Enable FESOM tracer flux diagnostics (utemp, vtemp) for heat transport
JanStreffing Apr 12, 2026
008489b
Move time_dimname into inherit in veg_land HR config
JanStreffing Apr 12, 2026
f861eff
Add clear-sky radiation and snm rules to LR tests
JanStreffing Apr 12, 2026
91f127d
Add opottemprmadvect rule to lrcs_ocean LR test
JanStreffing Apr 12, 2026
aeb2f7f
Add hfx.day/hfy.day rules to lrcs_ocean LR test
JanStreffing Apr 12, 2026
3620076
Add cap7_aerosol/cap7_land tests, fix LPJ-GUESS unit parsing
JanStreffing Apr 12, 2026
44a3fb3
Fix thdgrsn -> thdgrsnw, document FESOM io_meandata patches
JanStreffing Apr 12, 2026
970a899
Fix FESOM sign conventions for evspsbl and mlotst
JanStreffing Apr 12, 2026
62f063a
Drop od550aer: MACv2-SP is anthropogenic-only, not total AOD
JanStreffing Apr 12, 2026
f8c37de
Point LR tests at cmip7_output_013; update HR comments for single-str…
JanStreffing Apr 12, 2026
dc6f0de
Add tripyview to [fesom] extras for MOC/MHT diagnostics
JanStreffing Apr 14, 2026
9e1d9e2
Convert XIOS field_def_cmip7.xml to Jinja2 template; align spinup fil…
JanStreffing Apr 14, 2026
974e653
Update variable coverage table.
nwieters Apr 14, 2026
ecc1efa
Correct status of atmos variables in variable coverage table.
nwieters Apr 14, 2026
434f58c
Added rules for some GHG variables.
nwieters Apr 14, 2026
db580bb
Add rule for CH4 GHG.
nwieters Apr 14, 2026
77f7f65
Update CAP7_aerosol todo, and coverage.md
nwieters Apr 14, 2026
3d62f3e
Update variable_coverage.md
nwieters Apr 14, 2026
81bc62a
Update variable_coverage.md
nwieters Apr 14, 2026
34a21a2
Update variable_coverage.md and aerosol todo.
nwieters Apr 14, 2026
6f7be8b
Drop deaccumulate_ifs: flux inflation was a XIOS freq_op misconfig, f…
JanStreffing Apr 14, 2026
d87c373
cap7_atm: reconstruct hur on model levels from ta+hus+pfull (OpenIFS …
JanStreffing Apr 14, 2026
efc8b86
Point LR tests at cmip7_output_017 / year 1909
JanStreffing Apr 14, 2026
19b052d
Move basin/msftmz/hfbasin/sltbasin rules into core_ocean and lrcs_oce…
JanStreffing Apr 14, 2026
87aec33
Fix log-file race; repoint test patterns to year 1909; add repoint_te…
JanStreffing Apr 15, 2026
61be313
Update todos and coverage file.
nwieters Apr 15, 2026
c342f5d
Fix pint scaling-factor units (sos/so), non-monotonic time resample, …
JanStreffing Apr 15, 2026
e567bcc
compute_msftmz: align w vertical dim with tripyview diag file convention
JanStreffing Apr 15, 2026
441b66d
CMIP7 QC compliance: emit branded globals, DRS filename, clean encodings
JanStreffing Apr 15, 2026
0b86d3f
doc: design note for pipeline-integrated CMIP7 QC workflow
JanStreffing Apr 15, 2026
57dcbca
CMIP7 QC: emit lat/lon bounds, cell_measures, midpoint timestamp, DRS…
JanStreffing Apr 15, 2026
ec78f24
xios cmip7 XMLs: add ta/hus on p19, switch to reduced Gaussian, aggre…
JanStreffing Apr 16, 2026
b9c94f3
Attach lat/lon bounds from mesh for unstructured output
JanStreffing Apr 16, 2026
d9f7dec
pycmor output: CF-compliant bounds encoding and time:units_metadata
JanStreffing Apr 21, 2026
4db542e
pycmor CMIP7 global attributes: emit CV-valid values
JanStreffing Apr 21, 2026
a430fde
pycmor output: emit external_variables for cell_measures (CF 7.2)
JanStreffing Apr 21, 2026
d5e3ed5
pycmor std_lib: reusable cell_measures steps + fx FrozenPipelines
JanStreffing Apr 21, 2026
9b191ee
std_lib cell_measures: AreacellaFxPipeline reads model output, not mesh
JanStreffing Apr 21, 2026
266e472
configs: migrate areacello/areacella pipelines to std_lib FrozenPipel…
JanStreffing Apr 21, 2026
b505886
HR/LR yaml sync + repoint for test runs
JanStreffing Apr 22, 2026
0a1f79b
HR core_atm sbatch wrapper + CAP7 data volume estimate
JanStreffing Apr 22, 2026
9bff49e
std_lib + configs: CMIP7 fx/flag/unstructured-grid fixes
JanStreffing Apr 22, 2026
0700690
timeaverage: default flox engine to numpy, override knob
JanStreffing Apr 22, 2026
975ea11
std_lib: pluggable netCDF codec + write scheduler knobs
JanStreffing Apr 22, 2026
1fba182
pycmor output: three HR-atmos fixes (dask _FillValue, XIOS bounds, co…
JanStreffing Apr 22, 2026
00478b0
bounds recovery: re-read XIOS bounds from input files at save time
JanStreffing Apr 22, 2026
29dc348
bounds variables: drop the spurious ``units`` attribute
JanStreffing Apr 23, 2026
8443aeb
bit-level quantization: default BitGroom-5, skip bounds / coord vars
JanStreffing Apr 23, 2026
6959c2e
add wip verification
JanStreffing Apr 23, 2026
a61be16
add full hr test runner script
JanStreffing Apr 23, 2026
0c31f9b
update HR yamls with performance optims and removal of double pipelin…
JanStreffing Apr 23, 2026
09c48bc
env checker to ensure we run on env with hdf5 and nc from hpc
JanStreffing Apr 23, 2026
ae3a92f
add step rechunk_time
JanStreffing Apr 23, 2026
a6b229e
update all example scripts for lr and hr benchmarking
JanStreffing Apr 23, 2026
743aee7
script:// step paths: support env-var expansion, migrate yamls to $PY…
JanStreffing Apr 28, 2026
1927d89
feat(land): add 75 LPJ-GUESS CAP7/VEG/EXTRA rules and depth/pool loaders
Apr 30, 2026
39afd78
ocean: rewire uos / vos onto unod_sfc / vnod_sfc, drop 3hr tauuo / ta…
JanStreffing Apr 28, 2026
fb695bd
oifs: sync xios xml from esm_tools (file_def, context_ifs, grid_def)
JanStreffing Apr 28, 2026
57e4add
oifs: drop redundant + unrequested OIFS streams; retarget pycmor rule…
JanStreffing May 3, 2026
6475250
extra_land: drop old composite c3PftFrac rule + lpjg_monthly_sum_pipe…
JanStreffing May 3, 2026
47b1154
extra_land: drop 5 more old PFT-fraction rules colliding with the LPJ…
JanStreffing May 3, 2026
65945ef
inherit: switch netcdf_write_scheduler from threads to synchronous on…
JanStreffing May 3, 2026
a0866d4
ocean: implement compute_msftm_density / compute_msftmmpa_{depth,dens…
JanStreffing May 3, 2026
afedbab
doc: add sanity-check ranges for 53 newly-active HR rules
JanStreffing May 3, 2026
d1ce806
cap7_aerosol: cmor 1 model year of GHG, not 273 forcing years
JanStreffing May 3, 2026
59cfa1e
xios: drop duplicate _<suffix>_ infix from OIFS output filenames
JanStreffing May 3, 2026
0b3501d
xios dedup followups: 11 second_input_pattern + 3 extra_land per-var …
JanStreffing May 3, 2026
08d09c2
extra_land: fix singular pipeline: -> pipelines: on 6 LPJ PFT rules
JanStreffing May 3, 2026
f1d4c9d
tooling + cap7_atm fixes
JanStreffing May 3, 2026
cd5f5d2
fix: pipeline-key typos, prefix typos, generic-pattern updates across…
JanStreffing May 3, 2026
a103070
fix: 2 quoted-pattern dups + lrcs_land static per-var
JanStreffing May 3, 2026
0551d1b
fix: FESOM *_file: regex-form -> glob-form + repoint glob support
JanStreffing May 3, 2026
48fa47f
lrcs_seaice: replace regrid_regular_to_fesom with regrid_oifs_to_fesom
JanStreffing May 3, 2026
2508561
naming: drop cap7/cmip7 from XIOS file_ids; merge collisions
JanStreffing May 4, 2026
ff183a1
examples LR test yamls: repoint to LR_run_test3
JanStreffing May 4, 2026
f3b45d5
tools: add sanity-check walker + report generators
JanStreffing May 4, 2026
8e99422
issues_y1587_sanity.md: refresh with all 695/695 files
JanStreffing May 4, 2026
df15285
fix unit handling and compute bugs in fesom-derived rules
JanStreffing May 4, 2026
f98e394
sanity_check_ranges: widen bounds with literature support
JanStreffing May 4, 2026
74a1616
disable fesom diagnostics that are dead under linfs ALE
JanStreffing May 4, 2026
a37195d
zg: do divide-by-g in xios, drop rule-side scale_factor
JanStreffing May 4, 2026
f61f01b
slab-loop save path + memory-pressure bench artifacts
JanStreffing May 4, 2026
8aa8eb3
HANDOFF: update with pyconcat retry numbers + revised throughput math
JanStreffing May 4, 2026
a65cd13
HANDOFF: append mode is the recommended default
JanStreffing May 4, 2026
ebecb51
slab loop: fix multi-time-axis append, add chunk-count guard, input f…
JanStreffing May 4, 2026
f8bc0ae
slab loop: detect aux time dims by name/CF attrs, not size match
JanStreffing May 4, 2026
cd8341f
slab loop: skip when aux time dim has size != primary time
JanStreffing May 5, 2026
3174c79
slab loop: tighten multi-time-axis guard to also skip parallel-axis case
JanStreffing May 5, 2026
5d90ccd
slab loop: rebalance slab boundaries + override time-axis chunksize
JanStreffing May 5, 2026
1c7f2d7
Revert slab-loop save path: append-mode silent truncation
JanStreffing May 5, 2026
7338ba7
HANDOFF: investigation closed with negative result + cgroup-v2 watchdog
JanStreffing May 5, 2026
0e76600
recipe: fix rtmt_mon formula and snd_mon time-coord alignment
JanStreffing May 5, 2026
2cc43f6
README: align compute_rtmt docstring with the corrected formula
JanStreffing May 5, 2026
1cb45e4
Round 1 closed (negative): h5netcdf and inline_array both regress
JanStreffing May 5, 2026
3169ce5
Round 2 closed (negative): Prefect task collapse no measurable win
JanStreffing May 5, 2026
39a0c79
Round 3 audit: all four candidates dead or unverifiable
JanStreffing May 5, 2026
a6ff822
Round 4: contention sweep on mini-cap7 finds 3x4x48 as new default
JanStreffing May 5, 2026
d280114
fix _HLGExprSequence pickle bug in save under prefect-dask
JanStreffing May 5, 2026
8d5340d
Add save_dataset heartbeat + design proposal for subflow deadlock fix
JanStreffing May 5, 2026
a41103a
HR submit: new default 4x4x16 + collapse (27% wall reduction)
JanStreffing May 6, 2026
e8aa226
Production tuning: thread/mem-limit pass-through + parallel cleanup +…
JanStreffing May 6, 2026
1d2e1b1
fix cap7_atm rule inputs: add 2d to file_def, year-lock secondary pat…
JanStreffing May 6, 2026
fcd43cc
Eliminate parent×subflow deadlock; fix gate-A infra flakes
JanStreffing May 6, 2026
6773ea5
Throttle parent submission to W*TPW via as_completed rolling window
JanStreffing May 6, 2026
90f382f
Throttle parent submission also in _parallel_process_prefect
JanStreffing May 6, 2026
a30a963
DESIGN_PROPOSAL §10.6: gate-A v2 final + new failure mode + throttle
JanStreffing May 6, 2026
8046000
Add CLI overrides for run-root, year range, mesh, output, slurm memory
JanStreffing May 7, 2026
55bb37e
Fix CLI-override regressions vs repoint_hr_year.py (R1, R2)
JanStreffing May 7, 2026
961c492
Migrate *_file: literal globs to *_path:/*_pattern: form
JanStreffing May 7, 2026
42e8a6a
Recipe fixes post-CLI migration: F1+F3+F4+F5+F6 (cli5 545/11)
JanStreffing May 8, 2026
6ef5eca
sifllattop / siflsenstop: switch to atmos_1h_sfc_hfls/hfss
JanStreffing May 8, 2026
53eb778
mask_where_no_seaice: fix duplicate-time + bounded-memory broadcast
JanStreffing May 9, 2026
7091733
sanity_check: add HTML report generator + Test_06 results
JanStreffing May 10, 2026
5ba2f33
sanity_check: add per-variable map plots to HTML report
JanStreffing May 10, 2026
b885674
sanity_check/build_maps: fix dim detection + file picker
JanStreffing May 10, 2026
46058d3
sanity_check/build_html_report: long names + description, fix PICONTR…
JanStreffing May 10, 2026
9bdd870
sanity_check/build_maps: 3-panel maps + level-name fix
JanStreffing May 10, 2026
54c7b28
sanity_check: split PICONTROL_NONZERO from PHYS_NEG_VALUES
JanStreffing May 10, 2026
932d9a0
sanity_check: time-series plots for hemispheric/global scalars
JanStreffing May 10, 2026
cb0de4c
sanity_check html: widen layout so 3-panel maps render large
JanStreffing May 10, 2026
799d9ab
fix snm sign / vsfcorr fill / siarea unit + handoff doc
JanStreffing May 10, 2026
7aea762
build_maps: walk through level dim to find a non-NaN slice
JanStreffing May 10, 2026
5170e3c
sanity_check: order-of-magnitude FAIL + Baltic-aware salinity bounds
JanStreffing May 10, 2026
0644699
build_maps scatter: wrap lon to -180..180 before plotting
JanStreffing May 10, 2026
803a150
sanity_check: PICONTROL classifier narrowed to anthropogenic-flux only
JanStreffing May 10, 2026
d72c0b2
Apply rho_0-family scale to depth-integrated ocean rules
JanStreffing May 10, 2026
8bbeb68
sanity_check maps: regen with scatter + lon-wrap (333/335)
JanStreffing May 10, 2026
7e5e3c4
sanity_check + dsn: EXTREME_OUTLIER tier; fix dsn double-conversion bug
JanStreffing May 10, 2026
9fec294
fix sea-ice conductive/turbulent flux sign convention
JanStreffing May 10, 2026
c36726a
sanity_check: scale-too-small check (observed range << expected envel…
JanStreffing May 10, 2026
1bcce1d
sanity_check: tighten scale-too-small threshold to 10x
JanStreffing May 10, 2026
663401c
sanity_check html: rename Ice / move landIce -> Land page
JanStreffing May 10, 2026
a766437
reports: re-walk Test_06_cli_y1587_v7 after cli9 rule fixes
JanStreffing May 11, 2026
1db0265
handoff: test06_cli9 results + 5 follow-up items
JanStreffing May 11, 2026
e0e93ee
sanity_check: per-file diagnosis + hemisphere-integral unit-conversion
JanStreffing May 11, 2026
8005217
sanity_check index: report both per-variable and per-file counts
JanStreffing May 11, 2026
a53979f
sanity_check: per-file cards (one card per .nc file)
JanStreffing May 11, 2026
2a789b7
sanity_check: per-file maps + compute-node SLURM script
JanStreffing May 11, 2026
5e255a3
sanity_check html: re-render with per-file maps from compute node
JanStreffing May 11, 2026
ca6068a
sanity_check: widen areacella for HR, fix ua mean, skip checks for wi…
JanStreffing May 11, 2026
08ad0ad
reports: refresh 17 stale Test_06 entries + reclassify areacella/ua
JanStreffing May 11, 2026
c07a81a
sanity_check ranges: widen fFire/fFireAll/fFireNat bounds
JanStreffing May 11, 2026
d90fea5
sanity_check: cadence-aware bounds (var_<cadence> fallback to plain var)
JanStreffing May 11, 2026
563248e
sanity_check ranges: widen HR DGVM carbon-pool bounds with literature…
JanStreffing May 11, 2026
ad63293
sanity_check ranges: widen difvho/difvso bounds to include convective Kv
JanStreffing May 11, 2026
244a6e1
sanity_check ranges: widen siflcondtop and siflfwbot for HR thin-ice …
JanStreffing May 11, 2026
8507e69
hfbasin: replace per-element-area approximation with tripyview edge-c…
JanStreffing May 11, 2026
9a6aec5
save_dataset: tmpfs-staged atomic write (Option A + A.5)
JanStreffing May 11, 2026
87bc1fe
save_dataset: watchdog timeout + retry (Option E)
JanStreffing May 11, 2026
7d49257
sisnmass NH/SH: apply rho_snow scaling before unit conversion
JanStreffing May 11, 2026
9bf31f1
integrate_over_hemisphere: replace fancy isel with mask-and-multiply
JanStreffing May 11, 2026
9ab2cd2
save_dataset watchdog: clarify the log message is informational
JanStreffing May 11, 2026
17a4cf6
save_dataset: watchdog no longer raises -- diagnostic only
JanStreffing May 11, 2026
dbf3a08
sltbasin: port to tripyview edge-crossing integration
JanStreffing May 12, 2026
6a5c67c
sanity_check ranges: hfx/hfy bounds reflect per-cell not basin-integr…
JanStreffing May 12, 2026
d6233d0
lrcs_seaice failure fixes: pipeline throttle_group + secondary-mf lru…
JanStreffing May 12, 2026
3604c53
save_dataset: move compute off driver onto cluster workers (Fix #3)
JanStreffing May 12, 2026
341ddee
shard isolation: SLURM-level per-shard yamls, 1 array per tier
JanStreffing May 12, 2026
5973a3f
shard runner: 512G cgroup, fix3-off default, graph-size instrumentation
JanStreffing May 13, 2026
82aea52
runner+submitter: per-tier --mem override, default back to --mem=0
JanStreffing May 13, 2026
e452940
submitter: per-tier Fix #3 override via SHARD_FIX3 env
JanStreffing May 13, 2026
fb639fa
_safe_to_netcdf: retry transient compute errors
JanStreffing May 13, 2026
cfb9320
_safe_to_netcdf: gc.collect + malloc_trim between saves to fight glib…
JanStreffing May 13, 2026
c855236
submitter: lrcs_seaice gets Fix #3 ON; LRCS_SEAICE_MEM env knob
JanStreffing May 13, 2026
cd99b57
Revert "submitter: lrcs_seaice gets Fix #3 ON; LRCS_SEAICE_MEM env knob"
JanStreffing May 13, 2026
a426963
Revert "_safe_to_netcdf: gc.collect + malloc_trim between saves to fi…
JanStreffing May 13, 2026
7e2f49f
Revert "_safe_to_netcdf: retry transient compute errors"
JanStreffing May 13, 2026
76b1d47
_process_rule: @task(retries=3, retry_delay_seconds=30)
JanStreffing May 13, 2026
ea564dd
_safe_to_netcdf: gc.collect + malloc_trim between saves
JanStreffing May 13, 2026
0c4aff1
submitter: lrcs_seaice gets 6h walltime; others stay 3h
JanStreffing May 13, 2026
821f0eb
Revert "_process_rule: @task(retries=3, retry_delay_seconds=30)"
JanStreffing May 13, 2026
8815440
_process_rule: manual whole-rule retry on transient dask errors
JanStreffing May 13, 2026
2d705fa
submitter: extra_atm runs with N_WORKERS=3 (was 4)
JanStreffing May 13, 2026
5c955bf
lrcs_seaice runs under jemalloc to bound malloc fragmentation
JanStreffing May 13, 2026
9dfcf24
submitter: jemalloc on for all tiers (was lrcs_seaice only)
JanStreffing May 14, 2026
cc19fc6
submitter: cap7_atm switches to SHARD_FIX3=off (regression A/B)
JanStreffing May 14, 2026
338ec44
submitter: extra_atm flips to fix3=off; drop tier_workers override
JanStreffing May 14, 2026
7900daa
load_lpjguess_*: vectorize df.iterrows() to fix dask heartbeat deadlock
JanStreffing May 14, 2026
fba441c
submitter: extra_atm joins lrcs_seaice on --mem=512G
JanStreffing May 15, 2026
9f0e520
filecache: vectorize timestamp parsing in select_range/validate_range…
JanStreffing May 15, 2026
9ba14cb
submitter: drop lrcs_seaice 6h walltime override, use global 3h
JanStreffing May 15, 2026
d7d375e
submitter/runner: SHARD_DRS=on emits full CMIP DRS output tree
JanStreffing May 15, 2026
fc0d215
sanity_check: fix per-file bounds display + recurse into nested cmori…
JanStreffing May 18, 2026
900c575
sanity_check: report fixes + cli37 report; transport: kg/s edge width
JanStreffing May 18, 2026
5667ab2
seaice: mask hxy-si rules, fix sisaltmass and sidmasstran[xy], attach…
JanStreffing May 18, 2026
d4ce88d
sanity_check: derive realm from file's :realm attr, split cards per r…
JanStreffing May 18, 2026
775a1b0
cap7_land: disable 8 LPJ-GUESS rules that duplicated core compounds
JanStreffing May 18, 2026
e7306e2
ocean: fix hfds sign, msftbarot equator band, wmo vertical area, hfba…
JanStreffing May 18, 2026
e332044
sanity_check_ranges: tune difmxylo, sfdsi bounds (cli37 Christian rev…
JanStreffing May 18, 2026
b706941
cap7_land: add vegHeightGrass_mon rule (hxy-grs)
May 18, 2026
f87e49a
sanity_check_ranges: hfds bounds for post-sign-flip recipe
JanStreffing May 18, 2026
80fe7db
sanity_check_ranges: widen hfbasin to ±10 PW for HR monthly extremes
JanStreffing May 18, 2026
8b19d2c
sanity_check_ranges: relax 5 land bounds per Laszlo/Christian round 2
JanStreffing May 18, 2026
51789a6
veg/cap7 land: clip-noise + clip-floor steps + treeFrac total yearly …
JanStreffing May 18, 2026
2fd7241
veg_land sanity-check round 1: plan + D4 handoff + reviews
JanStreffing May 18, 2026
c88c0e2
wo: interface→midpoint averaging fixes "clean top, noisy below" pattern
JanStreffing May 18, 2026
470641b
cap7_land: add yearly rules for per-PFT treeFrac{BdlDcd,BdlEvg,NdlDcd…
May 18, 2026
465afa4
sanity_check_ranges: loosen cli37 piControl bounds for fAnthDisturb, …
May 18, 2026
1dbb5e7
xios cmip7 RH: wire send_cmip7_rh.F90 outputs into field_def/file_def
JanStreffing May 19, 2026
7557ac4
lrcs_seaice: remove redundant mask_where_no_seaice from 13 FESOM-nati…
JanStreffing May 19, 2026
35735fc
CMIP7 DReq: bump v1.2.2.2 -> v1.2.2.3
JanStreffing May 20, 2026
d044b36
veg_land: drop 4 PFT-yearly treeFrac rules — not in CMIP7 data request
JanStreffing May 20, 2026
07390ec
submit_hr_year_shards: extra_land shard size 20 → 5
JanStreffing May 20, 2026
5a61ad3
lrcs_seaice, veg_land: force serial rule submission via throttle_group
JanStreffing May 20, 2026
3299a99
throttle_caps: yaml path dead, use PYCMOR_THROTTLE_CAPS env var instead
JanStreffing May 21, 2026
9d4579c
cmorizer: rule.throttle_group as fallback for unpipelined rules
JanStreffing May 22, 2026
4fdade1
fesom-ingest tiers: tighten input patterns to native-only (\d{4})
JanStreffing May 24, 2026
3d47d27
launcher: optional gr-grid variant via WITH_GR=yes
JanStreffing May 26, 2026
1a3b3e6
core_seaice, cap7_seaice, veg_seaice: serial throttle
JanStreffing May 26, 2026
daef954
submit_hr_year_shards: fix WITH_GR fesom detection + gr throttle
JanStreffing May 26, 2026
517aeae
generate_gr_yaml: drop rules using FESOM-mesh-dependent pipelines
JanStreffing May 26, 2026
5779fcb
generate_gr_yaml: expand mesh-pipeline filter + drop rules with no gr…
JanStreffing May 28, 2026
5ea55d8
generate_gr_yaml: fix step substrings, add pipeline-name filter
JanStreffing May 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -58,3 +58,6 @@ htmlcov/
# pixi environments
.pixi/*
!.pixi/config.toml

# sanity_check report tarballs (too large for git; share via filesystem)
tools/sanity_check/reports/*.tar.gz
7 changes: 7 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,13 @@ Key features:

## Development Commands

### Environment Setup
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Delete before merge

```bash
# Load conda environment
source ~/loadconda.sh
conda activate pycmor_py312
```

### Installation

#### Using pip (traditional)
Expand Down
648 changes: 648 additions & 0 deletions DESIGN_PROPOSAL_recipe_failures_post_cli.md

Large diffs are not rendered by default.

242 changes: 242 additions & 0 deletions DESIGN_PROPOSAL_secondary_input_globs.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,242 @@
# Design proposal: drop literal-glob `*_file:` in favor of `*_pattern:` form

## Context

R1 of [PLAN_cli_override_regressions.md](PLAN_cli_override_regressions.md)
added an `*` → `<year>` expansion inside `apply_overrides` so existing yaml
entries like

```yaml
aice_file: /work/.../outdata/fesom/a_ice.fesom.*.nc
```

still resolve to a real file after we removed `repoint_hr_year.py`. The
expansion is a workaround, not a fix: it recreates repoint's regex rewrite
inside the CLI layer instead of removing the underlying yaml smell.

This proposal: migrate all 10 affected entries to the regex-pattern form
that secondary inputs already use, and remove R1.

### Forcing function: 1700-year cmorization in multi-year chunks

Upcoming workload is to cmorize **1700 simulation years**, processed in
chunks of multiple years per pycmor run (not one-year-at-a-time). With
FESOM's typical one-file-per-year naming (`<var>.fesom.<year>.nc`,
verified at e.g.
`/work/ab0246/a270092/runtime/fesom-2.7/ice_strength/run_19600101-19601231/`
and the existing y1587 archive), each chunk needs `open_mfdataset` over
N files.

**R1's literal-glob form structurally cannot represent this.** It
requires `--year-start == --year-end` and raises `OverrideError`
otherwise. The 1700-year run hits that error on the first chunk that
spans more than one year — which is most of them. The migration is a
hard prerequisite for the upcoming workload, not a stylistic cleanup.

---

## Does globbing affect years? Yes — it locks single-year only

The R1 expansion takes `--year-start` and substitutes it for the literal
`*` in `*_file:` values. That's the **only** year handling these rules
get. Three properties fall out of that:

1. **Year is injected, not detected.** The expansion blindly writes the
CLI year into the filename. There's no check that the resulting file
actually exists; runtime is the first place a typo or missing file
surfaces.

2. **Multi-year is structurally impossible.** `xr.open_dataset(literal_path)`
takes one file. R1 raises `OverrideError` for `--year-start !=
--year-end` because there's no way to expand a single literal `*` to
multiple files inside a single string. Users hitting a multi-year
range get a migration message — but that migration is exactly what
this proposal does.

3. **`skip_input_year_filter` does nothing for `*_file:` consumers.** R2
gates `_filter_files_by_year_range` at both call sites, but `*_file:`
resolution doesn't go through either path — it's a literal `open_dataset`
call. Centennial-forcing rules can't use a `*_file:` form.

Compare with the pattern form:

```yaml
aice_path: /work/.../outdata/fesom
aice_pattern: a_ice\.fesom\..*\.nc
aice_variable: a_ice
```

- File list comes from the directory + regex.
- `filter_files_by_year_range` narrows by `year_start`/`year_end` —
**range, not equality**.
- `open_mfdataset` handles 1+ files transparently.
- `skip_input_year_filter: true` opts out cleanly.

So globbing in `*_file:` form is a year-mangler in disguise. Removing it
removes a hidden coupling between yaml syntax and CLI semantics.

---

## Affected entries (audit)

```
$ grep -rn 'fesom\.\*\.nc' awi-esm3-veg-hr-variables/ | grep '_file:'
```

| Tier | Rule | Key(s) |
|---|---|---|
| `lrcs_seaice` | sispeed | `aice_file`, `vice_file`, V-component file |
| `lrcs_seaice` | sidmasstranx, sidmasstrany | `aice_file`, `vice_file` |
| `lrcs_seaice` | sistressave, sistressmax | `aice_file` (or similar) |
| `lrcs_seaice` | siflcondtop, sifb, sihc | (single fesom file each) |
| `lrcs_seaice` | simpeffconc | (single fesom file) |
| `lrcs_seaice` | sispeed_day | per-day equivalent |
| `core_ocean` | zostoga | (fesom 3D file) |

Exact key names per rule need a finer audit before migration. Static-mesh
keys (`grid_file`, `basin_mask_file`) and any `*_file:` value without a
literal `*` are unaffected.

---

## Migration mechanics

### Yaml side

For each entry:

```yaml
# before
aice_file: /work/.../outdata/fesom/a_ice.fesom.*.nc
aice_variable: a_ice
```

```yaml
# after
aice_path: /work/.../outdata/fesom
aice_pattern: a_ice\.fesom\..*\.nc
aice_variable: a_ice
```

The key triplet matches `_load_secondary_mf`'s convention
([custom_steps.py:2153](examples/custom_steps.py#L2153)).

### Step function side

For each custom step that reads a `*_file:` attribute:

```python
# before
ds = xr.open_dataset(rule.aice_file, use_cftime=True)
aice = ds[rule.get("aice_variable", "a_ice")]
```

```python
# after
aice = _load_secondary_mf(rule, "aice_path", "aice_pattern", "aice_variable")
```

`_load_secondary_mf` already:
- regex-matches files in the directory;
- year-filters via `filter_files_by_year_range` (with the
`skip_input_year_filter` opt-out from R2);
- opens via `open_mfdataset` (handles 1+ files);
- renames `time_counter` → `time` if requested;
- drops residual XIOS time bounds vars;
- selects the variable by name or auto-picks.

Most call sites that read `*_file:` do those steps manually anyway —
this consolidates them.

### CLI override side

Remove R1 entirely:

- delete `_FESOM_FILE_RE` and `_expand_year_in_file_keys` from
[overrides.py](src/pycmor/core/overrides.py);
- delete the `if ov.year_start == ov.year_end` / `else` block in
`apply_overrides`;
- delete the R1-specific tests in
[test_overrides.py](tests/unit/test_overrides.py).

R2's `skip_input_year_filter` plumbing stays — it serves the centennial-
forcing rules independent of this migration.

---

## Scope of changes

| Component | Change |
|---|---|
| Yamls in `awi-esm3-veg-hr-variables/` | ~10 rule entries across 2 tiers (lrcs_seaice + core_ocean) |
| `examples/custom_steps.py` | ~10 custom step functions edited to call `_load_secondary_mf` |
| `src/pycmor/core/overrides.py` | net deletion — `_expand_year_in_file_keys`, `_FESOM_FILE_RE`, multi-year `OverrideError`, the entire R1 block in `apply_overrides` |
| `tests/unit/test_overrides.py` | drop R1 tests; R2 tests stay |
| `PLAN_cli_override_regressions.md` | mark R1 superseded |

---

## Trade-offs vs the workaround

| | R1 workaround | Proposed migration |
|---|---|---|
| Multi-year support | **impossible (raises OverrideError)** — blocks the 1700-year chunked run | works via `open_mfdataset` |
| Year filter is range-aware | no (single year only) | yes |
| Centennial-forcing opt-out | not applicable | works via `skip_input_year_filter` |
| Year/path coupling lives in | apply_overrides regex | rule yaml + helper |
| Net code in CLI override layer | grew by ~40 lines | shrinks by ~40 lines |

---

## Recommendation

Do the migration. R1 was the right call as a hot-fix to unblock the y1587
single-year run, but the upcoming 1700-year chunked workload makes it a
blocker. The migration:

- unifies all secondary-input handling on one helper (`_load_secondary_mf`),
- removes a code path from the CLI override layer that had to know about
FESOM filename conventions,
- shrinks `apply_overrides` by ~40 lines,
- enables multi-year ranges (the 1700-year chunked case),
- preserves R2's `skip_input_year_filter` semantics for centennial inputs.

There's no value in deferring. R1 stays only as long as nothing needs
multi-year secondary inputs.

---

## Open questions — resolved

### Q1: Per-rule key audit

To do during migration with
`grep -E '_file:.*fesom\.\*\.nc' awi-esm3-veg-hr-variables/`. No upfront
input needed.

### Q2: `open_mfdataset` smoke test — passed

Tested against
`/work/bb1469/a270092/runtime/awiesm3-develop/after_lpjg_spinup_work_01/outdata/fesom/a_ice.fesom.{1900..1903}.nc`:

| Call | Result | Time |
|---|---|---|
| `xr.open_dataset(one_file)` | `time=12, nod2=126858` | 176 ms |
| `xr.open_mfdataset([one_file])` | `time=12, nod2=126858` | 22 ms |
| `xr.open_mfdataset(four_files)` | `time=48, nod2=126858` (concatenated correctly) | 260 ms |

Single-file `open_mfdataset` is in fact **faster** than `open_dataset`
(lazy-load); multi-file concatenates correctly along `time`. No
behavior regression for the migration. The y1700 chunked workload —
the original concern — gets the right shape automatically.

### Q3: Promote `_load_secondary_mf` to `pycmor.std_lib`?

**No.** Audit of all callers
(`grep -rn '_load_secondary_mf' --include='*.py'`) shows every caller
is inside `examples/custom_steps.py` itself. No external consumers, no
yaml indirection that imports it from a stable path. User confirmed
`custom_steps.py` is user-owned and free to modify.

Keep it private. If a future project outside this codebase wants the
helper, that's the trigger to promote — premature now.
Loading
Loading