diff --git a/CLAUDE.md b/CLAUDE.md
index 3d5bb44d..dd8d6053 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -31,6 +31,13 @@ Key features:
## Development Commands
+### Environment Setup
+```bash
+# Load conda environment
+source ~/loadconda.sh
+conda activate pycmor_py312
+```
+
### Installation
#### Using pip (traditional)
diff --git a/awi-esm3-veg-hr-variables/README.md b/awi-esm3-veg-hr-variables/README.md
new file mode 100644
index 00000000..4cb2d72e
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/README.md
@@ -0,0 +1,186 @@
+# AWI-ESM3-VEG-HR CMIP7 Variable Configuration
+
+CMIP7 CMORization configuration for AWI-ESM3-VEG-HR.
+
+## Model Configuration
+
+Reference runtime: `AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2` (awiesm3-v3.4.1)
+
+### OpenIFS (IFS CY48R1)
+- **Resolution**: TCo319 spectral, L91 vertical levels
+- **Output grid**: 0.25deg regular (1440x720), interpolated via XIOS/FullPos
+- **Time step**: 900 s
+- **Radiation**: ecRad, called every 3 hours
+- **Land surface**: HTESSEL (4-layer soil, snow scheme, Farquhar photosynthesis)
+- **Aerosol**: MACv2-SP simple plumes (no CAMS, no M7)
+- **CO2**: concentration-driven (no prognostic CO2 tracer)
+- **Wave model**: WAM (2-way coupled)
+- **I/O**: XIOS 2.5-ece
+
+### FESOM 2.6
+- **Mesh**: DARS unstructured (~3.1M surface nodes, ~10 km nominal)
+- **Vertical**: 56 z-levels (57 interfaces), linear free surface
+- **Sea ice**: Built-in single-category, mEVP rheology, melt ponds enabled
+- **Diagnostics**: ldiag_cmor=.true. (CMIP scalar diagnostics)
+
+### LPJ-GUESS 4.1.2
+Config from `global.ins` via `run_coupled_4_1_2.ins`:
+- **Fire model**: BLAZE (uses SIMFIRE internally for burned area prediction)
+- **BVOC**: disabled (ifbvoc=0)
+- **Nitrogen cycle**: enabled (ifnlim=1, ifcentury=1)
+- **Land cover**: natural vegetation only (run_landcover=0)
+- **Methane**: disabled (ifmethane=0)
+- **Vegetation mode**: cohort, npatch=15
+- **PFTs**: 12 global + 8 arctic shrub/tundra (~20 active natural PFTs)
+- **CO2**: concentration-driven via OASIS coupling from atmosphere
+- **CMIP output**: extensive monthly + yearly .out files (166 output files defined in `lpjg_output.ins`)
+- **Output format**: plain-text .out files (no XIOS)
+- **Coupling to IFS**: daily via OASIS-MCT (sends LAI, veg type/fraction; receives T, precip, radiation, soil state)
+
+### Coupling (OASIS3-MCT 5.0)
+- **Atm-Ocean**: 2-hourly (7200 s)
+- **Atm-Vegetation**: daily (86400 s)
+- **Runoff mapping**: rnfmap v1.1
+
+### Ice Sheet
+- **No interactive ice sheet model** (no PISM, no Yelmo, no BISICLES)
+- IFS prescribes glaciated areas as grid cells with 10 m water mass equivalent
+- Greenland/Antarctic ice sheets are static boundary conditions
+
+### What this model does NOT have
+- No interactive ice sheet model
+- No prognostic aerosol (no CAMS, no M7 -- only MACv2-SP prescribed plumes)
+- No atmospheric chemistry
+- No interactive ozone (O3 prescribed from climatology, not prognostic)
+- No CO2 tracer (concentration-driven)
+- No ice thickness distribution (single-category sea ice)
+- No icebergs
+- No methane cycle
+- No BVOC emissions
+
+## XIOS XML Configuration (top level)
+
+These files configure the OpenIFS/XIOS output pipeline. XIOS expressions handle unit conversions, deaccumulation, and sign flips at output time so pycmor only needs to add metadata.
+
+| File | Purpose |
+|------|---------|
+| `iodef.xml` | XIOS top-level entry point, references context files |
+| `context_ifs.xml.j2` | IFS XIOS context, includes all `*_def.xml` and `file_def` |
+| `field_def_cmip7.xml` | All CMIP7 field definitions: raw IFS fields + derived expressions |
+| `file_def_oifs_cmip7_spinup.xml.j2` | Output file definitions: fields, frequencies, operations (average/instant/min/max) |
+| `axis_def.xml` | Vertical axes: plev19, plev3 (850/500/250 hPa), model levels |
+| `grid_def.xml` | Grids: regular_sfc, regular_pl, regular_pl3, regular_ml |
+| `domain_def.xml.j2` | Domain definitions for reduced Gaussian to regular grid interpolation |
+
+## FESOM Configuration (top level)
+
+| File | Purpose |
+|------|---------|
+| `namelist.io` | FESOM2 I/O namelist: ocean + sea-ice output variables and frequencies |
+
+## Per-realm Subdirectories
+
+Each subdirectory contains:
+- **CSV files** -- CMIP7 Data Request variables for that realm (from CMIP7_DReq_Software)
+- **YAML file** -- pycmor rules mapping model output to CMOR-compliant files
+- **TODO file** -- implementation status, blockers, research notes, and OIFS source investigation
+
+### Core (CMIP7 mandatory variables)
+
+| Directory | Realm | Model | Rules | Variables | Key notes |
+|-----------|-------|-------|-------|-----------|-----------|
+| `core_atm/` | Atmosphere | OpenIFS | 76 | 45 unique | Monthly/daily/sub-daily (3hr, 6hr, 1hr); surface, plev19, plev3, model levels |
+| `core_land/` | Land | OpenIFS/HTESSEL | 11 | 11 | XIOS-derived + pipeline-computed; 6 variables deferred to lrcs_land |
+| `core_ocean/` | Ocean | FESOM 2.6 | 25 | 25 | Monthly 2D/3D, daily, fx; includes mass transport and zostoga pipelines |
+| `core_seaice/` | Sea Ice | FESOM 2.6 | 9 | 8 unique | Monthly + daily siconc; velocity rotation via vec_autorotate |
+
+### LRCS (additional priority variables)
+
+| Directory | Realm | Model | Rules | Key notes |
+|-----------|-------|-------|-------|-----------|
+| `lrcs_ocean/` | Ocean | FESOM 2.6 | 45 | Decadal, yearly tendencies (6 with FESOM source mods), scalar diagnostics; ~12 blocked by basin masks |
+| `lrcs_seaice/` | Sea Ice | FESOM 2.6 | 40+ | Heat/salt fluxes, tendencies, melt ponds, stress, hemisphere scalars; some blocked by single-category ice |
+| `lrcs_land/` | Land | OIFS/LPJ-GUESS | 6 | 6 deferred variables: 3 from LPJ-GUESS (evspsblsoi, evspsblveg, mrfso), 3 from IFS static fields (sftgif, mrsofc, rootd) |
+| `veg_atm/` | Atmos/Aerosol | OpenIFS + LPJ-GUESS | 27 | 38 variables: 27 implemented (3hr rad/flux, plev6, daily snow, lwp, 7 fire emissions), 11 blocked |
+| `veg_land/` | Land | OpenIFS/HTESSEL + LPJ-GUESS | 58 | 88 variables: 22 IFS (3hr/day/mon hydrology, snow), 36 LPJ-GUESS (N-cycle, fractions, Lut), 30 blocked |
+| `veg_seaice/` | Sea Ice | FESOM 2.6 | 1 | 4 variables: 1 implemented (daily sisnhc from m_snow/a_ice), 3 blocked (2 ITD, 1 missing physics) |
+| `extra_land/` | Land | OpenIFS/HTESSEL + LPJ-GUESS | 13 | 19 variables: 2 fx, 7 LPJ-GUESS (PFT fracs, LAI), 3 IFS hydrology, 1 hourly tas; 6 blocked (irrigation, river, root zone) |
+| `extra_atm/` | Atmos/Aerosol | OpenIFS | 21 | 43 variables: 13 1hr (fluxes, rad, 30S-90S subsets), 2 3hr, 5 daily, 1 monthly gust; 22 blocked (aerosol/chem, crops, heat index, lightning) |
+
+### CAP7 (high-priority additional variables)
+
+| Directory | Realm | Model | Rules | Key notes |
+|-----------|-------|-------|-------|-----------|
+| `cap7_atm/` | Atmosphere | OpenIFS | 58 | 233 variables: 79 already in core/veg/extra/lrcs, 58 new (daily radiation/fluxes/precip, 6hr ml+plev7h, 1hr instant, monthly ml); ~96 blocked (17 COSP, 21 tendencies, 9 aerosol, 5 CO2, 4 reff, ~40 IFS source) |
+| `cap7_ocean/` | Ocean | FESOM 2.6 | 3 | 43 variables: 26 already in core/lrcs, 3 new (daily tossq, monthly volcello, friver); 14 blocked (no icebergs/SF6/geothermal/bigthetao, basin masks, namelist changes for hfx/hfy/3hr stress) |
+| `cap7_seaice/` | Sea Ice | FESOM 2.6 | 9 | 21 variables: 9 already in core/lrcs/veg, 9 new (daily sithick/snd/siu/siv, monthly sieqthick/snw/evspsbl/prra/prsn); 3 blocked (sisali constant, sitempsnic internal, snc single-category) |
+
+## Custom Pipeline Steps
+
+Complex variables that cannot be expressed as XIOS expressions are computed in `../examples/custom_steps.py`.
+
+### Atmosphere pipelines
+- **sfcWind**: sqrt(u10^2 + v10^2) from 10u + 10v
+- **hurs**: Magnus formula from 2t + 2d
+- **huss**: Tetens formula from 2d + sp
+- **clwvi**: tclw + tciw (liquid + ice water path)
+
+### Land pipelines
+- **snc**: snow cover saturation curve from sd (threshold 15mm water equiv)
+- **areacella**: spherical grid cell area from lat/lon coordinates
+- **slthick**: constant HTESSEL soil layer thicknesses [0.07, 0.21, 0.72, 1.89] m
+
+### LPJ-GUESS loaders and fire emission pipelines
+- **load_lpjguess_monthly**: custom loader for LPJ-GUESS plain-text .out files (Lon/Lat/Year/Jan..Dec)
+- **load_lpjguess_yearly**: loader for yearly .out files (Lon/Lat/Year/Total)
+- **load_lpjguess_yearly_lut**: loader for yearly Lut .out files (Lon/Lat/Year/psl/crp/pst/urb)
+- **load_lpjguess_monthly_lut**: loader for monthly Lut .out files (Lon/Lat/Year/Mth/psl/crp/pst/urb)
+- **compute_fire_emission**: converts fFireAll (kgC/m2/s) to species emissions using Andreae (2019) savanna/grassland emission factors (BC, CH4, CO, DMS, OA, SO2, NMVOC)
+
+### Land hydrology/snow custom steps
+- **compute_temporal_diff**: temporal differencing for dgw, dsn, dsw, dcw, dslw (daily storage changes)
+- **compute_mrtws**: terrestrial water storage summation (soil + snow + skin reservoir)
+- **compute_snd**: physical snow depth from SWE and snow density (sd*1000/rsn)
+- **compute_mrsow**: total soil wetness ratio (weighted mean swvl / porosity)
+- **sum_lpjguess_monthly_files**: load and sum multiple LPJ-GUESS .out files (for c3PftFrac)
+- **select_southern_hemisphere**: lat subset for 30S-90S regional variables (orog, tas)
+
+### CAP7 atmosphere custom steps
+- **compute_rtmt**: net downward radiative flux at model top (rsdt - rsut + rlds - rlus)
+- **extract_single_plevel**: extract single pressure level from multi-level dataset (ta@700hPa, wap@500hPa)
+
+### CAP7 sea ice custom steps
+- **compute_snd_from_msnow**: snow depth on ice from m_snow/a_ice (unused after h_snow switched to daily)
+
+### Ocean pipelines
+- **zostoga**: global thermosteric sea level via gsw/TEOS-10
+- **mass transport** (umo/vmo/wmo): Boussinesq approximation (velocity x rho_0 x cell area)
+- **bottom/surface extract**: tob, sob from 3D fields; uos, vos from daily 3D
+- **vertical integration**: scint, phcint, opottempmint, somint
+- **fx pipelines**: areacello, deptho, sftof, thkcello, masscello, volcello from mesh
+
+### Sea ice pipelines
+- **siconc/simpconc**: fraction to percent conversion
+- **sispeed**: sqrt(uice^2 + vice^2)
+- **sihc/sisnhc**: heat content from ice/snow thickness + thermodynamic constants
+- **sisnhc (daily)**: derived from daily m_snow/a_ice (h_snow not available daily)
+- **sistressave/sistressmax**: stress invariants from sigma tensor components
+- **sitempbot**: freezing temperature from SSS
+- **sifb**: freeboard from ice/snow thickness and density ratios
+- **ice mass transport**: uice/vice x m_ice
+- **hemisphere integrals**: sisnmass N/S from m_snow x cell_area
+
+### FESOM2 source code modifications
+Six new diagnostic outputs added to `gen_modules_cmor_diag.F90`:
+- opottemptend, opottempdiff, opottemprmadvect (temperature tendencies)
+- osalttend, osaltdiff, osaltrmadvect (salinity tendencies)
+- rsdoabsorb (shortwave absorption by ocean layer)
+
+## Summary of Implementation Status
+
+| Realm | Core done | Core total | LRCS done | LRCS total | Blocked |
+|-------|-----------|------------|-----------|------------|---------|
+| Atmosphere | 76 | 76 | -- | -- | 3 items need runtime verification |
+| Land | 11 | 17 | 0 | 6 | 3 need OIFS source changes, 3 derivable offline |
+| Ocean | 25 | 27 | 45 | ~80 | ~12 need basin masks, ~8 need online diag |
+| Sea Ice | 9 | 9 | 40+ | ~70 | ITD/age/ridge tracers not enabled |
diff --git a/awi-esm3-veg-hr-variables/axis_def.xml b/awi-esm3-veg-hr-variables/axis_def.xml
new file mode 100644
index 00000000..0cf17b8c
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/axis_def.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/awi-esm3-veg-hr-variables/cap7_atm/cmip7_CAP7_variables_atmos.csv b/awi-esm3-veg-hr-variables/cap7_atm/cmip7_CAP7_variables_atmos.csv
new file mode 100644
index 00000000..1ccf0445
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/cap7_atm/cmip7_CAP7_variables_atmos.csv
@@ -0,0 +1,231 @@
+,name,frequency,modeling_realm,standard_name,units,cell_methods,cell_measures,long_name,comment,processing_note,dimensions,out_name,type,positive,spatial_shape,temporal_shape,cmip6_table,physical_parameter_name,variableRootDD,branding_label,branded_variable_name,region,cmip6_compound_name,cmip7_compound_name,uid,priority,flag_values,flag_meanings
+35,atmos.albisccp.tavg-u-hxy-cl.day.glb,day,atmos,cloud_albedo,1,area: time: mean where cloud (weighted by ISCCP total cloud area),area: areacella,ISCCP Mean Cloud Albedo,Time-means are weighted by the ISCCP Total Cloud Fraction - see . Values will be missing where there are no clouds or no sunlight.,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean where cloud CMIP7:area: time: mean where cloud (weighted by ISCCP total cloud area),",longitude latitude time,albisccp,real,,XY-na,time-intv,CFday,albisccp,albisccp,tavg-u-hxy-cl,albisccp_tavg-u-hxy-cl,glb,CFday.albisccp,atmos.albisccp.tavg-u-hxy-cl.day.glb,baa8144c-e5dd-11e5-8482-ac72891c3257,high,,
+36,atmos.albisccp.tavg-u-hxy-cl.mon.glb,mon,atmos,cloud_albedo,1,area: time: mean where cloud (weighted by ISCCP total cloud area),area: areacella,ISCCP Mean Cloud Albedo,Time-means are weighted by the ISCCP Total Cloud Fraction - see . Values will be missing where there are no clouds or no sunlight.,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean where cloud CMIP7:area: time: mean where cloud (weighted by ISCCP total cloud area),",longitude latitude time,albisccp,real,,XY-na,time-intv,CFmon,albisccp,albisccp,tavg-u-hxy-cl,albisccp_tavg-u-hxy-cl,glb,CFmon.albisccp,atmos.albisccp.tavg-u-hxy-cl.mon.glb,baa817c6-e5dd-11e5-8482-ac72891c3257,high,,
+38,atmos.ccb.tavg-u-hxy-ccl.day.glb,day,atmos,air_pressure_at_convective_cloud_base,Pa,area: time: mean where convective_cloud (weighted by total convective cloud area),area: areacella,Air Pressure at Convective Cloud Base,"Where convective cloud is present in the grid cell, the instantaneous cloud base altitude should be that of the bottom of the lowest level containing convective cloud. Missing data should be reported in the absence of convective cloud. The time mean should be calculated from these quantities averaging over occasions when convective cloud is present only, and should contain missing data for occasions when no convective cloud is present during the meaning period.","CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean CMIP7:area: time: mean where convective_cloud (weighted by total convective cloud area),",longitude latitude time,ccb,real,,XY-na,time-intv,CFday,ccb,ccb,tavg-u-hxy-ccl,ccb_tavg-u-hxy-ccl,glb,CFday.ccb,atmos.ccb.tavg-u-hxy-ccl.day.glb,baa929ea-e5dd-11e5-8482-ac72891c3257,high,,
+39,atmos.ccb.tavg-u-hxy-ccl.mon.glb,mon,atmos,air_pressure_at_convective_cloud_base,Pa,area: time: mean where convective_cloud (weighted by total convective cloud area),area: areacella,Air Pressure at Convective Cloud Base,"Where convective cloud is present in the grid cell, the instantaneous cloud base altitude should be that of the bottom of the lowest level containing convective cloud. Missing data should be reported in the absence of convective cloud. The time mean should be calculated from these quantities averaging over occasions when convective cloud is present only, and should contain missing data for occasions when no convective cloud is present during the meaning period.","CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean CMIP7:area: time: mean where convective_cloud (weighted by total convective cloud area),",longitude latitude time,ccb,real,,XY-na,time-intv,Amon,ccb,ccb,tavg-u-hxy-ccl,ccb_tavg-u-hxy-ccl,glb,Amon.ccb,atmos.ccb.tavg-u-hxy-ccl.mon.glb,baa92652-e5dd-11e5-8482-ac72891c3257,high,,
+40,atmos.cct.tavg-u-hxy-ccl.day.glb,day,atmos,air_pressure_at_convective_cloud_top,Pa,area: time: mean where convective_cloud (weighted by total convective cloud area),area: areacella,Air Pressure at Convective Cloud Top,"Where convective cloud is present in the grid cell, the instantaneous cloud top altitude should be that of the top of the highest level containing convective cloud. Missing data should be reported in the absence of convective cloud. The time mean should be calculated from these quantities averaging over occasions when convective cloud is present only, and should contain missing data for occasions when no convective cloud is present during the meaning period.","CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean CMIP7:area: time: mean where convective_cloud (weighted by total convective cloud area),",longitude latitude time,cct,real,,XY-na,time-intv,CFday,cct,cct,tavg-u-hxy-ccl,cct_tavg-u-hxy-ccl,glb,CFday.cct,atmos.cct.tavg-u-hxy-ccl.day.glb,baa96d92-e5dd-11e5-8482-ac72891c3257,high,,
+41,atmos.cct.tavg-u-hxy-ccl.mon.glb,mon,atmos,air_pressure_at_convective_cloud_top,Pa,area: time: mean where convective_cloud (weighted by total convective cloud area),area: areacella,Air Pressure at Convective Cloud Top,"Where convective cloud is present in the grid cell, the instantaneous cloud top altitude should be that of the top of the highest level containing convective cloud. Missing data should be reported in the absence of convective cloud. The time mean should be calculated from these quantities averaging over occasions when convective cloud is present only, and should contain missing data for occasions when no convective cloud is present during the meaning period.","CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean CMIP7:area: time: mean where convective_cloud (weighted by total convective cloud area),",longitude latitude time,cct,real,,XY-na,time-intv,Amon,cct,cct,tavg-u-hxy-ccl,cct_tavg-u-hxy-ccl,glb,Amon.cct,atmos.cct.tavg-u-hxy-ccl.mon.glb,baa96a0e-e5dd-11e5-8482-ac72891c3257,high,,
+42,atmos.ci.tavg-u-hxy-u.mon.glb,mon,atmos,convection_time_fraction,1,area: time: mean,area: areacella,Fraction of Time Convection Occurs in Cell,"Fraction of time that convection occurs in the grid cell. If native cell data is regridded, the area-weighted mean of the contributing cells should be reported.",,longitude latitude time,ci,real,,XY-na,time-intv,Amon,ci,ci,tavg-u-hxy-u,ci_tavg-u-hxy-u,glb,Amon.ci,atmos.ci.tavg-u-hxy-u.mon.glb,baaa3984-e5dd-11e5-8482-ac72891c3257,high,,
+43,atmos.cl.tavg-al-hxy-u.mon.glb,mon,atmos,cloud_area_fraction_in_atmosphere_layer,%,area: time: mean,area: areacella,Percentage Cloud Cover,Includes both large-scale and convective cloud.,Report on model layers (not standard pressures).,longitude latitude alevel time,cl,real,,XY-A,time-intv,Amon,cl,cl,tavg-al-hxy-u,cl_tavg-al-hxy-u,glb,Amon.cl,atmos.cl.tavg-al-hxy-u.mon.glb,baaa4302-e5dd-11e5-8482-ac72891c3257,core,,
+44,atmos.clc.tavg-al-hxy-u.mon.glb,mon,atmos,convective_cloud_area_fraction_in_atmosphere_layer,%,area: time: mean,area: areacella,Convective Cloud Area Percentage,Include only convective cloud.,,longitude latitude alevel time,clc,real,,XY-A,time-intv,CFmon,clc,clc,tavg-al-hxy-u,clc_tavg-al-hxy-u,glb,CFmon.clc,atmos.clc.tavg-al-hxy-u.mon.glb,baaa557c-e5dd-11e5-8482-ac72891c3257,high,,
+45,atmos.clcalipso.tavg-220hPa-hxy-air.day.glb,day,atmos,cloud_area_fraction_in_atmosphere_layer,%,area: time: mean where air,area: areacella,CALIPSO High Level Cloud Area Percentage,Percentage cloud cover in layer centred on 220hPa,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean CMIP7:area: time: mean where air,",longitude latitude time p220,clcalipso,real,,XY-na,time-intv,CFday,clhcalipso,clcalipso,tavg-220hPa-hxy-air,clcalipso_tavg-220hPa-hxy-air,glb,CFday.clhcalipso,atmos.clcalipso.tavg-220hPa-hxy-air.day.glb,baaa766a-e5dd-11e5-8482-ac72891c3257,high,,
+46,atmos.clcalipso.tavg-220hPa-hxy-air.mon.glb,mon,atmos,cloud_area_fraction_in_atmosphere_layer,%,area: time: mean where air,area: areacella,CALIPSO High Level Cloud Area Percentage,Percentage cloud cover in layer centred on 220hPa,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean CMIP7:area: time: mean where air,",longitude latitude time p220,clcalipso,real,,XY-na,time-intv,CFmon,clhcalipso,clcalipso,tavg-220hPa-hxy-air,clcalipso_tavg-220hPa-hxy-air,glb,CFmon.clhcalipso,atmos.clcalipso.tavg-220hPa-hxy-air.mon.glb,baaa7818-e5dd-11e5-8482-ac72891c3257,high,,
+47,atmos.clcalipso.tavg-560hPa-hxy-air.day.glb,day,atmos,cloud_area_fraction_in_atmosphere_layer,%,area: time: mean where air,area: areacella,CALIPSO Mid Level Cloud Cover Percentage,Percentage cloud cover in layer centred on 560hPa,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean CMIP7:area: time: mean where air,",longitude latitude time p560,clcalipso,real,,XY-na,time-intv,CFday,clmcalipso,clcalipso,tavg-560hPa-hxy-air,clcalipso_tavg-560hPa-hxy-air,glb,CFday.clmcalipso,atmos.clcalipso.tavg-560hPa-hxy-air.day.glb,baaabf08-e5dd-11e5-8482-ac72891c3257,high,,
+48,atmos.clcalipso.tavg-560hPa-hxy-air.mon.glb,mon,atmos,cloud_area_fraction_in_atmosphere_layer,%,area: time: mean where air,area: areacella,CALIPSO Mid Level Cloud Cover Percentage,Percentage cloud cover in layer centred on 560hPa,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean CMIP7:area: time: mean where air,",longitude latitude time p560,clcalipso,real,,XY-na,time-intv,CFmon,clmcalipso,clcalipso,tavg-560hPa-hxy-air,clcalipso_tavg-560hPa-hxy-air,glb,CFmon.clmcalipso,atmos.clcalipso.tavg-560hPa-hxy-air.mon.glb,baaac0de-e5dd-11e5-8482-ac72891c3257,high,,
+49,atmos.clcalipso.tavg-840hPa-hxy-air.day.glb,day,atmos,cloud_area_fraction_in_atmosphere_layer,%,area: time: mean where air,area: areacella,CALIPSO Low Level Cloud Cover Percentage,Percentage cloud cover in layer centred on 840hPa,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean CMIP7:area: time: mean where air,",longitude latitude time p840,clcalipso,real,,XY-na,time-intv,CFday,cllcalipso,clcalipso,tavg-840hPa-hxy-air,clcalipso_tavg-840hPa-hxy-air,glb,CFday.cllcalipso,atmos.clcalipso.tavg-840hPa-hxy-air.day.glb,baaab2e2-e5dd-11e5-8482-ac72891c3257,high,,
+50,atmos.clcalipso.tavg-840hPa-hxy-air.mon.glb,mon,atmos,cloud_area_fraction_in_atmosphere_layer,%,area: time: mean where air,area: areacella,CALIPSO Low Level Cloud Cover Percentage,Percentage cloud cover in layer centred on 840hPa,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean CMIP7:area: time: mean where air,",longitude latitude time p840,clcalipso,real,,XY-na,time-intv,CFmon,cllcalipso,clcalipso,tavg-840hPa-hxy-air,clcalipso_tavg-840hPa-hxy-air,glb,CFmon.cllcalipso,atmos.clcalipso.tavg-840hPa-hxy-air.mon.glb,baaab4b8-e5dd-11e5-8482-ac72891c3257,high,,
+51,atmos.clcalipso.tavg-h40-hxy-air.mon.glb,mon,atmos,cloud_area_fraction_in_atmosphere_layer,%,area: time: mean where air,area: areacella,CALIPSO Percentage Cloud Cover,Percentage cloud cover in CALIPSO standard atmospheric layers.,"40 height levels. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: time: mean where air,",longitude latitude alt40 time,clcalipso,real,,XY-H40,time-intv,CFmon,clcalipso,clcalipso,tavg-h40-hxy-air,clcalipso_tavg-h40-hxy-air,glb,CFmon.clcalipso,atmos.clcalipso.tavg-h40-hxy-air.mon.glb,baaa5db0-e5dd-11e5-8482-ac72891c3257,high,,
+52,atmos.cldnci.tavg-u-hxy-cl.day.glb,day,atmos,number_concentration_of_ice_crystals_in_air_at_ice_cloud_top,m-3,"area: time: mean where cloud (mean over the portion of the cell containing ice topped cloud, as seen from top of atmosphere)",area: areacella,Ice Crystal Number Concentration of Cloud Tops,"Concentration 'as seen from space' over ice-cloud portion of grid cell. This is the value from uppermost model layer with ice cloud or, if available, it is the sum over all ice cloud tops, no matter where they occur, as long as they are seen from the top of the atmosphere. Weight by total ice cloud top fraction (as seen from TOA) of each time sample when computing monthly mean.","CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean CMIP7:area: time: mean where cloud (mean over the portion of the cell containing ice topped cloud, as seen from top of atmosphere),",longitude latitude time,cldnci,real,,XY-na,time-intv,Eday,cldnci,cldnci,tavg-u-hxy-cl,cldnci_tavg-u-hxy-cl,glb,Eday.cldnci,atmos.cldnci.tavg-u-hxy-cl.day.glb,7d8c38bc-1ab7-11e7-8dfc-5404a60d96b5,low,,
+53,atmos.cldnvi.tavg-u-hxy-u.day.glb,day,atmos,atmosphere_number_content_of_cloud_droplets,m-2,area: time: mean,area: areacella,Column Integrated Cloud Droplet Number,"Droplets are liquid only. Values are weighted by liquid cloud fraction in each layer when vertically integrating, and for monthly means the samples are weighted by total liquid cloud fraction (as seen from TOA).",,longitude latitude time,cldnvi,real,,XY-na,time-intv,Eday,cldnvi,cldnvi,tavg-u-hxy-u,cldnvi_tavg-u-hxy-u,glb,Eday.cldnvi,atmos.cldnvi.tavg-u-hxy-u.day.glb,7d8c7188-1ab7-11e7-8dfc-5404a60d96b5,high,,
+54,atmos.cli.tavg-al-hxy-u.mon.glb,mon,atmos,mass_fraction_of_cloud_ice_in_air,kg kg-1,area: time: mean,area: areacella,Mass Fraction of Cloud Ice,Includes both large-scale and convective cloud. This is calculated as the mass of cloud ice in the grid cell divided by the mass of air (including the water in all phases) in the grid cell. It includes precipitating hydrometeors ONLY if the precipitating hydrometeors affect the calculation of radiative transfer in model.,Report on model layers (not standard pressures).,longitude latitude alevel time,cli,real,,XY-A,time-intv,Amon,cli,cli,tavg-al-hxy-u,cli_tavg-al-hxy-u,glb,Amon.cli,atmos.cli.tavg-al-hxy-u.mon.glb,baaa8326-e5dd-11e5-8482-ac72891c3257,core,,
+55,atmos.clic.tavg-al-hxy-u.mon.glb,mon,atmos,mass_fraction_of_convective_cloud_ice_in_air,1,area: time: mean,area: areacella,Mass Fraction of Convective Cloud Ice,Calculated as the mass of convective cloud ice in the grid cell divided by the mass of air (including the water in all phases) in the grid cell. This includes precipitating hydrometeors ONLY if the precipitating hydrometeors affect the calculation of radiative transfer in model.,,longitude latitude alevel time,clic,real,,XY-A,time-intv,CFmon,clic,clic,tavg-al-hxy-u,clic_tavg-al-hxy-u,glb,CFmon.clic,atmos.clic.tavg-al-hxy-u.mon.glb,baaa8aa6-e5dd-11e5-8482-ac72891c3257,high,,
+56,atmos.clis.tavg-al-hxy-u.mon.glb,mon,atmos,mass_fraction_of_stratiform_cloud_ice_in_air,1,area: time: mean,area: areacella,Mass Fraction of Stratiform Cloud Ice,Calculated as the mass of stratiform cloud ice in the grid cell divided by the mass of air (including the water in all phases) in the grid cell. This includes precipitating hydrometeors ONLY if the precipitating hydrometeors affect the calculation of radiative transfer in model.,,longitude latitude alevel time,clis,real,,XY-A,time-intv,CFmon,clis,clis,tavg-al-hxy-u,clis_tavg-al-hxy-u,glb,CFmon.clis,atmos.clis.tavg-al-hxy-u.mon.glb,baaa8cd6-e5dd-11e5-8482-ac72891c3257,high,,
+57,atmos.clisccp.tavg-p7c-hxy-air.mon.glb,mon,atmos,isccp_cloud_area_fraction,%,area: time: mean where air,area: areacella,ISCCP Cloud Area Percentage,Percentage cloud cover in optical depth categories.,"7 levels x 7 tau. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean CMIP7:area: time: mean where air,",longitude latitude plev7c tau time,clisccp,real,,XY-P7,time-intv,CFmon,clisccp,clisccp,tavg-p7c-hxy-air,clisccp_tavg-p7c-hxy-air,glb,CFmon.clisccp,atmos.clisccp.tavg-p7c-hxy-air.mon.glb,2ab325ee-c07e-11e6-8775-5404a60d96b5,high,,
+58,atmos.clivi.tavg-u-hxy-u.day.glb,day,atmos,atmosphere_mass_content_of_cloud_ice,kg m-2,area: time: mean,area: areacella,Ice Water Path,calculate mass of ice water in the column divided by the area of the column (not just the area of the cloudy portion of the column). This includes precipitating frozen hydrometeors ONLY if the precipitating hydrometeors affect the calculation of radiative transfer in model.,,longitude latitude time,clivi,real,,XY-na,time-intv,CFday,clivi,clivi,tavg-u-hxy-u,clivi_tavg-u-hxy-u,glb,CFday.clivi,atmos.clivi.tavg-u-hxy-u.day.glb,baaa9cc6-e5dd-11e5-8482-ac72891c3257,high,,
+59,atmos.clivi.tavg-u-hxy-u.mon.glb,mon,atmos,atmosphere_mass_content_of_cloud_ice,kg m-2,area: time: mean,area: areacella,Ice Water Path,mass of ice water in the column divided by the area of the column (not just the area of the cloudy portion of the column). Includes precipitating frozen hydrometeors ONLY if the precipitating hydrometeor affects the calculation of radiative transfer in model.,,longitude latitude time,clivi,real,,XY-na,time-intv,Amon,clivi,clivi,tavg-u-hxy-u,clivi_tavg-u-hxy-u,glb,Amon.clivi,atmos.clivi.tavg-u-hxy-u.mon.glb,baaa9852-e5dd-11e5-8482-ac72891c3257,core,,
+60,atmos.clivic.tavg-u-hxy-u.day.glb,day,atmos,atmosphere_mass_content_of_convective_cloud_ice,kg m-2,area: time: mean,area: areacella,Convective Ice Water Path,calculate mass of convective ice water in the column divided by the area of the column (not just the area of the cloudy portion of the column). This includes precipitating frozen hydrometeors ONLY if the precipitating hydrometeors affect the calculation of radiative transfer in model.,,longitude latitude time,clivic,real,,XY-na,time-intv,Eday,clivic,clivic,tavg-u-hxy-u,clivic_tavg-u-hxy-u,glb,Eday.clivic,atmos.clivic.tavg-u-hxy-u.day.glb,8b8a3932-4a5b-11e6-9cd2-ac72891c3257,high,,
+61,atmos.clmisr.tavg-h16-hxy-air.mon.glb,mon,atmos,cloud_area_fraction_in_atmosphere_layer,%,area: time: mean where air,area: areacella,Percentage Cloud Cover as Calculated by the MISR Simulator (Including Error Flag),MISR cloud area fraction,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean CMIP7:area: time: mean where air,",longitude latitude alt16 tau time,clmisr,real,,XY-H16,time-intv,Emon,clmisr,clmisr,tavg-h16-hxy-air,clmisr_tavg-h16-hxy-air,glb,Emon.clmisr,atmos.clmisr.tavg-h16-hxy-air.mon.glb,8b8a51ce-4a5b-11e6-9cd2-ac72891c3257,high,,
+62,atmos.cls.tavg-al-hxy-u.mon.glb,mon,atmos,stratiform_cloud_area_fraction_in_atmosphere_layer,%,area: time: mean,area: areacella,Percentage Cover of Stratiform Cloud,"Cloud area fraction (reported as a percentage) for the whole atmospheric column due to stratiform clouds, as seen from the surface or the top of the atmosphere. Includes both large-scale and convective cloud.",,longitude latitude alevel time,cls,real,,XY-A,time-intv,CFmon,cls,cls,tavg-al-hxy-u,cls_tavg-al-hxy-u,glb,CFmon.cls,atmos.cls.tavg-al-hxy-u.mon.glb,baaac764-e5dd-11e5-8482-ac72891c3257,high,,
+63,atmos.clt.tavg-u-hxy-u.day.glb,day,atmos,cloud_area_fraction,%,area: time: mean,area: areacella,Total Cloud Cover Percentage,"for the whole atmospheric column, as seen from the surface or the top of the atmosphere. Includes both large-scale and convective cloud.",,longitude latitude time,clt,real,,XY-na,time-intv,day,clt,clt,tavg-u-hxy-u,clt_tavg-u-hxy-u,glb,day.clt,atmos.clt.tavg-u-hxy-u.day.glb,baaace4e-e5dd-11e5-8482-ac72891c3257,core,,
+64,atmos.clt.tavg-u-hxy-u.mon.glb,mon,atmos,cloud_area_fraction,%,area: time: mean,area: areacella,Total Cloud Cover Percentage,"for the whole atmospheric column, as seen from the surface or the top of the atmosphere. Include both large-scale and convective cloud.",,longitude latitude time,clt,real,,XY-na,time-intv,Amon,clt,clt,tavg-u-hxy-u,clt_tavg-u-hxy-u,glb,Amon.clt,atmos.clt.tavg-u-hxy-u.mon.glb,baaad7e0-e5dd-11e5-8482-ac72891c3257,core,,
+65,atmos.cltcalipso.tavg-u-hxy-u.day.glb,day,atmos,cloud_area_fraction,%,area: time: mean,area: areacella,CALIPSO Total Cloud Cover Percentage,"Total cloud area fraction (reported as a percentage) for the whole atmospheric column, as seen by the Cloud-Aerosol Lidar and Infrared Pathfinder Satellite Observation (CALIPSO) instrument. Includes both large-scale and convective cloud.",,longitude latitude time,cltcalipso,real,,XY-na,time-intv,CFday,cltcalipso,cltcalipso,tavg-u-hxy-u,cltcalipso_tavg-u-hxy-u,glb,CFday.cltcalipso,atmos.cltcalipso.tavg-u-hxy-u.day.glb,baaaf2e8-e5dd-11e5-8482-ac72891c3257,high,,
+66,atmos.cltcalipso.tavg-u-hxy-u.mon.glb,mon,atmos,cloud_area_fraction,%,area: time: mean,area: areacella,CALIPSO Total Cloud Cover Percentage,"Total cloud area fraction (reported as a percentage) for the whole atmospheric column, as seen by the Cloud-Aerosol Lidar and Infrared Pathfinder Satellite Observation (CALIPSO) instrument. Includes both large-scale and convective cloud.",,longitude latitude time,cltcalipso,real,,XY-na,time-intv,CFmon,cltcalipso,cltcalipso,tavg-u-hxy-u,cltcalipso_tavg-u-hxy-u,glb,CFmon.cltcalipso,atmos.cltcalipso.tavg-u-hxy-u.mon.glb,baaaf4a0-e5dd-11e5-8482-ac72891c3257,high,,
+67,atmos.cltisccp.tavg-u-hxy-u.day.glb,day,atmos,cloud_area_fraction,%,area: time: mean,area: areacella,ISCCP Total Cloud Cover Percentage,"Total cloud area fraction (reported as a percentage) for the whole atmospheric column, as seen by the International Satellite Cloud Climatology Project (ISCCP) analysis. Includes both large-scale and convective cloud. (MODIS). Includes both large-scale and convective cloud.",,longitude latitude time,cltisccp,real,,XY-na,time-intv,CFday,cltisccp,cltisccp,tavg-u-hxy-u,cltisccp_tavg-u-hxy-u,glb,CFday.cltisccp,atmos.cltisccp.tavg-u-hxy-u.day.glb,baaaf8a6-e5dd-11e5-8482-ac72891c3257,high,,
+68,atmos.cltisccp.tavg-u-hxy-u.mon.glb,mon,atmos,cloud_area_fraction,%,area: time: mean,area: areacella,ISCCP Total Cloud Cover Percentage,"Total cloud area fraction (reported as a percentage) for the whole atmospheric column, as seen by the International Satellite Cloud Climatology Project (ISCCP) analysis. Includes both large-scale and convective cloud. (MODIS). Includes both large-scale and convective cloud.",,longitude latitude time,cltisccp,real,,XY-na,time-intv,CFmon,cltisccp,cltisccp,tavg-u-hxy-u,cltisccp_tavg-u-hxy-u,glb,CFmon.cltisccp,atmos.cltisccp.tavg-u-hxy-u.mon.glb,baaafa68-e5dd-11e5-8482-ac72891c3257,high,,
+69,atmos.clw.tavg-al-hxy-u.mon.glb,mon,atmos,mass_fraction_of_cloud_liquid_water_in_air,kg kg-1,area: time: mean,area: areacella,Mass Fraction of Cloud Liquid Water,Includes both large-scale and convective cloud. Calculate as the mass of cloud liquid water in the grid cell divided by the mass of air (including the water in all phases) in the grid cells. Precipitating hydrometeors are included ONLY if the precipitating hydrometeors affect the calculation of radiative transfer in model.,Report on model layers (not standard pressures).,longitude latitude alevel time,clw,real,,XY-A,time-intv,Amon,clw,clw,tavg-al-hxy-u,clw_tavg-al-hxy-u,glb,Amon.clw,atmos.clw.tavg-al-hxy-u.mon.glb,baab0382-e5dd-11e5-8482-ac72891c3257,core,,
+70,atmos.clwc.tavg-al-hxy-u.mon.glb,mon,atmos,mass_fraction_of_convective_cloud_liquid_water_in_air,1,area: time: mean,area: areacella,Mass Fraction of Convective Cloud Liquid Water,Calculated as the mass of convective cloud liquid water in the grid cell divided by the mass of air (including the water in all phases) in the grid cell. This includes precipitating hydrometeors ONLY if the precipitating hydrometeors affect the calculation of radiative transfer in model.,,longitude latitude alevel time,clwc,real,,XY-A,time-intv,CFmon,clwc,clwc,tavg-al-hxy-u,clwc_tavg-al-hxy-u,glb,CFmon.clwc,atmos.clwc.tavg-al-hxy-u.mon.glb,baab0b2a-e5dd-11e5-8482-ac72891c3257,high,,
+71,atmos.clws.tavg-al-hxy-u.mon.glb,mon,atmos,mass_fraction_of_stratiform_cloud_liquid_water_in_air,1,area: time: mean,area: areacella,Mass Fraction of Stratiform Cloud Liquid Water,Calculated as the mass of stratiform cloud liquid water in the grid cell divided by the mass of air (including the water in all phases) in the grid cell. This includes precipitating hydrometeors ONLY if the precipitating hydrometeors affect the calculation of radiative transfer in model.,,longitude latitude alevel time,clws,real,,XY-A,time-intv,CFmon,clws,clws,tavg-al-hxy-u,clws_tavg-al-hxy-u,glb,CFmon.clws,atmos.clws.tavg-al-hxy-u.mon.glb,baab0f3a-e5dd-11e5-8482-ac72891c3257,high,,
+72,atmos.clwvi.tavg-u-hxy-u.day.glb,day,atmos,atmosphere_mass_content_of_cloud_condensed_water,kg m-2,area: time: mean,area: areacella,Condensed Water Path,calculate mass of condensed (liquid + ice) water in the column divided by the area of the column (not just the area of the cloudy portion of the column). This includes precipitating hydrometeors ONLY if the precipitating hydrometeors affect the calculation of radiative transfer in model.,,longitude latitude time,clwvi,real,,XY-na,time-intv,CFday,clwvi,clwvi,tavg-u-hxy-u,clwvi_tavg-u-hxy-u,glb,CFday.clwvi,atmos.clwvi.tavg-u-hxy-u.day.glb,baab15a2-e5dd-11e5-8482-ac72891c3257,high,,
+73,atmos.clwvi.tavg-u-hxy-u.mon.glb,mon,atmos,atmosphere_mass_content_of_cloud_condensed_water,kg m-2,area: time: mean,area: areacella,Condensed Water Path,mass of condensed (liquid + ice) water in the column divided by the area of the column (not just the area of the cloudy portion of the column). Includes precipitating hydrometeors ONLY if the precipitating hydrometeor affects the calculation of radiative transfer in model.,,longitude latitude time,clwvi,real,,XY-na,time-intv,Amon,clwvi,clwvi,tavg-u-hxy-u,clwvi_tavg-u-hxy-u,glb,Amon.clwvi,atmos.clwvi.tavg-u-hxy-u.mon.glb,baab1818-e5dd-11e5-8482-ac72891c3257,core,,
+74,atmos.clwvic.tavg-u-hxy-u.day.glb,day,atmos,atmosphere_mass_content_of_convective_cloud_condensed_water,kg m-2,area: time: mean,area: areacella,Convective Condensed Water Path,calculate mass of convective condensed (liquid + ice) water in the column divided by the area of the column (not just the area of the cloudy portion of the column). This includes precipitating hydrometeors ONLY if the precipitating hydrometeors affect the calculation of radiative transfer in model.,,longitude latitude time,clwvic,real,,XY-na,time-intv,Eday,clwvic,clwvic,tavg-u-hxy-u,clwvic_tavg-u-hxy-u,glb,Eday.clwvic,atmos.clwvic.tavg-u-hxy-u.day.glb,8b8a33ce-4a5b-11e6-9cd2-ac72891c3257,high,,
+79,atmos.co23D.tavg-al-hxy-u.mon.glb,mon,atmos,mass_fraction_of_carbon_dioxide_tracer_in_air,kg kg-1,area: time: mean,area: areacella,3D-Field of Transported CO2,requested for all Emissions-driven runs,,longitude latitude alevel time,co23D,real,,XY-A,time-intv,Emon,co23D,co23D,tavg-al-hxy-u,co23D_tavg-al-hxy-u,glb,Emon.co23D,atmos.co23D.tavg-al-hxy-u.mon.glb,e705484a-aa7f-11e6-9a4a-5404a60d96b5,high,,
+80,atmos.co2mass.tavg-u-hm-u.mon.glb,mon,atmos,atmosphere_mass_of_carbon_dioxide,kg,height: sum (through atmospheric column) area: sum time: mean,,Total Atmospheric Mass of CO2,Total atmospheric mass of Carbon Dioxide,"For some simulations (e.g., prescribed concentration pi-control run), this will not vary from one year to the next, and so report instead the variable described in the next table entry. If CO2 is spatially nonuniform, omit this field, but report Mole Fraction of CO2 (see the table entry before the previous one). CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean CMIP7:height: sum (through atmospheric column) area: sum time: mean,",time,co2mass,real,,na-na,time-intv,Amon,co2mass,co2mass,tavg-u-hm-u,co2mass_tavg-u-hm-u,glb,Amon.co2mass,atmos.co2mass.tavg-u-hm-u.mon.glb,baab2d9e-e5dd-11e5-8482-ac72891c3257,high,,
+81,atmos.dmc.tavg-alh-hxy-u.mon.glb,mon,atmos,atmosphere_net_upward_deep_convective_mass_flux,kg m-2 s-1,area: time: mean,area: areacella,Deep Convective Mass Flux,The net mass flux represents the difference between the updraft and downdraft components. This is calculated as the convective mass flux divided by the area of the whole grid cell (not just the area of the cloud).,"Report on model half-levels (i.e., model layer bounds and not standard pressures).",longitude latitude alevhalf time,dmc,real,up,XY-AH,time-intv,CFmon,dmc,dmc,tavg-alh-hxy-u,dmc_tavg-alh-hxy-u,glb,CFmon.dmc,atmos.dmc.tavg-alh-hxy-u.mon.glb,baac1790-e5dd-11e5-8482-ac72891c3257,high,,
+82,atmos.edt.tavg-al-hxy-u.mon.glb,mon,atmos,atmosphere_heat_diffusivity,m2 s-1,area: time: mean,area: areacella,Eddy Diffusivity Coefficient for Temperature,Vertical diffusion coefficient for temperature due to parametrised eddies,,longitude latitude alevel time,edt,real,,XY-A,time-intv,CFmon,edt,edt,tavg-al-hxy-u,edt_tavg-al-hxy-u,glb,CFmon.edt,atmos.edt.tavg-al-hxy-u.mon.glb,a94cab8c-817c-11e6-a4e2-5404a60d96b5,high,,
+84,atmos.evu.tavg-al-hxy-u.mon.glb,mon,atmos,atmosphere_momentum_diffusivity,m2 s-1,area: time: mean,area: areacella,Eddy Viscosity Coefficient for Momentum,Vertical diffusion coefficient for momentum due to parametrised eddies,,longitude latitude alevel time,evu,real,,XY-A,time-intv,CFmon,evu,evu,tavg-al-hxy-u,evu_tavg-al-hxy-u,glb,CFmon.evu,atmos.evu.tavg-al-hxy-u.mon.glb,a94c9fc0-817c-11e6-a4e2-5404a60d96b5,high,,
+85,atmos.fco2antt.tavg-u-hxy-u.mon.glb,mon,atmos,tendency_of_atmosphere_mass_content_of_carbon_dioxide_expressed_as_carbon_due_to_anthropogenic_emission,kg m-2 s-1,area: time: mean,area: areacella,Carbon Mass Flux into Atmosphere Due to All Anthropogenic Emissions of CO2 [kgC m-2 s-1],"This is requested only for the emission-driven coupled carbon climate model runs. Does not include natural fire sources but, includes all anthropogenic sources, including fossil fuel use, cement production, agricultural burning, and sources associated with anthropogenic land use change excluding forest regrowth.",,longitude latitude time,fco2antt,real,,XY-na,time-intv,Amon,fco2antt,fco2antt,tavg-u-hxy-u,fco2antt_tavg-u-hxy-u,glb,Amon.fco2antt,atmos.fco2antt.tavg-u-hxy-u.mon.glb,baaddada-e5dd-11e5-8482-ac72891c3257,high,,
+86,atmos.fco2fos.tavg-u-hxy-u.mon.glb,mon,atmos,tendency_of_atmosphere_mass_content_of_carbon_dioxide_expressed_as_carbon_due_to_emission_from_fossil_fuel_combustion,kg m-2 s-1,area: time: mean,area: areacella,Carbon Mass Flux into Atmosphere Due to Fossil Fuel Emissions of CO2 [kgC m-2 s-1],"This is the prescribed anthropogenic CO2 flux from fossil fuel use, including cement production, and flaring (but not from land-use changes, agricultural burning, forest regrowth, etc.)",This is requested only for the emission-driven coupled carbon climate model runs.,longitude latitude time,fco2fos,real,,XY-na,time-intv,Amon,fco2fos,fco2fos,tavg-u-hxy-u,fco2fos_tavg-u-hxy-u,glb,Amon.fco2fos,atmos.fco2fos.tavg-u-hxy-u.mon.glb,baade44e-e5dd-11e5-8482-ac72891c3257,high,,
+87,atmos.fco2nat.tavg-u-hxy-u.mon.glb,mon,atmos,surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_emission_from_natural_sources,kg m-2 s-1,area: time: mean,area: areacella,Surface Carbon Mass Flux into the Atmosphere Due to Natural Sources [kgC m-2 s-1],"This is what the atmosphere sees (on its own grid). This field should be equivalent to the combined natural fluxes of carbon (requested in the L_mon and O_mon tables) that account for natural exchanges between the atmosphere and land or ocean reservoirs (i.e., ""net ecosystem biospheric productivity"", for land, and ""air to sea CO2 flux"", for ocean.)",Report from all simulations (both emission-driven and concentration-driven) performed by models with fully interactive and responsive carbon cycles.,longitude latitude time,fco2nat,real,,XY-na,time-intv,Amon,fco2nat,fco2nat,tavg-u-hxy-u,fco2nat_tavg-u-hxy-u,glb,Amon.fco2nat,atmos.fco2nat.tavg-u-hxy-u.mon.glb,baaded68-e5dd-11e5-8482-ac72891c3257,high,,
+88,atmos.hfls.tavg-u-hxy-u.day.glb,day,atmos,surface_upward_latent_heat_flux,W m-2,area: time: mean,area: areacella,Surface Upward Latent Heat Flux,"The surface called ""surface"" means the lower boundary of the atmosphere. ""Upward"" indicates a vector component which is positive when directed upward (negative downward). The surface latent heat flux is the exchange of heat between the surface and the air on account of evaporation (including sublimation). In accordance with common usage in geophysical disciplines, ""flux"" implies per unit area, called ""flux density"" in physics.",,longitude latitude time,hfls,real,up,XY-na,time-intv,day,hfls,hfls,tavg-u-hxy-u,hfls_tavg-u-hxy-u,glb,day.hfls,atmos.hfls.tavg-u-hxy-u.day.glb,baaf0a9a-e5dd-11e5-8482-ac72891c3257,high,,
+89,atmos.hfls.tavg-u-hxy-u.mon.glb,mon,atmos,surface_upward_latent_heat_flux,W m-2,area: time: mean,area: areacella,Surface Upward Latent Heat Flux,includes both evaporation and sublimation,,longitude latitude time,hfls,real,up,XY-na,time-intv,Amon,hfls,hfls,tavg-u-hxy-u,hfls_tavg-u-hxy-u,glb,Amon.hfls,atmos.hfls.tavg-u-hxy-u.mon.glb,baaefe2e-e5dd-11e5-8482-ac72891c3257,core,,
+90,atmos.hfss.tavg-u-hxy-u.day.glb,day,atmos,surface_upward_sensible_heat_flux,W m-2,area: time: mean,area: areacella,Surface Upward Sensible Heat Flux,"The surface sensible heat flux, also called turbulent heat flux, is the exchange of heat between the surface and the air by motion of air.",,longitude latitude time,hfss,real,up,XY-na,time-intv,day,hfss,hfss,tavg-u-hxy-u,hfss_tavg-u-hxy-u,glb,day.hfss,atmos.hfss.tavg-u-hxy-u.day.glb,baaf91cc-e5dd-11e5-8482-ac72891c3257,high,,
+91,atmos.hfss.tavg-u-hxy-u.mon.glb,mon,atmos,surface_upward_sensible_heat_flux,W m-2,area: time: mean,area: areacella,Surface Upward Sensible Heat Flux,"The surface sensible heat flux, also called turbulent heat flux, is the exchange of heat between the surface and the air by motion of air.",,longitude latitude time,hfss,real,up,XY-na,time-intv,Amon,hfss,hfss,tavg-u-hxy-u,hfss_tavg-u-hxy-u,glb,Amon.hfss,atmos.hfss.tavg-u-hxy-u.mon.glb,baaf86a0-e5dd-11e5-8482-ac72891c3257,core,,
+92,atmos.hur.tavg-al-hxy-u.mon.glb,mon,atmos,relative_humidity,%,area: time: mean,area: areacella,Relative Humidity,"The relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.",,longitude latitude alevel time,hur,real,,XY-A,time-intv,CFmon,hur,hur,tavg-al-hxy-u,hur_tavg-al-hxy-u,glb,CFmon.hur,atmos.hur.tavg-al-hxy-u.mon.glb,baafe8fc-e5dd-11e5-8482-ac72891c3257,high,,
+93,atmos.hur.tavg-p19-hxy-air.mon.glb,mon,atmos,relative_humidity,%,area: time: mean where air,area: areacella,Relative Humidity,"This is the relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.","CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: time: mean where air,",longitude latitude plev19 time,hur,real,,XY-P19,time-intv,Amon,hur,hur,tavg-p19-hxy-air,hur_tavg-p19-hxy-air,glb,Amon.hur,atmos.hur.tavg-p19-hxy-air.mon.glb,baafe578-e5dd-11e5-8482-ac72891c3257,core,,
+94,atmos.hur.tavg-p19-hxy-u.day.glb,day,atmos,relative_humidity,%,time: mean,area: areacella,Relative Humidity,"This is the relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.","CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude plev8 time CMIP7:longitude latitude plev19 time,",longitude latitude plev19 time,hur,real,,XY-P19,time-intv,day,hur,hur,tavg-p19-hxy-u,hur_tavg-p19-hxy-u,glb,day.hur,atmos.hur.tavg-p19-hxy-u.day.glb,baafec80-e5dd-11e5-8482-ac72891c3257,core,,
+95,atmos.hurs.tavg-h2m-hxy-u.6hr.glb,6hr,atmos,relative_humidity,%,area: time: mean,area: areacella,Near-Surface Relative Humidity,"The relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.",,longitude latitude time height2m,hurs,real,,XY-na,time-intv,6hrPlev,hurs,hurs,tavg-h2m-hxy-u,hurs_tavg-h2m-hxy-u,glb,6hrPlev.hurs,atmos.hurs.tavg-h2m-hxy-u.6hr.glb,917b8532-267c-11e7-8933-ac72891c3257,core,,
+96,atmos.hurs.tavg-h2m-hxy-u.day.glb,day,atmos,relative_humidity,%,area: time: mean,area: areacella,Near-Surface Relative Humidity,"This is the relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.",normally report this at 2 meters above the surface,longitude latitude time height2m,hurs,real,,XY-na,time-intv,day,hurs,hurs,tavg-h2m-hxy-u,hurs_tavg-h2m-hxy-u,glb,day.hurs,atmos.hurs.tavg-h2m-hxy-u.day.glb,5a070350-c77d-11e6-8a33-5404a60d96b5,core,,
+97,atmos.hurs.tavg-h2m-hxy-u.mon.glb,mon,atmos,relative_humidity,%,area: time: mean,area: areacella,Near-Surface Relative Humidity,"This is the relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.","express as a percentage. Normally, the relative humidity should be reported at the 2 meter height",longitude latitude time height2m,hurs,real,,XY-na,time-intv,Amon,hurs,hurs,tavg-h2m-hxy-u,hurs_tavg-h2m-hxy-u,glb,Amon.hurs,atmos.hurs.tavg-h2m-hxy-u.mon.glb,baaff41e-e5dd-11e5-8482-ac72891c3257,core,,
+98,atmos.hurs.tmax-h2m-hxy-u.day.glb,day,atmos,relative_humidity,%,area: mean time: maximum,area: areacella,Daily Maximum Near-Surface Relative Humidity,"This is the relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.",normally report this at 2 meters above the surface,longitude latitude time height2m,hurs,real,,XY-na,time-intv,day,hursmax,hurs,tmax-h2m-hxy-u,hurs_tmax-h2m-hxy-u,glb,day.hursmax,atmos.hurs.tmax-h2m-hxy-u.day.glb,5a071ff2-c77d-11e6-8a33-5404a60d96b5,high,,
+99,atmos.hurs.tmin-h2m-hxy-u.day.glb,day,atmos,relative_humidity,%,area: mean time: minimum,area: areacella,Daily Minimum Near-Surface Relative Humidity,"This is the relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.",normally report this at 2 meters above the surface,longitude latitude time height2m,hurs,real,,XY-na,time-intv,day,hursmin,hurs,tmin-h2m-hxy-u,hurs_tmin-h2m-hxy-u,glb,day.hursmin,atmos.hurs.tmin-h2m-hxy-u.day.glb,5a0711f6-c77d-11e6-8a33-5404a60d96b5,high,,
+100,atmos.hus.tavg-al-hxy-u.mon.glb,mon,atmos,specific_humidity,1,area: time: mean,area: areacella,Specific Humidity,Specific humidity is the mass fraction of water vapor in (moist) air.,,longitude latitude alevel time,hus,real,,XY-A,time-intv,CFmon,hus,hus,tavg-al-hxy-u,hus_tavg-al-hxy-u,glb,CFmon.hus,atmos.hus.tavg-al-hxy-u.mon.glb,bab00f1c-e5dd-11e5-8482-ac72891c3257,high,,
+101,atmos.hus.tavg-p19-hxy-u.day.glb,day,atmos,specific_humidity,1,time: mean,area: areacella,Specific Humidity,Specific humidity is the mass fraction of water vapor in (moist) air.,"CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude plev8 time CMIP7:longitude latitude plev19 time,",longitude latitude plev19 time,hus,real,,XY-P19,time-intv,day,hus,hus,tavg-p19-hxy-u,hus_tavg-p19-hxy-u,glb,day.hus,atmos.hus.tavg-p19-hxy-u.day.glb,bab0135e-e5dd-11e5-8482-ac72891c3257,core,,
+102,atmos.hus.tavg-p19-hxy-u.mon.glb,mon,atmos,specific_humidity,1,time: mean,area: areacella,Specific Humidity,Specific humidity is the mass fraction of water vapor in (moist) air.,,longitude latitude plev19 time,hus,real,,XY-P19,time-intv,Amon,hus,hus,tavg-p19-hxy-u,hus_tavg-p19-hxy-u,glb,Amon.hus,atmos.hus.tavg-p19-hxy-u.mon.glb,bab00b98-e5dd-11e5-8482-ac72891c3257,core,,
+103,atmos.hus.tpt-al-hxy-u.6hr.glb,6hr,atmos,specific_humidity,1,area: mean time: point,area: areacella,Specific Humidity,Specific humidity is the mass fraction of water vapor in (moist) air.,on all model levels,longitude latitude alevel time1,hus,real,,XY-A,time-point,6hrLev,hus,hus,tpt-al-hxy-u,hus_tpt-al-hxy-u,glb,6hrLev.hus,atmos.hus.tpt-al-hxy-u.6hr.glb,bab009cc-e5dd-11e5-8482-ac72891c3257,high,,
+104,atmos.hus.tpt-p7h-hxy-air.6hr.glb,6hr,atmos,specific_humidity,1,area: mean where air time: point,area: areacella,Specific Humidity,"Extra levels - 925, 700, 600, 300, 50","CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean time: point CMIP7:area: mean where air time: point,",longitude latitude plev7h time1,hus,real,,XY-P7T,time-point,6hrPlevPt,hus,hus,tpt-p7h-hxy-air,hus_tpt-p7h-hxy-air,glb,6hrPlevPt.hus7h,atmos.hus.tpt-p7h-hxy-air.6hr.glb,71174f52-faa7-11e6-bfb7-ac72891c3257,high,,
+105,atmos.huss.tavg-h2m-hxy-u.day.glb,day,atmos,specific_humidity,1,area: time: mean,area: areacella,Near-Surface Specific Humidity,"Near-surface (usually, 2 meter) specific humidity.",normally report this at 2 meters above the surface,longitude latitude time height2m,huss,real,,XY-na,time-intv,day,huss,huss,tavg-h2m-hxy-u,huss_tavg-h2m-hxy-u,glb,day.huss,atmos.huss.tavg-h2m-hxy-u.day.glb,bab0238a-e5dd-11e5-8482-ac72891c3257,core,,
+106,atmos.huss.tavg-h2m-hxy-u.mon.glb,mon,atmos,specific_humidity,1,area: time: mean,area: areacella,Near-Surface Specific Humidity,"Near-surface (usually, 2 meter) specific humidity.",normally report this at 2 meters above the surface,longitude latitude time height2m,huss,real,,XY-na,time-intv,Amon,huss,huss,tavg-h2m-hxy-u,huss_tavg-h2m-hxy-u,glb,Amon.huss,atmos.huss.tavg-h2m-hxy-u.mon.glb,bab01dfe-e5dd-11e5-8482-ac72891c3257,core,,
+107,atmos.huss.tpt-h2m-hxy-u.1hr.glb,1hr,atmos,specific_humidity,1,area: mean time: point,area: areacella,Near-Surface Specific Humidity,Specific humidity at 2m.,This is sampled synoptically (instantaneous),longitude latitude time1 height2m,huss,real,,XY-na,time-point,E1hr,huss,huss,tpt-h2m-hxy-u,huss_tpt-h2m-hxy-u,glb,E1hr.huss,atmos.huss.tpt-h2m-hxy-u.1hr.glb,83bbfc78-7f07-11ef-9308-b1dd71e64bec,high,,
+108,atmos.huss.tpt-h2m-hxy-u.3hr.glb,3hr,atmos,specific_humidity,1,area: mean time: point,area: areacella,Near-Surface Specific Humidity,This is sampled synoptically.,normally report this at 2 meters above the surface,longitude latitude time1 height2m,huss,real,,XY-na,time-point,3hr,huss,huss,tpt-h2m-hxy-u,huss_tpt-h2m-hxy-u,glb,3hr.huss,atmos.huss.tpt-h2m-hxy-u.3hr.glb,bab034a6-e5dd-11e5-8482-ac72891c3257,core,,
+109,atmos.loadbc.tavg-u-hxy-u.day.glb,day,atmos,atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles,kg m-2,area: time: mean,area: areacella,Load of Black Carbon Aerosol,The total dry mass of black carbon aerosol particles per unit area.,,longitude latitude time,loadbc,real,,XY-na,time-intv,Eday,loadbc,loadbc,tavg-u-hxy-u,loadbc_tavg-u-hxy-u,glb,Eday.loadbc,atmos.loadbc.tavg-u-hxy-u.day.glb,8b8b08ee-4a5b-11e6-9cd2-ac72891c3257,high,,
+110,atmos.loaddust.tavg-u-hxy-u.day.glb,day,atmos,atmosphere_mass_content_of_dust_dry_aerosol_particles,kg m-2,area: time: mean,area: areacella,Load of Dust,The total dry mass of dust aerosol particles per unit area.,,longitude latitude time,loaddust,real,,XY-na,time-intv,Eday,loaddust,loaddust,tavg-u-hxy-u,loaddust_tavg-u-hxy-u,glb,Eday.loaddust,atmos.loaddust.tavg-u-hxy-u.day.glb,8b8b13de-4a5b-11e6-9cd2-ac72891c3257,low,,
+111,atmos.loadnh4.tavg-u-hxy-u.day.glb,day,atmos,atmosphere_mass_content_of_ammonium_dry_aerosol_particles,kg m-2,area: time: mean,area: areacella,Load of NH4,The total dry mass of ammonium aerosol particles per unit area.,,longitude latitude time,loadnh4,real,,XY-na,time-intv,Eday,loadnh4,loadnh4,tavg-u-hxy-u,loadnh4_tavg-u-hxy-u,glb,Eday.loadnh4,atmos.loadnh4.tavg-u-hxy-u.day.glb,8b8b23ba-4a5b-11e6-9cd2-ac72891c3257,low,,
+112,atmos.loadno3.tavg-u-hxy-u.day.glb,day,atmos,atmosphere_mass_content_of_nitrate_dry_aerosol_particles,kg m-2,area: time: mean,area: areacella,Load of NO3,The total dry mass of nitrate aerosol particles per unit area.,,longitude latitude time,loadno3,real,,XY-na,time-intv,Eday,loadno3,loadno3,tavg-u-hxy-u,loadno3_tavg-u-hxy-u,glb,Eday.loadno3,atmos.loadno3.tavg-u-hxy-u.day.glb,8b8b1e6a-4a5b-11e6-9cd2-ac72891c3257,low,,
+113,atmos.loadoa.tavg-u-hxy-u.day.glb,day,atmos,atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles,kg m-2,area: time: mean,area: areacella,Load of Dry Aerosol Organic Matter,atmosphere dry organic content: This is the vertically integrated sum of atmosphere_primary_organic_content and atmosphere_secondary_organic_content (see next two table entries).,,longitude latitude time,loadoa,real,,XY-na,time-intv,Eday,loadoa,loadoa,tavg-u-hxy-u,loadoa_tavg-u-hxy-u,glb,Eday.loadoa,atmos.loadoa.tavg-u-hxy-u.day.glb,8b8af886-4a5b-11e6-9cd2-ac72891c3257,high,,
+114,atmos.loadpoa.tavg-u-hxy-u.day.glb,day,atmos,atmosphere_mass_content_of_primary_particulate_organic_matter_dry_aerosol_particles,kg m-2,area: time: mean,area: areacella,Load of Dry Aerosol Primary Organic Matter,The total dry mass of primary particulate organic aerosol particles per unit area.,,longitude latitude time,loadpoa,real,,XY-na,time-intv,Eday,loadpoa,loadpoa,tavg-u-hxy-u,loadpoa_tavg-u-hxy-u,glb,Eday.loadpoa,atmos.loadpoa.tavg-u-hxy-u.day.glb,8b8afe30-4a5b-11e6-9cd2-ac72891c3257,high,,
+115,atmos.loadso4.tavg-u-hxy-u.day.glb,day,atmos,atmosphere_mass_content_of_sulfate_dry_aerosol_particles,kg m-2,area: time: mean,area: areacella,Load of SO4,The total dry mass of sulfate aerosol particles per unit area.,,longitude latitude time,loadso4,real,,XY-na,time-intv,Eday,loadso4,loadso4,tavg-u-hxy-u,loadso4_tavg-u-hxy-u,glb,Eday.loadso4,atmos.loadso4.tavg-u-hxy-u.day.glb,8b8b0e66-4a5b-11e6-9cd2-ac72891c3257,low,,
+116,atmos.loadsoa.tavg-u-hxy-u.day.glb,day,atmos,atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_particles,kg m-2,area: time: mean,area: areacella,Load of Dry Aerosol Secondary Organic Matter,The total dry mass of secondary particulate organic aerosol particles per unit area.,,longitude latitude time,loadsoa,real,,XY-na,time-intv,Eday,loadsoa,loadsoa,tavg-u-hxy-u,loadsoa_tavg-u-hxy-u,glb,Eday.loadsoa,atmos.loadsoa.tavg-u-hxy-u.day.glb,8b8b039e-4a5b-11e6-9cd2-ac72891c3257,low,,
+117,atmos.loadss.tavg-u-hxy-u.day.glb,day,atmos,atmosphere_mass_content_of_sea_salt_dry_aerosol_particles,kg m-2,area: time: mean,area: areacella,Load of Sea-Salt Aerosol,The total dry mass of sea salt aerosol particles per unit area.,,longitude latitude time,loadss,real,,XY-na,time-intv,Eday,loadss,loadss,tavg-u-hxy-u,loadss_tavg-u-hxy-u,glb,Eday.loadss,atmos.loadss.tavg-u-hxy-u.day.glb,8b8b192e-4a5b-11e6-9cd2-ac72891c3257,low,,
+118,atmos.mc.tavg-alh-hxy-u.mon.glb,mon,atmos,atmosphere_net_upward_convective_mass_flux,kg m-2 s-1,area: time: mean,area: areacella,Convective Mass Flux,The net mass flux should represent the difference between the updraft and downdraft components. The flux is computed as the mass divided by the area of the grid cell.,"Report on model half-levels (i.e., model layer bounds and not standard pressures).",longitude latitude alevhalf time,mc,real,up,XY-AH,time-intv,Amon,mc,mc,tavg-alh-hxy-u,mc_tavg-alh-hxy-u,glb,Amon.mc,atmos.mc.tavg-alh-hxy-u.mon.glb,bab117b8-e5dd-11e5-8482-ac72891c3257,high,,
+119,atmos.mcd.tavg-alh-hxy-u.mon.glb,mon,atmos,atmosphere_downdraft_convective_mass_flux,kg m-2 s-1,area: time: mean,area: areacella,Downdraft Convective Mass Flux,Calculated as the convective mass flux divided by the area of the whole grid cell (not just the area of the cloud).,"Report on model half-levels (i.e., model layer bounds and not standard pressures).",longitude latitude alevhalf time,mcd,real,down,XY-AH,time-intv,CFmon,mcd,mcd,tavg-alh-hxy-u,mcd_tavg-alh-hxy-u,glb,CFmon.mcd,atmos.mcd.tavg-alh-hxy-u.mon.glb,bab12118-e5dd-11e5-8482-ac72891c3257,high,,
+120,atmos.mcu.tavg-alh-hxy-u.mon.glb,mon,atmos,atmosphere_updraft_convective_mass_flux,kg m-2 s-1,area: time: mean,area: areacella,Convective Updraft Mass Flux,Calculated as the convective mass flux divided by the area of the whole grid cell (not just the area of the cloud).,"Report on model half-levels (i.e., model layer bounds and not standard pressures).",longitude latitude alevhalf time,mcu,real,up,XY-AH,time-intv,CFmon,mcu,mcu,tavg-alh-hxy-u,mcu_tavg-alh-hxy-u,glb,CFmon.mcu,atmos.mcu.tavg-alh-hxy-u.mon.glb,bab125a0-e5dd-11e5-8482-ac72891c3257,high,,
+121,atmos.pctisccp.tavg-u-hxy-cl.day.glb,day,atmos,air_pressure_at_cloud_top,Pa,area: time: mean where cloud (weighted by ISCCP total cloud area),area: areacella,ISCCP Mean Cloud Top Pressure,time-means are weighted by the ISCCP Total Cloud Fraction - see ,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean where cloud CMIP7:area: time: mean where cloud (weighted by ISCCP total cloud area),",longitude latitude time,pctisccp,real,,XY-na,time-intv,CFday,pctisccp,pctisccp,tavg-u-hxy-cl,pctisccp_tavg-u-hxy-cl,glb,CFday.pctisccp,atmos.pctisccp.tavg-u-hxy-cl.day.glb,bab31da6-e5dd-11e5-8482-ac72891c3257,high,,
+122,atmos.pctisccp.tavg-u-hxy-cl.mon.glb,mon,atmos,air_pressure_at_cloud_top,Pa,area: time: mean where cloud (weighted by ISCCP total cloud area),area: areacella,ISCCP Mean Cloud Top Pressure,time-means weighted by the ISCCP Total Cloud Fraction - see ,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean where cloud CMIP7:area: time: mean where cloud (weighted by ISCCP total cloud area),",longitude latitude time,pctisccp,real,,XY-na,time-intv,CFmon,pctisccp,pctisccp,tavg-u-hxy-cl,pctisccp_tavg-u-hxy-cl,glb,CFmon.pctisccp,atmos.pctisccp.tavg-u-hxy-cl.mon.glb,bab31f68-e5dd-11e5-8482-ac72891c3257,high,,
+123,atmos.pfull.tclm-al-hxy-u.mon.glb,mon,atmos,air_pressure,Pa,area: mean time: mean within years time: mean over years,area: areacella,Pressure at Model Full-Levels,Air pressure on model levels,,longitude latitude alevel time2,pfull,real,,XY-A,climatology,Amon,pfull,pfull,tclm-al-hxy-u,pfull_tclm-al-hxy-u,glb,Amon.pfull,atmos.pfull.tclm-al-hxy-u.mon.glb,bab32c1a-e5dd-11e5-8482-ac72891c3257,high,,
+124,atmos.phalf.tclm-alh-hxy-u.mon.glb,mon,atmos,air_pressure,Pa,area: mean time: mean within years time: mean over years,area: areacella,Pressure on Model Half-Levels,Air pressure on model half-levels,,longitude latitude alevhalf time2,phalf,real,,XY-AH,climatology,Amon,phalf,phalf,tclm-alh-hxy-u,phalf_tclm-alh-hxy-u,glb,Amon.phalf,atmos.phalf.tclm-alh-hxy-u.mon.glb,bab33d04-e5dd-11e5-8482-ac72891c3257,high,,
+125,atmos.pr.tavg-u-hxy-u.1hr.glb,1hr,atmos,precipitation_flux,kg m-2 s-1,area: time: mean,area: areacella,Precipitation,Total precipitation flux,,longitude latitude time,pr,real,,XY-na,time-intv,E1hr,pr,pr,tavg-u-hxy-u,pr_tavg-u-hxy-u,glb,E1hr.pr,atmos.pr.tavg-u-hxy-u.1hr.glb,8baebea6-4a5b-11e6-9cd2-ac72891c3257,core,,
+126,atmos.pr.tavg-u-hxy-u.3hr.glb,3hr,atmos,precipitation_flux,kg m-2 s-1,area: time: mean,area: areacella,Precipitation,at surface; includes both liquid and solid phases. This is the 3-hour mean precipitation flux.,,longitude latitude time,pr,real,,XY-na,time-intv,3hr,pr,pr,tavg-u-hxy-u,pr_tavg-u-hxy-u,glb,3hr.pr,atmos.pr.tavg-u-hxy-u.3hr.glb,bab3c904-e5dd-11e5-8482-ac72891c3257,core,,
+127,atmos.pr.tavg-u-hxy-u.day.glb,day,atmos,precipitation_flux,kg m-2 s-1,area: time: mean,area: areacella,Precipitation,at surface; includes both liquid and solid phases from all types of clouds (both large-scale and convective),,longitude latitude time,pr,real,,XY-na,time-intv,day,pr,pr,tavg-u-hxy-u,pr_tavg-u-hxy-u,glb,day.pr,atmos.pr.tavg-u-hxy-u.day.glb,bab3d692-e5dd-11e5-8482-ac72891c3257,core,,
+128,atmos.pr.tavg-u-hxy-u.mon.glb,mon,atmos,precipitation_flux,kg m-2 s-1,area: time: mean,area: areacella,Precipitation,at surface; includes both liquid and solid phases from all types of clouds (both large-scale and convective),,longitude latitude time,pr,real,,XY-na,time-intv,Amon,pr,pr,tavg-u-hxy-u,pr_tavg-u-hxy-u,glb,Amon.pr,atmos.pr.tavg-u-hxy-u.mon.glb,bab3cb52-e5dd-11e5-8482-ac72891c3257,core,,
+129,atmos.prc.tavg-u-hxy-u.day.glb,day,atmos,convective_precipitation_flux,kg m-2 s-1,area: time: mean,area: areacella,Convective Precipitation,at surface; includes both liquid and solid phases.,,longitude latitude time,prc,real,,XY-na,time-intv,day,prc,prc,tavg-u-hxy-u,prc_tavg-u-hxy-u,glb,day.prc,atmos.prc.tavg-u-hxy-u.day.glb,bab3fde8-e5dd-11e5-8482-ac72891c3257,high,,
+130,atmos.prc.tavg-u-hxy-u.mon.glb,mon,atmos,convective_precipitation_flux,kg m-2 s-1,area: time: mean,area: areacella,Convective Precipitation,at surface; includes both liquid and solid phases.,,longitude latitude time,prc,real,,XY-na,time-intv,Amon,prc,prc,tavg-u-hxy-u,prc_tavg-u-hxy-u,glb,Amon.prc,atmos.prc.tavg-u-hxy-u.mon.glb,bab3f8a2-e5dd-11e5-8482-ac72891c3257,core,,
+131,atmos.prsn.tavg-u-hxy-u.3hr.glb,3hr,atmos,snowfall_flux,kg m-2 s-1,area: time: mean,area: areacella,Snowfall Flux,at surface. Includes precipitation of all forms water in the solid phase. This is the 3-hour mean snowfall flux.,,longitude latitude time,prsn,real,,XY-na,time-intv,3hr,prsn,prsn,tavg-u-hxy-u,prsn_tavg-u-hxy-u,glb,3hr.prsn,atmos.prsn.tavg-u-hxy-u.3hr.glb,bab42912-e5dd-11e5-8482-ac72891c3257,high,,
+132,atmos.prsn.tavg-u-hxy-u.day.glb,day,atmos,snowfall_flux,kg m-2 s-1,area: time: mean,area: areacella,Snowfall Flux,at surface; includes precipitation of all forms of water in the solid phase,,longitude latitude time,prsn,real,,XY-na,time-intv,day,prsn,prsn,tavg-u-hxy-u,prsn_tavg-u-hxy-u,glb,day.prsn,atmos.prsn.tavg-u-hxy-u.day.glb,bab43b50-e5dd-11e5-8482-ac72891c3257,high,,
+133,atmos.prsn.tavg-u-hxy-u.mon.glb,mon,atmos,snowfall_flux,kg m-2 s-1,area: time: mean,area: areacella,Snowfall Flux,at surface; includes precipitation of all forms of water in the solid phase,,longitude latitude time,prsn,real,,XY-na,time-intv,Amon,prsn,prsn,tavg-u-hxy-u,prsn_tavg-u-hxy-u,glb,Amon.prsn,atmos.prsn.tavg-u-hxy-u.mon.glb,bab42b88-e5dd-11e5-8482-ac72891c3257,core,,
+134,atmos.prw.tavg-u-hxy-u.day.glb,day,atmos,atmosphere_mass_content_of_water_vapor,kg m-2,area: time: mean,area: areacella,Water Vapor Path,Vertically integrated mass of water vapour through the atmospheric column,,longitude latitude time,prw,real,,XY-na,time-intv,Eday,prw,prw,tavg-u-hxy-u,prw_tavg-u-hxy-u,glb,Eday.prw,atmos.prw.tavg-u-hxy-u.day.glb,8b8fccc6-4a5b-11e6-9cd2-ac72891c3257,high,,
+135,atmos.prw.tavg-u-hxy-u.mon.glb,mon,atmos,atmosphere_mass_content_of_water_vapor,kg m-2,area: time: mean,area: areacella,Water Vapor Path,Vertically integrated mass of water vapour through the atmospheric column,,longitude latitude time,prw,real,,XY-na,time-intv,Amon,prw,prw,tavg-u-hxy-u,prw_tavg-u-hxy-u,glb,Amon.prw,atmos.prw.tavg-u-hxy-u.mon.glb,bab45df6-e5dd-11e5-8482-ac72891c3257,core,,
+136,atmos.ps.tavg-u-hxy-u.day.glb,day,atmos,surface_air_pressure,Pa,area: time: mean,area: areacella,Surface Air Pressure,"surface pressure (not mean sea-level pressure), 2-D field to calculate the 3-D pressure field from hybrid coordinates",,longitude latitude time,ps,real,,XY-na,time-intv,CFday,ps,ps,tavg-u-hxy-u,ps_tavg-u-hxy-u,glb,CFday.ps,atmos.ps.tavg-u-hxy-u.day.glb,bab46db4-e5dd-11e5-8482-ac72891c3257,core,,
+137,atmos.ps.tavg-u-hxy-u.mon.glb,mon,atmos,surface_air_pressure,Pa,area: time: mean,area: areacella,Surface Air Pressure,"not, in general, the same as mean sea-level pressure",,longitude latitude time,ps,real,,XY-na,time-intv,Amon,ps,ps,tavg-u-hxy-u,ps_tavg-u-hxy-u,glb,Amon.ps,atmos.ps.tavg-u-hxy-u.mon.glb,bab47b56-e5dd-11e5-8482-ac72891c3257,core,,
+138,atmos.ps.tpt-u-hxy-u.1hr.glb,1hr,atmos,surface_air_pressure,Pa,area: mean time: point,area: areacella,Surface Air Pressure,Surface pressure.,"Instantaneous value (i.e. synoptic or time-step value), Global field (single level) [XY-na] [amn-tpt]",longitude latitude time1,ps,real,,XY-na,time-point,E1hr,ps,ps,tpt-u-hxy-u,ps_tpt-u-hxy-u,glb,E1hr.ps,atmos.ps.tpt-u-hxy-u.1hr.glb,83bbfbc5-7f07-11ef-9308-b1dd71e64bec,medium,,
+139,atmos.ps.tpt-u-hxy-u.6hr.glb,6hr,atmos,surface_air_pressure,Pa,area: mean time: point,area: areacella,Surface Air Pressure,"surface pressure, not mean sea level pressure",,longitude latitude time1,ps,real,,XY-na,time-point,6hrLev,ps,ps,tpt-u-hxy-u,ps_tpt-u-hxy-u,glb,6hrLev.ps,atmos.ps.tpt-u-hxy-u.6hr.glb,bab46b70-e5dd-11e5-8482-ac72891c3257,high,,
+140,atmos.psl.tavg-u-hxy-u.day.glb,day,atmos,air_pressure_at_mean_sea_level,Pa,area: time: mean,area: areacella,Sea Level Pressure,Sea Level Pressure,,longitude latitude time,psl,real,,XY-na,time-intv,day,psl,psl,tavg-u-hxy-u,psl_tavg-u-hxy-u,glb,day.psl,atmos.psl.tavg-u-hxy-u.day.glb,bab491f4-e5dd-11e5-8482-ac72891c3257,core,,
+141,atmos.psl.tavg-u-hxy-u.mon.glb,mon,atmos,air_pressure_at_mean_sea_level,Pa,area: time: mean,area: areacella,Sea Level Pressure,"not, in general, the same as surface pressure",,longitude latitude time,psl,real,,XY-na,time-intv,Amon,psl,psl,tavg-u-hxy-u,psl_tavg-u-hxy-u,glb,Amon.psl,atmos.psl.tavg-u-hxy-u.mon.glb,bab48ce0-e5dd-11e5-8482-ac72891c3257,core,,
+142,atmos.psl.tpt-u-hxy-u.1hr.glb,1hr,atmos,air_pressure_at_mean_sea_level,Pa,area: mean time: point,area: areacella,Sea Level Pressure,Sea level pressure,,longitude latitude time1,psl,real,,XY-na,time-point,E1hr,psl,psl,tpt-u-hxy-u,psl_tpt-u-hxy-u,glb,E1hr.psl,atmos.psl.tpt-u-hxy-u.1hr.glb,8bb11ef8-4a5b-11e6-9cd2-ac72891c3257,high,,
+143,atmos.psl.tpt-u-hxy-u.6hr.glb,6hr,atmos,air_pressure_at_mean_sea_level,Pa,area: mean time: point,area: areacella,Sea Level Pressure,Sea Level Pressure,,longitude latitude time1,psl,real,,XY-na,time-point,6hrPlevPt,psl,psl,tpt-u-hxy-u,psl_tpt-u-hxy-u,glb,6hrPlevPt.psl,atmos.psl.tpt-u-hxy-u.6hr.glb,816898e0-f906-11e6-a176-5404a60d96b5,high,,
+144,atmos.ptp.tavg-u-hxy-u.mon.glb,mon,atmos,tropopause_air_pressure,Pa,area: time: mean,area: areacella,Tropopause Air Pressure,2D monthly mean thermal tropopause calculated using WMO tropopause definition on 3d temperature,,longitude latitude time,ptp,real,,XY-na,time-intv,AERmon,ptp,ptp,tavg-u-hxy-u,ptp_tavg-u-hxy-u,glb,AERmon.ptp,atmos.ptp.tavg-u-hxy-u.mon.glb,19be3f96-81b1-11e6-92de-ac72891c3257,high,,
+146,atmos.reffclic.tavg-al-hxy-ccl.mon.glb,mon,atmos,effective_radius_of_convective_cloud_ice_particles,m,area: time: mean where convective_cloud,area: areacella,Hydrometeor Effective Radius of Convective Cloud Ice,This is defined as the in-cloud ratio of the third moment over the second moment of the particle size distribution (obtained by considering only the cloudy portion of the grid cell).,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean CMIP7:area: time: mean where convective_cloud,",longitude latitude alevel time,reffclic,real,,XY-A,time-intv,Emon,reffclic,reffclic,tavg-al-hxy-ccl,reffclic_tavg-al-hxy-ccl,glb,Emon.reffclic,atmos.reffclic.tavg-al-hxy-ccl.mon.glb,8b89e87e-4a5b-11e6-9cd2-ac72891c3257,high,,
+147,atmos.reffclis.tavg-al-hxy-scl.mon.glb,mon,atmos,effective_radius_of_stratiform_cloud_ice_particles,m,area: time: mean where stratiform_cloud,area: areacella,Hydrometeor Effective Radius of Stratiform Cloud Ice,This is defined as the in-cloud ratio of the third moment over the second moment of the particle size distribution (obtained by considering only the cloudy portion of the grid cell).,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean CMIP7:area: time: mean where stratiform_cloud,",longitude latitude alevel time,reffclis,real,,XY-A,time-intv,Emon,reffclis,reffclis,tavg-al-hxy-scl,reffclis_tavg-al-hxy-scl,glb,Emon.reffclis,atmos.reffclis.tavg-al-hxy-scl.mon.glb,8b89deba-4a5b-11e6-9cd2-ac72891c3257,high,,
+148,atmos.reffclwc.tavg-al-hxy-ccl.mon.glb,mon,atmos,effective_radius_of_convective_cloud_liquid_water_particles,m,area: time: mean where convective_cloud,area: areacella,Convective Cloud Liquid Droplet Effective Radius,"Droplets are liquid. The effective radius is defined as the ratio of the third moment over the second moment of the particle size distribution and the time-mean should be calculated, weighting the individual samples by the cloudy fraction of the grid cell.","CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean CMIP7:area: time: mean where convective_cloud,",longitude latitude alevel time,reffclwc,real,,XY-A,time-intv,Emon,reffclwc,reffclwc,tavg-al-hxy-ccl,reffclwc_tavg-al-hxy-ccl,glb,Emon.reffclwc,atmos.reffclwc.tavg-al-hxy-ccl.mon.glb,8b89e3a6-4a5b-11e6-9cd2-ac72891c3257,high,,
+149,atmos.reffclws.tavg-al-hxy-scl.mon.glb,mon,atmos,effective_radius_of_stratiform_cloud_liquid_water_particles,m,area: time: mean where stratiform_cloud,area: areacella,Stratiform Cloud Liquid Droplet Effective Radius,"Droplets are liquid. The effective radius is defined as the ratio of the third moment over the second moment of the particle size distribution and the time-mean should be calculated, weighting the individual samples by the cloudy fraction of the grid cell.","CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean CMIP7:area: time: mean where stratiform_cloud,",longitude latitude alevel time,reffclws,real,,XY-A,time-intv,Emon,reffclws,reffclws,tavg-al-hxy-scl,reffclws_tavg-al-hxy-scl,glb,Emon.reffclws,atmos.reffclws.tavg-al-hxy-scl.mon.glb,8b89d9a6-4a5b-11e6-9cd2-ac72891c3257,high,,
+151,atmos.rld.tavg-alh-hxy-u.mon.glb,mon,atmos,downwelling_longwave_flux_in_air,W m-2,area: time: mean,area: areacella,Downwelling Longwave Radiation,Includes also the fluxes at the surface and TOA.,,longitude latitude alevhalf time,rld,real,down,XY-AH,time-intv,CFmon,rld,rld,tavg-alh-hxy-u,rld_tavg-alh-hxy-u,glb,CFmon.rld,atmos.rld.tavg-alh-hxy-u.mon.glb,bab51cf0-e5dd-11e5-8482-ac72891c3257,high,,
+152,atmos.rldcs.tavg-alh-hxy-u.mon.glb,mon,atmos,downwelling_longwave_flux_in_air_assuming_clear_sky,W m-2,area: time: mean,area: areacella,Downwelling Clear-Sky Longwave Radiation,Includes also the fluxes at the surface and TOA.,,longitude latitude alevhalf time,rldcs,real,down,XY-AH,time-intv,CFmon,rldcs,rldcs,tavg-alh-hxy-u,rldcs_tavg-alh-hxy-u,glb,CFmon.rldcs,atmos.rldcs.tavg-alh-hxy-u.mon.glb,bab5268c-e5dd-11e5-8482-ac72891c3257,high,,
+153,atmos.rlds.tavg-u-hxy-u.1hr.glb,1hr,atmos,surface_downwelling_longwave_flux_in_air,W m-2,area: time: mean,area: areacella,Surface Downwelling Longwave Radiation,Surface Downwelling Longwave Radiation,This is the 3-hour mean flux.,longitude latitude time,rlds,real,down,XY-na,time-intv,E1hr,rlds,rlds,tavg-u-hxy-u,rlds_tavg-u-hxy-u,glb,E1hr.rlds,atmos.rlds.tavg-u-hxy-u.1hr.glb,83bbfbc4-7f07-11ef-9308-b1dd71e64bec,high,,
+154,atmos.rlds.tavg-u-hxy-u.day.glb,day,atmos,surface_downwelling_longwave_flux_in_air,W m-2,area: time: mean,area: areacella,Surface Downwelling Longwave Radiation,"The surface called ""surface"" means the lower boundary of the atmosphere. ""longwave"" means longwave radiation. Downwelling radiation is radiation from above. It does not mean ""net downward"". When thought of as being incident on a surface, a radiative flux is sometimes called ""irradiance"". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called ""vector irradiance"". In accordance with common usage in geophysical disciplines, ""flux"" implies per unit area, called ""flux density"" in physics.",,longitude latitude time,rlds,real,down,XY-na,time-intv,day,rlds,rlds,tavg-u-hxy-u,rlds_tavg-u-hxy-u,glb,day.rlds,atmos.rlds.tavg-u-hxy-u.day.glb,bab538d4-e5dd-11e5-8482-ac72891c3257,high,,
+155,atmos.rlds.tavg-u-hxy-u.mon.glb,mon,atmos,surface_downwelling_longwave_flux_in_air,W m-2,area: time: mean,area: areacella,Surface Downwelling Longwave Radiation,"The surface called ""surface"" means the lower boundary of the atmosphere. ""longwave"" means longwave radiation. Downwelling radiation is radiation from above. It does not mean ""net downward"". When thought of as being incident on a surface, a radiative flux is sometimes called ""irradiance"". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called ""vector irradiance"". In accordance with common usage in geophysical disciplines, ""flux"" implies per unit area, called ""flux density"" in physics.",,longitude latitude time,rlds,real,down,XY-na,time-intv,Amon,rlds,rlds,tavg-u-hxy-u,rlds_tavg-u-hxy-u,glb,Amon.rlds,atmos.rlds.tavg-u-hxy-u.mon.glb,bab52da8-e5dd-11e5-8482-ac72891c3257,core,,
+156,atmos.rldscs.tavg-u-hxy-u.day.glb,day,atmos,surface_downwelling_longwave_flux_in_air_assuming_clear_sky,W m-2,area: time: mean,area: areacella,Surface Downwelling Clear-Sky Longwave Radiation,Surface downwelling clear-sky longwave radiation,,longitude latitude time,rldscs,real,down,XY-na,time-intv,CFday,rldscs,rldscs,tavg-u-hxy-u,rldscs_tavg-u-hxy-u,glb,CFday.rldscs,atmos.rldscs.tavg-u-hxy-u.day.glb,bab55792-e5dd-11e5-8482-ac72891c3257,high,,
+157,atmos.rldscs.tavg-u-hxy-u.mon.glb,mon,atmos,surface_downwelling_longwave_flux_in_air_assuming_clear_sky,W m-2,area: time: mean,area: areacella,Surface Downwelling Clear-Sky Longwave Radiation,Surface downwelling clear-sky longwave radiation,,longitude latitude time,rldscs,real,down,XY-na,time-intv,Amon,rldscs,rldscs,tavg-u-hxy-u,rldscs_tavg-u-hxy-u,glb,Amon.rldscs,atmos.rldscs.tavg-u-hxy-u.mon.glb,bab5540e-e5dd-11e5-8482-ac72891c3257,core,,
+158,atmos.rlu.tavg-alh-hxy-u.mon.glb,mon,atmos,upwelling_longwave_flux_in_air,W m-2,area: time: mean,area: areacella,Upwelling Longwave Radiation,Includes also the fluxes at the surface and TOA.,,longitude latitude alevhalf time,rlu,real,up,XY-AH,time-intv,CFmon,rlu,rlu,tavg-alh-hxy-u,rlu_tavg-alh-hxy-u,glb,CFmon.rlu,atmos.rlu.tavg-alh-hxy-u.mon.glb,bab56d68-e5dd-11e5-8482-ac72891c3257,high,,
+159,atmos.rlucs.tavg-alh-hxy-u.mon.glb,mon,atmos,upwelling_longwave_flux_in_air_assuming_clear_sky,W m-2,area: time: mean,area: areacella,Upwelling Clear-Sky Longwave Radiation,Includes also the fluxes at the surface and TOA.,,longitude latitude alevhalf time,rlucs,real,up,XY-AH,time-intv,CFmon,rlucs,rlucs,tavg-alh-hxy-u,rlucs_tavg-alh-hxy-u,glb,CFmon.rlucs,atmos.rlucs.tavg-alh-hxy-u.mon.glb,bab5768c-e5dd-11e5-8482-ac72891c3257,high,,
+160,atmos.rlus.tavg-u-hxy-u.day.glb,day,atmos,surface_upwelling_longwave_flux_in_air,W m-2,area: time: mean,area: areacella,Surface Upwelling Longwave Radiation,"The surface called ""surface"" means the lower boundary of the atmosphere. ""longwave"" means longwave radiation. Upwelling radiation is radiation from below. It does not mean ""net upward"". When thought of as being incident on a surface, a radiative flux is sometimes called ""irradiance"". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called ""vector irradiance"". In accordance with common usage in geophysical disciplines, ""flux"" implies per unit area, called ""flux density"" in physics.",,longitude latitude time,rlus,real,up,XY-na,time-intv,day,rlus,rlus,tavg-u-hxy-u,rlus_tavg-u-hxy-u,glb,day.rlus,atmos.rlus.tavg-u-hxy-u.day.glb,bab57f92-e5dd-11e5-8482-ac72891c3257,high,,
+161,atmos.rlus.tavg-u-hxy-u.mon.glb,mon,atmos,surface_upwelling_longwave_flux_in_air,W m-2,area: time: mean,area: areacella,Surface Upwelling Longwave Radiation,"The surface called ""surface"" means the lower boundary of the atmosphere. ""longwave"" means longwave radiation. Upwelling radiation is radiation from below. It does not mean ""net upward"". When thought of as being incident on a surface, a radiative flux is sometimes called ""irradiance"". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called ""vector irradiance"". In accordance with common usage in geophysical disciplines, ""flux"" implies per unit area, called ""flux density"" in physics.",,longitude latitude time,rlus,real,up,XY-na,time-intv,Amon,rlus,rlus,tavg-u-hxy-u,rlus_tavg-u-hxy-u,glb,Amon.rlus,atmos.rlus.tavg-u-hxy-u.mon.glb,bab578d0-e5dd-11e5-8482-ac72891c3257,core,,
+162,atmos.rluscs.tavg-u-hxy-u.day.glb,day,atmos,surface_upwelling_longwave_flux_assuming_clear_sky,W m-2,area: time: mean,area: areacella,Surface Upwelling Clear-Sky Longwave Radiation,Surface Upwelling Clear-sky Longwave Radiation,,longitude latitude time,rluscs,real,up,XY-na,time-intv,day,rluscs,rluscs,tavg-u-hxy-u,rluscs_tavg-u-hxy-u,glb,day.rluscs,atmos.rluscs.tavg-u-hxy-u.day.glb,80ab71f7-a698-11ef-914a-613c0433d878,high,,
+163,atmos.rluscs.tavg-u-hxy-u.mon.glb,mon,atmos,surface_upwelling_longwave_flux_assuming_clear_sky,W m-2,area: time: mean,area: areacella,Surface Upwelling Clear-Sky Longwave Radiation,Surface Upwelling Clear-sky Longwave Radiation,,longitude latitude time,rluscs,real,up,XY-na,time-intv,Amon,rluscs,rluscs,tavg-u-hxy-u,rluscs_tavg-u-hxy-u,glb,Amon.rluscs,atmos.rluscs.tavg-u-hxy-u.mon.glb,80ab71f6-a698-11ef-914a-613c0433d878,core,,
+164,atmos.rlut.tavg-u-hxy-u.day.glb,day,atmos,toa_outgoing_longwave_flux,W m-2,area: time: mean,area: areacella,TOA Outgoing Longwave Radiation,at the top of the atmosphere.,,longitude latitude time,rlut,real,up,XY-na,time-intv,day,rlut,rlut,tavg-u-hxy-u,rlut_tavg-u-hxy-u,glb,day.rlut,atmos.rlut.tavg-u-hxy-u.day.glb,bab59c66-e5dd-11e5-8482-ac72891c3257,high,,
+165,atmos.rlut.tavg-u-hxy-u.mon.glb,mon,atmos,toa_outgoing_longwave_flux,W m-2,area: time: mean,area: areacella,TOA Outgoing Longwave Radiation,at the top of the atmosphere (to be compared with satellite measurements),,longitude latitude time,rlut,real,up,XY-na,time-intv,Amon,rlut,rlut,tavg-u-hxy-u,rlut_tavg-u-hxy-u,glb,Amon.rlut,atmos.rlut.tavg-u-hxy-u.mon.glb,bab5aad0-e5dd-11e5-8482-ac72891c3257,core,,
+166,atmos.rlutcs.tavg-u-hxy-u.day.glb,day,atmos,toa_outgoing_longwave_flux_assuming_clear_sky,W m-2,area: time: mean,area: areacella,TOA Outgoing Clear-Sky Longwave Radiation,Upwelling clear-sky longwave radiation at top of atmosphere,,longitude latitude time,rlutcs,real,up,XY-na,time-intv,CFday,rlutcs,rlutcs,tavg-u-hxy-u,rlutcs_tavg-u-hxy-u,glb,CFday.rlutcs,atmos.rlutcs.tavg-u-hxy-u.day.glb,bab5c09c-e5dd-11e5-8482-ac72891c3257,high,,
+167,atmos.rlutcs.tavg-u-hxy-u.mon.glb,mon,atmos,toa_outgoing_longwave_flux_assuming_clear_sky,W m-2,area: time: mean,area: areacella,TOA Outgoing Clear-Sky Longwave Radiation,Upwelling clear-sky longwave radiation at top of atmosphere,,longitude latitude time,rlutcs,real,up,XY-na,time-intv,Amon,rlutcs,rlutcs,tavg-u-hxy-u,rlutcs_tavg-u-hxy-u,glb,Amon.rlutcs,atmos.rlutcs.tavg-u-hxy-u.mon.glb,bab5bcdc-e5dd-11e5-8482-ac72891c3257,core,,
+168,atmos.rsd.tavg-alh-hxy-u.mon.glb,mon,atmos,downwelling_shortwave_flux_in_air,W m-2,area: time: mean,area: areacella,Downwelling Shortwave Radiation,Includes also the fluxes at the surface and TOA.,,longitude latitude alevhalf time,rsd,real,down,XY-AH,time-intv,CFmon,rsd,rsd,tavg-alh-hxy-u,rsd_tavg-alh-hxy-u,glb,CFmon.rsd,atmos.rsd.tavg-alh-hxy-u.mon.glb,bab5d424-e5dd-11e5-8482-ac72891c3257,high,,
+169,atmos.rsdcs.tavg-alh-hxy-u.mon.glb,mon,atmos,downwelling_shortwave_flux_in_air_assuming_clear_sky,W m-2,area: time: mean,area: areacella,Downwelling Clear-Sky Shortwave Radiation,Includes also the fluxes at the surface and TOA.,,longitude latitude alevhalf time,rsdcs,real,down,XY-AH,time-intv,CFmon,rsdcs,rsdcs,tavg-alh-hxy-u,rsdcs_tavg-alh-hxy-u,glb,CFmon.rsdcs,atmos.rsdcs.tavg-alh-hxy-u.mon.glb,bab5d898-e5dd-11e5-8482-ac72891c3257,high,,
+170,atmos.rsds.tavg-u-hxy-u.1hr.glb,1hr,atmos,surface_downwelling_shortwave_flux_in_air,W m-2,area: time: mean,area: areacella,Surface Downwelling Shortwave Radiation,Hourly downward solar radiation flux at the surface,,longitude latitude time,rsds,real,down,XY-na,time-intv,E1hr,rsds,rsds,tavg-u-hxy-u,rsds_tavg-u-hxy-u,glb,E1hr.rsds,atmos.rsds.tavg-u-hxy-u.1hr.glb,83bbfbc2-7f07-11ef-9308-b1dd71e64bec,high,,
+171,atmos.rsds.tavg-u-hxy-u.day.glb,day,atmos,surface_downwelling_shortwave_flux_in_air,W m-2,area: time: mean,area: areacella,Surface Downwelling Shortwave Radiation,Surface solar irradiance for UV calculations.,,longitude latitude time,rsds,real,down,XY-na,time-intv,day,rsds,rsds,tavg-u-hxy-u,rsds_tavg-u-hxy-u,glb,day.rsds,atmos.rsds.tavg-u-hxy-u.day.glb,bab5ecd4-e5dd-11e5-8482-ac72891c3257,core,,
+172,atmos.rsds.tavg-u-hxy-u.mon.glb,mon,atmos,surface_downwelling_shortwave_flux_in_air,W m-2,area: time: mean,area: areacella,Surface Downwelling Shortwave Radiation,Surface solar irradiance for UV calculations.,,longitude latitude time,rsds,real,down,XY-na,time-intv,Amon,rsds,rsds,tavg-u-hxy-u,rsds_tavg-u-hxy-u,glb,Amon.rsds,atmos.rsds.tavg-u-hxy-u.mon.glb,bab5e1b2-e5dd-11e5-8482-ac72891c3257,core,,
+173,atmos.rsdscs.tavg-u-hxy-u.day.glb,day,atmos,surface_downwelling_shortwave_flux_in_air_assuming_clear_sky,W m-2,area: time: mean,area: areacella,Surface Downwelling Clear-Sky Shortwave Radiation,Surface solar irradiance clear sky for UV calculations,,longitude latitude time,rsdscs,real,down,XY-na,time-intv,CFday,rsdscs,rsdscs,tavg-u-hxy-u,rsdscs_tavg-u-hxy-u,glb,CFday.rsdscs,atmos.rsdscs.tavg-u-hxy-u.day.glb,bab60b42-e5dd-11e5-8482-ac72891c3257,high,,
+174,atmos.rsdscs.tavg-u-hxy-u.mon.glb,mon,atmos,surface_downwelling_shortwave_flux_in_air_assuming_clear_sky,W m-2,area: time: mean,area: areacella,Surface Downwelling Clear-Sky Shortwave Radiation,Surface solar irradiance clear sky for UV calculations,,longitude latitude time,rsdscs,real,down,XY-na,time-intv,Amon,rsdscs,rsdscs,tavg-u-hxy-u,rsdscs_tavg-u-hxy-u,glb,Amon.rsdscs,atmos.rsdscs.tavg-u-hxy-u.mon.glb,bab607c8-e5dd-11e5-8482-ac72891c3257,core,,
+175,atmos.rsdscsdiff.tavg-u-hxy-u.day.glb,day,atmos,surface_diffuse_downwelling_shortwave_flux_in_air_assuming_clear_sky,W m-2,area: time: mean,area: areacella,Surface Diffuse Downwelling Clear Sky Shortwave Radiation,Surface downwelling solar irradiance from diffuse radiation for UV calculations in clear sky conditions,,longitude latitude time,rsdscsdiff,real,down,XY-na,time-intv,Eday,rsdscsdiff,rsdscsdiff,tavg-u-hxy-u,rsdscsdiff_tavg-u-hxy-u,glb,Eday.rsdscsdiff,atmos.rsdscsdiff.tavg-u-hxy-u.day.glb,7d8c6a76-1ab7-11e7-8dfc-5404a60d96b5,low,,
+176,atmos.rsdsdiff.tavg-u-hxy-u.1hr.glb,1hr,atmos,surface_diffuse_downwelling_shortwave_flux_in_air,W m-2,area: time: mean,area: areacella,Surface Diffuse Downwelling Shortwave Radiation,Surface Diffuse Downwelling Shortwave Radiation,This is a 3-hour mean flux.,longitude latitude time,rsdsdiff,real,down,XY-na,time-intv,E1hr,rsdsdiff,rsdsdiff,tavg-u-hxy-u,rsdsdiff_tavg-u-hxy-u,glb,E1hr.rsdsdiff,atmos.rsdsdiff.tavg-u-hxy-u.1hr.glb,83bbfc77-7f07-11ef-9308-b1dd71e64bec,medium,,
+177,atmos.rsdsdiff.tavg-u-hxy-u.day.glb,day,atmos,surface_diffuse_downwelling_shortwave_flux_in_air,W m-2,area: time: mean,area: areacella,Surface Diffuse Downwelling Shortwave Radiation,Surface downwelling solar irradiance from diffuse radiation for UV calculations.,,longitude latitude time,rsdsdiff,real,down,XY-na,time-intv,Eday,rsdsdiff,rsdsdiff,tavg-u-hxy-u,rsdsdiff_tavg-u-hxy-u,glb,Eday.rsdsdiff,atmos.rsdsdiff.tavg-u-hxy-u.day.glb,7d8c633c-1ab7-11e7-8dfc-5404a60d96b5,medium,,
+178,atmos.rsdt.tavg-u-hxy-u.day.glb,day,atmos,toa_incoming_shortwave_flux,W m-2,area: time: mean,area: areacella,TOA Incident Shortwave Radiation,Shortwave radiation incident at the top of the atmosphere,,longitude latitude time,rsdt,real,down,XY-na,time-intv,CFday,rsdt,rsdt,tavg-u-hxy-u,rsdt_tavg-u-hxy-u,glb,CFday.rsdt,atmos.rsdt.tavg-u-hxy-u.day.glb,bab625a0-e5dd-11e5-8482-ac72891c3257,high,,
+179,atmos.rsdt.tavg-u-hxy-u.mon.glb,mon,atmos,toa_incoming_shortwave_flux,W m-2,area: time: mean,area: areacella,TOA Incident Shortwave Radiation,at the top of the atmosphere,,longitude latitude time,rsdt,real,down,XY-na,time-intv,Amon,rsdt,rsdt,tavg-u-hxy-u,rsdt_tavg-u-hxy-u,glb,Amon.rsdt,atmos.rsdt.tavg-u-hxy-u.mon.glb,bab6219a-e5dd-11e5-8482-ac72891c3257,core,,
+180,atmos.rsu.tavg-alh-hxy-u.mon.glb,mon,atmos,upwelling_shortwave_flux_in_air,W m-2,area: time: mean,area: areacella,Upwelling Shortwave Radiation,Includes also the fluxes at the surface and TOA.,,longitude latitude alevhalf time,rsu,real,up,XY-AH,time-intv,CFmon,rsu,rsu,tavg-alh-hxy-u,rsu_tavg-alh-hxy-u,glb,CFmon.rsu,atmos.rsu.tavg-alh-hxy-u.mon.glb,bab64814-e5dd-11e5-8482-ac72891c3257,high,,
+181,atmos.rsucs.tavg-alh-hxy-u.mon.glb,mon,atmos,upwelling_shortwave_flux_in_air_assuming_clear_sky,W m-2,area: time: mean,area: areacella,Upwelling Clear-Sky Shortwave Radiation,Includes also the fluxes at the surface and TOA.,,longitude latitude alevhalf time,rsucs,real,up,XY-AH,time-intv,CFmon,rsucs,rsucs,tavg-alh-hxy-u,rsucs_tavg-alh-hxy-u,glb,CFmon.rsucs,atmos.rsucs.tavg-alh-hxy-u.mon.glb,bab64ee0-e5dd-11e5-8482-ac72891c3257,high,,
+182,atmos.rsus.tavg-u-hxy-u.day.glb,day,atmos,surface_upwelling_shortwave_flux_in_air,W m-2,area: time: mean,area: areacella,Surface Upwelling Shortwave Radiation,"The surface called ""surface"" means the lower boundary of the atmosphere. ""shortwave"" means shortwave radiation. Upwelling radiation is radiation from below. It does not mean ""net upward"". When thought of as being incident on a surface, a radiative flux is sometimes called ""irradiance"". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called ""vector irradiance"". In accordance with common usage in geophysical disciplines, ""flux"" implies per unit area, called ""flux density"" in physics.",,longitude latitude time,rsus,real,up,XY-na,time-intv,day,rsus,rsus,tavg-u-hxy-u,rsus_tavg-u-hxy-u,glb,day.rsus,atmos.rsus.tavg-u-hxy-u.day.glb,bab65ad4-e5dd-11e5-8482-ac72891c3257,high,,
+183,atmos.rsus.tavg-u-hxy-u.mon.glb,mon,atmos,surface_upwelling_shortwave_flux_in_air,W m-2,area: time: mean,area: areacella,Surface Upwelling Shortwave Radiation,"The surface called ""surface"" means the lower boundary of the atmosphere. ""shortwave"" means shortwave radiation. Upwelling radiation is radiation from below. It does not mean ""net upward"". When thought of as being incident on a surface, a radiative flux is sometimes called ""irradiance"". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called ""vector irradiance"". In accordance with common usage in geophysical disciplines, ""flux"" implies per unit area, called ""flux density"" in physics.",,longitude latitude time,rsus,real,up,XY-na,time-intv,Amon,rsus,rsus,tavg-u-hxy-u,rsus_tavg-u-hxy-u,glb,Amon.rsus,atmos.rsus.tavg-u-hxy-u.mon.glb,bab6537c-e5dd-11e5-8482-ac72891c3257,core,,
+184,atmos.rsuscs.tavg-u-hxy-u.day.glb,day,atmos,surface_upwelling_shortwave_flux_in_air_assuming_clear_sky,W m-2,area: time: mean,area: areacella,Surface Upwelling Clear-Sky Shortwave Radiation,Surface Upwelling Clear-sky Shortwave Radiation,,longitude latitude time,rsuscs,real,up,XY-na,time-intv,CFday,rsuscs,rsuscs,tavg-u-hxy-u,rsuscs_tavg-u-hxy-u,glb,CFday.rsuscs,atmos.rsuscs.tavg-u-hxy-u.day.glb,bab67424-e5dd-11e5-8482-ac72891c3257,high,,
+185,atmos.rsuscs.tavg-u-hxy-u.mon.glb,mon,atmos,surface_upwelling_shortwave_flux_in_air_assuming_clear_sky,W m-2,area: time: mean,area: areacella,Surface Upwelling Clear-Sky Shortwave Radiation,Surface Upwelling Clear-sky Shortwave Radiation,,longitude latitude time,rsuscs,real,up,XY-na,time-intv,Amon,rsuscs,rsuscs,tavg-u-hxy-u,rsuscs_tavg-u-hxy-u,glb,Amon.rsuscs,atmos.rsuscs.tavg-u-hxy-u.mon.glb,bab670b4-e5dd-11e5-8482-ac72891c3257,core,,
+186,atmos.rsut.tavg-u-hxy-u.day.glb,day,atmos,toa_outgoing_shortwave_flux,W m-2,area: time: mean,area: areacella,TOA Outgoing Shortwave Radiation,at the top of the atmosphere,,longitude latitude time,rsut,real,up,XY-na,time-intv,CFday,rsut,rsut,tavg-u-hxy-u,rsut_tavg-u-hxy-u,glb,CFday.rsut,atmos.rsut.tavg-u-hxy-u.day.glb,bab68392-e5dd-11e5-8482-ac72891c3257,high,,
+187,atmos.rsut.tavg-u-hxy-u.mon.glb,mon,atmos,toa_outgoing_shortwave_flux,W m-2,area: time: mean,area: areacella,TOA Outgoing Shortwave Radiation,at the top of the atmosphere,,longitude latitude time,rsut,real,up,XY-na,time-intv,Amon,rsut,rsut,tavg-u-hxy-u,rsut_tavg-u-hxy-u,glb,Amon.rsut,atmos.rsut.tavg-u-hxy-u.mon.glb,bab68ebe-e5dd-11e5-8482-ac72891c3257,core,,
+188,atmos.rsutcs.tavg-u-hxy-u.day.glb,day,atmos,toa_outgoing_shortwave_flux_assuming_clear_sky,W m-2,area: time: mean,area: areacella,TOA Outgoing Clear-Sky Shortwave Radiation,Calculated in the absence of clouds.,,longitude latitude time,rsutcs,real,up,XY-na,time-intv,CFday,rsutcs,rsutcs,tavg-u-hxy-u,rsutcs_tavg-u-hxy-u,glb,CFday.rsutcs,atmos.rsutcs.tavg-u-hxy-u.day.glb,bab69f76-e5dd-11e5-8482-ac72891c3257,high,,
+189,atmos.rsutcs.tavg-u-hxy-u.mon.glb,mon,atmos,toa_outgoing_shortwave_flux_assuming_clear_sky,W m-2,area: time: mean,area: areacella,TOA Outgoing Clear-Sky Shortwave Radiation,Calculated in the absence of clouds.,,longitude latitude time,rsutcs,real,up,XY-na,time-intv,Amon,rsutcs,rsutcs,tavg-u-hxy-u,rsutcs_tavg-u-hxy-u,glb,Amon.rsutcs,atmos.rsutcs.tavg-u-hxy-u.mon.glb,bab69c06-e5dd-11e5-8482-ac72891c3257,core,,
+190,atmos.rtmt.tavg-u-hxy-u.mon.glb,mon,atmos,net_downward_radiative_flux_at_top_of_atmosphere_model,W m-2,area: time: mean,area: areacella,Net Downward Radiative Flux at Top of Model,"i.e., at the top of that portion of the atmosphere where dynamics are explicitly treated by the model. This is reported only if it differs from the net downward radiative flux at the top of the atmosphere.",,longitude latitude time,rtmt,real,down,XY-na,time-intv,Amon,rtmt,rtmt,tavg-u-hxy-u,rtmt_tavg-u-hxy-u,glb,Amon.rtmt,atmos.rtmt.tavg-u-hxy-u.mon.glb,bab6a91c-e5dd-11e5-8482-ac72891c3257,high,,
+191,atmos.sci.tavg-u-hxy-u.mon.glb,mon,atmos,shallow_convection_time_fraction,1,area: time: mean,area: areacella,Fraction of Time Shallow Convection Occurs,"Fraction of time that convection occurs in the grid cell. If native cell data is regridded, the area-weighted mean of the contributing cells should be reported.",For models with a distinct shallow convection scheme only.,longitude latitude time,sci,real,,XY-na,time-intv,Amon,sci,sci,tavg-u-hxy-u,sci_tavg-u-hxy-u,glb,Amon.sci,atmos.sci.tavg-u-hxy-u.mon.glb,bab6d180-e5dd-11e5-8482-ac72891c3257,high,,
+193,atmos.sfcWind.tavg-h10m-hxy-u.1hr.glb,1hr,atmos,wind_speed,m s-1,area: time: mean,area: areacella,Near-Surface Wind Speed,Hourly near-surface wind speed at 10m above the ground,,longitude latitude time height10m,sfcWind,real,,XY-na,time-intv,E1hr,sfcWind,sfcWind,tavg-h10m-hxy-u,sfcWind_tavg-h10m-hxy-u,glb,E1hr.sfcWind,atmos.sfcWind.tavg-h10m-hxy-u.1hr.glb,83bbfbc0-7f07-11ef-9308-b1dd71e64bec,medium,,
+194,atmos.sfcWind.tavg-h10m-hxy-u.day.glb,day,atmos,wind_speed,m s-1,area: time: mean,area: areacella,Near-Surface Wind Speed,"near-surface (usually, 10 meters) wind speed.",normally report this at 10 meters above the surface,longitude latitude time height10m,sfcWind,real,,XY-na,time-intv,day,sfcWind,sfcWind,tavg-h10m-hxy-u,sfcWind_tavg-h10m-hxy-u,glb,day.sfcWind,atmos.sfcWind.tavg-h10m-hxy-u.day.glb,bab6fe58-e5dd-11e5-8482-ac72891c3257,core,,
+195,atmos.sfcWind.tavg-h10m-hxy-u.mon.glb,mon,atmos,wind_speed,m s-1,area: time: mean,area: areacella,Near-Surface Wind Speed,"This is the mean of the speed, not the speed computed from the mean u and v components of wind","normally, the the wind component should be reported at the 10 meter height",longitude latitude time height10m,sfcWind,real,,XY-na,time-intv,Amon,sfcWind,sfcWind,tavg-h10m-hxy-u,sfcWind_tavg-h10m-hxy-u,glb,Amon.sfcWind,atmos.sfcWind.tavg-h10m-hxy-u.mon.glb,bab6f494-e5dd-11e5-8482-ac72891c3257,core,,
+196,atmos.sfcWind.tmax-h10m-hxy-u.day.glb,day,atmos,wind_speed,m s-1,area: mean time: maximum,area: areacella,Daily Maximum Near-Surface Wind Speed,"Daily maximum near-surface (usually, 10 meters) wind speed.",normally report this at 10 meters above the surface,longitude latitude time height10m,sfcWind,real,,XY-na,time-intv,day,sfcWindmax,sfcWind,tmax-h10m-hxy-u,sfcWind_tmax-h10m-hxy-u,glb,day.sfcWindmax,atmos.sfcWind.tmax-h10m-hxy-u.day.glb,bab709de-e5dd-11e5-8482-ac72891c3257,high,,
+197,atmos.sftlf.ti-u-hxy-u.fx.glb,fx,atmos,land_area_fraction,%,area: mean,area: areacella,Percentage of the Grid Cell Occupied by Land (Including Lakes),Percentage of horizontal area occupied by land.,"For atmospheres with more than 1 mesh (e.g., staggered grids), report areas that apply to surface vertical fluxes of energy.",longitude latitude,sftlf,real,,XY-na,None,fx,sftlf,sftlf,ti-u-hxy-u,sftlf_ti-u-hxy-u,glb,fx.sftlf,atmos.sftlf.ti-u-hxy-u.fx.glb,bab742c8-e5dd-11e5-8482-ac72891c3257,core,,
+198,atmos.smc.tavg-alh-hxy-u.mon.glb,mon,atmos,atmosphere_net_upward_shallow_convective_mass_flux,kg m-2 s-1,area: time: mean,area: areacella,Shallow Convective Mass Flux,"The net mass flux represents the difference between the updraft and downdraft components. For models with a distinct shallow convection scheme, this is calculated as convective mass flux divided by the area of the whole grid cell (not just the area of the cloud).","Report on model half-levels (i.e., model layer bounds and not standard pressures).",longitude latitude alevhalf time,smc,real,up,XY-AH,time-intv,CFmon,smc,smc,tavg-alh-hxy-u,smc_tavg-alh-hxy-u,glb,CFmon.smc,atmos.smc.tavg-alh-hxy-u.mon.glb,bab7bdf2-e5dd-11e5-8482-ac72891c3257,high,,
+199,atmos.ta.tavg-700hPa-hxy-air.day.glb,day,atmos,air_temperature,K,area: time: mean where air,area: areacella,Air Temperature,Air temperature at 700hPa,"at 700 hPa level. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean CMIP7:area: time: mean where air,",longitude latitude time p700,ta,real,,XY-na,time-intv,CFday,ta700,ta,tavg-700hPa-hxy-air,ta_tavg-700hPa-hxy-air,glb,CFday.ta700,atmos.ta.tavg-700hPa-hxy-air.day.glb,bab8e876-e5dd-11e5-8482-ac72891c3257,high,,
+200,atmos.ta.tavg-al-hxy-u.mon.glb,mon,atmos,air_temperature,K,area: time: mean,area: areacella,Air Temperature,Air Temperature,,longitude latitude alevel time,ta,real,,XY-A,time-intv,CFmon,ta,ta,tavg-al-hxy-u,ta_tavg-al-hxy-u,glb,CFmon.ta,atmos.ta.tavg-al-hxy-u.mon.glb,bab8ff64-e5dd-11e5-8482-ac72891c3257,high,,
+201,atmos.ta.tavg-p19-hxy-air.day.glb,day,atmos,air_temperature,K,area: time: mean where air,area: areacella,Air Temperature,Air Temperature,"CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude plev8 time CMIP7:longitude latitude plev19 time, CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: time: mean where air,",longitude latitude plev19 time,ta,real,,XY-P19,time-intv,day,ta,ta,tavg-p19-hxy-air,ta_tavg-p19-hxy-air,glb,day.ta,atmos.ta.tavg-p19-hxy-air.day.glb,bab902e8-e5dd-11e5-8482-ac72891c3257,core,,
+202,atmos.ta.tavg-p19-hxy-air.mon.glb,mon,atmos,air_temperature,K,area: time: mean where air,area: areacella,Air Temperature,Air Temperature,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: time: mean where air,",longitude latitude plev19 time,ta,real,,XY-P19,time-intv,Amon,ta,ta,tavg-p19-hxy-air,ta_tavg-p19-hxy-air,glb,Amon.ta,atmos.ta.tavg-p19-hxy-air.mon.glb,bab8fa0a-e5dd-11e5-8482-ac72891c3257,core,,
+203,atmos.ta.tpt-al-hxy-u.6hr.glb,6hr,atmos,air_temperature,K,area: mean time: point,area: areacella,Air Temperature,Air Temperature,on all model levels,longitude latitude alevel time1,ta,real,,XY-A,time-point,6hrLev,ta,ta,tpt-al-hxy-u,ta_tpt-al-hxy-u,glb,6hrLev.ta,atmos.ta.tpt-al-hxy-u.6hr.glb,bab8f686-e5dd-11e5-8482-ac72891c3257,high,,
+204,atmos.ta.tpt-p3-hxy-air.6hr.glb,6hr,atmos,air_temperature,K,area: mean where air time: point,area: areacella,Air Temperature,Air Temperature,"On the following pressure levels: 850, 500, 250 hPa
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean time: point CMIP7:area: mean where air time: point,",longitude latitude plev3 time1,ta,real,,XY-P3,time-point,6hrPlevPt,ta,ta,tpt-p3-hxy-air,ta_tpt-p3-hxy-air,glb,6hrPlevPt.ta,atmos.ta.tpt-p3-hxy-air.6hr.glb,6a35d178-aa6a-11e6-9736-5404a60d96b5,core,,
+205,atmos.ta.tpt-p7h-hxy-air.6hr.glb,6hr,atmos,air_temperature,K,area: mean where air time: point,area: areacella,Air Temperature,"Extra levels - 925, 700, 600, 300, 50","CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean time: point CMIP7:area: mean where air time: point,",longitude latitude plev7h time1,ta,real,,XY-P7T,time-point,6hrPlevPt,ta,ta,tpt-p7h-hxy-air,ta_tpt-p7h-hxy-air,glb,6hrPlevPt.ta7h,atmos.ta.tpt-p7h-hxy-air.6hr.glb,713943fa-faa7-11e6-bfb7-ac72891c3257,high,,
+206,atmos.tas.tavg-h2m-hxy-u.day.glb,day,atmos,air_temperature,K,area: time: mean,area: areacella,Near-Surface Air Temperature,"near-surface (usually, 2 meter) air temperature",normally report this at 2 meters above the surface,longitude latitude time height2m,tas,real,,XY-na,time-intv,day,tas,tas,tavg-h2m-hxy-u,tas_tavg-h2m-hxy-u,glb,day.tas,atmos.tas.tavg-h2m-hxy-u.day.glb,bab928ae-e5dd-11e5-8482-ac72891c3257,core,,
+207,atmos.tas.tavg-h2m-hxy-u.mon.glb,mon,atmos,air_temperature,K,area: time: mean,area: areacella,Near-Surface Air Temperature,"near-surface (usually, 2 meter) air temperature",normally report this at 2 meters above the surface,longitude latitude time height2m,tas,real,,XY-na,time-intv,Amon,tas,tas,tavg-h2m-hxy-u,tas_tavg-h2m-hxy-u,glb,Amon.tas,atmos.tas.tavg-h2m-hxy-u.mon.glb,bab9237c-e5dd-11e5-8482-ac72891c3257,core,,
+208,atmos.tas.tmax-h2m-hxy-u.day.glb,day,atmos,air_temperature,K,area: mean time: maximum,area: areacella,Daily Maximum Near-Surface Air Temperature,"maximum near-surface (usually, 2 meter) air temperature (add cell_method attribute ""time: max"")",normally report this at 2 meters above the surface,longitude latitude time height2m,tas,real,,XY-na,time-intv,day,tasmax,tas,tmax-h2m-hxy-u,tas_tmax-h2m-hxy-u,glb,day.tasmax,atmos.tas.tmax-h2m-hxy-u.day.glb,bab94a50-e5dd-11e5-8482-ac72891c3257,core,,
+209,atmos.tas.tmaxavg-h2m-hxy-u.mon.glb,mon,atmos,air_temperature,K,area: mean time: maximum within days time: mean over days,area: areacella,Daily Maximum Near-Surface Air Temperature,monthly mean of the daily-maximum near-surface air temperature.,"Normally, this should be reported at the 2 meter height. CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude time height2m CMIP7:longitude latitude time4 height2m,",longitude latitude time4 height2m,tas,real,,XY-na,monthly-mean-daily-stat,Amon,tasmax,tas,tmaxavg-h2m-hxy-u,tas_tmaxavg-h2m-hxy-u,glb,Amon.tasmax,atmos.tas.tmaxavg-h2m-hxy-u.mon.glb,bab942a8-e5dd-11e5-8482-ac72891c3257,core,,
+210,atmos.tas.tmin-h2m-hxy-u.day.glb,day,atmos,air_temperature,K,area: mean time: minimum,area: areacella,Daily Minimum Near-Surface Air Temperature,"minimum near-surface (usually, 2 meter) air temperature (add cell_method attribute ""time: min"")",normally report this at 2 meters above the surface,longitude latitude time height2m,tas,real,,XY-na,time-intv,day,tasmin,tas,tmin-h2m-hxy-u,tas_tmin-h2m-hxy-u,glb,day.tasmin,atmos.tas.tmin-h2m-hxy-u.day.glb,bab95fae-e5dd-11e5-8482-ac72891c3257,core,,
+211,atmos.tas.tminavg-h2m-hxy-u.mon.glb,mon,atmos,air_temperature,K,area: mean time: minimum within days time: mean over days,area: areacella,Daily Minimum Near-Surface Air Temperature,monthly mean of the daily-minimum near-surface air temperature.,"Normally, this should be reported at the 2 meter height. CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude time height2m CMIP7:longitude latitude time4 height2m,",longitude latitude time4 height2m,tas,real,,XY-na,monthly-mean-daily-stat,Amon,tasmin,tas,tminavg-h2m-hxy-u,tas_tminavg-h2m-hxy-u,glb,Amon.tasmin,atmos.tas.tminavg-h2m-hxy-u.mon.glb,bab955ea-e5dd-11e5-8482-ac72891c3257,core,,
+212,atmos.tas.tpt-h2m-hxy-u.3hr.glb,3hr,atmos,air_temperature,K,area: mean time: point,area: areacella,Near-Surface Air Temperature,This is sampled synoptically.,normally report this at 2 meters above the surface,longitude latitude time1 height2m,tas,real,,XY-na,time-point,3hr,tas,tas,tpt-h2m-hxy-u,tas_tpt-h2m-hxy-u,glb,3hr.tas,atmos.tas.tpt-h2m-hxy-u.3hr.glb,bab91b20-e5dd-11e5-8482-ac72891c3257,core,,
+213,atmos.tauu.tavg-u-hxy-u.mon.glb,mon,atmos,surface_downward_eastward_stress,Pa,area: time: mean,area: areacella,Surface Downward Eastward Wind Stress,Downward eastward wind stress at the surface,,longitude latitude time,tauu,real,down,XY-na,time-intv,Amon,tauu,tauu,tavg-u-hxy-u,tauu_tavg-u-hxy-u,glb,Amon.tauu,atmos.tauu.tavg-u-hxy-u.mon.glb,bab96cc4-e5dd-11e5-8482-ac72891c3257,core,,
+214,atmos.tauv.tavg-u-hxy-u.mon.glb,mon,atmos,surface_downward_northward_stress,Pa,area: time: mean,area: areacella,Surface Downward Northward Wind Stress,Downward northward wind stress at the surface,,longitude latitude time,tauv,real,down,XY-na,time-intv,Amon,tauv,tauv,tavg-u-hxy-u,tauv_tavg-u-hxy-u,glb,Amon.tauv,atmos.tauv.tavg-u-hxy-u.mon.glb,bab9888a-e5dd-11e5-8482-ac72891c3257,core,,
+215,atmos.tnhus.tavg-al-hxy-u.mon.glb,mon,atmos,tendency_of_specific_humidity,s-1,area: time: mean,area: areacella,Tendency of Specific Humidity,Tendency of Specific Humidity,,longitude latitude alevel time,tnhus,real,,XY-A,time-intv,CFmon,tnhus,tnhus,tavg-al-hxy-u,tnhus_tavg-al-hxy-u,glb,CFmon.tnhus,atmos.tnhus.tavg-al-hxy-u.mon.glb,bab9ca3e-e5dd-11e5-8482-ac72891c3257,high,,
+216,atmos.tnhusa.tavg-al-hxy-u.mon.glb,mon,atmos,tendency_of_specific_humidity_due_to_advection,s-1,area: time: mean,area: areacella,Tendency of Specific Humidity Due to Advection,Tendency of Specific Humidity due to Advection,,longitude latitude alevel time,tnhusa,real,,XY-A,time-intv,CFmon,tnhusa,tnhusa,tavg-al-hxy-u,tnhusa_tavg-al-hxy-u,glb,CFmon.tnhusa,atmos.tnhusa.tavg-al-hxy-u.mon.glb,bab9ce44-e5dd-11e5-8482-ac72891c3257,high,,
+217,atmos.tnhusc.tavg-al-hxy-u.mon.glb,mon,atmos,tendency_of_specific_humidity_due_to_convection,s-1,area: time: mean,area: areacella,Tendency of Specific Humidity Due to Convection,Tendencies from cumulus convection scheme.,,longitude latitude alevel time,tnhusc,real,,XY-A,time-intv,CFmon,tnhusc,tnhusc,tavg-al-hxy-u,tnhusc_tavg-al-hxy-u,glb,CFmon.tnhusc,atmos.tnhusc.tavg-al-hxy-u.mon.glb,bab9d236-e5dd-11e5-8482-ac72891c3257,high,,
+218,atmos.tnhusd.tavg-al-hxy-u.mon.glb,mon,atmos,tendency_of_specific_humidity_due_to_diffusion,s-1,area: time: mean,area: areacella,Tendency of Specific Humidity Due to Numerical Diffusion,"This includes any horizontal or vertical numerical moisture diffusion not associated with the parametrized moist physics or the resolved dynamics. For example, any vertical diffusion which is part of the boundary layer mixing scheme should be excluded, as should any diffusion which is included in the terms from the resolved dynamics. This term is required to check the closure of the moisture budget.",,longitude latitude alevel time,tnhusd,real,,XY-A,time-intv,CFmon,tnhusd,tnhusd,tavg-al-hxy-u,tnhusd_tavg-al-hxy-u,glb,CFmon.tnhusd,atmos.tnhusd.tavg-al-hxy-u.mon.glb,bab9d6c8-e5dd-11e5-8482-ac72891c3257,high,,
+219,atmos.tnhusmp.tavg-al-hxy-u.mon.glb,mon,atmos,tendency_of_specific_humidity_due_to_model_physics,s-1,area: time: mean,area: areacella,Tendency of Specific Humidity Due to Model Physics,"This includes sources and sinks from parametrized moist physics (e.g. convection, boundary layer, stratiform condensation/evaporation, etc.) and excludes sources and sinks from resolved dynamics or from horizontal or vertical numerical diffusion not associated with model physicsl. For example any diffusive mixing by the boundary layer scheme would be included.",,longitude latitude alevel time,tnhusmp,real,,XY-A,time-intv,CFmon,tnhusmp,tnhusmp,tavg-al-hxy-u,tnhusmp_tavg-al-hxy-u,glb,CFmon.tnhusmp,atmos.tnhusmp.tavg-al-hxy-u.mon.glb,bab9db28-e5dd-11e5-8482-ac72891c3257,high,,
+220,atmos.tnhuspbl.tavg-al-hxy-u.mon.glb,mon,atmos,tendency_of_specific_humidity_due_to_boundary_layer_mixing,s-1,area: time: mean,area: areacella,Tendency of Specific Humidity Due to Boundary Layer Mixing,Includes all boundary layer terms including diffusive terms.,,longitude latitude alevel time,tnhuspbl,real,,XY-A,time-intv,Emon,tnhuspbl,tnhuspbl,tavg-al-hxy-u,tnhuspbl_tavg-al-hxy-u,glb,Emon.tnhuspbl,atmos.tnhuspbl.tavg-al-hxy-u.mon.glb,8b89cee8-4a5b-11e6-9cd2-ac72891c3257,high,,
+221,atmos.tnhusscp.tavg-al-hxy-u.mon.glb,mon,atmos,tendency_of_specific_humidity_due_to_stratiform_cloud_and_precipitation,s-1,area: time: mean,area: areacella,Tendency of Specific Humidity Due to Stratiform Clouds and Precipitation,"The phrase ""tendency_of_X"" means derivative of X with respect to time. ""Specific"" means per unit mass. Specific humidity is the mass fraction of water vapor in (moist) air. The specification of a physical process by the phrase ""due_to_"" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. A variable with the standard name of tendency_of_specific_humidity_due_to_stratiform_cloud_and_precipitation should contain the effects of all processes which convert stratiform clouds and precipitation to or from water vapor. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes).",,longitude latitude alevel time,tnhusscp,real,,XY-A,time-intv,Emon,tnhusscp,tnhusscp,tavg-al-hxy-u,tnhusscp_tavg-al-hxy-u,glb,Emon.tnhusscp,atmos.tnhusscp.tavg-al-hxy-u.mon.glb,8b89d456-4a5b-11e6-9cd2-ac72891c3257,high,,
+222,atmos.tnhusscpbl.tavg-al-hxy-u.mon.glb,mon,atmos,tendency_of_specific_humidity_due_to_stratiform_cloud_and_precipitation_and_boundary_layer_mixing,s-1,area: time: mean,area: areacella,Tendency of Specific Humidity Due to Stratiform Cloud and Precipitation and Boundary Layer Mixing,"To be specified only in models which do not separate budget terms for stratiform cloud, precipitation and boundary layer schemes. Includes all bounday layer terms including and diffusive terms.",,longitude latitude alevel time,tnhusscpbl,real,,XY-A,time-intv,CFmon,tnhusscpbl,tnhusscpbl,tavg-al-hxy-u,tnhusscpbl_tavg-al-hxy-u,glb,CFmon.tnhusscpbl,atmos.tnhusscpbl.tavg-al-hxy-u.mon.glb,bab9dfd8-e5dd-11e5-8482-ac72891c3257,high,,
+223,atmos.tnt.tavg-al-hxy-u.mon.glb,mon,atmos,tendency_of_air_temperature,K s-1,area: time: mean,area: areacella,Tendency of Air Temperature,Tendency of Air Temperature,,longitude latitude alevel time,tnt,real,,XY-A,time-intv,CFmon,tnt,tnt,tavg-al-hxy-u,tnt_tavg-al-hxy-u,glb,CFmon.tnt,atmos.tnt.tavg-al-hxy-u.mon.glb,baba4b30-e5dd-11e5-8482-ac72891c3257,high,,
+224,atmos.tnta.tavg-al-hxy-u.mon.glb,mon,atmos,tendency_of_air_temperature_due_to_advection,K s-1,area: time: mean,area: areacella,Tendency of Air Temperature Due to Advection,Tendency of Air Temperature due to Advection,,longitude latitude alevel time,tnta,real,,XY-A,time-intv,CFmon,tnta,tnta,tavg-al-hxy-u,tnta_tavg-al-hxy-u,glb,CFmon.tnta,atmos.tnta.tavg-al-hxy-u.mon.glb,baba4f22-e5dd-11e5-8482-ac72891c3257,high,,
+225,atmos.tntc.tavg-al-hxy-u.mon.glb,mon,atmos,tendency_of_air_temperature_due_to_convection,K s-1,area: time: mean,area: areacella,Tendency of Air Temperature Due to Convection,Tendencies from cumulus convection scheme.,,longitude latitude alevel time,tntc,real,,XY-A,time-intv,CFmon,tntc,tntc,tavg-al-hxy-u,tntc_tavg-al-hxy-u,glb,CFmon.tntc,atmos.tntc.tavg-al-hxy-u.mon.glb,baba5300-e5dd-11e5-8482-ac72891c3257,high,,
+226,atmos.tntd.tavg-al-hxy-u.mon.glb,mon,atmos,tendency_of_air_temperature_due_to_diffusion,K s-1,area: time: mean,area: areacella,Tendency of Air Temperature Due to Numerical Diffusion,"This includes any horizontal or vertical numerical temperature diffusion not associated with the parametrized moist physics or the resolved dynamics. For example, any vertical diffusion which is part of the boundary layer mixing scheme should be excluded, as should any diffusion which is included in the terms from the resolved dynamics. This term is required to check the closure of the temperature budget.",,longitude latitude alevel time,tntd,real,,XY-A,time-intv,Emon,tntd,tntd,tavg-al-hxy-u,tntd_tavg-al-hxy-u,glb,Emon.tntd,atmos.tntd.tavg-al-hxy-u.mon.glb,8b89be4e-4a5b-11e6-9cd2-ac72891c3257,high,,
+227,atmos.tntmp.tavg-al-hxy-u.mon.glb,mon,atmos,tendency_of_air_temperature_due_to_model_physics,K s-1,area: time: mean,area: areacella,Tendency of Air Temperature Due to Model Physics,"This includes sources and sinks from parametrized physics (e.g. radiation, convection, boundary layer, stratiform condensation/evaporation, etc.). It excludes sources and sinks from resolved dynamics and numerical diffusion not associated with parametrized physics. For example, any vertical diffusion which is part of the boundary layer mixing scheme should be included, while numerical diffusion applied in addition to physics or resolved dynamics should be excluded. This term is required to check the closure of the heat budget.",,longitude latitude alevel time,tntmp,real,,XY-A,time-intv,CFmon,tntmp,tntmp,tavg-al-hxy-u,tntmp_tavg-al-hxy-u,glb,CFmon.tntmp,atmos.tntmp.tavg-al-hxy-u.mon.glb,baba5d78-e5dd-11e5-8482-ac72891c3257,high,,
+228,atmos.tntpbl.tavg-al-hxy-u.mon.glb,mon,atmos,tendency_of_air_temperature_due_to_boundary_layer_mixing,K s-1,area: time: mean,area: areacella,Tendency of Air Temperature Due to Boundary Layer Mixing,Includes all boundary layer terms including diffusive terms.,,longitude latitude alevel time,tntpbl,real,,XY-A,time-intv,Emon,tntpbl,tntpbl,tavg-al-hxy-u,tntpbl_tavg-al-hxy-u,glb,Emon.tntpbl,atmos.tntpbl.tavg-al-hxy-u.mon.glb,8b89c3ee-4a5b-11e6-9cd2-ac72891c3257,high,,
+229,atmos.tntr.tavg-al-hxy-u.mon.glb,mon,atmos,tendency_of_air_temperature_due_to_radiative_heating,K s-1,area: time: mean,area: areacella,Tendency of Air Temperature Due to Radiative Heating,Tendency of Air Temperature due to Radiative Heating,,longitude latitude alevel time,tntr,real,,XY-A,time-intv,CFmon,tntr,tntr,tavg-al-hxy-u,tntr_tavg-al-hxy-u,glb,CFmon.tntr,atmos.tntr.tavg-al-hxy-u.mon.glb,baba617e-e5dd-11e5-8482-ac72891c3257,high,,
+230,atmos.tntrl.tavg-al-hxy-u.mon.glb,mon,atmos,tendency_of_air_temperature_due_to_longwave_heating,K s-1,area: time: mean,area: areacella,Tendency of Air Temperature Due to Longwave Radiative Heating,longwave heating rates,,longitude latitude alevel time,tntrl,real,,XY-A,time-intv,AERmon,tntrl,tntrl,tavg-al-hxy-u,tntrl_tavg-al-hxy-u,glb,AERmon.tntrl,atmos.tntrl.tavg-al-hxy-u.mon.glb,01d409fc-c792-11e6-aa58-5404a60d96b5,high,,
+231,atmos.tntrlcs.tavg-al-hxy-u.mon.glb,mon,atmos,tendency_of_air_temperature_due_to_longwave_heating_assuming_clear_sky,K s-1,area: time: mean,area: areacella,Tendency of Air Temperature Due to Clear Sky Longwave Radiative Heating,Tendency of Air Temperature due to Clear Sky Longwave Radiative Heating,,longitude latitude alevel time,tntrlcs,real,,XY-A,time-intv,Emon,tntrlcs,tntrlcs,tavg-al-hxy-u,tntrlcs_tavg-al-hxy-u,glb,Emon.tntrlcs,atmos.tntrlcs.tavg-al-hxy-u.mon.glb,8b89b296-4a5b-11e6-9cd2-ac72891c3257,high,,
+232,atmos.tntrs.tavg-al-hxy-u.mon.glb,mon,atmos,tendency_of_air_temperature_due_to_shortwave_heating,K s-1,area: time: mean,area: areacella,Tendency of Air Temperature Due to Shortwave Radiative Heating,shortwave heating rates,,longitude latitude alevel time,tntrs,real,,XY-A,time-intv,AERmon,tntrs,tntrs,tavg-al-hxy-u,tntrs_tavg-al-hxy-u,glb,AERmon.tntrs,atmos.tntrs.tavg-al-hxy-u.mon.glb,01d3ff0c-c792-11e6-aa58-5404a60d96b5,high,,
+233,atmos.tntrscs.tavg-al-hxy-u.mon.glb,mon,atmos,tendency_of_air_temperature_due_to_shortwave_heating_assuming_clear_sky,K s-1,area: time: mean,area: areacella,Tendency of Air Temperature Due to Clear Sky Shortwave Radiative Heating,Tendency of Air Temperature due to Clear Sky Shortwave Radiative Heating,,longitude latitude alevel time,tntrscs,real,,XY-A,time-intv,Emon,tntrscs,tntrscs,tavg-al-hxy-u,tntrscs_tavg-al-hxy-u,glb,Emon.tntrscs,atmos.tntrscs.tavg-al-hxy-u.mon.glb,8b89b84a-4a5b-11e6-9cd2-ac72891c3257,high,,
+234,atmos.tntscp.tavg-al-hxy-u.mon.glb,mon,atmos,tendency_of_air_temperature_due_to_stratiform_cloud_and_precipitation,K s-1,area: time: mean,area: areacella,Tendency of Air Temperature Due to Stratiform Clouds and Precipitation,"The phrase ""tendency_of_X"" means derivative of X with respect to time. Air temperature is the bulk temperature of the air, not the surface (skin) temperature. The specification of a physical process by the phrase ""due_to_"" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. A variable with the standard name tendency_of_air_temperature_due_to_stratiform_cloud_and_precipitation should contain net latent heating effects of all processes which convert stratiform clouds and precipitation between water vapour, liquid or ice phases. In an atmosphere model, stratiform cloud is that produced by large-scale convergence (not the convection schemes).",,longitude latitude alevel time,tntscp,real,,XY-A,time-intv,Emon,tntscp,tntscp,tavg-al-hxy-u,tntscp_tavg-al-hxy-u,glb,Emon.tntscp,atmos.tntscp.tavg-al-hxy-u.mon.glb,8b89c970-4a5b-11e6-9cd2-ac72891c3257,high,,
+235,atmos.tntscpbl.tavg-al-hxy-u.mon.glb,mon,atmos,tendency_of_air_temperature_due_to_stratiform_cloud_and_precipitation_and_boundary_layer_mixing,K s-1,area: time: mean,area: areacella,Tendency of Air Temperature Due to Stratiform Cloud and Precipitation and Boundary Layer Mixing,"To be specified only in models which do not separate cloud, precipitation and boundary layer terms. Includes all boundary layer terms including diffusive ones.",,longitude latitude alevel time,tntscpbl,real,,XY-A,time-intv,CFmon,tntscpbl,tntscpbl,tavg-al-hxy-u,tntscpbl_tavg-al-hxy-u,glb,CFmon.tntscpbl,atmos.tntscpbl.tavg-al-hxy-u.mon.glb,baba657a-e5dd-11e5-8482-ac72891c3257,high,,
+236,atmos.ts.tavg-u-hxy-u.1hr.glb,1hr,atmos,surface_temperature,K,area: time: mean,area: areacella,Surface Temperature,Surface temperature (skin for open ocean),,longitude latitude time,ts,real,,XY-na,time-intv,E1hr,ts,ts,tavg-u-hxy-u,ts_tavg-u-hxy-u,glb,E1hr.ts,atmos.ts.tavg-u-hxy-u.1hr.glb,83bbfbbe-7f07-11ef-9308-b1dd71e64bec,medium,,
+237,atmos.ts.tavg-u-hxy-u.mon.glb,mon,atmos,surface_temperature,K,area: time: mean,area: areacella,Surface Temperature,Surface temperature (skin for open ocean),,longitude latitude time,ts,real,,XY-na,time-intv,Amon,ts,ts,tavg-u-hxy-u,ts_tavg-u-hxy-u,glb,Amon.ts,atmos.ts.tavg-u-hxy-u.mon.glb,babaef0e-e5dd-11e5-8482-ac72891c3257,core,,
+238,atmos.ts.tpt-u-hxy-u.6hr.glb,6hr,atmos,surface_temperature,K,area: mean time: point,area: areacella,Surface Temperature,Temperature of the lower boundary of the atmosphere,,longitude latitude time1,ts,real,,XY-na,time-point,6hrPlevPt,ts,ts,tpt-u-hxy-u,ts_tpt-u-hxy-u,glb,6hrPlevPt.ts,atmos.ts.tpt-u-hxy-u.6hr.glb,8bb06940-4a5b-11e6-9cd2-ac72891c3257,high,,
+239,atmos.ua.tavg-p19-hxy-air.day.glb,day,atmos,eastward_wind,m s-1,area: time: mean where air,area: areacella,Eastward Wind,Zonal wind (positive in a eastward direction).,"CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude plev8 time CMIP7:longitude latitude plev19 time, CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: time: mean where air,",longitude latitude plev19 time,ua,real,,XY-P19,time-intv,day,ua,ua,tavg-p19-hxy-air,ua_tavg-p19-hxy-air,glb,day.ua,atmos.ua.tavg-p19-hxy-air.day.glb,babb5084-e5dd-11e5-8482-ac72891c3257,core,,
+240,atmos.ua.tavg-p19-hxy-air.mon.glb,mon,atmos,eastward_wind,m s-1,area: time: mean where air,area: areacella,Eastward Wind,Zonal wind (positive in a eastward direction).,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: time: mean where air,",longitude latitude plev19 time,ua,real,,XY-P19,time-intv,Amon,ua,ua,tavg-p19-hxy-air,ua_tavg-p19-hxy-air,glb,Amon.ua,atmos.ua.tavg-p19-hxy-air.mon.glb,babb4b34-e5dd-11e5-8482-ac72891c3257,core,,
+241,atmos.ua.tpt-al-hxy-u.6hr.glb,6hr,atmos,eastward_wind,m s-1,area: mean time: point,area: areacella,Eastward Wind,Zonal wind (positive in a eastward direction).,"on all model levels. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: point CMIP7:area: mean time: point,
+CHANGE SINCE CMIP6 in Cell Measures - CMIP6:::OPT CMIP7:area: areacella,",longitude latitude alevel time1,ua,real,,XY-A,time-point,6hrLev,ua,ua,tpt-al-hxy-u,ua_tpt-al-hxy-u,glb,6hrLev.ua,atmos.ua.tpt-al-hxy-u.6hr.glb,babb47a6-e5dd-11e5-8482-ac72891c3257,high,,
+242,atmos.ua.tpt-h100m-hxy-u.1hr.glb,1hr,atmos,eastward_wind,m s-1,area: mean time: point,area: areacella,Eastward Wind at 100m,Zonal wind (positive in a eastward direction) at 100m above the surface,Instantaneous values,longitude latitude time1 height100m,ua,real,,XY-na,time-point,E1hr,ua100m,ua,tpt-h100m-hxy-u,ua_tpt-h100m-hxy-u,glb,E1hr.ua100m,atmos.ua.tpt-h100m-hxy-u.1hr.glb,83bbfc7f-7f07-11ef-9308-b1dd71e64bec,high,,
+243,atmos.ua.tpt-p3-hxy-air.6hr.glb,6hr,atmos,eastward_wind,m s-1,area: mean where air time: point,area: areacella,Eastward Wind,Zonal wind (positive in a eastward direction).,"On the following pressure levels: 850, 500, 250 hPa. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean time: point CMIP7:area: mean where air time: point,",longitude latitude plev3 time1,ua,real,,XY-P3,time-point,6hrPlevPt,ua,ua,tpt-p3-hxy-air,ua_tpt-p3-hxy-air,glb,6hrPlevPt.ua,atmos.ua.tpt-p3-hxy-air.6hr.glb,8bae55ba-4a5b-11e6-9cd2-ac72891c3257,core,,
+244,atmos.ua.tpt-p7h-hxy-air.6hr.glb,6hr,atmos,eastward_wind,m s-1,area: mean where air time: point,area: areacella,Eastward Wind,Zonal wind (positive in a eastward direction).,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean time: point CMIP7:area: mean where air time: point,",longitude latitude plev7h time1,ua,real,,XY-P7T,time-point,6hrPlevPt,ua,ua,tpt-p7h-hxy-air,ua_tpt-p7h-hxy-air,glb,6hrPlevPt.ua7h,atmos.ua.tpt-p7h-hxy-air.6hr.glb,713f2efa-faa7-11e6-bfb7-ac72891c3257,high,,
+245,atmos.uas.tavg-h10m-hxy-u.day.glb,day,atmos,eastward_wind,m s-1,area: time: mean,area: areacella,Eastward Near-Surface Wind,"Eastward component of the near-surface (usually, 10 meters) wind",normally report this at 10 meters above the surface,longitude latitude time height10m,uas,real,,XY-na,time-intv,day,uas,uas,tavg-h10m-hxy-u,uas_tavg-h10m-hxy-u,glb,day.uas,atmos.uas.tavg-h10m-hxy-u.day.glb,babb6cea-e5dd-11e5-8482-ac72891c3257,core,,
+246,atmos.uas.tavg-h10m-hxy-u.mon.glb,mon,atmos,eastward_wind,m s-1,area: time: mean,area: areacella,Eastward Near-Surface Wind,"Eastward component of the near-surface (usually, 10 meters) wind","normally, the the wind component should be reported at the 10 meter height",longitude latitude time height10m,uas,real,,XY-na,time-intv,Amon,uas,uas,tavg-h10m-hxy-u,uas_tavg-h10m-hxy-u,glb,Amon.uas,atmos.uas.tavg-h10m-hxy-u.mon.glb,babb67c2-e5dd-11e5-8482-ac72891c3257,core,,
+247,atmos.uas.tpt-h10m-hxy-u.1hr.glb,1hr,atmos,eastward_wind,m s-1,area: mean time: point,area: areacella,Eastward Near-Surface Wind,Zonal wind (positive in a eastward direction) at 10 meters above the surface.,,longitude latitude time1 height10m,uas,real,,XY-na,time-point,E1hr,uas,uas,tpt-h10m-hxy-u,uas_tpt-h10m-hxy-u,glb,E1hr.uas,atmos.uas.tpt-h10m-hxy-u.1hr.glb,83bbfbbd-7f07-11ef-9308-b1dd71e64bec,high,,
+248,atmos.uas.tpt-h10m-hxy-u.3hr.glb,3hr,atmos,eastward_wind,m s-1,area: mean time: point,area: areacella,Eastward Near-Surface Wind,This is sampled synoptically.,"CHANGE SINCE CMIP6: compound name,",longitude latitude time1 height10m,uas,real,,XY-na,time-point,3hrPt,uas,uas,tpt-h10m-hxy-u,uas_tpt-h10m-hxy-u,glb,3hrPt.uas,atmos.uas.tpt-h10m-hxy-u.3hr.glb,babb5db8-e5dd-11e5-8482-ac72891c3257,core,,
+249,atmos.va.tavg-p19-hxy-air.day.glb,day,atmos,northward_wind,m s-1,area: time: mean where air,area: areacella,Northward Wind,Meridional wind (positive in a northward direction).,"CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude plev8 time CMIP7:longitude latitude plev19 time, CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: time: mean where air,",longitude latitude plev19 time,va,real,,XY-P19,time-intv,day,va,va,tavg-p19-hxy-air,va_tavg-p19-hxy-air,glb,day.va,atmos.va.tavg-p19-hxy-air.day.glb,babbbbe6-e5dd-11e5-8482-ac72891c3257,core,,
+250,atmos.va.tavg-p19-hxy-air.mon.glb,mon,atmos,northward_wind,m s-1,area: time: mean where air,area: areacella,Northward Wind,Meridional wind (positive in a northward direction).,,longitude latitude plev19 time,va,real,,XY-P19,time-intv,Amon,va,va,tavg-p19-hxy-air,va_tavg-p19-hxy-air,glb,Amon.va,atmos.va.tavg-p19-hxy-air.mon.glb,babbb25e-e5dd-11e5-8482-ac72891c3257,core,,
+251,atmos.va.tpt-al-hxy-u.6hr.glb,6hr,atmos,northward_wind,m s-1,area: mean time: point,area: areacella,Northward Wind,Meridional wind (positive in a northward direction).,"on all model levels
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: point CMIP7:area: mean time: point,
+CHANGE SINCE CMIP6 in Cell Measures - CMIP6:::OPT CMIP7:area: areacella,",longitude latitude alevel time1,va,real,,XY-A,time-point,6hrLev,va,va,tpt-al-hxy-u,va_tpt-al-hxy-u,glb,6hrLev.va,atmos.va.tpt-al-hxy-u.6hr.glb,babbaebc-e5dd-11e5-8482-ac72891c3257,high,,
+252,atmos.va.tpt-h100m-hxy-u.1hr.glb,1hr,atmos,northward_wind,m s-1,area: mean time: point,area: areacella,Northward Wind at 100m,Meridional wind (positive in a northward direction) at 100m above the surface.,Instantaneous values,longitude latitude time1 height100m,va,real,,XY-na,time-point,E1hr,va100m,va,tpt-h100m-hxy-u,va_tpt-h100m-hxy-u,glb,E1hr.va100m,atmos.va.tpt-h100m-hxy-u.1hr.glb,83bbfc7e-7f07-11ef-9308-b1dd71e64bec,high,,
+253,atmos.va.tpt-p3-hxy-air.6hr.glb,6hr,atmos,northward_wind,m s-1,area: mean where air time: point,area: areacella,Northward Wind,Meridional wind (positive in a northward direction).,"on the following pressure levels: 850, 500, 250 hPa. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean time: point CMIP7:area: mean where air time: point,",longitude latitude plev3 time1,va,real,,XY-P3,time-point,6hrPlevPt,va,va,tpt-p3-hxy-air,va_tpt-p3-hxy-air,glb,6hrPlevPt.va,atmos.va.tpt-p3-hxy-air.6hr.glb,8bae5aba-4a5b-11e6-9cd2-ac72891c3257,core,,
+254,atmos.va.tpt-p7h-hxy-air.6hr.glb,6hr,atmos,northward_wind,m s-1,area: mean where air time: point,area: areacella,Northward Wind,Meridional wind (positive in a northward direction).,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean time: point CMIP7:area: mean where air time: point,",longitude latitude plev7h time1,va,real,,XY-P7T,time-point,6hrPlevPt,va,va,tpt-p7h-hxy-air,va_tpt-p7h-hxy-air,glb,6hrPlevPt.va7h,atmos.va.tpt-p7h-hxy-air.6hr.glb,713fda6c-faa7-11e6-bfb7-ac72891c3257,high,,
+255,atmos.vas.tavg-h10m-hxy-u.day.glb,day,atmos,northward_wind,m s-1,area: time: mean,area: areacella,Northward Near-Surface Wind,Northward component of the near surface wind,normally report this at 10 meters above the surface,longitude latitude time height10m,vas,real,,XY-na,time-intv,day,vas,vas,tavg-h10m-hxy-u,vas_tavg-h10m-hxy-u,glb,day.vas,atmos.vas.tavg-h10m-hxy-u.day.glb,babbd25c-e5dd-11e5-8482-ac72891c3257,core,,
+256,atmos.vas.tavg-h10m-hxy-u.mon.glb,mon,atmos,northward_wind,m s-1,area: time: mean,area: areacella,Northward Near-Surface Wind,Northward component of the near surface wind,"normally, the the wind component should be reported at the 10 meter height",longitude latitude time height10m,vas,real,,XY-na,time-intv,Amon,vas,vas,tavg-h10m-hxy-u,vas_tavg-h10m-hxy-u,glb,Amon.vas,atmos.vas.tavg-h10m-hxy-u.mon.glb,babbcd34-e5dd-11e5-8482-ac72891c3257,core,,
+257,atmos.vas.tpt-h10m-hxy-u.1hr.glb,1hr,atmos,northward_wind,m s-1,area: mean time: point,area: areacella,Northward Near-Surface Wind,Meridional wind (positive in a northward direction) at 10 meters above the surface.,,longitude latitude time1 height10m,vas,real,,XY-na,time-point,E1hr,vas,vas,tpt-h10m-hxy-u,vas_tpt-h10m-hxy-u,glb,E1hr.vas,atmos.vas.tpt-h10m-hxy-u.1hr.glb,83bbfbbc-7f07-11ef-9308-b1dd71e64bec,high,,
+258,atmos.vas.tpt-h10m-hxy-u.3hr.glb,3hr,atmos,northward_wind,m s-1,area: mean time: point,area: areacella,Northward Near-Surface Wind,This is sampled synoptically.,"CHANGE SINCE CMIP6: compound name,",longitude latitude time1 height10m,vas,real,,XY-na,time-point,3hrPt,vas,vas,tpt-h10m-hxy-u,vas_tpt-h10m-hxy-u,glb,3hrPt.vas,atmos.vas.tpt-h10m-hxy-u.3hr.glb,babbdec8-e5dd-11e5-8482-ac72891c3257,core,,
+259,atmos.wap.tavg-500hPa-hxy-air.day.glb,day,atmos,lagrangian_tendency_of_air_pressure,Pa s-1,area: time: mean where air,area: areacella,Pressure Tendency,"at 500 hPa level; commonly referred to as ""omega"", this represents the vertical component of velocity in pressure coordinates (positive down)","CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean CMIP7:area: time: mean where air,",longitude latitude time p500,wap,real,,XY-na,time-intv,CFday,wap500,wap,tavg-500hPa-hxy-air,wap_tavg-500hPa-hxy-air,glb,CFday.wap500,atmos.wap.tavg-500hPa-hxy-air.day.glb,babd06a4-e5dd-11e5-8482-ac72891c3257,high,,
+260,atmos.wap.tavg-p19-hxy-air.mon.glb,mon,atmos,lagrangian_tendency_of_air_pressure,Pa s-1,area: time: mean where air,area: areacella,Omega (=dp/dt),"commonly referred to as ""omega"", this represents the vertical component of velocity in pressure coordinates (positive down)","CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: time: mean where air,",longitude latitude plev19 time,wap,real,,XY-P19,time-intv,Amon,wap,wap,tavg-p19-hxy-air,wap_tavg-p19-hxy-air,glb,Amon.wap,atmos.wap.tavg-p19-hxy-air.mon.glb,babd0906-e5dd-11e5-8482-ac72891c3257,core,,
+261,atmos.wap.tavg-p19-hxy-u.day.glb,day,atmos,lagrangian_tendency_of_air_pressure,Pa s-1,time: mean,area: areacella,Omega (=dp/dt),"commonly referred to as ""omega"", this represents the vertical component of velocity in pressure coordinates (positive down)","CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude plev8 time CMIP7:longitude latitude plev19 time,",longitude latitude plev19 time,wap,real,,XY-P19,time-intv,day,wap,wap,tavg-p19-hxy-u,wap_tavg-p19-hxy-u,glb,day.wap,atmos.wap.tavg-p19-hxy-u.day.glb,babd0e56-e5dd-11e5-8482-ac72891c3257,core,,
+262,atmos.wsg.tmax-h100m-hxy-u.1hr.glb,1hr,atmos,wind_speed_of_gust,m s-1,area: mean time: maximum,area: areacella,Maximum Wind Speed of Gust at 100m,Wind speed gust maximum at 100m above surface,Wind speed gust maximum at 100m above surface - hourly output,longitude latitude time height100m,wsg,real,,XY-na,time-intv,E1hr,wsgmax100m,wsg,tmax-h100m-hxy-u,wsg_tmax-h100m-hxy-u,glb,E1hr.wsgmax100m,atmos.wsg.tmax-h100m-hxy-u.1hr.glb,83bbfc7d-7f07-11ef-9308-b1dd71e64bec,high,,
+263,atmos.wsg.tmax-h10m-hxy-u.1hr.glb,1hr,atmos,wind_speed_of_gust,m s-1,area: mean time: maximum,area: areacella,Maximum Wind Speed of Gust at 10m,Wind speed gust maximum at 10m above surface,Time maximum required,longitude latitude time height10m,wsg,real,,XY-na,time-intv,E1hr,wsgmax10m,wsg,tmax-h10m-hxy-u,wsg_tmax-h10m-hxy-u,glb,E1hr.wsgmax10m,atmos.wsg.tmax-h10m-hxy-u.1hr.glb,83bbfc7b-7f07-11ef-9308-b1dd71e64bec,high,,
+264,atmos.zfull.ti-al-hxy-u.fx.glb,fx,atmos,height_above_reference_ellipsoid,m,area: mean,area: areacella,Altitude of Model Full-Levels,Provide only if altitude of full model levels is fixed,,longitude latitude alevel,zfull,real,,XY-A,None,fx,zfull,zfull,ti-al-hxy-u,zfull_ti-al-hxy-u,glb,fx.zfull,atmos.zfull.ti-al-hxy-u.fx.glb,0ea7a738776ef049ed7bef9c701a819c8c9ca036,low,,
+265,atmos.zg.tavg-p19-hxy-air.day.glb,day,atmos,geopotential_height,m,area: time: mean where air,area: areacella,Geopotential Height,"Geopotential is the sum of the specific gravitational potential energy relative to the geoid and the specific centripetal potential energy. Geopotential height is the geopotential divided by the standard acceleration due to gravity. It is numerically similar to the altitude (or geometric height) and not to the quantity with standard name height, which is relative to the surface.","CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude plev8 time CMIP7:longitude latitude plev19 time, CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: time: mean where air,",longitude latitude plev19 time,zg,real,,XY-P19,time-intv,day,zg,zg,tavg-p19-hxy-air,zg_tavg-p19-hxy-air,glb,day.zg,atmos.zg.tavg-p19-hxy-air.day.glb,babda032-e5dd-11e5-8482-ac72891c3257,core,,
+266,atmos.zg.tavg-p19-hxy-air.mon.glb,mon,atmos,geopotential_height,m,area: time: mean where air,area: areacella,Geopotential Height,"Geopotential is the sum of the specific gravitational potential energy relative to the geoid and the specific centripetal potential energy. Geopotential height is the geopotential divided by the standard acceleration due to gravity. It is numerically similar to the altitude (or geometric height) and not to the quantity with standard name height, which is relative to the surface.","CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: time: mean where air,",longitude latitude plev19 time,zg,real,,XY-P19,time-intv,Amon,zg,zg,tavg-p19-hxy-air,zg_tavg-p19-hxy-air,glb,Amon.zg,atmos.zg.tavg-p19-hxy-air.mon.glb,babd9ace-e5dd-11e5-8482-ac72891c3257,core,,
+267,atmos.zg.tpt-al-hxy-u.6hr.glb,6hr,atmos,geopotential_height,m,area: mean time: point,area: areacella,Geopotential height,Geopotential height,on all model levels,longitude latitude alevel time1,zg,real,,XY-A,time-point,6hrLev,zg,zg,tpt-al-hxy-u,zg_tpt-al-hxy-u,glb,6hrLev.zg,atmos.zg.tpt-al-hxy-u.6hr.glb,80ab720f-a698-11ef-914a-613c0433d878,high,,
+268,atmos.zg.tpt-p7h-hxy-air.6hr.glb,6hr,atmos,geopotential_height,m,area: mean where air time: point,area: areacella,Geopotential Height,"Geopotential is the sum of the specific gravitational potential energy relative to the geoid and the specific centripetal potential energy. Geopotential height is the geopotential divided by the standard acceleration due to gravity. It is numerically similar to the altitude (or geometric height) and not to the quantity with standard name height, which is relative to the surface.","CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean time: point CMIP7:area: mean where air time: point,",longitude latitude plev7h time1,zg,real,,XY-P7T,time-point,6hrPlevPt,zg,zg,tpt-p7h-hxy-air,zg_tpt-p7h-hxy-air,glb,6hrPlevPt.zg7h,atmos.zg.tpt-p7h-hxy-air.6hr.glb,7d943832-1ab7-11e7-8dfc-5404a60d96b5,high,,
+269,atmos.ztp.tavg-u-hxy-u.mon.glb,mon,atmos,tropopause_altitude,m,area: time: mean,area: areacella,Tropopause Altitude Above Geoid,2D monthly mean thermal tropopause calculated using WMO tropopause definition on 3d temperature,,longitude latitude time,ztp,real,,XY-na,time-intv,AERmon,ztp,ztp,tavg-u-hxy-u,ztp_tavg-u-hxy-u,glb,AERmon.ztp,atmos.ztp.tavg-u-hxy-u.mon.glb,19be55a8-81b1-11e6-92de-ac72891c3257,high,,
\ No newline at end of file
diff --git a/awi-esm3-veg-hr-variables/cap7_atm/cmip7_CAP7_variables_atmos_land.csv b/awi-esm3-veg-hr-variables/cap7_atm/cmip7_CAP7_variables_atmos_land.csv
new file mode 100644
index 00000000..e81a623e
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/cap7_atm/cmip7_CAP7_variables_atmos_land.csv
@@ -0,0 +1 @@
+,name,frequency,modeling_realm,standard_name,units,cell_methods,cell_measures,long_name,comment,processing_note,dimensions,out_name,type,positive,spatial_shape,temporal_shape,cmip6_table,physical_parameter_name,variableRootDD,branding_label,branded_variable_name,region,cmip6_compound_name,cmip7_compound_name,uid,priority,flag_values,flag_meanings
diff --git a/awi-esm3-veg-hr-variables/cap7_atm/cmip7_CAP7_variables_landIce.csv b/awi-esm3-veg-hr-variables/cap7_atm/cmip7_CAP7_variables_landIce.csv
new file mode 100644
index 00000000..4b54af60
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/cap7_atm/cmip7_CAP7_variables_landIce.csv
@@ -0,0 +1,2 @@
+,name,frequency,modeling_realm,standard_name,units,cell_methods,cell_measures,long_name,comment,processing_note,dimensions,out_name,type,positive,spatial_shape,temporal_shape,cmip6_table,physical_parameter_name,variableRootDD,branding_label,branded_variable_name,region,cmip6_compound_name,cmip7_compound_name,uid,priority,flag_values,flag_meanings
+389,landIce.sbl.tavg-u-hxy-u.mon.glb,mon,landIce,tendency_of_atmosphere_mass_content_of_water_vapor_due_to_sublimation_of_surface_snow_and_ice,kg m-2 s-1,area: time: mean,area: areacella,Surface Snow and Ice Sublimation Flux,The snow and ice sublimation flux is the loss of snow and ice mass from the surface resulting from their conversion to water vapor that enters the atmosphere.,"This differs from sbl appearing in table Limon in that the flux is averaged over the entire grid cell, not just the land portion.",longitude latitude time,sbl,real,,XY-na,time-intv,Amon,sbl,sbl,tavg-u-hxy-u,sbl_tavg-u-hxy-u,glb,Amon.sbl,landIce.sbl.tavg-u-hxy-u.mon.glb,bab6b948-e5dd-11e5-8482-ac72891c3257,high,,
\ No newline at end of file
diff --git a/awi-esm3-veg-hr-variables/cap7_atm/cmip7_CAP7_variables_landIce_land.csv b/awi-esm3-veg-hr-variables/cap7_atm/cmip7_CAP7_variables_landIce_land.csv
new file mode 100644
index 00000000..8221694f
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/cap7_atm/cmip7_CAP7_variables_landIce_land.csv
@@ -0,0 +1,7 @@
+,name,frequency,modeling_realm,standard_name,units,cell_methods,cell_measures,long_name,comment,processing_note,dimensions,out_name,type,positive,spatial_shape,temporal_shape,cmip6_table,physical_parameter_name,variableRootDD,branding_label,branded_variable_name,region,cmip6_compound_name,cmip7_compound_name,uid,priority,flag_values,flag_meanings
+388,landIce.mrfso.tavg-u-hxy-lnd.mon.glb,mon,landIce land,soil_frozen_water_content,kg m-2,area: mean where land time: mean,area: areacella,Soil Frozen Water Content,the mass (summed over all all layers) of frozen water.,,longitude latitude time,mrfso,real,,XY-na,time-intv,Lmon,mrfso,mrfso,tavg-u-hxy-lnd,mrfso_tavg-u-hxy-lnd,glb,Lmon.mrfso,landIce.mrfso.tavg-u-hxy-lnd.mon.glb,bab1688a-e5dd-11e5-8482-ac72891c3257,core,,
+390,landIce.snc.tavg-u-hxy-lnd.day.glb,day,landIce land,surface_snow_area_fraction,%,area: mean where land time: mean,area: areacella,Snow Area Percentage,Percentage of each grid cell that is occupied by snow that rests on land portion of cell.,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean CMIP7:area: mean where land time: mean,",longitude latitude time,snc,real,,XY-na,time-intv,day,snc,snc,tavg-u-hxy-lnd,snc_tavg-u-hxy-lnd,glb,day.snc,landIce.snc.tavg-u-hxy-lnd.day.glb,bab7c75c-e5dd-11e5-8482-ac72891c3257,high,,
+391,landIce.snc.tavg-u-hxy-lnd.mon.glb,mon,landIce land,surface_snow_area_fraction,%,area: mean where land time: mean,area: areacella,Snow Area Percentage,Fraction of each grid cell that is occupied by snow that rests on land portion of cell.,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean CMIP7:area: mean where land time: mean,",longitude latitude time,snc,real,,XY-na,time-intv,LImon,snc,snc,tavg-u-hxy-lnd,snc_tavg-u-hxy-lnd,glb,LImon.snc,landIce.snc.tavg-u-hxy-lnd.mon.glb,bab7c2d4-e5dd-11e5-8482-ac72891c3257,core,,
+392,landIce.snd.tavg-u-hxy-lnd.mon.glb,mon,landIce land,surface_snow_thickness,m,area: mean where land time: mean,area: areacella,Snow Depth,"where land over land, this is computed as the mean thickness of snow in the land portion of the grid cell (averaging over the entire land portion, including the snow-free fraction). Reported as missing where the land fraction is 0.",,longitude latitude time,snd,real,,XY-na,time-intv,LImon,snd,snd,tavg-u-hxy-lnd,snd_tavg-u-hxy-lnd,glb,LImon.snd,landIce.snd.tavg-u-hxy-lnd.mon.glb,bab7e05c-e5dd-11e5-8482-ac72891c3257,high,,
+393,landIce.snw.tavg-u-hxy-lnd.day.glb,day,landIce land,surface_snow_amount,kg m-2,area: mean where land time: mean,area: areacella,Surface Snow Amount,the mass of surface snow on the land portion of the grid cell divided by the land area in the grid cell; reported as missing where the land fraction is 0; excludes snow on vegetation canopy or on sea ice.,,longitude latitude time,snw,real,,XY-na,time-intv,day,snw,snw,tavg-u-hxy-lnd,snw_tavg-u-hxy-lnd,glb,day.snw,landIce.snw.tavg-u-hxy-lnd.day.glb,bab820b2-e5dd-11e5-8482-ac72891c3257,high,,
+394,landIce.snw.tavg-u-hxy-lnd.mon.glb,mon,landIce land,surface_snow_amount,kg m-2,area: mean where land time: mean,area: areacella,Surface Snow Amount,Computed as the mass of surface snow on the land portion of the grid cell divided by the land area in the grid cell; reported as missing where the land fraction is 0; excluded is snow on vegetation canopy or on sea ice.,,longitude latitude time,snw,real,,XY-na,time-intv,LImon,snw,snw,tavg-u-hxy-lnd,snw_tavg-u-hxy-lnd,glb,LImon.snw,landIce.snw.tavg-u-hxy-lnd.mon.glb,bab81e50-e5dd-11e5-8482-ac72891c3257,core,,
\ No newline at end of file
diff --git a/awi-esm3-veg-hr-variables/cap7_atm/cmip7_awiesm3-veg-hr_cap7_atm.yaml b/awi-esm3-veg-hr-variables/cap7_atm/cmip7_awiesm3-veg-hr_cap7_atm.yaml
new file mode 100644
index 00000000..6ab563b8
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/cap7_atm/cmip7_awiesm3-veg-hr_cap7_atm.yaml
@@ -0,0 +1,666 @@
+# CMIP7 CAP7 Atmosphere Variables — AWI-ESM3-VEG-HR
+# Generated from 4 CSVs in cap7_atm/
+#
+# 62 producible out of 154 total variables.
+# 92 blocked: 17 COSP, 21 tendencies, 9 aerosol, 5 CO2, 4 effective radii,
+# ~40 IFS source changes needed (convective, radiation profiles,
+# 100m wind, diffuse radiation, tropopause, cloud droplet number).
+
+general:
+ name: "awiesm3-cmip7-cap7-atm"
+ cmor_version: "CMIP7"
+ mip: "CMIP"
+ CMIP7_DReq_metadata: "/home/a/a270092/.cache/pycmor/cmip7_metadata/v1.2.2.2/metadata.json"
+
+pycmor:
+ warn_on_no_rule: False
+ dask_cluster: "slurm"
+ dask_cluster_scaling_mode: "fixed"
+ dask_cluster_scaling_fixed_jobs: 1
+
+jobqueue:
+ slurm:
+ name: pycmor-worker
+ queue: compute
+ account: bb1469
+ cores: 16
+ memory: 256GB
+ walltime: '00:30:00'
+
+pipelines:
+ # hurs: Magnus formula from 2t + 2d
+ - name: hurs_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_hurs
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # huss: Tetens formula from 2d + sp
+ - name: huss_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_huss
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # sfcWind: sqrt(u10^2 + v10^2)
+ - name: sfcwind_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_sfcwind
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # clwvi: tclw + tciw from daily cap7 output
+ - name: clwvi_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_clwvi
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # snc: snow cover from snow depth (sd)
+ - name: snc_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_snc
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # snd: snow depth from sd and rsn
+ - name: snd_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_snd
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # rtmt: net downward radiative flux at model top
+ - name: rtmt_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_rtmt
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # extract single pressure level (ta@700, wap@500)
+ - name: single_plevel_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:extract_single_plevel
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+inherit:
+ data_path: &dp /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/oifs
+ source_id: AWI-ESM-3
+ institution_id: AWI
+ experiment_id: picontrol
+ variant_label: r1i1p1f1
+ grid_label: gn
+ grid: "OpenIFS TCo319 reduced Gaussian, interpolated to 0.25deg regular grid"
+ nominal_resolution: "25 km"
+ institution: "Alfred Wegener Institute, Helmholtz Centre for Polar and Marine Research, Bremerhaven, Germany"
+ output_directory: ./cmorized_output/awiesm3
+
+rules:
+ # ============================================================
+ # Part 1: Daily CMOR-ready surface fields (from _day_cap7 XIOS output)
+ # ============================================================
+
+ - name: hfls_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_cap7_hfls_*.nc
+ compound_name: atmos.hfls.tavg-u-hxy-u.day.glb
+ model_variable: hfls
+
+ - name: hfss_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_cap7_hfss_*.nc
+ compound_name: atmos.hfss.tavg-u-hxy-u.day.glb
+ model_variable: hfss
+
+ - name: rlus_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_cap7_rlus_*.nc
+ compound_name: atmos.rlus.tavg-u-hxy-u.day.glb
+ model_variable: rlus
+
+ - name: rsus_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_cap7_rsus_*.nc
+ compound_name: atmos.rsus.tavg-u-hxy-u.day.glb
+ model_variable: rsus
+
+ - name: rluscs_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_cap7_rluscs_*.nc
+ compound_name: atmos.rluscs.tavg-u-hxy-u.day.glb
+ model_variable: rluscs
+
+ - name: rsuscs_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_cap7_rsuscs_*.nc
+ compound_name: atmos.rsuscs.tavg-u-hxy-u.day.glb
+ model_variable: rsuscs
+
+ - name: rlds_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_cap7_rlds_*.nc
+ compound_name: atmos.rlds.tavg-u-hxy-u.day.glb
+ model_variable: rlds
+
+ - name: rldscs_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_cap7_rldscs_*.nc
+ compound_name: atmos.rldscs.tavg-u-hxy-u.day.glb
+ model_variable: rldscs
+
+ - name: rsdscs_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_cap7_rsdscs_*.nc
+ compound_name: atmos.rsdscs.tavg-u-hxy-u.day.glb
+ model_variable: rsdscs
+
+ - name: rlut_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_cap7_rlut_*.nc
+ compound_name: atmos.rlut.tavg-u-hxy-u.day.glb
+ model_variable: rlut
+
+ - name: rlutcs_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_cap7_rlutcs_*.nc
+ compound_name: atmos.rlutcs.tavg-u-hxy-u.day.glb
+ model_variable: rlutcs
+
+ - name: rsdt_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_cap7_rsdt_*.nc
+ compound_name: atmos.rsdt.tavg-u-hxy-u.day.glb
+ model_variable: rsdt
+
+ - name: rsut_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_cap7_rsut_*.nc
+ compound_name: atmos.rsut.tavg-u-hxy-u.day.glb
+ model_variable: rsut
+
+ - name: rsutcs_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_cap7_rsutcs_*.nc
+ compound_name: atmos.rsutcs.tavg-u-hxy-u.day.glb
+ model_variable: rsutcs
+
+ - name: prc_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_cap7_prc_*.nc
+ compound_name: atmos.prc.tavg-u-hxy-u.day.glb
+ model_variable: prc
+
+ - name: prsn_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_cap7_prsn_*.nc
+ compound_name: atmos.prsn.tavg-u-hxy-u.day.glb
+ model_variable: prsn
+
+ - name: prw_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_cap7_prw_*.nc
+ compound_name: atmos.prw.tavg-u-hxy-u.day.glb
+ model_variable: prw
+
+ - name: clivi_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_cap7_clivi_*.nc
+ compound_name: atmos.clivi.tavg-u-hxy-u.day.glb
+ model_variable: clivi
+
+ - name: snw_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_cap7_snw_*.nc
+ compound_name: landIce.snw.tavg-u-hxy-lnd.day.glb
+ model_variable: snw
+
+ # ============================================================
+ # Part 2: Daily pipeline-computed surface fields
+ # ============================================================
+
+ - name: clwvi_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_cap7_tclw_*.nc
+ compound_name: atmos.clwvi.tavg-u-hxy-u.day.glb
+ model_variable: tclw
+ second_input_path: *dp
+ second_input_pattern: atmos_day_cap7_clivi_*.nc
+ second_variable: clivi
+ pipelines:
+ - clwvi_pipeline
+
+ - name: snc_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_land_sd_*.nc
+ compound_name: landIce.snc.tavg-u-hxy-lnd.day.glb
+ model_variable: sd
+ pipelines:
+ - snc_pipeline
+
+ - name: hurs_day_max
+ inputs:
+ - path: *dp
+ pattern: atmos_1d_cmip7_2t_*.nc
+ compound_name: atmos.hurs.tmax-h2m-hxy-u.day.glb
+ model_variable: 2t
+ second_input_path: *dp
+ second_input_pattern: atmos_1d_cmip7_2d_*.nc
+ second_variable: 2d
+ pipelines:
+ - hurs_pipeline
+
+ - name: hurs_day_min
+ inputs:
+ - path: *dp
+ pattern: atmos_1d_cmip7_2t_*.nc
+ compound_name: atmos.hurs.tmin-h2m-hxy-u.day.glb
+ model_variable: 2t
+ second_input_path: *dp
+ second_input_pattern: atmos_1d_cmip7_2d_*.nc
+ second_variable: 2d
+ pipelines:
+ - hurs_pipeline
+
+ - name: sfcWind_day_max
+ inputs:
+ - path: *dp
+ pattern: atmos_day_cap7_minmax_sfcWindmax_*.nc
+ compound_name: atmos.sfcWind.tmax-h10m-hxy-u.day.glb
+ model_variable: sfcWindmax
+
+ # ============================================================
+ # Part 3: Daily from plev19 (single-level extraction)
+ # ============================================================
+
+ - name: ta_day_700hPa
+ inputs:
+ - path: *dp
+ pattern: atmos_1d_pl_cmip7_t_*.nc
+ compound_name: atmos.ta.tavg-700hPa-hxy-air.day.glb
+ model_variable: t
+ target_plevel: 70000
+ pipelines:
+ - single_plevel_pipeline
+
+ - name: wap_day_500hPa
+ inputs:
+ - path: *dp
+ pattern: atmos_1d_pl_cmip7_w_*.nc
+ compound_name: atmos.wap.tavg-500hPa-hxy-air.day.glb
+ model_variable: w
+ target_plevel: 50000
+ pipelines:
+ - single_plevel_pipeline
+
+ # ============================================================
+ # Part 4: 3hr fields
+ # ============================================================
+
+ - name: prsn_3hr
+ inputs:
+ - path: *dp
+ pattern: atmos_3h_prsn_prsn_*.nc
+ compound_name: atmos.prsn.tavg-u-hxy-u.3hr.glb
+ model_variable: prsn
+
+ # ============================================================
+ # Part 5: 1hr fields
+ # ============================================================
+
+ - name: huss_1hr
+ inputs:
+ - path: *dp
+ pattern: atmos_1h_pt_2d_*.nc
+ compound_name: atmos.huss.tpt-h2m-hxy-u.1hr.glb
+ model_variable: 2d
+ second_input_path: *dp
+ second_input_pattern: atmos_1h_sfc_sp_*.nc
+ second_variable: sp
+ pipelines:
+ - huss_pipeline
+
+ - name: psl_1hr
+ inputs:
+ - path: *dp
+ pattern: atmos_1h_pt_msl_*.nc
+ compound_name: atmos.psl.tpt-u-hxy-u.1hr.glb
+ model_variable: msl
+
+ - name: ts_1hr
+ inputs:
+ - path: *dp
+ pattern: atmos_1h_ts_ts_*.nc
+ compound_name: atmos.ts.tavg-u-hxy-u.1hr.glb
+ model_variable: ts
+
+ - name: uas_1hr
+ inputs:
+ - path: *dp
+ pattern: atmos_1h_pt_10u_*.nc
+ compound_name: atmos.uas.tpt-h10m-hxy-u.1hr.glb
+ model_variable: 10u
+
+ - name: vas_1hr
+ inputs:
+ - path: *dp
+ pattern: atmos_1h_pt_10v_*.nc
+ compound_name: atmos.vas.tpt-h10m-hxy-u.1hr.glb
+ model_variable: 10v
+
+ - name: ps_1hr
+ inputs:
+ - path: *dp
+ pattern: atmos_1h_sfc_sp_*.nc
+ compound_name: atmos.ps.tpt-u-hxy-u.1hr.glb
+ model_variable: sp
+
+ - name: rlds_1hr
+ inputs:
+ - path: *dp
+ pattern: atmos_1h_sfc_rlds_*.nc
+ compound_name: atmos.rlds.tavg-u-hxy-u.1hr.glb
+ model_variable: rlds
+
+ - name: rsds_1hr
+ inputs:
+ - path: *dp
+ pattern: atmos_1h_sfc_rsds_*.nc
+ compound_name: atmos.rsds.tavg-u-hxy-u.1hr.glb
+ model_variable: rsds
+
+ - name: sfcWind_1hr
+ inputs:
+ - path: *dp
+ pattern: atmos_1h_sfc_10u_*.nc
+ compound_name: atmos.sfcWind.tavg-h10m-hxy-u.1hr.glb
+ model_variable: 10u
+ second_input_path: *dp
+ second_input_pattern: atmos_1h_sfc_10v_*.nc
+ second_variable: 10v
+ pipelines:
+ - sfcwind_pipeline
+
+ - name: wsg_1hr_10m
+ inputs:
+ - path: *dp
+ pattern: atmos_1h_wsg_wsg10_*.nc
+ compound_name: atmos.wsg.tmax-h10m-hxy-u.1hr.glb
+ model_variable: wsg10
+
+ # ============================================================
+ # Part 6: 6hr instantaneous surface fields
+ # ============================================================
+
+ - name: ps_6hr
+ inputs:
+ - path: *dp
+ pattern: atmos_6h_pt_sp_*.nc
+ compound_name: atmos.ps.tpt-u-hxy-u.6hr.glb
+ model_variable: sp
+
+ - name: psl_6hr
+ inputs:
+ - path: *dp
+ pattern: atmos_6h_pt_msl_*.nc
+ compound_name: atmos.psl.tpt-u-hxy-u.6hr.glb
+ model_variable: msl
+
+ - name: ts_6hr
+ inputs:
+ - path: *dp
+ pattern: atmos_6h_pt_ts_*.nc
+ compound_name: atmos.ts.tpt-u-hxy-u.6hr.glb
+ model_variable: ts
+
+ # ============================================================
+ # Part 7: 6hr instantaneous model-level fields
+ # ============================================================
+
+ - name: ta_6hr_ml
+ inputs:
+ - path: *dp
+ pattern: atmos_6h_ml_ta_*.nc
+ compound_name: atmos.ta.tpt-al-hxy-u.6hr.glb
+ model_variable: ta
+
+ - name: ua_6hr_ml
+ inputs:
+ - path: *dp
+ pattern: atmos_6h_ml_ua_*.nc
+ compound_name: atmos.ua.tpt-al-hxy-u.6hr.glb
+ model_variable: ua
+
+ - name: va_6hr_ml
+ inputs:
+ - path: *dp
+ pattern: atmos_6h_ml_va_*.nc
+ compound_name: atmos.va.tpt-al-hxy-u.6hr.glb
+ model_variable: va
+
+ - name: hus_6hr_ml
+ inputs:
+ - path: *dp
+ pattern: atmos_6h_ml_hus_*.nc
+ compound_name: atmos.hus.tpt-al-hxy-u.6hr.glb
+ model_variable: hus
+
+ - name: zg_6hr_ml
+ inputs:
+ - path: *dp
+ pattern: atmos_6h_ml_zg_*.nc
+ compound_name: atmos.zg.tpt-al-hxy-u.6hr.glb
+ model_variable: zg
+
+ # ============================================================
+ # Part 8: 6hr instantaneous plev7h fields
+ # ============================================================
+
+ - name: ta_6hr_pl7h
+ inputs:
+ - path: *dp
+ pattern: atmos_6h_pl7h_ta_*.nc
+ compound_name: atmos.ta.tpt-p7h-hxy-air.6hr.glb
+ model_variable: ta
+
+ - name: ua_6hr_pl7h
+ inputs:
+ - path: *dp
+ pattern: atmos_6h_pl7h_ua_*.nc
+ compound_name: atmos.ua.tpt-p7h-hxy-air.6hr.glb
+ model_variable: ua
+
+ - name: va_6hr_pl7h
+ inputs:
+ - path: *dp
+ pattern: atmos_6h_pl7h_va_*.nc
+ compound_name: atmos.va.tpt-p7h-hxy-air.6hr.glb
+ model_variable: va
+
+ - name: hus_6hr_pl7h
+ inputs:
+ - path: *dp
+ pattern: atmos_6h_pl7h_hus_*.nc
+ compound_name: atmos.hus.tpt-p7h-hxy-air.6hr.glb
+ model_variable: hus
+
+ - name: zg_6hr_pl7h
+ inputs:
+ - path: *dp
+ pattern: atmos_6h_pl7h_zg_*.nc
+ compound_name: atmos.zg.tpt-p7h-hxy-air.6hr.glb
+ model_variable: zg
+
+ # ============================================================
+ # Part 9: Monthly surface fields
+ # ============================================================
+
+ - name: rtmt_mon
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_*.nc
+ compound_name: atmos.rtmt.tavg-u-hxy-u.mon.glb
+ model_variable: rsdt
+ pipelines:
+ - rtmt_pipeline
+
+ - name: ci_mon
+ inputs:
+ - path: *dp
+ pattern: atmos_1m_ci_*.nc
+ compound_name: atmos.ci.tavg-u-hxy-u.mon.glb
+ model_variable: ci
+
+ - name: sbl_mon
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_land_sbl_*.nc
+ compound_name: landIce.sbl.tavg-u-hxy-u.mon.glb
+ model_variable: sbl
+
+ # ============================================================
+ # Part 10: Monthly model-level fields
+ # ============================================================
+
+ - name: pfull_mon
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_ml_cap7_pfull_*.nc
+ compound_name: atmos.pfull.tclm-al-hxy-u.mon.glb
+ model_variable: pfull
+
+ - name: ta_mon_ml
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_ml_cap7_ta_*.nc
+ compound_name: atmos.ta.tavg-al-hxy-u.mon.glb
+ model_variable: ta
+
+ - name: hus_mon_ml
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_ml_cap7_hus_*.nc
+ compound_name: atmos.hus.tavg-al-hxy-u.mon.glb
+ model_variable: hus
+
+ - name: hur_mon_ml
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_ml_cap7_hur_*.nc
+ compound_name: atmos.hur.tavg-al-hxy-u.mon.glb
+ model_variable: hur
+
+ # ============================================================
+ # Part 11: Land/ice variables (from existing pipelines)
+ # ============================================================
+
+ - name: snd_mon
+ inputs:
+ - path: *dp
+ pattern: atmos_1m_sd_*.nc
+ compound_name: landIce.snd.tavg-u-hxy-lnd.mon.glb
+ model_variable: sd
+ second_input_path: *dp
+ second_input_pattern: atmos_1m_rsn_*.nc
+ second_variable: rsn
+ pipelines:
+ - snd_pipeline
diff --git a/awi-esm3-veg-hr-variables/cap7_atm/cmip7_cap7_atm_todo.md b/awi-esm3-veg-hr-variables/cap7_atm/cmip7_cap7_atm_todo.md
new file mode 100644
index 00000000..8c5d8274
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/cap7_atm/cmip7_cap7_atm_todo.md
@@ -0,0 +1,293 @@
+# CAP7 Atmosphere Variables — AWI-ESM3-VEG-HR
+
+Source CSVs (unfiltered): `cmip7_CAP7_variables_atmos.csv` (226), `cmip7_CAP7_variables_landIce.csv` (1: sbl), `cmip7_CAP7_variables_landIce_land.csv` (6: snc, snd, snw, mrfso), `cmip7_CAP7_variables_atmos_land.csv` (0 data rows).
+
+Total: 233 compound_name entries — 79 already in core/veg/extra/lrcs, 58 new cap7 rules, ~96 blocked
+
+XIOS field definitions: `field_def_cmip7.xml`
+XIOS output config: `file_def_oifs_cmip7_spinup.xml.j2`
+Pycmor rules: `cmip7_awiesm3-veg-hr_cap7_atm.yaml`
+
+---
+
+## Already in core/veg/extra/lrcs (79 compound entries)
+
+These variables already have matching compound names in other tier configs. No new rules needed.
+
+### core_atm (76)
+- [x] **cl** (mon), **cli** (mon), **clivi** (mon), **clt** (day, mon), **clw** (mon), **clwvi** (mon)
+- [x] **hfls** (mon), **hfss** (mon), **hur** (day, mon), **hurs** (day, 6hr, mon)
+- [x] **hus** (day, mon), **huss** (day, mon, 3hr), **pr** (1hr, 3hr, day, mon), **prc** (mon), **prsn** (mon), **prw** (mon)
+- [x] **ps** (day, mon), **psl** (day, mon)
+- [x] **rlds** (mon), **rldscs** (mon), **rlus** (mon), **rluscs** (mon), **rlut** (mon), **rlutcs** (mon)
+- [x] **rsds** (day, mon), **rsdscs** (mon), **rsdt** (mon), **rsus** (mon), **rsuscs** (mon), **rsut** (mon), **rsutcs** (mon)
+- [x] **sfcWind** (day, mon), **sftlf** (fx)
+- [x] **ta** (day, mon, 6hr plev3), **tas** (day, mon, 3hr, daily max/min, monthly max/min), **tauu** (mon), **tauv** (mon), **ts** (mon)
+- [x] **ua** (day, mon, 6hr plev3), **uas** (day, mon, 3hr), **va** (day, mon, 6hr plev3), **vas** (day, mon, 3hr)
+- [x] **wap** (day, mon), **zg** (day, mon)
+
+### core_land (2)
+- [x] **snc** (mon), **snw** (mon)
+
+### lrcs_land (1)
+- [x] **mrfso** (mon)
+
+---
+
+## Daily 2D surface — CMOR-ready from XIOS (from `_day_cap7`)
+
+- [x] **hfls** — Surface Upward Latent Heat Flux (`W m-2`, day) — XIOS CMOR field
+- [x] **hfss** — Surface Upward Sensible Heat Flux (`W m-2`, day) — XIOS CMOR field
+- [x] **rlus** — Surface Upwelling Longwave (`W m-2`, day) — XIOS CMOR field
+- [x] **rsus** — Surface Upwelling Shortwave (`W m-2`, day) — XIOS CMOR field
+- [x] **rluscs** — Surface Upwelling LW Clear-Sky (`W m-2`, day) — XIOS CMOR field
+- [x] **rsuscs** — Surface Upwelling SW Clear-Sky (`W m-2`, day) — XIOS CMOR field
+- [x] **rlds** — Surface Downwelling Longwave (`W m-2`, day) — XIOS CMOR field
+- [x] **rldscs** — Surface Downwelling LW Clear-Sky (`W m-2`, day) — XIOS CMOR field
+- [x] **rsdscs** — Surface Downwelling SW Clear-Sky (`W m-2`, day) — XIOS CMOR field
+- [x] **rlut** — TOA Outgoing Longwave (`W m-2`, day) — XIOS CMOR field
+- [x] **rlutcs** — TOA Outgoing LW Clear-Sky (`W m-2`, day) — XIOS CMOR field
+- [x] **rsdt** — TOA Incoming Shortwave (`W m-2`, day) — XIOS CMOR field
+- [x] **rsut** — TOA Outgoing Shortwave (`W m-2`, day) — XIOS CMOR field
+- [x] **rsutcs** — TOA Outgoing SW Clear-Sky (`W m-2`, day) — XIOS CMOR field
+- [x] **prc** — Convective Precipitation (`kg m-2 s-1`, day) — XIOS CMOR field
+- [x] **prsn** — Snowfall Flux (`kg m-2 s-1`, day) — XIOS CMOR field
+- [x] **prw** — Water Vapor Path (`kg m-2`, day) — XIOS CMOR field from `tcwv`
+- [x] **clivi** — Ice Water Path (`kg m-2`, day) — XIOS CMOR field from `tciw`
+- [x] **snw** — Surface Snow Amount (`kg m-2`, day) — XIOS CMOR field from `sd*1000`
+
+## Daily 2D surface — pipeline-computed
+
+- [x] **clwvi** — Condensed Water Path (`kg m-2`, day) — pipeline: `tclw + tciw`
+- [x] **snc** — Snow Area Fraction (`%`, day) — pipeline: saturation curve from `sd`
+- [x] **hurs** (daily max) — Near-Surface Relative Humidity max (`%`, day) — pipeline: Magnus from `2t+2d` (daily avg approximation)
+- [x] **hurs** (daily min) — Near-Surface Relative Humidity min (`%`, day) — pipeline: Magnus from `2t+2d` (daily avg approximation)
+- [x] **sfcWind** (daily max) — Near-Surface Wind Speed max (`m s-1`, day) — XIOS `operation="maximum"` on `sqrt(10u²+10v²)`
+
+## Daily 3D — single pressure level extraction
+
+- [x] **ta** — Air Temperature at 700 hPa (`K`, day) — pipeline: extract from plev19
+- [x] **wap** — Omega at 500 hPa (`Pa s-1`, day) — pipeline: extract from plev19
+
+## 3-hourly
+
+- [x] **prsn** — Snowfall Flux (`kg m-2 s-1`, 3hr) — XIOS CMOR field: `sf*1000/3600`
+
+## 1-hourly
+
+- [x] **huss** — Near-Surface Specific Humidity (`1`, 1hrPt) — pipeline: Tetens from `2d+sp`
+- [x] **psl** — Sea Level Pressure (`Pa`, 1hrPt) — from `msl` instantaneous
+- [x] **ts** — Surface Temperature (`K`, 1hr) — XIOS CMOR field from `skt`, averaged
+- [x] **uas** — Eastward Near-Surface Wind (`m s-1`, 1hrPt) — from `10u` instantaneous
+- [x] **vas** — Northward Near-Surface Wind (`m s-1`, 1hrPt) — from `10v` instantaneous
+- [x] **ps** — Surface Air Pressure (`Pa`, 1hrPt) — from `sp` (reuses extra_atm output)
+- [x] **rlds** — Surface Downwelling Longwave (`W m-2`, 1hr) — reuses extra_atm output
+- [x] **rsds** — Surface Downwelling Shortwave (`W m-2`, 1hr) — reuses extra_atm output
+- [x] **sfcWind** — Near-Surface Wind Speed (`m s-1`, 1hr) — pipeline: `sqrt(10u²+10v²)` (reuses extra_atm output)
+- [x] **wsg** — Maximum Wind Speed of Gust at 10m (`m s-1`, 1hr) — XIOS `operation="maximum"` on `10fg`
+
+## 6-hourly instantaneous surface
+
+- [x] **ps** — Surface Air Pressure (`Pa`, 6hrPt) — from `sp` instantaneous
+- [x] **psl** — Sea Level Pressure (`Pa`, 6hrPt) — from `msl` instantaneous
+- [x] **ts** — Surface Temperature (`K`, 6hrPt) — from `skt` instantaneous
+
+## 6-hourly instantaneous model levels (from `_6h_ml`)
+
+- [x] **ta** — Air Temperature (`K`, 6hrPt, alevel) — from `t` on `regular_ml`
+- [x] **ua** — Eastward Wind (`m s-1`, 6hrPt, alevel) — from `u` on `regular_ml`
+- [x] **va** — Northward Wind (`m s-1`, 6hrPt, alevel) — from `v` on `regular_ml`
+- [x] **hus** — Specific Humidity (`1`, 6hrPt, alevel) — from `q` on `regular_ml`
+- [x] **zg** — Geopotential Height (`m`, 6hrPt, alevel) — XIOS expr: `z/9.80665` on `regular_ml`
+
+## 6-hourly instantaneous plev7h (from `_6h_pl7h`)
+
+New plev7h axis: 1000, 925, 850, 700, 500, 250, 100 hPa (added to `axis_def.xml` and `grid_def.xml`).
+
+- [x] **ta** — Air Temperature (`K`, 6hrPt, plev7h) — from `t_pl` on `regular_pl7h`
+- [x] **ua** — Eastward Wind (`m s-1`, 6hrPt, plev7h) — from `u_pl` on `regular_pl7h`
+- [x] **va** — Northward Wind (`m s-1`, 6hrPt, plev7h) — from `v_pl` on `regular_pl7h`
+- [x] **hus** — Specific Humidity (`1`, 6hrPt, plev7h) — from `q_pl` on `regular_pl7h`
+- [x] **zg** — Geopotential Height (`m`, 6hrPt, plev7h) — from `z_pl` on `regular_pl7h`
+
+## Monthly surface
+
+- [x] **rtmt** — Net Downward Radiative Flux at Top of Model (`W m-2`, mon) — pipeline: `rsdt-rsut+rlds-rlus`
+- [x] **ci** — Sea-Ice Area Fraction (`1`, mon) — raw `ci` from monthly output
+- [x] **sbl** — Surface Snow and Ice Sublimation Flux (`kg m-2 s-1`, mon) — XIOS CMOR field from `es`
+
+## Monthly model levels (from `_mon_ml_cap7`)
+
+- [x] **pfull** — Pressure at Model Full-Levels (`Pa`, mon, alevel) — raw `pres` on model levels
+- [x] **ta** — Air Temperature (`K`, mon, alevel) — raw `t` on model levels
+- [x] **hus** — Specific Humidity (`1`, mon, alevel) — raw `q` on model levels
+- [x] **hur** — Relative Humidity (`%`, mon, alevel) — XIOS expr: `r*100` on model levels
+
+## Monthly land/ice (pipeline-computed)
+
+- [x] **snd** — Snow Depth (`m`, mon) — pipeline: `sd*1000/rsn` (same as veg_land)
+
+---
+
+## Blocked — satellite simulators (no COSP)
+
+- [ ] **albisccp** — ISCCP Mean Cloud Albedo (`1`, day/mon)
+- [ ] **clcalipso** — CALIPSO Cloud Fraction (`1`, day/mon at p220/p560/p840/alt40) — 7 entries
+- [ ] **clisccp** — ISCCP Cloud Fraction (`1`, mon, plev7c x tau)
+- [ ] **clmisr** — MISR Cloud Fraction (`1`, mon, alt16 x tau)
+- [ ] **cltcalipso** — CALIPSO Total Cloud Fraction (`1`, day/mon)
+- [ ] **cltisccp** — ISCCP Total Cloud Fraction (`1`, day/mon)
+- [ ] **pctisccp** — ISCCP Cloud Top Pressure (`Pa`, day/mon)
+
+Total: 17 entries
+
+## Blocked — temperature tendencies (need IFS source changes)
+
+IFS computes tendencies internally but does NOT expose individual process contributions. Would require significant source code changes to decompose.
+
+- [ ] **tnt** — Total Temperature Tendency (`K s-1`, mon, alevel)
+- [ ] **tnta** — Temperature Tendency from Advection (`K s-1`, mon, alevel)
+- [ ] **tntc** — Temperature Tendency from Convection (`K s-1`, mon, alevel)
+- [ ] **tntd** — Temperature Tendency from Diffusion (`K s-1`, mon, alevel)
+- [ ] **tntmp** — Temperature Tendency from Microphysics (`K s-1`, mon, alevel)
+- [ ] **tntpbl** — Temperature Tendency from PBL (`K s-1`, mon, alevel)
+- [ ] **tntr** — Temperature Tendency from Total Radiation (`K s-1`, mon, alevel)
+- [ ] **tntrl** — Temperature Tendency from LW Radiation (`K s-1`, mon, alevel)
+- [ ] **tntrlcs** — Temperature Tendency from LW Clear-Sky (`K s-1`, mon, alevel)
+- [ ] **tntrs** — Temperature Tendency from SW Radiation (`K s-1`, mon, alevel)
+- [ ] **tntrscs** — Temperature Tendency from SW Clear-Sky (`K s-1`, mon, alevel)
+- [ ] **tntscp** — Temperature Tendency from Stratiform Cloud (`K s-1`, mon, alevel)
+- [ ] **tntscpbl** — Temperature Tendency from Stratiform Cloud + PBL (`K s-1`, mon, alevel)
+
+Total: 13 entries
+
+## Blocked — humidity tendencies (need IFS source changes)
+
+- [ ] **tnhus** — Total Humidity Tendency (`s-1`, mon, alevel)
+- [ ] **tnhusa** — Humidity Tendency from Advection (`s-1`, mon, alevel)
+- [ ] **tnhusc** — Humidity Tendency from Convection (`s-1`, mon, alevel)
+- [ ] **tnhusd** — Humidity Tendency from Diffusion (`s-1`, mon, alevel)
+- [ ] **tnhusmp** — Humidity Tendency from Microphysics (`s-1`, mon, alevel)
+- [ ] **tnhuspbl** — Humidity Tendency from PBL (`s-1`, mon, alevel)
+- [ ] **tnhusscp** — Humidity Tendency from Stratiform Cloud (`s-1`, mon, alevel)
+- [ ] **tnhusscpbl** — Humidity Tendency from Stratiform Cloud + PBL (`s-1`, mon, alevel)
+
+Total: 8 entries
+
+## Blocked — no prognostic aerosol (MACv2-SP only)
+
+- [ ] **loadbc** — Black Carbon Column Burden (`kg m-2`, day)
+- [ ] **loaddust** — Dust Column Burden (`kg m-2`, day)
+- [ ] **loadnh4** — NH4 Column Burden (`kg m-2`, day)
+- [ ] **loadno3** — NO3 Column Burden (`kg m-2`, day)
+- [ ] **loadoa** — Organic Aerosol Column Burden (`kg m-2`, day)
+- [ ] **loadpoa** — Primary Organic Aerosol Column Burden (`kg m-2`, day)
+- [ ] **loadso4** — SO4 Column Burden (`kg m-2`, day)
+- [ ] **loadsoa** — Secondary Organic Aerosol Column Burden (`kg m-2`, day)
+- [ ] **loadss** — Sea Salt Column Burden (`kg m-2`, day)
+
+Total: 9 entries
+
+## Blocked — no prognostic CO2
+
+- [ ] **co23D** — CO2 Mole Fraction 3D (`1e-6`, mon, alevel)
+- [ ] **co2mass** — Atmospheric CO2 Mass (`kg`, mon, scalar)
+- [ ] **fco2antt** — Anthropogenic CO2 Flux (`kg m-2 s-1`, mon)
+- [ ] **fco2fos** — Fossil CO2 Flux (`kg m-2 s-1`, mon)
+- [ ] **fco2nat** — Natural CO2 Flux (`kg m-2 s-1`, mon)
+
+Total: 5 entries
+
+## Blocked — effective radii (need detailed microphysics output)
+
+- [ ] **reffclic** — Effective Radius of Convective Cloud Ice (`m`, mon, alevel)
+- [ ] **reffclis** — Effective Radius of Stratiform Cloud Ice (`m`, mon, alevel)
+- [ ] **reffclwc** — Effective Radius of Convective Cloud Liquid (`m`, mon, alevel)
+- [ ] **reffclws** — Effective Radius of Stratiform Cloud Liquid (`m`, mon, alevel)
+
+Total: 4 entries
+
+## Blocked — need IFS source changes to expose diagnostics
+
+### Convective/stratiform separation (internal to convection scheme)
+
+- [ ] **ccb** — Convective Cloud Base Pressure (`Pa`, day/mon) — IFS has KCBOT internally
+- [ ] **cct** — Convective Cloud Top Pressure (`Pa`, day/mon) — IFS has KCTOP internally
+- [ ] **clc** — Convective Cloud Fraction (`1`, mon, alevel) — internal to convection
+- [ ] **cls** — Stratiform Cloud Fraction (`1`, mon, alevel) — would be `cl - clc`
+- [ ] **clic** — Convective Cloud Ice (`kg kg-1`, mon, alevel) — internal to convection
+- [ ] **clis** — Stratiform Cloud Ice (`kg kg-1`, mon, alevel) — would be `cli - clic`
+- [ ] **clwc** — Convective Cloud Liquid Water (`kg kg-1`, mon, alevel) — internal
+- [ ] **clws** — Stratiform Cloud Liquid Water (`kg kg-1`, mon, alevel) — would be `clw - clwc`
+- [ ] **clivic** — In-Convective-Cloud Ice Water Path (`kg m-2`, day) — not separated
+- [ ] **clwvic** — In-Convective-Cloud Liquid Water Path (`kg m-2`, day) — not separated
+
+### Convective mass fluxes (internal to convection scheme)
+
+- [ ] **mc** — Total Convective Mass Flux (`kg m-2 s-1`, mon, alevhalf)
+- [ ] **mcu** — Updraft Convective Mass Flux (`kg m-2 s-1`, mon, alevhalf)
+- [ ] **mcd** — Downdraft Convective Mass Flux (`kg m-2 s-1`, mon, alevhalf)
+- [ ] **dmc** — Deep Convective Detrainment (`kg m-2 s-1`, mon, alevhalf)
+- [ ] **smc** — Shallow Convective Mass Flux (`kg m-2 s-1`, mon, alevhalf)
+- [ ] **evu** — Updraft Entrainment (`s-1`, mon, alevel)
+- [ ] **edt** — Downdraft Entrainment (`s-1`, mon, alevel)
+
+### Radiation profiles on half-levels (ecRad computes, not exposed via XIOS)
+
+- [ ] **rld** — LW Downwelling Radiation Profile (`W m-2`, mon, alevhalf)
+- [ ] **rldcs** — LW Downwelling Clear-Sky Profile (`W m-2`, mon, alevhalf)
+- [ ] **rlu** — LW Upwelling Radiation Profile (`W m-2`, mon, alevhalf)
+- [ ] **rlucs** — LW Upwelling Clear-Sky Profile (`W m-2`, mon, alevhalf)
+- [ ] **rsd** — SW Downwelling Radiation Profile (`W m-2`, mon, alevhalf)
+- [ ] **rsdcs** — SW Downwelling Clear-Sky Profile (`W m-2`, mon, alevhalf)
+- [ ] **rsu** — SW Upwelling Radiation Profile (`W m-2`, mon, alevhalf)
+- [ ] **rsucs** — SW Upwelling Clear-Sky Profile (`W m-2`, mon, alevhalf)
+
+### Diffuse radiation (ecRad has sw_dn_diffuse_surf_g, not exposed)
+
+- [ ] **rsdsdiff** — Surface Diffuse Downwelling SW (`W m-2`, day)
+- [ ] **rsdsdiff** — Surface Diffuse Downwelling SW (`W m-2`, 1hr)
+- [ ] **rsdscsdiff** — Surface Diffuse Downwelling SW Clear-Sky (`W m-2`, day)
+
+### 100m wind (IFS does not interpolate to 100 m)
+
+- [ ] **ua** — Eastward Wind at 100m (`m s-1`, 1hrPt, height100m)
+- [ ] **va** — Northward Wind at 100m (`m s-1`, 1hrPt, height100m)
+- [ ] **wsg** — Maximum Wind Gust at 100m (`m s-1`, 1hr, height100m)
+
+### Cloud droplet/crystal number (no diagnostic available)
+
+- [ ] **cldnci** — In-Cloud Ice Crystal Number (`m-3`, day)
+- [ ] **cldnvi** — Column Ice Crystal Number (`m-2`, day)
+
+### Tropopause (IFS computes internally, not exposed via XIOS)
+
+- [ ] **ptp** — Tropopause Air Pressure (`Pa`, mon)
+- [ ] **ztp** — Tropopause Geopotential Height (`m`, mon)
+
+### Model-level geometry / other
+
+- [ ] **phalf** — Pressure at Model Half-Levels (`Pa`, mon, alevhalf) — needs alevhalf axis
+- [ ] **zfull** — Geopotential Height of Model Full-Levels (`m`, fx, alevel) — needs offline computation
+- [ ] **sci** — Fraction of Time Shallow Convection Occurs (`1`, mon) — unclear IFS mapping
+
+## Blocked — CSV artefact
+
+- [ ] **600** — malformed row (dims: 700) — not a real variable
+
+---
+
+## Summary
+
+| Category | Count |
+|----------|-------|
+| Already in core/veg/extra/lrcs | 79 |
+| Producible (new cap7 rules written) | 58 |
+| Blocked: COSP satellite simulators | 17 |
+| Blocked: temperature tendencies | 13 |
+| Blocked: humidity tendencies | 8 |
+| Blocked: aerosol loads | 9 |
+| Blocked: CO2 tracer | 5 |
+| Blocked: effective radii | 4 |
+| Blocked: IFS source (convective, radiation, diffuse, 100m, etc.) | ~40 |
+| **Total** | **233** |
diff --git a/awi-esm3-veg-hr-variables/cap7_ocean/cmip7_CAP7_variables_ocean.csv b/awi-esm3-veg-hr-variables/cap7_ocean/cmip7_CAP7_variables_ocean.csv
new file mode 100644
index 00000000..2101cc2e
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/cap7_ocean/cmip7_CAP7_variables_ocean.csv
@@ -0,0 +1,62 @@
+,name,frequency,modeling_realm,standard_name,units,cell_methods,cell_measures,long_name,comment,processing_note,dimensions,out_name,type,positive,spatial_shape,temporal_shape,cmip6_table,physical_parameter_name,variableRootDD,branding_label,branded_variable_name,region,cmip6_compound_name,cmip7_compound_name,uid,priority,flag_values,flag_meanings
+395,ocean.areacello.ti-u-hxy-u.fx.glb,fx,ocean,cell_area,m2,area: sum,,Grid-Cell Area for Ocean Variables,"Cell areas for any grid used to report ocean variables and variables which are requested as used on the model ocean grid (e.g. hfsso, which is a downward heat flux from the atmosphere interpolated onto the ocean grid). These cell areas should be defined to enable exact calculation of global integrals (e.g., of vertical fluxes of energy at the surface and top of the atmosphere).","For oceans with more than 1 mesh (e.g., staggered grids), report areas that apply to surface vertical fluxes of energy.",longitude latitude,areacello,real,,XY-na,None,Ofx,areacello,areacello,ti-u-hxy-u,areacello_ti-u-hxy-u,glb,Ofx.areacello,ocean.areacello.ti-u-hxy-u.fx.glb,baa3ee94-e5dd-11e5-8482-ac72891c3257,core,,
+396,ocean.basin.ti-u-hxy-u.fx.glb,fx,ocean,region,1,area: mean,area: areacello,Region Selection Index,A variable with the standard name of region contains strings which indicate geographical regions. These strings must be chosen from the standard region list.,A variable with the standard name of region contains either strings which indicate a geographical region or flags which can be translated to strings using flag_values and flag_meanings attributes. These strings are standardised. Values must be taken from the CF standard region list. Report on the same grid as the temperature field. CHANGE: Flag values and meanings are in dedicated fields 'Flag values' and 'Flag meanings'. ISSUE: may not be easily machine processed.,longitude latitude,basin,integer,,XY-na,None,Ofx,basin,basin,ti-u-hxy-u,basin_ti-u-hxy-u,glb,Ofx.basin,ocean.basin.ti-u-hxy-u.fx.glb,baa3f718-e5dd-11e5-8482-ac72891c3257,core,0 1 2 3 4 5 6 7 8 9 10,global_land southern_ocean atlantic_ocean pacific_ocean arctic_ocean indian_ocean mediterranean_sea black_sea hudson_bay baltic_sea red_sea
+397,ocean.bigthetao.tavg-ol-hxy-sea.mon.glb,mon,ocean,sea_water_conservative_temperature,degC,area: mean where sea time: mean,area: areacello volume: volcello,Sea Water Conservative Temperature,Diagnostic should be contributed only for models using conservative temperature as prognostic field.,,longitude latitude olevel time,bigthetao,real,,XY-O,time-intv,Omon,bigthetao,bigthetao,tavg-ol-hxy-sea,bigthetao_tavg-ol-hxy-sea,glb,Omon.bigthetao,ocean.bigthetao.tavg-ol-hxy-sea.mon.glb,baa5255c-e5dd-11e5-8482-ac72891c3257,core,,
+398,ocean.deptho.ti-u-hxy-sea.fx.glb,fx,ocean,sea_floor_depth_below_geoid,m,area: mean where sea,area: areacello,Sea Floor Depth Below Geoid,Ocean bathymetry. Reported here is the sea floor depth for present day relative to z=0 geoid. Reported as missing for land grid cells.,Save both native and spherical.,longitude latitude,deptho,real,,XY-na,None,Ofx,deptho,deptho,ti-u-hxy-sea,deptho_ti-u-hxy-sea,glb,Ofx.deptho,ocean.deptho.ti-u-hxy-sea.fx.glb,baa3e4d0-e5dd-11e5-8482-ac72891c3257,core,,
+399,ocean.ficeberg.tavg-ol-hxy-sea.mon.glb,mon,ocean,water_flux_into_sea_water_from_icebergs,kg m-2 s-1,area: mean where sea time: mean,area: areacello volume: volcello,Water Flux into Sea Water from Icebergs,computed as the iceberg melt water flux into the ocean divided by the area of the ocean portion of the grid cell.,Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,ficeberg,real,,XY-O,time-intv,Omon,ficeberg,ficeberg,tavg-ol-hxy-sea,ficeberg_tavg-ol-hxy-sea,glb,Omon.ficeberg,ocean.ficeberg.tavg-ol-hxy-sea.mon.glb,baa628c6-e5dd-11e5-8482-ac72891c3257,high,,
+400,ocean.friver.tavg-u-hxy-sea.mon.glb,mon,ocean,water_flux_into_sea_water_from_rivers,kg m-2 s-1,area: mean where sea time: mean,area: areacello,Water Flux into Sea Water from Rivers,computed as the river flux of water into the ocean divided by the area of the ocean portion of the grid cell.,,longitude latitude time,friver,real,,XY-na,time-intv,Omon,friver,friver,tavg-u-hxy-sea,friver_tavg-u-hxy-sea,glb,Omon.friver,ocean.friver.tavg-u-hxy-sea.mon.glb,baa6247a-e5dd-11e5-8482-ac72891c3257,high,,
+401,ocean.hfbasin.tavg-u-hyb-sea.mon.glb,mon,ocean,northward_ocean_heat_transport,W,depth: longitude: sum where sea (along a zig-zag grid path spanning a basin) where sea time: mean,,Northward Ocean Heat Transport,"Contains contributions from all physical processes affecting the northward heat transport, including resolved advection, parameterized advection, lateral diffusion, etc. Diagnosed here as a function of latitude and basin. Use Celsius for temperature scale.","For models which do not have a Cartesian lat-long grid, this transport can be approximated as the transport across zig-zag paths corresponding to latitudes with spacing between latitudes appropriate to the model's resolution, as is done for the ocean meridional overturning mass streamfunction. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:longitude: sum (comment: basin sum [along zig-zag grid path]) depth: sum time: mean CMIP7:depth: longitude: sum where sea (along a zig-zag grid path spanning a basin) where sea time: mean,",latitude basin time,hfbasin,real,,YB-na,time-intv,Omon,hfbasin,hfbasin,tavg-u-hyb-sea,hfbasin_tavg-u-hyb-sea,glb,Omon.hfbasin,ocean.hfbasin.tavg-u-hyb-sea.mon.glb,baa5c87c-e5dd-11e5-8482-ac72891c3257,high,,
+402,ocean.hfds.tavg-u-hxy-sea.mon.glb,mon,ocean,surface_downward_heat_flux_in_sea_water,W m-2,area: mean where sea time: mean,area: areacello,Downward Heat Flux at Sea Water Surface,"This is the net flux of heat entering the liquid water column through its upper surface (excluding any ""flux adjustment"") .",Report on native horizontal grid as well as remapped onto a latitude/longitude grid.,longitude latitude time,hfds,real,down,XY-na,time-intv,Omon,hfds,hfds,tavg-u-hxy-sea,hfds_tavg-u-hxy-sea,glb,Omon.hfds,ocean.hfds.tavg-u-hxy-sea.mon.glb,baa6c33a-e5dd-11e5-8482-ac72891c3257,core,,
+403,ocean.hfgeou.ti-u-hxy-sea.fx.glb,fx,ocean,upward_geothermal_heat_flux_at_sea_floor,W m-2,area: mean where sea,area: areacello,Upward Geothermal Heat Flux at Sea Floor,Upward geothermal heat flux per unit area on the sea floor,"Variable value should be reported as the upward flux at bottom of the deepest ocean layer
+If this field is time-dependent then save it instead as one of your Omon fields (see the Omon table)",longitude latitude,hfgeou,real,up,XY-na,None,Ofx,hfgeou,hfgeou,ti-u-hxy-sea,hfgeou_ti-u-hxy-sea,glb,Ofx.hfgeou,ocean.hfgeou.ti-u-hxy-sea.fx.glb,baa3fb50-e5dd-11e5-8482-ac72891c3257,core,,
+404,ocean.hfx.tavg-ol-hxy-sea.mon.glb,mon,ocean,ocean_heat_x_transport,W,area: mean where sea time: mean,area: areacello volume: volcello,3D Ocean Heat X Transport,Contains all contributions to 'x-ward' heat transport from resolved and parameterized processes. Use Celsius for temperature scale,"3d field. If only the 2d vertically integrated transport is available or is preferred, produce Omon.hfxint instead.
+Online mapping to depth/pressure vertical grid if depth or pressure are not native. Report on native horizontal grid.",longitude latitude olevel time,hfx,real,,XY-O,time-intv,Omon,hfx,hfx,tavg-ol-hxy-sea,hfx_tavg-ol-hxy-sea,glb,Omon.hfx,ocean.hfx.tavg-ol-hxy-sea.mon.glb,83bbfb51-7f07-11ef-9308-b1dd71e64bec,high,,
+405,ocean.hfx.tavg-u-hxy-sea.mon.glb,mon,ocean,ocean_heat_x_transport,W,area: mean where sea depth: sum where sea (over entire ocean column) time: mean,area: areacello,Vertically Integrated Ocean Heat X Transport,Ocean heat x transport vertically integrated over the whole ocean depth. Contains all contributions to 'x-ward' heat transport from resolved and parameterized processes. Use Celsius for temperature scale. Report on native horizontal grid.,"2d field for CMIP6. Report on native horizontal grid. CHANGE SINCE CMIP6: compound name, 'int' Disambiguation added to allow for both Omon.hfx (3d) and Omon.hfxint (2d). 2d vertically integrated field. If the full 3d transport is preferred, produce Omon.hfx instead.",longitude latitude time,hfx,real,,XY-int,time-intv,Omon,hfx,hfx,tavg-u-hxy-sea,hfx_tavg-u-hxy-sea,glb,Omon.hfxint,ocean.hfx.tavg-u-hxy-sea.mon.glb,baa5e2e4-e5dd-11e5-8482-ac72891c3257,high,,
+406,ocean.hfy.tavg-ol-hxy-sea.mon.glb,mon,ocean,ocean_heat_y_transport,W,area: mean where sea time: mean,area: areacello volume: volcello,3D Ocean Heat Y Transport,Contains all contributions to 'y-ward' heat transport from resolved and parameterized processes. Use Celsius for temperature scale.,"3d field. If only the 2d vertically integrated transport is available or is preferred, produce Omon.hfyint instead.
+Online mapping to depth/pressure vertical grid if depth or pressure are not native. Report on native horizontal grid.",longitude latitude olevel time,hfy,real,,XY-O,time-intv,Omon,hfy,hfy,tavg-ol-hxy-sea,hfy_tavg-ol-hxy-sea,glb,Omon.hfy,ocean.hfy.tavg-ol-hxy-sea.mon.glb,83bbfb50-7f07-11ef-9308-b1dd71e64bec,high,,
+407,ocean.hfy.tavg-u-hxy-sea.mon.glb,mon,ocean,ocean_heat_y_transport,W,area: mean where sea depth: sum where sea (over entire ocean column) time: mean,area: areacello,Vertically Integrated Ocean Heat Y Transport,Ocean heat y transport vertically integrated over the whole ocean depth. Contains all contributions to 'y-ward' heat transport from resolved and parameterized processes. Use Celsius for temperature scale. Report on native horizontal grid.,"2d field for CMIP6. Report on native horizontal grid. CHANGE SINCE CMIP6: compound name, 'int' Disambiguation added to allow for both Omon.hfy (3d) and Omon.hfyint (2d). 2d vertically integrated field. If the full 3d transport is preferred, produce Omon.hfy instead.",longitude latitude time,hfy,real,,XY-int,time-intv,Omon,hfy,hfy,tavg-u-hxy-sea,hfy_tavg-u-hxy-sea,glb,Omon.hfyint,ocean.hfy.tavg-u-hxy-sea.mon.glb,baa5e758-e5dd-11e5-8482-ac72891c3257,high,,
+408,ocean.masscello.tavg-ol-hxy-sea.mon.glb,mon,ocean,sea_water_mass_per_unit_area,kg m-2,area: mean where sea time: mean,area: areacello volume: volcello,Ocean Grid-Cell Mass per Area,"For Boussinesq models, report this diagnostic as Boussinesq reference density times grid celll volume.","Report on native horizontal grid as well as on a spherical latitude/longitude grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native. Do not use this field if masscello is fixed: use Ofx.masscello instead. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: sum where sea time: mean CMIP7:area: mean where sea time: mean,",longitude latitude olevel time,masscello,real,,XY-O,time-intv,Omon,masscello,masscello,tavg-ol-hxy-sea,masscello_tavg-ol-hxy-sea,glb,Omon.masscello,ocean.masscello.tavg-ol-hxy-sea.mon.glb,baa5147c-e5dd-11e5-8482-ac72891c3257,core,,
+409,ocean.masscello.ti-ol-hxy-sea.fx.glb,fx,ocean,sea_water_mass_per_unit_area,kg m-2,area: mean where sea,area: areacello volume: volcello,Ocean Grid-Cell Mass per Area,"Tracer grid-cell mass per unit area used for computing tracer budgets. For Boussinesq models with static ocean grid cell thickness, masscello = rhozero\*thickcello, where thickcello is static cell thickness and rhozero is constant Boussinesq reference density. More generally, masscello is time dependent and reported as part of Omon.","3-d field: report on grid that applies to temperature. Use this variable if masscello is fixed, e.g. for Boussinesq models with static ocean grid cell thickness.
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: sum CMIP7:area: mean where sea,",longitude latitude olevel,masscello,real,,XY-O,None,Ofx,masscello,masscello,ti-ol-hxy-sea,masscello_ti-ol-hxy-sea,glb,Ofx.masscello,ocean.masscello.ti-ol-hxy-sea.fx.glb,baa3ea2a-e5dd-11e5-8482-ac72891c3257,core,,
+410,ocean.mlotst.tavg-u-hxy-sea.mon.glb,mon,ocean,ocean_mixed_layer_thickness_defined_by_sigma_t,m,area: mean where sea time: mean,area: areacello,Ocean Mixed Layer Thickness Defined by Delta Sigma T of 0.03 kg m-3 referenced to the model level closest to 10 m depth,Sigma T is potential density referenced to ocean surface. Defined by Sigma T of 0.03 kg m-3 wrt to model level closest to 10 m depth.,"dsigmat coordinate added to clarify definition. Report on native horizontal grid as well as on a spherical latitude/longitude grid. CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude time CMIP7:longitude latitude time deltasigt,",longitude latitude time deltasigt,mlotst,real,,XY-na,time-intv,Omon,mlotst,mlotst,tavg-u-hxy-sea,mlotst_tavg-u-hxy-sea,glb,Omon.mlotst,ocean.mlotst.tavg-u-hxy-sea.mon.glb,baa57688-e5dd-11e5-8482-ac72891c3257,core,,
+411,ocean.msftm.tavg-ol-hyb-sea.mon.glb,mon,ocean,ocean_meridional_overturning_mass_streamfunction,kg s-1,depth: longitude: sum where sea (along a zig-zag grid path spanning a basin) time: mean,,Ocean Meridional Overturning Mass Streamfunction,"Overturning mass streamfunction arising from all advective mass transport processes, resolved and parameterized.","Function of latitude, Z, basin. For a model with a cartesian latxlon grid, this is the same as the ""Ocean Y Overturning Mass Streamfunction"" (msftyz), which should in this case be omitted. For other models, this transport should be approximated as the transport across zig-zag paths corresponding to latitudes with spacing between latitudes appropriate to the model's resolution. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:longitude: sum (comment: basin sum [along zig-zag grid path]) depth: sum time: mean CMIP7:depth: longitude: sum where sea (along a zig-zag grid path spanning a basin) time: mean,",latitude olevel basin time,msftm,real,,YB-O,time-intv,Omon,msftmz,msftm,tavg-ol-hyb-sea,msftm_tavg-ol-hyb-sea,glb,Omon.msftmz,ocean.msftm.tavg-ol-hyb-sea.mon.glb,baa59d48-e5dd-11e5-8482-ac72891c3257,high,,
+412,ocean.msfty.tavg-ol-ht-sea.mon.glb,mon,ocean,ocean_y_overturning_mass_streamfunction,kg s-1,grid_longitude: sum where sea time: mean,,Ocean Y Overturning Mass Streamfunction,"Overturning mass streamfunction arising from all advective mass transport processes, resolved and parameterized.","Function of Y, rho, basin. For a model with a cartesian latxlon grid, this is the same as the ""Ocean Meridional Overturning Mass Streamfunction"" (msftmrho) and so the y-overturning variable should in this case be omitted. For a model where these are distinct, this variable should contain a grid-oriented quasi-meridional overturning, in contrast with msftmrho, which is the actual \*meridional\* overturning (with north-south flow about an east-west axis).
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean grid_longitude: mean CMIP7:grid_longitude: sum where sea time: mean,",gridlatitude olevel basin time,msfty,real,,GYB-O,time-intv,Omon,msftyz,msfty,tavg-ol-ht-sea,msfty_tavg-ol-ht-sea,glb,Omon.msftyz,ocean.msfty.tavg-ol-ht-sea.mon.glb,baa5a662-e5dd-11e5-8482-ac72891c3257,high,,
+413,ocean.sf6.tavg-ol-hxy-sea.mon.glb,mon,ocean,mole_concentration_of_sulfur_hexafluoride_in_sea_water,mol m-3,area: mean where sea time: mean,area: areacello volume: volcello,Mole Concentration of SF6 in Sea Water,"Mole concentration means number of moles per unit volume, also called ""molarity"", and is used in the construction ""mole_concentration_of_X_in_Y"", where X is a material constituent of Y. A chemical or biological species denoted by X may be described by a single term such as ""nitrogen"" or a phrase such as ""nox_expressed_as_nitrogen"". The chemical formula of sulfur hexafluoride is SF6.",Report on native horizontal grid as well as on a spherical latitude/longitude grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,sf6,real,,XY-O,time-intv,Omon,sf6,sf6,tavg-ol-hxy-sea,sf6_tavg-ol-hxy-sea,glb,Omon.sf6,ocean.sf6.tavg-ol-hxy-sea.mon.glb,ba9b2d36-e5dd-11e5-8482-ac72891c3257,medium,,
+414,ocean.sftof.ti-u-hxy-u.fx.glb,fx,ocean,sea_area_fraction,%,area: mean,area: areacello,Sea Area Percentage,This is the area fraction at the ocean surface.,"Should this be recorded as a function of depth? Report on the same grid that ocean fields are reported (i.e., the ocean native grid, or the grid that ocean data has been provided to CMIP. For completeness, provide this even if the ocean grid is the same as the atmospheric grid.",longitude latitude,sftof,real,,XY-na,None,Ofx,sftof,sftof,ti-u-hxy-u,sftof_ti-u-hxy-u,glb,Ofx.sftof,ocean.sftof.ti-u-hxy-u.fx.glb,baa3f2e0-e5dd-11e5-8482-ac72891c3257,core,,
+415,ocean.so.tavg-ol-hxy-sea.mon.glb,mon,ocean,sea_water_salinity,1E-03,area: mean where sea time: mean,area: areacello volume: volcello,Sea Water Salinity,"Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and the units attribute should normally be given as 1e-3 or 0.001 i.e. parts per thousand.","Report on native horizontal grid as well as on a spherical latitude/longitude grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.
+CHANGE SINCE CMIP6 in Units (from Physical Parameter) - CMIP6:0.001 CMIP7:1E-03,",longitude latitude olevel time,so,real,,XY-O,time-intv,Omon,so,so,tavg-ol-hxy-sea,so_tavg-ol-hxy-sea,glb,Omon.so,ocean.so.tavg-ol-hxy-sea.mon.glb,baa5491a-e5dd-11e5-8482-ac72891c3257,core,,
+416,ocean.sos.tavg-u-hxy-sea.day.glb,day,ocean,sea_surface_salinity,1E-03,area: mean where sea time: mean,area: areacello,Sea Surface Salinity,"Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and the units attribute should normally be given as 1e-3 or 0.001 i.e. parts per thousand.","Report on the ocean horizontal native grid. CHANGE SINCE CMIP6 in Units (from Physical Parameter) - CMIP6:0.001 CMIP7:1E-03,
+Evaluated at the upper boundary of the liquid ocean, including at the lower boundary of sea-ice and floating ice shelves.",longitude latitude time,sos,real,,XY-na,time-intv,Oday,sos,sos,tavg-u-hxy-sea,sos_tavg-u-hxy-sea,glb,Oday.sos,ocean.sos.tavg-u-hxy-sea.day.glb,baa72514-e5dd-11e5-8482-ac72891c3257,core,,
+417,ocean.sos.tavg-u-hxy-sea.mon.glb,mon,ocean,sea_surface_salinity,1E-03,area: mean where sea time: mean,area: areacello,Sea Surface Salinity,"Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and the units attribute should normally be given as 1e-3 or 0.001 i.e. parts per thousand.","Report on native horizontal grid as well as on a spherical latitude/longitude grid. CHANGE SINCE CMIP6 in Units (from Physical Parameter) - CMIP6:0.001 CMIP7:1E-03,
+Evaluated at the upper boundary of the liquid ocean, including at the lower boundary of sea-ice and floating ice shelves.",longitude latitude time,sos,real,,XY-na,time-intv,Omon,sos,sos,tavg-u-hxy-sea,sos_tavg-u-hxy-sea,glb,Omon.sos,ocean.sos.tavg-u-hxy-sea.mon.glb,baa557f2-e5dd-11e5-8482-ac72891c3257,core,,
+418,ocean.tauuo.tavg-u-hxy-sea.3hr.glb,3hr,ocean,downward_x_stress_at_sea_water_surface,N m-2,area: mean where sea time: mean,area: areacello,Sea Water Surface Downward X Stress,"The stress on the liquid ocean from interactions with overlying atmosphere, sea ice, ice shelf, etc.",Report on native horizontal grid.,longitude latitude time,tauuo,real,down,XY-na,time-intv,3hr,tauuo,tauuo,tavg-u-hxy-sea,tauuo_tavg-u-hxy-sea,glb,3hr.tauuo,ocean.tauuo.tavg-u-hxy-sea.3hr.glb,83bbfc62-7f07-11ef-9308-b1dd71e64bec,high,,
+419,ocean.tauuo.tavg-u-hxy-sea.mon.glb,mon,ocean,downward_x_stress_at_sea_water_surface,N m-2,area: mean where sea time: mean,area: areacello,Sea Water Surface Downward X Stress,"This is the stress on the liquid ocean from overlying atmosphere, sea ice, ice shelf, etc.","Report on native horizontal grid. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: mean where sea time: mean,
+CHANGE SINCE CMIP6 in Cell Measures - CMIP6:::OPT CMIP7:area: areacello,",longitude latitude time,tauuo,real,down,XY-na,time-intv,Omon,tauuo,tauuo,tavg-u-hxy-sea,tauuo_tavg-u-hxy-sea,glb,Omon.tauuo,ocean.tauuo.tavg-u-hxy-sea.mon.glb,baa6cf38-e5dd-11e5-8482-ac72891c3257,core,,
+420,ocean.tauvo.tavg-u-hxy-sea.3hr.glb,3hr,ocean,downward_y_stress_at_sea_water_surface,N m-2,area: mean where sea time: mean,area: areacello,Sea Water Surface Downward Y Stress,"The stress on the liquid ocean from interactions with overlying atmosphere, sea ice, ice shelf, etc.",Report on native horizontal grid.,longitude latitude time,tauvo,real,down,XY-na,time-intv,3hr,tauvo,tauvo,tavg-u-hxy-sea,tauvo_tavg-u-hxy-sea,glb,3hr.tauvo,ocean.tauvo.tavg-u-hxy-sea.3hr.glb,83bbfc61-7f07-11ef-9308-b1dd71e64bec,high,,
+421,ocean.tauvo.tavg-u-hxy-sea.mon.glb,mon,ocean,downward_y_stress_at_sea_water_surface,N m-2,area: mean where sea time: mean,area: areacello,Sea Water Surface Downward Y Stress,"This is the stress on the liquid ocean from overlying atmosphere, sea ice, ice shelf, etc.","Report on native horizontal grid. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: mean where sea time: mean,
+CHANGE SINCE CMIP6 in Cell Measures - CMIP6:::OPT CMIP7:area: areacello,",longitude latitude time,tauvo,real,down,XY-na,time-intv,Omon,tauvo,tauvo,tavg-u-hxy-sea,tauvo_tavg-u-hxy-sea,glb,Omon.tauvo,ocean.tauvo.tavg-u-hxy-sea.mon.glb,baa6d366-e5dd-11e5-8482-ac72891c3257,core,,
+422,ocean.thetao.tavg-ol-hxy-sea.mon.glb,mon,ocean,sea_water_potential_temperature,degC,area: mean where sea time: mean,area: areacello volume: volcello,Sea Water Potential Temperature,Diagnostic should be contributed even for models using conservative temperature as prognostic field.,Report on native horizontal grid as well as on a spherical latitude/longitude grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,thetao,real,,XY-O,time-intv,Omon,thetao,thetao,tavg-ol-hxy-sea,thetao_tavg-ol-hxy-sea,glb,Omon.thetao,ocean.thetao.tavg-ol-hxy-sea.mon.glb,baa51d00-e5dd-11e5-8482-ac72891c3257,core,,
+423,ocean.thkcello.tavg-ol-hxy-sea.mon.glb,mon,ocean,cell_thickness,m,area: mean where sea time: mean,area: areacello volume: volcello,Ocean Model Cell Thickness,"The time varying thickness of ocean cells. ""Thickness"" means the vertical extent of a layer. ""Cell"" refers to a model grid-cell.",Report on native horizontal grid as well as on a spherical latitude/longitude grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,thkcello,real,,XY-O,time-intv,Omon,thkcello,thkcello,tavg-ol-hxy-sea,thkcello_tavg-ol-hxy-sea,glb,Omon.thkcello,ocean.thkcello.tavg-ol-hxy-sea.mon.glb,baa518c8-e5dd-11e5-8482-ac72891c3257,core,,
+424,ocean.thkcello.ti-ol-hxy-sea.fx.glb,fx,ocean,cell_thickness,m,area: mean where sea,area: areacello volume: volcello,Ocean Model Cell Thickness,"Thickness of ocean cells. ""Thickness"" means the vertical extent of a layer. ""Cell"" refers to a model grid-cell.","If this field is time-dependent then save it instead as one of your Omon fields (see the Omon table) CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean CMIP7:area: mean where sea,",longitude latitude olevel,thkcello,real,,XY-O,None,Ofx,thkcello,thkcello,ti-ol-hxy-sea,thkcello_ti-ol-hxy-sea,glb,Ofx.thkcello,ocean.thkcello.ti-ol-hxy-sea.fx.glb,bab9bd00-e5dd-11e5-8482-ac72891c3257,core,,
+425,ocean.tos.tavg-u-hxy-sea.day.glb,day,ocean,sea_surface_temperature,degC,area: mean where sea time: mean,area: areacello,Sea Surface Temperature,"This may differ from ""surface temperature"" in regions of sea ice or floating ice shelves. For models using conservative temperature as the prognostic field, they should report the top ocean layer as surface potential temperature, which is the same as surface in situ temperature.","Report on the ocean horizontal native grid.
+Evaluated at the upper boundary of the liquid ocean, including at the lower boundary of sea-ice and floating ice shelves.",longitude latitude time,tos,real,,XY-na,time-intv,Oday,tos,tos,tavg-u-hxy-sea,tos_tavg-u-hxy-sea,glb,Oday.tos,ocean.tos.tavg-u-hxy-sea.day.glb,baa720e6-e5dd-11e5-8482-ac72891c3257,core,,
+426,ocean.tos.tavg-u-hxy-sea.mon.glb,mon,ocean,sea_surface_temperature,degC,area: mean where sea time: mean,area: areacello,Sea Surface Temperature,"This may differ from ""surface temperature"" in regions of sea ice or floating ice shelves. For models using conservative temperature as the prognostic field, they should report the top ocean layer as surface potential temperature, which is the same as surface in situ temperature.","Note change from CMIP5 K to CMIP6 C. Report on native horizontal grid as well as on a spherical latitude/longitude grid.
+Evaluated at the upper boundary of the liquid ocean, including at the lower boundary of sea-ice and floating ice shelves.",longitude latitude time,tos,real,,XY-na,time-intv,Omon,tos,tos,tavg-u-hxy-sea,tos_tavg-u-hxy-sea,glb,Omon.tos,ocean.tos.tavg-u-hxy-sea.mon.glb,baa52de0-e5dd-11e5-8482-ac72891c3257,core,,
+427,ocean.tossq.tavg-u-hxy-sea.day.glb,day,ocean,square_of_sea_surface_temperature,degC2,area: mean where sea time: mean,area: areacello,Square of Sea Surface Temperature,"Square of temperature of liquid ocean, averaged over the day.","Report on the ocean horizontal native grid.
+Evaluated at the upper boundary of the liquid ocean, including at the lower boundary of sea-ice and floating ice shelves.",longitude latitude time,tossq,real,,XY-na,time-intv,Oday,tossq,tossq,tavg-u-hxy-sea,tossq_tavg-u-hxy-sea,glb,Oday.tossq,ocean.tossq.tavg-u-hxy-sea.day.glb,baa71c7c-e5dd-11e5-8482-ac72891c3257,high,,
+428,ocean.umo.tavg-ol-hxy-sea.mon.glb,mon,ocean,ocean_mass_x_transport,kg s-1,area: mean where sea time: mean,area: areacello volume: volcello,Ocean Mass X Transport,X-ward mass transport from residual mean (resolved plus parameterized) advective transport.,"Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: mean where sea time: mean, CHANGE SINCE CMIP6 in Cell Measures - CMIP6:::OPT CMIP7:area: areacello volume: volcello,",longitude latitude olevel time,umo,real,,XY-O,time-intv,Omon,umo,umo,tavg-ol-hxy-sea,umo_tavg-ol-hxy-sea,glb,Omon.umo,ocean.umo.tavg-ol-hxy-sea.mon.glb,baa5942e-e5dd-11e5-8482-ac72891c3257,core,,
+429,ocean.uo.tavg-ol-hxy-sea.mon.glb,mon,ocean,sea_water_x_velocity,m s-1,area: mean where sea time: mean,area: areacello volume: volcello,Sea Water X Velocity,Prognostic x-ward velocity component resolved by the model.,"Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: mean where sea time: mean, CHANGE SINCE CMIP6 in Cell Measures - CMIP6:::OPT CMIP7:area: areacello volume: volcello,",longitude latitude olevel time,uo,real,,XY-O,time-intv,Omon,uo,uo,tavg-ol-hxy-sea,uo_tavg-ol-hxy-sea,glb,Omon.uo,ocean.uo.tavg-ol-hxy-sea.mon.glb,baa586e6-e5dd-11e5-8482-ac72891c3257,core,,
+430,ocean.vmo.tavg-ol-hxy-sea.mon.glb,mon,ocean,ocean_mass_y_transport,kg s-1,area: mean where sea time: mean,area: areacello volume: volcello,Ocean Mass Y Transport,Y-ward mass transport from residual mean (resolved plus parameterized) advective transport.,"Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: mean where sea time: mean, CHANGE SINCE CMIP6 in Cell Measures - CMIP6:::OPT CMIP7:area: areacello volume: volcello,",longitude latitude olevel time,vmo,real,,XY-O,time-intv,Omon,vmo,vmo,tavg-ol-hxy-sea,vmo_tavg-ol-hxy-sea,glb,Omon.vmo,ocean.vmo.tavg-ol-hxy-sea.mon.glb,baa598c0-e5dd-11e5-8482-ac72891c3257,core,,
+431,ocean.vo.tavg-ol-hxy-sea.mon.glb,mon,ocean,sea_water_y_velocity,m s-1,area: mean where sea time: mean,area: areacello volume: volcello,Sea Water Y Velocity,Prognostic y-ward velocity component resolved by the model.,"Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: mean where sea time: mean, CHANGE SINCE CMIP6 in Cell Measures - CMIP6:::OPT CMIP7:area: areacello volume: volcello,",longitude latitude olevel time,vo,real,,XY-O,time-intv,Omon,vo,vo,tavg-ol-hxy-sea,vo_tavg-ol-hxy-sea,glb,Omon.vo,ocean.vo.tavg-ol-hxy-sea.mon.glb,baa58b1e-e5dd-11e5-8482-ac72891c3257,core,,
+432,ocean.volcello.tavg-ol-hxy-sea.mon.glb,mon,ocean,ocean_volume,m3,area: sum where sea time: mean,area: areacello,Ocean Grid-Cell Volume,"For oceans with more than 1 mesh (e.g. staggered grids), report areas that apply to surface vertical fluxes of energy. If this field is time-dependent then save it instead as one of your Omon and Odec fields","a 3-d field: For oceans with more than 1 mesh, report on grid that applies to temperature
+CHANGE SINCE CMIP6 in Cell Measures - CMIP6:area: areacello volume: volcello CMIP7:area: areacello,",longitude latitude olevel time,volcello,real,,XY-O,time-intv,Omon,volcello,volcello,tavg-ol-hxy-sea,volcello_tavg-ol-hxy-sea,glb,Omon.volcello,ocean.volcello.tavg-ol-hxy-sea.mon.glb,e0739eaa-e1ab-11e7-9db4-1c4d70487308,high,,
+433,ocean.wmo.tavg-ol-hxy-sea.mon.glb,mon,ocean,upward_ocean_mass_transport,kg s-1,area: sum where sea time: mean,area: areacello volume: volcello,Upward Ocean Mass Transport,Upward mass transport from residual mean (resolved plus parameterized) advective transport.,Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native. Those who wish to record vertical velocities and vertical fluxes on ocean half-levels may do so. If using CMOR3 you will be required to specify artificial bounds (e.g. located at full model levels) to avoid an error exit.,longitude latitude olevel time,wmo,real,,XY-O,time-intv,Omon,wmo,wmo,tavg-ol-hxy-sea,wmo_tavg-ol-hxy-sea,glb,Omon.wmo,ocean.wmo.tavg-ol-hxy-sea.mon.glb,baa58f74-e5dd-11e5-8482-ac72891c3257,core,,
+434,ocean.wo.tavg-ol-hxy-sea.mon.glb,mon,ocean,upward_sea_water_velocity,m s-1,area: mean where sea time: mean,area: areacello volume: volcello,Sea Water Vertical Velocity,Prognostic z-ward velocity component resolved by the model.,"Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native. Those who wish to record vertical velocities and vertical fluxes on ocean half-levels may do so. If using CMOR3 you will be required to specify artificial bounds (e.g. located at full model levels) to avoid an error exit. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: mean where sea time: mean, CHANGE SINCE CMIP6 in Cell Measures - CMIP6:::OPT CMIP7:area: areacello volume: volcello,",longitude latitude olevel time,wo,real,,XY-O,time-intv,Omon,wo,wo,tavg-ol-hxy-sea,wo_tavg-ol-hxy-sea,glb,Omon.wo,ocean.wo.tavg-ol-hxy-sea.mon.glb,1aab80fc-b006-11e6-9289-ac72891c3257,core,,
+435,ocean.zos.tavg-u-hxy-sea.day.glb,day,ocean,sea_surface_height_above_geoid,m,area: mean where sea time: mean,area: areacello,Sea Surface Height Above Geoid,"This is the effective dynamic sea level, so should have zero global area mean. zos is the effective sea level as if sea ice (and snow) at a grid cell were converted to liquid seawater (Campin et al., 2008). For OMIP, do _not _record inverse barometer responses from sea-ice (and snow) loading in zos. See (Griffies et al, 2016, https://doi.org/10.5194/gmd-9-3231-2016).","Evaluated at the upper boundary of the liquid ocean, including at the lower boundary of sea-ice and floating ice shelves.
+The effective dynamic sea level as if sea ice (and snow) at a grid cell were converted to liquid seawater. The liquid-water equivalent sea surface which the liquid would have if the ice were replaced by an equal mass of sea water of the density of the surface water in its vicinity. Inverse barometer responses from sea-ice (and snow) loading are removed using equation H3 of Griffies et al, 2016 (). zos is a dynamic sea level should have zero global area mean.
+Ocean dynamic sea level is defined by Gregory et al. (2019: [doi.org/10.1007/s10712-019-09525-z](https://airtable.com/appqRFkdpwAitEZNY/tblxLKbWgySWunrpw/doi.org/10.1007/s10712-019-09525-z) )",longitude latitude time,zos,real,,XY-na,time-intv,Oday,zos,zos,tavg-u-hxy-sea,zos_tavg-u-hxy-sea,glb,Oday.zos,ocean.zos.tavg-u-hxy-sea.day.glb,83bbfb69-7f07-11ef-9308-b1dd71e64bec,core,,
+436,ocean.zos.tavg-u-hxy-sea.mon.glb,mon,ocean,sea_surface_height_above_geoid,m,area: mean where sea time: mean,area: areacello,Sea Surface Height Above Geoid,"This is the effective dynamic sea level, so should have zero global area mean. It should not include inverse barometer depressions from sea ice.","See OMDP document for details. Report on native horizontal grid as well as on a spherical latitude/longitude grid.
+The effective dynamic sea level as if sea ice (and snow) at a grid cell were converted to liquid seawater. The liquid-water equivalent sea surface which the liquid would have if the ice were replaced by an equal mass of sea water of the density of the surface water in its vicinity. Inverse barometer responses from sea-ice (and snow) loading are removed using equation H3 of Griffies et al, 2016 (). zos is a dynamic sea level should have zero global area mean.
+Ocean dynamic sea level is defined by Gregory et al. (2019: [doi.org/10.1007/s10712-019-09525-z](https://airtable.com/appqRFkdpwAitEZNY/tblxLKbWgySWunrpw/doi.org/10.1007/s10712-019-09525-z) )",longitude latitude time,zos,real,,XY-na,time-intv,Omon,zos,zos,tavg-u-hxy-sea,zos_tavg-u-hxy-sea,glb,Omon.zos,ocean.zos.tavg-u-hxy-sea.mon.glb,baa507f2-e5dd-11e5-8482-ac72891c3257,core,,
+437,ocean.zostoga.tavg-u-hm-sea.mon.glb,mon,ocean,global_average_thermosteric_sea_level_change,m,area: mean where sea time: mean,,Global Average Thermosteric Sea Level Change,There is no CMIP6 request for zosga nor zossga.,,time,zostoga,real,,na-na,time-intv,Omon,zostoga,zostoga,tavg-u-hm-sea,zostoga_tavg-u-hm-sea,glb,Omon.zostoga,ocean.zostoga.tavg-u-hm-sea.mon.glb,baa51058-e5dd-11e5-8482-ac72891c3257,core,,
\ No newline at end of file
diff --git a/awi-esm3-veg-hr-variables/cap7_ocean/cmip7_awiesm3-veg-hr_cap7_ocean.yaml b/awi-esm3-veg-hr-variables/cap7_ocean/cmip7_awiesm3-veg-hr_cap7_ocean.yaml
new file mode 100644
index 00000000..d9bc5cfd
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/cap7_ocean/cmip7_awiesm3-veg-hr_cap7_ocean.yaml
@@ -0,0 +1,139 @@
+# CMIP7 CAP7 Ocean Variables — AWI-ESM3-VEG-HR
+# Generated from cmip7_CAP7_variables_ocean.csv
+#
+# 3 new rules — 26 of 43 variables are already in core/lrcs,
+# 14 blocked (no physics, basin masks, or further namelist changes needed).
+# See cmip7_cap7_ocean_todo.md for full variable tracking.
+
+general:
+ name: "awiesm3-cmip7-cap7-ocean"
+ cmor_version: "CMIP7"
+ mip: "CMIP"
+ CMIP7_DReq_metadata: "/home/a/a270092/.cache/pycmor/cmip7_metadata/v1.2.2.2/metadata.json"
+
+pycmor:
+ warn_on_no_rule: False
+ dask_cluster: "slurm"
+ dask_cluster_scaling_mode: "fixed"
+ dask_cluster_scaling_fixed_jobs: 1
+
+jobqueue:
+ slurm:
+ name: pycmor-worker
+ queue: compute
+ account: bb1469
+ cores: 16
+ memory: 256GB
+ walltime: '00:30:00'
+
+pipelines:
+ # Square a field (reuse pattern from lrcs_ocean square_pipeline)
+ - name: square_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_square
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Scale by constant (m/s → kg m-2 s-1 via ×1000)
+ - name: scale_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:scale_by_constant
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Time-varying volcello: hnode (layer thickness) × cell_area
+ - name: volcello_time_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_volcello_time
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+inherit:
+ data_path: &dp /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/fesom
+ source_id: AWI-ESM-3
+ institution_id: AWI
+ experiment_id: picontrol
+ variant_label: r1i1p1f1
+ grid_label: gn
+ mesh_path: &mp /work/ab0246/a270092/input/fesom2/dars2
+ grid_file: /work/ab0246/a270092/input/fesom2/dars2/mesh.nc
+ grid: "FESOM 2.6 unstructured grid DARS (3146761 surface nodes)"
+ nominal_resolution: "10 km"
+ institution: "Alfred Wegener Institute, Helmholtz Centre for Polar and Marine Research, Bremerhaven, Germany"
+ output_directory: ./cmorized_output/awiesm3
+
+rules:
+ # ============================================================
+ # Part 1: Daily tossq — square of sea surface temperature
+ # ============================================================
+ # Input: daily SST from FESOM (sst.fesom.*.nc, daily output)
+ # Pipeline: square daily SST, timeavg is no-op at daily frequency
+
+ - name: tossq_day
+ inputs:
+ - path: *dp
+ pattern: sst.fesom.1350.nc
+ compound_name: ocean.tossq.tavg-u-hxy-sea.day.GLB
+ model_variable: sst
+ squared_units: "degC2"
+ pipelines:
+ - square_pipeline
+
+ # ============================================================
+ # Part 2: Monthly volcello — time-varying ocean cell volume
+ # ============================================================
+ # Input: hnode (layer thickness) from FESOM, monthly averaged
+ # Pipeline: compute volcello from hnode × cell_area
+
+ - name: volcello_mon
+ inputs:
+ - path: *dp
+ pattern: hnode.fesom.1350.nc
+ compound_name: ocean.volcello.tavg-ol-hxy-sea.mon.GLB
+ model_variable: hnode
+ pipelines:
+ - volcello_time_pipeline
+
+ # ============================================================
+ # Part 3: Monthly friver — river water flux
+ # ============================================================
+ # Input: runoff from FESOM (newly enabled in namelist.io)
+ # Units: m/s → kg m-2 s-1 (× 1000)
+
+ - name: friver
+ inputs:
+ - path: *dp
+ pattern: runoff.fesom.1350.nc
+ compound_name: ocean.friver.tavg-u-hxy-sea.mon.GLB
+ model_variable: runoff
+ scale_factor: 1000.0
+ pipelines:
+ - scale_pipeline
diff --git a/awi-esm3-veg-hr-variables/cap7_ocean/cmip7_cap7_ocean_todo.md b/awi-esm3-veg-hr-variables/cap7_ocean/cmip7_cap7_ocean_todo.md
new file mode 100644
index 00000000..5858085b
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/cap7_ocean/cmip7_cap7_ocean_todo.md
@@ -0,0 +1,91 @@
+# CAP7 Ocean — Implementation Status
+
+Source: `cmip7_CAP7_variables_ocean.csv` (43 variable-frequency entries, unfiltered)
+
+## Summary
+
+| Status | Count |
+|--------|-------|
+| Already in core/lrcs | 26 |
+| Implemented (new cap7 rules) | 3 |
+| Blocked — no physics | 5 |
+| Blocked — basin masks | 3 |
+| Blocked — namelist change needed | 6 |
+| **Total** | **43** |
+
+---
+
+## Already implemented in core/lrcs (26)
+
+These variables already have matching compound names in core_ocean or lrcs_ocean.
+No new rules needed.
+
+- [x] **areacello** (fx) — `ocean.areacello.ti-u-hxy-u.fx.glb` — core
+- [x] **deptho** (fx) — `ocean.deptho.ti-u-hxy-sea.fx.glb` — core
+- [x] **hfds** (mon, 2D) — `ocean.hfds.tavg-u-hxy-sea.mon.glb` — core
+- [x] **masscello** (fx, 3D) — `ocean.masscello.ti-ol-hxy-sea.fx.glb` — core
+- [x] **masscello** (mon, 3D) — `ocean.masscello.tavg-ol-hxy-sea.mon.glb` — core
+- [x] **mlotst** (mon, 2D) — `ocean.mlotst.tavg-u-hxy-sea.mon.glb` — core
+- [x] **sftof** (fx) — `ocean.sftof.ti-u-hxy-u.fx.glb` — core
+- [x] **so** (mon, 3D) — `ocean.so.tavg-ol-hxy-sea.mon.glb` — core
+- [x] **sos** (day, 2D) — `ocean.sos.tavg-u-hxy-sea.day.glb` — core
+- [x] **sos** (mon, 2D) — `ocean.sos.tavg-u-hxy-sea.mon.glb` — core
+- [x] **tauuo** (mon, 2D) — `ocean.tauuo.tavg-u-hxy-sea.mon.glb` — core
+- [x] **tauvo** (mon, 2D) — `ocean.tauvo.tavg-u-hxy-sea.mon.glb` — core
+- [x] **thetao** (mon, 3D) — `ocean.thetao.tavg-ol-hxy-sea.mon.glb` — core
+- [x] **thkcello** (fx, 3D) — `ocean.thkcello.ti-ol-hxy-sea.fx.glb` — core
+- [x] **thkcello** (mon, 3D) — `ocean.thkcello.tavg-ol-hxy-sea.mon.glb` — core
+- [x] **tos** (day, 2D) — `ocean.tos.tavg-u-hxy-sea.day.glb` — core
+- [x] **tos** (mon, 2D) — `ocean.tos.tavg-u-hxy-sea.mon.glb` — core
+- [x] **uo** (mon, 3D) — `ocean.uo.tavg-ol-hxy-sea.mon.glb` — core
+- [x] **umo** (mon, 3D) — `ocean.umo.tavg-ol-hxy-sea.mon.glb` — core
+- [x] **vo** (mon, 3D) — `ocean.vo.tavg-ol-hxy-sea.mon.glb` — core
+- [x] **vmo** (mon, 3D) — `ocean.vmo.tavg-ol-hxy-sea.mon.glb` — core
+- [x] **wo** (mon, 3D) — `ocean.wo.tavg-ol-hxy-sea.mon.glb` — core
+- [x] **wmo** (mon, 3D) — `ocean.wmo.tavg-ol-hxy-sea.mon.glb` — core
+- [x] **zos** (day, 2D) — `ocean.zos.tavg-u-hxy-sea.day.glb` — core
+- [x] **zos** (mon, 2D) — `ocean.zos.tavg-u-hxy-sea.mon.glb` — core
+- [x] **zostoga** (mon, scalar) — `ocean.zostoga.tavg-u-hm-sea.mon.glb` — core
+
+---
+
+## Implemented — new cap7 rules (3)
+
+- [x] **tossq** (day, 2D) — `ocean.tossq.tavg-u-hxy-sea.day.glb` — Square of SST. Daily SST from FESOM (`sst`, daily output), squared via `compute_square`. Same approach as monthly tossq in lrcs_ocean but at daily frequency.
+- [x] **volcello** (mon, 3D) — `ocean.volcello.tavg-ol-hxy-sea.mon.glb` — Monthly ocean cell volume from `hnode` (layer thickness) x cell area. Same approach as `volcello_dec` in lrcs_ocean but averaged to monthly.
+- [x] **friver** (mon, 2D) — `ocean.friver.tavg-u-hxy-sea.mon.glb` — River water flux from `runoff` (newly enabled in namelist.io). Units: m/s -> kg m-2 s-1 (x 1000) via scale_pipeline.
+
+---
+
+## Blocked — no physics in model (5)
+
+- [ ] **bigthetao** (mon, 3D) — `ocean.bigthetao.tavg-ol-hxy-sea.mon.glb` — Conservative (potential) temperature. **FESOM2 uses potential temperature, not conservative temperature** — no conversion available without full equation of state inversion (TEOS-10 ct_from_pt would need absolute salinity).
+- [ ] **ficeberg** (mon, 3D) — `ocean.ficeberg.tavg-ol-hxy-sea.mon.glb` — Water flux from icebergs. **No iceberg model** in AWI-ESM3-VEG-HR.
+- [ ] **hfgeou** (fx, 2D) — `ocean.hfgeou.ti-u-hxy-sea.fx.glb` — Upward geothermal heat flux at sea floor. **Not implemented in FESOM 2.7** — no geothermal heat flux diagnostic.
+- [ ] **sf6** (mon, 3D) — `ocean.sf6.tavg-ol-hxy-sea.mon.glb` — SF6 tracer concentration. **No SF6 tracer** — requires biogeochemistry module not in this configuration.
+- [ ] **hfbasin** (mon, basin) — `ocean.hfbasin.tavg-u-hyb-sea.mon.glb` — Northward ocean heat transport by basin. Needs both basin masks and basin-integrated heat transport diagnostic.
+
+---
+
+## Blocked — basin masks needed (3)
+
+These require basin mask infrastructure not yet available for FESOM DARS mesh.
+
+- [ ] **basin** (fx) — `ocean.basin.ti-u-hxy-u.fx.glb` — Basin mask integer field. Needs basin definition on unstructured DARS mesh.
+- [ ] **msftmz** (mon, basin+depth) — `ocean.msftm.tavg-ol-hyb-sea.mon.glb` — Ocean meridional overturning mass streamfunction. Needs basin masks + zig-zag path integration on unstructured mesh.
+- [ ] **msftyz** (mon, basin+depth) — `ocean.msfty.tavg-ol-ht-sea.mon.glb` — Ocean Y overturning mass streamfunction. Same basin mask + path integration requirement.
+
+---
+
+## Blocked — namelist/config change needed (7)
+
+These variables exist in FESOM but are not currently enabled in `namelist.io`.
+Enabling them requires rerunning the model with updated configuration.
+
+- [x] **friver** (mon, 2D) — `ocean.friver.tavg-u-hxy-sea.mon.glb` — River water flux. **Resolved**: `runoff` now enabled in namelist.io. Moved to implemented section above.
+- [ ] **hfx** (mon, 3D) — `ocean.hfx.tavg-ol-hxy-sea.mon.glb` — 3D ocean heat X transport. Requires `ldiag_trflx=.true.` in namelist (currently `.false.`). Uses FESOM `utemp`.
+- [ ] **hfxint** (mon, 2D) — `ocean.hfx.tavg-u-hxy-sea.mon.glb` — Vertically integrated heat X transport. Same `ldiag_trflx=.true.` requirement + vertical integration.
+- [ ] **hfy** (mon, 3D) — `ocean.hfy.tavg-ol-hxy-sea.mon.glb` — 3D ocean heat Y transport. Same `ldiag_trflx=.true.` requirement, uses FESOM `vtemp`.
+- [ ] **hfyint** (mon, 2D) — `ocean.hfy.tavg-u-hxy-sea.mon.glb` — Vertically integrated heat Y transport. Same as hfy + vertical integration.
+- [ ] **tauuo** (3hr, 2D) — `ocean.tauuo.tavg-u-hxy-sea.3hr.glb` — Surface X stress at 3-hourly. FESOM outputs `tx_sur` but at **one frequency per variable** — currently monthly. Changing to 3hr would require deriving monthly from 3hr in post-processing.
+- [ ] **tauvo** (3hr, 2D) — `ocean.tauvo.tavg-u-hxy-sea.3hr.glb` — Surface Y stress at 3-hourly. Same one-frequency constraint as tauuo.
diff --git a/awi-esm3-veg-hr-variables/cap7_seaice/cmip7_CAP7_variables_seaIce.csv b/awi-esm3-veg-hr-variables/cap7_seaice/cmip7_CAP7_variables_seaIce.csv
new file mode 100644
index 00000000..d5518a91
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/cap7_seaice/cmip7_CAP7_variables_seaIce.csv
@@ -0,0 +1,37 @@
+,name,frequency,modeling_realm,standard_name,units,cell_methods,cell_measures,long_name,comment,processing_note,dimensions,out_name,type,positive,spatial_shape,temporal_shape,cmip6_table,physical_parameter_name,variableRootDD,branding_label,branded_variable_name,region,cmip6_compound_name,cmip7_compound_name,uid,priority,flag_values,flag_meanings
+490,seaIce.evspsbl.tavg-u-hxy-si.mon.glb,mon,seaIce,water_evapotranspiration_flux,kg m-2 s-1,area: time: mean where sea_ice over all_area_types,area: areacello,Sea-Ice Mass Change Through Evaporation and Sublimation,"Rate of change of sea-ice mass change through evaporation and sublimation divided by grid-cell area. If a model does not differentiate between the sublimation of snow and sea ice, we recommend to report sidmassevapsubl as zero as long as the ice is snow covered, and to report any sublimation within the variable sisndmasssubl.","CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where sea time: mean CMIP7:area: mean where sea_ice over all___area_types time: mean ,
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where sea time: mean CMIP7:area: time: mean where sea_ice over all_area_types,",longitude latitude time,evspsbl,real,up,XY-na,time-intv,SImon,sidmassevapsubl,evspsbl,tavg-u-hxy-si,evspsbl_tavg-u-hxy-si,glb,SImon.sidmassevapsubl,seaIce.evspsbl.tavg-u-hxy-si.mon.glb,713aff10-faa7-11e6-bfb7-ac72891c3257,high,,
+491,seaIce.prra.tavg-u-hxy-si.mon.glb,mon,seaIce,rainfall_flux,kg m-2 s-1,area: time: mean where sea_ice (mask=siconc),area: areacello,Rainfall Rate over Sea Ice,"Mass of liquid precipitation falling onto sea ice divided by grid-cell area. If the rain is directly put into the ocean, it should not be counted towards sipr. Always positive or zero.","Note that SIMIP requests the area-weighted average for all intensive variables (i.e., variables that are not proportional to area fraction such as albedo, temperature, or heat flux). Hence, all time samples with non-zero sea-ice fraction are first multiplied by area fraction, then summed, and then divided by the sum of the area fractions. See Appendix C of Notz et al. (2016) for more detail. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean where sea_ice (comment: mask=siconc) CMIP7:area: time: mean where sea_ice (mask=siconc),",longitude latitude time,prra,real,,XY-na,time-intv,SImon,sipr,prra,tavg-u-hxy-si,prra_tavg-u-hxy-si,glb,SImon.sipr,seaIce.prra.tavg-u-hxy-si.mon.glb,7109e6a0-faa7-11e6-bfb7-ac72891c3257,high,,
+492,seaIce.prsn.tavg-u-hxy-si.mon.glb,mon,seaIce,snowfall_flux,kg m-2 s-1,area: time: mean where sea_ice (mask=siconc),area: areacello,Snow Mass Change Through Snowfall,Rate of change of snow mass due to solid precipitation (i.e. snowfall) falling onto sea ice divided by grid-cell area. Always positive or zero.,"CHANGE SINCE CMIP6: compound name,",longitude latitude time,prsn,real,,XY-na,time-intv,SImon,sisndmasssnf,prsn,tavg-u-hxy-si,prsn_tavg-u-hxy-si,glb,SImon.sisndmasssnf,seaIce.prsn.tavg-u-hxy-si.mon.glb,71401c0c-faa7-11e6-bfb7-ac72891c3257,high,,
+493,seaIce.siconc.tavg-u-hxy-u.day.glb,day,seaIce,sea_ice_area_fraction,%,area: time: mean,area: areacello,Sea-Ice Area Percentage (Ocean Grid),"Percentage of a given grid cell that is covered by sea ice on the ocean grid, independent of the thickness of that ice.","CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where sea time: mean CMIP7:area: time: mean, CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude time typesi CMIP7:longitude latitude time,",longitude latitude time,siconc,real,,XY-na,time-intv,SIday,siconc,siconc,tavg-u-hxy-u,siconc_tavg-u-hxy-u,glb,SIday.siconc,seaIce.siconc.tavg-u-hxy-u.day.glb,85c3e888-357c-11e7-8257-5404a60d96b5,core,,
+494,seaIce.siconc.tavg-u-hxy-u.mon.glb,mon,seaIce,sea_ice_area_fraction,%,area: time: mean,area: areacello,Sea-Ice Area Percentage (Ocean Grid),"Percentage of a given grid cell that is covered by sea ice on the ocean grid, independent of the thickness of that ice.","CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where sea time: mean CMIP7:area: time: mean, CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude time typesi CMIP7:longitude latitude time,",longitude latitude time,siconc,real,,XY-na,time-intv,SImon,siconc,siconc,tavg-u-hxy-u,siconc_tavg-u-hxy-u,glb,SImon.siconc,seaIce.siconc.tavg-u-hxy-u.mon.glb,86119ff6-357c-11e7-8257-5404a60d96b5,core,,
+495,seaIce.sieqthick.tavg-u-hxy-si.mon.glb,mon,seaIce,sea_ice_thickness,m,area: time: mean where sea_ice over all_area_types,area: areacello,Sea-Ice Volume per Area,"Total volume of sea ice divided by grid-cell area, also known as the equivalent thickness of sea ice.","CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where sea time: mean CMIP7:area: mean where sea_ice over all_area_types time: mean
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where sea time: mean CMIP7:area: time: mean where sea_ice over all_area_types,",longitude latitude time,sieqthick,real,,XY-na,time-intv,SImon,sivol,sieqthick,tavg-u-hxy-si,sieqthick_tavg-u-hxy-si,glb,SImon.sivol,seaIce.sieqthick.tavg-u-hxy-si.mon.glb,71291d86-faa7-11e6-bfb7-ac72891c3257,high,,
+496,seaIce.simass.tavg-u-hxy-si.mon.glb,mon,seaIce,sea_ice_amount,kg m-2,area: time: mean where sea_ice over all_area_types,area: areacello,Sea-Ice Mass,Total mass of sea ice divided by grid-cell area.,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where sea time: mean CMIP7:area: mean where sea_ice over all___area_types time: mean ,
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where sea time: mean CMIP7:area: time: mean where sea_ice over all_area_types,",longitude latitude time,simass,real,,XY-na,time-intv,SImon,simass,simass,tavg-u-hxy-si,simass_tavg-u-hxy-si,glb,SImon.simass,seaIce.simass.tavg-u-hxy-si.mon.glb,714b603a-faa7-11e6-bfb7-ac72891c3257,core,,
+497,seaIce.sisali.tavg-u-hxy-si.mon.glb,mon,seaIce,sea_ice_salinity,1E-03,area: time: mean where sea_ice (mask=siconc),area: areacello,Sea-Ice Salinity,"Mean sea-ice salinity of all sea ice in grid cell. Sometimes, models implicitly or explicitly assume a different salinity of the ice for thermodynamic considerations than they do for closing the salt budget with the ocean. In these cases, the mean salinity used in the calculation of the salt budget should be reported.","CHANGE SINCE CMIP6 in Units (from Physical Parameter) - CMIP6:0.001 CMIP7:1E-03,
+Note that SIMIP requests the area-weighted average for all intensive variables (i.e., variables that are not proportional to area fraction such as albedo, temperature, or heat flux). Hence, all time samples with non-zero sea-ice fraction are first multiplied by area fraction, then summed, and then divided by the sum of the area fractions. See Appendix C of Notz et al. (2016) for more detail.
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean where sea_ice (comment: mask=siconc) CMIP7:area: time: mean where sea_ice (mask=siconc),",longitude latitude time,sisali,real,,XY-na,time-intv,SImon,sisali,sisali,tavg-u-hxy-si,sisali_tavg-u-hxy-si,glb,SImon.sisali,seaIce.sisali.tavg-u-hxy-si.mon.glb,7113f7b2-faa7-11e6-bfb7-ac72891c3257,medium,,
+498,seaIce.sitempsnic.tavg-u-hxy-si.mon.glb,mon,seaIce,sea_ice_surface_temperature,K,area: time: mean where sea_ice (mask=siconc),area: areacello,Temperature at Snow-Ice Interface,Mean temperature at the snow-ice interface. This is the surface temperature of ice where snow thickness is zero.,"Note that SIMIP requests the area-weighted average for all intensive variables (i.e., variables that are not proportional to area fraction such as albedo, temperature, or heat flux). Hence, all time samples with non-zero sea-ice fraction are first multiplied by area fraction, then summed, and then divided by the sum of the area fractions. See Appendix C of Notz et al. (2016) for more detail.
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean where sea_ice (comment: mask=siconc) CMIP7:area: time: mean where sea_ice (mask=siconc),",longitude latitude time,sitempsnic,real,,XY-na,time-intv,SImon,sitempsnic,sitempsnic,tavg-u-hxy-si,sitempsnic_tavg-u-hxy-si,glb,SImon.sitempsnic,seaIce.sitempsnic.tavg-u-hxy-si.mon.glb,711ec1d8-faa7-11e6-bfb7-ac72891c3257,high,,
+501,seaIce.sitimefrac.tavg-u-hxy-sea.mon.glb,mon,seaIce,fraction_of_time_with_sea_ice_area_fraction_above_threshold,1,area: mean where sea time: mean,area: areacello,Fraction of Time Steps with Sea Ice,Fraction of time steps of the averaging period during which sea ice is present (siconc > 0) in a grid cell.,,longitude latitude time,sitimefrac,real,,XY-na,time-intv,SImon,sitimefrac,sitimefrac,tavg-u-hxy-sea,sitimefrac_tavg-u-hxy-sea,glb,SImon.sitimefrac,seaIce.sitimefrac.tavg-u-hxy-sea.mon.glb,714344cc-faa7-11e6-bfb7-ac72891c3257,core,,
+502,seaIce.siu.tavg-u-hxy-si.day.glb,day,seaIce,sea_ice_x_velocity,m s-1,area: time: mean where sea_ice (mask=siconc),--MODEL,X-Component of Sea-Ice Velocity,X-component of sea-ice velocity on native model grid.,"Note that SIMIP requests the area-weighted average for all intensive variables (i.e., variables that are not proportional to area fraction such as albedo, temperature, or heat flux). Hence, all time samples with non-zero sea-ice fraction are first multiplied by area fraction, then summed, and then divided by the sum of the area fractions. See Appendix C of Notz et al. (2016) for more detail.
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean where sea_ice (comment: mask=siconc) CMIP7:area: time: mean where sea_ice (mask=siconc),
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean where sea_ice (comment: mask=siconc) CMIP7:area: time: mean where sea_ice (mask=siconc),",longitude latitude time,siu,real,,XY-na,time-intv,SIday,siu,siu,tavg-u-hxy-si,siu_tavg-u-hxy-si,glb,SIday.siu,seaIce.siu.tavg-u-hxy-si.day.glb,b811a784-7c00-11e6-bcdf-ac72891c3257,high,,
+503,seaIce.siu.tavg-u-hxy-si.mon.glb,mon,seaIce,sea_ice_x_velocity,m s-1,area: time: mean where sea_ice (mask=siconc),--MODEL,X-Component of Sea-Ice Velocity,X-component of sea-ice velocity on native model grid.,"Note that SIMIP requests the area-weighted average for all intensive variables (i.e., variables that are not proportional to area fraction such as albedo, temperature, or heat flux). Hence, all time samples with non-zero sea-ice fraction are first multiplied by area fraction, then summed, and then divided by the sum of the area fractions. See Appendix C of Notz et al. (2016) for more detail.
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean where sea_ice (comment: mask=siconc) CMIP7:area: time: mean where sea_ice (mask=siconc),
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean where sea_ice (comment: mask=siconc) CMIP7:area: time: mean where sea_ice (mask=siconc),",longitude latitude time,siu,real,,XY-na,time-intv,SImon,siu,siu,tavg-u-hxy-si,siu_tavg-u-hxy-si,glb,SImon.siu,seaIce.siu.tavg-u-hxy-si.mon.glb,7147b8fe-faa7-11e6-bfb7-ac72891c3257,core,,
+504,seaIce.siv.tavg-u-hxy-si.day.glb,day,seaIce,sea_ice_y_velocity,m s-1,area: time: mean where sea_ice (mask=siconc),--MODEL,Y-Component of Sea-Ice Velocity,Y-component of sea-ice velocity on native model grid.,"Note that SIMIP requests the area-weighted average for all intensive variables (i.e., variables that are not proportional to area fraction such as albedo, temperature, or heat flux). Hence, all time samples with non-zero sea-ice fraction are first multiplied by area fraction, then summed, and then divided by the sum of the area fractions. See Appendix C of Notz et al. (2016) for more detail.
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean where sea_ice (comment: mask=siconc) CMIP7:area: time: mean where sea_ice (mask=siconc),
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean where sea_ice (comment: mask=siconc) CMIP7:area: time: mean where sea_ice (mask=siconc),",longitude latitude time,siv,real,,XY-na,time-intv,SIday,siv,siv,tavg-u-hxy-si,siv_tavg-u-hxy-si,glb,SIday.siv,seaIce.siv.tavg-u-hxy-si.day.glb,b811b062-7c00-11e6-bcdf-ac72891c3257,high,,
+505,seaIce.siv.tavg-u-hxy-si.mon.glb,mon,seaIce,sea_ice_y_velocity,m s-1,area: time: mean where sea_ice (mask=siconc),--MODEL,Y-Component of Sea-Ice Velocity,Y-component of sea-ice velocity on native model grid.,"Note that SIMIP requests the area-weighted average for all intensive variables (i.e., variables that are not proportional to area fraction such as albedo, temperature, or heat flux). Hence, all time samples with non-zero sea-ice fraction are first multiplied by area fraction, then summed, and then divided by the sum of the area fractions. See Appendix C of Notz et al. (2016) for more detail.
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean where sea_ice (comment: mask=siconc) CMIP7:area: time: mean where sea_ice (mask=siconc),
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean where sea_ice (comment: mask=siconc) CMIP7:area: time: mean where sea_ice (mask=siconc),",longitude latitude time,siv,real,,XY-na,time-intv,SImon,siv,siv,tavg-u-hxy-si,siv_tavg-u-hxy-si,glb,SImon.siv,seaIce.siv.tavg-u-hxy-si.mon.glb,71237944-faa7-11e6-bfb7-ac72891c3257,core,,
+506,seaIce.snc.tavg-u-hxy-si.mon.glb,mon,seaIce,surface_snow_area_fraction,%,area: time: mean where sea_ice (mask=siconc),area: areacello,Snow Area Percentage,"Percentage of the sea-ice surface that is covered by snow. In many models that do not explicitly resolve an areal fraction of snow, this variable will always be either 0 or 1.","CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean where sea_ice (comment: mask=siconc) CMIP7:area: time: mean where sea_ice (mask=siconc),",longitude latitude time,snc,real,,XY-na,time-intv,SImon,sisnconc,snc,tavg-u-hxy-si,snc_tavg-u-hxy-si,glb,SImon.sisnconc,seaIce.snc.tavg-u-hxy-si.mon.glb,7112255e-faa7-11e6-bfb7-ac72891c3257,high,,
+507,seaIce.snd.tavg-u-hxy-sn.day.glb,day,seaIce,surface_snow_thickness,m,area: time: mean where snow (for snow on sea ice only),area: areacello,Snow Thickness,Actual thickness of snow averaged over the snow-covered part of the sea ice. This thickness is usually directly available within the model formulation. It can also be derived by dividing the total volume of snow by the area of the snow.,"Note that SIMIP requests the area-weighted average for all intensive variables (i.e., variables that are not proportional to area fraction such as albedo, temperature, or heat flux). Hence, all time samples with non-zero sea-ice fraction are first multiplied by area fraction, then summed, and then divided by the sum of the area fractions. See Appendix C of Notz et al. (2016) for more detail.
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where snow over sea_ice area: time: mean where sea_ice CMIP7:area: time: mean where snow (for snow on sea ice only),",longitude latitude time,snd,real,,XY-na,time-intv,SIday,sisnthick,snd,tavg-u-hxy-sn,snd_tavg-u-hxy-sn,glb,SIday.sisnthick,seaIce.snd.tavg-u-hxy-sn.day.glb,d243c0a2-4a9f-11e6-b84e-ac72891c3257,high,,
+508,seaIce.snd.tavg-u-hxy-sn.mon.glb,mon,seaIce,surface_snow_thickness,m,area: time: mean where snow (for snow on sea ice only),area: areacello,Snow Thickness,Actual thickness of snow averaged over the snow-covered part of the sea ice. This thickness is usually directly available within the model formulation. It can also be derived by dividing the total volume of snow by the area of the snow.,"Note that SIMIP requests the area-weighted average for all intensive variables (i.e., variables that are not proportional to area fraction such as albedo, temperature, or heat flux). Hence, all time samples with non-zero sea-ice fraction are first multiplied by area fraction, then summed, and then divided by the sum of the area fractions. See Appendix C of Notz et al. (2016) for more detail.
+ CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where snow over sea_ice area: time: mean where sea_ice CMIP7:area: time: mean where snow (for snow on sea ice only),",longitude latitude time,snd,real,,XY-na,time-intv,SImon,sisnthick,snd,tavg-u-hxy-sn,snd_tavg-u-hxy-sn,glb,SImon.sisnthick,seaIce.snd.tavg-u-hxy-sn.mon.glb,714eec6e-faa7-11e6-bfb7-ac72891c3257,core,,
+509,seaIce.snw.tavg-u-hxy-si.mon.glb,mon,seaIce,surface_snow_amount,kg m-2,area: time: mean where sea_ice over all_area_types,area: areacello,Snow Mass per Area,"Total mass of snow on sea ice divided by grid-cell area. This then allows one to analyse the storage of latent heat in the snow, and to calculate the snow-water equivalent.","CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean where sea_ice (comment: mask=siconc) CMIP7:area: time: mean where sea___ice over all_area___types,",longitude latitude time,snw,real,,XY-na,time-intv,SImon,sisnmass,snw,tavg-u-hxy-si,snw_tavg-u-hxy-si,glb,SImon.sisnmass,seaIce.snw.tavg-u-hxy-si.mon.glb,713ed766-faa7-11e6-bfb7-ac72891c3257,high,,
+510,seaIce.ts.tavg-u-hxy-si.mon.glb,mon,seaIce,surface_temperature,K,area: time: mean where sea_ice (mask=siconc),area: areacello,Surface Temperature of Sea Ice,"Mean surface temperature of the sea-ice covered part of the grid cell. Wherever snow covers the ice, the surface temperature of the snow is used for the averaging, otherwise the surface temperature of the ice is used.","Note that SIMIP requests the area-weighted average for all intensive variables (i.e., variables that are not proportional to area fraction such as albedo, temperature, or heat flux). Hence, all time samples with non-zero sea-ice fraction are first multiplied by area fraction, then summed, and then divided by the sum of the area fractions. See Appendix C of Notz et al. (2016) for more detail.
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean where sea_ice (comment: mask=siconc) CMIP7:area: time: mean where sea_ice (mask=siconc),",longitude latitude time,ts,real,,XY-na,time-intv,SImon,sitemptop,ts,tavg-u-hxy-si,ts_tavg-u-hxy-si,glb,SImon.sitemptop,seaIce.ts.tavg-u-hxy-si.mon.glb,711075e2-faa7-11e6-bfb7-ac72891c3257,core,,
\ No newline at end of file
diff --git a/awi-esm3-veg-hr-variables/cap7_seaice/cmip7_CAP7_variables_seaIce_ocean.csv b/awi-esm3-veg-hr-variables/cap7_seaice/cmip7_CAP7_variables_seaIce_ocean.csv
new file mode 100644
index 00000000..47fe59bc
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/cap7_seaice/cmip7_CAP7_variables_seaIce_ocean.csv
@@ -0,0 +1,5 @@
+,name,frequency,modeling_realm,standard_name,units,cell_methods,cell_measures,long_name,comment,processing_note,dimensions,out_name,type,positive,spatial_shape,temporal_shape,cmip6_table,physical_parameter_name,variableRootDD,branding_label,branded_variable_name,region,cmip6_compound_name,cmip7_compound_name,uid,priority,flag_values,flag_meanings
+499,seaIce.sithick.tavg-u-hxy-si.day.glb,day,seaIce ocean,sea_ice_thickness,m,area: time: mean where sea_ice (mask=siconc),area: areacello,Sea-Ice Thickness,"Actual (floe) thickness of sea ice averaged over the ice-covered part of a given grid cell, NOT volume divided by grid area.","Note that SIMIP requests the area-weighted average for all intensive variables (i.e., variables that are not proportional to area fraction such as albedo, temperature, or heat flux). Hence, all time samples with non-zero sea-ice fraction are first multiplied by area fraction, then summed, and then divided by the sum of the area fractions. See Appendix C of Notz et al. (2016) for more detail.
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean where sea_ice (comment: mask=siconc) CMIP7:area: time: mean where sea_ice (mask=siconc),",longitude latitude time,sithick,real,,XY-na,time-intv,SIday,sithick,sithick,tavg-u-hxy-si,sithick_tavg-u-hxy-si,glb,SIday.sithick,seaIce.sithick.tavg-u-hxy-si.day.glb,d243ba76-4a9f-11e6-b84e-ac72891c3257,high,,
+500,seaIce.sithick.tavg-u-hxy-si.mon.glb,mon,seaIce ocean,sea_ice_thickness,m,area: time: mean where sea_ice (mask=siconc),area: areacello,Sea-Ice Thickness,"Actual (floe) thickness of sea ice averaged over the ice-covered part of a given grid cell, NOT volume divided by grid area.","Note that SIMIP requests the area-weighted average for all intensive variables (i.e., variables that are not proportional to area fraction such as albedo, temperature, or heat flux). Hence, all time samples with non-zero sea-ice fraction are first multiplied by area fraction, then summed, and then divided by the sum of the area fractions. See Appendix C of Notz et al. (2016) for more detail.
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean where sea_ice (comment: mask=siconc) CMIP7:area: time: mean where sea_ice (mask=siconc),",longitude latitude time,sithick,real,,XY-na,time-intv,SImon,sithick,sithick,tavg-u-hxy-si,sithick_tavg-u-hxy-si,glb,SImon.sithick,seaIce.sithick.tavg-u-hxy-si.mon.glb,d241a6d2-4a9f-11e6-b84e-ac72891c3257,core,,
\ No newline at end of file
diff --git a/awi-esm3-veg-hr-variables/cap7_seaice/cmip7_awiesm3-veg-hr_cap7_seaice.yaml b/awi-esm3-veg-hr-variables/cap7_seaice/cmip7_awiesm3-veg-hr_cap7_seaice.yaml
new file mode 100644
index 00000000..f72c1a2c
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/cap7_seaice/cmip7_awiesm3-veg-hr_cap7_seaice.yaml
@@ -0,0 +1,149 @@
+# CMIP7 CAP7 Sea Ice Variables — AWI-ESM3-VEG-HR
+# Generated from cmip7_CAP7_variables_seaIce.csv + seaIce_ocean.csv
+#
+# 21 total: 9 in core/lrcs/veg, 9 new rules, 3 blocked.
+# Requires namelist.io changes: h_ice/h_snow→daily, prec/snow uncommented.
+# See cmip7_cap7_seaice_todo.md for full variable tracking.
+
+general:
+ name: "awiesm3-cmip7-cap7-seaice"
+ cmor_version: "CMIP7"
+ mip: "CMIP"
+ CMIP7_DReq_metadata: "/home/a/a270092/.cache/pycmor/cmip7_metadata/v1.2.2.2/metadata.json"
+
+pycmor:
+ warn_on_no_rule: False
+ dask_cluster: "slurm"
+ dask_cluster_scaling_mode: "fixed"
+ dask_cluster_scaling_fixed_jobs: 1
+
+jobqueue:
+ slurm:
+ name: pycmor-worker
+ queue: compute
+ account: bb1469
+ cores: 16
+ memory: 256GB
+ walltime: '00:30:00'
+
+pipelines:
+ # Scale by constant (m/s → kg m-2 s-1 via ×1000)
+ - name: scale_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:scale_by_constant
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+inherit:
+ data_path: &dp /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/fesom
+ source_id: AWI-ESM-3
+ institution_id: AWI
+ experiment_id: picontrol
+ variant_label: r1i1p1f1
+ grid_label: gn
+ mesh_path: /work/ab0246/a270092/input/fesom2/dars2
+ grid_file: /work/ab0246/a270092/input/fesom2/dars2/mesh.nc
+ grid: "FESOM 2.6 unstructured grid DARS (3146761 surface nodes)"
+ nominal_resolution: "10 km"
+ institution: "Alfred Wegener Institute, Helmholtz Centre for Polar and Marine Research, Bremerhaven, Germany"
+ output_directory: ./cmorized_output/awiesm3
+
+rules:
+ # ============================================================
+ # Part 1: Daily — direct passthrough from FESOM
+ # ============================================================
+
+ - name: sithick_day
+ inputs:
+ - path: *dp
+ pattern: h_ice.fesom.1350.nc
+ compound_name: seaIce.sithick.tavg-u-hxy-si.day.GLB
+ model_variable: h_ice
+
+ - name: snd_day
+ inputs:
+ - path: *dp
+ pattern: h_snow.fesom.1350.nc
+ compound_name: seaIce.snd.tavg-u-hxy-sn.day.GLB
+ model_variable: h_snow
+
+ - name: siu_day
+ inputs:
+ - path: *dp
+ pattern: uice.fesom.1350.nc
+ compound_name: seaIce.siu.tavg-u-hxy-si.day.GLB
+ model_variable: uice
+ # vec_autorotate=.true. set in namelist.io
+
+ - name: siv_day
+ inputs:
+ - path: *dp
+ pattern: vice.fesom.1350.nc
+ compound_name: seaIce.siv.tavg-u-hxy-si.day.GLB
+ model_variable: vice
+ # vec_autorotate=.true. set in namelist.io
+
+ # ============================================================
+ # Part 2: Monthly — direct passthrough or time-averaged
+ # ============================================================
+
+ # sieqthick = m_ice (effective ice thickness = volume per area)
+ - name: sieqthick
+ inputs:
+ - path: *dp
+ pattern: m_ice.fesom.1350.nc
+ compound_name: seaIce.sieqthick.tavg-u-hxy-si.mon.GLB
+ model_variable: m_ice
+
+ # snw = m_snow (snow mass per area); daily input → timeavg to monthly
+ - name: snw
+ inputs:
+ - path: *dp
+ pattern: m_snow.fesom.1350.nc
+ compound_name: seaIce.snw.tavg-u-hxy-si.mon.GLB
+ model_variable: m_snow
+
+ # ============================================================
+ # Part 3: Monthly — precipitation/evaporation (need ×1000 scaling)
+ # ============================================================
+ # FESOM outputs in m/s, CMOR needs kg m-2 s-1 (× rho_water = 1000)
+
+ - name: evspsbl
+ inputs:
+ - path: *dp
+ pattern: evap.fesom.1350.nc
+ compound_name: seaIce.evspsbl.tavg-u-hxy-si.mon.GLB
+ model_variable: evap
+ scale_factor: 1000.0
+ pipelines:
+ - scale_pipeline
+
+ - name: prra
+ inputs:
+ - path: *dp
+ pattern: prec.fesom.1350.nc
+ compound_name: seaIce.prra.tavg-u-hxy-si.mon.GLB
+ model_variable: prec
+ scale_factor: 1000.0
+ pipelines:
+ - scale_pipeline
+
+ - name: prsn
+ inputs:
+ - path: *dp
+ pattern: snow.fesom.1350.nc
+ compound_name: seaIce.prsn.tavg-u-hxy-si.mon.GLB
+ model_variable: snow
+ scale_factor: 1000.0
+ pipelines:
+ - scale_pipeline
diff --git a/awi-esm3-veg-hr-variables/cap7_seaice/cmip7_cap7_seaice_todo.md b/awi-esm3-veg-hr-variables/cap7_seaice/cmip7_cap7_seaice_todo.md
new file mode 100644
index 00000000..8c088ad7
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/cap7_seaice/cmip7_cap7_seaice_todo.md
@@ -0,0 +1,56 @@
+# CAP7 Sea Ice — Implementation Status
+
+Source CSVs (unfiltered): `cmip7_CAP7_variables_seaIce.csv` (19), `cmip7_CAP7_variables_seaIce_ocean.csv` (2).
+
+Total: 21 compound_name entries — 9 already in core/lrcs/veg, 9 new cap7 rules, 3 blocked
+
+## Namelist changes required
+
+The following changes to `namelist.io` enable CAP7 sea ice output:
+- `h_ice`: changed from monthly (`'m'`) to daily (`'d'`) — enables daily sithick
+- `h_snow`: changed from monthly (`'m'`) to daily (`'d'`) — enables daily snd
+- `prec`: uncommented — enables rainfall rate (prra)
+- `snow`: uncommented — enables snowfall rate (prsn)
+
+Note: monthly sithick/snd in core_seaice will now receive daily data; the default pipeline's timeavg step resamples to monthly per the compound_name frequency.
+
+---
+
+## Already in core/lrcs/veg (9)
+
+- [x] **siconc** (day) — `seaIce.siconc.tavg-u-hxy-u.day.glb` — core
+- [x] **siconc** (mon) — `seaIce.siconc.tavg-u-hxy-u.mon.glb` — core
+- [x] **simass** (mon) — `seaIce.simass.tavg-u-hxy-si.mon.glb` — lrcs
+- [x] **sithick** (mon) — `seaIce.sithick.tavg-u-hxy-si.mon.glb` — core
+- [x] **sitimefrac** (mon) — `seaIce.sitimefrac.tavg-u-hxy-sea.mon.glb` — core
+- [x] **siu** (mon) — `seaIce.siu.tavg-u-hxy-si.mon.glb` — core
+- [x] **siv** (mon) — `seaIce.siv.tavg-u-hxy-si.mon.glb` — core
+- [x] **snd** (mon) — `seaIce.snd.tavg-u-hxy-sn.mon.glb` — core
+- [x] **ts** (mon) — `seaIce.ts.tavg-u-hxy-si.mon.glb` — core
+
+---
+
+## Implemented — new cap7 rules (9)
+
+### Daily (4)
+
+- [x] **sithick** (day) — `seaIce.sithick.tavg-u-hxy-si.day.glb` — Sea-ice thickness from `h_ice` (now daily output). Direct passthrough.
+- [x] **snd** (day) — `seaIce.snd.tavg-u-hxy-sn.day.glb` — Snow depth on ice from `h_snow` (now daily output). Direct passthrough.
+- [x] **siu** (day) — `seaIce.siu.tavg-u-hxy-si.day.glb` — Sea-ice x-velocity from `uice` (already daily).
+- [x] **siv** (day) — `seaIce.siv.tavg-u-hxy-si.day.glb` — Sea-ice y-velocity from `vice` (already daily).
+
+### Monthly (5)
+
+- [x] **sieqthick** (mon) — `seaIce.sieqthick.tavg-u-hxy-si.mon.glb` — Sea-ice equivalent thickness (= m_ice, effective ice thickness = volume per area). Direct passthrough from `m_ice` monthly output.
+- [x] **snw** (mon) — `seaIce.snw.tavg-u-hxy-si.mon.glb` — Surface snow amount on ice (= m_snow). Input is daily m_snow; timeavg resamples to monthly.
+- [x] **evspsbl** (mon) — `seaIce.evspsbl.tavg-u-hxy-si.mon.glb` — Evaporation over sea ice from `evap` (total evap, monthly). SeaIce realm convention: "area: mean where sea_ice" handled by cell_methods metadata. Units: m/s -> kg m-2 s-1 (x 1000).
+- [x] **prra** (mon) — `seaIce.prra.tavg-u-hxy-si.mon.glb` — Rainfall rate over sea ice from `prec` (newly enabled). Units: m/s -> kg m-2 s-1 (x 1000).
+- [x] **prsn** (mon) — `seaIce.prsn.tavg-u-hxy-si.mon.glb` — Snowfall rate over sea ice from `snow` (newly enabled). Units: m/s -> kg m-2 s-1 (x 1000).
+
+---
+
+## Blocked (3)
+
+- [ ] **sisali** (mon) — `seaIce.sisali.tavg-u-hxy-si.mon.glb` — Sea-Ice Bulk Salinity. FESOM uses **constant ice salinity** (~4 ppt), not a prognostic variable. Not meaningful to output as a field.
+- [ ] **sitempsnic** (mon) — `seaIce.sitempsnic.tavg-u-hxy-si.mon.glb` — Temperature at Snow-Ice Interface. FESOM computes this internally in the thermodynamic solver but **does not expose it** as output.
+- [ ] **snc** (mon) — `seaIce.snc.tavg-u-hxy-si.mon.glb` — Snow Area Fraction on Sea Ice. **Single-category sea ice** does not resolve partial snow cover on ice — all ice is either fully snow-covered or not. Output would be a binary 0/1 field.
diff --git a/awi-esm3-veg-hr-variables/core_atm/XIOS_user_guide.pdf b/awi-esm3-veg-hr-variables/core_atm/XIOS_user_guide.pdf
new file mode 100644
index 00000000..485593e2
Binary files /dev/null and b/awi-esm3-veg-hr-variables/core_atm/XIOS_user_guide.pdf differ
diff --git a/awi-esm3-veg-hr-variables/core_atm/cmip7_all_core_variables_atmos.csv b/awi-esm3-veg-hr-variables/core_atm/cmip7_all_core_variables_atmos.csv
new file mode 100644
index 00000000..f352d353
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/core_atm/cmip7_all_core_variables_atmos.csv
@@ -0,0 +1,78 @@
+,name,frequency,modeling_realm,standard_name,units,cell_methods,cell_measures,long_name,comment,processing_note,dimensions,out_name,type,positive,spatial_shape,temporal_shape,cmip6_table,physical_parameter_name,variableRootDD,branding_label,branded_variable_name,region,cmip6_compound_name,cmip7_compound_name,uid,flag_values,flag_meanings
+1,atmos.cl.tavg-al-hxy-u.mon.glb,mon,atmos,cloud_area_fraction_in_atmosphere_layer,%,area: time: mean,area: areacella,Percentage Cloud Cover,Includes both large-scale and convective cloud.,Report on model layers (not standard pressures).,longitude latitude alevel time,cl,real,,XY-A,time-intv,Amon,cl,cl,tavg-al-hxy-u,cl_tavg-al-hxy-u,glb,Amon.cl,atmos.cl.tavg-al-hxy-u.mon.glb,baaa4302-e5dd-11e5-8482-ac72891c3257,,
+2,atmos.cli.tavg-al-hxy-u.mon.glb,mon,atmos,mass_fraction_of_cloud_ice_in_air,kg kg-1,area: time: mean,area: areacella,Mass Fraction of Cloud Ice,Includes both large-scale and convective cloud. This is calculated as the mass of cloud ice in the grid cell divided by the mass of air (including the water in all phases) in the grid cell. It includes precipitating hydrometeors ONLY if the precipitating hydrometeors affect the calculation of radiative transfer in model.,Report on model layers (not standard pressures).,longitude latitude alevel time,cli,real,,XY-A,time-intv,Amon,cli,cli,tavg-al-hxy-u,cli_tavg-al-hxy-u,glb,Amon.cli,atmos.cli.tavg-al-hxy-u.mon.glb,baaa8326-e5dd-11e5-8482-ac72891c3257,,
+3,atmos.clivi.tavg-u-hxy-u.mon.glb,mon,atmos,atmosphere_mass_content_of_cloud_ice,kg m-2,area: time: mean,area: areacella,Ice Water Path,mass of ice water in the column divided by the area of the column (not just the area of the cloudy portion of the column). Includes precipitating frozen hydrometeors ONLY if the precipitating hydrometeor affects the calculation of radiative transfer in model.,,longitude latitude time,clivi,real,,XY-na,time-intv,Amon,clivi,clivi,tavg-u-hxy-u,clivi_tavg-u-hxy-u,glb,Amon.clivi,atmos.clivi.tavg-u-hxy-u.mon.glb,baaa9852-e5dd-11e5-8482-ac72891c3257,,
+4,atmos.clt.tavg-u-hxy-u.day.glb,day,atmos,cloud_area_fraction,%,area: time: mean,area: areacella,Total Cloud Cover Percentage,"for the whole atmospheric column, as seen from the surface or the top of the atmosphere. Includes both large-scale and convective cloud.",,longitude latitude time,clt,real,,XY-na,time-intv,day,clt,clt,tavg-u-hxy-u,clt_tavg-u-hxy-u,glb,day.clt,atmos.clt.tavg-u-hxy-u.day.glb,baaace4e-e5dd-11e5-8482-ac72891c3257,,
+5,atmos.clt.tavg-u-hxy-u.mon.glb,mon,atmos,cloud_area_fraction,%,area: time: mean,area: areacella,Total Cloud Cover Percentage,"for the whole atmospheric column, as seen from the surface or the top of the atmosphere. Include both large-scale and convective cloud.",,longitude latitude time,clt,real,,XY-na,time-intv,Amon,clt,clt,tavg-u-hxy-u,clt_tavg-u-hxy-u,glb,Amon.clt,atmos.clt.tavg-u-hxy-u.mon.glb,baaad7e0-e5dd-11e5-8482-ac72891c3257,,
+6,atmos.clw.tavg-al-hxy-u.mon.glb,mon,atmos,mass_fraction_of_cloud_liquid_water_in_air,kg kg-1,area: time: mean,area: areacella,Mass Fraction of Cloud Liquid Water,Includes both large-scale and convective cloud. Calculate as the mass of cloud liquid water in the grid cell divided by the mass of air (including the water in all phases) in the grid cells. Precipitating hydrometeors are included ONLY if the precipitating hydrometeors affect the calculation of radiative transfer in model.,Report on model layers (not standard pressures).,longitude latitude alevel time,clw,real,,XY-A,time-intv,Amon,clw,clw,tavg-al-hxy-u,clw_tavg-al-hxy-u,glb,Amon.clw,atmos.clw.tavg-al-hxy-u.mon.glb,baab0382-e5dd-11e5-8482-ac72891c3257,,
+7,atmos.clwvi.tavg-u-hxy-u.mon.glb,mon,atmos,atmosphere_mass_content_of_cloud_condensed_water,kg m-2,area: time: mean,area: areacella,Condensed Water Path,mass of condensed (liquid + ice) water in the column divided by the area of the column (not just the area of the cloudy portion of the column). Includes precipitating hydrometeors ONLY if the precipitating hydrometeor affects the calculation of radiative transfer in model.,,longitude latitude time,clwvi,real,,XY-na,time-intv,Amon,clwvi,clwvi,tavg-u-hxy-u,clwvi_tavg-u-hxy-u,glb,Amon.clwvi,atmos.clwvi.tavg-u-hxy-u.mon.glb,baab1818-e5dd-11e5-8482-ac72891c3257,,
+9,atmos.hfls.tavg-u-hxy-u.mon.glb,mon,atmos,surface_upward_latent_heat_flux,W m-2,area: time: mean,area: areacella,Surface Upward Latent Heat Flux,includes both evaporation and sublimation,,longitude latitude time,hfls,real,up,XY-na,time-intv,Amon,hfls,hfls,tavg-u-hxy-u,hfls_tavg-u-hxy-u,glb,Amon.hfls,atmos.hfls.tavg-u-hxy-u.mon.glb,baaefe2e-e5dd-11e5-8482-ac72891c3257,,
+10,atmos.hfss.tavg-u-hxy-u.mon.glb,mon,atmos,surface_upward_sensible_heat_flux,W m-2,area: time: mean,area: areacella,Surface Upward Sensible Heat Flux,"The surface sensible heat flux, also called turbulent heat flux, is the exchange of heat between the surface and the air by motion of air.",,longitude latitude time,hfss,real,up,XY-na,time-intv,Amon,hfss,hfss,tavg-u-hxy-u,hfss_tavg-u-hxy-u,glb,Amon.hfss,atmos.hfss.tavg-u-hxy-u.mon.glb,baaf86a0-e5dd-11e5-8482-ac72891c3257,,
+11,atmos.hur.tavg-p19-hxy-air.mon.glb,mon,atmos,relative_humidity,%,area: time: mean where air,area: areacella,Relative Humidity,"This is the relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.","CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: time: mean where air,",longitude latitude plev19 time,hur,real,,XY-P19,time-intv,Amon,hur,hur,tavg-p19-hxy-air,hur_tavg-p19-hxy-air,glb,Amon.hur,atmos.hur.tavg-p19-hxy-air.mon.glb,baafe578-e5dd-11e5-8482-ac72891c3257,,
+12,atmos.hur.tavg-p19-hxy-u.day.glb,day,atmos,relative_humidity,%,time: mean,area: areacella,Relative Humidity,"This is the relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.","CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude plev8 time CMIP7:longitude latitude plev19 time,",longitude latitude plev19 time,hur,real,,XY-P19,time-intv,day,hur,hur,tavg-p19-hxy-u,hur_tavg-p19-hxy-u,glb,day.hur,atmos.hur.tavg-p19-hxy-u.day.glb,baafec80-e5dd-11e5-8482-ac72891c3257,,
+13,atmos.hurs.tavg-h2m-hxy-u.6hr.glb,6hr,atmos,relative_humidity,%,area: time: mean,area: areacella,Near-Surface Relative Humidity,"The relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.",,longitude latitude time height2m,hurs,real,,XY-na,time-intv,6hrPlev,hurs,hurs,tavg-h2m-hxy-u,hurs_tavg-h2m-hxy-u,glb,6hrPlev.hurs,atmos.hurs.tavg-h2m-hxy-u.6hr.glb,917b8532-267c-11e7-8933-ac72891c3257,,
+14,atmos.hurs.tavg-h2m-hxy-u.day.glb,day,atmos,relative_humidity,%,area: time: mean,area: areacella,Near-Surface Relative Humidity,"This is the relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.",normally report this at 2 meters above the surface,longitude latitude time height2m,hurs,real,,XY-na,time-intv,day,hurs,hurs,tavg-h2m-hxy-u,hurs_tavg-h2m-hxy-u,glb,day.hurs,atmos.hurs.tavg-h2m-hxy-u.day.glb,5a070350-c77d-11e6-8a33-5404a60d96b5,,
+15,atmos.hurs.tavg-h2m-hxy-u.mon.glb,mon,atmos,relative_humidity,%,area: time: mean,area: areacella,Near-Surface Relative Humidity,"This is the relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.","express as a percentage. Normally, the relative humidity should be reported at the 2 meter height",longitude latitude time height2m,hurs,real,,XY-na,time-intv,Amon,hurs,hurs,tavg-h2m-hxy-u,hurs_tavg-h2m-hxy-u,glb,Amon.hurs,atmos.hurs.tavg-h2m-hxy-u.mon.glb,baaff41e-e5dd-11e5-8482-ac72891c3257,,
+16,atmos.hus.tavg-p19-hxy-u.day.glb,day,atmos,specific_humidity,1,time: mean,area: areacella,Specific Humidity,Specific humidity is the mass fraction of water vapor in (moist) air.,"CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude plev8 time CMIP7:longitude latitude plev19 time,",longitude latitude plev19 time,hus,real,,XY-P19,time-intv,day,hus,hus,tavg-p19-hxy-u,hus_tavg-p19-hxy-u,glb,day.hus,atmos.hus.tavg-p19-hxy-u.day.glb,bab0135e-e5dd-11e5-8482-ac72891c3257,,
+17,atmos.hus.tavg-p19-hxy-u.mon.glb,mon,atmos,specific_humidity,1,time: mean,area: areacella,Specific Humidity,Specific humidity is the mass fraction of water vapor in (moist) air.,,longitude latitude plev19 time,hus,real,,XY-P19,time-intv,Amon,hus,hus,tavg-p19-hxy-u,hus_tavg-p19-hxy-u,glb,Amon.hus,atmos.hus.tavg-p19-hxy-u.mon.glb,bab00b98-e5dd-11e5-8482-ac72891c3257,,
+18,atmos.huss.tavg-h2m-hxy-u.day.glb,day,atmos,specific_humidity,1,area: time: mean,area: areacella,Near-Surface Specific Humidity,"Near-surface (usually, 2 meter) specific humidity.",normally report this at 2 meters above the surface,longitude latitude time height2m,huss,real,,XY-na,time-intv,day,huss,huss,tavg-h2m-hxy-u,huss_tavg-h2m-hxy-u,glb,day.huss,atmos.huss.tavg-h2m-hxy-u.day.glb,bab0238a-e5dd-11e5-8482-ac72891c3257,,
+19,atmos.huss.tavg-h2m-hxy-u.mon.glb,mon,atmos,specific_humidity,1,area: time: mean,area: areacella,Near-Surface Specific Humidity,"Near-surface (usually, 2 meter) specific humidity.",normally report this at 2 meters above the surface,longitude latitude time height2m,huss,real,,XY-na,time-intv,Amon,huss,huss,tavg-h2m-hxy-u,huss_tavg-h2m-hxy-u,glb,Amon.huss,atmos.huss.tavg-h2m-hxy-u.mon.glb,bab01dfe-e5dd-11e5-8482-ac72891c3257,,
+20,atmos.huss.tpt-h2m-hxy-u.3hr.glb,3hr,atmos,specific_humidity,1,area: mean time: point,area: areacella,Near-Surface Specific Humidity,This is sampled synoptically.,normally report this at 2 meters above the surface,longitude latitude time1 height2m,huss,real,,XY-na,time-point,3hr,huss,huss,tpt-h2m-hxy-u,huss_tpt-h2m-hxy-u,glb,3hr.huss,atmos.huss.tpt-h2m-hxy-u.3hr.glb,bab034a6-e5dd-11e5-8482-ac72891c3257,,
+21,atmos.pr.tavg-u-hxy-u.1hr.glb,1hr,atmos,precipitation_flux,kg m-2 s-1,area: time: mean,area: areacella,Precipitation,Total precipitation flux,,longitude latitude time,pr,real,,XY-na,time-intv,E1hr,pr,pr,tavg-u-hxy-u,pr_tavg-u-hxy-u,glb,E1hr.pr,atmos.pr.tavg-u-hxy-u.1hr.glb,8baebea6-4a5b-11e6-9cd2-ac72891c3257,,
+22,atmos.pr.tavg-u-hxy-u.3hr.glb,3hr,atmos,precipitation_flux,kg m-2 s-1,area: time: mean,area: areacella,Precipitation,at surface; includes both liquid and solid phases. This is the 3-hour mean precipitation flux.,,longitude latitude time,pr,real,,XY-na,time-intv,3hr,pr,pr,tavg-u-hxy-u,pr_tavg-u-hxy-u,glb,3hr.pr,atmos.pr.tavg-u-hxy-u.3hr.glb,bab3c904-e5dd-11e5-8482-ac72891c3257,,
+23,atmos.pr.tavg-u-hxy-u.day.glb,day,atmos,precipitation_flux,kg m-2 s-1,area: time: mean,area: areacella,Precipitation,at surface; includes both liquid and solid phases from all types of clouds (both large-scale and convective),,longitude latitude time,pr,real,,XY-na,time-intv,day,pr,pr,tavg-u-hxy-u,pr_tavg-u-hxy-u,glb,day.pr,atmos.pr.tavg-u-hxy-u.day.glb,bab3d692-e5dd-11e5-8482-ac72891c3257,,
+24,atmos.pr.tavg-u-hxy-u.mon.glb,mon,atmos,precipitation_flux,kg m-2 s-1,area: time: mean,area: areacella,Precipitation,at surface; includes both liquid and solid phases from all types of clouds (both large-scale and convective),,longitude latitude time,pr,real,,XY-na,time-intv,Amon,pr,pr,tavg-u-hxy-u,pr_tavg-u-hxy-u,glb,Amon.pr,atmos.pr.tavg-u-hxy-u.mon.glb,bab3cb52-e5dd-11e5-8482-ac72891c3257,,
+25,atmos.prc.tavg-u-hxy-u.mon.glb,mon,atmos,convective_precipitation_flux,kg m-2 s-1,area: time: mean,area: areacella,Convective Precipitation,at surface; includes both liquid and solid phases.,,longitude latitude time,prc,real,,XY-na,time-intv,Amon,prc,prc,tavg-u-hxy-u,prc_tavg-u-hxy-u,glb,Amon.prc,atmos.prc.tavg-u-hxy-u.mon.glb,bab3f8a2-e5dd-11e5-8482-ac72891c3257,,
+26,atmos.prsn.tavg-u-hxy-u.mon.glb,mon,atmos,snowfall_flux,kg m-2 s-1,area: time: mean,area: areacella,Snowfall Flux,at surface; includes precipitation of all forms of water in the solid phase,,longitude latitude time,prsn,real,,XY-na,time-intv,Amon,prsn,prsn,tavg-u-hxy-u,prsn_tavg-u-hxy-u,glb,Amon.prsn,atmos.prsn.tavg-u-hxy-u.mon.glb,bab42b88-e5dd-11e5-8482-ac72891c3257,,
+27,atmos.prw.tavg-u-hxy-u.mon.glb,mon,atmos,atmosphere_mass_content_of_water_vapor,kg m-2,area: time: mean,area: areacella,Water Vapor Path,Vertically integrated mass of water vapour through the atmospheric column,,longitude latitude time,prw,real,,XY-na,time-intv,Amon,prw,prw,tavg-u-hxy-u,prw_tavg-u-hxy-u,glb,Amon.prw,atmos.prw.tavg-u-hxy-u.mon.glb,bab45df6-e5dd-11e5-8482-ac72891c3257,,
+28,atmos.ps.tavg-u-hxy-u.day.glb,day,atmos,surface_air_pressure,Pa,area: time: mean,area: areacella,Surface Air Pressure,"surface pressure (not mean sea-level pressure), 2-D field to calculate the 3-D pressure field from hybrid coordinates",,longitude latitude time,ps,real,,XY-na,time-intv,CFday,ps,ps,tavg-u-hxy-u,ps_tavg-u-hxy-u,glb,CFday.ps,atmos.ps.tavg-u-hxy-u.day.glb,bab46db4-e5dd-11e5-8482-ac72891c3257,,
+29,atmos.ps.tavg-u-hxy-u.mon.glb,mon,atmos,surface_air_pressure,Pa,area: time: mean,area: areacella,Surface Air Pressure,"not, in general, the same as mean sea-level pressure",,longitude latitude time,ps,real,,XY-na,time-intv,Amon,ps,ps,tavg-u-hxy-u,ps_tavg-u-hxy-u,glb,Amon.ps,atmos.ps.tavg-u-hxy-u.mon.glb,bab47b56-e5dd-11e5-8482-ac72891c3257,,
+30,atmos.psl.tavg-u-hxy-u.day.glb,day,atmos,air_pressure_at_mean_sea_level,Pa,area: time: mean,area: areacella,Sea Level Pressure,Sea Level Pressure,,longitude latitude time,psl,real,,XY-na,time-intv,day,psl,psl,tavg-u-hxy-u,psl_tavg-u-hxy-u,glb,day.psl,atmos.psl.tavg-u-hxy-u.day.glb,bab491f4-e5dd-11e5-8482-ac72891c3257,,
+31,atmos.psl.tavg-u-hxy-u.mon.glb,mon,atmos,air_pressure_at_mean_sea_level,Pa,area: time: mean,area: areacella,Sea Level Pressure,"not, in general, the same as surface pressure",,longitude latitude time,psl,real,,XY-na,time-intv,Amon,psl,psl,tavg-u-hxy-u,psl_tavg-u-hxy-u,glb,Amon.psl,atmos.psl.tavg-u-hxy-u.mon.glb,bab48ce0-e5dd-11e5-8482-ac72891c3257,,
+32,atmos.rlds.tavg-u-hxy-u.mon.glb,mon,atmos,surface_downwelling_longwave_flux_in_air,W m-2,area: time: mean,area: areacella,Surface Downwelling Longwave Radiation,"The surface called ""surface"" means the lower boundary of the atmosphere. ""longwave"" means longwave radiation. Downwelling radiation is radiation from above. It does not mean ""net downward"". When thought of as being incident on a surface, a radiative flux is sometimes called ""irradiance"". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called ""vector irradiance"". In accordance with common usage in geophysical disciplines, ""flux"" implies per unit area, called ""flux density"" in physics.",,longitude latitude time,rlds,real,down,XY-na,time-intv,Amon,rlds,rlds,tavg-u-hxy-u,rlds_tavg-u-hxy-u,glb,Amon.rlds,atmos.rlds.tavg-u-hxy-u.mon.glb,bab52da8-e5dd-11e5-8482-ac72891c3257,,
+33,atmos.rldscs.tavg-u-hxy-u.mon.glb,mon,atmos,surface_downwelling_longwave_flux_in_air_assuming_clear_sky,W m-2,area: time: mean,area: areacella,Surface Downwelling Clear-Sky Longwave Radiation,Surface downwelling clear-sky longwave radiation,,longitude latitude time,rldscs,real,down,XY-na,time-intv,Amon,rldscs,rldscs,tavg-u-hxy-u,rldscs_tavg-u-hxy-u,glb,Amon.rldscs,atmos.rldscs.tavg-u-hxy-u.mon.glb,bab5540e-e5dd-11e5-8482-ac72891c3257,,
+34,atmos.rlus.tavg-u-hxy-u.mon.glb,mon,atmos,surface_upwelling_longwave_flux_in_air,W m-2,area: time: mean,area: areacella,Surface Upwelling Longwave Radiation,"The surface called ""surface"" means the lower boundary of the atmosphere. ""longwave"" means longwave radiation. Upwelling radiation is radiation from below. It does not mean ""net upward"". When thought of as being incident on a surface, a radiative flux is sometimes called ""irradiance"". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called ""vector irradiance"". In accordance with common usage in geophysical disciplines, ""flux"" implies per unit area, called ""flux density"" in physics.",,longitude latitude time,rlus,real,up,XY-na,time-intv,Amon,rlus,rlus,tavg-u-hxy-u,rlus_tavg-u-hxy-u,glb,Amon.rlus,atmos.rlus.tavg-u-hxy-u.mon.glb,bab578d0-e5dd-11e5-8482-ac72891c3257,,
+35,atmos.rluscs.tavg-u-hxy-u.mon.glb,mon,atmos,surface_upwelling_longwave_flux_assuming_clear_sky,W m-2,area: time: mean,area: areacella,Surface Upwelling Clear-Sky Longwave Radiation,Surface Upwelling Clear-sky Longwave Radiation,,longitude latitude time,rluscs,real,up,XY-na,time-intv,Amon,rluscs,rluscs,tavg-u-hxy-u,rluscs_tavg-u-hxy-u,glb,Amon.rluscs,atmos.rluscs.tavg-u-hxy-u.mon.glb,80ab71f6-a698-11ef-914a-613c0433d878,,
+36,atmos.rlut.tavg-u-hxy-u.mon.glb,mon,atmos,toa_outgoing_longwave_flux,W m-2,area: time: mean,area: areacella,TOA Outgoing Longwave Radiation,at the top of the atmosphere (to be compared with satellite measurements),,longitude latitude time,rlut,real,up,XY-na,time-intv,Amon,rlut,rlut,tavg-u-hxy-u,rlut_tavg-u-hxy-u,glb,Amon.rlut,atmos.rlut.tavg-u-hxy-u.mon.glb,bab5aad0-e5dd-11e5-8482-ac72891c3257,,
+37,atmos.rlutcs.tavg-u-hxy-u.mon.glb,mon,atmos,toa_outgoing_longwave_flux_assuming_clear_sky,W m-2,area: time: mean,area: areacella,TOA Outgoing Clear-Sky Longwave Radiation,Upwelling clear-sky longwave radiation at top of atmosphere,,longitude latitude time,rlutcs,real,up,XY-na,time-intv,Amon,rlutcs,rlutcs,tavg-u-hxy-u,rlutcs_tavg-u-hxy-u,glb,Amon.rlutcs,atmos.rlutcs.tavg-u-hxy-u.mon.glb,bab5bcdc-e5dd-11e5-8482-ac72891c3257,,
+38,atmos.rsds.tavg-u-hxy-u.day.glb,day,atmos,surface_downwelling_shortwave_flux_in_air,W m-2,area: time: mean,area: areacella,Surface Downwelling Shortwave Radiation,Surface solar irradiance for UV calculations.,,longitude latitude time,rsds,real,down,XY-na,time-intv,day,rsds,rsds,tavg-u-hxy-u,rsds_tavg-u-hxy-u,glb,day.rsds,atmos.rsds.tavg-u-hxy-u.day.glb,bab5ecd4-e5dd-11e5-8482-ac72891c3257,,
+39,atmos.rsds.tavg-u-hxy-u.mon.glb,mon,atmos,surface_downwelling_shortwave_flux_in_air,W m-2,area: time: mean,area: areacella,Surface Downwelling Shortwave Radiation,Surface solar irradiance for UV calculations.,,longitude latitude time,rsds,real,down,XY-na,time-intv,Amon,rsds,rsds,tavg-u-hxy-u,rsds_tavg-u-hxy-u,glb,Amon.rsds,atmos.rsds.tavg-u-hxy-u.mon.glb,bab5e1b2-e5dd-11e5-8482-ac72891c3257,,
+40,atmos.rsdscs.tavg-u-hxy-u.mon.glb,mon,atmos,surface_downwelling_shortwave_flux_in_air_assuming_clear_sky,W m-2,area: time: mean,area: areacella,Surface Downwelling Clear-Sky Shortwave Radiation,Surface solar irradiance clear sky for UV calculations,,longitude latitude time,rsdscs,real,down,XY-na,time-intv,Amon,rsdscs,rsdscs,tavg-u-hxy-u,rsdscs_tavg-u-hxy-u,glb,Amon.rsdscs,atmos.rsdscs.tavg-u-hxy-u.mon.glb,bab607c8-e5dd-11e5-8482-ac72891c3257,,
+41,atmos.rsdt.tavg-u-hxy-u.mon.glb,mon,atmos,toa_incoming_shortwave_flux,W m-2,area: time: mean,area: areacella,TOA Incident Shortwave Radiation,at the top of the atmosphere,,longitude latitude time,rsdt,real,down,XY-na,time-intv,Amon,rsdt,rsdt,tavg-u-hxy-u,rsdt_tavg-u-hxy-u,glb,Amon.rsdt,atmos.rsdt.tavg-u-hxy-u.mon.glb,bab6219a-e5dd-11e5-8482-ac72891c3257,,
+42,atmos.rsus.tavg-u-hxy-u.mon.glb,mon,atmos,surface_upwelling_shortwave_flux_in_air,W m-2,area: time: mean,area: areacella,Surface Upwelling Shortwave Radiation,"The surface called ""surface"" means the lower boundary of the atmosphere. ""shortwave"" means shortwave radiation. Upwelling radiation is radiation from below. It does not mean ""net upward"". When thought of as being incident on a surface, a radiative flux is sometimes called ""irradiance"". In addition, it is identical with the quantity measured by a cosine-collector light-meter and sometimes called ""vector irradiance"". In accordance with common usage in geophysical disciplines, ""flux"" implies per unit area, called ""flux density"" in physics.",,longitude latitude time,rsus,real,up,XY-na,time-intv,Amon,rsus,rsus,tavg-u-hxy-u,rsus_tavg-u-hxy-u,glb,Amon.rsus,atmos.rsus.tavg-u-hxy-u.mon.glb,bab6537c-e5dd-11e5-8482-ac72891c3257,,
+43,atmos.rsuscs.tavg-u-hxy-u.mon.glb,mon,atmos,surface_upwelling_shortwave_flux_in_air_assuming_clear_sky,W m-2,area: time: mean,area: areacella,Surface Upwelling Clear-Sky Shortwave Radiation,Surface Upwelling Clear-sky Shortwave Radiation,,longitude latitude time,rsuscs,real,up,XY-na,time-intv,Amon,rsuscs,rsuscs,tavg-u-hxy-u,rsuscs_tavg-u-hxy-u,glb,Amon.rsuscs,atmos.rsuscs.tavg-u-hxy-u.mon.glb,bab670b4-e5dd-11e5-8482-ac72891c3257,,
+44,atmos.rsut.tavg-u-hxy-u.mon.glb,mon,atmos,toa_outgoing_shortwave_flux,W m-2,area: time: mean,area: areacella,TOA Outgoing Shortwave Radiation,at the top of the atmosphere,,longitude latitude time,rsut,real,up,XY-na,time-intv,Amon,rsut,rsut,tavg-u-hxy-u,rsut_tavg-u-hxy-u,glb,Amon.rsut,atmos.rsut.tavg-u-hxy-u.mon.glb,bab68ebe-e5dd-11e5-8482-ac72891c3257,,
+45,atmos.rsutcs.tavg-u-hxy-u.mon.glb,mon,atmos,toa_outgoing_shortwave_flux_assuming_clear_sky,W m-2,area: time: mean,area: areacella,TOA Outgoing Clear-Sky Shortwave Radiation,Calculated in the absence of clouds.,,longitude latitude time,rsutcs,real,up,XY-na,time-intv,Amon,rsutcs,rsutcs,tavg-u-hxy-u,rsutcs_tavg-u-hxy-u,glb,Amon.rsutcs,atmos.rsutcs.tavg-u-hxy-u.mon.glb,bab69c06-e5dd-11e5-8482-ac72891c3257,,
+46,atmos.sfcWind.tavg-h10m-hxy-u.day.glb,day,atmos,wind_speed,m s-1,area: time: mean,area: areacella,Near-Surface Wind Speed,"near-surface (usually, 10 meters) wind speed.",normally report this at 10 meters above the surface,longitude latitude time height10m,sfcWind,real,,XY-na,time-intv,day,sfcWind,sfcWind,tavg-h10m-hxy-u,sfcWind_tavg-h10m-hxy-u,glb,day.sfcWind,atmos.sfcWind.tavg-h10m-hxy-u.day.glb,bab6fe58-e5dd-11e5-8482-ac72891c3257,,
+47,atmos.sfcWind.tavg-h10m-hxy-u.mon.glb,mon,atmos,wind_speed,m s-1,area: time: mean,area: areacella,Near-Surface Wind Speed,"This is the mean of the speed, not the speed computed from the mean u and v components of wind","normally, the the wind component should be reported at the 10 meter height",longitude latitude time height10m,sfcWind,real,,XY-na,time-intv,Amon,sfcWind,sfcWind,tavg-h10m-hxy-u,sfcWind_tavg-h10m-hxy-u,glb,Amon.sfcWind,atmos.sfcWind.tavg-h10m-hxy-u.mon.glb,bab6f494-e5dd-11e5-8482-ac72891c3257,,
+48,atmos.sftlf.ti-u-hxy-u.fx.glb,fx,atmos,land_area_fraction,%,area: mean,area: areacella,Percentage of the Grid Cell Occupied by Land (Including Lakes),Percentage of horizontal area occupied by land.,"For atmospheres with more than 1 mesh (e.g., staggered grids), report areas that apply to surface vertical fluxes of energy.",longitude latitude,sftlf,real,,XY-na,None,fx,sftlf,sftlf,ti-u-hxy-u,sftlf_ti-u-hxy-u,glb,fx.sftlf,atmos.sftlf.ti-u-hxy-u.fx.glb,bab742c8-e5dd-11e5-8482-ac72891c3257,,
+49,atmos.ta.tavg-p19-hxy-air.day.glb,day,atmos,air_temperature,K,area: time: mean where air,area: areacella,Air Temperature,Air Temperature,"CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude plev8 time CMIP7:longitude latitude plev19 time, CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: time: mean where air,",longitude latitude plev19 time,ta,real,,XY-P19,time-intv,day,ta,ta,tavg-p19-hxy-air,ta_tavg-p19-hxy-air,glb,day.ta,atmos.ta.tavg-p19-hxy-air.day.glb,bab902e8-e5dd-11e5-8482-ac72891c3257,,
+50,atmos.ta.tavg-p19-hxy-air.mon.glb,mon,atmos,air_temperature,K,area: time: mean where air,area: areacella,Air Temperature,Air Temperature,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: time: mean where air,",longitude latitude plev19 time,ta,real,,XY-P19,time-intv,Amon,ta,ta,tavg-p19-hxy-air,ta_tavg-p19-hxy-air,glb,Amon.ta,atmos.ta.tavg-p19-hxy-air.mon.glb,bab8fa0a-e5dd-11e5-8482-ac72891c3257,,
+51,atmos.ta.tpt-p3-hxy-air.6hr.glb,6hr,atmos,air_temperature,K,area: mean where air time: point,area: areacella,Air Temperature,Air Temperature,"On the following pressure levels: 850, 500, 250 hPa
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean time: point CMIP7:area: mean where air time: point,",longitude latitude plev3 time1,ta,real,,XY-P3,time-point,6hrPlevPt,ta,ta,tpt-p3-hxy-air,ta_tpt-p3-hxy-air,glb,6hrPlevPt.ta,atmos.ta.tpt-p3-hxy-air.6hr.glb,6a35d178-aa6a-11e6-9736-5404a60d96b5,,
+52,atmos.tas.tavg-h2m-hxy-u.day.glb,day,atmos,air_temperature,K,area: time: mean,area: areacella,Near-Surface Air Temperature,"near-surface (usually, 2 meter) air temperature",normally report this at 2 meters above the surface,longitude latitude time height2m,tas,real,,XY-na,time-intv,day,tas,tas,tavg-h2m-hxy-u,tas_tavg-h2m-hxy-u,glb,day.tas,atmos.tas.tavg-h2m-hxy-u.day.glb,bab928ae-e5dd-11e5-8482-ac72891c3257,,
+53,atmos.tas.tavg-h2m-hxy-u.mon.glb,mon,atmos,air_temperature,K,area: time: mean,area: areacella,Near-Surface Air Temperature,"near-surface (usually, 2 meter) air temperature",normally report this at 2 meters above the surface,longitude latitude time height2m,tas,real,,XY-na,time-intv,Amon,tas,tas,tavg-h2m-hxy-u,tas_tavg-h2m-hxy-u,glb,Amon.tas,atmos.tas.tavg-h2m-hxy-u.mon.glb,bab9237c-e5dd-11e5-8482-ac72891c3257,,
+54,atmos.tas.tmax-h2m-hxy-u.day.glb,day,atmos,air_temperature,K,area: mean time: maximum,area: areacella,Daily Maximum Near-Surface Air Temperature,"maximum near-surface (usually, 2 meter) air temperature (add cell_method attribute ""time: max"")",normally report this at 2 meters above the surface,longitude latitude time height2m,tas,real,,XY-na,time-intv,day,tasmax,tas,tmax-h2m-hxy-u,tas_tmax-h2m-hxy-u,glb,day.tasmax,atmos.tas.tmax-h2m-hxy-u.day.glb,bab94a50-e5dd-11e5-8482-ac72891c3257,,
+55,atmos.tas.tmaxavg-h2m-hxy-u.mon.glb,mon,atmos,air_temperature,K,area: mean time: maximum within days time: mean over days,area: areacella,Daily Maximum Near-Surface Air Temperature,monthly mean of the daily-maximum near-surface air temperature.,"Normally, this should be reported at the 2 meter height. CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude time height2m CMIP7:longitude latitude time4 height2m,",longitude latitude time4 height2m,tas,real,,XY-na,monthly-mean-daily-stat,Amon,tasmax,tas,tmaxavg-h2m-hxy-u,tas_tmaxavg-h2m-hxy-u,glb,Amon.tasmax,atmos.tas.tmaxavg-h2m-hxy-u.mon.glb,bab942a8-e5dd-11e5-8482-ac72891c3257,,
+56,atmos.tas.tmin-h2m-hxy-u.day.glb,day,atmos,air_temperature,K,area: mean time: minimum,area: areacella,Daily Minimum Near-Surface Air Temperature,"minimum near-surface (usually, 2 meter) air temperature (add cell_method attribute ""time: min"")",normally report this at 2 meters above the surface,longitude latitude time height2m,tas,real,,XY-na,time-intv,day,tasmin,tas,tmin-h2m-hxy-u,tas_tmin-h2m-hxy-u,glb,day.tasmin,atmos.tas.tmin-h2m-hxy-u.day.glb,bab95fae-e5dd-11e5-8482-ac72891c3257,,
+57,atmos.tas.tminavg-h2m-hxy-u.mon.glb,mon,atmos,air_temperature,K,area: mean time: minimum within days time: mean over days,area: areacella,Daily Minimum Near-Surface Air Temperature,monthly mean of the daily-minimum near-surface air temperature.,"Normally, this should be reported at the 2 meter height. CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude time height2m CMIP7:longitude latitude time4 height2m,",longitude latitude time4 height2m,tas,real,,XY-na,monthly-mean-daily-stat,Amon,tasmin,tas,tminavg-h2m-hxy-u,tas_tminavg-h2m-hxy-u,glb,Amon.tasmin,atmos.tas.tminavg-h2m-hxy-u.mon.glb,bab955ea-e5dd-11e5-8482-ac72891c3257,,
+58,atmos.tas.tpt-h2m-hxy-u.3hr.glb,3hr,atmos,air_temperature,K,area: mean time: point,area: areacella,Near-Surface Air Temperature,This is sampled synoptically.,normally report this at 2 meters above the surface,longitude latitude time1 height2m,tas,real,,XY-na,time-point,3hr,tas,tas,tpt-h2m-hxy-u,tas_tpt-h2m-hxy-u,glb,3hr.tas,atmos.tas.tpt-h2m-hxy-u.3hr.glb,bab91b20-e5dd-11e5-8482-ac72891c3257,,
+59,atmos.tauu.tavg-u-hxy-u.mon.glb,mon,atmos,surface_downward_eastward_stress,Pa,area: time: mean,area: areacella,Surface Downward Eastward Wind Stress,Downward eastward wind stress at the surface,,longitude latitude time,tauu,real,down,XY-na,time-intv,Amon,tauu,tauu,tavg-u-hxy-u,tauu_tavg-u-hxy-u,glb,Amon.tauu,atmos.tauu.tavg-u-hxy-u.mon.glb,bab96cc4-e5dd-11e5-8482-ac72891c3257,,
+60,atmos.tauv.tavg-u-hxy-u.mon.glb,mon,atmos,surface_downward_northward_stress,Pa,area: time: mean,area: areacella,Surface Downward Northward Wind Stress,Downward northward wind stress at the surface,,longitude latitude time,tauv,real,down,XY-na,time-intv,Amon,tauv,tauv,tavg-u-hxy-u,tauv_tavg-u-hxy-u,glb,Amon.tauv,atmos.tauv.tavg-u-hxy-u.mon.glb,bab9888a-e5dd-11e5-8482-ac72891c3257,,
+61,atmos.ts.tavg-u-hxy-u.mon.glb,mon,atmos,surface_temperature,K,area: time: mean,area: areacella,Surface Temperature,Surface temperature (skin for open ocean),,longitude latitude time,ts,real,,XY-na,time-intv,Amon,ts,ts,tavg-u-hxy-u,ts_tavg-u-hxy-u,glb,Amon.ts,atmos.ts.tavg-u-hxy-u.mon.glb,babaef0e-e5dd-11e5-8482-ac72891c3257,,
+62,atmos.ua.tavg-p19-hxy-air.day.glb,day,atmos,eastward_wind,m s-1,area: time: mean where air,area: areacella,Eastward Wind,Zonal wind (positive in a eastward direction).,"CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude plev8 time CMIP7:longitude latitude plev19 time, CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: time: mean where air,",longitude latitude plev19 time,ua,real,,XY-P19,time-intv,day,ua,ua,tavg-p19-hxy-air,ua_tavg-p19-hxy-air,glb,day.ua,atmos.ua.tavg-p19-hxy-air.day.glb,babb5084-e5dd-11e5-8482-ac72891c3257,,
+63,atmos.ua.tavg-p19-hxy-air.mon.glb,mon,atmos,eastward_wind,m s-1,area: time: mean where air,area: areacella,Eastward Wind,Zonal wind (positive in a eastward direction).,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: time: mean where air,",longitude latitude plev19 time,ua,real,,XY-P19,time-intv,Amon,ua,ua,tavg-p19-hxy-air,ua_tavg-p19-hxy-air,glb,Amon.ua,atmos.ua.tavg-p19-hxy-air.mon.glb,babb4b34-e5dd-11e5-8482-ac72891c3257,,
+64,atmos.ua.tpt-p3-hxy-air.6hr.glb,6hr,atmos,eastward_wind,m s-1,area: mean where air time: point,area: areacella,Eastward Wind,Zonal wind (positive in a eastward direction).,"On the following pressure levels: 850, 500, 250 hPa. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean time: point CMIP7:area: mean where air time: point,",longitude latitude plev3 time1,ua,real,,XY-P3,time-point,6hrPlevPt,ua,ua,tpt-p3-hxy-air,ua_tpt-p3-hxy-air,glb,6hrPlevPt.ua,atmos.ua.tpt-p3-hxy-air.6hr.glb,8bae55ba-4a5b-11e6-9cd2-ac72891c3257,,
+65,atmos.uas.tavg-h10m-hxy-u.day.glb,day,atmos,eastward_wind,m s-1,area: time: mean,area: areacella,Eastward Near-Surface Wind,"Eastward component of the near-surface (usually, 10 meters) wind",normally report this at 10 meters above the surface,longitude latitude time height10m,uas,real,,XY-na,time-intv,day,uas,uas,tavg-h10m-hxy-u,uas_tavg-h10m-hxy-u,glb,day.uas,atmos.uas.tavg-h10m-hxy-u.day.glb,babb6cea-e5dd-11e5-8482-ac72891c3257,,
+66,atmos.uas.tavg-h10m-hxy-u.mon.glb,mon,atmos,eastward_wind,m s-1,area: time: mean,area: areacella,Eastward Near-Surface Wind,"Eastward component of the near-surface (usually, 10 meters) wind","normally, the the wind component should be reported at the 10 meter height",longitude latitude time height10m,uas,real,,XY-na,time-intv,Amon,uas,uas,tavg-h10m-hxy-u,uas_tavg-h10m-hxy-u,glb,Amon.uas,atmos.uas.tavg-h10m-hxy-u.mon.glb,babb67c2-e5dd-11e5-8482-ac72891c3257,,
+67,atmos.uas.tpt-h10m-hxy-u.3hr.glb,3hr,atmos,eastward_wind,m s-1,area: mean time: point,area: areacella,Eastward Near-Surface Wind,This is sampled synoptically.,"CHANGE SINCE CMIP6: compound name,",longitude latitude time1 height10m,uas,real,,XY-na,time-point,3hrPt,uas,uas,tpt-h10m-hxy-u,uas_tpt-h10m-hxy-u,glb,3hrPt.uas,atmos.uas.tpt-h10m-hxy-u.3hr.glb,babb5db8-e5dd-11e5-8482-ac72891c3257,,
+68,atmos.va.tavg-p19-hxy-air.day.glb,day,atmos,northward_wind,m s-1,area: time: mean where air,area: areacella,Northward Wind,Meridional wind (positive in a northward direction).,"CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude plev8 time CMIP7:longitude latitude plev19 time, CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: time: mean where air,",longitude latitude plev19 time,va,real,,XY-P19,time-intv,day,va,va,tavg-p19-hxy-air,va_tavg-p19-hxy-air,glb,day.va,atmos.va.tavg-p19-hxy-air.day.glb,babbbbe6-e5dd-11e5-8482-ac72891c3257,,
+69,atmos.va.tavg-p19-hxy-air.mon.glb,mon,atmos,northward_wind,m s-1,area: time: mean where air,area: areacella,Northward Wind,Meridional wind (positive in a northward direction).,,longitude latitude plev19 time,va,real,,XY-P19,time-intv,Amon,va,va,tavg-p19-hxy-air,va_tavg-p19-hxy-air,glb,Amon.va,atmos.va.tavg-p19-hxy-air.mon.glb,babbb25e-e5dd-11e5-8482-ac72891c3257,,
+70,atmos.va.tpt-p3-hxy-air.6hr.glb,6hr,atmos,northward_wind,m s-1,area: mean where air time: point,area: areacella,Northward Wind,Meridional wind (positive in a northward direction).,"on the following pressure levels: 850, 500, 250 hPa. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean time: point CMIP7:area: mean where air time: point,",longitude latitude plev3 time1,va,real,,XY-P3,time-point,6hrPlevPt,va,va,tpt-p3-hxy-air,va_tpt-p3-hxy-air,glb,6hrPlevPt.va,atmos.va.tpt-p3-hxy-air.6hr.glb,8bae5aba-4a5b-11e6-9cd2-ac72891c3257,,
+71,atmos.vas.tavg-h10m-hxy-u.day.glb,day,atmos,northward_wind,m s-1,area: time: mean,area: areacella,Northward Near-Surface Wind,Northward component of the near surface wind,normally report this at 10 meters above the surface,longitude latitude time height10m,vas,real,,XY-na,time-intv,day,vas,vas,tavg-h10m-hxy-u,vas_tavg-h10m-hxy-u,glb,day.vas,atmos.vas.tavg-h10m-hxy-u.day.glb,babbd25c-e5dd-11e5-8482-ac72891c3257,,
+72,atmos.vas.tavg-h10m-hxy-u.mon.glb,mon,atmos,northward_wind,m s-1,area: time: mean,area: areacella,Northward Near-Surface Wind,Northward component of the near surface wind,"normally, the the wind component should be reported at the 10 meter height",longitude latitude time height10m,vas,real,,XY-na,time-intv,Amon,vas,vas,tavg-h10m-hxy-u,vas_tavg-h10m-hxy-u,glb,Amon.vas,atmos.vas.tavg-h10m-hxy-u.mon.glb,babbcd34-e5dd-11e5-8482-ac72891c3257,,
+73,atmos.vas.tpt-h10m-hxy-u.3hr.glb,3hr,atmos,northward_wind,m s-1,area: mean time: point,area: areacella,Northward Near-Surface Wind,This is sampled synoptically.,"CHANGE SINCE CMIP6: compound name,",longitude latitude time1 height10m,vas,real,,XY-na,time-point,3hrPt,vas,vas,tpt-h10m-hxy-u,vas_tpt-h10m-hxy-u,glb,3hrPt.vas,atmos.vas.tpt-h10m-hxy-u.3hr.glb,babbdec8-e5dd-11e5-8482-ac72891c3257,,
+74,atmos.wap.tavg-p19-hxy-air.mon.glb,mon,atmos,lagrangian_tendency_of_air_pressure,Pa s-1,area: time: mean where air,area: areacella,Omega (=dp/dt),"commonly referred to as ""omega"", this represents the vertical component of velocity in pressure coordinates (positive down)","CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: time: mean where air,",longitude latitude plev19 time,wap,real,,XY-P19,time-intv,Amon,wap,wap,tavg-p19-hxy-air,wap_tavg-p19-hxy-air,glb,Amon.wap,atmos.wap.tavg-p19-hxy-air.mon.glb,babd0906-e5dd-11e5-8482-ac72891c3257,,
+75,atmos.wap.tavg-p19-hxy-u.day.glb,day,atmos,lagrangian_tendency_of_air_pressure,Pa s-1,time: mean,area: areacella,Omega (=dp/dt),"commonly referred to as ""omega"", this represents the vertical component of velocity in pressure coordinates (positive down)","CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude plev8 time CMIP7:longitude latitude plev19 time,",longitude latitude plev19 time,wap,real,,XY-P19,time-intv,day,wap,wap,tavg-p19-hxy-u,wap_tavg-p19-hxy-u,glb,day.wap,atmos.wap.tavg-p19-hxy-u.day.glb,babd0e56-e5dd-11e5-8482-ac72891c3257,,
+76,atmos.zg.tavg-p19-hxy-air.day.glb,day,atmos,geopotential_height,m,area: time: mean where air,area: areacella,Geopotential Height,"Geopotential is the sum of the specific gravitational potential energy relative to the geoid and the specific centripetal potential energy. Geopotential height is the geopotential divided by the standard acceleration due to gravity. It is numerically similar to the altitude (or geometric height) and not to the quantity with standard name height, which is relative to the surface.","CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude plev8 time CMIP7:longitude latitude plev19 time, CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: time: mean where air,",longitude latitude plev19 time,zg,real,,XY-P19,time-intv,day,zg,zg,tavg-p19-hxy-air,zg_tavg-p19-hxy-air,glb,day.zg,atmos.zg.tavg-p19-hxy-air.day.glb,babda032-e5dd-11e5-8482-ac72891c3257,,
+77,atmos.zg.tavg-p19-hxy-air.mon.glb,mon,atmos,geopotential_height,m,area: time: mean where air,area: areacella,Geopotential Height,"Geopotential is the sum of the specific gravitational potential energy relative to the geoid and the specific centripetal potential energy. Geopotential height is the geopotential divided by the standard acceleration due to gravity. It is numerically similar to the altitude (or geometric height) and not to the quantity with standard name height, which is relative to the surface.","CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: time: mean where air,",longitude latitude plev19 time,zg,real,,XY-P19,time-intv,Amon,zg,zg,tavg-p19-hxy-air,zg_tavg-p19-hxy-air,glb,Amon.zg,atmos.zg.tavg-p19-hxy-air.mon.glb,babd9ace-e5dd-11e5-8482-ac72891c3257,,
\ No newline at end of file
diff --git a/awi-esm3-veg-hr-variables/core_atm/cmip7_atmos_variables_todo.md b/awi-esm3-veg-hr-variables/core_atm/cmip7_atmos_variables_todo.md
new file mode 100644
index 00000000..eb5da2f5
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/core_atm/cmip7_atmos_variables_todo.md
@@ -0,0 +1,189 @@
+# CMIP7 Core Atmosphere Variables — Rule Implementation TODO
+
+Variables from `cmip7_all_core_variables_atmos.csv` (76 rows, 45 unique CMOR variables).
+76 pycmor rules implemented — one per CSV row.
+
+XIOS field definitions: `field_def_cmip7.xml`
+Current output config: `file_def_oifs_cmip7_spinup.xml.j2`
+Pycmor rules: `cmip7_awiesm3-veg-hr_atmos.yaml`
+
+## Key conversion patterns
+
+IFS accumulated fields (unit J m-2 or m) need **deaccumulation** to become fluxes (W m-2 or kg m-2 s-1).
+With XIOS `freq_op="6h"` and `operation="average"`, deaccumulation = divide by 21600 s.
+For sub-daily: 3hr → divide by 10800, 1hr → divide by 3600.
+XIOS expressions in field_def_cmip7.xml do deaccum/unit-conversion at output time.
+Pycmor rules then read the CMOR-ready output and just add metadata + save.
+
+---
+
+## Monthly 2D surface (Amon)
+
+### Direct or near-direct (raw IFS fields, units already match)
+
+- [x] **tas** — Near-Surface Air Temperature (`K`, Amon) — from `2t`
+- [x] **ts** — Surface Temperature (`K`, Amon) — from `skt`
+- [x] **psl** — Sea Level Pressure (`Pa`, Amon) — from `msl`
+- [x] **ps** — Surface Air Pressure (`Pa`, Amon) — from `sp`
+- [x] **prw** — Precipitable Water (`kg m-2`, Amon) — from `tcwv`
+- [x] **clivi** — Ice Water Path (`kg m-2`, Amon) — from `tciw`
+- [x] **clwvi** — Condensed Water Path (`kg m-2`, Amon) — pycmor pipeline: `tclw + tciw`
+- [x] **uas** — Eastward Near-Surface Wind (`m s-1`, Amon) — from `10u`
+- [x] **vas** — Northward Near-Surface Wind (`m s-1`, Amon) — from `10v`
+
+### XIOS-converted (CMOR-ready from derived fields)
+
+- [x] **clt** — Total Cloud Cover (`%`, Amon) — XIOS expr: `tcc*100`
+- [x] **pr** — Precipitation (`kg m-2 s-1`, Amon) — XIOS expr: `tp*1000/21600`
+- [x] **prc** — Convective Precipitation (`kg m-2 s-1`, Amon) — XIOS expr: `cp*1000/21600`
+- [x] **prsn** — Snowfall Flux (`kg m-2 s-1`, Amon) — XIOS expr: `sf*1000/21600`
+
+### Radiation — TOA (XIOS-converted)
+
+- [x] **rsdt** — TOA Incoming Shortwave (`W m-2`, Amon) — XIOS expr: `tisr/21600`
+- [x] **rsut** — TOA Outgoing Shortwave (`W m-2`, Amon) — XIOS expr: `(tisr-tsr)/21600`
+- [x] **rsutcs** — TOA Outgoing SW Clear-Sky (`W m-2`, Amon) — XIOS expr: `(tisr-tsrc)/21600`
+- [x] **rlut** — TOA Outgoing Longwave (`W m-2`, Amon) — XIOS expr: `-ttr/21600`
+- [x] **rlutcs** — TOA Outgoing LW Clear-Sky (`W m-2`, Amon) — XIOS expr: `-ttrc/21600`
+
+### Radiation — Surface (XIOS-converted)
+
+- [x] **rsds** — Surface Downwelling Shortwave (`W m-2`, Amon) — XIOS expr: `ssrd/21600`
+- [x] **rsus** — Surface Upwelling Shortwave (`W m-2`, Amon) — XIOS expr: `(ssrd-ssr)/21600`
+- [x] **rlds** — Surface Downwelling Longwave (`W m-2`, Amon) — XIOS expr: `strd/21600`
+- [x] **rlus** — Surface Upwelling Longwave (`W m-2`, Amon) — XIOS expr: `(strd-str)/21600`
+
+### Radiation — Surface clear-sky (XIOS-converted, requires ssrdc/strdc in model output)
+
+- [x] **rsdscs** — Surface Downwelling SW Clear-Sky (`W m-2`, Amon) — XIOS expr: `ssrdc/21600`
+- [x] **rsuscs** — Surface Upwelling SW Clear-Sky (`W m-2`, Amon) — XIOS expr: `(ssrdc-ssrc)/21600`
+- [x] **rldscs** — Surface Downwelling LW Clear-Sky (`W m-2`, Amon) — XIOS expr: `strdc/21600`
+- [x] **rluscs** — Surface Upwelling LW Clear-Sky (`W m-2`, Amon) — XIOS expr: `(strdc-strc)/21600`
+
+### Turbulent fluxes (XIOS-converted, sign-flipped)
+
+- [x] **hfls** — Surface Upward Latent Heat Flux (`W m-2`, Amon) — XIOS expr: `-slhf/21600`
+- [x] **hfss** — Surface Upward Sensible Heat Flux (`W m-2`, Amon) — XIOS expr: `-sshf/21600`
+
+### Surface stress (XIOS-converted)
+
+- [x] **tauu** — Eastward Surface Stress (`Pa`, Amon) — XIOS expr: `ewss/21600`
+- [x] **tauv** — Northward Surface Stress (`Pa`, Amon) — XIOS expr: `nsss/21600`
+
+### Computed via pycmor pipeline
+
+- [x] **sfcWind** — Near-Surface Wind Speed (`m s-1`, Amon) — pycmor pipeline: `sqrt(10u² + 10v²)`
+- [x] **hurs** — Near-Surface Relative Humidity (`%`, Amon) — pycmor pipeline: Magnus formula from `2t` + `2d`
+- [x] **huss** — Near-Surface Specific Humidity (`1`, Amon) — pycmor pipeline: Tetens formula from `2d` + `sp`
+- [x] **sftlf** — Land Area Fraction (`%`, fx) — pycmor pipeline: `lsm × 100`
+
+### Monthly mean of daily extremes
+
+- [x] **tasmax_mon** — Monthly Mean of Daily Max Temperature (`K`, Amon) — read daily max, time-average
+- [x] **tasmin_mon** — Monthly Mean of Daily Min Temperature (`K`, Amon) — read daily min, time-average
+
+## Monthly 3D on pressure levels (Amon, plev19)
+
+- [x] **ta** — Air Temperature (`K`, Amon, plev19) — from `t_pl`
+- [x] **ua** — Eastward Wind (`m s-1`, Amon, plev19) — from `u_pl`
+- [x] **va** — Northward Wind (`m s-1`, Amon, plev19) — from `v_pl`
+- [x] **hus** — Specific Humidity (`1`, Amon, plev19) — from `q_pl`
+- [x] **wap** — Omega (`Pa s-1`, Amon, plev19) — from `w_pl` (unit fixed: was mislabeled m/s, is actually Pa/s)
+- [x] **zg** — Geopotential Height (`m`, Amon, plev19) — XIOS expr: `z_pl/9.80665`
+- [x] **hur** — Relative Humidity (`%`, Amon, plev19) — XIOS expr: `r_pl*100`
+
+## Monthly 3D on model levels (Amon, alevel)
+
+- [x] **cl** — Cloud Area Fraction (`%`, Amon, alevel) — XIOS expr: `cc*100` on `regular_ml`
+- [x] **cli** — Cloud Ice Content (`kg kg-1`, Amon, alevel) — from `ciwc` on `regular_ml`
+- [x] **clw** — Cloud Liquid Water (`kg kg-1`, Amon, alevel) — from `clwc` on `regular_ml`
+
+## Daily surface (day)
+
+### CMOR-ready from XIOS
+
+- [x] **clt** — Total Cloud Cover (`%`, day) — XIOS expr: `tcc*100`
+- [x] **rsds** — Surface Downwelling SW (`W m-2`, day) — XIOS expr: `ssrd/21600`
+- [x] **pr** — Precipitation (`kg m-2 s-1`, day) — XIOS expr: `tp*1000/21600`
+
+### Raw IFS daily
+
+- [x] **tas** — Near-Surface Air Temperature (`K`, day) — from `2t`
+- [x] **psl** — Sea Level Pressure (`Pa`, day) — from `msl`
+- [x] **ps** — Surface Air Pressure (`Pa`, day) — from `sp`
+- [x] **uas** — Eastward Near-Surface Wind (`m s-1`, day) — from `10u`
+- [x] **vas** — Northward Near-Surface Wind (`m s-1`, day) — from `10v`
+
+### Computed via pycmor pipeline
+
+- [x] **sfcWind** — Near-Surface Wind Speed (`m s-1`, day) — pycmor pipeline: `sqrt(10u² + 10v²)`
+- [x] **hurs** — Near-Surface Relative Humidity (`%`, day) — pycmor pipeline: Magnus formula
+- [x] **huss** — Near-Surface Specific Humidity (`1`, day) — pycmor pipeline: Tetens from `2d` + `sp`
+
+### Daily extremes (XIOS operation=max/min)
+
+- [x] **tasmax** — Daily Maximum Temperature (`K`, day) — XIOS `operation="maximum"` on `2t`
+- [x] **tasmin** — Daily Minimum Temperature (`K`, day) — XIOS `operation="minimum"` on `2t`
+
+## Daily 3D on pressure levels (day, plev19)
+
+- [x] **ta** — Air Temperature (`K`, day, plev19) — from `t_pl`
+- [x] **ua** — Eastward Wind (`m s-1`, day, plev19) — from `u_pl`
+- [x] **va** — Northward Wind (`m s-1`, day, plev19) — from `v_pl`
+- [x] **hus** — Specific Humidity (`1`, day, plev19) — from `q_pl`
+- [x] **wap** — Omega (`Pa s-1`, day, plev19) — from `w_pl`
+- [x] **zg** — Geopotential Height (`m`, day, plev19) — XIOS expr: `z_pl/9.80665`
+- [x] **hur** — Relative Humidity (`%`, day, plev19) — XIOS expr: `r_pl*100`
+
+## Sub-daily (3hr, 6hr, 1hr)
+
+### 3-hourly instantaneous (3hrPt)
+
+- [x] **tas** (3hrPt) — from `2t`, `operation="instant"`, `output_freq="3h"`
+- [x] **uas** (3hrPt) — from `10u`, `operation="instant"`, `output_freq="3h"`
+- [x] **vas** (3hrPt) — from `10v`, `operation="instant"`, `output_freq="3h"`
+- [x] **huss** (3hrPt) — pycmor pipeline: Tetens from `2d` + `sp` at 3h instant
+
+### 3-hourly averaged
+
+- [x] **pr** (3hr) — XIOS expr: `tp*1000/10800` with `freq_op="3h"`
+
+### 1-hourly averaged
+
+- [x] **pr** (1hr) — XIOS expr: `tp*1000/3600` with `freq_op="1h"`
+
+### 6-hourly
+
+- [x] **hurs** (6hr) — pycmor pipeline: Magnus formula from `2t` + `2d` at 6h average
+- [x] **ta** (6hrPt, plev3) — from `t_pl` on `regular_pl3`, `operation="instant"`
+- [x] **ua** (6hrPt, plev3) — from `u_pl` on `regular_pl3`, `operation="instant"`
+- [x] **va** (6hrPt, plev3) — from `v_pl` on `regular_pl3`, `operation="instant"`
+
+---
+
+## Blockers / verification needed
+
+1. **ssrdc/strdc** — IFS params 228129/228130 (clear-sky downwelling). Fields added to field_def and file_def, but need to verify OIFS actually outputs them (check FullPos/XIOS coupling)
+2. **Model-level interpolation** — cl/cli/clw use `regular_ml` grid (interpolation from Gaussian to regular). Verify this works in practice and check computational cost
+3. **plev3 axis** — Added 3-level pressure axis (850/500/250 hPa) to axis_def.xml for 6hr ta/ua/va. Verify XIOS FullPos can interpolate to arbitrary pressure level sets
+
+## OIFS source code investigation (2026-04-06)
+
+### Available GRIB fields not yet used
+- **Transpiration** (`SURFTRANSPIRATIO` / GFP `CTP`) — already registered as accumulated flux in `cpg_dia.F90`. Can be requested via XIOS `field_def.xml` without source changes. Relevant for evspsblveg decomposition in lrcs_land
+
+### HTESSEL internals accessible via source changes
+- Bare soil evaporation, interception evaporation, frozen soil water — all computed internally but need GRIB field registration. See `../lrcs_land/cmip7_lrcs_land_todo.md` for details
+
+## Research findings
+
+- IFS `w_pl` is omega (Pa/s), not vertical velocity (m/s). Unit annotation in field_def was wrong — fixed
+- IFS has dedicated clear-sky downwelling fields: `ssrdc` (param 228129) and `strdc` (param 228130). No albedo assumption needed
+- IFS sign convention: sshf/slhf are downward-positive; CMIP wants upward → XIOS expressions negate
+- IFS accumulated fields reset every `freq_op` (6h). Division by 21600 converts J m-2 → W m-2
+- Precipitation: m water equiv → kg m-2 s-1 needs ×ρ_water/Δt (×1000/21600 for 6h, ×1000/10800 for 3h, ×1000/3600 for 1h)
+- 19 pressure levels already configured in axis_def.xml matching plev19
+- plev3 = 850, 500, 250 hPa — added to axis_def.xml and grid_def.xml
+- Model-level grid `regular_ml` already defined in grid_def.xml, just needed file_def output sections
+- Compound names from CSV: PL variables use `-air` suffix (e.g. `tavg-p19-hxy-air`) for ta/ua/va/wap/zg/hur monthly; surface vars use `-h2m` (tas) and `-h10m` (uas/vas)
+- For sub-daily accumulated fields, XIOS expressions need denominator matching freq_op (10800 for 3h, 3600 for 1h)
diff --git a/awi-esm3-veg-hr-variables/core_atm/cmip7_awiesm3-veg-hr_atmos.yaml b/awi-esm3-veg-hr-variables/core_atm/cmip7_awiesm3-veg-hr_atmos.yaml
new file mode 100644
index 00000000..510501c8
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/core_atm/cmip7_awiesm3-veg-hr_atmos.yaml
@@ -0,0 +1,768 @@
+# CMIP7 Core Atmosphere Variables — AWI-ESM3-VEG-HR
+# Generated from cmip7_all_core_variables_atmos.csv
+#
+# Unit conversions (deaccumulation, sign flips, fraction→%) are handled by
+# XIOS expressions in field_def_cmip7.xml at output time. Pycmor rules
+# just read the output, set CMOR metadata, and save.
+
+general:
+ name: "awiesm3-cmip7-core-atmos"
+ cmor_version: "CMIP7"
+ mip: "CMIP"
+ CMIP7_DReq_metadata: "/home/a/a270092/.cache/pycmor/cmip7_metadata/v1.2.2.2/full_metadata.json"
+
+pycmor:
+ warn_on_no_rule: False
+ dask_cluster: "slurm"
+ dask_cluster_scaling_mode: "fixed"
+ dask_cluster_scaling_fixed_jobs: 1
+
+jobqueue:
+ slurm:
+ name: pycmor-worker
+ queue: compute
+ account: bb1469
+ cores: 16
+ memory: 256GB
+ walltime: '00:30:00'
+
+pipelines:
+ - name: sfcwind_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_sfcwind
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ - name: hurs_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_hurs
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ - name: huss_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_huss
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ - name: clwvi_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_clwvi
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ - name: scale_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:scale_by_constant
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+inherit:
+ data_path: &dp /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/oifs
+ source_id: AWI-ESM-3
+ institution_id: AWI
+ experiment_id: picontrol
+ variant_label: r1i1p1f1
+ grid_label: gn
+ grid: "OpenIFS TCo319 reduced Gaussian, interpolated to 0.25deg regular grid"
+ nominal_resolution: "25 km"
+ institution: "Alfred Wegener Institute, Helmholtz Centre for Polar and Marine Research, Bremerhaven, Germany"
+ output_directory: ./cmorized_output/awiesm3
+
+rules:
+ # ============================================================
+ # Monthly 2D surface (Amon)
+ # ============================================================
+
+ # --- Radiation (TOA) ---
+
+ - name: rsdt
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_rsdt_mon_*.nc
+ compound_name: atmos.rsdt.tavg-u-hxy-u.mon.glb
+ model_variable: rsdt
+
+ - name: rsut
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_rsut_mon_*.nc
+ compound_name: atmos.rsut.tavg-u-hxy-u.mon.glb
+ model_variable: rsut
+
+ - name: rsutcs
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_rsutcs_mon_*.nc
+ compound_name: atmos.rsutcs.tavg-u-hxy-u.mon.glb
+ model_variable: rsutcs
+
+ - name: rlut
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_rlut_mon_*.nc
+ compound_name: atmos.rlut.tavg-u-hxy-u.mon.glb
+ model_variable: rlut
+
+ - name: rlutcs
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_rlutcs_mon_*.nc
+ compound_name: atmos.rlutcs.tavg-u-hxy-u.mon.glb
+ model_variable: rlutcs
+
+ # --- Radiation (surface, all-sky) ---
+
+ - name: rsds
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_rsds_mon_*.nc
+ compound_name: atmos.rsds.tavg-u-hxy-u.mon.glb
+ model_variable: rsds
+
+ - name: rsus
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_rsus_mon_*.nc
+ compound_name: atmos.rsus.tavg-u-hxy-u.mon.glb
+ model_variable: rsus
+
+ - name: rlds
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_rlds_mon_*.nc
+ compound_name: atmos.rlds.tavg-u-hxy-u.mon.glb
+ model_variable: rlds
+
+ - name: rlus
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_rlus_mon_*.nc
+ compound_name: atmos.rlus.tavg-u-hxy-u.mon.glb
+ model_variable: rlus
+
+ # --- Radiation (surface, clear-sky) — requires ssrdc/strdc in model output ---
+
+ - name: rsdscs
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_rsdscs_mon_*.nc
+ compound_name: atmos.rsdscs.tavg-u-hxy-u.mon.glb
+ model_variable: rsdscs
+
+ - name: rsuscs
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_rsuscs_mon_*.nc
+ compound_name: atmos.rsuscs.tavg-u-hxy-u.mon.glb
+ model_variable: rsuscs
+
+ - name: rldscs
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_rldscs_mon_*.nc
+ compound_name: atmos.rldscs.tavg-u-hxy-u.mon.glb
+ model_variable: rldscs
+
+ - name: rluscs
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_rluscs_mon_*.nc
+ compound_name: atmos.rluscs.tavg-u-hxy-u.mon.glb
+ model_variable: rluscs
+
+ # --- Turbulent fluxes ---
+
+ - name: hfls
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_hfls_mon_*.nc
+ compound_name: atmos.hfls.tavg-u-hxy-u.mon.glb
+ model_variable: hfls
+
+ - name: hfss
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_hfss_mon_*.nc
+ compound_name: atmos.hfss.tavg-u-hxy-u.mon.glb
+ model_variable: hfss
+
+ # --- Surface stress ---
+
+ - name: tauu
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_tauu_mon_*.nc
+ compound_name: atmos.tauu.tavg-u-hxy-u.mon.glb
+ model_variable: tauu
+
+ - name: tauv
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_tauv_mon_*.nc
+ compound_name: atmos.tauv.tavg-u-hxy-u.mon.glb
+ model_variable: tauv
+
+ # --- Precipitation ---
+
+ - name: pr
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_pr_mon_*.nc
+ compound_name: atmos.pr.tavg-u-hxy-u.mon.glb
+ model_variable: pr
+
+ - name: prc
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_prc_mon_*.nc
+ compound_name: atmos.prc.tavg-u-hxy-u.mon.glb
+ model_variable: prc
+
+ - name: prsn
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_prsn_mon_*.nc
+ compound_name: atmos.prsn.tavg-u-hxy-u.mon.glb
+ model_variable: prsn
+
+ # --- Cloud, humidity, temperature, pressure ---
+
+ - name: clt
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_clt_mon_*.nc
+ compound_name: atmos.clt.tavg-u-hxy-u.mon.glb
+ model_variable: clt
+
+ - name: tas
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1m_2t_1m_*.nc
+ compound_name: atmos.tas.tavg-h2m-hxy-u.mon.glb
+ model_variable: 2t
+
+ - name: ts
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1m_skt_1m_*.nc
+ compound_name: atmos.ts.tavg-u-hxy-u.mon.glb
+ model_variable: skt
+
+ - name: psl
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1m_msl_1m_*.nc
+ compound_name: atmos.psl.tavg-u-hxy-u.mon.glb
+ model_variable: msl
+
+ - name: ps
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1m_sp_1m_*.nc
+ compound_name: atmos.ps.tavg-u-hxy-u.mon.glb
+ model_variable: sp
+
+ - name: prw
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1m_tcwv_1m_*.nc
+ compound_name: atmos.prw.tavg-u-hxy-u.mon.glb
+ model_variable: tcwv
+
+ - name: clivi
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1m_tciw_1m_*.nc
+ compound_name: atmos.clivi.tavg-u-hxy-u.mon.glb
+ model_variable: tciw
+
+ - name: uas
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1m_10u_1m_*.nc
+ compound_name: atmos.uas.tavg-h10m-hxy-u.mon.glb
+ model_variable: 10u
+
+ - name: vas
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1m_10v_1m_*.nc
+ compound_name: atmos.vas.tavg-h10m-hxy-u.mon.glb
+ model_variable: 10v
+
+ # --- Computed variables (multi-input pipelines) ---
+
+ - name: sfcWind
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1m_10u_1m_*.nc
+ compound_name: atmos.sfcWind.tavg-h10m-hxy-u.mon.glb
+ model_variable: 10u
+ second_input_path: *dp
+ second_input_pattern: atm_remapped_1m_10v_1m_*.nc
+ second_variable: 10v
+ pipelines:
+ - sfcwind_pipeline
+
+ - name: hurs
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1m_2t_1m_*.nc
+ compound_name: atmos.hurs.tavg-h2m-hxy-u.mon.glb
+ model_variable: 2t
+ second_input_path: *dp
+ second_input_pattern: atm_remapped_1m_2d_1m_*.nc
+ second_variable: 2d
+ pipelines:
+ - hurs_pipeline
+
+ - name: huss
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1m_2d_1m_*.nc
+ compound_name: atmos.huss.tavg-h2m-hxy-u.mon.glb
+ model_variable: 2d
+ second_input_path: *dp
+ second_input_pattern: atm_remapped_1m_sp_1m_*.nc
+ second_variable: sp
+ pipelines:
+ - huss_pipeline
+
+ - name: clwvi
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1m_tclw_1m_*.nc
+ compound_name: atmos.clwvi.tavg-u-hxy-u.mon.glb
+ model_variable: tclw
+ second_input_path: *dp
+ second_input_pattern: atm_remapped_1m_tciw_1m_*.nc
+ second_variable: tciw
+ pipelines:
+ - clwvi_pipeline
+
+ # --- Fixed (fx) variables ---
+
+ - name: sftlf
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1m_lsm_1m_*.nc
+ compound_name: atmos.sftlf.ti-u-hxy-u.fx.glb
+ model_variable: lsm
+ scale_factor: 100.0
+ scaled_units: "%"
+ pipelines:
+ - scale_pipeline
+
+ # ============================================================
+ # Monthly 3D on pressure levels (Amon, plev19)
+ # ============================================================
+
+ - name: ta
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1m_pl_t_1m_pl_*.nc
+ compound_name: atmos.ta.tavg-p19-hxy-air.mon.glb
+ model_variable: t
+
+ - name: ua
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1m_pl_u_1m_pl_*.nc
+ compound_name: atmos.ua.tavg-p19-hxy-air.mon.glb
+ model_variable: u
+
+ - name: va
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1m_pl_v_1m_pl_*.nc
+ compound_name: atmos.va.tavg-p19-hxy-air.mon.glb
+ model_variable: v
+
+ - name: hus
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1m_pl_q_1m_pl_*.nc
+ compound_name: atmos.hus.tavg-p19-hxy-u.mon.glb
+ model_variable: q
+
+ - name: wap
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1m_pl_w_1m_pl_*.nc
+ compound_name: atmos.wap.tavg-p19-hxy-air.mon.glb
+ model_variable: w
+
+ - name: zg
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_pl_zg_mon_pl_*.nc
+ compound_name: atmos.zg.tavg-p19-hxy-air.mon.glb
+ model_variable: zg
+
+ - name: hur
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_pl_hur_mon_pl_*.nc
+ compound_name: atmos.hur.tavg-p19-hxy-air.mon.glb
+ model_variable: hur
+
+ # ============================================================
+ # Daily 2D surface (day)
+ # ============================================================
+
+ - name: clt_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_clt_day_*.nc
+ compound_name: atmos.clt.tavg-u-hxy-u.day.glb
+ model_variable: clt
+
+ - name: rsds_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_rsds_day_*.nc
+ compound_name: atmos.rsds.tavg-u-hxy-u.day.glb
+ model_variable: rsds
+
+ - name: pr_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_pr_day_*.nc
+ compound_name: atmos.pr.tavg-u-hxy-u.day.glb
+ model_variable: pr
+
+ - name: tas_day
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1d_cmip7_2t_1d_cmip7_*.nc
+ compound_name: atmos.tas.tavg-h2m-hxy-u.day.glb
+ model_variable: 2t
+
+ - name: psl_day
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1d_cmip7_msl_1d_cmip7_*.nc
+ compound_name: atmos.psl.tavg-u-hxy-u.day.glb
+ model_variable: msl
+
+ - name: ps_day
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1d_cmip7_sp_1d_cmip7_*.nc
+ compound_name: atmos.ps.tavg-u-hxy-u.day.glb
+ model_variable: sp
+
+ - name: uas_day
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1d_cmip7_10u_1d_cmip7_*.nc
+ compound_name: atmos.uas.tavg-h10m-hxy-u.day.glb
+ model_variable: 10u
+
+ - name: vas_day
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1d_cmip7_10v_1d_cmip7_*.nc
+ compound_name: atmos.vas.tavg-h10m-hxy-u.day.glb
+ model_variable: 10v
+
+ - name: sfcWind_day
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1d_cmip7_10u_1d_cmip7_*.nc
+ compound_name: atmos.sfcWind.tavg-h10m-hxy-u.day.glb
+ model_variable: 10u
+ second_input_path: *dp
+ second_input_pattern: atm_remapped_1d_cmip7_10v_1d_cmip7_*.nc
+ second_variable: 10v
+ pipelines:
+ - sfcwind_pipeline
+
+ - name: hurs_day
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1d_cmip7_2t_1d_cmip7_*.nc
+ compound_name: atmos.hurs.tavg-h2m-hxy-u.day.glb
+ model_variable: 2t
+ second_input_path: *dp
+ second_input_pattern: atm_remapped_1d_cmip7_2d_1d_cmip7_*.nc
+ second_variable: 2d
+ pipelines:
+ - hurs_pipeline
+
+ - name: huss_day
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1d_cmip7_2d_1d_cmip7_*.nc
+ compound_name: atmos.huss.tavg-h2m-hxy-u.day.glb
+ model_variable: 2d
+ second_input_path: *dp
+ second_input_pattern: atm_remapped_1d_cmip7_sp_1d_cmip7_*.nc
+ second_variable: sp
+ pipelines:
+ - huss_pipeline
+
+ # ============================================================
+ # Daily 3D on pressure levels (day, plev19)
+ # ============================================================
+
+ - name: ta_day
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1d_pl_cmip7_t_1d_pl_cmip7_*.nc
+ compound_name: atmos.ta.tavg-p19-hxy-air.day.glb
+ model_variable: t
+
+ - name: ua_day
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1d_pl_cmip7_u_1d_pl_cmip7_*.nc
+ compound_name: atmos.ua.tavg-p19-hxy-air.day.glb
+ model_variable: u
+
+ - name: va_day
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1d_pl_cmip7_v_1d_pl_cmip7_*.nc
+ compound_name: atmos.va.tavg-p19-hxy-air.day.glb
+ model_variable: v
+
+ - name: hus_day
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1d_pl_cmip7_q_1d_pl_cmip7_*.nc
+ compound_name: atmos.hus.tavg-p19-hxy-u.day.glb
+ model_variable: q
+
+ - name: wap_day
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1d_pl_cmip7_w_1d_pl_cmip7_*.nc
+ compound_name: atmos.wap.tavg-p19-hxy-u.day.glb
+ model_variable: w
+
+ - name: zg_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_pl_zg_day_pl_*.nc
+ compound_name: atmos.zg.tavg-p19-hxy-air.day.glb
+ model_variable: zg
+
+ - name: hur_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_pl_hur_day_pl_*.nc
+ compound_name: atmos.hur.tavg-p19-hxy-u.day.glb
+ model_variable: hur
+
+ # ============================================================
+ # Daily tasmax / tasmin
+ # ============================================================
+
+ - name: tasmax
+ inputs:
+ - path: *dp
+ pattern: atmos_day_minmax_tasmax_day_minmax_*.nc
+ compound_name: atmos.tas.tmax-h2m-hxy-u.day.glb
+ model_variable: tasmax
+
+ - name: tasmin
+ inputs:
+ - path: *dp
+ pattern: atmos_day_minmax_tasmin_day_minmax_*.nc
+ compound_name: atmos.tas.tmin-h2m-hxy-u.day.glb
+ model_variable: tasmin
+
+ # ============================================================
+ # Monthly mean of daily max/min temperature (Amon)
+ # ============================================================
+
+ - name: tasmax_mon
+ inputs:
+ - path: *dp
+ pattern: atmos_day_minmax_tasmax_day_minmax_*.nc
+ compound_name: atmos.tas.tmaxavg-h2m-hxy-u.mon.glb
+ model_variable: tasmax
+
+ - name: tasmin_mon
+ inputs:
+ - path: *dp
+ pattern: atmos_day_minmax_tasmin_day_minmax_*.nc
+ compound_name: atmos.tas.tminavg-h2m-hxy-u.mon.glb
+ model_variable: tasmin
+
+ # ============================================================
+ # Monthly 3D on model levels (Amon, alevel)
+ # ============================================================
+
+ - name: cl
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_ml_cl_mon_ml_*.nc
+ compound_name: atmos.cl.tavg-al-hxy-u.mon.glb
+ model_variable: cl
+
+ - name: cli
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_ml_cli_mon_ml_*.nc
+ compound_name: atmos.cli.tavg-al-hxy-u.mon.glb
+ model_variable: cli
+
+ - name: clw
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_ml_clw_mon_ml_*.nc
+ compound_name: atmos.clw.tavg-al-hxy-u.mon.glb
+ model_variable: clw
+
+ # ============================================================
+ # 3-hourly instantaneous surface (3hrPt)
+ # ============================================================
+
+ - name: tas_3hr
+ inputs:
+ - path: *dp
+ pattern: atmos_3h_pt_2t_3h_pt_*.nc
+ compound_name: atmos.tas.tpt-h2m-hxy-u.3hr.glb
+ model_variable: 2t
+
+ - name: uas_3hr
+ inputs:
+ - path: *dp
+ pattern: atmos_3h_pt_10u_3h_pt_*.nc
+ compound_name: atmos.uas.tpt-h10m-hxy-u.3hr.glb
+ model_variable: 10u
+
+ - name: vas_3hr
+ inputs:
+ - path: *dp
+ pattern: atmos_3h_pt_10v_3h_pt_*.nc
+ compound_name: atmos.vas.tpt-h10m-hxy-u.3hr.glb
+ model_variable: 10v
+
+ - name: huss_3hr
+ inputs:
+ - path: *dp
+ pattern: atmos_3h_pt_2d_3h_pt_*.nc
+ compound_name: atmos.huss.tpt-h2m-hxy-u.3hr.glb
+ model_variable: 2d
+ second_input_path: *dp
+ second_input_pattern: atmos_3h_pt_sp_3h_pt_*.nc
+ second_variable: sp
+ pipelines:
+ - huss_pipeline
+
+ # ============================================================
+ # 3-hourly averaged precipitation
+ # ============================================================
+
+ - name: pr_3hr
+ inputs:
+ - path: *dp
+ pattern: atmos_3h_pr_pr_3h_pr_*.nc
+ compound_name: atmos.pr.tavg-u-hxy-u.3hr.glb
+ model_variable: pr
+
+ # ============================================================
+ # 1-hourly averaged precipitation
+ # ============================================================
+
+ - name: pr_1hr
+ inputs:
+ - path: *dp
+ pattern: atmos_1h_pr_pr_1h_pr_*.nc
+ compound_name: atmos.pr.tavg-u-hxy-u.1hr.glb
+ model_variable: pr
+
+ # ============================================================
+ # 6-hourly surface (hurs averaged)
+ # ============================================================
+
+ - name: hurs_6hr
+ inputs:
+ - path: *dp
+ pattern: atmos_6h_2t_6h_*.nc
+ compound_name: atmos.hurs.tavg-h2m-hxy-u.6hr.glb
+ model_variable: 2t
+ second_input_path: *dp
+ second_input_pattern: atmos_6h_2d_6h_*.nc
+ second_variable: 2d
+ pipelines:
+ - hurs_pipeline
+
+ # ============================================================
+ # 6-hourly instantaneous pressure levels (plev3)
+ # ============================================================
+
+ - name: ta_6hr
+ inputs:
+ - path: *dp
+ pattern: atmos_6h_pl3_t_6h_pl3_*.nc
+ compound_name: atmos.ta.tpt-p3-hxy-air.6hr.glb
+ model_variable: t
+
+ - name: ua_6hr
+ inputs:
+ - path: *dp
+ pattern: atmos_6h_pl3_u_6h_pl3_*.nc
+ compound_name: atmos.ua.tpt-p3-hxy-air.6hr.glb
+ model_variable: u
+
+ - name: va_6hr
+ inputs:
+ - path: *dp
+ pattern: atmos_6h_pl3_v_6h_pl3_*.nc
+ compound_name: atmos.va.tpt-p3-hxy-air.6hr.glb
+ model_variable: v
diff --git a/awi-esm3-veg-hr-variables/core_land/cmip7_all_core_variables_atmos_land.csv b/awi-esm3-veg-hr-variables/core_land/cmip7_all_core_variables_atmos_land.csv
new file mode 100644
index 00000000..58570c18
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/core_land/cmip7_all_core_variables_atmos_land.csv
@@ -0,0 +1,3 @@
+,name,frequency,modeling_realm,standard_name,units,cell_methods,cell_measures,long_name,comment,processing_note,dimensions,out_name,type,positive,spatial_shape,temporal_shape,cmip6_table,physical_parameter_name,variableRootDD,branding_label,branded_variable_name,region,cmip6_compound_name,cmip7_compound_name,uid,flag_values,flag_meanings
+0,atmos.areacella.ti-u-hxy-u.fx.glb,fx,atmos land,cell_area,m2,area: sum,,Grid-Cell Area for Atmospheric Grid Variables,"Cell areas for any grid used to report atmospheric variables and any other variable using that grid (e.g., soil moisture content). These cell areas should be defined to enable exact calculation of global integrals (e.g., of vertical fluxes of energy at the surface and top of the atmosphere).","For atmospheres with more than 1 mesh (e.g., staggered grids), report areas that apply to surface vertical fluxes of energy.",longitude latitude,areacella,real,,XY-na,None,fx,areacella,areacella,ti-u-hxy-u,areacella_ti-u-hxy-u,glb,fx.areacella,atmos.areacella.ti-u-hxy-u.fx.glb,baa83a12-e5dd-11e5-8482-ac72891c3257,,
+8,atmos.evspsbl.tavg-u-hxy-u.mon.glb,mon,atmos land,water_evapotranspiration_flux,kg m-2 s-1,area: time: mean,area: areacella,Evaporation Including Sublimation and Transpiration,at surface; flux of water into the atmosphere due to conversion of both liquid and solid phases to vapor (from underlying surface and vegetation),,longitude latitude time,evspsbl,real,,XY-na,time-intv,Amon,evspsbl,evspsbl,tavg-u-hxy-u,evspsbl_tavg-u-hxy-u,glb,Amon.evspsbl,atmos.evspsbl.tavg-u-hxy-u.mon.glb,baad45c0-e5dd-11e5-8482-ac72891c3257,,
\ No newline at end of file
diff --git a/awi-esm3-veg-hr-variables/core_land/cmip7_all_core_variables_land.csv b/awi-esm3-veg-hr-variables/core_land/cmip7_all_core_variables_land.csv
new file mode 100644
index 00000000..7d6b5ce6
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/core_land/cmip7_all_core_variables_land.csv
@@ -0,0 +1,14 @@
+,name,frequency,modeling_realm,standard_name,units,cell_methods,cell_measures,long_name,comment,processing_note,dimensions,out_name,type,positive,spatial_shape,temporal_shape,cmip6_table,physical_parameter_name,variableRootDD,branding_label,branded_variable_name,region,cmip6_compound_name,cmip7_compound_name,uid,flag_values,flag_meanings
+78,land.evspsblsoi.tavg-u-hxy-lnd.mon.glb,mon,land,water_evaporation_flux_from_soil,kg m-2 s-1,area: mean where land time: mean,area: areacella,Water Evaporation from Soil,includes sublimation.,,longitude latitude time,evspsblsoi,real,,XY-na,time-intv,Lmon,evspsblsoi,evspsblsoi,tavg-u-hxy-lnd,evspsblsoi_tavg-u-hxy-lnd,glb,Lmon.evspsblsoi,land.evspsblsoi.tavg-u-hxy-lnd.mon.glb,baad5d9e-e5dd-11e5-8482-ac72891c3257,,
+79,land.evspsblveg.tavg-u-hxy-lnd.mon.glb,mon,land,water_evaporation_flux_from_canopy,kg m-2 s-1,area: mean where land time: mean,area: areacella,Evaporation from Canopy,the canopy evaporation+sublimation (if present in model).,,longitude latitude time,evspsblveg,real,,XY-na,time-intv,Lmon,evspsblveg,evspsblveg,tavg-u-hxy-lnd,evspsblveg_tavg-u-hxy-lnd,glb,Lmon.evspsblveg,land.evspsblveg.tavg-u-hxy-lnd.mon.glb,baad6596-e5dd-11e5-8482-ac72891c3257,,
+80,land.lai.tavg-u-hxy-lnd.mon.glb,mon,land,leaf_area_index,1,area: mean where land time: mean,area: areacella,Leaf Area Index,A ratio obtained by dividing the total upper leaf surface area of vegetation by the (horizontal) surface area of the land on which it grows.,"Note that if this variable is independent of time, it should be stored only for a single time (user choice).",longitude latitude time,lai,real,,XY-na,time-intv,Lmon,lai,lai,tavg-u-hxy-lnd,lai_tavg-u-hxy-lnd,glb,Lmon.lai,land.lai.tavg-u-hxy-lnd.mon.glb,bab0919e-e5dd-11e5-8482-ac72891c3257,,
+81,land.mrro.tavg-u-hxy-lnd.mon.glb,mon,land,runoff_flux,kg m-2 s-1,area: mean where land time: mean,area: areacella,Total Runoff,"the total runoff (including ""drainage"" through the base of the soil model) leaving the land portion of the grid cell.",,longitude latitude time,mrro,real,,XY-na,time-intv,Lmon,mrro,mrro,tavg-u-hxy-lnd,mrro_tavg-u-hxy-lnd,glb,Lmon.mrro,land.mrro.tavg-u-hxy-lnd.mon.glb,bab17a6e-e5dd-11e5-8482-ac72891c3257,,
+82,land.mrros.tavg-u-hxy-lnd.mon.glb,mon,land,surface_runoff_flux,kg m-2 s-1,area: mean where land time: mean,area: areacella,Surface Runoff,the total surface runoff leaving the land portion of the grid cell.,,longitude latitude time,mrros,real,,XY-na,time-intv,Lmon,mrros,mrros,tavg-u-hxy-lnd,mrros_tavg-u-hxy-lnd,glb,Lmon.mrros,land.mrros.tavg-u-hxy-lnd.mon.glb,bab19ff8-e5dd-11e5-8482-ac72891c3257,,
+83,land.mrso.tavg-u-hxy-lnd.mon.glb,mon,land,mass_content_of_water_in_soil,kg m-2,area: mean where land time: mean,area: areacella,Total Soil Moisture Content,the mass per unit area (summed over all soil layers) of water in all phases.,,longitude latitude time,mrso,real,,XY-na,time-intv,Lmon,mrso,mrso,tavg-u-hxy-lnd,mrso_tavg-u-hxy-lnd,glb,Lmon.mrso,land.mrso.tavg-u-hxy-lnd.mon.glb,bab1a782-e5dd-11e5-8482-ac72891c3257,,
+84,land.mrsofc.ti-u-hxy-lnd.fx.glb,fx,land,soil_moisture_content_at_field_capacity,kg m-2,area: mean where land,area: areacella,Capacity of Soil to Store Water (Field Capacity),"reported ""where land"": divide the total water holding capacity of all the soil in the grid cell by the land area in the grid cell; reported as ""missing"" where the land fraction is 0.","This variable should exclude lake water and must refer to soil water only.
+CHANGE: processing clarified.",longitude latitude,mrsofc,real,,XY-na,None,fx,mrsofc,mrsofc,ti-u-hxy-lnd,mrsofc_ti-u-hxy-lnd,glb,fx.mrsofc,land.mrsofc.ti-u-hxy-lnd.fx.glb,bab1c08c-e5dd-11e5-8482-ac72891c3257,,
+85,land.mrsol.tavg-d10cm-hxy-lnd.mon.glb,mon,land,mass_content_of_water_in_soil_layer,kg m-2,area: mean where land time: mean,area: areacella,Moisture in Upper Portion of Soil Column,the mass of water in all phases in a thin surface soil layer.,"integrate over uppermost 10 cm. CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude time sdepth1 CMIP7:longitude latitude time sdepth10cm,",longitude latitude time sdepth10cm,mrsol,real,,XY-na,time-intv,Lmon,mrsos,mrsol,tavg-d10cm-hxy-lnd,mrsol_tavg-d10cm-hxy-lnd,glb,Lmon.mrsos,land.mrsol.tavg-d10cm-hxy-lnd.mon.glb,bab1c85c-e5dd-11e5-8482-ac72891c3257,,
+86,land.orog.ti-u-hxy-u.fx.glb,fx,land,surface_altitude,m,area: mean,area: areacella,Surface Altitude,"height above the geoid; as defined here, ""the geoid"" is a surface of constant geopotential that, if the ocean were at rest, would coincide with mean sea level. Under this definition, the geoid changes as the mean volume of the ocean changes (e.g., due to glacial melt, or global warming of the ocean). Reported here is the height above the present-day geoid (0.0 over ocean).",,longitude latitude,orog,real,,XY-na,None,fx,orog,orog,ti-u-hxy-u,orog_ti-u-hxy-u,glb,fx.orog,land.orog.ti-u-hxy-u.fx.glb,bab2f9d4-e5dd-11e5-8482-ac72891c3257,,
+87,land.rootd.ti-u-hxy-lnd.fx.glb,fx,land,root_depth,m,area: mean where land,area: areacella,Maximum Root Depth,"report the maximum soil depth reachable by plant roots (if defined in model), i.e., the maximum soil depth from which they can extract moisture; report as ""missing"" where the land fraction is 0.","CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean CMIP7:area: mean where land,",longitude latitude,rootd,real,,XY-na,None,fx,rootd,rootd,ti-u-hxy-lnd,rootd_ti-u-hxy-lnd,glb,fx.rootd,land.rootd.ti-u-hxy-lnd.fx.glb,bab5c7fe-e5dd-11e5-8482-ac72891c3257,,
+88,land.sftgif.ti-u-hxy-u.fx.glb,fx,land,land_ice_area_fraction,%,area: mean,area: areacella,Land Ice Area Percentage,"fraction of grid cell occupied by ""permanent"" ice (i.e., glaciers).","For atmospheres with more than 1 mesh (e.g., staggered grids), report areas that apply to surface vertical fluxes of energy.",longitude latitude,sftgif,real,,XY-na,None,fx,sftgif,sftgif,ti-u-hxy-u,sftgif_ti-u-hxy-u,glb,fx.sftgif,land.sftgif.ti-u-hxy-u.fx.glb,bab73a76-e5dd-11e5-8482-ac72891c3257,,
+89,land.slthick.ti-sl-hxy-lnd.fx.glb,fx,land,cell_thickness,m,area: mean where land,area: areacella,Thickness of Soil Layers,Thickness of Soil Layers,,longitude latitude sdepth,slthick,real,,XY-S,None,Efx,slthick,slthick,ti-sl-hxy-lnd,slthick_ti-sl-hxy-lnd,glb,Efx.slthick,land.slthick.ti-sl-hxy-lnd.fx.glb,f2fad86e-c38d-11e6-abc1-1b922e5e1118,,
\ No newline at end of file
diff --git a/awi-esm3-veg-hr-variables/core_land/cmip7_all_core_variables_landIce_land.csv b/awi-esm3-veg-hr-variables/core_land/cmip7_all_core_variables_landIce_land.csv
new file mode 100644
index 00000000..7e8ecdee
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/core_land/cmip7_all_core_variables_landIce_land.csv
@@ -0,0 +1,4 @@
+,name,frequency,modeling_realm,standard_name,units,cell_methods,cell_measures,long_name,comment,processing_note,dimensions,out_name,type,positive,spatial_shape,temporal_shape,cmip6_table,physical_parameter_name,variableRootDD,branding_label,branded_variable_name,region,cmip6_compound_name,cmip7_compound_name,uid,flag_values,flag_meanings
+90,landIce.mrfso.tavg-u-hxy-lnd.mon.glb,mon,landIce land,soil_frozen_water_content,kg m-2,area: mean where land time: mean,area: areacella,Soil Frozen Water Content,the mass (summed over all all layers) of frozen water.,,longitude latitude time,mrfso,real,,XY-na,time-intv,Lmon,mrfso,mrfso,tavg-u-hxy-lnd,mrfso_tavg-u-hxy-lnd,glb,Lmon.mrfso,landIce.mrfso.tavg-u-hxy-lnd.mon.glb,bab1688a-e5dd-11e5-8482-ac72891c3257,,
+91,landIce.snc.tavg-u-hxy-lnd.mon.glb,mon,landIce land,surface_snow_area_fraction,%,area: mean where land time: mean,area: areacella,Snow Area Percentage,Fraction of each grid cell that is occupied by snow that rests on land portion of cell.,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean CMIP7:area: mean where land time: mean,",longitude latitude time,snc,real,,XY-na,time-intv,LImon,snc,snc,tavg-u-hxy-lnd,snc_tavg-u-hxy-lnd,glb,LImon.snc,landIce.snc.tavg-u-hxy-lnd.mon.glb,bab7c2d4-e5dd-11e5-8482-ac72891c3257,,
+92,landIce.snw.tavg-u-hxy-lnd.mon.glb,mon,landIce land,surface_snow_amount,kg m-2,area: mean where land time: mean,area: areacella,Surface Snow Amount,Computed as the mass of surface snow on the land portion of the grid cell divided by the land area in the grid cell; reported as missing where the land fraction is 0; excluded is snow on vegetation canopy or on sea ice.,,longitude latitude time,snw,real,,XY-na,time-intv,LImon,snw,snw,tavg-u-hxy-lnd,snw_tavg-u-hxy-lnd,glb,LImon.snw,landIce.snw.tavg-u-hxy-lnd.mon.glb,bab81e50-e5dd-11e5-8482-ac72891c3257,,
\ No newline at end of file
diff --git a/awi-esm3-veg-hr-variables/core_land/cmip7_awiesm3-veg-hr_land.yaml b/awi-esm3-veg-hr-variables/core_land/cmip7_awiesm3-veg-hr_land.yaml
new file mode 100644
index 00000000..2c4f9812
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/core_land/cmip7_awiesm3-veg-hr_land.yaml
@@ -0,0 +1,180 @@
+# CMIP7 Core Land Variables — AWI-ESM3-VEG-HR
+# Generated from cmip7_all_core_variables_{land,atmos_land,landIce_land}.csv
+#
+# XIOS expressions handle deaccumulation and unit conversion in field_def_cmip7.xml.
+# Variables not producible from IFS alone (evspsblsoi, evspsblveg, rootd,
+# mrsofc, sftgif, mrfso) are deferred to lrcs_land (LPJ-GUESS / external data).
+
+general:
+ name: "awiesm3-cmip7-core-land"
+ cmor_version: "CMIP7"
+ mip: "CMIP"
+ CMIP7_DReq_metadata: "/home/a/a270092/.cache/pycmor/cmip7_metadata/v1.2.2.2/full_metadata.json"
+
+pycmor:
+ warn_on_no_rule: False
+ dask_cluster: "slurm"
+ dask_cluster_scaling_mode: "fixed"
+ dask_cluster_scaling_fixed_jobs: 1
+
+jobqueue:
+ slurm:
+ name: pycmor-worker
+ queue: compute
+ account: bb1469
+ cores: 16
+ memory: 256GB
+ walltime: '00:30:00'
+
+pipelines:
+ - name: snc_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_snc
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ - name: areacella_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_areacella
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ - name: slthick_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_slthick
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+inherit:
+ data_path: &dp /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/oifs
+ source_id: AWI-ESM-3
+ institution_id: AWI
+ experiment_id: picontrol
+ variant_label: r1i1p1f1
+ grid_label: gn
+ grid: "OpenIFS TCo319 reduced Gaussian, interpolated to 0.25deg regular grid"
+ nominal_resolution: "25 km"
+ institution: "Alfred Wegener Institute, Helmholtz Centre for Polar and Marine Research, Bremerhaven, Germany"
+ output_directory: ./cmorized_output/awiesm3
+
+rules:
+ # ============================================================
+ # Monthly land surface (Lmon)
+ # ============================================================
+
+ # --- XIOS CMOR-ready fields ---
+
+ - name: evspsbl
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_land_evspsbl_mon_land_*.nc
+ compound_name: atmos.evspsbl.tavg-u-hxy-u.mon.glb
+ model_variable: evspsbl
+
+ - name: mrro
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_land_mrro_mon_land_*.nc
+ compound_name: land.mrro.tavg-u-hxy-lnd.mon.glb
+ model_variable: mrro
+
+ - name: mrros
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_land_mrros_mon_land_*.nc
+ compound_name: land.mrros.tavg-u-hxy-lnd.mon.glb
+ model_variable: mrros
+
+ - name: snw
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_land_snw_mon_land_*.nc
+ compound_name: landIce.snw.tavg-u-hxy-lnd.mon.glb
+ model_variable: snw
+
+ - name: orog
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_land_orog_mon_land_*.nc
+ compound_name: land.orog.ti-u-hxy-u.fx.glb
+ model_variable: orog
+
+ - name: lai
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_land_lai_mon_land_*.nc
+ compound_name: land.lai.tavg-u-hxy-lnd.mon.glb
+ model_variable: lai
+
+ - name: mrso
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_land_mrso_mon_land_*.nc
+ compound_name: land.mrso.tavg-u-hxy-lnd.mon.glb
+ model_variable: mrso
+
+ - name: mrsol
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_land_mrsol_mon_land_*.nc
+ compound_name: land.mrsol.tavg-d10cm-hxy-lnd.mon.glb
+ model_variable: mrsol
+
+ # --- pycmor pipeline computed ---
+
+ - name: snc
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1m_sd_1m_*.nc
+ compound_name: landIce.snc.tavg-u-hxy-lnd.mon.glb
+ model_variable: sd
+ pipelines:
+ - snc_pipeline
+
+ # ============================================================
+ # Fixed (fx) variables
+ # ============================================================
+
+ - name: areacella
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1m_lsm_1m_*.nc
+ compound_name: atmos.areacella.ti-u-hxy-u.fx.glb
+ model_variable: lsm
+ pipelines:
+ - areacella_pipeline
+
+ - name: slthick
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1m_lsm_1m_*.nc
+ compound_name: land.slthick.ti-sl-hxy-lnd.fx.glb
+ model_variable: lsm
+ pipelines:
+ - slthick_pipeline
diff --git a/awi-esm3-veg-hr-variables/core_land/cmip7_land_variables_todo.md b/awi-esm3-veg-hr-variables/core_land/cmip7_land_variables_todo.md
new file mode 100644
index 00000000..209968e3
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/core_land/cmip7_land_variables_todo.md
@@ -0,0 +1,83 @@
+# CMIP7 Core Land Variables — Rule Implementation TODO
+
+Variables from 3 CSVs: `cmip7_all_core_variables_land.csv` (13), `cmip7_all_core_variables_atmos_land.csv` (2), `cmip7_all_core_variables_landIce_land.csv` (3). Total: 18 rows, 17 unique CMOR variables.
+11 implementable from IFS output, 6 deferred to lrcs_land (need LPJ-GUESS or external data).
+
+XIOS field definitions: `field_def_cmip7.xml`
+Output config: `file_def_oifs_cmip7_spinup.xml.j2`
+Pycmor rules: `cmip7_awiesm3-veg-hr_land.yaml`
+
+## Key conversion patterns
+
+- IFS accumulated fields (m or J m-2) need deaccumulation: ÷21600 for 6h freq_op
+- Volumetric soil moisture (m3 m-3) → kg m-2 via ×layer_thickness×1000
+- IFS evaporation `e` is negative for actual evaporation → sign flip
+- HTESSEL soil layers: 0.07m, 0.21m, 0.72m, 1.89m (total 2.89m)
+
+---
+
+## Monthly land (Lmon) — IFS-producible
+
+### XIOS CMOR-ready (derived fields in field_def)
+
+- [x] **evspsbl** — Evaporation Including Sublimation (`kg m-2 s-1`, Amon) — XIOS expr: `-1000*e/21600`
+- [x] **mrro** — Total Runoff (`kg m-2 s-1`, Lmon) — XIOS expr: `1000*ro/21600`
+- [x] **mrros** — Surface Runoff (`kg m-2 s-1`, Lmon) — XIOS expr: `1000*sro/21600`
+- [x] **snw** — Surface Snow Amount (`kg m-2`, LImon) — XIOS expr: `sd*1000`
+- [x] **lai** — Leaf Area Index (`1`, Lmon) — XIOS expr: `lai_lv*cvl + lai_hv*cvh`
+- [x] **mrso** — Total Soil Moisture Content (`kg m-2`, Lmon) — XIOS expr: `1000*(swvl1*0.07 + swvl2*0.21 + swvl3*0.72 + swvl4*1.89)`
+- [x] **mrsol** — Upper 10cm Soil Moisture (`kg m-2`, Lmon) — XIOS expr: `1000*(swvl1*0.07 + swvl2*0.03)`
+
+### pycmor pipeline computed
+
+- [x] **snc** — Snow Area Fraction (`%`, LImon) — pycmor pipeline: parametric from `sd` (saturation at 15mm water equiv)
+
+## Fixed (fx) — IFS-producible
+
+- [x] **orog** — Surface Altitude (`m`, fx) — XIOS expr: `sz/9.80665`
+- [x] **areacella** — Grid-Cell Area (`m2`, fx) — pycmor pipeline: computed from grid coordinates
+- [x] **slthick** — Soil Layer Thickness (`m`, fx) — pycmor pipeline: constant [0.07, 0.21, 0.72, 1.89]
+
+## Deferred to lrcs_land (need LPJ-GUESS or external data)
+
+- [ ] **evspsblsoi** — Soil Evaporation (`kg m-2 s-1`, Lmon) — IFS `e` is total, not partitioned. Needs LPJ-GUESS
+- [ ] **evspsblveg** — Canopy Evaporation (`kg m-2 s-1`, Lmon) — IFS `e` is total, not partitioned. Needs LPJ-GUESS
+- [ ] **rootd** — Maximum Root Depth (`m`, fx) — Not an IFS output. Needs LPJ-GUESS or hardcoded 2.89m (HTESSEL total)
+- [ ] **mrsofc** — Soil Field Capacity (`kg m-2`, fx) — Depends on IFS soil type map + HTESSEL lookup. Needs external data
+- [ ] **sftgif** — Glacier Area Fraction (`%`, fx) — Not a standard IFS output. Needs external glacier dataset
+- [ ] **mrfso** — Frozen Soil Water Content (`kg m-2`, LImon) — IFS HTESSEL doesn't output frozen fraction separately. Needs research
+
+---
+
+## OIFS source code investigation (2026-04-06)
+
+Of the 6 variables deferred to lrcs_land, OIFS source analysis shows:
+
+### No source changes needed (derivable from existing output)
+- **rootd** — Per-veg-type root profiles in `srfrootfr_mod.F90` (Zeng 1998). Compute weighted effective depth from `tvl`/`tvh` + lookup table
+- **mrsofc** — Field capacity `RWCAP`/`RWCAPM` in `sussoil_mod.F90` from Van Genuchten params. Derive from IFS soil type initial conditions
+- **sftgif** — IFS vegetation type 12 = "Ice Caps and Glaciers". Derive from `tvl`/`tvh` fields
+
+### Need GRIB field registration (moderate OIFS source changes)
+- **evspsblsoi** — Bare soil evaporation `PDHWLS(:,1,9)` in `srfwexc_mod.F90`. Wire to XIOS via `ptrgfu.F90` + `sucfu.F90` + `cpg_dia.F90`
+- **evspsblveg** — Transpiration already available as GRIB field `SURFTRANSPIRATIO`. Interception evaporation `PDHIIS(:,4)` needs registration
+- **mrfso** — Frozen soil water `PDHWLS(:,:,2)` in `srfwexc_mod.F90`. Sum over 4 layers and register as GRIB field
+
+See detailed notes in `../lrcs_land/cmip7_lrcs_land_todo.md`.
+
+## Blockers / verification needed
+
+1. **XIOS multi-field expressions** — mrso (4 fields), lai (4 fields), mrsol (2 fields) use multi-field XIOS expressions. Verify these work at runtime
+2. **sro field** — Added to file_def monthly output. Verify IFS/FullPos outputs surface runoff separately
+3. **sz field** — Added to file_def. Verify surface geopotential is output correctly
+4. **lai_lv, lai_hv, cvl, cvh** — Uncommented in file_def monthly output. Were previously disabled
+
+## Research findings
+
+- HTESSEL soil layer thicknesses: 0.07, 0.21, 0.72, 1.89 m (total 2.89m)
+- IFS evaporation field `e` has negative sign convention (evaporation from surface is negative)
+- IFS `sd` is snow depth in metres of water equivalent, not physical depth
+- IFS `ro` includes both surface and subsurface runoff; `sro` is surface only
+- `sz` is surface geopotential (m2 s-2), needs division by g for altitude
+- LAI requires weighting low/high veg LAI by vegetation cover fractions
+- Upper 10cm soil moisture approximation: full layer 1 (7cm) + top 3cm of layer 2
diff --git a/awi-esm3-veg-hr-variables/core_ocean/cmip7_all_core_variables_ocean.csv b/awi-esm3-veg-hr-variables/core_ocean/cmip7_all_core_variables_ocean.csv
new file mode 100644
index 00000000..a60d6389
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/core_ocean/cmip7_all_core_variables_ocean.csv
@@ -0,0 +1,43 @@
+,name,frequency,modeling_realm,standard_name,units,cell_methods,cell_measures,long_name,comment,processing_note,dimensions,out_name,type,positive,spatial_shape,temporal_shape,cmip6_table,physical_parameter_name,variableRootDD,branding_label,branded_variable_name,region,cmip6_compound_name,cmip7_compound_name,uid,flag_values,flag_meanings
+93,ocean.areacello.ti-u-hxy-u.fx.glb,fx,ocean,cell_area,m2,area: sum,,Grid-Cell Area for Ocean Variables,"Cell areas for any grid used to report ocean variables and variables which are requested as used on the model ocean grid (e.g. hfsso, which is a downward heat flux from the atmosphere interpolated onto the ocean grid). These cell areas should be defined to enable exact calculation of global integrals (e.g., of vertical fluxes of energy at the surface and top of the atmosphere).","For oceans with more than 1 mesh (e.g., staggered grids), report areas that apply to surface vertical fluxes of energy.",longitude latitude,areacello,real,,XY-na,None,Ofx,areacello,areacello,ti-u-hxy-u,areacello_ti-u-hxy-u,glb,Ofx.areacello,ocean.areacello.ti-u-hxy-u.fx.glb,baa3ee94-e5dd-11e5-8482-ac72891c3257,,
+94,ocean.basin.ti-u-hxy-u.fx.glb,fx,ocean,region,1,area: mean,area: areacello,Region Selection Index,A variable with the standard name of region contains strings which indicate geographical regions. These strings must be chosen from the standard region list.,A variable with the standard name of region contains either strings which indicate a geographical region or flags which can be translated to strings using flag_values and flag_meanings attributes. These strings are standardised. Values must be taken from the CF standard region list. Report on the same grid as the temperature field. CHANGE: Flag values and meanings are in dedicated fields 'Flag values' and 'Flag meanings'. ISSUE: may not be easily machine processed.,longitude latitude,basin,integer,,XY-na,None,Ofx,basin,basin,ti-u-hxy-u,basin_ti-u-hxy-u,glb,Ofx.basin,ocean.basin.ti-u-hxy-u.fx.glb,baa3f718-e5dd-11e5-8482-ac72891c3257,0 1 2 3 4 5 6 7 8 9 10,global_land southern_ocean atlantic_ocean pacific_ocean arctic_ocean indian_ocean mediterranean_sea black_sea hudson_bay baltic_sea red_sea
+95,ocean.bigthetao.tavg-ol-hxy-sea.mon.glb,mon,ocean,sea_water_conservative_temperature,degC,area: mean where sea time: mean,area: areacello volume: volcello,Sea Water Conservative Temperature,Diagnostic should be contributed only for models using conservative temperature as prognostic field.,,longitude latitude olevel time,bigthetao,real,,XY-O,time-intv,Omon,bigthetao,bigthetao,tavg-ol-hxy-sea,bigthetao_tavg-ol-hxy-sea,glb,Omon.bigthetao,ocean.bigthetao.tavg-ol-hxy-sea.mon.glb,baa5255c-e5dd-11e5-8482-ac72891c3257,,
+96,ocean.deptho.ti-u-hxy-sea.fx.glb,fx,ocean,sea_floor_depth_below_geoid,m,area: mean where sea,area: areacello,Sea Floor Depth Below Geoid,Ocean bathymetry. Reported here is the sea floor depth for present day relative to z=0 geoid. Reported as missing for land grid cells.,Save both native and spherical.,longitude latitude,deptho,real,,XY-na,None,Ofx,deptho,deptho,ti-u-hxy-sea,deptho_ti-u-hxy-sea,glb,Ofx.deptho,ocean.deptho.ti-u-hxy-sea.fx.glb,baa3e4d0-e5dd-11e5-8482-ac72891c3257,,
+97,ocean.hfds.tavg-u-hxy-sea.mon.glb,mon,ocean,surface_downward_heat_flux_in_sea_water,W m-2,area: mean where sea time: mean,area: areacello,Downward Heat Flux at Sea Water Surface,"This is the net flux of heat entering the liquid water column through its upper surface (excluding any ""flux adjustment"") .",Report on native horizontal grid as well as remapped onto a latitude/longitude grid.,longitude latitude time,hfds,real,down,XY-na,time-intv,Omon,hfds,hfds,tavg-u-hxy-sea,hfds_tavg-u-hxy-sea,glb,Omon.hfds,ocean.hfds.tavg-u-hxy-sea.mon.glb,baa6c33a-e5dd-11e5-8482-ac72891c3257,,
+98,ocean.hfgeou.ti-u-hxy-sea.fx.glb,fx,ocean,upward_geothermal_heat_flux_at_sea_floor,W m-2,area: mean where sea,area: areacello,Upward Geothermal Heat Flux at Sea Floor,Upward geothermal heat flux per unit area on the sea floor,"Variable value should be reported as the upward flux at bottom of the deepest ocean layer
+If this field is time-dependent then save it instead as one of your Omon fields (see the Omon table)",longitude latitude,hfgeou,real,up,XY-na,None,Ofx,hfgeou,hfgeou,ti-u-hxy-sea,hfgeou_ti-u-hxy-sea,glb,Ofx.hfgeou,ocean.hfgeou.ti-u-hxy-sea.fx.glb,baa3fb50-e5dd-11e5-8482-ac72891c3257,,
+99,ocean.masscello.tavg-ol-hxy-sea.mon.glb,mon,ocean,sea_water_mass_per_unit_area,kg m-2,area: mean where sea time: mean,area: areacello volume: volcello,Ocean Grid-Cell Mass per Area,"For Boussinesq models, report this diagnostic as Boussinesq reference density times grid celll volume.","Report on native horizontal grid as well as on a spherical latitude/longitude grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native. Do not use this field if masscello is fixed: use Ofx.masscello instead. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: sum where sea time: mean CMIP7:area: mean where sea time: mean,",longitude latitude olevel time,masscello,real,,XY-O,time-intv,Omon,masscello,masscello,tavg-ol-hxy-sea,masscello_tavg-ol-hxy-sea,glb,Omon.masscello,ocean.masscello.tavg-ol-hxy-sea.mon.glb,baa5147c-e5dd-11e5-8482-ac72891c3257,,
+100,ocean.masscello.ti-ol-hxy-sea.fx.glb,fx,ocean,sea_water_mass_per_unit_area,kg m-2,area: mean where sea,area: areacello volume: volcello,Ocean Grid-Cell Mass per Area,"Tracer grid-cell mass per unit area used for computing tracer budgets. For Boussinesq models with static ocean grid cell thickness, masscello = rhozero\*thickcello, where thickcello is static cell thickness and rhozero is constant Boussinesq reference density. More generally, masscello is time dependent and reported as part of Omon.","3-d field: report on grid that applies to temperature. Use this variable if masscello is fixed, e.g. for Boussinesq models with static ocean grid cell thickness.
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: sum CMIP7:area: mean where sea,",longitude latitude olevel,masscello,real,,XY-O,None,Ofx,masscello,masscello,ti-ol-hxy-sea,masscello_ti-ol-hxy-sea,glb,Ofx.masscello,ocean.masscello.ti-ol-hxy-sea.fx.glb,baa3ea2a-e5dd-11e5-8482-ac72891c3257,,
+101,ocean.mlotst.tavg-u-hxy-sea.mon.glb,mon,ocean,ocean_mixed_layer_thickness_defined_by_sigma_t,m,area: mean where sea time: mean,area: areacello,Ocean Mixed Layer Thickness Defined by Delta Sigma T of 0.03 kg m-3 referenced to the model level closest to 10 m depth,Sigma T is potential density referenced to ocean surface. Defined by Sigma T of 0.03 kg m-3 wrt to model level closest to 10 m depth.,"dsigmat coordinate added to clarify definition. Report on native horizontal grid as well as on a spherical latitude/longitude grid. CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude time CMIP7:longitude latitude time deltasigt,",longitude latitude time deltasigt,mlotst,real,,XY-na,time-intv,Omon,mlotst,mlotst,tavg-u-hxy-sea,mlotst_tavg-u-hxy-sea,glb,Omon.mlotst,ocean.mlotst.tavg-u-hxy-sea.mon.glb,baa57688-e5dd-11e5-8482-ac72891c3257,,
+102,ocean.sftof.ti-u-hxy-u.fx.glb,fx,ocean,sea_area_fraction,%,area: mean,area: areacello,Sea Area Percentage,This is the area fraction at the ocean surface.,"Should this be recorded as a function of depth? Report on the same grid that ocean fields are reported (i.e., the ocean native grid, or the grid that ocean data has been provided to CMIP. For completeness, provide this even if the ocean grid is the same as the atmospheric grid.",longitude latitude,sftof,real,,XY-na,None,Ofx,sftof,sftof,ti-u-hxy-u,sftof_ti-u-hxy-u,glb,Ofx.sftof,ocean.sftof.ti-u-hxy-u.fx.glb,baa3f2e0-e5dd-11e5-8482-ac72891c3257,,
+103,ocean.so.tavg-ol-hxy-sea.mon.glb,mon,ocean,sea_water_salinity,1E-03,area: mean where sea time: mean,area: areacello volume: volcello,Sea Water Salinity,"Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and the units attribute should normally be given as 1e-3 or 0.001 i.e. parts per thousand.","Report on native horizontal grid as well as on a spherical latitude/longitude grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.
+CHANGE SINCE CMIP6 in Units (from Physical Parameter) - CMIP6:0.001 CMIP7:1E-03,",longitude latitude olevel time,so,real,,XY-O,time-intv,Omon,so,so,tavg-ol-hxy-sea,so_tavg-ol-hxy-sea,glb,Omon.so,ocean.so.tavg-ol-hxy-sea.mon.glb,baa5491a-e5dd-11e5-8482-ac72891c3257,,
+104,ocean.sos.tavg-u-hxy-sea.day.glb,day,ocean,sea_surface_salinity,1E-03,area: mean where sea time: mean,area: areacello,Sea Surface Salinity,"Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and the units attribute should normally be given as 1e-3 or 0.001 i.e. parts per thousand.","Report on the ocean horizontal native grid. CHANGE SINCE CMIP6 in Units (from Physical Parameter) - CMIP6:0.001 CMIP7:1E-03,
+Evaluated at the upper boundary of the liquid ocean, including at the lower boundary of sea-ice and floating ice shelves.",longitude latitude time,sos,real,,XY-na,time-intv,Oday,sos,sos,tavg-u-hxy-sea,sos_tavg-u-hxy-sea,glb,Oday.sos,ocean.sos.tavg-u-hxy-sea.day.glb,baa72514-e5dd-11e5-8482-ac72891c3257,,
+105,ocean.sos.tavg-u-hxy-sea.mon.glb,mon,ocean,sea_surface_salinity,1E-03,area: mean where sea time: mean,area: areacello,Sea Surface Salinity,"Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and the units attribute should normally be given as 1e-3 or 0.001 i.e. parts per thousand.","Report on native horizontal grid as well as on a spherical latitude/longitude grid. CHANGE SINCE CMIP6 in Units (from Physical Parameter) - CMIP6:0.001 CMIP7:1E-03,
+Evaluated at the upper boundary of the liquid ocean, including at the lower boundary of sea-ice and floating ice shelves.",longitude latitude time,sos,real,,XY-na,time-intv,Omon,sos,sos,tavg-u-hxy-sea,sos_tavg-u-hxy-sea,glb,Omon.sos,ocean.sos.tavg-u-hxy-sea.mon.glb,baa557f2-e5dd-11e5-8482-ac72891c3257,,
+106,ocean.tauuo.tavg-u-hxy-sea.mon.glb,mon,ocean,downward_x_stress_at_sea_water_surface,N m-2,area: mean where sea time: mean,area: areacello,Sea Water Surface Downward X Stress,"This is the stress on the liquid ocean from overlying atmosphere, sea ice, ice shelf, etc.","Report on native horizontal grid. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: mean where sea time: mean,
+CHANGE SINCE CMIP6 in Cell Measures - CMIP6:::OPT CMIP7:area: areacello,",longitude latitude time,tauuo,real,down,XY-na,time-intv,Omon,tauuo,tauuo,tavg-u-hxy-sea,tauuo_tavg-u-hxy-sea,glb,Omon.tauuo,ocean.tauuo.tavg-u-hxy-sea.mon.glb,baa6cf38-e5dd-11e5-8482-ac72891c3257,,
+107,ocean.tauvo.tavg-u-hxy-sea.mon.glb,mon,ocean,downward_y_stress_at_sea_water_surface,N m-2,area: mean where sea time: mean,area: areacello,Sea Water Surface Downward Y Stress,"This is the stress on the liquid ocean from overlying atmosphere, sea ice, ice shelf, etc.","Report on native horizontal grid. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: mean where sea time: mean,
+CHANGE SINCE CMIP6 in Cell Measures - CMIP6:::OPT CMIP7:area: areacello,",longitude latitude time,tauvo,real,down,XY-na,time-intv,Omon,tauvo,tauvo,tavg-u-hxy-sea,tauvo_tavg-u-hxy-sea,glb,Omon.tauvo,ocean.tauvo.tavg-u-hxy-sea.mon.glb,baa6d366-e5dd-11e5-8482-ac72891c3257,,
+108,ocean.thetao.tavg-ol-hxy-sea.mon.glb,mon,ocean,sea_water_potential_temperature,degC,area: mean where sea time: mean,area: areacello volume: volcello,Sea Water Potential Temperature,Diagnostic should be contributed even for models using conservative temperature as prognostic field.,Report on native horizontal grid as well as on a spherical latitude/longitude grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,thetao,real,,XY-O,time-intv,Omon,thetao,thetao,tavg-ol-hxy-sea,thetao_tavg-ol-hxy-sea,glb,Omon.thetao,ocean.thetao.tavg-ol-hxy-sea.mon.glb,baa51d00-e5dd-11e5-8482-ac72891c3257,,
+109,ocean.thkcello.tavg-ol-hxy-sea.mon.glb,mon,ocean,cell_thickness,m,area: mean where sea time: mean,area: areacello volume: volcello,Ocean Model Cell Thickness,"The time varying thickness of ocean cells. ""Thickness"" means the vertical extent of a layer. ""Cell"" refers to a model grid-cell.",Report on native horizontal grid as well as on a spherical latitude/longitude grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,thkcello,real,,XY-O,time-intv,Omon,thkcello,thkcello,tavg-ol-hxy-sea,thkcello_tavg-ol-hxy-sea,glb,Omon.thkcello,ocean.thkcello.tavg-ol-hxy-sea.mon.glb,baa518c8-e5dd-11e5-8482-ac72891c3257,,
+110,ocean.thkcello.ti-ol-hxy-sea.fx.glb,fx,ocean,cell_thickness,m,area: mean where sea,area: areacello volume: volcello,Ocean Model Cell Thickness,"Thickness of ocean cells. ""Thickness"" means the vertical extent of a layer. ""Cell"" refers to a model grid-cell.","If this field is time-dependent then save it instead as one of your Omon fields (see the Omon table) CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean CMIP7:area: mean where sea,",longitude latitude olevel,thkcello,real,,XY-O,None,Ofx,thkcello,thkcello,ti-ol-hxy-sea,thkcello_ti-ol-hxy-sea,glb,Ofx.thkcello,ocean.thkcello.ti-ol-hxy-sea.fx.glb,bab9bd00-e5dd-11e5-8482-ac72891c3257,,
+111,ocean.tos.tavg-u-hxy-sea.day.glb,day,ocean,sea_surface_temperature,degC,area: mean where sea time: mean,area: areacello,Sea Surface Temperature,"This may differ from ""surface temperature"" in regions of sea ice or floating ice shelves. For models using conservative temperature as the prognostic field, they should report the top ocean layer as surface potential temperature, which is the same as surface in situ temperature.","Report on the ocean horizontal native grid.
+Evaluated at the upper boundary of the liquid ocean, including at the lower boundary of sea-ice and floating ice shelves.",longitude latitude time,tos,real,,XY-na,time-intv,Oday,tos,tos,tavg-u-hxy-sea,tos_tavg-u-hxy-sea,glb,Oday.tos,ocean.tos.tavg-u-hxy-sea.day.glb,baa720e6-e5dd-11e5-8482-ac72891c3257,,
+112,ocean.tos.tavg-u-hxy-sea.mon.glb,mon,ocean,sea_surface_temperature,degC,area: mean where sea time: mean,area: areacello,Sea Surface Temperature,"This may differ from ""surface temperature"" in regions of sea ice or floating ice shelves. For models using conservative temperature as the prognostic field, they should report the top ocean layer as surface potential temperature, which is the same as surface in situ temperature.","Note change from CMIP5 K to CMIP6 C. Report on native horizontal grid as well as on a spherical latitude/longitude grid.
+Evaluated at the upper boundary of the liquid ocean, including at the lower boundary of sea-ice and floating ice shelves.",longitude latitude time,tos,real,,XY-na,time-intv,Omon,tos,tos,tavg-u-hxy-sea,tos_tavg-u-hxy-sea,glb,Omon.tos,ocean.tos.tavg-u-hxy-sea.mon.glb,baa52de0-e5dd-11e5-8482-ac72891c3257,,
+113,ocean.umo.tavg-ol-hxy-sea.mon.glb,mon,ocean,ocean_mass_x_transport,kg s-1,area: mean where sea time: mean,area: areacello volume: volcello,Ocean Mass X Transport,X-ward mass transport from residual mean (resolved plus parameterized) advective transport.,"Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: mean where sea time: mean, CHANGE SINCE CMIP6 in Cell Measures - CMIP6:::OPT CMIP7:area: areacello volume: volcello,",longitude latitude olevel time,umo,real,,XY-O,time-intv,Omon,umo,umo,tavg-ol-hxy-sea,umo_tavg-ol-hxy-sea,glb,Omon.umo,ocean.umo.tavg-ol-hxy-sea.mon.glb,baa5942e-e5dd-11e5-8482-ac72891c3257,,
+114,ocean.uo.tavg-ol-hxy-sea.mon.glb,mon,ocean,sea_water_x_velocity,m s-1,area: mean where sea time: mean,area: areacello volume: volcello,Sea Water X Velocity,Prognostic x-ward velocity component resolved by the model.,"Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: mean where sea time: mean, CHANGE SINCE CMIP6 in Cell Measures - CMIP6:::OPT CMIP7:area: areacello volume: volcello,",longitude latitude olevel time,uo,real,,XY-O,time-intv,Omon,uo,uo,tavg-ol-hxy-sea,uo_tavg-ol-hxy-sea,glb,Omon.uo,ocean.uo.tavg-ol-hxy-sea.mon.glb,baa586e6-e5dd-11e5-8482-ac72891c3257,,
+115,ocean.vmo.tavg-ol-hxy-sea.mon.glb,mon,ocean,ocean_mass_y_transport,kg s-1,area: mean where sea time: mean,area: areacello volume: volcello,Ocean Mass Y Transport,Y-ward mass transport from residual mean (resolved plus parameterized) advective transport.,"Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: mean where sea time: mean, CHANGE SINCE CMIP6 in Cell Measures - CMIP6:::OPT CMIP7:area: areacello volume: volcello,",longitude latitude olevel time,vmo,real,,XY-O,time-intv,Omon,vmo,vmo,tavg-ol-hxy-sea,vmo_tavg-ol-hxy-sea,glb,Omon.vmo,ocean.vmo.tavg-ol-hxy-sea.mon.glb,baa598c0-e5dd-11e5-8482-ac72891c3257,,
+116,ocean.vo.tavg-ol-hxy-sea.mon.glb,mon,ocean,sea_water_y_velocity,m s-1,area: mean where sea time: mean,area: areacello volume: volcello,Sea Water Y Velocity,Prognostic y-ward velocity component resolved by the model.,"Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: mean where sea time: mean, CHANGE SINCE CMIP6 in Cell Measures - CMIP6:::OPT CMIP7:area: areacello volume: volcello,",longitude latitude olevel time,vo,real,,XY-O,time-intv,Omon,vo,vo,tavg-ol-hxy-sea,vo_tavg-ol-hxy-sea,glb,Omon.vo,ocean.vo.tavg-ol-hxy-sea.mon.glb,baa58b1e-e5dd-11e5-8482-ac72891c3257,,
+117,ocean.wmo.tavg-ol-hxy-sea.mon.glb,mon,ocean,upward_ocean_mass_transport,kg s-1,area: sum where sea time: mean,area: areacello volume: volcello,Upward Ocean Mass Transport,Upward mass transport from residual mean (resolved plus parameterized) advective transport.,Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native. Those who wish to record vertical velocities and vertical fluxes on ocean half-levels may do so. If using CMOR3 you will be required to specify artificial bounds (e.g. located at full model levels) to avoid an error exit.,longitude latitude olevel time,wmo,real,,XY-O,time-intv,Omon,wmo,wmo,tavg-ol-hxy-sea,wmo_tavg-ol-hxy-sea,glb,Omon.wmo,ocean.wmo.tavg-ol-hxy-sea.mon.glb,baa58f74-e5dd-11e5-8482-ac72891c3257,,
+118,ocean.wo.tavg-ol-hxy-sea.mon.glb,mon,ocean,upward_sea_water_velocity,m s-1,area: mean where sea time: mean,area: areacello volume: volcello,Sea Water Vertical Velocity,Prognostic z-ward velocity component resolved by the model.,"Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native. Those who wish to record vertical velocities and vertical fluxes on ocean half-levels may do so. If using CMOR3 you will be required to specify artificial bounds (e.g. located at full model levels) to avoid an error exit. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:area: mean where sea time: mean, CHANGE SINCE CMIP6 in Cell Measures - CMIP6:::OPT CMIP7:area: areacello volume: volcello,",longitude latitude olevel time,wo,real,,XY-O,time-intv,Omon,wo,wo,tavg-ol-hxy-sea,wo_tavg-ol-hxy-sea,glb,Omon.wo,ocean.wo.tavg-ol-hxy-sea.mon.glb,1aab80fc-b006-11e6-9289-ac72891c3257,,
+119,ocean.zos.tavg-u-hxy-sea.day.glb,day,ocean,sea_surface_height_above_geoid,m,area: mean where sea time: mean,area: areacello,Sea Surface Height Above Geoid,"This is the effective dynamic sea level, so should have zero global area mean. zos is the effective sea level as if sea ice (and snow) at a grid cell were converted to liquid seawater (Campin et al., 2008). For OMIP, do _not _record inverse barometer responses from sea-ice (and snow) loading in zos. See (Griffies et al, 2016, https://doi.org/10.5194/gmd-9-3231-2016).","Evaluated at the upper boundary of the liquid ocean, including at the lower boundary of sea-ice and floating ice shelves.
+The effective dynamic sea level as if sea ice (and snow) at a grid cell were converted to liquid seawater. The liquid-water equivalent sea surface which the liquid would have if the ice were replaced by an equal mass of sea water of the density of the surface water in its vicinity. Inverse barometer responses from sea-ice (and snow) loading are removed using equation H3 of Griffies et al, 2016 (). zos is a dynamic sea level should have zero global area mean.
+Ocean dynamic sea level is defined by Gregory et al. (2019: [doi.org/10.1007/s10712-019-09525-z](https://airtable.com/appqRFkdpwAitEZNY/tblxLKbWgySWunrpw/doi.org/10.1007/s10712-019-09525-z) )",longitude latitude time,zos,real,,XY-na,time-intv,Oday,zos,zos,tavg-u-hxy-sea,zos_tavg-u-hxy-sea,glb,Oday.zos,ocean.zos.tavg-u-hxy-sea.day.glb,83bbfb69-7f07-11ef-9308-b1dd71e64bec,,
+120,ocean.zos.tavg-u-hxy-sea.mon.glb,mon,ocean,sea_surface_height_above_geoid,m,area: mean where sea time: mean,area: areacello,Sea Surface Height Above Geoid,"This is the effective dynamic sea level, so should have zero global area mean. It should not include inverse barometer depressions from sea ice.","See OMDP document for details. Report on native horizontal grid as well as on a spherical latitude/longitude grid.
+The effective dynamic sea level as if sea ice (and snow) at a grid cell were converted to liquid seawater. The liquid-water equivalent sea surface which the liquid would have if the ice were replaced by an equal mass of sea water of the density of the surface water in its vicinity. Inverse barometer responses from sea-ice (and snow) loading are removed using equation H3 of Griffies et al, 2016 (). zos is a dynamic sea level should have zero global area mean.
+Ocean dynamic sea level is defined by Gregory et al. (2019: [doi.org/10.1007/s10712-019-09525-z](https://airtable.com/appqRFkdpwAitEZNY/tblxLKbWgySWunrpw/doi.org/10.1007/s10712-019-09525-z) )",longitude latitude time,zos,real,,XY-na,time-intv,Omon,zos,zos,tavg-u-hxy-sea,zos_tavg-u-hxy-sea,glb,Omon.zos,ocean.zos.tavg-u-hxy-sea.mon.glb,baa507f2-e5dd-11e5-8482-ac72891c3257,,
+121,ocean.zostoga.tavg-u-hm-sea.mon.glb,mon,ocean,global_average_thermosteric_sea_level_change,m,area: mean where sea time: mean,,Global Average Thermosteric Sea Level Change,There is no CMIP6 request for zosga nor zossga.,,time,zostoga,real,,na-na,time-intv,Omon,zostoga,zostoga,tavg-u-hm-sea,zostoga_tavg-u-hm-sea,glb,Omon.zostoga,ocean.zostoga.tavg-u-hm-sea.mon.glb,baa51058-e5dd-11e5-8482-ac72891c3257,,
\ No newline at end of file
diff --git a/awi-esm3-veg-hr-variables/core_ocean/cmip7_awiesm3-veg-hr_ocean.yaml b/awi-esm3-veg-hr-variables/core_ocean/cmip7_awiesm3-veg-hr_ocean.yaml
new file mode 100644
index 00000000..71042193
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/core_ocean/cmip7_awiesm3-veg-hr_ocean.yaml
@@ -0,0 +1,454 @@
+# CMIP7 Core Ocean Variables — AWI-ESM3-VEG-HR
+# Generated from cmip7_all_core_variables_ocean.csv
+#
+# Research notes:
+# - FESOM2 uses POTENTIAL temperature (not conservative) → no bigthetao
+# - MLD3 is the CMIP-compliant definition (sigma_t=0.03), not MLD1
+# - uo/vo use unod/vnod (nodal, nod2 grid) instead of u/v (elem grid)
+# - tauuo/tauvo still on elem grid — may need elem→node step
+
+general:
+ name: "awiesm3-cmip7-core-ocean"
+ cmor_version: "CMIP7"
+ mip: "CMIP"
+ CMIP7_DReq_metadata: "/home/a/a270092/.cache/pycmor/cmip7_metadata/v1.2.2.2/metadata.json"
+
+pycmor:
+ warn_on_no_rule: False
+ dask_cluster: "slurm"
+ dask_cluster_scaling_mode: "fixed"
+ dask_cluster_scaling_fixed_jobs: 1
+
+jobqueue:
+ slurm:
+ name: pycmor-worker
+ queue: compute
+ account: bb1469
+ cores: 16
+ memory: 256GB
+ walltime: '00:30:00'
+
+pipelines:
+ - name: ocean_vertical_integration_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:vertical_integrate
+ - pycmor.std_lib.add_vertical_bounds
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Ofx pipeline: load grid file, extract variable directly (e.g., areacello)
+ - name: fx_extract_pipeline
+ steps:
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:load_gridfile
+ - pycmor.std_lib.generic.get_variable
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Ofx pipeline: compute bathymetry from mesh depth_lev
+ - name: fx_deptho_pipeline
+ steps:
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:load_gridfile
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_deptho
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Ofx pipeline: compute sea area fraction from mesh
+ - name: fx_sftof_pipeline
+ steps:
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:load_gridfile
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_sftof
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Ofx pipeline: compute static layer thickness from depth_bnds
+ - name: fx_thkcello_pipeline
+ steps:
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:load_gridfile
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_thkcello_fx
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Ofx pipeline: compute static mass per area (rho_0 * thkcello)
+ - name: fx_masscello_pipeline
+ steps:
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:load_gridfile
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_masscello_fx
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Mass transport pipeline: load velocity → extract → multiply by rho_0*dz
+ - name: mass_transport_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_mass_transport
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Scale pipeline: multiply variable by a constant (scale_factor on rule)
+ - name: scale_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:scale_by_constant
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Zostoga pipeline: load temperature → extract → compute global thermosteric SL
+ - name: zostoga_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_zostoga
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+inherit:
+ data_path: &dp /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/fesom
+ source_id: AWI-ESM-3
+ institution_id: AWI
+ experiment_id: picontrol
+ variant_label: r1i1p1f1
+ grid_label: gn
+ mesh_path: &mp /work/ab0246/a270092/input/fesom2/dars2
+ grid_file: /work/ab0246/a270092/input/fesom2/dars2/mesh.nc
+ grid: "FESOM 2.6 unstructured grid DARS (3146761 surface nodes)"
+ nominal_resolution: "10 km"
+ institution: "Alfred Wegener Institute, Helmholtz Centre for Polar and Marine Research, Bremerhaven, Germany"
+ output_directory: ./cmorized_output/awiesm3
+
+rules:
+ # ============================================================
+ # Monthly 2D surface variables (Omon) — DefaultPipeline
+ # ============================================================
+
+ - name: tos
+ inputs:
+ - path: *dp
+ pattern: sst.fesom.1350.nc
+ compound_name: ocean.tos.tavg-u-hxy-sea.mon.GLB
+ model_variable: sst
+
+ - name: sos
+ inputs:
+ - path: *dp
+ pattern: sss.fesom.1350.nc
+ compound_name: ocean.sos.tavg-u-hxy-sea.mon.GLB
+ model_variable: sss
+
+ - name: zos
+ inputs:
+ - path: *dp
+ pattern: ssh.fesom.1350.nc
+ compound_name: ocean.zos.tavg-u-hxy-sea.mon.GLB
+ model_variable: ssh
+
+ - name: hfds
+ inputs:
+ - path: *dp
+ pattern: fh.fesom.1350.nc
+ compound_name: ocean.hfds.tavg-u-hxy-sea.mon.GLB
+ model_variable: fh
+
+ - name: mlotst
+ inputs:
+ - path: *dp
+ pattern: MLD3.fesom.1350.nc
+ compound_name: ocean.mlotst.tavg-u-hxy-sea.mon.GLB
+ model_variable: MLD3
+ # MLD3 = Griffies 2016 (sigma_t=0.03 kg/m3) = CMIP-compliant mlotst
+
+ - name: tauuo
+ inputs:
+ - path: *dp
+ pattern: tx_sur.fesom.1350.nc
+ compound_name: ocean.tauuo.tavg-u-hxy-sea.mon.GLB
+ model_variable: tx_sur
+ # NOTE: tx_sur is on elem grid (6.2M elements), not nod2 (3.1M nodes).
+ # vec_autorotate=.true. set in namelist.io
+ # May still need elem→node interpolation pipeline step for consistency.
+
+ - name: tauvo
+ inputs:
+ - path: *dp
+ pattern: ty_sur.fesom.1350.nc
+ compound_name: ocean.tauvo.tavg-u-hxy-sea.mon.GLB
+ model_variable: ty_sur
+ # NOTE: Same elem grid caveat as tauuo.
+
+ # ============================================================
+ # Monthly 3D variables (Omon) — DefaultPipeline
+ # ============================================================
+
+ - name: thetao
+ inputs:
+ - path: *dp
+ pattern: temp.fesom.1350.nc
+ compound_name: ocean.thetao.tavg-ol-hxy-sea.mon.GLB
+ model_variable: temp
+
+ # bigthetao: SKIPPED — FESOM2 uses potential temperature, not conservative.
+ # Only thetao should be reported.
+
+ - name: so
+ inputs:
+ - path: *dp
+ pattern: salt.fesom.1350.nc
+ compound_name: ocean.so.tavg-ol-hxy-sea.mon.GLB
+ model_variable: salt
+
+ - name: uo
+ inputs:
+ - path: *dp
+ pattern: unod.fesom.1350.nc
+ compound_name: ocean.uo.tavg-ol-hxy-sea.mon.GLB
+ model_variable: unod
+ # Using unod (nodal velocity, nod2 grid) instead of u (elem grid).
+ # vec_autorotate=.true. set in namelist.io
+
+ - name: vo
+ inputs:
+ - path: *dp
+ pattern: vnod.fesom.1350.nc
+ compound_name: ocean.vo.tavg-ol-hxy-sea.mon.GLB
+ model_variable: vnod
+ # Using vnod (nodal velocity, nod2 grid) instead of v (elem grid).
+ # vec_autorotate=.true. set in namelist.io
+
+ - name: wo
+ inputs:
+ - path: *dp
+ pattern: w.fesom.1350.nc
+ compound_name: ocean.wo.tavg-ol-hxy-sea.mon.GLB
+ model_variable: w
+ # NOTE: w is on nz (57 interfaces), not nz1 (56 midpoints).
+ # May need vertical coordinate handling different from tracers.
+
+ # ============================================================
+ # Depth-integrated variables — ocean_vertical_integration_pipeline
+ # ============================================================
+
+ - name: absscint
+ inputs:
+ - path: *dp
+ pattern: salt.fesom.1350.nc
+ compound_name: ocean.absscint.tavg-op4-hxy-sea.mon.GLB
+ model_variable: salt
+ integration_attrs:
+ long_name: "Integral wrt depth of seawater absolute salinity expressed as salt mass content"
+ standard_name: "integral_wrt_depth_of_sea_water_absolute_salinity_expressed_as_salt_mass_content"
+ units: "kg m-2"
+ pipelines:
+ - ocean_vertical_integration_pipeline
+
+ # ============================================================
+ # Daily variables (Oday) — DefaultPipeline
+ # ============================================================
+
+ - name: tos_day
+ inputs:
+ - path: *dp
+ pattern: sst.fesom.1350.nc
+ compound_name: ocean.tos.tavg-u-hxy-sea.day.GLB
+ model_variable: sst
+
+ - name: sos_day
+ inputs:
+ - path: *dp
+ pattern: sss.fesom.1350.nc
+ compound_name: ocean.sos.tavg-u-hxy-sea.day.GLB
+ model_variable: sss
+
+ - name: zos_day
+ inputs:
+ - path: *dp
+ pattern: ssh.fesom.1350.nc
+ compound_name: ocean.zos.tavg-u-hxy-sea.day.GLB
+ model_variable: ssh
+
+ # ============================================================
+ # Ofx mesh-derived variables — fx pipelines
+ # ============================================================
+
+ - name: areacello
+ inputs:
+ - path: *mp
+ pattern: mesh.nc
+ compound_name: ocean.areacello.ti-u-hxy-u.fx.GLB
+ model_variable: cell_area
+ pipelines:
+ - fx_extract_pipeline
+
+ - name: deptho
+ inputs:
+ - path: *mp
+ pattern: mesh.nc
+ compound_name: ocean.deptho.ti-u-hxy-sea.fx.GLB
+ model_variable: deptho
+ pipelines:
+ - fx_deptho_pipeline
+
+ - name: sftof
+ inputs:
+ - path: *mp
+ pattern: mesh.nc
+ compound_name: ocean.sftof.ti-u-hxy-u.fx.GLB
+ model_variable: sftof
+ pipelines:
+ - fx_sftof_pipeline
+
+ - name: thkcello_fx
+ inputs:
+ - path: *mp
+ pattern: mesh.nc
+ compound_name: ocean.thkcello.ti-ol-hxy-sea.fx.GLB
+ model_variable: thkcello
+ pipelines:
+ - fx_thkcello_pipeline
+
+ - name: masscello_fx
+ inputs:
+ - path: *mp
+ pattern: mesh.nc
+ compound_name: ocean.masscello.ti-ol-hxy-sea.fx.GLB
+ model_variable: masscello
+ reference_density: 1025.0
+ pipelines:
+ - fx_masscello_pipeline
+
+ # basin (Ofx) — NOT POSSIBLE: needs external basin mask data, not in mesh
+ # hfgeou (Ofx) — NOT POSSIBLE: not in FESOM output or config
+
+ # ============================================================
+ # Time-varying cell thickness — DefaultPipeline
+ # ============================================================
+
+ - name: thkcello
+ inputs:
+ - path: *dp
+ pattern: hnode.fesom.1350.nc
+ compound_name: ocean.thkcello.tavg-ol-hxy-sea.mon.GLB
+ model_variable: hnode
+
+ - name: masscello
+ inputs:
+ - path: *dp
+ pattern: hnode.fesom.1350.nc
+ compound_name: ocean.masscello.tavg-ol-hxy-sea.mon.GLB
+ model_variable: hnode
+ scale_factor: 1025.0
+ scaled_units: "kg m-2"
+ pipelines:
+ - scale_pipeline
+
+ # ============================================================
+ # Mass transport — mass_transport_pipeline (Boussinesq: u * rho_0 * dz)
+ # Uses unod/vnod (rotated with vec_autorotate=.true.)
+ # ============================================================
+
+ - name: umo
+ inputs:
+ - path: *dp
+ pattern: unod.fesom.1350.nc
+ compound_name: ocean.umo.tavg-ol-hxy-sea.mon.GLB
+ model_variable: unod
+ reference_density: 1025.0
+ transport_component: x
+ pipelines:
+ - mass_transport_pipeline
+
+ - name: vmo
+ inputs:
+ - path: *dp
+ pattern: vnod.fesom.1350.nc
+ compound_name: ocean.vmo.tavg-ol-hxy-sea.mon.GLB
+ model_variable: vnod
+ reference_density: 1025.0
+ transport_component: y
+ pipelines:
+ - mass_transport_pipeline
+
+ - name: wmo
+ inputs:
+ - path: *dp
+ pattern: w.fesom.1350.nc
+ compound_name: ocean.wmo.tavg-ol-hxy-sea.mon.GLB
+ model_variable: w
+ reference_density: 1025.0
+ transport_component: z
+ pipelines:
+ - mass_transport_pipeline
+
+ # ============================================================
+ # Global thermosteric sea level — zostoga_pipeline
+ # Computes steric height anomaly from temperature using gsw (TEOS-10)
+ # ============================================================
+
+ - name: zostoga
+ inputs:
+ - path: *dp
+ pattern: temp.fesom.1350.nc
+ compound_name: ocean.zostoga.tavg-u-hm-sea.mon.GLB
+ model_variable: temp
+ salt_file: /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/fesom/salt.fesom.1350.nc
+ salt_variable: salt
+ reference_density: 1025.0
+ pipelines:
+ - zostoga_pipeline
diff --git a/awi-esm3-veg-hr-variables/core_ocean/cmip7_ocean_variables_todo.md b/awi-esm3-veg-hr-variables/core_ocean/cmip7_ocean_variables_todo.md
new file mode 100644
index 00000000..e4ebcbae
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/core_ocean/cmip7_ocean_variables_todo.md
@@ -0,0 +1,62 @@
+# CMIP7 Core Ocean Variables — Rule Implementation TODO
+
+Variables from `cmip7_all_core_variables_ocean.csv` that need pycmor rules for AWI-ESM3.
+Rules file: `cmip7_awiesm3-veg-hr_ocean.yaml`
+
+## Monthly 2D (Omon, surface/integrated)
+
+- [x] **tos** — Sea Surface Temperature (`degC`, Omon) *(implemented + tested)*
+- [x] **sos** — Sea Surface Salinity (`1E-03`, Omon) *(rule written, uses sss.fesom)*
+- [x] **zos** — Sea Surface Height Above Geoid (`m`, Omon) *(rule written, uses ssh.fesom)*
+- [x] **hfds** — Downward Heat Flux at Sea Water Surface (`W m-2`, Omon) *(rule written, uses fh.fesom)*
+- [x] **mlotst** — Ocean Mixed Layer Thickness by Sigma T (`m`, Omon) *(rule written, uses MLD3.fesom)*
+- [x] **absscint** — Depth-integrated salinity (`kg m-2`, Omon) *(implemented + tested)*
+- [x] **tauuo** — Sea Water Surface Downward X Stress (`N m-2`, Omon) *(rule written, uses tx_sur.fesom, elem grid)*
+- [x] **tauvo** — Sea Water Surface Downward Y Stress (`N m-2`, Omon) *(rule written, uses ty_sur.fesom, elem grid)*
+- [x] **zostoga** — Global Average Thermosteric Sea Level Change (`m`, Omon) *(rule + zostoga_pipeline, gsw/TEOS-10)*
+
+## Monthly 3D (Omon, with olevel)
+
+- [x] **thetao** — Sea Water Potential Temperature (`degC`, Omon, 3D) *(rule written, uses temp.fesom)*
+- [x] **so** — Sea Water Salinity (`1E-03`, Omon, 3D) *(rule written, uses salt.fesom)*
+- [x] **wo** — Sea Water Vertical Velocity (`m s-1`, Omon, 3D) *(rule written, uses w.fesom, nz=57 interfaces)*
+- [~] **bigthetao** — SKIPPED: FESOM2 uses potential temp, not conservative
+- [x] **uo** — Sea Water X Velocity (`m s-1`, Omon, 3D) *(rule written, uses unod.fesom, needs vec_autorotate)*
+- [x] **vo** — Sea Water Y Velocity (`m s-1`, Omon, 3D) *(rule written, uses vnod.fesom, needs vec_autorotate)*
+- [x] **thkcello** — Ocean Model Cell Thickness (`m`, Omon, time-varying) *(rule written, uses hnode.fesom, needs model re-run)*
+- [x] **masscello** — Ocean Grid-Cell Mass per Area (`kg m-2`, Omon, time-varying) — rho_0 × hnode via scale_pipeline
+- [x] **umo** — Ocean Mass X Transport (`kg s-1`, Omon, 3D) *(rule + mass_transport_pipeline, Boussinesq approx)*
+- [x] **vmo** — Ocean Mass Y Transport (`kg s-1`, Omon, 3D) *(rule + mass_transport_pipeline)*
+- [x] **wmo** — Upward Ocean Mass Transport (`kg s-1`, Omon, 3D) *(rule + mass_transport_pipeline)*
+
+## Fixed frequency (Ofx) — fx pipelines built
+
+- [x] **areacello** — Grid-Cell Area (`m2`, Ofx) *(rule + fx_extract_pipeline, reads mesh.nc cell_area)*
+- [x] **deptho** — Sea Floor Depth Below Geoid (`m`, Ofx) *(rule + fx_deptho_pipeline)*
+- [x] **sftof** — Sea Area Percentage (`%`, Ofx) *(rule + fx_sftof_pipeline)*
+- [x] **thkcello** — Ocean Model Cell Thickness (`m`, Ofx, static) *(rule + fx_thkcello_pipeline)*
+- [x] **masscello** — Ocean Grid-Cell Mass per Area (`kg m-2`, Ofx, static) *(rule + fx_masscello_pipeline)*
+- [ ] **basin** — Region Selection Index (`1`, Ofx) — NOT POSSIBLE: needs external basin mask
+- [ ] **hfgeou** — Upward Geothermal Heat Flux (`W m-2`, Ofx) — NOT POSSIBLE: not in FESOM
+
+## Daily (Oday) — namelist.io updated to daily frequency
+
+- [x] **tos** — Sea Surface Temperature (`degC`, Oday) — rule written (tos_day, DefaultPipeline)
+- [x] **sos** — Sea Surface Salinity (`1E-03`, Oday) — rule written (sos_day, DefaultPipeline)
+- [x] **zos** — Sea Surface Height Above Geoid (`m`, Oday) — rule written (zos_day, DefaultPipeline)
+
+## Blockers (namelist.io updated, model re-run needed)
+
+1. ~~**vec_autorotate=.false.**~~ → FIXED in namelist.io, set to .true.
+2. **elem vs nod2 grid** → tauuo/tauvo still on elem grid, may need interpolation step
+3. ~~**No daily output**~~ → FIXED: daily sst/sss/ssh added to namelist.io
+4. ~~**hnode not enabled**~~ → FIXED: hnode added to namelist.io
+5. **No mass transport** → umo/vmo/wmo not output by FESOM, need post-processing pipeline
+
+## Research findings
+
+- FESOM2 uses **potential temperature** (not conservative) → bigthetao not applicable
+- **MLD3** (Griffies 2016, sigma_t=0.03) is the CMIP-compliant mlotst definition
+- mesh.nc contains: cell_area, depth[57], depth_bnds[58], depth_lev per cell
+- Vertical dims: nz1=56 (midpoints, tracers+horiz vel), nz=57 (interfaces, w only)
+- u/v on elem (6.2M), tracers/unod/vnod on nod2 (3.1M)
diff --git a/awi-esm3-veg-hr-variables/core_seaice/cmip7_all_core_variables_seaIce.csv b/awi-esm3-veg-hr-variables/core_seaice/cmip7_all_core_variables_seaIce.csv
new file mode 100644
index 00000000..e0f08cf0
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/core_seaice/cmip7_all_core_variables_seaIce.csv
@@ -0,0 +1,16 @@
+,name,frequency,modeling_realm,standard_name,units,cell_methods,cell_measures,long_name,comment,processing_note,dimensions,out_name,type,positive,spatial_shape,temporal_shape,cmip6_table,physical_parameter_name,variableRootDD,branding_label,branded_variable_name,region,cmip6_compound_name,cmip7_compound_name,uid,flag_values,flag_meanings
+122,seaIce.siconc.tavg-u-hxy-u.day.glb,day,seaIce,sea_ice_area_fraction,%,area: time: mean,area: areacello,Sea-Ice Area Percentage (Ocean Grid),"Percentage of a given grid cell that is covered by sea ice on the ocean grid, independent of the thickness of that ice.","CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where sea time: mean CMIP7:area: time: mean, CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude time typesi CMIP7:longitude latitude time,",longitude latitude time,siconc,real,,XY-na,time-intv,SIday,siconc,siconc,tavg-u-hxy-u,siconc_tavg-u-hxy-u,glb,SIday.siconc,seaIce.siconc.tavg-u-hxy-u.day.glb,85c3e888-357c-11e7-8257-5404a60d96b5,,
+123,seaIce.siconc.tavg-u-hxy-u.mon.glb,mon,seaIce,sea_ice_area_fraction,%,area: time: mean,area: areacello,Sea-Ice Area Percentage (Ocean Grid),"Percentage of a given grid cell that is covered by sea ice on the ocean grid, independent of the thickness of that ice.","CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where sea time: mean CMIP7:area: time: mean, CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude time typesi CMIP7:longitude latitude time,",longitude latitude time,siconc,real,,XY-na,time-intv,SImon,siconc,siconc,tavg-u-hxy-u,siconc_tavg-u-hxy-u,glb,SImon.siconc,seaIce.siconc.tavg-u-hxy-u.mon.glb,86119ff6-357c-11e7-8257-5404a60d96b5,,
+124,seaIce.simass.tavg-u-hxy-si.mon.glb,mon,seaIce,sea_ice_amount,kg m-2,area: time: mean where sea_ice over all_area_types,area: areacello,Sea-Ice Mass,Total mass of sea ice divided by grid-cell area.,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where sea time: mean CMIP7:area: mean where sea_ice over all___area_types time: mean ,
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where sea time: mean CMIP7:area: time: mean where sea_ice over all_area_types,",longitude latitude time,simass,real,,XY-na,time-intv,SImon,simass,simass,tavg-u-hxy-si,simass_tavg-u-hxy-si,glb,SImon.simass,seaIce.simass.tavg-u-hxy-si.mon.glb,714b603a-faa7-11e6-bfb7-ac72891c3257,,
+126,seaIce.sitimefrac.tavg-u-hxy-sea.mon.glb,mon,seaIce,fraction_of_time_with_sea_ice_area_fraction_above_threshold,1,area: mean where sea time: mean,area: areacello,Fraction of Time Steps with Sea Ice,Fraction of time steps of the averaging period during which sea ice is present (siconc > 0) in a grid cell.,,longitude latitude time,sitimefrac,real,,XY-na,time-intv,SImon,sitimefrac,sitimefrac,tavg-u-hxy-sea,sitimefrac_tavg-u-hxy-sea,glb,SImon.sitimefrac,seaIce.sitimefrac.tavg-u-hxy-sea.mon.glb,714344cc-faa7-11e6-bfb7-ac72891c3257,,
+127,seaIce.siu.tavg-u-hxy-si.mon.glb,mon,seaIce,sea_ice_x_velocity,m s-1,area: time: mean where sea_ice (mask=siconc),--MODEL,X-Component of Sea-Ice Velocity,X-component of sea-ice velocity on native model grid.,"Note that SIMIP requests the area-weighted average for all intensive variables (i.e., variables that are not proportional to area fraction such as albedo, temperature, or heat flux). Hence, all time samples with non-zero sea-ice fraction are first multiplied by area fraction, then summed, and then divided by the sum of the area fractions. See Appendix C of Notz et al. (2016) for more detail.
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean where sea_ice (comment: mask=siconc) CMIP7:area: time: mean where sea_ice (mask=siconc),
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean where sea_ice (comment: mask=siconc) CMIP7:area: time: mean where sea_ice (mask=siconc),",longitude latitude time,siu,real,,XY-na,time-intv,SImon,siu,siu,tavg-u-hxy-si,siu_tavg-u-hxy-si,glb,SImon.siu,seaIce.siu.tavg-u-hxy-si.mon.glb,7147b8fe-faa7-11e6-bfb7-ac72891c3257,,
+128,seaIce.siv.tavg-u-hxy-si.mon.glb,mon,seaIce,sea_ice_y_velocity,m s-1,area: time: mean where sea_ice (mask=siconc),--MODEL,Y-Component of Sea-Ice Velocity,Y-component of sea-ice velocity on native model grid.,"Note that SIMIP requests the area-weighted average for all intensive variables (i.e., variables that are not proportional to area fraction such as albedo, temperature, or heat flux). Hence, all time samples with non-zero sea-ice fraction are first multiplied by area fraction, then summed, and then divided by the sum of the area fractions. See Appendix C of Notz et al. (2016) for more detail.
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean where sea_ice (comment: mask=siconc) CMIP7:area: time: mean where sea_ice (mask=siconc),
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean where sea_ice (comment: mask=siconc) CMIP7:area: time: mean where sea_ice (mask=siconc),",longitude latitude time,siv,real,,XY-na,time-intv,SImon,siv,siv,tavg-u-hxy-si,siv_tavg-u-hxy-si,glb,SImon.siv,seaIce.siv.tavg-u-hxy-si.mon.glb,71237944-faa7-11e6-bfb7-ac72891c3257,,
+129,seaIce.snd.tavg-u-hxy-sn.mon.glb,mon,seaIce,surface_snow_thickness,m,area: time: mean where snow (for snow on sea ice only),area: areacello,Snow Thickness,Actual thickness of snow averaged over the snow-covered part of the sea ice. This thickness is usually directly available within the model formulation. It can also be derived by dividing the total volume of snow by the area of the snow.,"Note that SIMIP requests the area-weighted average for all intensive variables (i.e., variables that are not proportional to area fraction such as albedo, temperature, or heat flux). Hence, all time samples with non-zero sea-ice fraction are first multiplied by area fraction, then summed, and then divided by the sum of the area fractions. See Appendix C of Notz et al. (2016) for more detail.
+ CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where snow over sea_ice area: time: mean where sea_ice CMIP7:area: time: mean where snow (for snow on sea ice only),",longitude latitude time,snd,real,,XY-na,time-intv,SImon,sisnthick,snd,tavg-u-hxy-sn,snd_tavg-u-hxy-sn,glb,SImon.sisnthick,seaIce.snd.tavg-u-hxy-sn.mon.glb,714eec6e-faa7-11e6-bfb7-ac72891c3257,,
+130,seaIce.ts.tavg-u-hxy-si.mon.glb,mon,seaIce,surface_temperature,K,area: time: mean where sea_ice (mask=siconc),area: areacello,Surface Temperature of Sea Ice,"Mean surface temperature of the sea-ice covered part of the grid cell. Wherever snow covers the ice, the surface temperature of the snow is used for the averaging, otherwise the surface temperature of the ice is used.","Note that SIMIP requests the area-weighted average for all intensive variables (i.e., variables that are not proportional to area fraction such as albedo, temperature, or heat flux). Hence, all time samples with non-zero sea-ice fraction are first multiplied by area fraction, then summed, and then divided by the sum of the area fractions. See Appendix C of Notz et al. (2016) for more detail.
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean where sea_ice (comment: mask=siconc) CMIP7:area: time: mean where sea_ice (mask=siconc),",longitude latitude time,ts,real,,XY-na,time-intv,SImon,sitemptop,ts,tavg-u-hxy-si,ts_tavg-u-hxy-si,glb,SImon.sitemptop,seaIce.ts.tavg-u-hxy-si.mon.glb,711075e2-faa7-11e6-bfb7-ac72891c3257,,
\ No newline at end of file
diff --git a/awi-esm3-veg-hr-variables/core_seaice/cmip7_all_core_variables_seaIce_ocean.csv b/awi-esm3-veg-hr-variables/core_seaice/cmip7_all_core_variables_seaIce_ocean.csv
new file mode 100644
index 00000000..f0f7deca
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/core_seaice/cmip7_all_core_variables_seaIce_ocean.csv
@@ -0,0 +1,3 @@
+,name,frequency,modeling_realm,standard_name,units,cell_methods,cell_measures,long_name,comment,processing_note,dimensions,out_name,type,positive,spatial_shape,temporal_shape,cmip6_table,physical_parameter_name,variableRootDD,branding_label,branded_variable_name,region,cmip6_compound_name,cmip7_compound_name,uid,flag_values,flag_meanings
+125,seaIce.sithick.tavg-u-hxy-si.mon.glb,mon,seaIce ocean,sea_ice_thickness,m,area: time: mean where sea_ice (mask=siconc),area: areacello,Sea-Ice Thickness,"Actual (floe) thickness of sea ice averaged over the ice-covered part of a given grid cell, NOT volume divided by grid area.","Note that SIMIP requests the area-weighted average for all intensive variables (i.e., variables that are not proportional to area fraction such as albedo, temperature, or heat flux). Hence, all time samples with non-zero sea-ice fraction are first multiplied by area fraction, then summed, and then divided by the sum of the area fractions. See Appendix C of Notz et al. (2016) for more detail.
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean where sea_ice (comment: mask=siconc) CMIP7:area: time: mean where sea_ice (mask=siconc),",longitude latitude time,sithick,real,,XY-na,time-intv,SImon,sithick,sithick,tavg-u-hxy-si,sithick_tavg-u-hxy-si,glb,SImon.sithick,seaIce.sithick.tavg-u-hxy-si.mon.glb,d241a6d2-4a9f-11e6-b84e-ac72891c3257,,
\ No newline at end of file
diff --git a/awi-esm3-veg-hr-variables/core_seaice/cmip7_awiesm3-veg-hr_seaice.yaml b/awi-esm3-veg-hr-variables/core_seaice/cmip7_awiesm3-veg-hr_seaice.yaml
new file mode 100644
index 00000000..9e83c438
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/core_seaice/cmip7_awiesm3-veg-hr_seaice.yaml
@@ -0,0 +1,165 @@
+# CMIP7 Core Sea Ice Variables — AWI-ESM3-VEG-HR
+# Generated from cmip7_all_core_variables_seaIce.csv + seaIce_ocean.csv
+#
+# Research notes:
+# - a_ice is fraction (0-1), CMIP wants percentage → fraction_to_percent step
+# - ist available because AWI-ESM3 compiled with __oifs
+# - sitimefrac approximated from monthly siconc>0 (binary)
+
+general:
+ name: "awiesm3-cmip7-core-seaice"
+ cmor_version: "CMIP7"
+ mip: "CMIP"
+ CMIP7_DReq_metadata: "/home/a/a270092/.cache/pycmor/cmip7_metadata/v1.2.2.2/metadata.json"
+
+pycmor:
+ warn_on_no_rule: False
+ dask_cluster: "slurm"
+ dask_cluster_scaling_mode: "fixed"
+ dask_cluster_scaling_fixed_jobs: 1
+
+jobqueue:
+ slurm:
+ name: pycmor-worker
+ queue: compute
+ account: bb1469
+ cores: 16
+ memory: 256GB
+ walltime: '00:30:00'
+
+pipelines:
+ # siconc: fraction (0-1) → percentage (0-100)
+ - name: siconc_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:fraction_to_percent
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # sitimefrac: binary ice presence from siconc > 0
+ - name: sitimefrac_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_sitimefrac
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+inherit:
+ data_path: &dp /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/fesom
+ source_id: AWI-ESM-3
+ institution_id: AWI
+ experiment_id: picontrol
+ variant_label: r1i1p1f1
+ grid_label: gn
+ mesh_path: /work/ab0246/a270092/input/fesom2/dars2
+ grid_file: /work/ab0246/a270092/input/fesom2/dars2/mesh.nc
+ grid: "FESOM 2.6 unstructured grid DARS (3146761 surface nodes)"
+ nominal_resolution: "10 km"
+ institution: "Alfred Wegener Institute, Helmholtz Centre for Polar and Marine Research, Bremerhaven, Germany"
+ output_directory: ./cmorized_output/awiesm3
+
+rules:
+ # ============================================================
+ # Monthly (SImon) — DefaultPipeline
+ # ============================================================
+
+ - name: simass
+ inputs:
+ - path: *dp
+ pattern: m_ice.fesom.1350.nc
+ compound_name: seaIce.simass.tavg-u-hxy-si.mon.GLB
+ model_variable: m_ice
+
+ - name: siu
+ inputs:
+ - path: *dp
+ pattern: uice.fesom.1350.nc
+ compound_name: seaIce.siu.tavg-u-hxy-si.mon.GLB
+ model_variable: uice
+ # vec_autorotate=.true. set in namelist.io
+
+ - name: siv
+ inputs:
+ - path: *dp
+ pattern: vice.fesom.1350.nc
+ compound_name: seaIce.siv.tavg-u-hxy-si.mon.GLB
+ model_variable: vice
+ # vec_autorotate=.true. set in namelist.io
+
+ # ============================================================
+ # Monthly (SImon) — h_ice, h_snow, ist
+ # ============================================================
+
+ - name: sithick
+ inputs:
+ - path: *dp
+ pattern: h_ice.fesom.1350.nc
+ compound_name: seaIce.sithick.tavg-u-hxy-si.mon.GLB
+ model_variable: h_ice
+
+ - name: snd
+ inputs:
+ - path: *dp
+ pattern: h_snow.fesom.1350.nc
+ compound_name: seaIce.snd.tavg-u-hxy-sn.mon.GLB
+ model_variable: h_snow
+
+ - name: ts
+ inputs:
+ - path: *dp
+ pattern: ist.fesom.1350.nc
+ compound_name: seaIce.ts.tavg-u-hxy-si.mon.GLB
+ model_variable: ist
+ # ist outputs in K, CMIP wants K — no conversion needed
+
+ # ============================================================
+ # Monthly (SImon) — custom pipelines
+ # ============================================================
+
+ - name: siconc
+ inputs:
+ - path: *dp
+ pattern: a_ice.fesom.1350.nc
+ compound_name: seaIce.siconc.tavg-u-hxy-u.mon.GLB
+ model_variable: a_ice
+ pipelines:
+ - siconc_pipeline
+
+ - name: sitimefrac
+ inputs:
+ - path: *dp
+ pattern: a_ice.fesom.1350.nc
+ compound_name: seaIce.sitimefrac.tavg-u-hxy-sea.mon.GLB
+ model_variable: a_ice
+ pipelines:
+ - sitimefrac_pipeline
+
+ # ============================================================
+ # Daily (SIday)
+ # ============================================================
+
+ - name: siconc_day
+ inputs:
+ - path: *dp
+ pattern: a_ice.fesom.1350.nc
+ compound_name: seaIce.siconc.tavg-u-hxy-u.day.GLB
+ model_variable: a_ice
+ pipelines:
+ - siconc_pipeline
diff --git a/awi-esm3-veg-hr-variables/core_seaice/cmip7_seaice_variables_todo.md b/awi-esm3-veg-hr-variables/core_seaice/cmip7_seaice_variables_todo.md
new file mode 100644
index 00000000..7a462e9d
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/core_seaice/cmip7_seaice_variables_todo.md
@@ -0,0 +1,51 @@
+# CMIP7 Core Sea Ice Variables — Rule Implementation TODO
+
+Variables from `cmip7_all_core_variables_seaIce.csv` and `cmip7_all_core_variables_seaIce_ocean.csv`.
+
+Two CSVs because CMIP7 data request splits by modeling_realm:
+- `seaIce.csv` — realm=seaIce (pure sea-ice diagnostics)
+- `seaIce_ocean.csv` — realm="seaIce ocean" (cross-realm, just sithick)
+Both come from FESOM sea-ice output and are handled the same way.
+
+## Monthly (SImon)
+
+- [x] **siconc** — Sea-Ice Area Percentage (`%`, SImon) — from a_ice.fesom via siconc_pipeline (fraction_to_percent)
+- [x] **simass** — Sea-Ice Mass (`kg m-2`, SImon) — from m_ice.fesom (DefaultPipeline)
+- [x] **sithick** — Sea-Ice Thickness (`m`, SImon, cross-realm seaIce+ocean) — from h_ice.fesom (added to namelist.io, DefaultPipeline)
+- [x] **sitimefrac** — Fraction of Time with Sea Ice (`1`, SImon) — from a_ice.fesom via sitimefrac_pipeline (binary siconc>0)
+- [x] **siu** — Sea-Ice X Velocity (`m s-1`, SImon) — from uice.fesom (vec_autorotate=.true., DefaultPipeline)
+- [x] **siv** — Sea-Ice Y Velocity (`m s-1`, SImon) — from vice.fesom (vec_autorotate=.true., DefaultPipeline)
+- [x] **snd** — Snow Thickness on Sea Ice (`m`, SImon) — from h_snow.fesom (added to namelist.io, DefaultPipeline)
+- [x] **ts** — Surface Temperature of Sea Ice (`K`, SImon) — from ist.fesom (available with __oifs, added to namelist.io, DefaultPipeline)
+
+## Daily (SIday)
+
+- [x] **siconc** — Sea-Ice Area Percentage (`%`, SIday) — daily a_ice in namelist.io, rule written (siconc_pipeline)
+
+## Available FESOM output (monthly)
+
+| File | Variable | Description |
+|------|----------|-------------|
+| a_ice.fesom.1350.nc | a_ice | ice concentration (fraction, 0-1) |
+| m_ice.fesom.1350.nc | m_ice | ice mass per unit area (kg/m2) |
+| m_snow.fesom.1350.nc | m_snow | snow mass per unit area (kg/m2) |
+| uice.fesom.1350.nc | uice | ice velocity x (m/s) |
+| vice.fesom.1350.nc | vice | ice velocity y (m/s) |
+
+## Blockers
+
+1. ~~**siconc units**~~: RESOLVED — fraction_to_percent step in siconc_pipeline
+2. ~~**siu/siv rotation**~~: RESOLVED — vec_autorotate=.true. set in namelist.io
+3. ~~**sithick**~~: RESOLVED — h_ice added to namelist.io (direct output, no computation needed)
+4. ~~**snd**~~: RESOLVED — h_snow added to namelist.io (direct output, no computation needed)
+5. ~~**ts**~~: RESOLVED — ist available via __oifs flag, added to namelist.io
+6. ~~**sitimefrac**~~: RESOLVED — compute_sitimefrac step (binary siconc>0 from monthly data, approximation)
+7. **Daily siconc**: Needs daily `a_ice` entry in namelist.io (added, but needs model re-run to produce output)
+
+## Research findings
+
+- a_ice is ice concentration as fraction (0-1), not percentage
+- m_ice is ice mass per unit area (kg/m2), equivalent to simass
+- FESOM namelist catalog has `h_ice` and `h_snow` available but not enabled
+- `ist` (ice surface temp in K) available under OIFS interface (needs __oifs flag)
+- uice/vice subject to same vec_autorotate as ocean velocities
diff --git a/awi-esm3-veg-hr-variables/estimate_data_volume.py b/awi-esm3-veg-hr-variables/estimate_data_volume.py
new file mode 100644
index 00000000..7dd65c23
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/estimate_data_volume.py
@@ -0,0 +1,377 @@
+#!/usr/bin/env python3
+"""
+Estimate annual data volume for AWI-ESM3-VEG-HR CMIP7 CMORization.
+
+Reads all YAML rule files and CSVs, classifies by realm/frequency/grid,
+and computes estimated storage per year.
+
+Grid sizes (float32 = 4 bytes per value):
+ - atm/land (OIFS 0.25deg): 1440 x 720 = 1,036,800 gridpoints
+ - ocean/seaice (FESOM DARS): 3,146,761 surface nodes
+ - ocean 3D: 3,146,761 x 56 levels = 176,218,616 values
+ - LPJ-GUESS: ~420,000 gridpoints (land-only)
+
+Frequencies → timesteps per year:
+ - fx: 1
+ - yr: 1
+ - mon: 12
+ - day: 365
+ - 6hr: 1460
+ - 3hr: 2920
+ - 1hr: 8760
+"""
+
+import glob
+import os
+import re
+import csv
+import sys
+
+# ── Grid sizes (number of gridpoints) ──────────────────────────────
+GRID_POINTS = {
+ "atm_sfc": 1440 * 720, # 1,036,800
+ "atm_ml": 1440 * 720 * 91, # 91 model levels
+ "atm_pl": 1440 * 720 * 19, # plev19
+ "atm_pl3": 1440 * 720 * 3, # plev3
+ "atm_pl6": 1440 * 720 * 6, # plev6
+ "oce_sfc": 3_146_761, # FESOM DARS surface
+ "oce_3d": 3_146_761 * 56, # FESOM DARS 3D
+ "lpjg": 420_000, # LPJ-GUESS land cells
+}
+
+# ── Timesteps per year ──────────────────────────────────────────────
+TIMESTEPS = {
+ "fx": 1,
+ "yr": 1,
+ "dec": 0.1,
+ "mon": 12,
+ "Amon": 12,
+ "Lmon": 12,
+ "Omon": 12,
+ "SImon": 12,
+ "AERmon": 12,
+ "Emon": 12,
+ "LImon": 12,
+ "CFmon": 12,
+ "day": 365,
+ "Eday": 365,
+ "SIday": 365,
+ "Oday": 365,
+ "CFday": 365,
+ "6hr": 1460,
+ "6hrPt": 1460,
+ "3hr": 2920,
+ "3hrPt": 2920,
+ "CF3hr": 2920,
+ "E3hrPt": 2920,
+ "1hr": 8760,
+ "E1hr": 8760,
+ "AERhr": 8760,
+}
+
+BYTES_PER_VALUE = 4 # float32
+
+
+def guess_grid(rule_name, compound_name, realm, model_variable, is_3d=False):
+ """Guess grid size from rule metadata."""
+ cn = compound_name.lower() if compound_name else ""
+ rn = rule_name.lower()
+
+ # Ocean/sea-ice realm
+ if realm in ("ocean", "seaice", "seaIce", "landIce"):
+ if is_3d or any(k in cn for k in ("-al-", "-ol-", "3d", "mlev")):
+ return "oce_3d"
+ return "oce_sfc"
+
+ # Atmosphere model levels
+ if "-al-" in cn or "ml" in rn or "pfull" in rn:
+ return "atm_ml"
+
+ # Atmosphere pressure levels
+ if "plev19" in cn or "-p19-" in cn or "_pl_" in rn:
+ return "atm_pl"
+ if "plev3" in cn or "-p3-" in cn or "_pl3" in rn:
+ return "atm_pl3"
+ if "plev6" in cn or "-p6-" in cn or "_pl6" in rn:
+ return "atm_pl6"
+
+ # LPJ-GUESS
+ if "lpjg" in rn or "lpj" in rn or "Lut" in rn:
+ return "lpjg"
+
+ # Default: atmosphere surface
+ return "atm_sfc"
+
+
+def guess_frequency(rule_name, compound_name):
+ """Guess output frequency from compound_name or rule_name."""
+ cn = compound_name if compound_name else ""
+
+ # From compound name: ...freq.region
+ parts = cn.split(".")
+ if len(parts) >= 4:
+ freq = parts[-2]
+ if freq in TIMESTEPS:
+ return freq
+
+ # From rule name patterns
+ rn = rule_name.lower()
+ for freq_key in ["1hr", "3hr", "6hr", "day", "mon", "yr", "fx", "dec"]:
+ if freq_key in rn:
+ return freq_key
+
+ return "mon" # default
+
+
+def is_3d_rule(rule_name, compound_name, model_variable):
+ """Check if rule produces 3D output."""
+ cn = (compound_name or "").lower()
+ mv = (model_variable or "").lower()
+ rn = rule_name.lower()
+ return any(k in cn for k in ("-al-", "-ol-", "-p19-", "-p3-", "-p6-")) or any(
+ k in rn for k in ("_ml", "_pl", "pfull", "plev")
+ )
+
+
+def parse_yaml_rules(yaml_path):
+ """Parse rules from a pycmor YAML file (simple regex, no YAML lib needed)."""
+ rules = []
+ with open(yaml_path) as f:
+ content = f.read()
+
+ # Determine realm from directory name
+ dirname = os.path.basename(os.path.dirname(yaml_path))
+ if "ocean" in dirname:
+ realm = "ocean"
+ elif "seaice" in dirname:
+ realm = "seaice"
+ elif "land" in dirname:
+ realm = "land"
+ else:
+ realm = "atmos"
+
+ # Split into rule blocks
+ rule_blocks = re.split(r"\n\s*- name:", content)
+ for i, block in enumerate(rule_blocks):
+ if i == 0:
+ continue # skip header before first rule
+ lines = block.strip().split("\n")
+ name = lines[0].strip()
+ compound = ""
+ model_var = ""
+ has_lpjg = "lpjg" in block.lower() or "lpj_guess" in block.lower()
+
+ for line in lines:
+ line = line.strip()
+ if line.startswith("compound_name:"):
+ compound = line.split(":", 1)[1].strip().strip('"').strip("'")
+ elif line.startswith("model_variable:"):
+ model_var = line.split(":", 1)[1].strip().strip('"').strip("'")
+
+ # Override realm from compound name
+ if compound:
+ cr = compound.split(".")[0].lower()
+ if cr in ("ocean", "omon"):
+ realm_r = "ocean"
+ elif cr in ("seaice", "simon", "siday"):
+ realm_r = "seaice"
+ elif cr in ("landice",):
+ realm_r = "land"
+ elif cr in ("atmos", "aerosol", "atmoschem"):
+ realm_r = "atmos"
+ elif cr in ("land",):
+ realm_r = "land"
+ else:
+ realm_r = realm
+ else:
+ realm_r = realm
+
+ threed = is_3d_rule(name, compound, model_var)
+ grid = guess_grid(name, compound, realm_r, model_var, threed)
+
+ # Override for LPJ-GUESS rules
+ if has_lpjg or "lpjg" in name.lower():
+ grid = "lpjg"
+
+ freq = guess_frequency(name, compound)
+
+ rules.append(
+ {
+ "config": os.path.basename(yaml_path),
+ "dir": dirname,
+ "name": name,
+ "compound": compound,
+ "realm": realm_r,
+ "grid": grid,
+ "freq": freq,
+ "model_var": model_var,
+ }
+ )
+ return rules
+
+
+def count_csv_rows(csv_dir):
+ """Count total CSV rows (variables requested) in a directory."""
+ total = 0
+ for f in glob.glob(os.path.join(csv_dir, "*.csv")):
+ with open(f) as fh:
+ reader = csv.reader(fh)
+ next(reader, None) # skip header
+ total += sum(1 for _ in reader)
+ return total
+
+
+def human_size(nbytes):
+ """Format bytes as human-readable string."""
+ for unit in ["B", "KB", "MB", "GB", "TB", "PB"]:
+ if abs(nbytes) < 1024:
+ return f"{nbytes:.1f} {unit}"
+ nbytes /= 1024
+ return f"{nbytes:.1f} EB"
+
+
+def main():
+ base = os.path.dirname(os.path.abspath(__file__))
+
+ # Collect all rules
+ all_rules = []
+ yaml_files = sorted(glob.glob(os.path.join(base, "*/cmip7_awiesm3-veg-hr_*.yaml")))
+ for yf in yaml_files:
+ all_rules.extend(parse_yaml_rules(yf))
+
+ # Collect CSV counts per directory
+ csv_counts = {}
+ for d in sorted(glob.glob(os.path.join(base, "*/"))):
+ dirname = os.path.basename(d.rstrip("/"))
+ n = count_csv_rows(d)
+ if n > 0:
+ csv_counts[dirname] = n
+
+ # ── Compute per-rule annual data volume ─────────────────────────
+ realm_map = {"atmos": "Atmosphere", "land": "Land", "ocean": "Ocean", "seaice": "Sea Ice"}
+
+ print("=" * 90)
+ print(f"AWI-ESM3-VEG-HR CMIP7 — Annual Data Volume Estimate")
+ print("=" * 90)
+ print()
+
+ # Per-realm aggregation
+ realm_rules = {}
+ realm_bytes = {}
+ realm_csv = {"Atmosphere": 0, "Land": 0, "Ocean": 0, "Sea Ice": 0}
+ freq_bytes = {}
+
+ for r in all_rules:
+ realm_label = realm_map.get(r["realm"], r["realm"])
+ gp = GRID_POINTS.get(r["grid"], GRID_POINTS["atm_sfc"])
+ ts = TIMESTEPS.get(r["freq"], 12)
+ annual_bytes = gp * ts * BYTES_PER_VALUE
+
+ realm_rules.setdefault(realm_label, 0)
+ realm_rules[realm_label] += 1
+ realm_bytes.setdefault(realm_label, 0)
+ realm_bytes[realm_label] += annual_bytes
+
+ freq_bytes.setdefault(r["freq"], 0)
+ freq_bytes[r["freq"]] += annual_bytes
+
+ # Map CSV dirs to realms
+ dir_realm = {
+ "core_atm": "Atmosphere",
+ "veg_atm": "Atmosphere",
+ "extra_atm": "Atmosphere",
+ "cap7_atm": "Atmosphere",
+ "core_land": "Land",
+ "lrcs_land": "Land",
+ "veg_land": "Land",
+ "extra_land": "Land",
+ "core_ocean": "Ocean",
+ "lrcs_ocean": "Ocean",
+ "cap7_ocean": "Ocean",
+ "core_seaice": "Sea Ice",
+ "lrcs_seaice": "Sea Ice",
+ "veg_seaice": "Sea Ice",
+ "cap7_seaice": "Sea Ice",
+ }
+ for dirname, count in csv_counts.items():
+ rlabel = dir_realm.get(dirname, "Other")
+ realm_csv[rlabel] = realm_csv.get(rlabel, 0) + count
+
+ # ── Print realm summary ─────────────────────────────────────────
+ print(f"{'Realm':<15} {'Rules':>6} {'CSV vars':>9} {'Coverage':>9} {'Annual size':>14}")
+ print("-" * 60)
+ total_rules = 0
+ total_csv = 0
+ total_bytes = 0
+ for realm_label in ["Atmosphere", "Land", "Ocean", "Sea Ice"]:
+ nr = realm_rules.get(realm_label, 0)
+ nc = realm_csv.get(realm_label, 0)
+ nb = realm_bytes.get(realm_label, 0)
+ cov = f"{nr/nc*100:.0f}%" if nc > 0 else "n/a"
+ print(f"{realm_label:<15} {nr:>6} {nc:>9} {cov:>9} {human_size(nb):>14}")
+ total_rules += nr
+ total_csv += nc
+ total_bytes += nb
+
+ print("-" * 60)
+ cov_total = f"{total_rules/total_csv*100:.0f}%" if total_csv > 0 else "n/a"
+ print(f"{'TOTAL':<15} {total_rules:>6} {total_csv:>9} {cov_total:>9} {human_size(total_bytes):>14}")
+ print()
+
+ # ── Print frequency breakdown ───────────────────────────────────
+ print(f"{'Frequency':<10} {'Rules':>6} {'Annual size':>14} {'Fraction':>9}")
+ print("-" * 45)
+ for freq in sorted(freq_bytes, key=lambda f: freq_bytes[f], reverse=True):
+ nb = freq_bytes[freq]
+ nrules = sum(1 for r in all_rules if r["freq"] == freq)
+ frac = nb / total_bytes * 100 if total_bytes > 0 else 0
+ print(f"{freq:<10} {nrules:>6} {human_size(nb):>14} {frac:>8.1f}%")
+ print()
+
+ # ── Top 20 largest rules ────────────────────────────────────────
+ rule_sizes = []
+ for r in all_rules:
+ gp = GRID_POINTS.get(r["grid"], GRID_POINTS["atm_sfc"])
+ ts = TIMESTEPS.get(r["freq"], 12)
+ annual_bytes = gp * ts * BYTES_PER_VALUE
+ rule_sizes.append((annual_bytes, r))
+ rule_sizes.sort(key=lambda x: x[0], reverse=True)
+
+ print(f"Top 50 largest rules (annual):")
+ print(
+ f"{'#':>3} {'Rule':<35} {'Freq':<6} {'Grid':<10} {'Tier':<10} {'Size':>12}"
+ )
+ print("-" * 82)
+ for i, (nb, r) in enumerate(rule_sizes[:50]):
+ tier = r["dir"].split("_")[0] # core, lrcs, veg, extra
+ print(
+ f"{i+1:>3} {r['name']:<35} {r['freq']:<6} {r['grid']:<10} {tier:<10} {human_size(nb):>12}"
+ )
+ print()
+
+ # ── Grid breakdown ──────────────────────────────────────────────
+ grid_bytes = {}
+ grid_rules = {}
+ for r in all_rules:
+ gp = GRID_POINTS.get(r["grid"], GRID_POINTS["atm_sfc"])
+ ts = TIMESTEPS.get(r["freq"], 12)
+ ab = gp * ts * BYTES_PER_VALUE
+ grid_bytes.setdefault(r["grid"], 0)
+ grid_bytes[r["grid"]] += ab
+ grid_rules.setdefault(r["grid"], 0)
+ grid_rules[r["grid"]] += 1
+
+ print(f"{'Grid':<12} {'Rules':>6} {'Annual size':>14} {'Fraction':>9}")
+ print("-" * 47)
+ for g in sorted(grid_bytes, key=lambda g: grid_bytes[g], reverse=True):
+ nb = grid_bytes[g]
+ frac = nb / total_bytes * 100 if total_bytes > 0 else 0
+ print(f"{g:<12} {grid_rules[g]:>6} {human_size(nb):>14} {frac:>8.1f}%")
+ print()
+ print(f"Total estimated annual volume: {human_size(total_bytes)}")
+ print(f" (uncompressed float32, before NetCDF compression)")
+ print(f" With typical 2-3x NetCDF4/zlib compression: ~{human_size(total_bytes/2.5)}")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/awi-esm3-veg-hr-variables/extra_atm/cmip7_awiesm3-veg-hr_extra_atm.yaml b/awi-esm3-veg-hr-variables/extra_atm/cmip7_awiesm3-veg-hr_extra_atm.yaml
new file mode 100644
index 00000000..ddaf1b68
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/extra_atm/cmip7_awiesm3-veg-hr_extra_atm.yaml
@@ -0,0 +1,332 @@
+# CMIP7 Extra Atmosphere Variables — AWI-ESM3-VEG-HR
+# Generated from 7 CSVs in extra_atm/
+#
+# 21 producible out of 43 total variables.
+# 22 blocked: 9 aerosol/chemistry, 4 crop tile, 4 heat index/WBGT,
+# 2 lightning, 1 CH4 emissions, 1 100m gust, 1 max hourly precip.
+
+general:
+ name: "awiesm3-cmip7-extra-atm"
+ cmor_version: "CMIP7"
+ mip: "CMIP"
+ CMIP7_DReq_metadata: "/home/a/a270092/.cache/pycmor/cmip7_metadata/v1.2.2.2/metadata.json"
+
+pycmor:
+ warn_on_no_rule: False
+ dask_cluster: "slurm"
+ dask_cluster_scaling_mode: "fixed"
+ dask_cluster_scaling_fixed_jobs: 1
+
+jobqueue:
+ slurm:
+ name: pycmor-worker
+ queue: compute
+ account: bb1469
+ cores: 16
+ memory: 256GB
+ walltime: '00:30:00'
+
+pipelines:
+ # hurs: Magnus formula from 2t + 2d
+ - name: hurs_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_hurs
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # sfcWind: sqrt(u10^2 + v10^2)
+ - name: sfcwind_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_sfcwind
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Southern hemisphere subset (30S-90S)
+ - name: southern_hemisphere_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:select_southern_hemisphere
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # hurs + southern hemisphere subset
+ - name: hurs_south_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_hurs
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:select_southern_hemisphere
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # sfcWind + southern hemisphere subset
+ - name: sfcwind_south_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_sfcwind
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:select_southern_hemisphere
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+inherit:
+ data_path: &dp /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/oifs
+ source_id: AWI-ESM-3
+ institution_id: AWI
+ experiment_id: picontrol
+ variant_label: r1i1p1f1
+ grid_label: gn
+ grid: "OpenIFS TCo319 reduced Gaussian, interpolated to 0.25deg regular grid"
+ nominal_resolution: "25 km"
+ institution: "Alfred Wegener Institute, Helmholtz Centre for Polar and Marine Research, Bremerhaven, Germany"
+ output_directory: ./cmorized_output/awiesm3
+
+rules:
+ # ============================================================
+ # Part 1: 1hr global surface fields
+ # ============================================================
+
+ - name: hfls_1hr
+ inputs:
+ - path: *dp
+ pattern: atmos_1h_sfc_hfls_*.nc
+ compound_name: atmos.hfls.tavg-u-hxy-u.1hr.glb
+ model_variable: hfls
+
+ - name: hfss_1hr
+ inputs:
+ - path: *dp
+ pattern: atmos_1h_sfc_hfss_*.nc
+ compound_name: atmos.hfss.tavg-u-hxy-u.1hr.glb
+ model_variable: hfss
+
+ - name: rlus_1hr
+ inputs:
+ - path: *dp
+ pattern: atmos_1h_sfc_rlus_*.nc
+ compound_name: atmos.rlus.tavg-u-hxy-u.1hr.glb
+ model_variable: rlus
+
+ - name: rsus_1hr
+ inputs:
+ - path: *dp
+ pattern: atmos_1h_sfc_rsus_*.nc
+ compound_name: atmos.rsus.tavg-u-hxy-u.1hr.glb
+ model_variable: rsus
+
+ - name: hurs_1hr_glb
+ inputs:
+ - path: *dp
+ pattern: atmos_1h_sfc_2t_*.nc
+ compound_name: atmos.hurs.tavg-h2m-hxy-u.1hr.glb
+ model_variable: 2t
+ second_input_path: *dp
+ second_input_pattern: atmos_1h_sfc_2d_*.nc
+ second_variable: 2d
+ pipelines:
+ - hurs_pipeline
+
+ - name: bldep_1hr
+ inputs:
+ - path: *dp
+ pattern: atmos_1h_bldep_*.nc
+ compound_name: atmos.bldep.tavg-u-hxy-u.1hr.glb
+ model_variable: bldep
+
+ # ============================================================
+ # Part 2: 1hr 30S-90S regional subsets
+ # ============================================================
+
+ - name: clt_1hr_south30
+ inputs:
+ - path: *dp
+ pattern: atmos_1h_sfc_clt_*.nc
+ compound_name: atmos.clt.tavg-u-hxy-u.1hr.30S-90S
+ model_variable: clt
+ pipelines:
+ - southern_hemisphere_pipeline
+
+ - name: hurs_1hr_south30
+ inputs:
+ - path: *dp
+ pattern: atmos_1h_sfc_2t_*.nc
+ compound_name: atmos.hurs.tavg-h2m-hxy-u.1hr.30S-90S
+ model_variable: 2t
+ second_input_path: *dp
+ second_input_pattern: atmos_1h_sfc_2d_*.nc
+ second_variable: 2d
+ pipelines:
+ - hurs_south_pipeline
+
+ - name: pr_1hr_south30
+ inputs:
+ - path: *dp
+ pattern: atmos_1h_pr_*.nc
+ compound_name: atmos.pr.tavg-u-hxy-u.1hr.30S-90S
+ model_variable: pr
+ pipelines:
+ - southern_hemisphere_pipeline
+
+ - name: ps_1hr_south30
+ inputs:
+ - path: *dp
+ pattern: atmos_1h_sfc_sp_*.nc
+ compound_name: atmos.ps.tpt-u-hxy-u.1hr.30S-90S
+ model_variable: sp
+ pipelines:
+ - southern_hemisphere_pipeline
+
+ - name: rlds_1hr_south30
+ inputs:
+ - path: *dp
+ pattern: atmos_1h_sfc_rlds_*.nc
+ compound_name: atmos.rlds.tavg-u-hxy-u.1hr.30S-90S
+ model_variable: rlds
+ pipelines:
+ - southern_hemisphere_pipeline
+
+ - name: rsds_1hr_south30
+ inputs:
+ - path: *dp
+ pattern: atmos_1h_sfc_rsds_*.nc
+ compound_name: atmos.rsds.tavg-u-hxy-u.1hr.30S-90S
+ model_variable: rsds
+ pipelines:
+ - southern_hemisphere_pipeline
+
+ - name: sfcWind_1hr_south30
+ inputs:
+ - path: *dp
+ pattern: atmos_1h_sfc_10u_*.nc
+ compound_name: atmos.sfcWind.tavg-h10m-hxy-u.1hr.30S-90S
+ model_variable: 10u
+ second_input_path: *dp
+ second_input_pattern: atmos_1h_sfc_10v_*.nc
+ second_variable: 10v
+ pipelines:
+ - sfcwind_south_pipeline
+
+ # ============================================================
+ # Part 3: 3hr fields
+ # ============================================================
+
+ # hurs 3hr instantaneous (from existing _3h_pt file)
+ - name: hurs_3hr
+ inputs:
+ - path: *dp
+ pattern: atmos_3h_pt_2t_3h_pt_*.nc
+ compound_name: atmos.hurs.tpt-h2m-hxy-u.3hr.glb
+ model_variable: 2t
+ second_input_path: *dp
+ second_input_pattern: atmos_3h_pt_2d_3h_pt_*.nc
+ second_variable: 2d
+ pipelines:
+ - hurs_pipeline
+
+ # ts 3hr instantaneous (skin temperature)
+ - name: ts_3hr
+ inputs:
+ - path: *dp
+ pattern: atmos_3h_ts_*.nc
+ compound_name: atmos.ts.tpt-u-hxy-u.3hr.glb
+ model_variable: ts
+
+ # ============================================================
+ # Part 4: Daily fields
+ # ============================================================
+
+ # cl daily on model levels
+ - name: cl_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_ml_cl_*.nc
+ compound_name: atmos.cl.tavg-al-hxy-u.day.glb
+ model_variable: cl
+
+ # pfull daily on model levels
+ - name: pfull_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_ml_pfull_*.nc
+ compound_name: atmos.pfull.tavg-al-hxy-u.day.glb
+ model_variable: pfull
+
+ # rls daily (net longwave surface radiation)
+ - name: rls_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_rad_rls_*.nc
+ compound_name: atmos.rls.tavg-u-hxy-u.day.glb
+ model_variable: rls
+
+ # rss daily (net shortwave surface radiation)
+ - name: rss_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_rad_rss_*.nc
+ compound_name: atmos.rss.tavg-u-hxy-u.day.glb
+ model_variable: rss
+
+ # evspsbl daily
+ - name: evspsbl_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_rad_evspsbl_*.nc
+ compound_name: atmos.evspsbl.tavg-u-hxy-lnd.day.glb
+ model_variable: evspsbl
+
+ # ============================================================
+ # Part 5: Monthly fields
+ # ============================================================
+
+ # wsg monthly maximum gust at 10m
+ - name: wsg_10m_mon
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_gust_wsg10_*.nc
+ compound_name: atmos.wsg.tmax-h10m-hxy-u.mon.glb
+ model_variable: wsg10
diff --git a/awi-esm3-veg-hr-variables/extra_atm/cmip7_extra_atm_todo.md b/awi-esm3-veg-hr-variables/extra_atm/cmip7_extra_atm_todo.md
new file mode 100644
index 00000000..28b4c800
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/extra_atm/cmip7_extra_atm_todo.md
@@ -0,0 +1,111 @@
+# CMIP7 Extra Atmosphere/Aerosol Variables -- Rule Implementation TODO
+
+Variables from 7 CSVs in `extra_atm/`: 43 total rows.
+
+Model constraints:
+- Aerosol: MACv2-SP only (no CAMS, no M7) -- no prognostic aerosol, no PM, no NO2
+- No atmospheric chemistry -- no interactive O3 (prescribed climatology)
+- No lightning parameterization outputting flash rates
+- No CH4 emission scheme (methane disabled, ifmethane=0)
+- No crop tiles (LPJ-GUESS run_landcover=0)
+- Output via OpenIFS XIOS on 0.25deg regular grid, L91 model levels
+
+---
+
+## 1hr surface fields (from atmos CSV)
+
+### Producible (need 1hr XIOS output files)
+
+- [x] **hfls** (1hr) -- Surface Upward Latent Heat Flux (`W m-2`) -- XIOS: `-slhf/3600`
+- [x] **hfss** (1hr) -- Surface Upward Sensible Heat Flux (`W m-2`) -- XIOS: `-sshf/3600`
+- [x] **rlus** (1hr) -- Surface Upwelling LW Radiation (`W m-2`) -- XIOS: `(strd-str)/3600`
+- [x] **rsus** (1hr) -- Surface Upwelling SW Radiation (`W m-2`) -- XIOS: `(ssrd-ssr)/3600`
+
+### Producible (1hr 30S-90S regional subsets, need 1hr output + lat selection)
+
+- [x] **clt** (1hr, 30S-90S) -- Total Cloud Cover (`%`) -- from `tcc * 100`, regional subset
+- [x] **hurs** (1hr, 30S-90S) -- Near-Surface Relative Humidity (`%`) -- custom step (Magnus formula), regional subset
+- [x] **hurs** (1hr, glb) -- Near-Surface Relative Humidity (`%`) -- custom step (Magnus formula)
+- [x] **pr** (1hr, 30S-90S) -- Precipitation (`kg m-2 s-1`) -- already have 1hr pr, regional subset
+- [x] **ps** (1hr, 30S-90S) -- Surface Air Pressure (`Pa`) -- from `sp`, regional subset
+- [x] **rlds** (1hr, 30S-90S) -- Surface Downwelling LW Radiation (`W m-2`) -- XIOS: `strd/3600`, regional subset
+- [x] **rsds** (1hr, 30S-90S) -- Surface Downwelling SW Radiation (`W m-2`) -- XIOS: `ssrd/3600`, regional subset
+- [x] **sfcWind** (1hr, 30S-90S) -- Near-Surface Wind Speed (`m s-1`) -- custom step (sqrt(u10^2+v10^2)), regional subset
+- [x] **bldep** (1hr) -- Boundary Layer Depth (`m`) -- from `blh`. Already output at 3hr; need 1hr output file
+
+## 3hr fields (from atmos CSV)
+
+### Producible
+
+- [x] **hurs** (3hr) -- Near-Surface Relative Humidity (`%`) -- custom step (Magnus formula), already have 6hr hurs inputs; need 3hr output
+- [x] **ts** (3hr) -- Surface Temperature (`K`) -- from `skt`, already in _3h_pt output
+
+## Daily fields (from atmos CSV)
+
+### Producible
+
+- [x] **cl** (day) -- Percentage Cloud Cover on model levels (`%`) -- from `cc * 100` on model levels, need daily ML output file
+- [x] **pfull** (day) -- Pressure at Model Full-Levels (`Pa`) -- from `pres` on model levels, need daily ML output file
+- [x] **rls** (day) -- Net Longwave Surface Radiation (`W m-2`) -- XIOS: `str/3600`
+- [x] **rss** (day) -- Net Shortwave Surface Radiation (`W m-2`) -- XIOS: `ssr/3600`
+- [x] **evspsbl** (day) -- Evaporation (`kg m-2 s-1`) -- XIOS: `-e*1000/3600`, already in field_def, need daily output
+
+### Producible (10m wind gust)
+
+- [x] **wsg** (mon, 10m) -- Maximum Wind Speed of Gust at 10m (`m s-1`) -- from `10fg`, need monthly max output
+
+### NOT producible
+
+- ~~**noaahi2m** (day, mean)~~ -- NOAA Heat Index -- not a standard IFS output, requires post-processing from T and RH with empirical Rothfusz formula
+- ~~**noaahi2m** (day, max)~~ -- same, max variant
+- ~~**wbgt** (day, mean)~~ -- Wet Bulb Globe Temperature -- not a standard IFS output, requires complex post-processing
+- ~~**wbgt** (day, max)~~ -- same, max variant
+- ~~**wsg** (mon, 100m) ~~ -- Maximum Wind Speed of Gust at 100m -- IFS has 10m gust (`10fg`) but no 100m gust diagnostic
+- ~~**pr** (day, max hourly)~~ -- Maximum Hourly Precipitation Rate -- would need 1hr pr with daily max operation; XIOS can do this but requires careful setup of nested temporal operations
+- ~~**hurs** (day, min over crop)~~ -- Daily Minimum Relative Humidity over Crop Tile -- no crop tiles (run_landcover=0)
+- ~~**pr** (day, crop tile)~~ -- Precipitation over Crop Tile -- no crop tiles
+- ~~**tas** (day, max over crop)~~ -- Daily Max Temperature over Crop Tile -- no crop tiles
+- ~~**tas** (day, min over crop)~~ -- Daily Min Temperature over Crop Tile -- no crop tiles
+
+## Aerosol/chemistry variables
+
+### NOT producible (need prognostic aerosol/chemistry)
+
+- ~~**sfpm1** (1hr + day)~~ -- PM1.0 Mixing Ratio -- requires CAMS/M7
+- ~~**sfpm10** (1hr + day)~~ -- PM10 Mixing Ratio -- requires CAMS/M7
+- ~~**sfpm25** (1hr + day)~~ -- PM2.5 Mixing Ratio -- requires CAMS/M7
+- ~~**no2** (1hr)~~ -- NO2 Volume Mixing Ratio -- requires atmospheric chemistry
+- ~~**o3** (1hr + day)~~ -- O3 Volume Mixing Ratio -- no interactive O3 (prescribed climatology)
+- ~~**emich4** (mon)~~ -- Total CH4 Emission Rate -- no methane emission scheme (ifmethane=0)
+- ~~**flashrate** (day + mon)~~ -- Lightning Flash Rate -- no lightning parameterization output
+
+---
+
+## Summary
+
+| Category | Count | Done | Blocked |
+|----------|-------|------|---------|
+| 1hr surface (XIOS) | 4 | 4 | 0 |
+| 1hr 30S-90S regional | 7 | 7 | 0 |
+| 1hr global (hurs, bldep) | 2 | 2 | 0 |
+| 3hr fields | 2 | 2 | 0 |
+| Daily surface/radiation | 3 | 3 | 0 |
+| Daily model levels (cl, pfull) | 2 | 2 | 0 |
+| Monthly gust (10m) | 1 | 1 | 0 |
+| Heat index/WBGT | 4 | 0 | 4 (post-processing) |
+| Crop tile variables | 4 | 0 | 4 (no crops) |
+| 100m gust | 1 | 0 | 1 (no 100m gust) |
+| Max hourly precip | 1 | 0 | 1 (nested temporal ops) |
+| PM/NO2/O3/chemistry | 9 | 0 | 9 (no aerosol/chem) |
+| CH4 emissions | 1 | 0 | 1 (no methane) |
+| Lightning | 2 | 0 | 2 (no flash rate) |
+| **Total** | **43** | **21** | **22** |
+
+## Implementation status
+
+All 21 producible variables implemented:
+- XIOS field definitions in `field_def_cmip7.xml` (ts from skt, evspsbl daily)
+- New output files in `file_def_oifs_cmip7_spinup.xml.j2` (_1h_sfc, _1h_rad, _day_ml)
+- pycmor YAML rules in `cmip7_awiesm3-veg-hr_extra_atm.yaml`
+- 30S-90S regional subsets use existing `select_southern_hemisphere` step
+- 1hr hurs/sfcWind use existing custom steps (Magnus formula, sqrt)
diff --git a/awi-esm3-veg-hr-variables/extra_atm/cmip7_set2_extra_variables_aerosol.csv b/awi-esm3-veg-hr-variables/extra_atm/cmip7_set2_extra_variables_aerosol.csv
new file mode 100644
index 00000000..3d8e6e92
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/extra_atm/cmip7_set2_extra_variables_aerosol.csv
@@ -0,0 +1,4 @@
+,name,frequency,modeling_realm,standard_name,units,cell_methods,cell_measures,long_name,comment,processing_note,dimensions,out_name,type,positive,spatial_shape,temporal_shape,cmip6_table,physical_parameter_name,variableRootDD,branding_label,branded_variable_name,region,cmip6_compound_name,cmip7_compound_name,uid,priority
+1,aerosol.no2.tavg-h2m-hxy-u.1hr.glb,1hr,aerosol,mole_fraction_of_nitrogen_dioxide_in_air,mol mol-1,area: time: mean,area: areacella,NO2 Volume Mixing Ratio near surface,"Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y.","Given the large differences in aerosol, boundary layer and vertical coordinate schemes across the models AerChemMIP do not want to be prescriptive and am happy to accept modelling centre's 'best estimate' rather than requiring interpolation to 2m exactly. CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude time CMIP7:longitude latitude time height2m,",longitude latitude time height2m,no2,real,,XY-na,time-intv,AERhr,sfno2,no2,tavg-h2m-hxy-u,no2_tavg-h2m-hxy-u,glb,AERhr.sfno2,aerosol.no2.tavg-h2m-hxy-u.1hr.glb,19c0775c-81b1-11e6-92de-ac72891c3257,high
+2,aerosol.o3.tavg-h2m-hxy-u.1hr.glb,1hr,aerosol,mole_fraction_of_ozone_in_air,mol mol-1,area: time: mean,area: areacella,O3 Volume Mixing Ratio near surface,"Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y.","Given the large differences in aerosol, boundary layer and vertical coordinate schemes across the models AerChemMIP do not want to be prescriptive and am happy to accept modelling centre's 'best estimate' rather than requiring interpolation to 2m exactly. CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude time CMIP7:longitude latitude time height2m,",longitude latitude time height2m,o3,real,,XY-na,time-intv,AERhr,sfo3,o3,tavg-h2m-hxy-u,o3_tavg-h2m-hxy-u,glb,AERhr.sfo3,aerosol.o3.tavg-h2m-hxy-u.1hr.glb,19c07cca-81b1-11e6-92de-ac72891c3257,high
+3,aerosol.o3.tmax-h2m-hxy-u.day.glb,day,aerosol,mole_fraction_of_ozone_in_air,mol mol-1,area: mean time: maximum,area: areacella,Daily Maximum O3 Volume Mixing Ratio near-surface,"maximum near-surface ozone (add cell_methods attribute ""time: maximum"")","Given the large differences in aerosol, boundary layer and vertical coordinate schemes across the models AerChemMIP do not want to be prescriptive and am happy to accept modelling centre's 'best estimate' rather than requiring interpolation to 2m exactly. CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude time CMIP7:longitude latitude time height2m,",longitude latitude time height2m,o3,real,,XY-na,time-intv,AERday,sfo3max,o3,tmax-h2m-hxy-u,o3_tmax-h2m-hxy-u,glb,AERday.sfo3max,aerosol.o3.tmax-h2m-hxy-u.day.glb,fda754f4-96ec-11e6-b81e-c9e268aff03a,high
\ No newline at end of file
diff --git a/awi-esm3-veg-hr-variables/extra_atm/cmip7_set2_extra_variables_aerosol_atmosChem.csv b/awi-esm3-veg-hr-variables/extra_atm/cmip7_set2_extra_variables_aerosol_atmosChem.csv
new file mode 100644
index 00000000..e6a7eeb4
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/extra_atm/cmip7_set2_extra_variables_aerosol_atmosChem.csv
@@ -0,0 +1,7 @@
+,name,frequency,modeling_realm,standard_name,units,cell_methods,cell_measures,long_name,comment,processing_note,dimensions,out_name,type,positive,spatial_shape,temporal_shape,cmip6_table,physical_parameter_name,variableRootDD,branding_label,branded_variable_name,region,cmip6_compound_name,cmip7_compound_name,uid,priority
+4,aerosol.sfpm1.tavg-h2m-hxy-u.1hr.glb,1hr,aerosol atmosChem,mass_fraction_of_pm1_ambient_aerosol_particles_in_air,kg kg-1,area: time: mean,area: areacella,Near-surface PM1.0 Mixing Ratio,Hourly PM1.0 Mass Mixing Ratio near surface.,"Given the large differences in aerosol, boundary layer and vertical coordinate schemes across the models AerChemMIP do not want to be prescriptive and am happy to accept modelling centre's 'best estimate' rather than requiring interpolation to 2m exactly.",longitude latitude time height2m,sfpm1,real,,XY-na,time-intv,AERhr,sfpm1,sfpm1,tavg-h2m-hxy-u,sfpm1_tavg-h2m-hxy-u,glb,AERhr.sfpm1,aerosol.sfpm1.tavg-h2m-hxy-u.1hr.glb,83bbfc28-7f07-11ef-9308-b1dd71e64bec,low
+5,aerosol.sfpm1.tavg-h2m-hxy-u.day.glb,day,aerosol atmosChem,mass_fraction_of_pm1_ambient_aerosol_particles_in_air,kg kg-1,area: time: mean,area: areacella,Near-surface PM1.0 Mixing Ratio,Daily mean PM1.0 mass mixing ratio near surface.,"Given the large differences in aerosol, boundary layer and vertical coordinate schemes across the models AerChemMIP do not want to be prescriptive and am happy to accept modelling centre's 'best estimate' rather than requiring interpolation to 2m exactly.",longitude latitude time height2m,sfpm1,real,,XY-na,time-intv,AERday,sfpm1,sfpm1,tavg-h2m-hxy-u,sfpm1_tavg-h2m-hxy-u,glb,AERday.sfpm1,aerosol.sfpm1.tavg-h2m-hxy-u.day.glb,83bbfc33-7f07-11ef-9308-b1dd71e64bec,high
+6,aerosol.sfpm10.tavg-h2m-hxy-u.1hr.glb,1hr,aerosol atmosChem,mass_fraction_of_pm10_ambient_aerosol_particles_in_air,kg kg-1,area: time: mean,area: areacella,Near-surface PM10 Mixing Ratio,Hourly PM10 Mass Mixing Ratio near surface.,"Given the large differences in aerosol, boundary layer and vertical coordinate schemes across the models AerChemMIP do not want to be prescriptive and am happy to accept modelling centre's 'best estimate' rather than requiring interpolation to 2m exactly.",longitude latitude time height2m,sfpm10,real,,XY-na,time-intv,AERhr,sfpm10,sfpm10,tavg-h2m-hxy-u,sfpm10_tavg-h2m-hxy-u,glb,AERhr.sfpm10,aerosol.sfpm10.tavg-h2m-hxy-u.1hr.glb,83bbfc27-7f07-11ef-9308-b1dd71e64bec,low
+7,aerosol.sfpm10.tavg-h2m-hxy-u.day.glb,day,aerosol atmosChem,mass_fraction_of_pm10_ambient_aerosol_particles_in_air,kg kg-1,area: time: mean,area: areacella,Near-surface PM10 Mixing Ratio,Daily mean PM10 mass mixing ratio near surface.,"Given the large differences in aerosol, boundary layer and vertical coordinate schemes across the models AerChemMIP do not want to be prescriptive and am happy to accept modelling centre's 'best estimate' rather than requiring interpolation to 2m exactly.",longitude latitude time height2m,sfpm10,real,,XY-na,time-intv,AERday,sfpm10,sfpm10,tavg-h2m-hxy-u,sfpm10_tavg-h2m-hxy-u,glb,AERday.sfpm10,aerosol.sfpm10.tavg-h2m-hxy-u.day.glb,83bbfc32-7f07-11ef-9308-b1dd71e64bec,high
+8,aerosol.sfpm25.tavg-h2m-hxy-u.1hr.glb,1hr,aerosol atmosChem,mass_fraction_of_pm2p5_ambient_aerosol_particles_in_air,kg kg-1,area: time: mean,area: areacella,Near-surface PM2.5 Mixing Ratio,"Mass fraction of atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 2.5 micrometers. To specify the relative humidity and temperature at which the particle size applies, provide scalar coordinate variables with the standard names of ""relative_humidity"" and ""air_temperature"".","Given the large differences in aerosol, boundary layer and vertical coordinate schemes across the models AerChemMIP do not want to be prescriptive and am happy to accept modelling centre's 'best estimate' rather than requiring interpolation to 2m exactly. CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude time CMIP7:longitude latitude time height2m,",longitude latitude time height2m,sfpm25,real,,XY-na,time-intv,AERhr,sfpm25,sfpm25,tavg-h2m-hxy-u,sfpm25_tavg-h2m-hxy-u,glb,AERhr.sfpm25,aerosol.sfpm25.tavg-h2m-hxy-u.1hr.glb,19c074b4-81b1-11e6-92de-ac72891c3257,high
+9,aerosol.sfpm25.tavg-h2m-hxy-u.day.glb,day,aerosol atmosChem,mass_fraction_of_pm2p5_ambient_aerosol_particles_in_air,kg kg-1,area: time: mean,area: areacella,Near-surface PM2.5 Mixing Ratio,Daily mean PM2.5 mass mixing ratio near surface.,"Given the large differences in aerosol, boundary layer and vertical coordinate schemes across the models AerChemMIP do not want to be prescriptive and am happy to accept modelling centre's 'best estimate' rather than requiring interpolation to 2m exactly.",longitude latitude time height2m,sfpm25,real,,XY-na,time-intv,AERday,sfpm25,sfpm25,tavg-h2m-hxy-u,sfpm25_tavg-h2m-hxy-u,glb,AERday.sfpm25,aerosol.sfpm25.tavg-h2m-hxy-u.day.glb,83bbfc31-7f07-11ef-9308-b1dd71e64bec,high
\ No newline at end of file
diff --git a/awi-esm3-veg-hr-variables/extra_atm/cmip7_set2_extra_variables_atmos.csv b/awi-esm3-veg-hr-variables/extra_atm/cmip7_set2_extra_variables_atmos.csv
new file mode 100644
index 00000000..7e034f90
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/extra_atm/cmip7_set2_extra_variables_atmos.csv
@@ -0,0 +1,64 @@
+,name,frequency,modeling_realm,standard_name,units,cell_methods,cell_measures,long_name,comment,processing_note,dimensions,out_name,type,positive,spatial_shape,temporal_shape,cmip6_table,physical_parameter_name,variableRootDD,branding_label,branded_variable_name,region,cmip6_compound_name,cmip7_compound_name,uid,priority
+12,atmos.cl.tavg-al-hxy-u.day.glb,day,atmos,cloud_area_fraction_in_atmosphere_layer,%,area: time: mean,area: areacella,Percentage Cloud Cover,"Percentage cloud cover, including both large-scale and convective cloud.",,longitude latitude alevel time,cl,real,,XY-A,time-intv,CFday,cl,cl,tavg-al-hxy-u,cl_tavg-al-hxy-u,glb,CFday.cl,atmos.cl.tavg-al-hxy-u.day.glb,baaa4a8c-e5dd-11e5-8482-ac72891c3257,high
+13,atmos.clt.tavg-u-hxy-u.1hr.30S-90S,1hr,atmos,cloud_area_fraction,%,area: time: mean,area: areacella,Total Cloud Cover Percentage,"Total cloud area fraction (reported as a percentage) for the whole atmospheric column, as seen from the surface or the top of the atmosphere. Includes both large-scale and convective cloud.","This is a regional subset of the variable. If you are producing the global equivalent of E1hr.clt, you should omit this regional South30 version.",longitude latitude time,clt,real,,XY-na,time-intv,E1hr,clt,clt,tavg-u-hxy-u,clt_tavg-u-hxy-u,30S-90S,E1hr.clt,atmos.clt.tavg-u-hxy-u.1hr.30S-90S,83bbfbca-7f07-11ef-9308-b1dd71e64bec,high
+20,atmos.hfls.tavg-u-hxy-u.1hr.glb,1hr,atmos,surface_upward_latent_heat_flux,W m-2,area: time: mean,area: areacella,Surface Upward Latent Heat Flux,Hourly surface upward latent heat flux,,longitude latitude time,hfls,real,up,XY-na,time-intv,E1hr,hfls,hfls,tavg-u-hxy-u,hfls_tavg-u-hxy-u,glb,E1hr.hfls,atmos.hfls.tavg-u-hxy-u.1hr.glb,83bbfbc9-7f07-11ef-9308-b1dd71e64bec,medium
+22,atmos.hfss.tavg-u-hxy-u.1hr.glb,1hr,atmos,surface_upward_sensible_heat_flux,W m-2,area: time: mean,area: areacella,Surface Upward Sensible Heat Flux,Hourly surface upward sensible heat flux,,longitude latitude time,hfss,real,up,XY-na,time-intv,E1hr,hfss,hfss,tavg-u-hxy-u,hfss_tavg-u-hxy-u,glb,E1hr.hfss,atmos.hfss.tavg-u-hxy-u.1hr.glb,83bbfbc8-7f07-11ef-9308-b1dd71e64bec,medium
+25,atmos.hurs.tavg-h2m-hxy-u.1hr.30S-90S,1hr,atmos,relative_humidity,%,area: time: mean,area: areacella,Near-Surface Relative Humidity,Relative humidity at 2m above the surface,"This is a regional subset of the variable. If you are producing the global equivalent of E1hr.hursSouth30, you should omit this regional South30 version.",longitude latitude time height2m,hurs,real,,XY-na,time-intv,E1hr,hurs,hurs,tavg-h2m-hxy-u,hurs_tavg-h2m-hxy-u,30S-90S,E1hr.hursSouth30,atmos.hurs.tavg-h2m-hxy-u.1hr.30S-90S,80ac3193-a698-11ef-914a-613c0433d878,high
+26,atmos.hurs.tavg-h2m-hxy-u.1hr.glb,1hr,atmos,relative_humidity,%,area: time: mean,area: areacella,Near-Surface Relative Humidity,Relative humidity at 2m above the surface,,longitude latitude time height2m,hurs,real,,XY-na,time-intv,E1hr,hurs,hurs,tavg-h2m-hxy-u,hurs_tavg-h2m-hxy-u,glb,E1hr.hurs,atmos.hurs.tavg-h2m-hxy-u.1hr.glb,83bbfbc7-7f07-11ef-9308-b1dd71e64bec,medium
+30,atmos.hurs.tmin-h2m-hxy-crp.day.glb,day,atmos,relative_humidity,%,area: mean where crops time: minimum,area: areacella,Daily Minimum Near-Surface Relative Humidity over Crop Tile,"The relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.",,longitude latitude time height2m,hurs,real,,XY-na,time-intv,Eday,hursminCrop,hurs,tmin-h2m-hxy-crp,hurs_tmin-h2m-hxy-crp,glb,Eday.hursminCrop,atmos.hurs.tmin-h2m-hxy-crp.day.glb,f32a8460-c38d-11e6-abc1-1b922e5e1118,low
+32,atmos.hurs.tpt-h2m-hxy-u.3hr.glb,3hr,atmos,relative_humidity,%,area: mean time: point,area: areacella,Near-Surface Relative Humidity,"This is the relative humidity with respect to liquid water for T> 0 C, and with respect to ice for T<0 C.","express as a percentage. Normally, the relative humidity should be reported at the 2 meter height",longitude latitude time1 height2m,hurs,real,,XY-na,time-point,CF3hr,hurs,hurs,tpt-h2m-hxy-u,hurs_tpt-h2m-hxy-u,glb,CF3hr.hurs,atmos.hurs.tpt-h2m-hxy-u.3hr.glb,edbcefb6-4b7f-11e7-903f-5404a60d96b5,high
+39,atmos.noaahi2m.tavg-h2m-hxy-u.day.glb,day,atmos,heat_index_of_air_temperature,degC,area: time: mean,area: areacella,mean 2m daily NOAA heat index,"mean 2m daily NOAA heat index.
+The perceived air temperature when relative humidity is taken into consideration (which makes it feel hotter than the actual air temperature).
+The heat index is only defined when the ambient air temperature is at or above 299.817 K.
+NOAA heat index = -42.379 + 2.04901523(T) + 10.14333127(R) - 0.22475541(T)(R) - 6.83783e-3 sqr(T) - 5.481717e-2 sqr(R) + 1.22874e-3 sqr(T) (R) + 8.5282e-4 (T) sqr(R) - 1.99e-6 sqr(T) sqr(R)
+where T is 2 m temperature (degrees F), R is relative humidity (%)","NOAA heat index = -42.379 + 2.04901523T + 10.14333127R - 0.22475541TR - 6.83783 x 10-3T2 - 5.481717 x 10-2R2 + 1.22874 x 10-3T2R + 8.5282 x 10-4TR2 - 1.99 x 10-6T2R2
+where T is 2 m temperature (degrees F), R is relative humidity (%).
+Heat index is only defined when the ambient air temperature is at or above 299.817 K.",longitude latitude time height2m,noaahi2m,real,,XY-na,time-intv,day,noaahi2m,noaahi2m,tavg-h2m-hxy-u,noaahi2m_tavg-h2m-hxy-u,glb,day.noaahi2m,atmos.noaahi2m.tavg-h2m-hxy-u.day.glb,83bbfbd5-7f07-11ef-9308-b1dd71e64bec,medium
+40,atmos.noaahi2m.tmax-h2m-hxy-u.day.glb,day,atmos,heat_index_of_air_temperature,degC,area: mean time: maximum,area: areacella,max 2m daily NOAA heat index,"max 2m daily NOAA heat index
+The perceived air temperature when relative humidity is taken into consideration (which makes it feel hotter than the actual air temperature).
+The heat index is only defined when the ambient air temperature is at or above 299.817 K.
+NOAA heat index = -42.379 + 2.04901523(T) + 10.14333127(R) - 0.22475541(T)(R) - 6.83783e-3 sqr(T) - 5.481717e-2 sqr(R) + 1.22874e-3 sqr(T) (R) + 8.5282e-4 (T) sqr(R) - 1.99e-6 sqr(T) sqr(R)
+where T is 2 m temperature (degrees F), R is relative humidity (%)","NOAA heat index = -42.379 + 2.04901523T + 10.14333127R - 0.22475541TR - 6.83783 x 10-3T2 - 5.481717 x 10-2R2 + 1.22874 x 10-3T2R + 8.5282 x 10-4TR2 - 1.99 x 10-6T2R2
+where T is 2 m temperature (degrees F), R is relative humidity (%).
+The heat index is only defined when the ambient air temperature is at or above 299.817 K.",longitude latitude time height2m,noaahi2m,real,,XY-na,time-intv,day,noaahi2mmax,noaahi2m,tmax-h2m-hxy-u,noaahi2m_tmax-h2m-hxy-u,glb,day.noaahi2mmax,atmos.noaahi2m.tmax-h2m-hxy-u.day.glb,83bbfbd4-7f07-11ef-9308-b1dd71e64bec,medium
+41,atmos.pfull.tavg-al-hxy-u.day.glb,day,atmos,air_pressure,Pa,area: time: mean,area: areacella,Pressure at Model Full-Levels,Air pressure on model levels,"This field is needed only for models in which the pressure cannot be calculated from the vertical coordinate information stored already for each variable. Thus, the pressures are needed for height or theta-coordinate models, for example, but not sigma- or eta-coordinate models.",longitude latitude alevel time,pfull,real,,XY-A,time-intv,CFday,pfull,pfull,tavg-al-hxy-u,pfull_tavg-al-hxy-u,glb,CFday.pfull,atmos.pfull.tavg-al-hxy-u.day.glb,bab32ddc-e5dd-11e5-8482-ac72891c3257,high
+42,atmos.pr.tavg-u-hxy-crp.day.glb,day,atmos,precipitation_flux,kg m-2 s-1,area: time: mean where crops (mask=cropFrac),area: areacella,Precipitation over Crop Tile,includes both liquid and solid phases,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean where crops (comment: mask=cropFrac) CMIP7:area: time: mean where crops (mask=cropFrac),",longitude latitude time,pr,real,,XY-na,time-intv,Eday,prCrop,pr,tavg-u-hxy-crp,pr_tavg-u-hxy-crp,glb,Eday.prCrop,atmos.pr.tavg-u-hxy-crp.day.glb,2eb1b640-b64e-11e6-b9ee-ac72891c3257,low
+43,atmos.pr.tavg-u-hxy-u.1hr.30S-90S,1hr,atmos,precipitation_flux,kg m-2 s-1,area: time: mean,area: areacella,Precipitation,Total precipitation flux,"This is a regional subset of the variable. If you are producing the global equivalent of E1hr.prSouth30, you should omit this regional South30 version.",longitude latitude time,pr,real,,XY-na,time-intv,E1hr,pr,pr,tavg-u-hxy-u,pr_tavg-u-hxy-u,30S-90S,E1hr.prSouth30,atmos.pr.tavg-u-hxy-u.1hr.30S-90S,80ac31b4-a698-11ef-914a-613c0433d878,high
+48,atmos.pr.tmax-u-hxy-u.day.glb,day,atmos,precipitation_flux,kg m-2 s-1,area: mean time: maximum,area: areacella,Maximum Hourly Precipitation Rate,Daily Maximum Hourly Precipitation Rate,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean time: mean within hours time: maximum over hours CMIP7:area: mean time: maximum,",longitude latitude time,pr,real,,XY-na,time-intv,Eday,prhmax,pr,tmax-u-hxy-u,pr_tmax-u-hxy-u,glb,Eday.prhmax,atmos.pr.tmax-u-hxy-u.day.glb,d237723e-4a9f-11e6-b84e-ac72891c3257,high
+54,atmos.ps.tpt-u-hxy-u.1hr.30S-90S,1hr,atmos,surface_air_pressure,Pa,area: mean time: point,area: areacella,Surface Air Pressure,Surface pressure.,"Instantaneous value (i.e. synoptic or time-step value), Global field (single level) [XY-na] [amn-tpt]
+This is a regional subset of the variable. If you are producing the global equivalent of E1hr.psSouth30, you should omit this regional South30 version.",longitude latitude time1,ps,real,,XY-na,time-point,E1hr,ps,ps,tpt-u-hxy-u,ps_tpt-u-hxy-u,30S-90S,E1hr.psSouth30,atmos.ps.tpt-u-hxy-u.1hr.30S-90S,80ac31ba-a698-11ef-914a-613c0433d878,high
+61,atmos.rlds.tavg-u-hxy-u.1hr.30S-90S,1hr,atmos,surface_downwelling_longwave_flux_in_air,W m-2,area: time: mean,area: areacella,Surface Downwelling Longwave Radiation,Surface Downwelling Longwave Radiation,"This is the 3-hour mean flux.
+This is a regional subset of the variable. If you are producing the global equivalent of E1hr.rldsSouth30, you should omit this regional South30 version.",longitude latitude time,rlds,real,down,XY-na,time-intv,E1hr,rlds,rlds,tavg-u-hxy-u,rlds_tavg-u-hxy-u,30S-90S,E1hr.rldsSouth30,atmos.rlds.tavg-u-hxy-u.1hr.30S-90S,80ac31c2-a698-11ef-914a-613c0433d878,high
+66,atmos.rls.tavg-u-hxy-u.day.glb,day,atmos,surface_net_downward_longwave_flux,W m-2,area: time: mean,area: areacella,Net Longwave Surface Radiation,Net longwave radiation,,longitude latitude time,rls,real,down,XY-na,time-intv,day,rls,rls,tavg-u-hxy-u,rls_tavg-u-hxy-u,glb,day.rls,atmos.rls.tavg-u-hxy-u.day.glb,d660d938-633c-11e8-9791-a44cc8186c64,medium
+68,atmos.rlus.tavg-u-hxy-u.1hr.glb,1hr,atmos,surface_upwelling_longwave_flux_in_air,W m-2,area: time: mean,area: areacella,Surface Upwelling Longwave Radiation,Hourly surface upwelling longwave radiation,,longitude latitude time,rlus,real,up,XY-na,time-intv,E1hr,rlus,rlus,tavg-u-hxy-u,rlus_tavg-u-hxy-u,glb,E1hr.rlus,atmos.rlus.tavg-u-hxy-u.1hr.glb,83bbfbc3-7f07-11ef-9308-b1dd71e64bec,medium
+71,atmos.rsds.tavg-u-hxy-u.1hr.30S-90S,1hr,atmos,surface_downwelling_shortwave_flux_in_air,W m-2,area: time: mean,area: areacella,Surface Downwelling Shortwave Radiation,Hourly downward solar radiation flux at the surface,"This is a regional subset of the variable. If you are producing the global equivalent of E1hr.rsdsSouth30, you should omit this regional South30 version.",longitude latitude time,rsds,real,down,XY-na,time-intv,E1hr,rsds,rsds,tavg-u-hxy-u,rsds_tavg-u-hxy-u,30S-90S,E1hr.rsdsSouth30,atmos.rsds.tavg-u-hxy-u.1hr.30S-90S,80ac31c8-a698-11ef-914a-613c0433d878,high
+78,atmos.rss.tavg-u-hxy-u.day.glb,day,atmos,surface_net_downward_shortwave_flux,W m-2,area: time: mean,area: areacella,Net Shortwave Surface Radiation,Net shortwave radiation,,longitude latitude time,rss,real,down,XY-na,time-intv,day,rss,rss,tavg-u-hxy-u,rss_tavg-u-hxy-u,glb,day.rss,atmos.rss.tavg-u-hxy-u.day.glb,8ca589c4-633c-11e8-9791-a44cc8186c64,medium
+80,atmos.rsus.tavg-u-hxy-u.1hr.glb,1hr,atmos,surface_upwelling_shortwave_flux_in_air,W m-2,area: time: mean,area: areacella,Surface Upwelling Shortwave Radiation,Surface upwelling shortwave radiation,,longitude latitude time,rsus,real,up,XY-na,time-intv,E1hr,rsus,rsus,tavg-u-hxy-u,rsus_tavg-u-hxy-u,glb,E1hr.rsus,atmos.rsus.tavg-u-hxy-u.1hr.glb,83bbfbc1-7f07-11ef-9308-b1dd71e64bec,medium
+82,atmos.sfcWind.tavg-h10m-hxy-u.1hr.30S-90S,1hr,atmos,wind_speed,m s-1,area: time: mean,area: areacella,Near-Surface Wind Speed,Hourly near-surface wind speed at 10m above the ground,"This is a regional subset of the variable. If you are producing the global equivalent of E1hr.sfcWindSouth30, you should omit this regional South30 version.",longitude latitude time height10m,sfcWind,real,,XY-na,time-intv,E1hr,sfcWind,sfcWind,tavg-h10m-hxy-u,sfcWind_tavg-h10m-hxy-u,30S-90S,E1hr.sfcWindSouth30,atmos.sfcWind.tavg-h10m-hxy-u.1hr.30S-90S,80ac31d0-a698-11ef-914a-613c0433d878,high
+93,atmos.tas.tmax-h2m-hxy-crp.day.glb,day,atmos,air_temperature,K,area: mean where crops time: maximum,area: areacella,Daily Maximum Near-Surface Air Temperature over Crop Tile,"maximum near-surface (usually, 2 meter) air temperature (add cell_method attribute ""time: max"")",,longitude latitude time height2m,tas,real,,XY-na,time-intv,Eday,tasmaxCrop,tas,tmax-h2m-hxy-crp,tas_tmax-h2m-hxy-crp,glb,Eday.tasmaxCrop,atmos.tas.tmax-h2m-hxy-crp.day.glb,2eb1ab6e-b64e-11e6-b9ee-ac72891c3257,low
+96,atmos.tas.tmin-h2m-hxy-crp.day.glb,day,atmos,air_temperature,K,area: mean where crops time: minimum,area: areacella,Daily Minimum Near-Surface Air Temperature over Crop Tile,"minimum near-surface (usually, 2 meter) air temperature (add cell_method attribute ""time: min"")",,longitude latitude time height2m,tas,real,,XY-na,time-intv,Eday,tasminCrop,tas,tmin-h2m-hxy-crp,tas_tmin-h2m-hxy-crp,glb,Eday.tasminCrop,atmos.tas.tmin-h2m-hxy-crp.day.glb,2eb1b0aa-b64e-11e6-b9ee-ac72891c3257,low
+102,atmos.ts.tpt-u-hxy-u.3hr.glb,3hr,atmos,surface_temperature,K,area: mean time: point,area: areacella,Surface Temperature,Surface temperature (skin for open ocean),,longitude latitude time1,ts,real,,XY-na,time-point,CF3hr,ts,ts,tpt-u-hxy-u,ts_tpt-u-hxy-u,glb,CF3hr.ts,atmos.ts.tpt-u-hxy-u.3hr.glb,7b309c62-a220-11e6-a33f-ac72891c3257,high
+119,atmos.wbgt.tavg-h2m-hxy-u.day.glb,day,atmos,wet_bulb_globe_temperature,degC,area: time: mean,area: areacella,mean 2m daily wet bulb globe temperature,"mean 2m daily wet bulb globe temperature (WBGT).
+Wet Bulb Globe Temperature (WBGT) is a particularly effective indicator of heat stress for active populations such as outdoor workers and athletes.
+The calculation should be done with:
+WBGT = 0.567 \* T_C + 0.393 \* e/100 + 3.94, where T_C is temperature in degrees C, and e = huss \* p \* M_air / M_H2O, where ""huss=specific humidity in kg/kg"", M_H2O = 18.01528/1000 # kg/mol, M_air = 28.964/1000 # kg/mol for dry air and ""P = surface pressure in Pa""","The calculation should be done with:
+WBGT = 0.567 \* T_C + 0.393 \* e/100 + 3.94,
+where T_C is temperature in degrees C,
+and e = huss \* p \* M_air / M_H2O,
+where ""huss=specific humidity in kg/kg"",
+M_H2O = 18.01528/1000 # kg/mol,
+M_air = 28.964/1000 # kg/mol for dry air,
+and ""P = surface pressure in Pa""",longitude latitude time height2m,wbgt,real,,XY-na,time-intv,day,wbgt2m,wbgt,tavg-h2m-hxy-u,wbgt_tavg-h2m-hxy-u,glb,day.wbgt2m,atmos.wbgt.tavg-h2m-hxy-u.day.glb,83bbfbcd-7f07-11ef-9308-b1dd71e64bec,medium
+120,atmos.wbgt.tmax-h2m-hxy-u.day.glb,day,atmos,wet_bulb_globe_temperature,degC,area: mean time: maximum,area: areacella,maximum 2m daily wet bulb globe temperature,"max 2m daily wet bulb globe temperature (WGBT):
+Wet Bulb Globe Temperature (WBGT) is a particularly effective indicator of heat stress for active populations such as outdoor workers and athletes.
+The calculation should be done with:
+WBGT = 0.567 \* T_C + 0.393 \* e/100 + 3.94, where T_C is temperature in degrees C, and e = huss \* p \* M_air / M_H2O, where ""huss=specific humidity in kg/kg"", M_H2O = 18.01528/1000 # kg/mol, M_air = 28.964/1000 # kg/mol for dry air and ""P = surface pressure in Pa""","The calculation should be done with:
+WBGT = 0.567 \* T_C + 0.393 \* e/100 + 3.94,
+where T_C is temperature in degrees C,
+and e = huss \* p \* M_air / M_H2O,
+where ""huss=specific humidity in kg/kg"",
+M_H2O = 18.01528/1000 # kg/mol,
+M_air = 28.964/1000 # kg/mol for dry air,
+and ""P = surface pressure in Pa""",longitude latitude time height2m,wbgt,real,,XY-na,time-intv,day,wbgt2mmax,wbgt,tmax-h2m-hxy-u,wbgt_tmax-h2m-hxy-u,glb,day.wbgt2mmax,atmos.wbgt.tmax-h2m-hxy-u.day.glb,83bbfbcc-7f07-11ef-9308-b1dd71e64bec,medium
+122,atmos.wsg.tmax-h100m-hxy-u.mon.glb,mon,atmos,wind_speed_of_gust,m s-1,area: mean time: maximum,area: areacella,Maximum Wind Speed of Gust at 100m,"Maximum Wind Speed of Gust at 100m, monthly","Maximum instantaneous gust over grid cell, recorded monthly. Input data at the highest available frequency, ideally model timesteps, should be used to compute the maximum. Modellers are requested to leave in a comment in the netcdf metadata stating the frequency of the input data.",longitude latitude time height100m,wsg,real,,XY-na,time-intv,Emon,wsgmax100m,wsg,tmax-h100m-hxy-u,wsg_tmax-h100m-hxy-u,glb,Emon.wsgmax100m,atmos.wsg.tmax-h100m-hxy-u.mon.glb,83bbfc7c-7f07-11ef-9308-b1dd71e64bec,medium
+124,atmos.wsg.tmax-h10m-hxy-u.mon.glb,mon,atmos,wind_speed_of_gust,m s-1,area: mean time: maximum,area: areacella,Maximum Wind Speed of Gust at 10m,"Maximum Wind Speed of Gust at 10m, monthly","Maximum instantaneous gust over grid cell, recorded monthly. Input data at the highest available frequency, ideally model timesteps, should be used to compute the maximum. Modellers are requested to leave in a comment in the netcdf metadata stating the frequency of the input data.",longitude latitude time height10m,wsg,real,,XY-na,time-intv,Emon,wsgmax10m,wsg,tmax-h10m-hxy-u,wsg_tmax-h10m-hxy-u,glb,Emon.wsgmax10m,atmos.wsg.tmax-h10m-hxy-u.mon.glb,83bbfc7a-7f07-11ef-9308-b1dd71e64bec,medium
\ No newline at end of file
diff --git a/awi-esm3-veg-hr-variables/extra_atm/cmip7_set2_extra_variables_atmosChem.csv b/awi-esm3-veg-hr-variables/extra_atm/cmip7_set2_extra_variables_atmosChem.csv
new file mode 100644
index 00000000..21eef3ca
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/extra_atm/cmip7_set2_extra_variables_atmosChem.csv
@@ -0,0 +1,3 @@
+,name,frequency,modeling_realm,standard_name,units,cell_methods,cell_measures,long_name,comment,processing_note,dimensions,out_name,type,positive,spatial_shape,temporal_shape,cmip6_table,physical_parameter_name,variableRootDD,branding_label,branded_variable_name,region,cmip6_compound_name,cmip7_compound_name,uid,priority
+128,atmosChem.flashrate.tavg-u-hxy-u.day.glb,day,atmosChem,frequency_of_lightning_flashes_per_unit_area,km-2 s-1,area: time: mean,area: areacella,Lightning Flash Rate,Lightning Flash Rate,frequency of lightning flashes per unit area,longitude latitude time,flashrate,real,,XY-na,time-intv,Eday,flashrate,flashrate,tavg-u-hxy-u,flashrate_tavg-u-hxy-u,glb,Eday.flashrate,atmosChem.flashrate.tavg-u-hxy-u.day.glb,83bbfbae-7f07-11ef-9308-b1dd71e64bec,medium
+129,atmosChem.flashrate.tavg-u-hxy-u.mon.glb,mon,atmosChem,frequency_of_lightning_flashes_per_unit_area,km-2 s-1,area: time: mean,area: areacella,Lightning Flash Rate,Lightning Flash Rate,,longitude latitude time,flashrate,real,,XY-na,time-intv,Emon,flashrate,flashrate,tavg-u-hxy-u,flashrate_tavg-u-hxy-u,glb,Emon.flashrate,atmosChem.flashrate.tavg-u-hxy-u.mon.glb,6f691c58-9acb-11e6-b7ee-ac72891c3257,low
\ No newline at end of file
diff --git a/awi-esm3-veg-hr-variables/extra_atm/cmip7_set2_extra_variables_atmosChem_aerosol.csv b/awi-esm3-veg-hr-variables/extra_atm/cmip7_set2_extra_variables_atmosChem_aerosol.csv
new file mode 100644
index 00000000..86cb205c
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/extra_atm/cmip7_set2_extra_variables_atmosChem_aerosol.csv
@@ -0,0 +1,2 @@
+,name,frequency,modeling_realm,standard_name,units,cell_methods,cell_measures,long_name,comment,processing_note,dimensions,out_name,type,positive,spatial_shape,temporal_shape,cmip6_table,physical_parameter_name,variableRootDD,branding_label,branded_variable_name,region,cmip6_compound_name,cmip7_compound_name,uid,priority
+127,atmosChem.emich4.tavg-u-hxy-u.mon.glb,mon,atmosChem aerosol,tendency_of_atmosphere_mass_content_of_methane_due_to_emission,kg m-2 s-1,area: time: mean,area: areacella,total emission rate of CH4,This is the total emission rate of methane (CH4) into the atmosphere,,longitude latitude time,emich4,real,,XY-na,time-intv,AERmon,emich4,emich4,tavg-u-hxy-u,emich4_tavg-u-hxy-u,glb,AERmon.emich4,atmosChem.emich4.tavg-u-hxy-u.mon.glb,83bbfbfb-7f07-11ef-9308-b1dd71e64bec,high
\ No newline at end of file
diff --git a/awi-esm3-veg-hr-variables/extra_atm/cmip7_set2_extra_variables_atmos_aerosol_land.csv b/awi-esm3-veg-hr-variables/extra_atm/cmip7_set2_extra_variables_atmos_aerosol_land.csv
new file mode 100644
index 00000000..9991aec4
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/extra_atm/cmip7_set2_extra_variables_atmos_aerosol_land.csv
@@ -0,0 +1,2 @@
+,name,frequency,modeling_realm,standard_name,units,cell_methods,cell_measures,long_name,comment,processing_note,dimensions,out_name,type,positive,spatial_shape,temporal_shape,cmip6_table,physical_parameter_name,variableRootDD,branding_label,branded_variable_name,region,cmip6_compound_name,cmip7_compound_name,uid,priority
+10,atmos.bldep.tavg-u-hxy-u.1hr.glb,1hr,atmos aerosol land,atmosphere_boundary_layer_thickness,m,area: time: mean,area: areacella,Boundary Layer Depth,Boundary Layer depth,,longitude latitude time,bldep,real,,XY-na,time-intv,E1hr,bldep,bldep,tavg-u-hxy-u,bldep_tavg-u-hxy-u,glb,E1hr.bldep,atmos.bldep.tavg-u-hxy-u.1hr.glb,83bbfbcb-7f07-11ef-9308-b1dd71e64bec,medium
\ No newline at end of file
diff --git a/awi-esm3-veg-hr-variables/extra_atm/cmip7_set2_extra_variables_atmos_land.csv b/awi-esm3-veg-hr-variables/extra_atm/cmip7_set2_extra_variables_atmos_land.csv
new file mode 100644
index 00000000..f67795d7
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/extra_atm/cmip7_set2_extra_variables_atmos_land.csv
@@ -0,0 +1,2 @@
+,name,frequency,modeling_realm,standard_name,units,cell_methods,cell_measures,long_name,comment,processing_note,dimensions,out_name,type,positive,spatial_shape,temporal_shape,cmip6_table,physical_parameter_name,variableRootDD,branding_label,branded_variable_name,region,cmip6_compound_name,cmip7_compound_name,uid,priority
+18,atmos.evspsbl.tavg-u-hxy-lnd.day.glb,day,atmos land,water_evapotranspiration_flux,kg m-2 s-1,area: mean where land time: mean,area: areacella,Evaporation Including Sublimation and Transpiration,Evaporation at surface (also known as evapotranspiration): flux of water into the atmosphere due to conversion of both liquid and solid phases to vapor (from underlying surface and vegetation),,longitude latitude time,evspsbl,real,,XY-na,time-intv,Eday,evspsbl,evspsbl,tavg-u-hxy-lnd,evspsbl_tavg-u-hxy-lnd,glb,Eday.evspsbl,atmos.evspsbl.tavg-u-hxy-lnd.day.glb,d22813e8-4a9f-11e6-b84e-ac72891c3257,high
\ No newline at end of file
diff --git a/awi-esm3-veg-hr-variables/extra_land/cmip7_awiesm3-veg-hr_extra_land.yaml b/awi-esm3-veg-hr-variables/extra_land/cmip7_awiesm3-veg-hr_extra_land.yaml
new file mode 100644
index 00000000..733ae4ef
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/extra_land/cmip7_awiesm3-veg-hr_extra_land.yaml
@@ -0,0 +1,285 @@
+# CMIP7 Extra Land Variables — AWI-ESM3-VEG-HR
+# Generated from cmip7_set2_extra_variables_land.csv
+#
+# 13 producible out of 19 total variables.
+# 6 blocked: 4 irrigation (no irrigation scheme), 1 river (no river routing),
+# 1 root zone moisture (no root-depth info from HTESSEL).
+
+general:
+ name: "awiesm3-cmip7-extra-land"
+ cmor_version: "CMIP7"
+ mip: "CMIP"
+ CMIP7_DReq_metadata: "/home/a/a270092/.cache/pycmor/cmip7_metadata/v1.2.2.2/metadata.json"
+
+pycmor:
+ warn_on_no_rule: False
+ dask_cluster: "slurm"
+ dask_cluster_scaling_mode: "fixed"
+ dask_cluster_scaling_fixed_jobs: 1
+
+jobqueue:
+ slurm:
+ name: pycmor-worker
+ queue: compute
+ account: bb1469
+ cores: 16
+ memory: 256GB
+ walltime: '00:30:00'
+
+pipelines:
+ # areacellr: same grid as atmosphere, reuse areacella computation
+ - name: areacella_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_areacella
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Southern hemisphere subset pipeline (orog 30S-90S, tas 1hr 30S-90S)
+ - name: southern_hemisphere_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:select_southern_hemisphere
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # LPJ-GUESS monthly loader (Jan..Dec format)
+ - name: lpjg_monthly_pipeline
+ steps:
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:load_lpjguess_monthly
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # LPJ-GUESS monthly loader + sum additional files (c3PftFrac)
+ - name: lpjg_monthly_sum_pipeline
+ steps:
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:load_lpjguess_monthly
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:sum_lpjguess_monthly_files
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Temporal differencing (dcw, dslw)
+ - name: temporal_diff_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_temporal_diff
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Soil wetness ratio (mrsow)
+ - name: mrsow_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_mrsow
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+inherit:
+ data_path: &dp /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/oifs
+ lpjg_data_path: &ldp /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/lpj_guess
+ source_id: AWI-ESM-3
+ institution_id: AWI
+ experiment_id: picontrol
+ variant_label: r1i1p1f1
+ grid_label: gn
+ grid: "OpenIFS TCo319 reduced Gaussian, interpolated to 0.25deg regular grid"
+ nominal_resolution: "25 km"
+ institution: "Alfred Wegener Institute, Helmholtz Centre for Polar and Marine Research, Bremerhaven, Germany"
+ output_directory: ./cmorized_output/awiesm3
+
+rules:
+ # ============================================================
+ # Part 1: Fixed fields (fx)
+ # ============================================================
+
+ # areacellr: same grid as atmosphere (no separate river model grid)
+ - name: areacellr
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_1m_lsm_1m_*.nc
+ compound_name: land.areacellr.ti-u-hxy-u.fx.glb
+ model_variable: lsm
+ pipelines:
+ - areacella_pipeline
+
+ # orog Southern Hemisphere subset (30S-90S)
+ - name: orog_south30
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_land_orog_mon_land_*.nc
+ compound_name: land.orog.ti-u-hxy-u.fx.30S-90S
+ model_variable: orog
+ pipelines:
+ - southern_hemisphere_pipeline
+
+ # ============================================================
+ # Part 2: LPJ-GUESS PFT fractions (monthly, Jan..Dec format)
+ # ============================================================
+
+ # c3PftFrac = grassFracC3 + treeFracBdlDcd + treeFracBdlEvg + treeFracNdlDcd + treeFracNdlEvg
+ - name: c3PftFrac
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/grassFracC3_monthly.out"
+ compound_name: land.c3PftFrac.tavg-u-hxy-u.mon.glb
+ model_variable: grassFracC3
+ additional_files: "treeFracBdlDcd_monthly.out,treeFracBdlEvg_monthly.out,treeFracNdlDcd_monthly.out,treeFracNdlEvg_monthly.out"
+ additional_pattern_prefix: "*/run1/"
+ output_variable: c3PftFrac
+ pipelines:
+ - lpjg_monthly_sum_pipeline
+
+ # c4PftFrac = grassFracC4 (no C4 trees in LPJ-GUESS)
+ - name: c4PftFrac
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/grassFracC4_monthly.out"
+ compound_name: land.c4PftFrac.tavg-u-hxy-u.mon.glb
+ model_variable: grassFracC4
+ pipelines:
+ - lpjg_monthly_pipeline
+
+ # cropFracC3 (all zeros, run_landcover=0)
+ - name: cropFracC3
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/cropFracC3_monthly.out"
+ compound_name: land.cropFracC3.tavg-u-hxy-u.mon.glb
+ model_variable: cropFracC3
+ pipelines:
+ - lpjg_monthly_pipeline
+
+ # cropFracC4 (all zeros, run_landcover=0)
+ - name: cropFracC4
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/cropFracC4_monthly.out"
+ compound_name: land.cropFracC4.tavg-u-hxy-u.mon.glb
+ model_variable: cropFracC4
+ pipelines:
+ - lpjg_monthly_pipeline
+
+ # pastureFracC3 (all zeros, run_landcover=0)
+ - name: pastureFracC3
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/pastureFracC3_monthly.out"
+ compound_name: land.pastureFracC3.tavg-u-hxy-u.mon.glb
+ model_variable: pastureFracC3
+ pipelines:
+ - lpjg_monthly_pipeline
+
+ # pastureFracC4 (all zeros, run_landcover=0)
+ - name: pastureFracC4
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/pastureFracC4_monthly.out"
+ compound_name: land.pastureFracC4.tavg-u-hxy-u.mon.glb
+ model_variable: pastureFracC4
+ pipelines:
+ - lpjg_monthly_pipeline
+
+ # ============================================================
+ # Part 3: LPJ-GUESS LAI (monthly, daily not available)
+ # ============================================================
+
+ # lai monthly (daily requested but LPJ-GUESS only outputs monthly)
+ - name: lai_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/lai_monthly.out"
+ compound_name: land.lai.tavg-u-hxy-lnd.day.glb
+ model_variable: lai
+ pipelines:
+ - lpjg_monthly_pipeline
+
+ # ============================================================
+ # Part 4: IFS/HTESSEL daily hydrology
+ # ============================================================
+
+ # dcw: change in interception storage (skin reservoir content)
+ - name: dcw_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_land_*.nc
+ compound_name: land.dcw.tavg-u-hxy-lnd.day.glb
+ model_variable: skin_reservoir
+ pipeline: temporal_diff_pipeline
+
+ # dslw: change in soil moisture (all 4 HTESSEL layers)
+ - name: dslw_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_land_*.nc
+ compound_name: land.dslw.tavg-u-hxy-lnd.day.glb
+ model_variable: soil_moisture
+ pipeline: temporal_diff_pipeline
+
+ # mrsow: total soil wetness (ratio of actual to saturated)
+ - name: mrsow_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_land_*.nc
+ compound_name: land.mrsow.tavg-u-hxy-lnd.day.glb
+ model_variable: mrsow
+ porosity: 0.472
+ pipelines:
+ - mrsow_pipeline
+
+ # ============================================================
+ # Part 5: Hourly IFS field with southern hemisphere subset
+ # ============================================================
+
+ # tas 1hr 30S-90S
+ - name: tas_1hr_south30
+ inputs:
+ - path: *dp
+ pattern: atmos_1h_tas_*.nc
+ compound_name: land.tas.tavg-h2m-hxy-u.1hr.30S-90S
+ model_variable: 2t
+ pipelines:
+ - southern_hemisphere_pipeline
diff --git a/awi-esm3-veg-hr-variables/extra_land/cmip7_extra_land_todo.md b/awi-esm3-veg-hr-variables/extra_land/cmip7_extra_land_todo.md
new file mode 100644
index 00000000..61b9cc5d
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/extra_land/cmip7_extra_land_todo.md
@@ -0,0 +1,100 @@
+# CMIP7 Extra Land Variables -- Rule Implementation TODO
+
+Variables from 1 CSV in `extra_land/`: 19 total rows.
+
+Model constraints:
+- Land surface: HTESSEL (4-layer soil, single-layer snow, no groundwater)
+- Vegetation: LPJ-GUESS 4.1.2 (run_landcover=0 → natural veg only, no land-use transitions)
+- No irrigation scheme
+- No river routing model (only rnfmap redistributes runoff to coast)
+- LPJ-GUESS output: plain-text .out files (monthly Jan..Dec format, yearly per-PFT)
+- IFS output via XIOS on 0.25deg regular grid
+
+---
+
+## Fixed fields (fx)
+
+### Producible
+
+- [x] **areacellr** (fx) -- Grid-Cell Area for River Model Variables (`m2`) -- same grid as atmosphere (no separate river grid), reuse areacella computation
+- [x] **orog** (fx, 30S-90S) -- Surface Altitude southern hemisphere subset (`m`) -- from IFS `sz` (surface geopotential / g), already defined in field_def. Regional subset via pycmor lat selection
+
+## Monthly PFT fractions from LPJ-GUESS
+
+### Producible (Jan..Dec format)
+
+- [x] **c3PftFrac** (mon) -- C3 Plant Functional Type Fraction (`%`) -- needs custom step to sum C3 grass + C3 tree fractions from `grassFracC3_monthly.out` + `treeFracBdlDcd_monthly.out` + `treeFracBdlEvg_monthly.out` + `treeFracNdlDcd_monthly.out` + `treeFracNdlEvg_monthly.out`
+- [x] **c4PftFrac** (mon) -- C4 Plant Functional Type Fraction (`%`) -- from `grassFracC4_monthly.out` (no C4 trees in LPJ-GUESS)
+- [x] **cropFracC3** (mon) -- C3 Crop Fraction (`%`) -- from `cropFracC3_monthly.out` (all zeros, run_landcover=0)
+- [x] **cropFracC4** (mon) -- C4 Crop Fraction (`%`) -- from `cropFracC4_monthly.out` (all zeros, run_landcover=0)
+- [x] **pastureFracC3** (mon) -- C3 Pasture Fraction (`%`) -- from `pastureFracC3_monthly.out` (all zeros, run_landcover=0)
+- [x] **pastureFracC4** (mon) -- C4 Pasture Fraction (`%`) -- from `pastureFracC4_monthly.out` (all zeros, run_landcover=0)
+
+## Monthly LAI from LPJ-GUESS
+
+- [x] **lai** (day requested, mon available) -- Leaf Area Index (`1`) -- LPJ-GUESS only outputs monthly (`lai_monthly.out`). Daily LAI not available. Provide monthly as best available.
+
+## Daily IFS/HTESSEL hydrology
+
+### Producible (via temporal differencing)
+
+- [x] **dcw** (day) -- Change in Interception Storage (`kg m-2`) -- temporal diff of `src * 1000` (skin reservoir content, m → kg/m2) via `compute_temporal_diff`
+- [x] **dslw** (day) -- Change in Soil Moisture (`kg m-2`) -- temporal diff of total soil moisture `1000*(swvl1*0.07+swvl2*0.21+swvl3*0.72+swvl4*1.89)` via `compute_temporal_diff`
+
+### Producible (from existing daily fields)
+
+- [x] **mrsow** (day) -- Total Soil Wetness (`1`) -- ratio of actual to saturated soil moisture. Approximation: `mrso / mrso_sat` where mrso_sat uses porosity. Alternative: output `swvl` ratio directly. Requires custom step.
+
+### NOT producible
+
+- ~~**rzwc** (day)~~ -- Root Zone Soil Moisture (`kg m-2`) -- HTESSEL has fixed soil layers [0.07, 0.21, 0.72, 1.89 m], not defined by root depth. Would need to know root depth distribution per grid cell, which varies by vegetation type and is internal to HTESSEL.
+
+## Daily IFS fields needing 1hr output
+
+### Producible (need new 1hr output file)
+
+- [x] **tas** (1hr, 30S-90S) -- Near-Surface Air Temperature (`K`) -- from `2t`, already in XIOS field_def. Need new 1hr output file. Regional subset via pycmor lat selection.
+
+## Irrigation variables
+
+### NOT producible (no irrigation scheme)
+
+- ~~**irrDem** (day)~~ -- Irrigation Water Demand -- no irrigation scheme in HTESSEL/LPJ-GUESS
+- ~~**irrGw** (day)~~ -- Irrigation from Groundwater -- no irrigation scheme
+- ~~**irrLut** (day)~~ -- Total Irrigation Withdrawal -- LPJ-GUESS `irrLut_monthly.out` exists but all zeros (run_landcover=0, no crops)
+- ~~**irrSurf** (day)~~ -- Irrigation from Surface Water -- no irrigation scheme
+
+## River variables
+
+### NOT producible (no river routing)
+
+- ~~**rivi** (day)~~ -- River Inflow -- no river routing model (only rnfmap redistributes runoff to coast)
+
+---
+
+## Summary
+
+| Category | Count | Done | Blocked |
+|----------|-------|------|---------|
+| Fixed fields (fx) | 2 | 2 | 0 |
+| Monthly PFT fractions (LPJ-GUESS) | 6 | 6 | 0 |
+| Monthly LAI (LPJ-GUESS) | 1 | 1 | 0 |
+| Daily hydrology (IFS temporal diff) | 2 | 2 | 0 |
+| Daily soil wetness (IFS) | 1 | 1 | 0 |
+| Root zone moisture | 1 | 0 | 1 (no root depth) |
+| Hourly tas (IFS) | 1 | 1 | 0 |
+| Irrigation | 4 | 0 | 4 (no irrigation) |
+| River inflow | 1 | 0 | 1 (no river routing) |
+| **Total** | **19** | **13** | **6** |
+
+## Implementation status
+
+All 13 producible variables implemented:
+- pycmor YAML rules in `cmip7_awiesm3-veg-hr_extra_land.yaml`
+- LPJ-GUESS monthly variables use existing `load_lpjguess_monthly` loader
+- Custom step `compute_c3PftFrac` sums C3 grass + all C3 tree fractions
+- `dcw` and `dslw` use existing `compute_temporal_diff` step
+- `mrsow` uses custom step `compute_mrsow` (soil wetness ratio)
+- `tas` 1hr and `orog` 30S-90S use lat-subsetting step `select_southern_hemisphere`
+- `areacellr` reuses `compute_areacella` (same grid)
+- New 1hr output file added to `file_def_oifs_cmip7_spinup.xml.j2`
diff --git a/awi-esm3-veg-hr-variables/extra_land/cmip7_set2_extra_variables_land.csv b/awi-esm3-veg-hr-variables/extra_land/cmip7_set2_extra_variables_land.csv
new file mode 100644
index 00000000..3dcd42ae
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/extra_land/cmip7_set2_extra_variables_land.csv
@@ -0,0 +1,20 @@
+,name,frequency,modeling_realm,standard_name,units,cell_methods,cell_measures,long_name,comment,processing_note,dimensions,out_name,type,positive,spatial_shape,temporal_shape,cmip6_table,physical_parameter_name,variableRootDD,branding_label,branded_variable_name,region,cmip6_compound_name,cmip7_compound_name,uid,priority
+130,land.areacellr.ti-u-hxy-u.fx.glb,fx,land,cell_area,m2,area: sum,,Grid-Cell Area for River Model Variables,"Cell areas for any grid used to report river model variables (may be the same as for atmospheric variables). These cell areas should be defined to enable exact calculation of area integrals (e.g., of vertical fluxes of energy at the surface and top of the atmosphere).",,longitude latitude,areacellr,real,,XY-na,None,fx,areacellr,areacellr,ti-u-hxy-u,areacellr_ti-u-hxy-u,glb,fx.areacellr,land.areacellr.ti-u-hxy-u.fx.glb,8306180c-76ca-11e7-ba39-ac72891c3257,high
+131,land.c3PftFrac.tavg-u-hxy-u.mon.glb,mon,land,area_fraction,%,area: time: mean,area: areacella,Percentage Cover by C3 Plant Functional Type,"Percentage of entire grid cell that is covered by C3 PFTs (including grass, crops, and trees).","Note that if this variable is independent of time, it should be stored only for a single time (user choice). CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where land over all_area_types time: mean CMIP7:area: time: mean,",longitude latitude time typec3pft,c3PftFrac,real,,XY-na,time-intv,Lmon,c3PftFrac,c3PftFrac,tavg-u-hxy-u,c3PftFrac_tavg-u-hxy-u,glb,Lmon.c3PftFrac,land.c3PftFrac.tavg-u-hxy-u.mon.glb,baa897e6-e5dd-11e5-8482-ac72891c3257,low
+132,land.c4PftFrac.tavg-u-hxy-u.mon.glb,mon,land,area_fraction,%,area: time: mean,area: areacella,Percentage Cover by C4 Plant Functional Type,Percentage of entire grid cell that is covered by C4 PFTs (including grass and crops).,"Note that if this variable is independent of time, it should be stored only for a single time (user choice). CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where land over all_area_types time: mean CMIP7:area: time: mean,",longitude latitude time typec4pft,c4PftFrac,real,,XY-na,time-intv,Lmon,c4PftFrac,c4PftFrac,tavg-u-hxy-u,c4PftFrac_tavg-u-hxy-u,glb,Lmon.c4PftFrac,land.c4PftFrac.tavg-u-hxy-u.mon.glb,baa89f8e-e5dd-11e5-8482-ac72891c3257,low
+133,land.cropFracC3.tavg-u-hxy-u.mon.glb,mon,land,area_fraction,%,area: time: mean,area: areacella,Percentage Cover by C3 Crops,Percentage of entire grid cell covered by C3 crops,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where land over all_area_types time: mean CMIP7:area: time: mean,",longitude latitude time typec3crop,cropFracC3,real,,XY-na,time-intv,Emon,cropFracC3,cropFracC3,tavg-u-hxy-u,cropFracC3_tavg-u-hxy-u,glb,Emon.cropFracC3,land.cropFracC3.tavg-u-hxy-u.mon.glb,8b81522c-4a5b-11e6-9cd2-ac72891c3257,medium
+134,land.cropFracC4.tavg-u-hxy-u.mon.glb,mon,land,area_fraction,%,area: time: mean,area: areacella,Percentage Cover by C4 Crops,Percentage of entire grid cell covered by C4 crops,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where land over all_area_types time: mean CMIP7:area: time: mean,",longitude latitude time typec4crop,cropFracC4,real,,XY-na,time-intv,Emon,cropFracC4,cropFracC4,tavg-u-hxy-u,cropFracC4_tavg-u-hxy-u,glb,Emon.cropFracC4,land.cropFracC4.tavg-u-hxy-u.mon.glb,6f6a8ea8-9acb-11e6-b7ee-ac72891c3257,medium
+136,land.dcw.tavg-u-hxy-lnd.day.glb,day,land,change_over_time_in_canopy_water_amount,kg m-2,area: mean where land time: mean,area: areacella,Change in Interception Storage,change_over_time_in_canopy_water_amount,,longitude latitude time,dcw,real,,XY-na,time-intv,Eday,dcw,dcw,tavg-u-hxy-lnd,dcw_tavg-u-hxy-lnd,glb,Eday.dcw,land.dcw.tavg-u-hxy-lnd.day.glb,d2287216-4a9f-11e6-b84e-ac72891c3257,high
+137,land.dslw.tavg-u-hxy-lnd.day.glb,day,land,change_over_time_in_mass_content_of_water_in_soil,kg m-2,area: mean where land time: mean,area: areacella,Change in Soil Moisture,Change in Soil Moisture,,longitude latitude time,dslw,real,,XY-na,time-intv,Eday,dslw,dslw,tavg-u-hxy-lnd,dslw_tavg-u-hxy-lnd,glb,Eday.dslw,land.dslw.tavg-u-hxy-lnd.day.glb,d2286460-4a9f-11e6-b84e-ac72891c3257,high
+141,land.irrDem.tavg-u-hxy-u.day.glb,day,land,surface_downward_mass_flux_of_water_due_to_irrigation,kg m-2 s-1,area: time: mean,area: areacella,irrigation water demand,the total amount of irrigation water demand,,longitude latitude time,irrDem,real,,XY-na,time-intv,day,irrDem,irrDem,tavg-u-hxy-u,irrDem_tavg-u-hxy-u,glb,day.irrDem,land.irrDem.tavg-u-hxy-u.day.glb,80ab7437-a698-11ef-914a-613c0433d878,medium
+142,land.irrGw.tavg-u-hxy-u.day.glb,day,land,surface_downward_mass_flux_of_water_due_to_irrigation,kg m-2 s-1,area: time: mean,area: areacella,irrigation water withdrawal from groundwater,"the amount of water withdrawal for irrigation from ground water, including deep soil water, confined and unconfined aquifer, etc",,longitude latitude time,irrGw,real,,XY-na,time-intv,day,irrGw,irrGw,tavg-u-hxy-u,irrGw_tavg-u-hxy-u,glb,day.irrGw,land.irrGw.tavg-u-hxy-u.day.glb,80ab7439-a698-11ef-914a-613c0433d878,medium
+144,land.irrLut.tavg-u-hxy-u.day.glb,day,land,surface_downward_mass_flux_of_water_due_to_irrigation,kg m-2 s-1,area: time: mean,area: areacella,irrigation water withdrawal,the total amount of water withdrawal from multiple sources,,longitude latitude time,irrLut,real,,XY-na,time-intv,day,irrLut,irrLut,tavg-u-hxy-u,irrLut_tavg-u-hxy-u,glb,day.irrLut,land.irrLut.tavg-u-hxy-u.day.glb,80ab7436-a698-11ef-914a-613c0433d878,medium
+145,land.irrSurf.tavg-u-hxy-u.day.glb,day,land,surface_downward_mass_flux_of_water_due_to_irrigation,kg m-2 s-1,area: time: mean,area: areacella,irrigation water withdrawal from surface water,"the amount of water withdrawal for irrigation from surface water, including rivers, lakes, reservoirs, etc.)",,longitude latitude time,irrSurf,real,,XY-na,time-intv,day,irrSurf,irrSurf,tavg-u-hxy-u,irrSurf_tavg-u-hxy-u,glb,day.irrSurf,land.irrSurf.tavg-u-hxy-u.day.glb,80ab7438-a698-11ef-914a-613c0433d878,medium
+146,land.lai.tavg-u-hxy-lnd.day.glb,day,land,leaf_area_index,1,area: mean where land time: mean,area: areacella,Leaf Area Index,A ratio obtained by dividing the total upper leaf surface area of vegetation by the (horizontal) surface area of the land on which it grows.,,longitude latitude time,lai,real,,XY-na,time-intv,Eday,lai,lai,tavg-u-hxy-lnd,lai_tavg-u-hxy-lnd,glb,Eday.lai,land.lai.tavg-u-hxy-lnd.day.glb,8b7ff4ea-4a5b-11e6-9cd2-ac72891c3257,low
+164,land.mrsow.tavg-u-hxy-lnd.day.glb,day,land,volume_fraction_of_condensed_water_in_soil_at_field_capacity,1,area: mean where land time: mean,area: areacella,Total Soil Wetness,relative_soil_moisture_content_above_field_capacity,,longitude latitude time,mrsow,real,,XY-na,time-intv,Eday,mrsow,mrsow,tavg-u-hxy-lnd,mrsow_tavg-u-hxy-lnd,glb,Eday.mrsow,land.mrsow.tavg-u-hxy-lnd.day.glb,d228a402-4a9f-11e6-b84e-ac72891c3257,high
+166,land.orog.ti-u-hxy-u.fx.30S-90S,fx,land,surface_altitude,m,area: mean,area: areacella,Surface Altitude,"height above the geoid; as defined here, ""the geoid"" is a surface of constant geopotential that, if the ocean were at rest, would coincide with mean sea level. Under this definition, the geoid changes as the mean volume of the ocean changes (e.g., due to glacial melt, or global warming of the ocean). Reported here is the height above the present-day geoid (0.0 over ocean).","This is a regional subset of the variable. If you are producing the global equivalent of fx.orogSouth30, you should omit this regional South30 version.",longitude latitude,orog,real,,XY-na,None,fx,orog,orog,ti-u-hxy-u,orog_ti-u-hxy-u,30S-90S,fx.orogSouth30,land.orog.ti-u-hxy-u.fx.30S-90S,80ac31ae-a698-11ef-914a-613c0433d878,high
+168,land.pastureFracC3.tavg-u-hxy-u.mon.glb,mon,land,area_fraction,%,area: time: mean,area: areacella,C3 Pasture Area Percentage,Percentage of entire grid cell covered by C3 pasture,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where land over all_area_types time: mean CMIP7:area: time: mean,",longitude latitude time typec3pastures,pastureFracC3,real,,XY-na,time-intv,Emon,pastureFracC3,pastureFracC3,tavg-u-hxy-u,pastureFracC3_tavg-u-hxy-u,glb,Emon.pastureFracC3,land.pastureFracC3.tavg-u-hxy-u.mon.glb,e706daf2-aa7f-11e6-9a4a-5404a60d96b5,medium
+169,land.pastureFracC4.tavg-u-hxy-u.mon.glb,mon,land,area_fraction,%,area: time: mean,area: areacella,C4 Pasture Area Percentage,Percentage of entire grid cell covered by C4 pasture,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where land over all_area_types time: mean CMIP7:area: time: mean,",longitude latitude time typec4pastures,pastureFracC4,real,,XY-na,time-intv,Emon,pastureFracC4,pastureFracC4,tavg-u-hxy-u,pastureFracC4_tavg-u-hxy-u,glb,Emon.pastureFracC4,land.pastureFracC4.tavg-u-hxy-u.mon.glb,e706df98-aa7f-11e6-9a4a-5404a60d96b5,medium
+170,land.rivi.tavg-u-hxy-lnd.day.glb,day,land,incoming_water_volume_transport_along_river_channel,m3 s-1,area: mean where land time: mean,area: areacellr,River Inflow,water_flux_to_downstream,,longitude latitude time,rivi,real,,XY-na,time-intv,Eday,rivi,rivi,tavg-u-hxy-lnd,rivi_tavg-u-hxy-lnd,glb,Eday.rivi,land.rivi.tavg-u-hxy-lnd.day.glb,d2285fce-4a9f-11e6-b84e-ac72891c3257,high
+172,land.rzwc.tavg-u-hxy-lnd.day.glb,day,land,mass_content_of_water_in_soil_layer_defined_by_root_depth,kg m-2,area: mean where land time: mean,area: areacella,Root Zone Soil Moisture,water_content_of_root_zone,,longitude latitude time,rzwc,real,,XY-na,time-intv,Eday,rzwc,rzwc,tavg-u-hxy-lnd,rzwc_tavg-u-hxy-lnd,glb,Eday.rzwc,land.rzwc.tavg-u-hxy-lnd.day.glb,d2287f90-4a9f-11e6-b84e-ac72891c3257,medium
+173,land.tas.tavg-h2m-hxy-u.1hr.30S-90S,1hr,land,air_temperature,K,area: time: mean,area: areacella,Near-Surface Air Temperature,Hourly Temperature at 2m above the surface,"This is a regional subset of the variable. If you are producing the global equivalent of E1hr.tasSouth30, you should omit this regional South30 version.",longitude latitude time height2m,tas,real,,XY-na,time-intv,E1hr,tas,tas,tavg-h2m-hxy-u,tas_tavg-h2m-hxy-u,30S-90S,E1hr.tasSouth30,land.tas.tavg-h2m-hxy-u.1hr.30S-90S,80ac31e0-a698-11ef-914a-613c0433d878,high
\ No newline at end of file
diff --git a/awi-esm3-veg-hr-variables/field_def_cmip7.xml b/awi-esm3-veg-hr-variables/field_def_cmip7.xml
new file mode 100644
index 00000000..19490f9c
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/field_def_cmip7.xml
@@ -0,0 +1,525 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -ttr/3600
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ tisr/3600
+
+
+
+ (tisr-tsr)/3600
+
+
+
+
+ (tisr-tsrc)/3600
+
+
+ -ttrc/3600
+
+
+
+ ssrd/3600
+
+
+ (ssrd-ssr)/3600
+
+
+ strd/3600
+
+
+ (strd-str)/3600
+
+
+
+ ssrdc/3600
+
+
+ (ssrdc-ssrc)/3600
+
+
+ strdc/3600
+
+
+ (strdc-strc)/3600
+
+
+
+ -slhf/3600
+
+
+ -sshf/3600
+
+
+
+ ewss/3600
+
+
+ nsss/3600
+
+
+
+ tp*1000/3600
+
+
+ cp*1000/3600
+
+
+ sf*1000/3600
+
+
+
+ tcc*100
+
+
+
+ tp*1000/3600
+
+
+
+ tp*1000/3600
+
+
+
+ cc*100
+
+
+
+
+
+
+ -1000*e/3600
+
+
+
+ 1000*ro/3600
+
+
+ 1000*sro/3600
+
+
+
+ sd*1000
+
+
+
+ sz/9.80665
+
+
+
+ skt
+
+
+
+ lai_lv*cvl + lai_hv*cvh
+
+
+
+ 1000*(swvl1*0.07 + swvl2*0.21 + swvl3*0.72 + swvl4*1.89)
+
+
+
+ 1000*(swvl1*0.07 + swvl2*0.03)
+
+
+
+
+ -slhf/3600
+
+
+
+ -sshf/3600
+
+
+
+ strd/3600
+
+
+
+ (strd-str)/3600
+
+
+
+ ssrd/3600
+
+
+
+ (ssrd-ssr)/3600
+
+
+
+
+ str/3600
+
+
+
+
+
+ sf*1000/3600
+
+
+
+
+ smlt*1000/3600
+
+
+
+
+
+ 1000*(swvl1*0.07 + swvl2*0.21 + swvl3*0.72)
+
+
+
+ -es*1000/3600
+
+
+
+ (ssr+str)/3600
+
+
+
+ (ssr+str+sshf+slhf)/3600
+
+
+
+ -pev*1000/3600
+
+
+
+ ssro*1000/3600
+
+
+
+ -es*1000/3600
+
+
+
+ smlt*1000/3600
+
+
+
+
+
+
+
+ sf*1000/3600
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ z_pl/9.80665
+
+
+
+ r_pl*100
+
+
+
+
+
+
+
+ z/9.80665
+
+
+
+ r*100
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/awi-esm3-veg-hr-variables/file_def_oifs_cmip7_spinup.xml.j2 b/awi-esm3-veg-hr-variables/file_def_oifs_cmip7_spinup.xml.j2
new file mode 100644
index 00000000..04ced6d3
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/file_def_oifs_cmip7_spinup.xml.j2
@@ -0,0 +1,892 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ sqrt(10u*10u + 10v*10v)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{% if general.with_co2_oce_coupling | default(false) or general.with_co2_veg_coupling | default(false) %}
+
+
+
+
+{% endif %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{% if general.with_co2_oce_coupling | default(false) or general.with_co2_veg_coupling | default(false) %}
+
+
+
+
+{% endif %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{% if general.with_co2_oce_coupling | default(false) or general.with_co2_veg_coupling | default(false) %}
+
+
+
+
+{% endif %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{% if general.with_co2_tracer | default(false) %}
+
+{% endif %}
+
+
+
+
+
diff --git a/awi-esm3-veg-hr-variables/grid_def.xml b/awi-esm3-veg-hr-variables/grid_def.xml
new file mode 100644
index 00000000..5cad7e63
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/grid_def.xml
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/awi-esm3-veg-hr-variables/lrcs_land/cmip7_awiesm3-veg-hr_lrcs_land.yaml b/awi-esm3-veg-hr-variables/lrcs_land/cmip7_awiesm3-veg-hr_lrcs_land.yaml
new file mode 100644
index 00000000..e9e01cd5
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/lrcs_land/cmip7_awiesm3-veg-hr_lrcs_land.yaml
@@ -0,0 +1,158 @@
+# CMIP7 LRCS Land Variables — AWI-ESM3-VEG-HR
+# All 6 deferred core_land variables now implemented:
+# 3 from LPJ-GUESS monthly output (evspsblsoi, evspsblveg, mrfso)
+# 3 derived from IFS static fields (sftgif, mrsofc, rootd)
+
+general:
+ name: "awiesm3-cmip7-lrcs-land"
+ cmor_version: "CMIP7"
+ mip: "CMIP"
+ CMIP7_DReq_metadata: "/home/a/a270092/.cache/pycmor/cmip7_metadata/v1.2.2.2/metadata.json"
+
+pycmor:
+ warn_on_no_rule: False
+ dask_cluster: "slurm"
+ dask_cluster_scaling_mode: "fixed"
+ dask_cluster_scaling_fixed_jobs: 1
+
+jobqueue:
+ slurm:
+ name: pycmor-worker
+ queue: compute
+ account: bb1469
+ cores: 16
+ memory: 256GB
+ walltime: '00:30:00'
+
+pipelines:
+ # LPJ-GUESS monthly loader (Jan..Dec format)
+ - name: lpjg_monthly_pipeline
+ steps:
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:load_lpjguess_monthly
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Custom fx pipeline for IFS-derived static fields (sftgif, mrsofc, rootd)
+ - name: sftgif_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_sftgif
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ - name: mrsofc_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_mrsofc
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ - name: rootd_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_rootd
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+inherit:
+ data_path: &dp /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/oifs
+ lpjg_data_path: &ldp /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/lpj_guess
+ source_id: AWI-ESM-3
+ institution_id: AWI
+ experiment_id: picontrol
+ variant_label: r1i1p1f1
+ grid_label: gn
+ grid: "OpenIFS TCo319 reduced Gaussian, interpolated to 0.25deg regular grid"
+ nominal_resolution: "25 km"
+ institution: "Alfred Wegener Institute, Helmholtz Centre for Polar and Marine Research, Bremerhaven, Germany"
+ output_directory: ./cmorized_output/awiesm3
+
+rules:
+ # Bare soil evaporation (monthly, from LPJ-GUESS)
+ - name: evspsblsoi
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/evspsblsoi_monthly.out"
+ compound_name: land.evspsblsoi.tavg-u-hxy-lnd.mon.glb
+ model_variable: evspsblsoi
+ pipelines:
+ - lpjg_monthly_pipeline
+
+ # Canopy water evaporation (monthly, from LPJ-GUESS)
+ - name: evspsblveg
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/evspsblveg_monthly.out"
+ compound_name: land.evspsblveg.tavg-u-hxy-lnd.mon.glb
+ model_variable: evspsblveg
+ pipelines:
+ - lpjg_monthly_pipeline
+
+ # Soil frozen water content (monthly, from LPJ-GUESS)
+ - name: mrfso
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/mrfso_monthly.out"
+ compound_name: landIce.mrfso.tavg-u-hxy-lnd.mon.glb
+ model_variable: mrfso
+ pipelines:
+ - lpjg_monthly_pipeline
+
+ # ============================================================
+ # Derived from IFS static fields (fx)
+ # ============================================================
+
+ # Glacier fraction from vegetation type fields
+ - name: sftgif
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_land_static_*.nc
+ compound_name: land.sftgif.ti-u-hxy-u.fx.glb
+ model_variable: sftgif
+ pipelines:
+ - sftgif_pipeline
+
+ # Field capacity from soil type lookup
+ - name: mrsofc
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_land_static_*.nc
+ compound_name: land.mrsofc.ti-u-hxy-lnd.fx.glb
+ model_variable: mrsofc
+ pipelines:
+ - mrsofc_pipeline
+
+ # Maximum root depth from vegetation type weighted average
+ - name: rootd
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_land_static_*.nc
+ compound_name: land.rootd.ti-u-hxy-lnd.fx.glb
+ model_variable: rootd
+ pipelines:
+ - rootd_pipeline
diff --git a/awi-esm3-veg-hr-variables/lrcs_land/cmip7_lrcs_land_todo.md b/awi-esm3-veg-hr-variables/lrcs_land/cmip7_lrcs_land_todo.md
new file mode 100644
index 00000000..3c129a91
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/lrcs_land/cmip7_lrcs_land_todo.md
@@ -0,0 +1,44 @@
+# CMIP7 LRCS Land Variables — TODO
+
+Variables deferred from core_land that cannot be produced from IFS/OIFS output alone.
+These require LPJ-GUESS dynamic vegetation output or external datasets.
+
+## From core_land CSVs (deferred)
+
+### From LPJ-GUESS output (now implemented)
+
+- [x] **evspsblsoi** — Water Evaporation from Soil (`kg m-2 s-1`, Lmon)
+ - compound_name: `land.evspsblsoi.tavg-u-hxy-lnd.mon.glb`
+ - From LPJ-GUESS `evspsblsoi_monthly.out` (Jan..Dec format)
+ - IFS `e` is total evaporation (not partitioned), but LPJ-GUESS provides soil evaporation separately
+
+- [x] **evspsblveg** — Evaporation from Canopy (`kg m-2 s-1`, Lmon)
+ - compound_name: `land.evspsblveg.tavg-u-hxy-lnd.mon.glb`
+ - From LPJ-GUESS `evspsblveg_monthly.out` (Jan..Dec format)
+ - LPJ-GUESS provides canopy evaporation (interception loss)
+
+- [x] **rootd** — Maximum Root Depth (`m`, fx)
+ - compound_name: `land.rootd.ti-u-hxy-lnd.fx.glb`
+ - Derived from IFS `tvl`/`tvh` vegetation type fields + HTESSEL Zeng et al. (1998) root depth lookup
+ - Vegetation-type-weighted root depth: `rootd = cvl * rootd(tvl) + cvh * rootd(tvh)`
+
+### Derived from IFS static fields (now implemented)
+
+- [x] **mrsofc** — Capacity of Soil to Store Water / Field Capacity (`kg m-2`, fx)
+ - compound_name: `land.mrsofc.ti-u-hxy-lnd.fx.glb`
+ - Derived from IFS `slt` (soil type) + HTESSEL Van Genuchten field capacity lookup
+ - `mrsofc = theta_fc(slt) * 2.89m * 1000 kg/m3`
+
+- [x] **sftgif** — Land Ice Area Percentage (`%`, fx)
+ - compound_name: `land.sftgif.ti-u-hxy-u.fx.glb`
+ - Derived from IFS vegetation type 12 = "Ice Caps and Glaciers"
+ - `sftgif = (cvl * (tvl==12) + cvh * (tvh==12)) * 100`
+
+- [x] **mrfso** — Soil Frozen Water Content (`kg m-2`, LImon)
+ - compound_name: `landIce.mrfso.tavg-u-hxy-lnd.mon.glb`
+ - From LPJ-GUESS `mrfso_monthly.out` (Jan..Dec format)
+ - LPJ-GUESS tracks frozen soil water content directly
+
+## Additional LRCS-specific land variables
+
+(To be populated when LRCS land CSV is available)
diff --git a/awi-esm3-veg-hr-variables/lrcs_ocean/cmip7_LRCSextra_variables_ocean.csv b/awi-esm3-veg-hr-variables/lrcs_ocean/cmip7_LRCSextra_variables_ocean.csv
new file mode 100644
index 00000000..65102ed7
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/lrcs_ocean/cmip7_LRCSextra_variables_ocean.csv
@@ -0,0 +1,149 @@
+,name,frequency,modeling_realm,standard_name,units,cell_methods,cell_measures,long_name,comment,processing_note,dimensions,out_name,type,positive,spatial_shape,temporal_shape,cmip6_table,physical_parameter_name,variableRootDD,branding_label,branded_variable_name,region,cmip6_compound_name,cmip7_compound_name,uid,priority,flag_values,flag_meanings
+144,ocean.absscint.tavg-op4-hxy-sea.mon.glb,mon,ocean,integral_wrt_depth_of_sea_water_absolute_salinity_expressed_as_salt_mass_content,kg m-2,area: time: mean where sea,area: areacello,Integral wrt depth of seawater absolute salinity expressed as salt mass content,"This is a fundamental aspect of the changes in the hydrological cycle and their impact on the oceans, and due to new numerical schemes and vertical discretizations, it is important to calculate it consistently with the model formulation.","CHANGE: This is a new variable, which aids in understanding hydrological change. It is preferable to calculate it online, due to difficulties with vertical discretizations. It is calculated as an integral over hydrostatic pressure ranges, which makes it directly comparable with observations.",longitude latitude oplayer4 time,absscint,real,,XY-B,time-intv,Omon,absscint,absscint,tavg-op4-hxy-sea,absscint_tavg-op4-hxy-sea,glb,Omon.absscint,ocean.absscint.tavg-op4-hxy-sea.mon.glb,80ab72a5-a698-11ef-914a-613c0433d878,high,,
+145,ocean.agessc.tavg-ol-hxy-sea.mon.glb,mon,ocean,sea_water_age_since_surface_contact,yr,area: mean where sea time: mean,area: areacello volume: volcello,Sea Water Age Since Surface Contact,Time elapsed since water was last in surface layer of the ocean.,Report on native horizontal grid as well as on a spherical latitude/longitude grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,agessc,real,,XY-O,time-intv,Omon,agessc,agessc,tavg-ol-hxy-sea,agessc_tavg-ol-hxy-sea,glb,Omon.agessc,ocean.agessc.tavg-ol-hxy-sea.mon.glb,baa56de6-e5dd-11e5-8482-ac72891c3257,high,,
+148,ocean.bigthetao.tavg-ol-hm-sea.mon.glb,mon,ocean,sea_water_conservative_temperature,degC,area: mean where sea time: mean,,Global Average Sea Water Conservative Temperature,Diagnostic should be contributed only for models using conservative temperature as prognostic field.,"CHANGE SINCE CMIP6 in Dimensions - CMIP6:time CMIP7:olevel time,",olevel time,bigthetao,real,,na-O,time-intv,Omon,bigthetaoga,bigthetao,tavg-ol-hm-sea,bigthetao_tavg-ol-hm-sea,glb,Omon.bigthetaoga,ocean.bigthetao.tavg-ol-hm-sea.mon.glb,baa52994-e5dd-11e5-8482-ac72891c3257,high,,
+149,ocean.bigthetao.tavg-ol-hxy-sea.dec.glb,dec,ocean,sea_water_conservative_temperature,degC,area: mean where sea time: mean,area: areacello volume: volcello,Sea Water Conservative Temperature,Diagnostic should be contributed only for models using conservative temperature as prognostic field.,,longitude latitude olevel time,bigthetao,real,,XY-O,time-intv,Odec,bigthetao,bigthetao,tavg-ol-hxy-sea,bigthetao_tavg-ol-hxy-sea,glb,Odec.bigthetao,ocean.bigthetao.tavg-ol-hxy-sea.dec.glb,134c7db2-1026-11e8-9d87-1c4d70487308,high,,
+151,ocean.chcint.tavg-op4-hxy-sea.mon.glb,mon,ocean,integral_wrt_depth_of_sea_water_conservative_temperature_expressed_as_heat_content,J m-2,area: time: mean where sea,area: areacello,Depth Integrated Seawater Conservative Temperature Expressed As Heat Content,This is the vertically-integrated heat content derived from conservative temperature (bigthetao).,"CHANGE: This is a new variable, which aids in calculation of energy budgets. It is preferable to calculate it online, due to difficulties with vertical discretizations. It is calculated as an integral over hydrostatic pressure ranges, which makes it directly comparable with observations so long as integrals are over 0-300m, 300m-700m, 700m-2000m, total depth.",longitude latitude oplayer4 time,chcint,real,,XY-B,time-intv,Omon,chcint,chcint,tavg-op4-hxy-sea,chcint_tavg-op4-hxy-sea,glb,Omon.chcint,ocean.chcint.tavg-op4-hxy-sea.mon.glb,80ab72a2-a698-11ef-914a-613c0433d878,high,,
+153,ocean.difmxybo.tavg-ol-hxy-sea.yr.glb,yr,ocean,ocean_momentum_xy_biharmonic_diffusivity,m4 s-1,area: mean where sea time: mean,area: areacello volume: volcello,Ocean Momentum XY Biharmonic Diffusivity,Lateral biharmonic viscosity applied to the momentum equations.,Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,difmxybo,real,,XY-O,time-intv,Oyr,difmxybo,difmxybo,tavg-ol-hxy-sea,difmxybo_tavg-ol-hxy-sea,glb,Oyr.difmxybo,ocean.difmxybo.tavg-ol-hxy-sea.yr.glb,baa4e8ee-e5dd-11e5-8482-ac72891c3257,low,,
+154,ocean.difmxylo.tavg-ol-hxy-sea.yr.glb,yr,ocean,ocean_momentum_xy_laplacian_diffusivity,m2 s-1,area: mean where sea time: mean,area: areacello volume: volcello,Ocean Momentum XY Laplacian Diffusivity,Lateral Laplacian viscosity applied to the momentum equations.,Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,difmxylo,real,,XY-O,time-intv,Oyr,difmxylo,difmxylo,tavg-ol-hxy-sea,difmxylo_tavg-ol-hxy-sea,glb,Oyr.difmxylo,ocean.difmxylo.tavg-ol-hxy-sea.yr.glb,baa4e4a2-e5dd-11e5-8482-ac72891c3257,low,,
+155,ocean.diftrblo.tavg-ol-hxy-sea.yr.glb,yr,ocean,ocean_tracer_laplacian_diffusivity_due_to_parameterized_mesoscale_eddy_advection,m2 s-1,area: mean where sea time: mean,area: areacello volume: volcello,Ocean Tracer Diffusivity Due to Parameterized Mesoscale Advection,"Ocean tracer diffusivity associated with parameterized eddy-induced advective transport. Sometimes this diffusivity is called the ""thickness"" diffusivity. For CMIP5, this diagnostic was called ""ocean tracer bolus laplacian diffusivity"". The CMIP6 name is physically more relevant.",Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,diftrblo,real,,XY-O,time-intv,Oyr,diftrblo,diftrblo,tavg-ol-hxy-sea,diftrblo_tavg-ol-hxy-sea,glb,Oyr.diftrblo,ocean.diftrblo.tavg-ol-hxy-sea.yr.glb,baa4d82c-e5dd-11e5-8482-ac72891c3257,low,,
+156,ocean.diftrelo.tavg-ol-hxy-sea.yr.glb,yr,ocean,ocean_tracer_epineutral_laplacian_diffusivity,m2 s-1,area: mean where sea time: mean,area: areacello volume: volcello,Ocean Tracer Epineutral Laplacian Diffusivity,Ocean tracer diffusivity associated with parameterized eddy-induced diffusive transport oriented along neutral or isopycnal directions. Sometimes this diffusivity is called the neutral diffusivity or isopycnal diffusivity or Redi diffusivity.,Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,diftrelo,real,,XY-O,time-intv,Oyr,diftrelo,diftrelo,tavg-ol-hxy-sea,diftrelo_tavg-ol-hxy-sea,glb,Oyr.diftrelo,ocean.diftrelo.tavg-ol-hxy-sea.yr.glb,baa4dc50-e5dd-11e5-8482-ac72891c3257,low,,
+157,ocean.difvho.tavg-ol-hxy-sea.yr.glb,yr,ocean,ocean_vertical_heat_diffusivity,m2 s-1,area: mean where sea time: mean,area: areacello volume: volcello,Ocean Vertical Heat Diffusivity,Vertical/dianeutral diffusivity applied to prognostic temperature field.,Report on native horizontal grid as well. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,difvho,real,,XY-O,time-intv,Oyr,difvho,difvho,tavg-ol-hxy-sea,difvho_tavg-ol-hxy-sea,glb,Oyr.difvho,ocean.difvho.tavg-ol-hxy-sea.yr.glb,baa4ac8a-e5dd-11e5-8482-ac72891c3257,low,,
+158,ocean.difvso.tavg-ol-hxy-sea.yr.glb,yr,ocean,ocean_vertical_salt_diffusivity,m2 s-1,area: mean where sea time: mean,area: areacello volume: volcello,Ocean Vertical Salt Diffusivity,Vertical/dianeutral diffusivity applied to prognostic salinity field.,Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,difvso,real,,XY-O,time-intv,Oyr,difvso,difvso,tavg-ol-hxy-sea,difvso_tavg-ol-hxy-sea,glb,Oyr.difvso,ocean.difvso.tavg-ol-hxy-sea.yr.glb,baa4b0b8-e5dd-11e5-8482-ac72891c3257,low,,
+159,ocean.dispkexyfo.tavg-u-hxy-sea.yr.glb,yr,ocean,ocean_kinetic_energy_dissipation_per_unit_area_due_to_xy_friction,W m-2,area: mean where sea time: mean,area: areacello,Ocean Kinetic Energy Dissipation per Unit Area Due to XY Friction,"Depth integrated impacts on kinetic energy arising from lateral frictional dissipation associated with Laplacian and/or biharmonic viscosity. For CMIP5, this diagnostic was 3d, whereas the CMIP6 depth integrated diagnostic is sufficient for many purposes and reduces archive requirements.",,longitude latitude time,dispkexyfo,real,,XY-int,time-intv,Oyr,dispkexyfo,dispkexyfo,tavg-u-hxy-sea,dispkexyfo_tavg-u-hxy-sea,glb,Oyr.dispkexyfo,ocean.dispkexyfo.tavg-u-hxy-sea.yr.glb,baa4ed3a-e5dd-11e5-8482-ac72891c3257,low,,
+160,ocean.dxto.ti-u-hxy-u.fx.glb,fx,ocean,cell_x_length,m,area: point,--MODEL,Cell Length in the X Direction at t-points,"The linear extent of the cell in the x direction of the horizontal grid centered at t-points (points for tracers such as temperature, salinity, etc.). Not applicable to unstructured grids.",,longitude latitude,dxto,real,,XY-na,None,Ofx,dxto,dxto,ti-u-hxy-u,dxto_ti-u-hxy-u,glb,Ofx.dxto,ocean.dxto.ti-u-hxy-u.fx.glb,83bbfb67-7f07-11ef-9308-b1dd71e64bec,low,,
+161,ocean.dxuo.ti-u-hxy-u.fx.glb,fx,ocean,cell_x_length,m,area: point,--MODEL,Cell Length in the X Direction at u-points,The linear extent of the cell in the x direction of the horizontal grid centered at u-points (points for velocity in the x-direction). Not applicable to unstructured grids.,,longitude latitude,dxuo,real,,XY-na,None,Ofx,dxuo,dxuo,ti-u-hxy-u,dxuo_ti-u-hxy-u,glb,Ofx.dxuo,ocean.dxuo.ti-u-hxy-u.fx.glb,83bbfb66-7f07-11ef-9308-b1dd71e64bec,low,,
+162,ocean.dxvo.ti-u-hxy-u.fx.glb,fx,ocean,cell_x_length,m,area: point,--MODEL,Cell Length in the X Direction at v-points,The linear extent of the cell in the x direction of the horizontal grid centered at v-points (points for velocity in the y-direction). Not applicable to unstructured grids.,,longitude latitude,dxvo,real,,XY-na,None,Ofx,dxvo,dxvo,ti-u-hxy-u,dxvo_ti-u-hxy-u,glb,Ofx.dxvo,ocean.dxvo.ti-u-hxy-u.fx.glb,83bbfb65-7f07-11ef-9308-b1dd71e64bec,low,,
+163,ocean.dyto.ti-u-hxy-u.fx.glb,fx,ocean,cell_y_length,m,area: point,--MODEL,Cell Length in the Y Direction at t-points,"The linear extent of the cell in the y direction of the horizontal grid centered at t-points (points for tracers such as temperature, salinity, etc.). Not applicable to unstructured grids.",,longitude latitude,dyto,real,,XY-na,None,Ofx,dyto,dyto,ti-u-hxy-u,dyto_ti-u-hxy-u,glb,Ofx.dyto,ocean.dyto.ti-u-hxy-u.fx.glb,83bbfb64-7f07-11ef-9308-b1dd71e64bec,low,,
+164,ocean.dyuo.ti-u-hxy-u.fx.glb,fx,ocean,cell_y_length,m,area: point,--MODEL,Cell Length in the Y Direction at u-points,The linear extent of the cell in the y direction of the horizontal grid centered at u-points (points for velocity in the x-direction). Not applicable to unstructured grids.,,longitude latitude,dyuo,real,,XY-na,None,Ofx,dyuo,dyuo,ti-u-hxy-u,dyuo_ti-u-hxy-u,glb,Ofx.dyuo,ocean.dyuo.ti-u-hxy-u.fx.glb,83bbfb63-7f07-11ef-9308-b1dd71e64bec,low,,
+165,ocean.dyvo.ti-u-hxy-u.fx.glb,fx,ocean,cell_y_length,m,area: point,--MODEL,Cell Length in the Y Direction at v-points,The linear extent of the cell in the y direction of the horizontal grid centered at v-points (points for velocity in the y-direction). Not applicable to unstructured grids.,,longitude latitude,dyvo,real,,XY-na,None,Ofx,dyvo,dyvo,ti-u-hxy-u,dyvo_ti-u-hxy-u,glb,Ofx.dyvo,ocean.dyvo.ti-u-hxy-u.fx.glb,83bbfb62-7f07-11ef-9308-b1dd71e64bec,low,,
+166,ocean.evspsbl.tavg-u-hxy-ifs.mon.glb,mon,ocean,water_evapotranspiration_flux,kg m-2 s-1,area: mean where ice_free_sea over sea time: mean,area: areacello,Water Evaporation Flux Where Ice Free Ocean over Sea,computed as the total mass of water vapor evaporating from the ice-free portion of the ocean divided by the area of the ocean portion of the grid cell.,,longitude latitude time,evspsbl,real,,XY-na,time-intv,Omon,evs,evspsbl,tavg-u-hxy-ifs,evspsbl_tavg-u-hxy-ifs,glb,Omon.evs,ocean.evspsbl.tavg-u-hxy-ifs.mon.glb,baa6204c-e5dd-11e5-8482-ac72891c3257,medium,,
+168,ocean.ficeberg.tavg-u-hxy-sea.mon.glb,mon,ocean,water_flux_into_sea_water_from_icebergs,kg m-2 s-1,area: mean where sea time: mean,area: areacello,Water Flux into Sea Water from Icebergs,computed as the iceberg melt water flux into the ocean divided by the area of the ocean portion of the grid cell.,"If only the vertically integrated melt water flux is available, report as this 2-d field; otherwise ficeberg should be used.",longitude latitude time,ficeberg,real,,XY-na,time-intv,Omon,ficeberg,ficeberg,tavg-u-hxy-sea,ficeberg_tavg-u-hxy-sea,glb,Omon.ficeberg2d,ocean.ficeberg.tavg-u-hxy-sea.mon.glb,baa62cea-e5dd-11e5-8482-ac72891c3257,high,,
+169,ocean.flandice.tavg-u-hxy-sea.mon.glb,mon,ocean,water_flux_into_sea_water_from_land_ice,kg m-2 s-1,area: mean where sea time: mean,area: areacello,Water Flux into Sea Water from Land Ice,Computed as the water flux into the ocean due to land ice (runoff water from surface and base of land ice or melt from base of ice shelf or vertical ice front) into the ocean divided by the area ocean portion of the grid cell,,longitude latitude time,flandice,real,,XY-na,time-intv,Emon,flandice,flandice,tavg-u-hxy-sea,flandice_tavg-u-hxy-sea,glb,Emon.flandice,ocean.flandice.tavg-u-hxy-sea.mon.glb,d2234af2-4a9f-11e6-b84e-ac72891c3257,high,,
+171,ocean.hfacrossline.tavg-u-ht-sea.mon.glb,mon,ocean,ocean_heat_transport_across_line,W,area: mean where sea depth: sum where sea time: mean,,Ocean Heat Transport across Lines,"Depth-integrated total heat transport from resolved and parameterized processes across different lines on the Earth's surface (based on appendix J and table J1 of Griffies et al., 2016). Formally, this means the integral along the line of the normal component of the heat transport. Positive and negative numbers refer to total northward/eastward and southward/westward transports, respectively. The transport should be evaluated for the full depth of the ocean, except for the Pacific Equatorial Undercurrent, which is averaged from the surface to 350m. Use Celsius for temperature scale.",,oline time,hfacrossline,real,,TR-na,time-intv,Omon,hfacrossline,hfacrossline,tavg-u-ht-sea,hfacrossline_tavg-u-ht-sea,glb,Omon.hfacrossline,ocean.hfacrossline.tavg-u-ht-sea.mon.glb,80ab7446-a698-11ef-914a-613c0433d878,medium,,
+173,ocean.hfbasinpadv.tavg-u-hyb-sea.mon.glb,mon,ocean,northward_ocean_heat_transport_due_to_parameterized_eddy_advection,W,depth: longitude: sum where sea (along a zig-zag grid path spanning a basin) where sea time: mean,,Northward Ocean Heat Transport Due to Parameterized Eddy Advection,Contributions to heat transport from parameterized eddy-induced advective transport due to any subgrid advective process. Diagnosed here as a function of latitude and basin. Use Celsius for temperature scale.,"For models which do not have a Cartesian lat-long grid, this transport can be approximated as the transport across zig-zag paths corresponding to latitudes with spacing between latitudes appropriate to the model's resolution, as is done for the ocean meridional overturning mass streamfunction. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:longitude: sum (comment: basin sum [along zig-zag grid path]) depth: sum time: mean CMIP7:depth: longitude: sum where sea (along a zig-zag grid path spanning a basin) where sea time: mean,",latitude basin time,hfbasinpadv,real,,YB-na,time-intv,Omon,hfbasinpadv,hfbasinpadv,tavg-u-hyb-sea,hfbasinpadv_tavg-u-hyb-sea,glb,Omon.hfbasinpadv,ocean.hfbasinpadv.tavg-u-hyb-sea.mon.glb,baa5d952-e5dd-11e5-8482-ac72891c3257,high,,
+174,ocean.hfbasinpmadv.tavg-u-hyb-sea.mon.glb,mon,ocean,northward_ocean_heat_transport_due_to_parameterized_mesoscale_eddy_advection,W,depth: longitude: sum where sea (along a zig-zag grid path spanning a basin) where sea time: mean,,Northward Ocean Heat Transport Due to Parameterized Mesoscale Advection,Contributions to heat transport from parameterized mesoscale eddy-induced advective transport. Diagnosed here as a function of latitude and basin. Use Celsius for temperature scale.,"For models which do not have a Cartesian lat-long grid, this transport can be approximated as the transport across zig-zag paths corresponding to latitudes with spacing between latitudes appropriate to the model's resolution, as is done for the ocean meridional overturning mass streamfunction. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:longitude: sum (comment: basin sum [along zig-zag grid path]) depth: sum time: mean CMIP7:depth: longitude: sum where sea (along a zig-zag grid path spanning a basin) where sea time: mean,",latitude basin time,hfbasinpmadv,real,,YB-na,time-intv,Omon,hfbasinpmadv,hfbasinpmadv,tavg-u-hyb-sea,hfbasinpmadv_tavg-u-hyb-sea,glb,Omon.hfbasinpmadv,ocean.hfbasinpmadv.tavg-u-hyb-sea.mon.glb,baa5ccb4-e5dd-11e5-8482-ac72891c3257,high,,
+175,ocean.hfbasinpmdiff.tavg-u-hyb-sea.mon.glb,mon,ocean,northward_ocean_heat_transport_due_to_parameterized_mesoscale_eddy_diffusion,W,depth: longitude: sum where sea (along a zig-zag grid path spanning a basin) where sea time: mean,,Northward Ocean Heat Transport Due to Parameterized Mesoscale Diffusion,"Contributions to heat transport from parameterized mesoscale eddy-induced diffusive transport (i.e., neutral diffusion). Diagnosed here as a function of latitude and basin.","For models which do not have a Cartesian lat-long grid, this transport can be approximated as the transport across zig-zag paths corresponding to latitudes with spacing between latitudes appropriate to the model's resolution, as is done for the ocean meridional overturning mass streamfunction. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:longitude: sum (comment: basin sum [along zig-zag grid path]) depth: sum time: mean CMIP7:depth: longitude: sum where sea (along a zig-zag grid path spanning a basin) where sea time: mean,",latitude basin time,hfbasinpmdiff,real,,YB-na,time-intv,Omon,hfbasinpmdiff,hfbasinpmdiff,tavg-u-hyb-sea,hfbasinpmdiff_tavg-u-hyb-sea,glb,Omon.hfbasinpmdiff,ocean.hfbasinpmdiff.tavg-u-hyb-sea.mon.glb,baa5d0ec-e5dd-11e5-8482-ac72891c3257,high,,
+176,ocean.hfbasinpsmadv.tavg-u-hyb-sea.mon.glb,mon,ocean,northward_ocean_heat_transport_due_to_parameterized_submesoscale_eddy_advection,W,depth: longitude: sum where sea (along a zig-zag grid path spanning a basin) where sea time: mean,,Northward Ocean Heat Transport Due to Parameterized Submesoscale Advection,Contributions to heat transport from parameterized mesoscale eddy-induced advective transport. Diagnosed here as a function of latitude and basin. Use Celsius for temperature scale.,"For models which do not have a Cartesian lat-long grid, this transport can be approximated as the transport across zig-zag paths corresponding to latitudes with spacing between latitudes appropriate to the model's resolution, as is done for the ocean meridional overturning mass streamfunction. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:longitude: sum (comment: basin sum [along zig-zag grid path]) depth: sum time: mean CMIP7:depth: longitude: sum where sea (along a zig-zag grid path spanning a basin) where sea time: mean,",latitude basin time,hfbasinpsmadv,real,,YB-na,time-intv,Omon,hfbasinpsmadv,hfbasinpsmadv,tavg-u-hyb-sea,hfbasinpsmadv_tavg-u-hyb-sea,glb,Omon.hfbasinpsmadv,ocean.hfbasinpsmadv.tavg-u-hyb-sea.mon.glb,baa5d524-e5dd-11e5-8482-ac72891c3257,high,,
+178,ocean.hfevapds.tavg-u-hxy-ifs.mon.glb,mon,ocean,temperature_flux_due_to_evaporation_expressed_as_heat_flux_out_of_sea_water,W m-2,area: time: mean where ice_free_sea over sea,area: areacello,Temperature Flux Due to Evaporation Expressed as Heat Flux out of Sea Water,"This is defined as ""where ice_free_sea over sea""","Report on native horizontal grid. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where ice_free_sea over sea time: mean CMIP7:area: time: mean where ice_free_sea over sea,",longitude latitude time,hfevapds,real,up,XY-na,time-intv,Omon,hfevapds,hfevapds,tavg-u-hxy-ifs,hfevapds_tavg-u-hxy-ifs,glb,Omon.hfevapds,ocean.hfevapds.tavg-u-hxy-ifs.mon.glb,baa67b8c-e5dd-11e5-8482-ac72891c3257,medium,,
+179,ocean.hfgeou.tavg-u-hxy-sea.mon.glb,mon,ocean,upward_geothermal_heat_flux_at_sea_floor,W m-2,area: mean where sea time: mean,area: areacello,Upward Geothermal Heat Flux at Sea Floor,Upward geothermal heat flux per unit area on the sea floor,"Variable value should be reported as the upward flux at bottom of the deepest ocean layer
+If this field is time-invariant, then save it instead as one of your ""fixed"" fields (see the fx table). Report on native horizontal grid.",longitude latitude time,hfgeou,real,up,XY-na,time-intv,Omon,hfgeou,hfgeou,tavg-u-hxy-sea,hfgeou_tavg-u-hxy-sea,glb,Omon.hfgeou,ocean.hfgeou.tavg-u-hxy-sea.mon.glb,baa67344-e5dd-11e5-8482-ac72891c3257,high,,
+181,ocean.hfibthermds.tavg-ol-hxy-sea.mon.glb,mon,ocean,heat_flux_into_sea_water_due_to_iceberg_thermodynamics,W m-2,area: mean where sea time: mean,area: areacello volume: volcello,Heat Flux into Sea Water Due to Iceberg Thermodynamics,Heat Flux into Sea Water Due to Iceberg Thermodynamics,"In general this should be reported as a function of depth, (i.e., it will be a function of the generic ""XYZ"" dimensions). Include enough depth levels to represent the non-zero values of this field everywhere on the globe. Report on native horizontal grid. If a function of depth, perform online remapping to depth or pressure, if not native vertical grid.",longitude latitude olevel time,hfibthermds,real,,XY-O,time-intv,Omon,hfibthermds,hfibthermds,tavg-ol-hxy-sea,hfibthermds_tavg-ol-hxy-sea,glb,Omon.hfibthermds,ocean.hfibthermds.tavg-ol-hxy-sea.mon.glb,baa6a18e-e5dd-11e5-8482-ac72891c3257,medium,,
+182,ocean.hfibthermds.tavg-u-hxy-sea.mon.glb,mon,ocean,heat_flux_into_sea_water_due_to_iceberg_thermodynamics,W m-2,area: mean where sea time: mean,area: areacello,Heat Flux into Sea Water Due to Iceberg Thermodynamics,Heat Flux into Sea Water Due to Iceberg Thermodynamics,"If only the vertically integrated heat flux is available, report as this 2-d field; otherwise hfibthermds should be used.",longitude latitude time,hfibthermds,real,,XY-na,time-intv,Omon,hfibthermds,hfibthermds,tavg-u-hxy-sea,hfibthermds_tavg-u-hxy-sea,glb,Omon.hfibthermds2d,ocean.hfibthermds.tavg-u-hxy-sea.mon.glb,baa6a5bc-e5dd-11e5-8482-ac72891c3257,medium,,
+183,ocean.hfrainds.tavg-u-hxy-ifs.mon.glb,mon,ocean,temperature_flux_due_to_rainfall_expressed_as_heat_flux_into_sea_water,W m-2,area: time: mean where ice_free_sea over sea,area: areacello,Temperature Flux Due to Rainfall Expressed as Heat Flux into Sea Water,"This is defined as ""where ice_free_sea over sea""; i.e., the total flux (considered here) entering the ice-free portion of the grid cell divided by the area of the ocean portion of the grid cell. All such heat fluxes are computed based on Celsius scale.","Report on native horizontal grid. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where ice_free_sea over sea time: mean CMIP7:area: time: mean where ice_free_sea over sea,",longitude latitude time,hfrainds,real,down,XY-na,time-intv,Omon,hfrainds,hfrainds,tavg-u-hxy-ifs,hfrainds_tavg-u-hxy-ifs,glb,Omon.hfrainds,ocean.hfrainds.tavg-u-hxy-ifs.mon.glb,baa67768-e5dd-11e5-8482-ac72891c3257,medium,,
+184,ocean.hfrunoffds.tavg-ol-hxy-sea.mon.glb,mon,ocean,temperature_flux_due_to_runoff_expressed_as_heat_flux_into_sea_water,W m-2,area: mean where sea time: mean,area: areacello volume: volcello,Temperature Flux Due to Runoff Expressed as Heat Flux into Sea Water,Heat flux associated with liquid water which drains from land. It is calculated relative to the heat that would be transported by runoff water entering the sea at zero degrees Celsius.,"In general this should be reported as a function of depth, (i.e., it will be a function of the generic ""XYZ"" dimensions). Include enough depth levels to represent the non-zero values of this field everywhere on the globe. Report on native horizontal grid. If a function of depth, perform online remapping to depth or pressure, if not native vertical grid.",longitude latitude olevel time,hfrunoffds,real,,XY-O,time-intv,Omon,hfrunoffds,hfrunoffds,tavg-ol-hxy-sea,hfrunoffds_tavg-ol-hxy-sea,glb,Omon.hfrunoffds,ocean.hfrunoffds.tavg-ol-hxy-sea.mon.glb,baa68000-e5dd-11e5-8482-ac72891c3257,medium,,
+185,ocean.hfrunoffds.tavg-u-hxy-sea.mon.glb,mon,ocean,temperature_flux_due_to_runoff_expressed_as_heat_flux_into_sea_water,W m-2,area: mean where sea time: mean,area: areacello,Temperature Flux Due to Runoff Expressed as Heat Flux into Sea Water,Heat flux associated with liquid water which drains from land. It is calculated relative to the heat that would be transported by runoff water entering the sea at zero degrees Celsius.,"If only the vertically integrated runoff flux is available, report as this 2-d field; otherwise hfrunoffds should be used.",longitude latitude time,hfrunoffds,real,,XY-na,time-intv,Omon,hfrunoffds,hfrunoffds,tavg-u-hxy-sea,hfrunoffds_tavg-u-hxy-sea,glb,Omon.hfrunoffds2d,ocean.hfrunoffds.tavg-u-hxy-sea.mon.glb,baa6842e-e5dd-11e5-8482-ac72891c3257,medium,,
+186,ocean.hfsnthermds.tavg-ol-hxy-sea.mon.glb,mon,ocean,heat_flux_into_sea_water_due_to_snow_thermodynamics,W m-2,area: mean where sea time: mean,area: areacello volume: volcello,Heat Flux into Sea Water Due to Snow Thermodynamics,"In accordance with common usage in geophysical disciplines, ""flux"" implies per unit area, called ""flux density"" in physics. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. ""Snow thermodynamics"" refers to the addition or subtraction of mass due to surface and basal fluxes, i.e., due to melting, sublimation and fusion.","In general this should be reported as a function of depth, (i.e., it will be a function of the generic ""XYZ"" dimensions). Include enough depth levels to represent the non-zero values of this field everywhere on the globe. Report on native horizontal grid. If a function of depth, perform online remapping to depth or pressure, if not native vertical grid.",longitude latitude olevel time,hfsnthermds,real,,XY-O,time-intv,Omon,hfsnthermds,hfsnthermds,tavg-ol-hxy-sea,hfsnthermds_tavg-ol-hxy-sea,glb,Omon.hfsnthermds,ocean.hfsnthermds.tavg-ol-hxy-sea.mon.glb,baa68852-e5dd-11e5-8482-ac72891c3257,medium,,
+187,ocean.hfsnthermds.tavg-u-hxy-sea.mon.glb,mon,ocean,heat_flux_into_sea_water_due_to_snow_thermodynamics,W m-2,area: mean where sea time: mean,area: areacello,Heat Flux into Sea Water Due to Snow Thermodynamics,"In accordance with common usage in geophysical disciplines, ""flux"" implies per unit area, called ""flux density"" in physics. The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. ""Snow thermodynamics"" refers to the addition or subtraction of mass due to surface and basal fluxes, i.e., due to melting, sublimation and fusion.","If only the vertically integrated heat flux is available, report as this 2-d field; otherwise hfsnthermds should be used.",longitude latitude time,hfsnthermds,real,,XY-na,time-intv,Omon,hfsnthermds,hfsnthermds,tavg-u-hxy-sea,hfsnthermds_tavg-u-hxy-sea,glb,Omon.hfsnthermds2d,ocean.hfsnthermds.tavg-u-hxy-sea.mon.glb,baa68c80-e5dd-11e5-8482-ac72891c3257,medium,,
+189,ocean.hfx.tavg-u-hxy-sea.day.glb,day,ocean,ocean_heat_x_transport,W,area: mean where sea depth: sum where sea (over entire ocean column) time: mean,area: areacello,Vertically Integrated Ocean Heat X Transport,Ocean heat x transport vertically integrated over the whole ocean depth. Contains all contributions to 'x-ward' heat transport from resolved and parameterized processes. Use Celsius for temperature scale. Report on native horizontal grid.,2d vertically integrated field. Report on native horizontal grid.,longitude latitude time,hfx,real,,XY-int,time-intv,Oday,hfx,hfx,tavg-u-hxy-sea,hfx_tavg-u-hxy-sea,glb,Oday.hfxint,ocean.hfx.tavg-u-hxy-sea.day.glb,83bbfb89-7f07-11ef-9308-b1dd71e64bec,high,,
+192,ocean.hfy.tavg-u-hxy-sea.day.glb,day,ocean,ocean_heat_y_transport,W,area: mean where sea depth: sum where sea (over entire ocean column) time: mean,area: areacello,Vertically Integrated Ocean Heat Y Transport,Ocean heat y transport vertically integrated over the whole ocean depth. Contains all contributions to 'y-ward' heat transport from resolved and parameterized processes. Use Celsius for temperature scale. Report on native horizontal grid.,2d vertically integrated field. Report on native horizontal grid.,longitude latitude time,hfy,real,,XY-int,time-intv,Oday,hfy,hfy,tavg-u-hxy-sea,hfy_tavg-u-hxy-sea,glb,Oday.hfyint,ocean.hfy.tavg-u-hxy-sea.day.glb,83bbfb88-7f07-11ef-9308-b1dd71e64bec,high,,
+194,ocean.htovgyre.tavg-u-hyb-sea.mon.glb,mon,ocean,northward_ocean_heat_transport_due_to_gyre,W,depth: longitude: sum where sea (along a zig-zag grid path spanning a basin) time: mean,,Northward Ocean Heat Transport Due to Gyre,"From all advective mass transport processes, resolved and parameterized.","For models which do not have a Cartesian lat-long grid, this transport can be approximated as the transport across zig-zag paths corresponding to latitudes with spacing between latitudes appropriate to the model's resolution, as is done for the ocean meridional overturning mass streamfunction. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:longitude: sum (comment: basin sum [along zig-zag grid path]) depth: sum time: mean CMIP7:depth: longitude: sum where sea (along a zig-zag grid path spanning a basin) time: mean,",latitude basin time,htovgyre,real,,YB-na,time-intv,Omon,htovgyre,htovgyre,tavg-u-hyb-sea,htovgyre_tavg-u-hyb-sea,glb,Omon.htovgyre,ocean.htovgyre.tavg-u-hyb-sea.mon.glb,baa5ef8c-e5dd-11e5-8482-ac72891c3257,high,,
+195,ocean.htovovrt.tavg-u-hyb-sea.mon.glb,mon,ocean,northward_ocean_heat_transport_due_to_overturning,W,depth: longitude: sum where sea (along a zig-zag grid path spanning a basin) time: mean,,Northward Ocean Heat Transport Due to Overturning,"From all advective mass transport processes, resolved and parameterized.","For models which do not have a Cartesian lat-long grid, this transport can be approximated as the transport across zig-zag paths corresponding to latitudes with spacing between latitudes appropriate to the model's resolution, as is done for the ocean meridional overturning mass streamfunction. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:longitude: sum (comment: basin sum [along zig-zag grid path]) depth: sum time: mean CMIP7:depth: longitude: sum where sea (along a zig-zag grid path spanning a basin) time: mean,",latitude basin time,htovovrt,real,,YB-na,time-intv,Omon,htovovrt,htovovrt,tavg-u-hyb-sea,htovovrt_tavg-u-hyb-sea,glb,Omon.htovovrt,ocean.htovovrt.tavg-u-hyb-sea.mon.glb,baa5f3ba-e5dd-11e5-8482-ac72891c3257,high,,
+196,ocean.masscello.tavg-ol-hxy-sea.dec.glb,dec,ocean,sea_water_mass_per_unit_area,kg m-2,area: mean where sea time: mean,area: areacello volume: volcello,Ocean Grid-Cell Mass per Area,"For Boussinesq models, report this diagnostic as Boussinesq reference density times grid celll volume.","Report on native horizontal grid as well as on a spherical latitude/longitude grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native. Do not use this field if masscello is fixed: use Ofx.masscello instead. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: sum where sea time: mean CMIP7:area: mean where sea time: mean,",longitude latitude olevel time,masscello,real,,XY-O,time-intv,Odec,masscello,masscello,tavg-ol-hxy-sea,masscello_tavg-ol-hxy-sea,glb,Odec.masscello,ocean.masscello.tavg-ol-hxy-sea.dec.glb,8872d1a8-1027-11e8-9d87-1c4d70487308,high,,
+199,ocean.masso.tavg-u-hm-sea.dec.glb,dec,ocean,sea_water_mass,kg,area: sum where sea time: mean,,Sea Water Mass,"Total mass of liquid sea water. For Boussinesq models, report this diagnostic as Boussinesq reference density times total volume.",,time,masso,real,,na-na,time-intv,Odec,masso,masso,tavg-u-hm-sea,masso_tavg-u-hm-sea,glb,Odec.masso,ocean.masso.tavg-u-hm-sea.dec.glb,4794f818-bb0b-11e6-8316-5980f7b176d1,high,,
+200,ocean.masso.tavg-u-hm-sea.mon.glb,mon,ocean,sea_water_mass,kg,area: sum where sea time: mean,,Sea Water Mass,"Total mass of liquid sea water. For Boussinesq models, report this diagnostic as Boussinesq reference density times total volume.",,time,masso,real,,na-na,time-intv,Omon,masso,masso,tavg-u-hm-sea,masso_tavg-u-hm-sea,glb,Omon.masso,ocean.masso.tavg-u-hm-sea.mon.glb,baa4f730-e5dd-11e5-8482-ac72891c3257,high,,
+201,ocean.mfo.tavg-u-ht-sea.mon.glb,mon,ocean,sea_water_transport_across_line,kg s-1,depth: sum where sea time: mean,,Sea Water Transport,"Transport across_line means that which crosses a particular line on the Earth's surface (based on appendix J and table J1 of Griffies et al, 2016 (). Formally this means the integral along the line of the normal component of the transport. The transport should be evaluated for the full depth of the ocean, except for the Pacific Equatorial Undercurrent, which is averaged from the surface to 350m.","Full depth mean, apart from Pacific Equatorial Undercurrent, which is only top 350m. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean CMIP7:depth: sum where sea time: mean,",oline time,mfo,real,,TR-na,time-intv,Omon,mfo,mfo,tavg-u-ht-sea,mfo_tavg-u-ht-sea,glb,Omon.mfo,ocean.mfo.tavg-u-ht-sea.mon.glb,baa60bf2-e5dd-11e5-8482-ac72891c3257,medium,,
+202,ocean.mlotst.tavg-u-hxy-sea.day.glb,day,ocean,ocean_mixed_layer_thickness_defined_by_sigma_t,m,area: mean where sea time: mean,area: areacello,Ocean Mixed Layer Thickness Defined by Delta Sigma T of 0.03 kg m-3 referenced to the model level closest to 10 m depth,Sigma T is potential density referenced to ocean surface. Defined by Sigma T of 0.03 kg m-3 wrt to model level closest to 10 m depth.,"dsigmat coordinate added to clarify definition. CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude time CMIP7:longitude latitude time deltasigt,",longitude latitude time deltasigt,mlotst,real,,XY-na,time-intv,Eday,mlotst,mlotst,tavg-u-hxy-sea,mlotst_tavg-u-hxy-sea,glb,Eday.mlotst,ocean.mlotst.tavg-u-hxy-sea.day.glb,8168b848-f906-11e6-a176-5404a60d96b5,high,,
+204,ocean.mlotst.tmax-u-hxy-sea.mon.glb,mon,ocean,ocean_mixed_layer_thickness_defined_by_sigma_t,m,area: mean where sea time: maximum,area: areacello,Maximum Ocean Mixed Layer Thickness Defined by Delta Sigma T of 0.03 kg m-3 referenced to the model level closest to 10 m depth,Sigma T is potential density referenced to ocean surface. Defined by Sigma T of 0.03 kg m-3 wrt to model level closest to 10 m depth.,"dsigmat coordinate added to clarify definition.Report on native horizontal grid as well as on a spherical latitude/longitude grid. CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude time CMIP7:longitude latitude time deltasigt, CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean time: maximum CMIP7:area: mean where sea time: maximum,",longitude latitude time deltasigt,mlotst,real,,XY-na,time-intv,Omon,mlotstmax,mlotst,tmax-u-hxy-sea,mlotst_tmax-u-hxy-sea,glb,Omon.mlotstmax,ocean.mlotst.tmax-u-hxy-sea.mon.glb,1aab3e76-b006-11e6-9289-ac72891c3257,high,,
+205,ocean.mlotst.tmin-u-hxy-sea.mon.glb,mon,ocean,ocean_mixed_layer_thickness_defined_by_sigma_t,m,area: mean where sea time: minimum,area: areacello,Minimum Ocean Mixed Layer Thickness Defined by Delta Sigma T of 0.03 kg m-3 referenced to the model level closest to 10 m depth,Sigma T is potential density referenced to ocean surface. Defined by Sigma T of 0.03 kg m-3 wrt to model level closest to 10 m depth.,"dsigmat coordinate added to clarify definition. CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude time CMIP7:longitude latitude time deltasigt, CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean time: minimum CMIP7:area: mean where sea time: minimum,",longitude latitude time deltasigt,mlotst,real,,XY-na,time-intv,Omon,mlotstmin,mlotst,tmin-u-hxy-sea,mlotst_tmin-u-hxy-sea,glb,Omon.mlotstmin,ocean.mlotst.tmin-u-hxy-sea.mon.glb,1aab4e7a-b006-11e6-9289-ac72891c3257,high,,
+206,ocean.mlotstsq.tavg-u-hxy-sea.mon.glb,mon,ocean,square_of_ocean_mixed_layer_thickness_defined_by_sigma_t,m2,area: mean where sea time: mean,area: areacello,Square of Ocean Mixed Layer Thickness Defined by Delta Sigma T of 0.03 kg m-3 referenced to the model level closest to 10 m depth,"Sigma T is potential density referenced to ocean surface. The phrase ""square_of_X"" means X\*X. The ocean mixed layer is the upper part of the ocean, regarded as being well-mixed. The base of the mixed layer defined by ""temperature"", ""sigma"", ""sigma_theta"", ""sigma_t"" or vertical diffusivity is the level at which the quantity indicated differs from its surface value by a certain amount. A coordinate variable or scalar coordinate variable with standard name sea_water_sigma_t_difference can be used to specify the sigma_t criterion that determines the layer thickness. Sigma-t of sea water is the density of water at atmospheric pressure (i.e. the surface) having the same temperature and salinity, minus 1000 kg m-3. ""Thickness"" means the vertical extent of a layer.","dsigmat coordinate added to clarify definition. CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude time CMIP7:longitude latitude time deltasigt,",longitude latitude time deltasigt,mlotstsq,real,,XY-na,time-intv,Omon,mlotstsq,mlotstsq,tavg-u-hxy-sea,mlotstsq_tavg-u-hxy-sea,glb,Omon.mlotstsq,ocean.mlotstsq.tavg-u-hxy-sea.mon.glb,baa57ac0-e5dd-11e5-8482-ac72891c3257,low,,
+207,ocean.msftbarot.tavg-u-hxy-sea.mon.glb,mon,ocean,ocean_barotropic_mass_streamfunction,kg s-1,area: mean where sea time: mean,area: areacello,Ocean Barotropic Mass Streamfunction,Streamfunction or its approximation for free surface models. See OMDP document for details.,Report on native horizontal grid as well as on a spherical latitude/longitude grid.,longitude latitude time,msftbarot,real,,XY-na,time-intv,Omon,msftbarot,msftbarot,tavg-u-hxy-sea,msftbarot_tavg-u-hxy-sea,glb,Omon.msftbarot,ocean.msftbarot.tavg-u-hxy-sea.mon.glb,baa57250-e5dd-11e5-8482-ac72891c3257,high,,
+209,ocean.msftm.tavg-rho-hyb-sea.mon.glb,mon,ocean,ocean_meridional_overturning_mass_streamfunction,kg s-1,depth: longitude: sum where sea (along a zig-zag grid path spanning a basin) time: mean,,Ocean Meridional Overturning Mass Streamfunction,"Overturning mass streamfunction arising from all advective mass transport processes, resolved and parameterized.","Function of latitude, rho, basin. For a model with a cartesian latxlon grid, this is the same as the ""Ocean Y Overturning Mass Streamfunction"" (msftyrho), which should in this case be omitted. For other models, this transport should be approximated as the transport across zig-zag paths corresponding to latitudes with spacing between latitudes appropriate to the model's resolution. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:longitude: sum (comment: basin sum [along zig-zag grid path]) depth: sum time: mean CMIP7:depth: longitude: sum where sea (along a zig-zag grid path spanning a basin) time: mean,",latitude rho basin time,msftm,real,,YB-R,time-intv,Omon,msftmrho,msftm,tavg-rho-hyb-sea,msftm_tavg-rho-hyb-sea,glb,Omon.msftmrho,ocean.msftm.tavg-rho-hyb-sea.mon.glb,baa5a1da-e5dd-11e5-8482-ac72891c3257,high,,
+210,ocean.msftmmpa.tavg-ol-hyb-sea.mon.glb,mon,ocean,ocean_meridional_overturning_mass_streamfunction_due_to_parameterized_mesoscale_eddy_advection,kg s-1,depth: longitude: sum where sea (along a zig-zag grid path spanning a basin) time: mean,,Ocean Meridional Overturning Mass Streamfunction Due to Parameterized Mesoscale Advection,"CMIP5 called this ""due to Bolus Advection"". Name change respects the more general physics of the mesoscale parameterizations.","Function of latitude, Z, basin. For a model with a cartesian latxlon grid, this is the same as the ""Ocean Y Overturning Mass Streamfunction"" (msftyzmpa), which should in this case be omitted. For other models, this transport should be approximated as the transport across zig-zag paths corresponding to latitudes with spacing between latitudes appropriate to the model's resolution. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:longitude: sum (comment: basin sum [along zig-zag grid path]) depth: sum time: mean CMIP7:depth: longitude: sum where sea (along a zig-zag grid path spanning a basin) time: mean,",latitude olevel basin time,msftmmpa,real,,YB-O,time-intv,Omon,msftmzmpa,msftmmpa,tavg-ol-hyb-sea,msftmmpa_tavg-ol-hyb-sea,glb,Omon.msftmzmpa,ocean.msftmmpa.tavg-ol-hyb-sea.mon.glb,baa5af36-e5dd-11e5-8482-ac72891c3257,medium,,
+211,ocean.msftmmpa.tavg-rho-hyb-sea.mon.glb,mon,ocean,ocean_meridional_overturning_mass_streamfunction_due_to_parameterized_mesoscale_eddy_advection,kg s-1,depth: longitude: sum where sea (along a zig-zag grid path spanning a basin) time: mean,,Ocean Meridional Overturning Mass Streamfunction Due to Parameterized Mesoscale Advection,"CMIP5 called this ""due to Bolus Advection"". Name change respects the more general physics of the mesoscale parameterizations.","Function of latitude, rho, basin. For a model with a cartesian latxlon grid, this is the same as the ""Ocean Y Overturning Mass Streamfunction"" (msftyrhompa), which should in this case be omitted. For other models, this transport should be approximated as the transport across zig-zag paths corresponding to latitudes with spacing between latitudes appropriate to the model's resolution. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:longitude: sum (comment: basin sum [along zig-zag grid path]) depth: sum time: mean CMIP7:depth: longitude: sum where sea (along a zig-zag grid path spanning a basin) time: mean,",latitude rho basin time,msftmmpa,real,,YB-R,time-intv,Omon,msftmrhompa,msftmmpa,tavg-rho-hyb-sea,msftmmpa_tavg-rho-hyb-sea,glb,Omon.msftmrhompa,ocean.msftmmpa.tavg-rho-hyb-sea.mon.glb,baa5b364-e5dd-11e5-8482-ac72891c3257,low,,
+212,ocean.msftmsmpa.tavg-ol-hyb-sea.mon.glb,mon,ocean,ocean_meridional_overturning_mass_streamfunction_due_to_parameterized_submesoscale_eddy_advection,kg s-1,depth: longitude: sum where sea (along a zig-zag grid path spanning a basin) time: mean,,Ocean Meridional Overturning Mass Streamfunction Due to Parameterized Submesoscale Advection,Report only if there is a submesoscale eddy parameterization.,"Function of latitude, Z, basin. For a model with a cartesian latxlon grid, this is the same as the ""Ocean Y Overturning Mass Streamfunction"" (msftyzsmpa), which should in this case be omitted. For other models, this transport should be approximated as the transport across zig-zag paths corresponding to latitudes with spacing between latitudes appropriate to the model's resolution. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:longitude: sum (comment: basin sum [along zig-zag grid path]) depth: sum time: mean CMIP7:depth: longitude: sum where sea (along a zig-zag grid path spanning a basin) time: mean,",latitude olevel basin time,msftmsmpa,real,,YB-O,time-intv,Omon,msftmzsmpa,msftmsmpa,tavg-ol-hyb-sea,msftmsmpa_tavg-ol-hyb-sea,glb,Omon.msftmzsmpa,ocean.msftmsmpa.tavg-ol-hyb-sea.mon.glb,baa5c020-e5dd-11e5-8482-ac72891c3257,low,,
+214,ocean.msfty.tavg-rho-ht-sea.mon.glb,mon,ocean,ocean_y_overturning_mass_streamfunction,kg s-1,grid_longitude: sum where sea time: mean,,Ocean Y Overturning Mass Streamfunction,"Overturning mass streamfunction arising from all advective mass transport processes, resolved and parameterized.","Function of Y, rho, basin. For a model with a cartesian latxlon grid, this is the same as the ""Ocean Meridional Overturning Mass Streamfunction"" (msftmrho) and so the y-overturning variable should in this case be omitted. For a model where these are distinct, this variable should contain a grid-oriented quasi-meridional overturning, in contrast with msftmrho, which is the actual \*meridional\* overturning (with north-south flow about an east-west axis).
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean grid_longitude: mean CMIP7:grid_longitude: sum where sea time: mean,",gridlatitude rho basin time,msfty,real,,GYB-R,time-intv,Omon,msftyrho,msfty,tavg-rho-ht-sea,msfty_tavg-rho-ht-sea,glb,Omon.msftyrho,ocean.msfty.tavg-rho-ht-sea.mon.glb,baa5aafe-e5dd-11e5-8482-ac72891c3257,high,,
+215,ocean.msftypa.tavg-ol-ht-sea.mon.glb,mon,ocean,ocean_y_overturning_mass_streamfunction_due_to_parameterized_mesoscale_eddy_advection,kg s-1,grid_longitude: sum where sea time: mean,,Ocean Y Overturning Mass Streamfunction Due to Parameterized Mesoscale Advection,"CMIP5 called this ""due to Bolus Advection"". Name change respects the more general physics of the mesoscale parameterizations.","Function of Y, rho, basin. For a model with a cartesian latxlon grid, this is the same as the ""Ocean Meridional Overturning Mass Streamfunction"" (msftmrho) and so the y-overturning variable should in this case be omitted. For a model where these are distinct, this variable should contain a grid-oriented quasi-meridional overturning, in contrast with msftmrho, which is the actual \*meridional\* overturning (with north-south flow about an east-west axis).
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean grid_longitude: mean CMIP7:grid_longitude: sum where sea time: mean,",gridlatitude olevel basin time,msftypa,real,,GYB-O,time-intv,Omon,msftyzmpa,msftypa,tavg-ol-ht-sea,msftypa_tavg-ol-ht-sea,glb,Omon.msftyzmpa,ocean.msftypa.tavg-ol-ht-sea.mon.glb,baa5b79c-e5dd-11e5-8482-ac72891c3257,low,,
+216,ocean.msftypa.tavg-rho-ht-sea.mon.glb,mon,ocean,ocean_y_overturning_mass_streamfunction_due_to_parameterized_mesoscale_eddy_advection,kg s-1,grid_longitude: sum where sea time: mean,,Ocean Y Overturning Mass Streamfunction Due to Parameterized Mesoscale Advection,"CMIP5 called this ""due to Bolus Advection"". Name change respects the more general physics of the mesoscale parameterizations.","Function of Y, rho, basin. For a model with a cartesian latxlon grid, this is the same as the ""Ocean Meridional Overturning Mass Streamfunction"" (msftmrho) and so the y-overturning variable should in this case be omitted. For a model where these are distinct, this variable should contain a grid-oriented quasi-meridional overturning, in contrast with msftmrho, which is the actual \*meridional\* overturning (with north-south flow about an east-west axis).
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:time: mean grid_longitude: mean CMIP7:grid_longitude: sum where sea time: mean,",gridlatitude rho basin time,msftypa,real,,GYB-R,time-intv,Omon,msftyrhompa,msftypa,tavg-rho-ht-sea,msftypa_tavg-rho-ht-sea,glb,Omon.msftyrhompa,ocean.msftypa.tavg-rho-ht-sea.mon.glb,baa5bbe8-e5dd-11e5-8482-ac72891c3257,low,,
+217,ocean.obvfsq.tavg-ol-hxy-sea.mon.glb,mon,ocean,square_of_brunt_vaisala_frequency_in_sea_water,s-2,area: mean where sea time: mean,area: areacello volume: volcello,Square of Brunt Vaisala Frequency in Sea Water,"The phrase ""square_of_X"" means X\*X. Frequency is the number of oscillations of a wave per unit time. Brunt-Vaisala frequency is also sometimes called ""buoyancy frequency"" and is a measure of the vertical stratification of the medium.",Report on native horizontal grid as well as on a spherical latitude/longitude grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,obvfsq,real,,XY-O,time-intv,Omon,obvfsq,obvfsq,tavg-ol-hxy-sea,obvfsq_tavg-ol-hxy-sea,glb,Omon.obvfsq,ocean.obvfsq.tavg-ol-hxy-sea.mon.glb,1aab5d20-b006-11e6-9289-ac72891c3257,high,,
+218,ocean.ocontempdiff.tavg-ol-hxy-sea.yr.glb,yr,ocean,tendency_of_sea_water_conservative_temperature_expressed_as_heat_content_due_to_parameterized_dianeutral_mixing,W m-2,area: mean where sea time: mean,area: areacello volume: volcello,Tendency of Sea Water Conservative Temperature Expressed as Heat Content Due to Parameterized Dianeutral Mixing,Tendency of heat content for a grid cell from parameterized dianeutral mixing. Reported only for models that use conservative temperature as prognostic field.,Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,ocontempdiff,real,,XY-O,time-intv,Oyr,ocontempdiff,ocontempdiff,tavg-ol-hxy-sea,ocontempdiff_tavg-ol-hxy-sea,glb,Oyr.ocontempdiff,ocean.ocontempdiff.tavg-ol-hxy-sea.yr.glb,baa46770-e5dd-11e5-8482-ac72891c3257,low,,
+219,ocean.ocontempmint.tavg-u-hxy-sea.yr.glb,yr,ocean,integral_wrt_depth_of_product_of_conservative_temperature_and_sea_water_density,degC kg m-2,area: mean where sea time: mean,area: areacello,Depth Integral of Product of Sea Water Density and Conservative Temperature,"Full column sum of density\*cell thickness\*conservative temperature. If the model is Boussinesq, then use Boussinesq reference density for the density factor.",,longitude latitude time,ocontempmint,real,,XY-int,time-intv,Oyr,ocontempmint,ocontempmint,tavg-u-hxy-sea,ocontempmint_tavg-u-hxy-sea,glb,Oyr.ocontempmint,ocean.ocontempmint.tavg-u-hxy-sea.yr.glb,1aaf3ea4-b006-11e6-9289-ac72891c3257,low,,
+220,ocean.ocontemppadvect.tavg-ol-hxy-sea.yr.glb,yr,ocean,tendency_of_sea_water_conservative_temperature_expressed_as_heat_content_due_to_parameterized_eddy_advection,W m-2,area: mean where sea time: mean,area: areacello volume: volcello,Tendency of Sea Water Conservative Temperature Expressed as Heat Content Due to Parameterized Eddy Advection,Tendency of heat content for a grid cell from parameterized eddy advection (all forms of eddy advection). Reported only for models that use conservative temperature as prognostic field.,Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,ocontemppadvect,real,,XY-O,time-intv,Oyr,ocontemppadvect,ocontemppadvect,tavg-ol-hxy-sea,ocontemppadvect_tavg-ol-hxy-sea,glb,Oyr.ocontemppadvect,ocean.ocontemppadvect.tavg-ol-hxy-sea.yr.glb,baa4569a-e5dd-11e5-8482-ac72891c3257,low,,
+221,ocean.ocontemppmdiff.tavg-ol-hxy-sea.yr.glb,yr,ocean,tendency_of_sea_water_conservative_temperature_expressed_as_heat_content_due_to_parameterized_mesoscale_eddy_diffusion,W m-2,area: mean where sea time: mean,area: areacello volume: volcello,Tendency of Sea Water Conservative Temperature Expressed as Heat Content Due to Parameterized Mesoscale Diffusion,Tendency of heat content for a grid cell from parameterized mesoscale eddy diffusion. Reported only for models that use conservative temperature as prognostic field.,Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,ocontemppmdiff,real,,XY-O,time-intv,Oyr,ocontemppmdiff,ocontemppmdiff,tavg-ol-hxy-sea,ocontemppmdiff_tavg-ol-hxy-sea,glb,Oyr.ocontemppmdiff,ocean.ocontemppmdiff.tavg-ol-hxy-sea.yr.glb,baa45f14-e5dd-11e5-8482-ac72891c3257,low,,
+222,ocean.ocontemppsmadvect.tavg-ol-hxy-sea.yr.glb,yr,ocean,tendency_of_sea_water_conservative_temperature_expressed_as_heat_content_due_to_parameterized_submesoscale_eddy_advection,W m-2,area: mean where sea time: mean,area: areacello volume: volcello,Tendency of Sea Water Conservative Temperature Expressed as Heat Content Due to Parameterized Submesoscale Advection,Tendency of heat content for a grid cell from parameterized submesoscale eddy advection. Reported only for models that use conservative temperature as prognostic field.,Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,ocontemppsmadvect,real,,XY-O,time-intv,Oyr,ocontemppsmadvect,ocontemppsmadvect,tavg-ol-hxy-sea,ocontemppsmadvect_tavg-ol-hxy-sea,glb,Oyr.ocontemppsmadvect,ocean.ocontemppsmadvect.tavg-ol-hxy-sea.yr.glb,baa46342-e5dd-11e5-8482-ac72891c3257,low,,
+223,ocean.ocontemprmadvect.tavg-ol-hxy-sea.yr.glb,yr,ocean,tendency_of_sea_water_conservative_temperature_expressed_as_heat_content_due_to_residual_mean_advection,W m-2,area: mean where sea time: mean,area: areacello volume: volcello,Tendency of Sea Water Conservative Temperature Expressed as Heat Content Due to Residual Mean Advection,Tendency of heat content for a grid cell from residual mean (sum of Eulerian mean + parameterized eddy-induced) advection. Reported only for models that use conservative temperature as prognostic field.,Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,ocontemprmadvect,real,,XY-O,time-intv,Oyr,ocontemprmadvect,ocontemprmadvect,tavg-ol-hxy-sea,ocontemprmadvect_tavg-ol-hxy-sea,glb,Oyr.ocontemprmadvect,ocean.ocontemprmadvect.tavg-ol-hxy-sea.yr.glb,1aafb96a-b006-11e6-9289-ac72891c3257,low,,
+224,ocean.ocontemptend.tavg-ol-hxy-sea.yr.glb,yr,ocean,tendency_of_sea_water_conservative_temperature_expressed_as_heat_content,W m-2,area: mean where sea time: mean,area: areacello volume: volcello,Tendency of Sea Water Conservative Temperature Expressed as Heat Content,Tendency of heat content for a grid cell from all processes. Reported only for models that use conservative temperature as prognostic field.,Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,ocontemptend,real,,XY-O,time-intv,Oyr,ocontemptend,ocontemptend,tavg-ol-hxy-sea,ocontemptend_tavg-ol-hxy-sea,glb,Oyr.ocontemptend,ocean.ocontemptend.tavg-ol-hxy-sea.yr.glb,baa44e34-e5dd-11e5-8482-ac72891c3257,low,,
+225,ocean.opottempdiff.tavg-ol-hxy-sea.yr.glb,yr,ocean,tendency_of_sea_water_potential_temperature_expressed_as_heat_content_due_to_parameterized_dianeutral_mixing,W m-2,area: mean where sea time: mean,area: areacello volume: volcello,Tendency of Sea Water Potential Temperature Expressed as Heat Content Due to Parameterized Dianeutral Mixing,Tendency of heat content for a grid cell from parameterized dianeutral mixing. Reported only for models that use potential temperature as prognostic field.,Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,opottempdiff,real,,XY-O,time-intv,Oyr,opottempdiff,opottempdiff,tavg-ol-hxy-sea,opottempdiff_tavg-ol-hxy-sea,glb,Oyr.opottempdiff,ocean.opottempdiff.tavg-ol-hxy-sea.yr.glb,baa4461e-e5dd-11e5-8482-ac72891c3257,low,,
+226,ocean.opottempmint.tavg-u-hxy-sea.yr.glb,yr,ocean,integral_wrt_depth_of_product_of_potential_temperature_and_sea_water_density,degC kg m-2,area: mean where sea time: mean,area: areacello,Integral with Respect to Depth of Product of Sea Water Density and Potential Temperature,"Full column sum of density\*cell thickness\*potential temperature. If the model is Boussinesq, then use Boussinesq reference density for the density factor.",Report on native horizontal grid,longitude latitude time,opottempmint,real,,XY-int,time-intv,Oyr,opottempmint,opottempmint,tavg-u-hxy-sea,opottempmint_tavg-u-hxy-sea,glb,Oyr.opottempmint,ocean.opottempmint.tavg-u-hxy-sea.yr.glb,1aaf2e6e-b006-11e6-9289-ac72891c3257,low,,
+227,ocean.opottemppadvect.tavg-ol-hxy-sea.yr.glb,yr,ocean,tendency_of_sea_water_potential_temperature_expressed_as_heat_content_due_to_parameterized_eddy_advection,W m-2,area: mean where sea time: mean,area: areacello volume: volcello,Tendency of Sea Water Potential Temperature Expressed as Heat Content Due to Parameterized Eddy Advection,Tendency of heat content for a grid cell from parameterized eddy advection (all forms of eddy advection). Reported only for models that use potential temperature as prognostic field.,Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,opottemppadvect,real,,XY-O,time-intv,Oyr,opottemppadvect,opottemppadvect,tavg-ol-hxy-sea,opottemppadvect_tavg-ol-hxy-sea,glb,Oyr.opottemppadvect,ocean.opottemppadvect.tavg-ol-hxy-sea.yr.glb,baa4353e-e5dd-11e5-8482-ac72891c3257,low,,
+228,ocean.opottemppmdiff.tavg-ol-hxy-sea.yr.glb,yr,ocean,tendency_of_sea_water_potential_temperature_expressed_as_heat_content_due_to_parameterized_mesoscale_eddy_diffusion,W m-2,area: mean where sea time: mean,area: areacello volume: volcello,Tendency of Sea Water Potential Temperature Expressed as Heat Content Due to Parameterized Mesoscale Diffusion,Tendency of heat content for a grid cell from parameterized mesoscale eddy diffusion. Reported only for models that use potential temperature as prognostic field.,Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,opottemppmdiff,real,,XY-O,time-intv,Oyr,opottemppmdiff,opottemppmdiff,tavg-ol-hxy-sea,opottemppmdiff_tavg-ol-hxy-sea,glb,Oyr.opottemppmdiff,ocean.opottemppmdiff.tavg-ol-hxy-sea.yr.glb,baa43db8-e5dd-11e5-8482-ac72891c3257,low,,
+229,ocean.opottemppsmadvect.tavg-ol-hxy-sea.yr.glb,yr,ocean,tendency_of_sea_water_potential_temperature_expressed_as_heat_content_due_to_parameterized_submesoscale_eddy_advection,W m-2,area: mean where sea time: mean,area: areacello volume: volcello,Tendency of Sea Water Potential Temperature Expressed as Heat Content Due to Parameterized Submesoscale Advection,Tendency of heat content for a grid cell from parameterized submesoscale eddy advection. Reported only for models that use potential temperature as prognostic field.,Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,opottemppsmadvect,real,,XY-O,time-intv,Oyr,opottemppsmadvect,opottemppsmadvect,tavg-ol-hxy-sea,opottemppsmadvect_tavg-ol-hxy-sea,glb,Oyr.opottemppsmadvect,ocean.opottemppsmadvect.tavg-ol-hxy-sea.yr.glb,baa441f0-e5dd-11e5-8482-ac72891c3257,low,,
+230,ocean.opottemprmadvect.tavg-ol-hxy-sea.yr.glb,yr,ocean,tendency_of_sea_water_potential_temperature_expressed_as_heat_content_due_to_residual_mean_advection,W m-2,area: mean where sea time: mean,area: areacello volume: volcello,Tendency of Sea Water Potential Temperature Expressed as Heat Content Due to Residual Mean Advection,Tendency of heat content for a grid cell from residual mean (sum of Eulerian mean + parameterized eddy-induced) advection. Reported only for models that use potential temperature as prognostic field.,Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,opottemprmadvect,real,,XY-O,time-intv,Oyr,opottemprmadvect,opottemprmadvect,tavg-ol-hxy-sea,opottemprmadvect_tavg-ol-hxy-sea,glb,Oyr.opottemprmadvect,ocean.opottemprmadvect.tavg-ol-hxy-sea.yr.glb,1aaf7360-b006-11e6-9289-ac72891c3257,low,,
+231,ocean.opottemptend.tavg-ol-hxy-sea.dec.glb,dec,ocean,tendency_of_sea_water_potential_temperature_expressed_as_heat_content,W m-2,area: mean where sea time: mean,area: areacello volume: volcello,Tendency of Sea Water Potential Temperature Expressed as Heat Content,Tendency of heat content for a grid cell from all processes. Reported only for models that use potential temperature as prognostic field.,Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,opottemptend,real,,XY-O,time-intv,Odec,opottemptend,opottemptend,tavg-ol-hxy-sea,opottemptend_tavg-ol-hxy-sea,glb,Odec.opottemptend,ocean.opottemptend.tavg-ol-hxy-sea.dec.glb,80ab740c-a698-11ef-914a-613c0433d878,low,,
+232,ocean.opottemptend.tavg-ol-hxy-sea.yr.glb,yr,ocean,tendency_of_sea_water_potential_temperature_expressed_as_heat_content,W m-2,area: mean where sea time: mean,area: areacello volume: volcello,Tendency of Sea Water Potential Temperature Expressed as Heat Content,Tendency of heat content for a grid cell from all processes. Reported only for models that use potential temperature as prognostic field.,Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,opottemptend,real,,XY-O,time-intv,Oyr,opottemptend,opottemptend,tavg-ol-hxy-sea,opottemptend_tavg-ol-hxy-sea,glb,Oyr.opottemptend,ocean.opottemptend.tavg-ol-hxy-sea.yr.glb,baa42c60-e5dd-11e5-8482-ac72891c3257,high,,
+233,ocean.osaltdiff.tavg-ol-hxy-sea.yr.glb,yr,ocean,tendency_of_sea_water_salinity_expressed_as_salt_content_due_to_parameterized_dianeutral_mixing,kg m-2 s-1,area: mean where sea time: mean,area: areacello volume: volcello,Tendency of Sea Water Salinity Expressed as Salt Content Due to Parameterized Dianeutral Mixing,Tendency of salt content for a grid cell from parameterized dianeutral mixing.,Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,osaltdiff,real,,XY-O,time-intv,Oyr,osaltdiff,osaltdiff,tavg-ol-hxy-sea,osaltdiff_tavg-ol-hxy-sea,glb,Oyr.osaltdiff,ocean.osaltdiff.tavg-ol-hxy-sea.yr.glb,baa48caa-e5dd-11e5-8482-ac72891c3257,low,,
+234,ocean.osaltpadvect.tavg-ol-hxy-sea.yr.glb,yr,ocean,tendency_of_sea_water_salinity_expressed_as_salt_content_due_to_parameterized_eddy_advection,kg m-2 s-1,area: mean where sea time: mean,area: areacello volume: volcello,Tendency of Sea Water Salinity Expressed as Salt Content Due to Parameterized Eddy Advection,Tendency of salt content for a grid cell from parameterized eddy advection (any form of eddy advection).,Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,osaltpadvect,real,,XY-O,time-intv,Oyr,osaltpadvect,osaltpadvect,tavg-ol-hxy-sea,osaltpadvect_tavg-ol-hxy-sea,glb,Oyr.osaltpadvect,ocean.osaltpadvect.tavg-ol-hxy-sea.yr.glb,baa47bfc-e5dd-11e5-8482-ac72891c3257,low,,
+235,ocean.osaltpmdiff.tavg-ol-hxy-sea.yr.glb,yr,ocean,tendency_of_sea_water_salinity_expressed_as_salt_content_due_to_parameterized_mesoscale_eddy_diffusion,kg m-2 s-1,area: mean where sea time: mean,area: areacello volume: volcello,Tendency of Sea Water Salinity Expressed as Salt Content Due to Parameterized Mesoscale Diffusion,Tendency of salt content for a grid cell from parameterized mesoscale eddy diffusion.,Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,osaltpmdiff,real,,XY-O,time-intv,Oyr,osaltpmdiff,osaltpmdiff,tavg-ol-hxy-sea,osaltpmdiff_tavg-ol-hxy-sea,glb,Oyr.osaltpmdiff,ocean.osaltpmdiff.tavg-ol-hxy-sea.yr.glb,baa4844e-e5dd-11e5-8482-ac72891c3257,low,,
+236,ocean.osaltpsmadvect.tavg-ol-hxy-sea.mon.glb,mon,ocean,tendency_of_sea_water_salinity_expressed_as_salt_content_due_to_parameterized_submesoscale_eddy_advection,kg m-2 s-1,area: mean where sea time: mean,area: areacello volume: volcello,Tendency of Sea Water Salinity Expressed as Salt Content Due to Parameterized Submesoscale Advection,Tendency of salt content for a grid cell from parameterized submesoscale eddy advection.,,longitude latitude olevel time,osaltpsmadvect,real,,XY-O,time-intv,Emon,osaltpsmadvect,osaltpsmadvect,tavg-ol-hxy-sea,osaltpsmadvect_tavg-ol-hxy-sea,glb,Emon.osaltpsmadvect,ocean.osaltpsmadvect.tavg-ol-hxy-sea.mon.glb,8b9e32d4-4a5b-11e6-9cd2-ac72891c3257,low,,
+237,ocean.osaltpsmadvect.tavg-ol-hxy-sea.yr.glb,yr,ocean,tendency_of_sea_water_salinity_expressed_as_salt_content_due_to_parameterized_submesoscale_eddy_advection,kg m-2 s-1,area: mean where sea time: mean,area: areacello volume: volcello,Tendency of Sea Water Salinity Expressed as Salt Content Due to Parameterized Submesoscale Advection,Tendency of salt content for a grid cell from parameterized submesoscale eddy advection.,Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,osaltpsmadvect,real,,XY-O,time-intv,Oyr,osaltpsmadvect,osaltpsmadvect,tavg-ol-hxy-sea,osaltpsmadvect_tavg-ol-hxy-sea,glb,Oyr.osaltpsmadvect,ocean.osaltpsmadvect.tavg-ol-hxy-sea.yr.glb,baa4887c-e5dd-11e5-8482-ac72891c3257,low,,
+238,ocean.osaltrmadvect.tavg-ol-hxy-sea.yr.glb,yr,ocean,tendency_of_sea_water_salinity_expressed_as_salt_content_due_to_residual_mean_advection,kg m-2 s-1,area: mean where sea time: mean,area: areacello volume: volcello,Tendency of Sea Water Salinity Expressed as Salt Content Due to Residual Mean Advection,Tendency of salt content for a grid cell from residual mean (sum of Eulerian mean + parameterized eddy-induced) advection.,Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,osaltrmadvect,real,,XY-O,time-intv,Oyr,osaltrmadvect,osaltrmadvect,tavg-ol-hxy-sea,osaltrmadvect_tavg-ol-hxy-sea,glb,Oyr.osaltrmadvect,ocean.osaltrmadvect.tavg-ol-hxy-sea.yr.glb,1aaffce0-b006-11e6-9289-ac72891c3257,low,,
+239,ocean.osalttend.tavg-ol-hxy-sea.yr.glb,yr,ocean,tendency_of_sea_water_salinity_expressed_as_salt_content,kg m-2 s-1,area: mean where sea time: mean,area: areacello volume: volcello,Tendency of Sea Water Salinity Expressed as Salt Content,Tendency of salt content for a grid cell from all processes.,Report on native horizontal grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,osalttend,real,,XY-O,time-intv,Oyr,osalttend,osalttend,tavg-ol-hxy-sea,osalttend_tavg-ol-hxy-sea,glb,Oyr.osalttend,ocean.osalttend.tavg-ol-hxy-sea.yr.glb,baa47378-e5dd-11e5-8482-ac72891c3257,low,,
+240,ocean.pbo.tavg-u-hxy-sea.mon.glb,mon,ocean,sea_water_pressure_at_sea_floor,Pa,area: mean where sea time: mean,area: areacello,Sea Water Pressure at Sea Floor,"""Sea water pressure"" is the pressure that exists in the medium of sea water. It includes the pressure due to overlying sea water, sea ice, air and any other medium that may be present.",CMIP5 had units of dbar. CMIP6 uses Pa. Report on native horizontal grid as well as on a spherical latitude/longitude grid.,longitude latitude time,pbo,real,,XY-na,time-intv,Omon,pbo,pbo,tavg-u-hxy-sea,pbo_tavg-u-hxy-sea,glb,Omon.pbo,ocean.pbo.tavg-u-hxy-sea.mon.glb,baa4fb54-e5dd-11e5-8482-ac72891c3257,high,,
+241,ocean.pfscint.tavg-op4-hxy-sea.mon.glb,mon,ocean,integral_wrt_depth_of_sea_water_preformed_salinity_expressed_as_salt_mass_content,kg m-2,area: time: mean where sea,area: areacello,Integral wrt depth of seawater preformed salinity expressed as salt mass content,"This is a fundamental aspect of the changes in the hydrological cycle and their impact on the oceans, and due to new numerical schemes and vertical discretizations, it is important to calculate it consistently with the model formulation.","CHANGE: This is a new variable, which aids in understanding hydrological change. It is preferable to calculate it online, due to difficulties with vertical discretizations. It is calculated as an integral over hydrostatic pressure ranges, which makes it directly comparable with observations.",longitude latitude oplayer4 time,pfscint,real,,XY-B,time-intv,Omon,pfscint,pfscint,tavg-op4-hxy-sea,pfscint_tavg-op4-hxy-sea,glb,Omon.pfscint,ocean.pfscint.tavg-op4-hxy-sea.mon.glb,80ab72a4-a698-11ef-914a-613c0433d878,high,,
+242,ocean.phcint.tavg-op4-hxy-sea.mon.glb,mon,ocean,integral_wrt_depth_of_sea_water_potential_temperature_expressed_as_heat_content,J m-2,area: time: mean where sea,area: areacello,Integrated Ocean Heat Content from Potential Temperature,This is the vertically-integrated heat content derived from potential temperature (thetao).,"CHANGE: This is a new variable, which aids in calculation of energy budgets. It is preferable to calculate it online, due to difficulties with vertical discretizations. It is calculated as an integral over hydrostatic pressure ranges, which makes it directly comparable with observations so long as integrals are over 0-300m, 300m-700m, 700m-2000m, total depth.",longitude latitude oplayer4 time,phcint,real,down,XY-B,time-intv,Omon,phcint,phcint,tavg-op4-hxy-sea,phcint_tavg-op4-hxy-sea,glb,Omon.phcint,ocean.phcint.tavg-op4-hxy-sea.mon.glb,80ab72a1-a698-11ef-914a-613c0433d878,high,,
+243,ocean.pso.tavg-u-hxy-sea.mon.glb,mon,ocean,sea_water_pressure_at_sea_water_surface,Pa,area: mean where sea time: mean,area: areacello,Sea Water Pressure at Sea Water Surface,"The phrase ""sea water surface"" means the upper boundary of the liquid portion of an ocean or sea, including the boundary to floating ice if present. ""Sea water pressure"" is the pressure that exists in the medium of sea water. It includes the pressure due to overlying sea water, sea ice, air and any other medium that may be present.",CMIP5 had units of dbar. CMIP6 uses Pa. Report on native horizontal grid as well as on a spherical latitude/longitude grid.,longitude latitude time,pso,real,,XY-na,time-intv,Omon,pso,pso,tavg-u-hxy-sea,pso_tavg-u-hxy-sea,glb,Omon.pso,ocean.pso.tavg-u-hxy-sea.mon.glb,baa4ff96-e5dd-11e5-8482-ac72891c3257,high,,
+244,ocean.rsdoabsorb.tavg-ol-hxy-sea.yr.glb,yr,ocean,net_rate_of_absorption_of_shortwave_energy_in_ocean_layer,W m-2,area: mean where sea time: mean,area: areacello volume: volcello,Net Rate of Absorption of Shortwave Energy in Ocean Layer,Tendency of heat content for a grid cell from penetrative shortwave radiation within a grid cell.,,longitude latitude olevel time,rsdoabsorb,real,,XY-O,time-intv,Oyr,rsdoabsorb,rsdoabsorb,tavg-ol-hxy-sea,rsdoabsorb_tavg-ol-hxy-sea,glb,Oyr.rsdoabsorb,ocean.rsdoabsorb.tavg-ol-hxy-sea.yr.glb,1aaf5b6e-b006-11e6-9289-ac72891c3257,low,,
+245,ocean.rsds.tavg-u-hxy-ifs.mon.glb,mon,ocean,surface_downwelling_shortwave_flux_in_air,W m-2,area: time: mean where ice_free_sea over sea,area: areacello,Surface Downwelling Shortwave Radiation over Ocean Not Covered by Sea Ice,Surface Downwelling Shortwave Radiation over the portion of an ocean grid cell not covered by sea ice. Can be used for computation of surface albedo.,"other than the different rule for spatial averaging, the variable is equivalent to Amon.rsds",longitude latitude time,rsds,real,down,XY-na,time-intv,Emon,rsdsoni,rsds,tavg-u-hxy-ifs,rsds_tavg-u-hxy-ifs,glb,Emon.rsdsoni,ocean.rsds.tavg-u-hxy-ifs.mon.glb,80ab7207-a698-11ef-914a-613c0433d878,high,,
+246,ocean.rsus.tavg-u-hxy-ifs.mon.glb,mon,ocean,surface_upwelling_shortwave_flux_in_air,W m-2,area: time: mean where ice_free_sea over sea,area: areacello,Surface Upwelling Shortwave Radiation over Ocean Not Covered by Sea Ice,Surface Upwelling Shortwave Radiation over the portion of an ocean grid cell not covered by sea ice. Can be used for computation of surface albedo.,"other than the different rule for spatial averaging, the variable is equivalent to Amon.rsus",longitude latitude time,rsus,real,up,XY-na,time-intv,Emon,rsusoni,rsus,tavg-u-hxy-ifs,rsus_tavg-u-hxy-ifs,glb,Emon.rsusoni,ocean.rsus.tavg-u-hxy-ifs.mon.glb,80ab7208-a698-11ef-914a-613c0433d878,high,,
+247,ocean.scint.tavg-op4-hxy-sea.mon.glb,mon,ocean,integral_wrt_depth_of_sea_water_practical_salinity_expressed_as_salt_mass_content,kg m-2,area: time: mean where sea,area: areacello,Integral wrt depth of seawater practical salinity expressed as salt mass content,"This is a fundamental aspect of the changes in the hydrological cycle and their impact on the oceans, and due to new numerical schemes and vertical discretizations, it is important to calculate it consistently with the model formulation.","CHANGE: This is a new variable, which aids in understanding hydrological change. It is preferable to calculate it online, due to difficulties with vertical discretizations. It is calculated as an integral over hydrostatic pressure ranges, which makes it directly comparable with observations.",longitude latitude oplayer4 time,scint,real,,XY-B,time-intv,Omon,scint,scint,tavg-op4-hxy-sea,scint_tavg-op4-hxy-sea,glb,Omon.scint,ocean.scint.tavg-op4-hxy-sea.mon.glb,80ab72a3-a698-11ef-914a-613c0433d878,high,,
+248,ocean.sfacrossline.tavg-u-ht-sea.mon.glb,mon,ocean,ocean_salt_transport_across_line,W,depth: sum where sea time: mean,,Ocean Salt Mass Transport across Lines,"Depth-integrated total salt mass transport from resolved and parameterized processes across different lines on the Earth's surface (based on appendix J and table J1 of Griffies et al., 2016). Formally, this means the integral along the line of the normal component of the heat transport. Positive and negative numbers refer to total northward/eastward and southward/westward transports, respectively. The transport should be evaluated for the full depth of the ocean, except for the Pacific Equatorial Undercurrent, which is averaged from the surface to 350m.",,oline time,sfacrossline,real,,TR-na,time-intv,Omon,sfacrossline,sfacrossline,tavg-u-ht-sea,sfacrossline_tavg-u-ht-sea,glb,Omon.sfacrossline,ocean.sfacrossline.tavg-u-ht-sea.mon.glb,80ab7447-a698-11ef-914a-613c0433d878,medium,,
+250,ocean.sfriver.tavg-u-hxy-sea.mon.glb,mon,ocean,salt_flux_into_sea_water_from_rivers,kg m-2 s-1,area: mean where sea time: mean,area: areacello,Salt Flux into Sea Water from Rivers,"This field is physical, and it arises when rivers carry a nonzero salt content. Often this is zero, with rivers assumed to be fresh.",Report on native horizontal grid as well as mapped onto sphere.,longitude latitude time,sfriver,real,,XY-na,time-intv,Omon,sfriver,sfriver,tavg-u-hxy-sea,sfriver_tavg-u-hxy-sea,glb,Omon.sfriver,ocean.sfriver.tavg-u-hxy-sea.mon.glb,baa66746-e5dd-11e5-8482-ac72891c3257,medium,,
+252,ocean.sfx.tavg-ol-hxy-sea.mon.glb,mon,ocean,ocean_salt_x_transport,kg s-1,area: mean where sea time: mean,area: areacello volume: volcello,3D Ocean Salt Mass X Transport,Contains all contributions to 'x-ward' salt mass transport from resolved and parameterized processes. Report on native horizontal grid.,"3d field. If only the 2d vertically integrated transport is available or is preferred, produce Omon.sfxint instead.
+Online mapping to depth/pressure vertical grid if depth or pressure are not native. Report on native horizontal grid.",longitude latitude olevel time,sfx,real,,XY-O,time-intv,Omon,sfx,sfx,tavg-ol-hxy-sea,sfx_tavg-ol-hxy-sea,glb,Omon.sfx,ocean.sfx.tavg-ol-hxy-sea.mon.glb,527f5ccd-8c97-11ef-944e-41a8eb05f654,high,,
+253,ocean.sfx.tavg-u-hxy-sea.mon.glb,mon,ocean,ocean_salt_x_transport,kg s-1,area: mean where sea depth: sum where sea (over entire ocean column) time: mean,area: areacello,Vertically Integrated Ocean Salt Mass X Transport,Ocean salt mass x transport vertically integrated over the whole ocean depth. Contains all contributions to 'x-ward' salt mass transport from resolved and parameterized processes. Report on native horizontal grid.,"2d vertically integrated field. If the full 3d transport is preferred, produce Omon.sfx instead.
+Report on native horizontal grid.",longitude latitude time,sfx,real,,XY-int,time-intv,Omon,sfx,sfx,tavg-u-hxy-sea,sfx_tavg-u-hxy-sea,glb,Omon.sfxint,ocean.sfx.tavg-u-hxy-sea.mon.glb,80ab72a8-a698-11ef-914a-613c0433d878,high,,
+254,ocean.sfy.tavg-ol-hxy-sea.mon.glb,mon,ocean,ocean_salt_y_transport,kg s-1,area: mean where sea time: mean,area: areacello volume: volcello,3D Ocean Salt Mass Y Transport,Contains all contributions to 'y-ward' salt mass transport from resolved and parameterized processes. Report on native horizontal grid.,"3d field. If only the 2d vertically integrated transport is available or is preferred, produce Omon.sfyint instead.
+Online mapping to depth/pressure vertical grid if depth or pressure are not native. Report on native horizontal grid.",longitude latitude olevel time,sfy,real,,XY-O,time-intv,Omon,sfy,sfy,tavg-ol-hxy-sea,sfy_tavg-ol-hxy-sea,glb,Omon.sfy,ocean.sfy.tavg-ol-hxy-sea.mon.glb,527f5cce-8c97-11ef-944e-41a8eb05f654,high,,
+255,ocean.sfy.tavg-u-hxy-sea.mon.glb,mon,ocean,ocean_salt_y_transport,kg s-1,area: mean where sea depth: sum where sea (over entire ocean column) time: mean,area: areacello,Vertically Integrated Ocean Salt Mass Y Transport,Ocean salt mass y transport vertically integrated over the whole ocean depth. Contains all contributions to 'y-ward' salt mass transport from resolved and parameterized processes. Report on native horizontal grid.,"2d vertically integrated field. If the full 3d transport is preferred, produce Omon.sfy instead.
+Report on native horizontal grid.",longitude latitude time,sfy,real,,XY-int,time-intv,Omon,sfy,sfy,tavg-u-hxy-sea,sfy_tavg-u-hxy-sea,glb,Omon.sfyint,ocean.sfy.tavg-u-hxy-sea.mon.glb,80ab72a9-a698-11ef-914a-613c0433d878,high,,
+257,ocean.sltbasin.tavg-u-hyb-sea.mon.glb,mon,ocean,northward_ocean_salt_transport,kg s-1,depth: longitude: sum where sea (along a zig-zag grid path spanning a basin) time: mean,,Northward Ocean Salt Transport,"Northward Ocean Salt Transport from all physical processes affecting northward salt transport, resolved and parameterized. Diagnosed here as a function of latitude and basin.",,latitude basin time,sltbasin,real,,YB-na,time-intv,Omon,sltbasin,sltbasin,tavg-u-hyb-sea,sltbasin_tavg-u-hyb-sea,glb,Omon.sltbasin,ocean.sltbasin.tavg-u-hyb-sea.mon.glb,83bbfb4d-7f07-11ef-9308-b1dd71e64bec,high,,
+258,ocean.sltovgyre.tavg-u-hyb-sea.mon.glb,mon,ocean,northward_ocean_salt_transport_due_to_gyre,kg s-1,depth: longitude: sum where sea (along a zig-zag grid path spanning a basin) time: mean,,Northward Ocean Salt Transport Due to Gyre,"From all advective mass transport processes, resolved and parameterized.","For models which do not have a Cartesian lat-long grid, this transport can be approximated as thetransport across zig-zag paths corresponding to latitudes with spacing between latitudes appropriate tothe model's resolution, as is done for the ocean meridional overturning mass streamfunction. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:longitude: sum (comment: basin sum [along zig-zag grid path]) depth: sum time: mean CMIP7:depth: longitude: sum where sea (along a zig-zag grid path spanning a basin) time: mean,",latitude basin time,sltovgyre,real,,YB-na,time-intv,Omon,sltovgyre,sltovgyre,tavg-u-hyb-sea,sltovgyre_tavg-u-hyb-sea,glb,Omon.sltovgyre,ocean.sltovgyre.tavg-u-hyb-sea.mon.glb,baa5f7de-e5dd-11e5-8482-ac72891c3257,high,,
+259,ocean.sltovovrt.tavg-u-hyb-sea.mon.glb,mon,ocean,northward_ocean_salt_transport_due_to_overturning,kg s-1,depth: longitude: sum where sea (along a zig-zag grid path spanning a basin) time: mean,,Northward Ocean Salt Transport Due to Overturning,"From all advective mass transport processes, resolved and parameterized.","For models which do not have a Cartesian lat-long grid, this transport can be approximated as the transport across zig-zag paths corresponding to latitudes with spacing between latitudes appropriate to the model's resolution, as is done for the ocean meridional overturning mass streamfunction. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:longitude: sum (comment: basin sum [along zig-zag grid path]) depth: sum time: mean CMIP7:depth: longitude: sum where sea (along a zig-zag grid path spanning a basin) time: mean,",latitude basin time,sltovovrt,real,,YB-na,time-intv,Omon,sltovovrt,sltovovrt,tavg-u-hyb-sea,sltovovrt_tavg-u-hyb-sea,glb,Omon.sltovovrt,ocean.sltovovrt.tavg-u-hyb-sea.mon.glb,baa5fc0c-e5dd-11e5-8482-ac72891c3257,high,,
+260,ocean.so.tavg-ol-hm-sea.mon.glb,mon,ocean,sea_water_salinity,1E-03,area: mean where sea time: mean,,Global Mean Sea Water Salinity,"Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and the units attribute should normally be given as 1e-3 or 0.001 i.e. parts per thousand.","CHANGE SINCE CMIP6 in Units (from Physical Parameter) - CMIP6:0.001 CMIP7:1E-03, CHANGE SINCE CMIP6 in Dimensions - CMIP6:time CMIP7:olevel time,",olevel time,so,real,,na-O,time-intv,Omon,soga,so,tavg-ol-hm-sea,so_tavg-ol-hm-sea,glb,Omon.soga,ocean.so.tavg-ol-hm-sea.mon.glb,baa55086-e5dd-11e5-8482-ac72891c3257,high,,
+261,ocean.so.tavg-ol-hxy-sea.dec.glb,dec,ocean,sea_water_salinity,1E-03,area: mean where sea time: mean,area: areacello volume: volcello,Sea Water Salinity,"Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and the units attribute should normally be given as 1e-3 or 0.001 i.e. parts per thousand.","Report on native horizontal grid as well as on a spherical latitude/longitude grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.
+CHANGE SINCE CMIP6 in Units (from Physical Parameter) - CMIP6:0.001 CMIP7:1E-03,",longitude latitude olevel time,so,real,,XY-O,time-intv,Odec,so,so,tavg-ol-hxy-sea,so_tavg-ol-hxy-sea,glb,Odec.so,ocean.so.tavg-ol-hxy-sea.dec.glb,4795682a-bb0b-11e6-8316-5980f7b176d1,high,,
+263,ocean.sob.tavg-u-hxy-sea.mon.glb,mon,ocean,sea_water_salinity_at_sea_floor,1E-03,area: mean where sea time: mean,area: areacello,Sea Water Salinity at Sea Floor,Model prognostic salinity at bottom-most model grid cell,"Report on native horizontal grid as well as on a spherical latitude/longititude grid.
+CHANGE SINCE CMIP6 in Units (from Physical Parameter) - CMIP6:0.001 CMIP7:1E-03,",longitude latitude time,sob,real,,XY-na,time-intv,Omon,sob,sob,tavg-u-hxy-sea,sob_tavg-u-hxy-sea,glb,Omon.sob,ocean.sob.tavg-u-hxy-sea.mon.glb,baa55f4a-e5dd-11e5-8482-ac72891c3257,high,,
+264,ocean.somint.tavg-u-hxy-sea.yr.glb,yr,ocean,integral_wrt_depth_of_product_of_salinity_and_sea_water_density,g m-2,area: mean where sea time: mean,area: areacello,Depth Integral of Product of Sea Water Density and Prognostic Salinity,"Full column sum of density\*cell thickness\*salinity. If the model is Boussinesq, then use Boussinesq reference density for the density factor.",,longitude latitude time,somint,real,,XY-int,time-intv,Oyr,somint,somint,tavg-u-hxy-sea,somint_tavg-u-hxy-sea,glb,Oyr.somint,ocean.somint.tavg-u-hxy-sea.yr.glb,1aaf4d2c-b006-11e6-9289-ac72891c3257,low,,
+265,ocean.sos.tavg-u-hm-sea.mon.glb,mon,ocean,sea_surface_salinity,1E-03,area: mean where sea time: mean,,Global Average Sea Surface Salinity,"Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and the units attribute should normally be given as 1e-3 or 0.001 i.e. parts per thousand.","CHANGE SINCE CMIP6 in Units (from Physical Parameter) - CMIP6:0.001 CMIP7:1E-03,
+Evaluated at the upper boundary of the liquid ocean, including at the lower boundary of sea-ice and floating ice shelves.",time,sos,real,,na-na,time-intv,Omon,sosga,sos,tavg-u-hm-sea,sos_tavg-u-hm-sea,glb,Omon.sosga,ocean.sos.tavg-u-hm-sea.mon.glb,1aaaf7fe-b006-11e6-9289-ac72891c3257,high,,
+268,ocean.sossq.tavg-u-hxy-sea.mon.glb,mon,ocean,square_of_sea_surface_salinity,1E-06,area: mean where sea time: mean,area: areacello,Square of Sea Surface Salinity,"Sea water salinity is the salt content of sea water, often on the Practical Salinity Scale of 1978. However, the unqualified term 'salinity' is generic and does not necessarily imply any particular method of calculation. The units of salinity are dimensionless and the units attribute should normally be given as 1e-3 or 0.001 i.e. parts per thousand.","Evaluated at the upper boundary of the liquid ocean, including at the lower boundary of sea-ice and floating ice shelves.",longitude latitude time,sossq,real,,XY-na,time-intv,Omon,sossq,sossq,tavg-u-hxy-sea,sossq_tavg-u-hxy-sea,glb,Omon.sossq,ocean.sossq.tavg-u-hxy-sea.mon.glb,1aab073a-b006-11e6-9289-ac72891c3257,low,,
+269,ocean.sw17O.tavg-ol-hxy-sea.mon.glb,mon,ocean,isotope_ratio_of_17O_to_16O_in_sea_water_excluding_solutes_and_solids,1,area: mean where sea time: mean,area: areacello volume: volcello,Isotopic Ratio of Oxygen-17 in Sea Water,Ratio of abundance of oxygen-17 (17O) atoms to oxygen-16 (16O) atoms in sea water,,longitude latitude olevel time,sw17O,real,,XY-O,time-intv,Emon,sw17O,sw17O,tavg-ol-hxy-sea,sw17O_tavg-ol-hxy-sea,glb,Emon.sw17O,ocean.sw17O.tavg-ol-hxy-sea.mon.glb,fdca5cc1-4d35-11e8-be0a-1c4d70487308,high,,
+270,ocean.sw18O.tavg-ol-hxy-sea.mon.glb,mon,ocean,isotope_ratio_of_18O_to_16O_in_sea_water_excluding_solutes_and_solids,1,area: mean where sea time: mean,area: areacello,Isotopic Ratio of Oxygen-18 in Sea Water,Ratio of abundance of oxygen-18 (18O) atoms to oxygen-16 (16O) atoms in sea water,"CHANGE SINCE CMIP6 in Cell Measures - CMIP6:area: areacella CMIP7:area: areacello, CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude alevel time CMIP7:longitude latitude olevel time, CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean CMIP7:area: mean where sea time: mean,",longitude latitude olevel time,sw18O,real,,XY-O,time-intv,Emon,sw18O,sw18O,tavg-ol-hxy-sea,sw18O_tavg-ol-hxy-sea,glb,Emon.sw18O,ocean.sw18O.tavg-ol-hxy-sea.mon.glb,6f68c8f2-9acb-11e6-b7ee-ac72891c3257,high,,
+271,ocean.sw2H.tavg-ol-hxy-sea.mon.glb,mon,ocean,isotope_ratio_of_2H_to_1H_in_sea_water_excluding_solutes_and_solids,1,area: mean where sea time: mean,area: areacello volume: volcello,Isotopic Ratio of Deuterium in Sea Water,Ratio of abundance of hydrogen-2 (2H) atoms to hydrogen-1 (1H) atoms in sea water,,longitude latitude olevel time,sw2H,real,,XY-O,time-intv,Emon,sw2H,sw2H,tavg-ol-hxy-sea,sw2H_tavg-ol-hxy-sea,glb,Emon.sw2H,ocean.sw2H.tavg-ol-hxy-sea.mon.glb,fdca5cc2-4d35-11e8-be0a-1c4d70487308,high,,
+272,ocean.tauuo.tavg-u-hxy-sea.dec.glb,dec,ocean,downward_x_stress_at_sea_water_surface,N m-2,area: mean where sea time: mean,area: areacello,Sea Water Surface Downward X Stress,"This is the stress on the liquid ocean from overlying atmosphere, sea ice, ice shelf, etc.",,longitude latitude time,tauuo,real,down,XY-na,time-intv,Odec,tauuo,tauuo,tavg-u-hxy-sea,tauuo_tavg-u-hxy-sea,glb,Odec.tauuo,ocean.tauuo.tavg-u-hxy-sea.dec.glb,ac26fd4c-bb0d-11e6-83c8-bf7187cdbd68,high,,
+274,ocean.tauvo.tavg-u-hxy-sea.dec.glb,dec,ocean,downward_y_stress_at_sea_water_surface,N m-2,area: mean where sea time: mean,area: areacello,Sea Water Surface Downward Y Stress,"This is the stress on the liquid ocean from overlying atmosphere, sea ice, ice shelf, etc.",,longitude latitude time,tauvo,real,down,XY-na,time-intv,Odec,tauvo,tauvo,tavg-u-hxy-sea,tauvo_tavg-u-hxy-sea,glb,Odec.tauvo,ocean.tauvo.tavg-u-hxy-sea.dec.glb,ac270e9a-bb0d-11e6-83c8-bf7187cdbd68,high,,
+276,ocean.thetao.tavg-ol-hm-sea.mon.glb,mon,ocean,sea_water_potential_temperature,degC,area: mean where sea time: mean,,Global Average Sea Water Potential Temperature,Diagnostic should be contributed even for models using conservative temperature as prognostic field,"CHANGE SINCE CMIP6 in Dimensions - CMIP6:time CMIP7:olevel time,",olevel time,thetao,real,,na-O,time-intv,Omon,thetaoga,thetao,tavg-ol-hm-sea,thetao_tavg-ol-hm-sea,glb,Omon.thetaoga,ocean.thetao.tavg-ol-hm-sea.mon.glb,baa52138-e5dd-11e5-8482-ac72891c3257,high,,
+277,ocean.thetao.tavg-ol-hxy-sea.dec.glb,dec,ocean,sea_water_potential_temperature,degC,area: mean where sea time: mean,area: areacello volume: volcello,Sea Water Potential Temperature,Diagnostic should be contributed even for models using conservative temperature as prognostic field.,Note change from CMIP5 K to CMIP6 C. Report on native horizontal grid as well as on a spherical latitude/longitude grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,thetao,real,,XY-O,time-intv,Odec,thetao,thetao,tavg-ol-hxy-sea,thetao_tavg-ol-hxy-sea,glb,Odec.thetao,ocean.thetao.tavg-ol-hxy-sea.dec.glb,479522ca-bb0b-11e6-8316-5980f7b176d1,high,,
+279,ocean.thetao.tavg-op20bar-hxy-sea.day.glb,day,ocean,sea_water_potential_temperature,degC,area: mean where sea time: mean,area: areacello,Sea Water Potential Temperature at 200 meters,Diagnostic should be contributed even for models using conservative temperature as prognostic field.,The variable at the depth of 200 meters is requested.,longitude latitude time op20bar,thetao,real,,XY-na,time-intv,Oday,thetao,thetao,tavg-op20bar-hxy-sea,thetao_tavg-op20bar-hxy-sea,glb,Oday.thetao200,ocean.thetao.tavg-op20bar-hxy-sea.day.glb,83bbfb6e-7f07-11ef-9308-b1dd71e64bec,high,,
+280,ocean.thkcello.tavg-ol-hxy-sea.dec.glb,dec,ocean,cell_thickness,m,area: mean where sea time: mean,area: areacello volume: volcello,Ocean Model Cell Thickness,"The time varying thickness of ocean cells. ""Thickness"" means the vertical extent of a layer. ""Cell"" refers to a model grid-cell.",Report on native horizontal grid as well as on a spherical latitude/longitude grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,thkcello,real,,XY-O,time-intv,Odec,thkcello,thkcello,tavg-ol-hxy-sea,thkcello_tavg-ol-hxy-sea,glb,Odec.thkcello,ocean.thkcello.tavg-ol-hxy-sea.dec.glb,479514a6-bb0b-11e6-8316-5980f7b176d1,high,,
+283,ocean.thkcelluo.tavg-ol-hxy-sea.mon.glb,mon,ocean,cell_thickness,m,area: mean where sea time: mean,area: areacello volume: volcello,Ocean Model Cell Thickness at u-points,"The time varying thickness of ocean cells centered at u-points (points for velocity in the x-direction). ""Thickness"" means the vertical extent of a layer. ""Cell"" refers to a model grid-cell.",Report on native horizontal grid as well as on a spherical latitude/longitude grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,thkcelluo,real,,XY-O,time-intv,Omon,thkcelluo,thkcelluo,tavg-ol-hxy-sea,thkcelluo_tavg-ol-hxy-sea,glb,Omon.thkcelluo,ocean.thkcelluo.tavg-ol-hxy-sea.mon.glb,83bbfb4c-7f07-11ef-9308-b1dd71e64bec,low,,
+284,ocean.thkcellvo.tavg-ol-hxy-sea.mon.glb,mon,ocean,cell_thickness,m,area: mean where sea time: mean,area: areacello volume: volcello,Ocean Model Cell Thickness at v-points,"The time varying thickness of ocean cells centered at v-points (points for velocity in the y-direction). ""Thickness"" means the vertical extent of a layer. ""Cell"" refers to a model grid-cell.",Report on native horizontal grid as well as on a spherical latitude/longitude grid. Online mapping to depth/pressure vertical grid if depth or pressure are not native.,longitude latitude olevel time,thkcellvo,real,,XY-O,time-intv,Omon,thkcellvo,thkcellvo,tavg-ol-hxy-sea,thkcellvo_tavg-ol-hxy-sea,glb,Omon.thkcellvo,ocean.thkcellvo.tavg-ol-hxy-sea.mon.glb,83bbfb4b-7f07-11ef-9308-b1dd71e64bec,low,,
+285,ocean.tnkebto.tavg-u-hxy-sea.yr.glb,yr,ocean,tendency_of_ocean_eddy_kinetic_energy_content_due_to_parameterized_eddy_advection,W m-2,area: mean where sea time: mean,area: areacello,Tendency of Ocean Eddy Kinetic Energy Content Due to Parameterized Eddy Advection,"Depth integrated impacts on kinetic energy arising from parameterized eddy-induced advection. For CMIP5, this diagnostic was 3d, whereas the CMIP6 depth integrated diagnostic is sufficient for many purposes and reduces archive requirements.",,longitude latitude time,tnkebto,real,,XY-int,time-intv,Oyr,tnkebto,tnkebto,tavg-u-hxy-sea,tnkebto_tavg-u-hxy-sea,glb,Oyr.tnkebto,ocean.tnkebto.tavg-u-hxy-sea.yr.glb,baa4e07e-e5dd-11e5-8482-ac72891c3257,medium,,
+286,ocean.tnpeo.tavg-u-hxy-sea.yr.glb,yr,ocean,tendency_of_ocean_potential_energy_content,W m-2,area: mean where sea time: mean,area: areacello,Tendency of Ocean Potential Energy Content,"Rate that work is done against vertical stratification, as measured by the vertical heat and salt diffusivity. Report here as depth integrated two-dimensional field.",,longitude latitude time,tnpeo,real,,XY-int,time-intv,Oyr,tnpeo,tnpeo,tavg-u-hxy-sea,tnpeo_tavg-u-hxy-sea,glb,Oyr.tnpeo,ocean.tnpeo.tavg-u-hxy-sea.yr.glb,baa4b4e6-e5dd-11e5-8482-ac72891c3257,low,,
+287,ocean.tob.tavg-u-hxy-sea.mon.glb,mon,ocean,sea_water_potential_temperature_at_sea_floor,degC,area: mean where sea time: mean,area: areacello,Sea Water Potential Temperature at Sea Floor,Potential temperature at the ocean bottom-most grid cell.,Report on native horizontal grid as well as on a spherical latitude/longitude grid.,longitude latitude time,tob,real,,XY-na,time-intv,Omon,tob,tob,tavg-u-hxy-sea,tob_tavg-u-hxy-sea,glb,Omon.tob,ocean.tob.tavg-u-hxy-sea.mon.glb,baa53218-e5dd-11e5-8482-ac72891c3257,high,,
+288,ocean.tos.tavg-u-hm-sea.mon.glb,mon,ocean,sea_surface_temperature,degC,area: mean where sea time: mean,,Global Average Sea Surface Temperature,"This may differ from ""surface temperature"" in regions of sea ice or floating ice shelves. For models using conservative temperature as the prognostic field, they should report the top ocean layer as surface potential temperature, which is the same as surface in situ temperature.","Evaluated at the upper boundary of the liquid ocean, including at the lower boundary of sea-ice and floating ice shelves.",time,tos,real,,na-na,time-intv,Omon,tosga,tos,tavg-u-hm-sea,tos_tavg-u-hm-sea,glb,Omon.tosga,ocean.tos.tavg-u-hm-sea.mon.glb,baa53ace-e5dd-11e5-8482-ac72891c3257,high,,
+291,ocean.tossq.tavg-u-hxy-sea.mon.glb,mon,ocean,square_of_sea_surface_temperature,degC2,area: mean where sea time: mean,area: areacello,Square of Sea Surface Temperature,"Square of temperature of liquid ocean, averaged over the day.","Evaluated at the upper boundary of the liquid ocean, including at the lower boundary of sea-ice and floating ice shelves.",longitude latitude time,tossq,real,,XY-na,time-intv,Omon,tossq,tossq,tavg-u-hxy-sea,tossq_tavg-u-hxy-sea,glb,Omon.tossq,ocean.tossq.tavg-u-hxy-sea.mon.glb,baa53ee8-e5dd-11e5-8482-ac72891c3257,low,,
+294,ocean.uos.tavg-u-hxy-sea.day.glb,day,ocean,surface_sea_water_x_velocity,m s-1,area: mean where sea time: mean,area: areacello,Daily Surface Sea Water X Velocity,Daily surface prognostic x-ward velocity component resolved by the model.,"Report on native horizontal grid. Surface values only.
+Evaluated at the upper boundary of the liquid ocean, including at the lower boundary of sea-ice and floating ice shelves.",longitude latitude time,uos,real,,XY-na,time-intv,Oday,uos,uos,tavg-u-hxy-sea,uos_tavg-u-hxy-sea,glb,Oday.uos,ocean.uos.tavg-u-hxy-sea.day.glb,83bbfc6f-7f07-11ef-9308-b1dd71e64bec,high,,
+297,ocean.volcello.tavg-ol-hxy-sea.dec.glb,dec,ocean,ocean_volume,m3,area: sum where sea time: mean,area: areacello,Ocean Grid-Cell Volume,"For oceans with more than 1 mesh (e.g. staggered grids), report areas that apply to surface vertical fluxes of energy. If this field is time-dependent then save it instead as one of your Omon and Odec fields","a 3-d field: For oceans with more than 1 mesh, report on grid that applies to temperature
+CHANGE SINCE CMIP6 in Cell Measures - CMIP6:area: areacello volume: volcello CMIP7:area: areacello,",longitude latitude olevel time,volcello,real,,XY-O,time-intv,Odec,volcello,volcello,tavg-ol-hxy-sea,volcello_tavg-ol-hxy-sea,glb,Odec.volcello,ocean.volcello.tavg-ol-hxy-sea.dec.glb,0d321850-1027-11e8-9d87-1c4d70487308,high,,
+299,ocean.volcello.tavg-ol-hxy-sea.yr.glb,yr,ocean,ocean_volume,m3,area: sum where sea time: mean,area: areacello,Ocean Grid-Cell Volume,"For oceans with more than 1 mesh (e.g. staggered grids), report areas that apply to surface vertical fluxes of energy. If this field is time-dependent then save it instead as one of your Omon and Odec fields","a 3-d field: For oceans with more than 1 mesh, report on grid that applies to temperature
+CHANGE SINCE CMIP6 in Cell Measures - CMIP6:area: areacello volume: volcello CMIP7:area: areacello,",longitude latitude olevel time,volcello,real,,XY-O,time-intv,Oyr,volcello,volcello,tavg-ol-hxy-sea,volcello_tavg-ol-hxy-sea,glb,Oyr.volcello,ocean.volcello.tavg-ol-hxy-sea.yr.glb,ebf66136-e1ab-11e7-9db4-1c4d70487308,high,,
+300,ocean.volcello.ti-ol-hxy-sea.fx.glb,fx,ocean,ocean_volume,m3,area: sum where sea,area: areacello,Ocean Grid-Cell Volume,"For oceans with more than 1 mesh (e.g. staggered grids), report areas that apply to surface vertical fluxes of energy. If this field is time-dependent then save it instead as one of your Omon and Odec fields","a 3-d field: For oceans with more than 1 mesh, report on grid that applies to temperature. CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: sum CMIP7:area: sum where sea time: mean,
+CHANGE SINCE CMIP6 in Cell Measures - CMIP6:area: areacello volume: volcello CMIP7:area: areacello,",longitude latitude olevel,volcello,real,,XY-O,None,Ofx,volcello,volcello,ti-ol-hxy-sea,volcello_ti-ol-hxy-sea,glb,Ofx.volcello,ocean.volcello.ti-ol-hxy-sea.fx.glb,babcc39c-e5dd-11e5-8482-ac72891c3257,high,,
+301,ocean.volo.tavg-u-hm-sea.dec.glb,dec,ocean,sea_water_volume,m3,depth: area: sum where sea time: mean,,Sea Water Volume,Total volume of liquid sea water.,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: sum where sea time: mean CMIP7:depth: area: sum where sea time: mean,",time,volo,real,,na-na,time-intv,Odec,volo,volo,tavg-u-hm-sea,volo_tavg-u-hm-sea,glb,Odec.volo,ocean.volo.tavg-u-hm-sea.dec.glb,47950696-bb0b-11e6-8316-5980f7b176d1,high,,
+302,ocean.volo.tavg-u-hm-sea.mon.glb,mon,ocean,sea_water_volume,m3,depth: area: sum where sea time: mean,,Sea Water Volume,Total volume of liquid sea water.,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: sum where sea time: mean CMIP7:depth: area: sum where sea time: mean,",time,volo,real,,na-na,time-intv,Omon,volo,volo,tavg-u-hm-sea,volo_tavg-u-hm-sea,glb,Omon.volo,ocean.volo.tavg-u-hm-sea.mon.glb,baa503ce-e5dd-11e5-8482-ac72891c3257,high,,
+303,ocean.vos.tavg-u-hxy-sea.day.glb,day,ocean,surface_sea_water_y_velocity,m s-1,area: mean where sea time: mean,area: areacello,Daily Surface Sea Water Y Velocity,Daily surface prognostic y-ward velocity component resolved by the model.,"Report on native horizontal grid. Surface values only.
+ Evaluated at the upper boundary of the liquid ocean, including at the lower boundary of sea-ice and floating ice shelves.",longitude latitude time,vos,real,,XY-na,time-intv,Oday,vos,vos,tavg-u-hxy-sea,vos_tavg-u-hxy-sea,glb,Oday.vos,ocean.vos.tavg-u-hxy-sea.day.glb,83bbfc6e-7f07-11ef-9308-b1dd71e64bec,high,,
+304,ocean.vsf.tavg-u-hxy-sea.mon.glb,mon,ocean,virtual_salt_flux_into_sea_water,kg m-2 s-1,area: mean where sea time: mean,area: areacello,Virtual Salt Flux into Sea Water,It is set to zero in models which receive a real water flux.,"If this does not vary from one year to the next, report only a single year. Positive flux implies correction increases salinity of water. This includes all virtual salt flux, including that due to a salt flux correction. Report on native horizontal grid.",longitude latitude time,vsf,real,,XY-na,time-intv,Omon,vsf,vsf,tavg-u-hxy-sea,vsf_tavg-u-hxy-sea,glb,Omon.vsf,ocean.vsf.tavg-u-hxy-sea.mon.glb,baa65a76-e5dd-11e5-8482-ac72891c3257,high,,
+305,ocean.vsfcorr.tavg-u-hxy-sea.mon.glb,mon,ocean,virtual_salt_flux_correction,kg m-2 s-1,area: mean where sea time: mean,area: areacello,Virtual Salt Flux Correction,It is set to zero in models which receive a real water flux.,,longitude latitude time,vsfcorr,real,,XY-na,time-intv,Omon,vsfcorr,vsfcorr,tavg-u-hxy-sea,vsfcorr_tavg-u-hxy-sea,glb,Omon.vsfcorr,ocean.vsfcorr.tavg-u-hxy-sea.mon.glb,baa65eae-e5dd-11e5-8482-ac72891c3257,medium,,
+306,ocean.vsfevap.tavg-u-hxy-sea.mon.glb,mon,ocean,virtual_salt_flux_into_sea_water_due_to_evaporation,kg m-2 s-1,area: mean where sea time: mean,area: areacello,Virtual Salt Flux into Sea Water Due to Evaporation,zero for models using real water fluxes.,,longitude latitude time,vsfevap,real,,XY-na,time-intv,Omon,vsfevap,vsfevap,tavg-u-hxy-sea,vsfevap_tavg-u-hxy-sea,glb,Omon.vsfevap,ocean.vsfevap.tavg-u-hxy-sea.mon.glb,baa64df6-e5dd-11e5-8482-ac72891c3257,medium,,
+307,ocean.vsfpr.tavg-u-hxy-sea.mon.glb,mon,ocean,virtual_salt_flux_into_sea_water_due_to_rainfall,kg m-2 s-1,area: mean where sea time: mean,area: areacello,Virtual Salt Flux into Sea Water Due to Rainfall,zero for models using real water fluxes.,,longitude latitude time,vsfpr,real,,XY-na,time-intv,Omon,vsfpr,vsfpr,tavg-u-hxy-sea,vsfpr_tavg-u-hxy-sea,glb,Omon.vsfpr,ocean.vsfpr.tavg-u-hxy-sea.mon.glb,baa649d2-e5dd-11e5-8482-ac72891c3257,medium,,
+308,ocean.vsfriver.tavg-u-hxy-sea.mon.glb,mon,ocean,virtual_salt_flux_into_sea_water_from_rivers,kg m-2 s-1,area: mean where sea time: mean,area: areacello,Virtual Salt Flux into Sea Water from Rivers,zero for models using real water fluxes.,,longitude latitude time,vsfriver,real,,XY-na,time-intv,Omon,vsfriver,vsfriver,tavg-u-hxy-sea,vsfriver_tavg-u-hxy-sea,glb,Omon.vsfriver,ocean.vsfriver.tavg-u-hxy-sea.mon.glb,baa65224-e5dd-11e5-8482-ac72891c3257,medium,,
+310,ocean.wfcorr.tavg-u-hxy-sea.mon.glb,mon,ocean,water_flux_correction,kg m-2 s-1,area: mean where sea time: mean,area: areacello,Water Flux Correction,Computed as the water flux into the ocean due to flux correction divided by the area of the ocean portion of the grid cell.,"If this does not vary from one year to the next, report only a single year. Most models now have zero water flux adjustment, in which case ignore or report zero. Report on native horizontal grid as well as mapped onto sphere.",longitude latitude time,wfcorr,real,down,XY-na,time-intv,Omon,wfcorr,wfcorr,tavg-u-hxy-sea,wfcorr_tavg-u-hxy-sea,glb,Omon.wfcorr,ocean.wfcorr.tavg-u-hxy-sea.mon.glb,baa63dd4-e5dd-11e5-8482-ac72891c3257,high,,
+311,ocean.wfo.tavg-u-hxy-sea.mon.glb,mon,ocean,water_flux_into_sea_water,kg m-2 s-1,area: mean where sea time: mean,area: areacello,Water Flux into Sea Water,Computed as the water flux into the ocean divided by the area of the ocean portion of the grid cell. This is the sum \*wfonocorr\* and \*wfcorr\*.,"net flux of water into sea water, including any flux correction. Report on native horizontal grid as well as mapped onto sphere.",longitude latitude time,wfo,real,,XY-na,time-intv,Omon,wfo,wfo,tavg-u-hxy-sea,wfo_tavg-u-hxy-sea,glb,Omon.wfo,ocean.wfo.tavg-u-hxy-sea.mon.glb,baa63578-e5dd-11e5-8482-ac72891c3257,high,,
+316,ocean.zossq.tavg-u-hxy-sea.mon.glb,mon,ocean,square_of_sea_surface_height_above_geoid,m2,area: mean where sea time: mean,area: areacello,Square of Sea Surface Height Above Geoid,Surface ocean geoid defines z=0.,Report on native horizontal grid as well as on a spherical latitude/longitude grid.,longitude latitude time,zossq,real,,XY-na,time-intv,Omon,zossq,zossq,tavg-u-hxy-sea,zossq_tavg-u-hxy-sea,glb,Omon.zossq,ocean.zossq.tavg-u-hxy-sea.mon.glb,baa50c2a-e5dd-11e5-8482-ac72891c3257,high,,
\ No newline at end of file
diff --git a/awi-esm3-veg-hr-variables/lrcs_ocean/cmip7_awiesm3-veg-hr_lrcs_ocean.yaml b/awi-esm3-veg-hr-variables/lrcs_ocean/cmip7_awiesm3-veg-hr_lrcs_ocean.yaml
new file mode 100644
index 00000000..526bac37
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/lrcs_ocean/cmip7_awiesm3-veg-hr_lrcs_ocean.yaml
@@ -0,0 +1,710 @@
+# CMIP7 LRCS Ocean Variables — AWI-ESM3-VEG-HR
+# Generated from cmip7_LRCSextra_variables_ocean.csv
+#
+# Excludes variables already in core_ocean config.
+# See cmip7_lrcs_ocean_variables_todo.md for full variable tracking.
+
+general:
+ name: "awiesm3-cmip7-lrcs-ocean"
+ cmor_version: "CMIP7"
+ mip: "CMIP"
+ CMIP7_DReq_metadata: "/home/a/a270092/.cache/pycmor/cmip7_metadata/v1.2.2.2/metadata.json"
+
+pycmor:
+ warn_on_no_rule: False
+ dask_cluster: "slurm"
+ dask_cluster_scaling_mode: "fixed"
+ dask_cluster_scaling_fixed_jobs: 1
+
+jobqueue:
+ slurm:
+ name: pycmor-worker
+ queue: compute
+ account: bb1469
+ cores: 16
+ memory: 256GB
+ walltime: '00:30:00'
+
+pipelines:
+ # Square a field (tossq, sossq, zossq, mlotstsq)
+ - name: square_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_square
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Generic scaling (multiply by constant, e.g. fw × rho_water)
+ - name: scale_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:scale_by_constant
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Extract bottom-of-column from 3D field (tob, sob)
+ - name: bottom_extract_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:extract_bottom
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Compute surface pressure from SSH (pso)
+ - name: surface_pressure_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_surface_pressure
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Vertical integration (phcint, scint, opottempmint, somint)
+ - name: ocean_vertical_integration_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:vertical_integrate
+ - pycmor.std_lib.add_vertical_bounds
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Static volcello from mesh: cell_area × layer_thickness
+ - name: volcello_fx_pipeline
+ steps:
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:load_gridfile
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_volcello_fx
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Time-varying volcello: hnode × cell_area
+ - name: volcello_time_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_volcello_time
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Surface extraction from 3D field (uos, vos)
+ - name: surface_extract_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:extract_surface
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Ofx: load grid file, extract variable
+ - name: fx_extract_pipeline
+ steps:
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:load_gridfile
+ - pycmor.std_lib.generic.get_variable
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+inherit:
+ data_path: &dp /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/fesom
+ source_id: AWI-ESM-3
+ institution_id: AWI
+ experiment_id: picontrol
+ variant_label: r1i1p1f1
+ grid_label: gn
+ mesh_path: &mp /work/ab0246/a270092/input/fesom2/dars2
+ grid_file: /work/ab0246/a270092/input/fesom2/dars2/mesh.nc
+ grid: "FESOM 2.6 unstructured grid DARS (3146761 surface nodes)"
+ nominal_resolution: "10 km"
+ institution: "Alfred Wegener Institute, Helmholtz Centre for Polar and Marine Research, Bremerhaven, Germany"
+ output_directory: ./cmorized_output/awiesm3
+
+rules:
+ # ============================================================
+ # EASY: Direct mapping from ldiag_cmor or existing namelist.io
+ # ============================================================
+
+ # pbo — sea water pressure at sea floor (from ldiag_cmor=.true.)
+ - name: pbo
+ inputs:
+ - path: *dp
+ pattern: pbo.fesom.1350.nc
+ compound_name: ocean.pbo.tavg-u-hxy-sea.mon.GLB
+ model_variable: pbo
+
+ # volo — sea water volume (from ldiag_cmor=.true., global scalar)
+ - name: volo
+ inputs:
+ - path: *dp
+ pattern: volo.fesom.1350.nc
+ compound_name: ocean.volo.tavg-u-hm-sea.mon.GLB
+ model_variable: volo
+
+ # tos_ga — global average sea surface temperature (thetaoga from ldiag_cmor)
+ - name: tos_ga
+ inputs:
+ - path: *dp
+ pattern: thetaoga.fesom.1350.nc
+ compound_name: ocean.tos.tavg-u-hm-sea.mon.GLB
+ model_variable: thetaoga
+
+ # sos_ga — global average sea surface salinity (soga from ldiag_cmor)
+ - name: sos_ga
+ inputs:
+ - path: *dp
+ pattern: soga.fesom.1350.nc
+ compound_name: ocean.sos.tavg-u-hm-sea.mon.GLB
+ model_variable: soga
+
+ # thetao_ga — global average potential temperature (per level, from ldiag_cmor)
+ # NOTE: ldiag_cmor outputs thetaoga as a scalar, not per-level.
+ # The per-level profile requires a volume-weighted average pipeline.
+ # Using the scalar version for now.
+ - name: thetao_ga
+ inputs:
+ - path: *dp
+ pattern: thetaoga.fesom.1350.nc
+ compound_name: ocean.thetao.tavg-ol-hm-sea.mon.GLB
+ model_variable: thetaoga
+
+ # so_ga — global mean salinity (scalar from ldiag_cmor)
+ - name: so_ga
+ inputs:
+ - path: *dp
+ pattern: soga.fesom.1350.nc
+ compound_name: ocean.so.tavg-ol-hm-sea.mon.GLB
+ model_variable: soga
+
+ # obvfsq — Brunt-Vaisala frequency squared (N2 from namelist.io)
+ - name: obvfsq
+ inputs:
+ - path: *dp
+ pattern: N2.fesom.1350.nc
+ compound_name: ocean.obvfsq.tavg-ol-hxy-sea.mon.GLB
+ model_variable: N2
+
+ # wfo — water flux into sea water (fw × rho_water)
+ - name: wfo
+ inputs:
+ - path: *dp
+ pattern: fw.fesom.1350.nc
+ compound_name: ocean.wfo.tavg-u-hxy-sea.mon.GLB
+ model_variable: fw
+ scale_factor: 1000.0
+ scaled_units: "kg m-2 s-1"
+ pipelines:
+ - scale_pipeline
+
+ # vsf — virtual salt flux into sea water (virtsalt from namelist.io)
+ - name: vsf
+ inputs:
+ - path: *dp
+ pattern: virtsalt.fesom.1350.nc
+ compound_name: ocean.vsf.tavg-u-hxy-sea.mon.GLB
+ model_variable: virtsalt
+
+ # ============================================================
+ # Evaporation and salt flux correction
+ # ============================================================
+
+ # evspsbl — evaporation over ice-free ocean (evap × rho_water)
+ - name: evspsbl
+ inputs:
+ - path: *dp
+ pattern: evap.fesom.1350.nc
+ compound_name: ocean.evspsbl.tavg-u-hxy-sea.mon.GLB
+ model_variable: evap
+ scale_factor: 1000.0
+ scaled_units: "kg m-2 s-1"
+ pipelines:
+ - scale_pipeline
+ # NOTE: FESOM evap is total evaporation, not ice-free-only.
+ # May need masking by (1 - siconc) if CMIP requires ice-free fraction only.
+
+ # vsfcorr — virtual salt flux correction (relaxsalt)
+ - name: vsfcorr
+ inputs:
+ - path: *dp
+ pattern: relaxsalt.fesom.1350.nc
+ compound_name: ocean.vsfcorr.tavg-u-hxy-sea.mon.GLB
+ model_variable: relaxsalt
+ # NOTE: FESOM relaxsalt units are [m/s*psu]. CMIP wants [kg m-2 s-1].
+ # Conversion: rho_water * V * S * 1e-3 ≈ V*S (numerically ~1:1).
+ # Verify units after first test run.
+
+ # ============================================================
+ # Daily fields
+ # ============================================================
+
+ - name: mlotst_day
+ inputs:
+ - path: *dp
+ pattern: MLD3.fesom.1350.nc
+ compound_name: ocean.mlotst.tavg-u-hxy-sea.day.GLB
+ model_variable: MLD3
+
+ - name: uos
+ inputs:
+ - path: *dp
+ pattern: unod.fesom.1350.nc
+ compound_name: ocean.uos.tavg-u-hxy-sea.day.GLB
+ model_variable: unod
+ pipelines:
+ - surface_extract_pipeline
+
+ - name: vos
+ inputs:
+ - path: *dp
+ pattern: vnod.fesom.1350.nc
+ compound_name: ocean.vos.tavg-u-hxy-sea.day.GLB
+ model_variable: vnod
+ pipelines:
+ - surface_extract_pipeline
+
+ # ============================================================
+ # EASY: Squaring steps (tossq, sossq, zossq, mlotstsq)
+ # ============================================================
+
+ - name: tossq
+ inputs:
+ - path: *dp
+ pattern: sst.fesom.1350.nc
+ compound_name: ocean.tossq.tavg-u-hxy-sea.mon.GLB
+ model_variable: sst
+ squared_units: "degC2"
+ pipelines:
+ - square_pipeline
+
+ - name: sossq
+ inputs:
+ - path: *dp
+ pattern: sss.fesom.1350.nc
+ compound_name: ocean.sossq.tavg-u-hxy-sea.mon.GLB
+ model_variable: sss
+ squared_units: "1E-06"
+ pipelines:
+ - square_pipeline
+
+ - name: zossq
+ inputs:
+ - path: *dp
+ pattern: ssh.fesom.1350.nc
+ compound_name: ocean.zossq.tavg-u-hxy-sea.mon.GLB
+ model_variable: ssh
+ squared_units: "m2"
+ pipelines:
+ - square_pipeline
+
+ - name: mlotstsq
+ inputs:
+ - path: *dp
+ pattern: MLD3.fesom.1350.nc
+ compound_name: ocean.mlotstsq.tavg-u-hxy-sea.mon.GLB
+ model_variable: MLD3
+ squared_units: "m2"
+ pipelines:
+ - square_pipeline
+
+ # ============================================================
+ # MEDIUM: Bottom extraction (tob, sob)
+ # ============================================================
+
+ - name: tob
+ inputs:
+ - path: *dp
+ pattern: temp.fesom.1350.nc
+ compound_name: ocean.tob.tavg-u-hxy-sea.mon.GLB
+ model_variable: temp
+ pipelines:
+ - bottom_extract_pipeline
+
+ - name: sob
+ inputs:
+ - path: *dp
+ pattern: salt.fesom.1350.nc
+ compound_name: ocean.sob.tavg-u-hxy-sea.mon.GLB
+ model_variable: salt
+ pipelines:
+ - bottom_extract_pipeline
+
+ # ============================================================
+ # MEDIUM: Computed from existing output
+ # ============================================================
+
+ # pso — surface pressure from SSH
+ - name: pso
+ inputs:
+ - path: *dp
+ pattern: ssh.fesom.1350.nc
+ compound_name: ocean.pso.tavg-u-hxy-sea.mon.GLB
+ model_variable: ssh
+ reference_density: 1025.0
+ pipelines:
+ - surface_pressure_pipeline
+
+ # masso — global sea water mass (rho_0 × volo)
+ # Approximation: masso = rho_0 × volo (Boussinesq)
+ - name: masso
+ inputs:
+ - path: *dp
+ pattern: volo.fesom.1350.nc
+ compound_name: ocean.masso.tavg-u-hm-sea.mon.GLB
+ model_variable: volo
+ scale_factor: 1025.0
+ scaled_units: "kg"
+ pipelines:
+ - scale_pipeline
+
+ # phcint — integrated ocean heat content from potential temperature
+ # integral of rho_0 * cp * temp over depth
+ # Using vertical_integration_pipeline with scale: rho_0*cp = 1025*3992 ≈ 4.09e6
+ # NOTE: The vertical_integrate step integrates data*dz; we need rho_0*cp*temp*dz.
+ # We use scale_pipeline first to get rho_0*cp*temp, then integrate.
+ # For now, use the integration pipeline and set scale in integration_attrs.
+ - name: phcint
+ inputs:
+ - path: *dp
+ pattern: temp.fesom.1350.nc
+ compound_name: ocean.phcint.tavg-op4-hxy-sea.mon.GLB
+ model_variable: temp
+ integration_attrs:
+ long_name: "Depth integrated ocean heat content from potential temperature"
+ standard_name: "integral_wrt_depth_of_product_of_sea_water_density_and_potential_temperature"
+ units: "J m-2"
+ pipelines:
+ - ocean_vertical_integration_pipeline
+ # NOTE: needs post-multiply by rho_0*cp — may need a combined pipeline
+
+ # scint — depth-integrated practical salinity as salt mass content
+ # Similar to absscint (already in core_ocean)
+ - name: scint
+ inputs:
+ - path: *dp
+ pattern: salt.fesom.1350.nc
+ compound_name: ocean.scint.tavg-op4-hxy-sea.mon.GLB
+ model_variable: salt
+ integration_attrs:
+ long_name: "Integral wrt depth of seawater practical salinity expressed as salt mass content"
+ standard_name: "integral_wrt_depth_of_sea_water_practical_salinity_expressed_as_salt_mass_content"
+ units: "kg m-2"
+ pipelines:
+ - ocean_vertical_integration_pipeline
+
+ # opottempmint — depth integral of rho_0 × potential temperature (Oyr)
+ # integral(rho_0 * temp * dz) — uses vertical integration with rho_0 scaling
+ - name: opottempmint
+ inputs:
+ - path: *dp
+ pattern: temp.fesom.1350.nc
+ compound_name: ocean.opottempmint.tavg-op4-hxy-sea.yr.GLB
+ model_variable: temp
+ integration_attrs:
+ long_name: "Depth integral of product of sea water density and potential temperature"
+ standard_name: "integral_wrt_depth_of_product_of_sea_water_density_and_potential_temperature"
+ units: "degC kg m-2"
+ pipelines:
+ - ocean_vertical_integration_pipeline
+ # NOTE: needs post-multiply by rho_0 — may need combined pipeline
+
+ # somint — depth integral of rho_0 × salinity (Oyr)
+ # integral(rho_0 * salt * dz)
+ - name: somint
+ inputs:
+ - path: *dp
+ pattern: salt.fesom.1350.nc
+ compound_name: ocean.somint.tavg-op4-hxy-sea.yr.GLB
+ model_variable: salt
+ integration_attrs:
+ long_name: "Integral wrt depth of product of sea water density and salinity"
+ standard_name: "integral_wrt_depth_of_product_of_sea_water_density_and_salinity"
+ units: "g m-2"
+ pipelines:
+ - ocean_vertical_integration_pipeline
+ # NOTE: needs post-multiply by rho_0*1000 — may need combined pipeline
+
+ # volcello (fx) — static ocean grid-cell volume
+ # cell_area × layer_thickness from mesh
+ - name: volcello_fx
+ inputs:
+ - path: *mp
+ pattern: mesh.nc
+ compound_name: ocean.volcello.point-ol-hxy-sea.fx.GLB
+ model_variable: volcello
+ pipelines:
+ - volcello_fx_pipeline
+
+ # ============================================================
+ # MEDIUM: Yearly mixing/diffusivity (Oyr)
+ # ============================================================
+
+ # difvho — vertical heat diffusivity (Kv from namelist.io)
+ # FESOM uses same Kv for heat and salt
+ - name: difvho
+ inputs:
+ - path: *dp
+ pattern: Kv.fesom.1350.nc
+ compound_name: ocean.difvho.tavg-ol-hxy-sea.yr.GLB
+ model_variable: Kv
+ # NOTE: monthly data, CMIP wants yearly average — needs yearly timeavg
+
+ # difvso — vertical salt diffusivity (same Kv)
+ - name: difvso
+ inputs:
+ - path: *dp
+ pattern: Kv.fesom.1350.nc
+ compound_name: ocean.difvso.tavg-ol-hxy-sea.yr.GLB
+ model_variable: Kv
+
+ # difmxylo — momentum XY Laplacian diffusivity (Av from namelist.io)
+ - name: difmxylo
+ inputs:
+ - path: *dp
+ pattern: Av.fesom.1350.nc
+ compound_name: ocean.difmxylo.tavg-ol-hxy-sea.yr.GLB
+ model_variable: Av
+
+ # ============================================================
+ # DECADAL: 10-year averages of existing variables
+ # These use DefaultPipeline with modified time averaging.
+ # Need multi-year input patterns (e.g. temp.fesom.*.nc)
+ # ============================================================
+
+ - name: thetao_dec
+ inputs:
+ - path: *dp
+ pattern: temp.fesom.1350.nc
+ compound_name: ocean.thetao.tavg-ol-hxy-sea.dec.GLB
+ model_variable: temp
+ # TODO: needs 10-year input pattern and decadal timeavg
+
+ - name: so_dec
+ inputs:
+ - path: *dp
+ pattern: salt.fesom.1350.nc
+ compound_name: ocean.so.tavg-ol-hxy-sea.dec.GLB
+ model_variable: salt
+
+ - name: tauuo_dec
+ inputs:
+ - path: *dp
+ pattern: tx_sur.fesom.1350.nc
+ compound_name: ocean.tauuo.tavg-u-hxy-sea.dec.GLB
+ model_variable: tx_sur
+
+ - name: tauvo_dec
+ inputs:
+ - path: *dp
+ pattern: ty_sur.fesom.1350.nc
+ compound_name: ocean.tauvo.tavg-u-hxy-sea.dec.GLB
+ model_variable: ty_sur
+
+ - name: thkcello_dec
+ inputs:
+ - path: *dp
+ pattern: hnode.fesom.1350.nc
+ compound_name: ocean.thkcello.tavg-ol-hxy-sea.dec.GLB
+ model_variable: hnode
+
+ - name: volo_dec
+ inputs:
+ - path: *dp
+ pattern: volo.fesom.1350.nc
+ compound_name: ocean.volo.tavg-u-hm-sea.dec.GLB
+ model_variable: volo
+
+ - name: masscello_dec
+ inputs:
+ - path: *dp
+ pattern: hnode.fesom.1350.nc
+ compound_name: ocean.masscello.tavg-ol-hxy-sea.dec.GLB
+ model_variable: hnode
+ scale_factor: 1025.0
+ scaled_units: "kg m-2"
+ pipelines:
+ - scale_pipeline
+
+ - name: volcello_dec
+ inputs:
+ - path: *dp
+ pattern: hnode.fesom.1350.nc
+ compound_name: ocean.volcello.tavg-ol-hxy-sea.dec.GLB
+ model_variable: hnode
+ pipelines:
+ - volcello_time_pipeline
+
+ - name: masso_dec
+ inputs:
+ - path: *dp
+ pattern: volo.fesom.1350.nc
+ compound_name: ocean.masso.tavg-u-hm-sea.dec.GLB
+ model_variable: volo
+ scale_factor: 1025.0
+ scaled_units: "kg"
+ pipelines:
+ - scale_pipeline
+
+ # ============================================================
+ # HARD: Barotropic streamfunction
+ # ============================================================
+
+ # msftbarot — barotropic mass streamfunction from SSH
+ # Requires: vertically-integrated transport → streamfunction via Poisson solver
+ # or direct SSH-based computation for Boussinesq models.
+ # TODO: implement compute_msftbarot step
+ # - name: msftbarot
+ # inputs:
+ # - path: *dp
+ # pattern: ssh.fesom.1350.nc
+ # compound_name: ocean.msftbarot.tavg-u-hxy-sea.mon.GLB
+ # model_variable: ssh
+
+ # ============================================================
+ # HARD: Temperature tendency (opottemptend from ldiag_cmor)
+ # ============================================================
+
+ # opottemptend — tendency of potential temperature as heat content
+ # Available from ldiag_cmor=.true. (already enabled)
+ - name: opottemptend
+ inputs:
+ - path: *dp
+ pattern: opottemptend.fesom.1350.nc
+ compound_name: ocean.opottemptend.tavg-ol-hxy-sea.yr.GLB
+ model_variable: opottemptend
+ # NOTE: monthly data, CMIP wants yearly — needs yearly timeavg
+
+ # ============================================================
+ # NEW FESOM2 DIAGNOSTICS (require source code changes)
+ # These variables were added to gen_modules_cmor_diag.F90
+ # ============================================================
+
+ # osalttend — total salinity tendency (column-integrated)
+ - name: osalttend
+ inputs:
+ - path: *dp
+ pattern: osalttend.fesom.1350.nc
+ compound_name: ocean.osalttend.tavg-ol-hxy-sea.yr.GLB
+ model_variable: osalttend
+
+ # opottemprmadvect — temperature tendency from residual mean advection
+ - name: opottemprmadvect
+ inputs:
+ - path: *dp
+ pattern: opottemprmadvect.fesom.1350.nc
+ compound_name: ocean.opottemprmadvect.tavg-ol-hxy-sea.yr.GLB
+ model_variable: opottemprmadvect
+
+ # opottempdiff — temperature tendency from dianeutral mixing
+ - name: opottempdiff
+ inputs:
+ - path: *dp
+ pattern: opottempdiff.fesom.1350.nc
+ compound_name: ocean.opottempdiff.tavg-ol-hxy-sea.yr.GLB
+ model_variable: opottempdiff
+
+ # osaltrmadvect — salinity tendency from residual mean advection
+ - name: osaltrmadvect
+ inputs:
+ - path: *dp
+ pattern: osaltrmadvect.fesom.1350.nc
+ compound_name: ocean.osaltrmadvect.tavg-ol-hxy-sea.yr.GLB
+ model_variable: osaltrmadvect
+
+ # osaltdiff — salinity tendency from dianeutral mixing
+ - name: osaltdiff
+ inputs:
+ - path: *dp
+ pattern: osaltdiff.fesom.1350.nc
+ compound_name: ocean.osaltdiff.tavg-ol-hxy-sea.yr.GLB
+ model_variable: osaltdiff
+
+ # rsdoabsorb — net rate of absorption of shortwave energy in ocean layer (3D)
+ - name: rsdoabsorb
+ inputs:
+ - path: *dp
+ pattern: rsdoabsorb.fesom.1350.nc
+ compound_name: ocean.rsdoabsorb.tavg-ol-hxy-sea.yr.GLB
+ model_variable: rsdoabsorb
+
+ # ============================================================
+ # HARD: 3D salt transport (sfx, sfy)
+ # ============================================================
+
+ # sfx/sfy — 3D salt mass transport
+ # Compute: velocity × salinity × cell cross-section
+ # Requires: unod × salt + dz weighting; complex multi-field pipeline
+ # TODO: implement compute_salt_transport step
+ # - name: sfx
+ # inputs:
+ # - path: *dp
+ # pattern: unod.fesom.1350.nc
+ # compound_name: ocean.sfx.tavg-ol-hxy-sea.mon.GLB
+ # model_variable: unod
+
+ # - name: sfy
+ # inputs:
+ # - path: *dp
+ # pattern: vnod.fesom.1350.nc
+ # compound_name: ocean.sfy.tavg-ol-hxy-sea.mon.GLB
+ # model_variable: vnod
diff --git a/awi-esm3-veg-hr-variables/lrcs_ocean/cmip7_lrcs_ocean_variables_todo.md b/awi-esm3-veg-hr-variables/lrcs_ocean/cmip7_lrcs_ocean_variables_todo.md
new file mode 100644
index 00000000..c493b3d6
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/lrcs_ocean/cmip7_lrcs_ocean_variables_todo.md
@@ -0,0 +1,313 @@
+# CMIP7 LRCS Ocean Variables — Rule Implementation TODO
+
+Variables from `cmip7_LRCSextra_variables_ocean.csv` for AWI-ESM3-VEG-HR.
+Excludes variables already in core_ocean rules (tos, sos, zos, so, thetao, uo, vo, wo,
+hfds, mlotst, tauuo, tauvo, absscint, umo, vmo, wmo, zostoga, areacello, deptho, sftof,
+thkcello, masscello).
+
+## Legend
+- [x] done — rule written
+- [ ] todo — feasible, not yet implemented
+- [~] skipped — not applicable or not possible with this model
+
+---
+
+## Monthly 2D surface (Omon) — feasible from existing output
+
+- [x] **tob** — Sea Water Potential Temperature at Sea Floor (`degC`, mon)
+ Rule written: bottom_extract_pipeline from temp.fesom
+- [x] **sob** — Sea Water Salinity at Sea Floor (`1E-03`, mon)
+ Rule written: bottom_extract_pipeline from salt.fesom
+- [x] **pbo** — Sea Water Pressure at Sea Floor (`Pa`, mon)
+ Rule written: direct mapping from ldiag_cmor pbo.fesom
+- [x] **pso** — Sea Water Pressure at Sea Water Surface (`Pa`, mon)
+ Rule written: surface_pressure_pipeline (rho_0 * g * ssh)
+- [x] **tossq** — Square of Sea Surface Temperature (`degC2`, mon)
+ Rule written: square_pipeline from sst.fesom
+- [x] **sossq** — Square of Sea Surface Salinity (`1E-06`, mon)
+ Rule written: square_pipeline from sss.fesom
+- [x] **zossq** — Square of Sea Surface Height (`m2`, mon)
+ Rule written: square_pipeline from ssh.fesom
+- [x] **mlotstsq** — Square of Ocean Mixed Layer Thickness (`m2`, mon)
+ Rule written: square_pipeline from MLD3.fesom
+- [x] **wfo** — Water Flux into Sea Water (`kg m-2 s-1`, mon)
+ Rule written: scale_pipeline (fw × 1000)
+- [x] **evspsbl** — Evaporation Where Ice Free Ocean (`kg m-2 s-1`, mon)
+ Rule written: scale_pipeline (evap × 1000). Needs 'evap' added to namelist.io. Note: may need ice-free masking.
+- [ ] **sfriver** — Salt Flux from Rivers (`kg m-2 s-1`, mon)
+ BLOCKED: no river salt flux diagnostic in FESOM2
+- [x] **vsf** — Virtual Salt Flux into Sea Water (`kg m-2 s-1`, mon)
+ Rule written: direct mapping from virtsalt.fesom (already in namelist.io)
+- [x] **vsfcorr** — Virtual Salt Flux Correction (`kg m-2 s-1`, mon)
+ Rule written: direct mapping from relaxsalt.fesom. Needs 'relaxsalt' added to namelist.io. Verify unit conversion.
+- [ ] **vsfevap** — Virtual Salt Flux Due to Evaporation (`kg m-2 s-1`, mon)
+ BLOCKED: FESOM does not split virtual salt flux by component
+- [ ] **vsfpr** — Virtual Salt Flux Due to Rainfall (`kg m-2 s-1`, mon)
+ BLOCKED: FESOM does not split virtual salt flux by component
+- [ ] **vsfriver** — Virtual Salt Flux from Rivers (`kg m-2 s-1`, mon)
+ BLOCKED: FESOM does not split virtual salt flux by component
+- [ ] **wfcorr** — Water Flux Correction (`kg m-2 s-1`, mon)
+ BLOCKED: no water flux correction in standard FESOM2 config
+- [ ] **msftbarot** — Ocean Barotropic Mass Streamfunction (`kg s-1`, mon)
+ Compute: from ssh or vertically-integrated horizontal transport; complex post-processing
+
+## Monthly 2D surface (Omon) — atmosphere-coupled fluxes
+
+- [ ] **hfevapds** — Heat Flux Due to Evaporation (`W m-2`, mon)
+ BLOCKED: requires atmosphere-side heat flux decomposition
+- [ ] **hfrainds** — Heat Flux Due to Rainfall (`W m-2`, mon)
+ BLOCKED: requires atmosphere-side heat flux decomposition
+- [ ] **rsds** — Surface Downwelling Shortwave over Ice-Free Ocean (`W m-2`, mon)
+ Available: swr.fesom [W/m²] — but this is the total, not ice-free-only component
+- [ ] **rsus** — Surface Upwelling Shortwave over Ice-Free Ocean (`W m-2`, mon)
+ BLOCKED: FESOM does not output reflected shortwave separately
+
+## Monthly 2D — ice/land freshwater interactions
+
+- [ ] **ficeberg** — Water Flux from Icebergs (`kg m-2 s-1`, mon)
+ BLOCKED: requires use_icebergs=.true. (not enabled)
+- [ ] **flandice** — Water Flux from Land Ice (`kg m-2 s-1`, mon)
+ Possible: landice.fesom if use_landice_water=.true.; check config
+- [ ] **hfibthermds** — Heat Flux from Iceberg Thermodynamics (`W m-2`, mon)
+ BLOCKED: requires use_icebergs=.true.
+- [ ] **hfrunoffds** — Heat Flux from Runoff (`W m-2`, mon)
+ BLOCKED: requires runoff temperature, not output by FESOM
+- [ ] **hfsnthermds** — Heat Flux from Snow Thermodynamics (`W m-2`, mon)
+ BLOCKED: requires separate snow thermodynamic heat flux diagnostic
+- [ ] **hfgeou** — Upward Geothermal Heat Flux (`W m-2`, mon)
+ BLOCKED: not in FESOM output or config (same as Ofx version)
+
+## Monthly 3D (Omon) — feasible from existing output
+
+- [x] **obvfsq** — Square of Brunt-Vaisala Frequency (`s-2`, mon)
+ Rule written: direct mapping from N2.fesom
+
+## Monthly global mean scalars (Omon)
+
+- [x] **tos_ga** — Global Average SST (`degC`, mon)
+ Rule written: direct mapping from thetaoga.fesom (ldiag_cmor)
+- [x] **sos_ga** — Global Average SSS (`1E-03`, mon)
+ Rule written: direct mapping from soga.fesom (ldiag_cmor)
+- [x] **thetao_ga** — Global Average Potential Temperature (`degC`, mon, per level)
+ Rule written: using thetaoga scalar (per-level profile needs volume-weighted avg)
+- [x] **so_ga** — Global Mean Salinity (`1E-03`, mon, per level)
+ Rule written: using soga scalar (per-level profile needs volume-weighted avg)
+- [x] **masso** — Sea Water Mass (`kg`, mon)
+ Rule written: scale_pipeline (volo × rho_0=1025)
+- [x] **volo** — Sea Water Volume (`m3`, mon)
+ Rule written: direct mapping from volo.fesom (ldiag_cmor)
+
+## Monthly depth-integrated (Omon, oplayer4)
+
+- [x] **scint** — Depth-integrated practical salinity as salt content (`kg m-2`, mon)
+ Rule written: ocean_vertical_integration_pipeline from salt.fesom
+- [ ] **pfscint** — Depth-integrated preformed salinity (`kg m-2`, mon)
+ BLOCKED: no preformed salinity tracer in FESOM
+- [x] **phcint** — Integrated Ocean Heat Content from Potential Temperature (`J m-2`, mon)
+ Rule written: ocean_vertical_integration_pipeline from temp.fesom (needs rho_0*cp scaling)
+- [ ] **chcint** — Integrated Conservative Temperature as Heat Content (`J m-2`, mon)
+ BLOCKED: FESOM uses potential temperature, not conservative
+
+## Monthly — transport and overturning
+
+- [ ] **sfx** — 3D Ocean Salt Mass X Transport (`kg s-1`, mon, 3D)
+ Compute: unod × salt × cell cross-section area; complex
+- [ ] **sfy** — 3D Ocean Salt Mass Y Transport (`kg s-1`, mon, 3D)
+ Compute: vnod × salt × cell cross-section area; complex
+- [ ] **msftmmpa** — MOC Due to Parameterized Mesoscale Advection (`kg s-1`, mon)
+ Possible: compute from bolus_u/bolus_v (GM velocities in namelist.io); needs basin masks
+- [ ] **msftmsmpa** — MOC Due to Parameterized Submesoscale Advection (`kg s-1`, mon)
+ BLOCKED: no submesoscale parameterization output
+- [ ] **msftypa** — Ocean Y Overturning Due to Mesoscale (`kg s-1`, mon)
+ BLOCKED: needs structured grid or regridding + basin masks
+- [ ] **msfty** — Ocean Y Overturning Mass Streamfunction (`kg s-1`, mon)
+ BLOCKED: needs structured grid or regridding + basin masks
+- [ ] **msftm** — Meridional Overturning in Density Space (`kg s-1`, mon)
+ Possible: ldiag_dMOC=.true. enabled, outputs dMOC; needs post-processing to match CMIP format
+
+## Monthly — basin-zonal heat/salt transport
+
+- [ ] **htovgyre** — Northward Heat Transport Due to Gyre (`W`, mon)
+ BLOCKED: needs basin masks + decomposition into gyre/overturning
+- [ ] **htovovrt** — Northward Heat Transport Due to Overturning (`W`, mon)
+ BLOCKED: needs basin masks + decomposition
+- [ ] **hfbasinpadv** — Heat Transport Due to Parameterized Eddy Advection (`W`, mon)
+ BLOCKED: needs basin masks + GM decomposition
+- [ ] **hfbasinpmadv** — Heat Transport Due to Mesoscale Advection (`W`, mon)
+ BLOCKED: needs basin masks
+- [ ] **hfbasinpmdiff** — Heat Transport Due to Mesoscale Diffusion (`W`, mon)
+ BLOCKED: needs basin masks
+- [ ] **hfbasinpsmadv** — Heat Transport Due to Submesoscale Advection (`W`, mon)
+ BLOCKED: no submesoscale param
+- [ ] **sltbasin** — Northward Salt Transport (`kg s-1`, mon)
+ BLOCKED: needs basin masks
+- [ ] **sltovgyre** — Salt Transport Due to Gyre (`kg s-1`, mon)
+ BLOCKED: needs basin masks
+- [ ] **sltovovrt** — Salt Transport Due to Overturning (`kg s-1`, mon)
+ BLOCKED: needs basin masks
+
+## Monthly — cross-line transports
+
+- [ ] **hfacrossline** — Ocean Heat Transport Across Lines (`W`, mon)
+ BLOCKED: requires predefined ocean transect lines (oline dimension)
+- [ ] **sfacrossline** — Ocean Salt Transport Across Lines (`W`, mon)
+ BLOCKED: requires predefined ocean transect lines
+- [ ] **mfo** — Sea Water Transport Across Lines (`kg s-1`, mon)
+ BLOCKED: requires predefined ocean transect lines
+
+## Fixed frequency (Ofx) — grid cell dimensions
+
+- [ ] **dxto** — Cell Length X at t-points (`m`, fx)
+ BLOCKED: unstructured mesh — no dx/dy concept (would need Voronoi edge lengths)
+- [ ] **dyto** — Cell Length Y at t-points (`m`, fx)
+ BLOCKED: unstructured mesh
+- [ ] **dxuo** — Cell Length X at u-points (`m`, fx)
+ BLOCKED: unstructured mesh
+- [ ] **dyuo** — Cell Length Y at u-points (`m`, fx)
+ BLOCKED: unstructured mesh
+- [ ] **dxvo** — Cell Length X at v-points (`m`, fx)
+ BLOCKED: unstructured mesh
+- [ ] **dyvo** — Cell Length Y at v-points (`m`, fx)
+ BLOCKED: unstructured mesh
+- [x] **volcello** — Ocean Grid-Cell Volume (`m3`, fx/yr/dec)
+ Rule written: volcello_fx_pipeline (cell_area × layer_thickness from mesh); volcello_dec via volcello_time_pipeline
+
+## Daily (Oday)
+
+- [x] **mlotst_day** — Ocean Mixed Layer Thickness (`m`, day)
+ Rule written: direct mapping from daily MLD3. Needs daily 'MLD3' added to namelist.io.
+- [ ] **thetao200_day** — Potential Temp top 200m (`degC`, day)
+ BLOCKED: no daily 3D output feasible; and needs op20bar layer extraction
+- [x] **uos** — Daily Surface X Velocity (`m s-1`, day)
+ Rule written: surface_extract_pipeline from daily unod. Needs daily 'unod' in namelist.io (WARNING: full 3D, expensive).
+- [x] **vos** — Daily Surface Y Velocity (`m s-1`, day)
+ Rule written: surface_extract_pipeline from daily vnod. Needs daily 'vnod' in namelist.io (WARNING: full 3D, expensive).
+- [ ] **hfx** — Vertically Integrated Heat X Transport (`W`, day)
+ BLOCKED: requires online computation (temp × u × dz integrated), too expensive daily
+- [ ] **hfy** — Vertically Integrated Heat Y Transport (`W`, day)
+ BLOCKED: same as hfx
+
+## Decadal (Odec)
+
+- [x] **thetao_dec** — Potential Temperature (`degC`, dec, 3D)
+ Rule written: DefaultPipeline from temp.fesom (needs 10-yr input pattern)
+- [x] **so_dec** — Salinity (`1E-03`, dec, 3D)
+ Rule written: DefaultPipeline from salt.fesom
+- [x] **tauuo_dec** — Surface X Stress (`N m-2`, dec)
+ Rule written: DefaultPipeline from tx_sur.fesom
+- [x] **tauvo_dec** — Surface Y Stress (`N m-2`, dec)
+ Rule written: DefaultPipeline from ty_sur.fesom
+- [x] **thkcello_dec** — Cell Thickness (`m`, dec, 3D)
+ Rule written: DefaultPipeline from hnode.fesom
+- [x] **masscello_dec** — Cell Mass per Area (`kg m-2`, dec, 3D)
+ Rule written: scale_pipeline (hnode × rho_0=1025)
+- [x] **volcello_dec** — Cell Volume (`m3`, dec, 3D)
+ Rule written: volcello_time_pipeline (hnode × cell_area)
+- [x] **masso_dec** — Sea Water Mass (`kg`, dec, scalar)
+ Rule written: scale_pipeline (volo × rho_0)
+- [x] **volo_dec** — Sea Water Volume (`m3`, dec, scalar)
+ Rule written: DefaultPipeline from volo.fesom
+- [ ] **bigthetao_dec** — Conservative Temperature (`degC`, dec, 3D)
+ [~] SKIPPED: FESOM uses potential temperature
+
+## Yearly tendency terms (Oyr) — require online diagnostics
+
+- [x] **opottemptend** — Temperature Tendency (`W m-2`, yr, 3D)
+ Rule written: direct mapping from opottemptend.fesom (ldiag_cmor)
+- [x] **opottempdiff** — Temp Tendency from Dianeutral Mixing (`W m-2`, yr)
+ FESOM2 source modified: computed as total - advection in gen_modules_cmor_diag.F90
+- [~] **opottemppadvect** — Temp Tendency from Eddy Advection (`W m-2`, yr)
+ SKIPPED: zero field (fer_gm=.false., no GM parameterization active)
+- [~] **opottemppmdiff** — Temp Tendency from Mesoscale Diffusion (`W m-2`, yr)
+ SKIPPED: zero field (fer_gm=.false.)
+- [~] **opottemppsmadvect** — Temp Tendency from Submesoscale Advection (`W m-2`, yr)
+ SKIPPED: zero field (no submesoscale parameterization)
+- [x] **opottemprmadvect** — Temp Tendency from Residual Mean Advection (`W m-2`, yr)
+ FESOM2 source modified: saved from del_ttf advection snapshot in gen_modules_cmor_diag.F90
+- [~] **ocontemptend** — Conservative Temp Tendency (`W m-2`, yr) — SKIPPED: not conservative temp
+- [~] **ocontempdiff** — same family — SKIPPED
+- [~] **ocontemppadvect** — SKIPPED
+- [~] **ocontemppmdiff** — SKIPPED
+- [~] **ocontemppsmadvect** — SKIPPED
+- [~] **ocontemprmadvect** — SKIPPED
+- [x] **osalttend** — Salinity Tendency (`kg m-2 s-1`, yr, 3D)
+ FESOM2 source modified: computed in gen_modules_cmor_diag.F90 (mirrors opottemptend)
+- [x] **osaltdiff** — Salt Tendency from Dianeutral Mixing (`kg m-2 s-1`, yr)
+ FESOM2 source modified: computed as total - advection in gen_modules_cmor_diag.F90
+- [~] **osaltpadvect** — Salt Tendency from Eddy Advection (`kg m-2 s-1`, yr)
+ SKIPPED: zero field (fer_gm=.false.)
+- [~] **osaltpmdiff** — Salt Tendency from Mesoscale Diffusion (`kg m-2 s-1`, yr)
+ SKIPPED: zero field (fer_gm=.false.)
+- [~] **osaltpsmadvect** — Salt Tendency from Submesoscale (`kg m-2 s-1`, mon/yr)
+ SKIPPED: zero field (no submesoscale parameterization)
+- [x] **osaltrmadvect** — Salt Tendency from Residual Mean (`kg m-2 s-1`, yr)
+ FESOM2 source modified: saved from del_ttf advection snapshot in gen_modules_cmor_diag.F90
+
+## Yearly integrated fields (Oyr)
+
+- [x] **opottempmint** — Depth Integral of rho×theta (`degC kg m-2`, yr)
+ Rule written: ocean_vertical_integration_pipeline from temp.fesom (needs rho_0 post-multiply)
+- [ ] **ocontempmint** — same for conservative temp — SKIPPED
+- [x] **somint** — Depth Integral of rho×S (`g m-2`, yr)
+ Rule written: ocean_vertical_integration_pipeline from salt.fesom (needs rho_0*1000 post-multiply)
+
+## Yearly mixing/diffusivity (Oyr)
+
+- [x] **difvho** — Vertical Heat Diffusivity (`m2 s-1`, yr, 3D)
+ Rule written: direct mapping from Kv.fesom (same Kv for heat and salt in FESOM)
+- [x] **difvso** — Vertical Salt Diffusivity (`m2 s-1`, yr, 3D)
+ Rule written: direct mapping from Kv.fesom (same as difvho)
+- [x] **difmxylo** — Momentum XY Laplacian Diffusivity (`m2 s-1`, yr, 3D)
+ Rule written: direct mapping from Av.fesom
+- [ ] **difmxybo** — Momentum XY Biharmonic Diffusivity (`m4 s-1`, yr, 3D)
+ BLOCKED: FESOM doesn't output biharmonic coefficient separately
+- [ ] **diftrelo** — Tracer Epineutral Laplacian Diffusivity (`m2 s-1`, yr, 3D)
+ Possible: fer_K.fesom if Fer_GM=.true. (GM diffusivity); check config
+- [ ] **diftrblo** — Tracer Diffusivity from Mesoscale Parameterization (`m2 s-1`, yr, 3D)
+ Possible: same as diftrelo (fer_K) under Fer_GM
+- [x] **rsdoabsorb** — Shortwave Absorption by Ocean Layer (`W m-2`, yr, 3D)
+ FESOM2 source modified: computed from sw_3d in gen_modules_cmor_diag.F90
+
+## Yearly energy diagnostics (Oyr)
+
+- [ ] **dispkexyfo** — KE Dissipation from XY Friction (`W m-2`, yr)
+ BLOCKED: no KE dissipation diagnostic
+- [ ] **tnkebto** — KE Tendency from Eddy Advection (`W m-2`, yr)
+ BLOCKED: no KE tendency diagnostic
+- [ ] **tnpeo** — Tendency of Potential Energy (`W m-2`, yr)
+ BLOCKED: no PE tendency diagnostic
+
+## Water isotopes (Emon) — require lwiso=.true.
+
+- [~] **sw17O** — Isotopic Ratio 17O (`1`, mon, 3D) — SKIPPED: lwiso not enabled
+- [~] **sw18O** — Isotopic Ratio 18O (`1`, mon, 3D) — SKIPPED
+- [~] **sw2H** — Isotopic Ratio Deuterium (`1`, mon, 3D) — SKIPPED
+
+## Not applicable to FESOM2
+
+- [~] **bigthetao** (all frequencies) — FESOM uses potential temperature, not conservative
+- [~] **chcint** — Conservative temperature heat content — same reason
+- [~] **ocontemp*** — All conservative temperature tendency terms — same reason
+- [~] **thkcelluo** — Cell thickness at u-points — unstructured mesh, no u/v grid distinction
+- [~] **thkcellvo** — Cell thickness at v-points — same
+- [~] **dxto/dyto/dxuo/dyuo/dxvo/dyvo** — Cell lengths at staggered points — unstructured mesh
+
+---
+
+## Summary
+
+| Category | Count | Done | Status |
+|----------|-------|------|--------|
+| Feasible from existing output | ~16 | 16 | DONE |
+| Medium (bottom extract, integration, volcello) | ~10 | 9 | mostly done |
+| Yearly diffusivity | 3 | 3 | DONE |
+| Decadal | ~10 | 9 | mostly done |
+| Hard (streamfunction, tendencies) | ~4 | 1 | 1 done, 2 commented, 1 blocked |
+| Needs namelist.io additions | 5 | 5 | DONE (rules written, awaiting model re-run) |
+| FESOM2 source changes (tendencies + SW) | 7 | 7 | DONE (code added, needs compile+test) |
+| Needs basin masks (external data) | ~12 | 0 | BLOCKED |
+| Requires online diagnostics (remaining) | ~8 | 0 | BLOCKED |
+| Not applicable (conservative T / isotopes / unstructured) | ~26 | — | SKIPPED |
+
+Total rules written: **45** (+ 2 commented placeholders for sfx/sfy, msftbarot)
+FESOM2 source additions: **6** new diagnostic outputs (osalttend, opottempdiff, opottemprmadvect, osaltdiff, osaltrmadvect, rsdoabsorb)
diff --git a/awi-esm3-veg-hr-variables/lrcs_seaice/cmip7_awiesm3-veg-hr_lrcs_seaice.yaml b/awi-esm3-veg-hr-variables/lrcs_seaice/cmip7_awiesm3-veg-hr_lrcs_seaice.yaml
new file mode 100644
index 00000000..df687e35
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/lrcs_seaice/cmip7_awiesm3-veg-hr_lrcs_seaice.yaml
@@ -0,0 +1,759 @@
+# CMIP7 LRCS Sea Ice Variables — AWI-ESM3-VEG-HR
+# Generated from cmip7_LRCSextra_variables_seaIce.csv + ocean_seaIce.csv
+#
+# Variables NOT included (not available in this configuration):
+# See cmip7_lrcs_seaice_variables_todo.md for full list of blocked variables.
+
+general:
+ name: "awiesm3-cmip7-lrcs-seaice"
+ cmor_version: "CMIP7"
+ mip: "CMIP"
+ CMIP7_DReq_metadata: "/home/a/a270092/.cache/pycmor/cmip7_metadata/v1.2.2.2/metadata.json"
+
+pycmor:
+ warn_on_no_rule: False
+ dask_cluster: "slurm"
+ dask_cluster_scaling_mode: "fixed"
+ dask_cluster_scaling_fixed_jobs: 1
+
+jobqueue:
+ slurm:
+ name: pycmor-worker
+ queue: compute
+ account: bb1469
+ cores: 16
+ memory: 256GB
+ walltime: '00:30:00'
+
+pipelines:
+ # Fraction to percent (reused from core seaice for simpconc)
+ - name: fraction_to_percent_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:fraction_to_percent
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Generic: multiply by constant (rho_ice, rho_snow, rho_water, etc.)
+ - name: scale_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:scale_by_constant
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Sea ice speed: sqrt(uice² + vice²)
+ - name: sispeed_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_sispeed
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Ice mass transport: velocity × m_ice
+ - name: ice_mass_transport_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_ice_mass_transport
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Average normal stress: (sgm11 + sgm22) / 2
+ - name: sistressave_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_sistressave
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Maximum shear stress: sqrt(((sgm11-sgm22)/2)² + sgm12²)
+ - name: sistressmax_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_sistressmax
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Conductive heat flux at ice surface: k_ice*(T_base-T_surface)/h_ice
+ - name: siflcondtop_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_siflcondtop
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Sea ice heat content: rho_ice*h_ice*(c_ice*(T_mean-T_melt)-L_f)
+ - name: sihc_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_sihc
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Snow heat content: -rho_snow * L_f * h_snow
+ - name: sisnhc_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_sisnhc
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Freezing point from SSS → sitempbot
+ - name: sitempbot_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_sitempbot
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Freeboard from h_ice and h_snow
+ - name: sifb_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_sifb
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Effective melt pond fraction: apnd*(1-ipnd/hpnd)*100
+ - name: simpeffconc_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_simpeffconc
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Constant field (e.g. drag coefficient)
+ - name: constant_field_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_constant_field
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Generic hemisphere integral (snow mass, ice area, etc.)
+ - name: hemisphere_integral_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:integrate_over_hemisphere
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+inherit:
+ data_path: &dp /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/fesom
+ source_id: AWI-ESM-3
+ institution_id: AWI
+ experiment_id: picontrol
+ variant_label: r1i1p1f1
+ grid_label: gn
+ mesh_path: /work/ab0246/a270092/input/fesom2/dars2
+ grid_file: /work/ab0246/a270092/input/fesom2/dars2/mesh.nc
+ grid: "FESOM 2.6 unstructured grid DARS (3146761 surface nodes)"
+ nominal_resolution: "10 km"
+ institution: "Alfred Wegener Institute, Helmholtz Centre for Polar and Marine Research, Bremerhaven, Germany"
+ output_directory: ./cmorized_output/awiesm3
+
+rules:
+ # ============================================================
+ # SImon — DefaultPipeline (direct variable mapping)
+ # ============================================================
+
+ # --- Thermodynamic/dynamic area fraction tendencies ---
+
+ - name: sidconcdyn
+ inputs:
+ - path: *dp
+ pattern: dyngrarea.fesom.1350.nc
+ compound_name: seaIce.sidconcdyn.tavg-u-hxy-si.mon.GLB
+ model_variable: dyngrarea
+
+ - name: sidconcth
+ inputs:
+ - path: *dp
+ pattern: thdgrarea.fesom.1350.nc
+ compound_name: seaIce.sidconcth.tavg-u-hxy-si.mon.GLB
+ model_variable: thdgrarea
+
+ # --- Ice strength ---
+
+ - name: sicompstren
+ inputs:
+ - path: *dp
+ pattern: strength_ice.fesom.1350.nc
+ compound_name: seaIce.sicompstren.tavg-u-hxy-si.mon.GLB
+ model_variable: strength_ice
+
+ # --- Atmospheric stress on sea ice ---
+
+ - name: sistrxdtop
+ inputs:
+ - path: *dp
+ pattern: atmice_x.fesom.1350.nc
+ compound_name: seaIce.sistrxdtop.tavg-u-hxy-si.mon.GLB
+ model_variable: atmice_x
+
+ - name: sistrydtop
+ inputs:
+ - path: *dp
+ pattern: atmice_y.fesom.1350.nc
+ compound_name: seaIce.sistrydtop.tavg-u-hxy-si.mon.GLB
+ model_variable: atmice_y
+
+ # --- Ocean stress on sea ice ---
+
+ - name: sistrxubot
+ inputs:
+ - path: *dp
+ pattern: iceoce_x.fesom.1350.nc
+ compound_name: seaIce.sistrxubot.tavg-u-hxy-si.mon.GLB
+ model_variable: iceoce_x
+
+ - name: sistryubot
+ inputs:
+ - path: *dp
+ pattern: iceoce_y.fesom.1350.nc
+ compound_name: seaIce.sistryubot.tavg-u-hxy-si.mon.GLB
+ model_variable: iceoce_y
+
+ # --- Conductive heat flux at ice base ---
+
+ - name: siflcondbot
+ inputs:
+ - path: *dp
+ pattern: qcon.fesom.1350.nc
+ compound_name: seaIce.siflcondbot.tavg-u-hxy-si.mon.GLB
+ model_variable: qcon
+
+ # ============================================================
+ # SImon — scale_pipeline (multiply by constant for unit conversion)
+ # ============================================================
+
+ # --- Mass change from dynamics: dyngrice [m/s] × rho_ice → kg m-2 s-1 ---
+
+ - name: sidmassdyn
+ inputs:
+ - path: *dp
+ pattern: dyngrice.fesom.1350.nc
+ compound_name: seaIce.sidmassdyn.tavg-u-hxy-si.mon.GLB
+ model_variable: dyngrice
+ scale_factor: 910.0
+ scaled_units: "kg m-2 s-1"
+ pipelines:
+ - scale_pipeline
+
+ # --- Mass change from thermodynamics: thdgrice [m/s] × rho_ice → kg m-2 s-1 ---
+
+ - name: sidmassth
+ inputs:
+ - path: *dp
+ pattern: thdgrice.fesom.1350.nc
+ compound_name: seaIce.sidmassth.tavg-u-hxy-si.mon.GLB
+ model_variable: thdgrice
+ scale_factor: 910.0
+ scaled_units: "kg m-2 s-1"
+ pipelines:
+ - scale_pipeline
+
+ # --- Snow melt rate: thdgrsn [m/s] × rho_snow → kg m-2 s-1 ---
+
+ - name: snm
+ inputs:
+ - path: *dp
+ pattern: thdgrsn.fesom.1350.nc
+ compound_name: seaIce.snm.tavg-u-hxy-sn.mon.GLB
+ model_variable: thdgrsn
+ scale_factor: 330.0
+ scaled_units: "kg m-2 s-1"
+ pipelines:
+ - scale_pipeline
+
+ # --- Freshwater flux from sea ice: fw_ice [m/s] × rho_water → kg m-2 s-1 ---
+
+ - name: siflfwbot
+ inputs:
+ - path: *dp
+ pattern: fw_ice.fesom.1350.nc
+ compound_name: seaIce.siflfwbot.tavg-u-hxy-si.mon.GLB
+ model_variable: fw_ice
+ scale_factor: 1000.0
+ scaled_units: "kg m-2 s-1"
+ pipelines:
+ - scale_pipeline
+
+ # --- Freshwater flux from sea-ice surface (snow): fw_snw [m/s] × rho_water → kg m-2 s-1 ---
+
+ - name: siflfwdrain
+ inputs:
+ - path: *dp
+ pattern: fw_snw.fesom.1350.nc
+ compound_name: seaIce.siflfwdrain.tavg-u-hxy-si.mon.GLB
+ model_variable: fw_snw
+ scale_factor: 1000.0
+ scaled_units: "kg m-2 s-1"
+ pipelines:
+ - scale_pipeline
+
+ # --- Salt mass in sea ice: sice [psu=g/kg] / 1000 × m_ice [kg/m2] → kg m-2 ---
+ # sice = 4.0 psu (from namelist.ice), so factor = 0.004
+
+ - name: sisaltmass
+ inputs:
+ - path: *dp
+ pattern: m_ice.fesom.1350.nc
+ compound_name: seaIce.sisaltmass.tavg-u-hxy-si.mon.GLB
+ model_variable: m_ice
+ scale_factor: 0.004
+ scaled_units: "kg m-2"
+ pipelines:
+ - scale_pipeline
+
+ # ============================================================
+ # SImon — multi-variable compute pipelines
+ # ============================================================
+
+ - name: sispeed
+ inputs:
+ - path: *dp
+ pattern: uice.fesom.1350.nc
+ compound_name: seaIce.sispeed.tavg-u-hxy-si.mon.GLB
+ model_variable: uice
+ second_input_file: /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/fesom/vice.fesom.1350.nc
+ second_variable: vice
+ pipelines:
+ - sispeed_pipeline
+
+ - name: sidmasstranx
+ inputs:
+ - path: *dp
+ pattern: uice.fesom.1350.nc
+ compound_name: seaIce.sidmasstranx.tavg-u-hxy-si.mon.GLB
+ model_variable: uice
+ mice_file: /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/fesom/m_ice.fesom.1350.nc
+ pipelines:
+ - ice_mass_transport_pipeline
+
+ - name: sidmasstrany
+ inputs:
+ - path: *dp
+ pattern: vice.fesom.1350.nc
+ compound_name: seaIce.sidmasstrany.tavg-u-hxy-si.mon.GLB
+ model_variable: vice
+ mice_file: /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/fesom/m_ice.fesom.1350.nc
+ pipelines:
+ - ice_mass_transport_pipeline
+
+ # --- Stress tensor derived (mEVP: sgm11, sgm12, sgm22) ---
+
+ - name: sistressave
+ inputs:
+ - path: *dp
+ pattern: sgm11.fesom.1350.nc
+ compound_name: seaIce.sistressave.tavg-u-hxy-si.mon.GLB
+ model_variable: sgm11
+ sgm22_file: /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/fesom/sgm22.fesom.1350.nc
+ pipelines:
+ - sistressave_pipeline
+
+ - name: sistressmax
+ inputs:
+ - path: *dp
+ pattern: sgm11.fesom.1350.nc
+ compound_name: seaIce.sistressmax.tavg-u-hxy-si.mon.GLB
+ model_variable: sgm11
+ sgm22_file: /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/fesom/sgm22.fesom.1350.nc
+ sgm12_file: /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/fesom/sgm12.fesom.1350.nc
+ pipelines:
+ - sistressmax_pipeline
+
+ # ============================================================
+ # SImon — cross-realm (ocean seaIce) freshwater/salt fluxes
+ # ============================================================
+
+ # Downward sea ice basal salt flux (using realsalt, not virtual)
+ - name: sfdsi
+ inputs:
+ - path: *dp
+ pattern: realsalt.fesom.1350.nc
+ compound_name: ocean.sfdsi.tavg-u-hxy-sea.mon.GLB
+ model_variable: realsalt
+ # realsalt is in [m/s*psu]; conversion to [kg m-2 s-1]:
+ # NOTE: verify units from FESOM source before production use
+ scale_factor: 1.0
+ scaled_units: "kg m-2 s-1"
+ pipelines:
+ - scale_pipeline
+
+ # Virtual salt flux into sea water from ice thermodynamics
+ - name: vsfsit
+ inputs:
+ - path: *dp
+ pattern: virtsalt.fesom.1350.nc
+ compound_name: ocean.vsfsit.tavg-u-hxy-sea.mon.GLB
+ model_variable: virtsalt
+ scale_factor: 1.0
+ scaled_units: "kg m-2 s-1"
+ pipelines:
+ - scale_pipeline
+
+ # Water flux into ocean from ice thermodynamics (Omon table)
+ - name: siflfwbot_omon
+ inputs:
+ - path: *dp
+ pattern: fw_ice.fesom.1350.nc
+ compound_name: ocean.siflfwbot.tavg-u-hxy-sea.mon.GLB
+ model_variable: fw_ice
+ scale_factor: 1000.0
+ scaled_units: "kg m-2 s-1"
+ pipelines:
+ - scale_pipeline
+
+ # ============================================================
+ # SImon — post-processed from available output
+ # ============================================================
+
+ # Conductive heat flux at ice surface
+ # qcond_top = k_ice * (T_base - T_surface) / h_ice
+ - name: siflcondtop
+ inputs:
+ - path: *dp
+ pattern: ist.fesom.1350.nc
+ compound_name: seaIce.siflcondtop.tavg-u-hxy-si.mon.GLB
+ model_variable: ist
+ sss_file: /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/fesom/sss.fesom.1350.nc
+ hice_file: /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/fesom/h_ice.fesom.1350.nc
+ k_ice: 2.1656
+ pipelines:
+ - siflcondtop_pipeline
+
+ # Sea ice heat content
+ - name: sihc
+ inputs:
+ - path: *dp
+ pattern: h_ice.fesom.1350.nc
+ compound_name: seaIce.sihc.tavg-u-hxy-si.mon.GLB
+ model_variable: h_ice
+ ist_file: /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/fesom/ist.fesom.1350.nc
+ sss_file: /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/fesom/sss.fesom.1350.nc
+ rho_ice: 910.0
+ c_ice: 2090.0
+ L_f: 334000.0
+ pipelines:
+ - sihc_pipeline
+
+ # Snow heat content: -rho_snow * L_f * h_snow (latent heat dominates)
+ - name: sisnhc
+ inputs:
+ - path: *dp
+ pattern: h_snow.fesom.1350.nc
+ compound_name: seaIce.sisnhc.tavg-u-hxy-sn.mon.GLB
+ model_variable: h_snow
+ rho_snow: 330.0
+ L_f: 334000.0
+ pipelines:
+ - sisnhc_pipeline
+
+ # Temperature at ice-ocean interface (freezing point from SSS)
+ - name: sitempbot
+ inputs:
+ - path: *dp
+ pattern: sss.fesom.1350.nc
+ compound_name: seaIce.sitempbot.tavg-u-hxy-si.mon.GLB
+ model_variable: sss
+ pipelines:
+ - sitempbot_pipeline
+
+ # Sea ice freeboard from h_ice and h_snow
+ - name: sifb
+ inputs:
+ - path: *dp
+ pattern: h_ice.fesom.1350.nc
+ compound_name: seaIce.sifb.tavg-u-hxy-si.mon.GLB
+ model_variable: h_ice
+ snow_file: /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/fesom/h_snow.fesom.1350.nc
+ snow_variable: h_snow
+ rho_ice: 910.0
+ rho_snow: 330.0
+ rho_water: 1025.0
+ pipelines:
+ - sifb_pipeline
+
+ # Ocean drag coefficient (constant from namelist.ice: cd_oce_ice=0.0055)
+ - name: sidragbot
+ inputs:
+ - path: *dp
+ pattern: a_ice.fesom.1350.nc
+ compound_name: seaIce.sidragbot.tavg-u-hxy-si.mon.GLB
+ model_variable: a_ice
+ constant_value: 0.0055
+ constant_units: "1"
+ pipelines:
+ - constant_field_pipeline
+
+ # Snow mass on sea ice — Northern Hemisphere
+ - name: sisnmass_north
+ inputs:
+ - path: *dp
+ pattern: m_snow.fesom.1350.nc
+ compound_name: seaIce.sisnmass.tavg-u-g-sn.mon.NH
+ model_variable: m_snow
+ hemisphere: "N"
+ pipelines:
+ - hemisphere_integral_pipeline
+
+ - name: sisnmass_south
+ inputs:
+ - path: *dp
+ pattern: m_snow.fesom.1350.nc
+ compound_name: seaIce.sisnmass.tavg-u-g-sn.mon.SH
+ model_variable: m_snow
+ hemisphere: "S"
+ pipelines:
+ - hemisphere_integral_pipeline
+
+ # ============================================================
+ # SImon — melt ponds (use_meltponds=.true.)
+ # FESOM outputs: apnd (area frac), hpnd (depth), ipnd (lid thickness)
+ # ============================================================
+
+ - name: simpconc
+ inputs:
+ - path: *dp
+ pattern: apnd.fesom.1350.nc
+ compound_name: seaIce.simpconc.tavg-u-hxy-si.mon.GLB
+ model_variable: apnd
+ pipelines:
+ - fraction_to_percent_pipeline
+
+ - name: simpthick
+ inputs:
+ - path: *dp
+ pattern: hpnd.fesom.1350.nc
+ compound_name: seaIce.simpthick.tavg-u-hxy-simp.mon.GLB
+ model_variable: hpnd
+
+ - name: simprefrozen
+ inputs:
+ - path: *dp
+ pattern: ipnd.fesom.1350.nc
+ compound_name: seaIce.simprefrozen.tavg-u-hxy-simp.mon.GLB
+ model_variable: ipnd
+
+ - name: simpeffconc
+ inputs:
+ - path: *dp
+ pattern: apnd.fesom.1350.nc
+ compound_name: seaIce.simpeffconc.tavg-u-hxy-si.mon.GLB
+ model_variable: apnd
+ ipnd_file: /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/fesom/ipnd.fesom.1350.nc
+ hpnd_file: /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/fesom/hpnd.fesom.1350.nc
+ pipelines:
+ - simpeffconc_pipeline
+
+ # ============================================================
+ # SImon — hemisphere-integrated scalars (ldiag_cmor=.true.)
+ # ============================================================
+
+ - name: siarea_north
+ inputs:
+ - path: *dp
+ pattern: siarean.fesom.1350.nc
+ compound_name: seaIce.siarea.tavg-u-g-si.mon.NH
+ model_variable: siarean
+
+ - name: siarea_south
+ inputs:
+ - path: *dp
+ pattern: siareas.fesom.1350.nc
+ compound_name: seaIce.siarea.tavg-u-g-si.mon.SH
+ model_variable: siareas
+
+ - name: siextent_north
+ inputs:
+ - path: *dp
+ pattern: siextentn.fesom.1350.nc
+ compound_name: seaIce.siextent.tavg-u-g-si.mon.NH
+ model_variable: siextentn
+
+ - name: siextent_south
+ inputs:
+ - path: *dp
+ pattern: siextents.fesom.1350.nc
+ compound_name: seaIce.siextent.tavg-u-g-si.mon.SH
+ model_variable: siextents
+
+ - name: sivol_north
+ inputs:
+ - path: *dp
+ pattern: sivoln.fesom.1350.nc
+ compound_name: seaIce.sivol.tavg-u-g-si.mon.NH
+ model_variable: sivoln
+
+ - name: sivol_south
+ inputs:
+ - path: *dp
+ pattern: sivols.fesom.1350.nc
+ compound_name: seaIce.sivol.tavg-u-g-si.mon.SH
+ model_variable: sivols
+
+ # ============================================================
+ # SIday — Daily variables
+ # ============================================================
+
+ - name: sispeed_day
+ inputs:
+ - path: *dp
+ pattern: uice.fesom.1350.nc
+ compound_name: seaIce.sispeed.tavg-u-hxy-si.day.GLB
+ model_variable: uice
+ second_input_file: /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/fesom/vice.fesom.1350.nc
+ second_variable: vice
+ pipelines:
+ - sispeed_pipeline
+
+ - name: sitimefrac_day
+ inputs:
+ - path: *dp
+ pattern: a_ice.fesom.1350.nc
+ compound_name: seaIce.sitimefrac.tavg-u-hxy-sea.day.GLB
+ model_variable: a_ice
+
+ - name: ts_day
+ inputs:
+ - path: *dp
+ pattern: ist.fesom.1350.nc
+ compound_name: seaIce.ts.tavg-u-hxy-si.day.GLB
+ model_variable: ist
+
+ - name: sisnmass_north_day
+ inputs:
+ - path: *dp
+ pattern: m_snow.fesom.1350.nc
+ compound_name: seaIce.sisnmass.tavg-u-g-sn.day.NH
+ model_variable: m_snow
+ hemisphere: "N"
+ pipelines:
+ - hemisphere_integral_pipeline
+
+ - name: sisnmass_south_day
+ inputs:
+ - path: *dp
+ pattern: m_snow.fesom.1350.nc
+ compound_name: seaIce.sisnmass.tavg-u-g-sn.day.SH
+ model_variable: m_snow
+ hemisphere: "S"
+ pipelines:
+ - hemisphere_integral_pipeline
diff --git a/awi-esm3-veg-hr-variables/lrcs_seaice/cmip7_lrcs_seaice_variables_todo.md b/awi-esm3-veg-hr-variables/lrcs_seaice/cmip7_lrcs_seaice_variables_todo.md
new file mode 100644
index 00000000..608ccc40
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/lrcs_seaice/cmip7_lrcs_seaice_variables_todo.md
@@ -0,0 +1,150 @@
+# CMIP7 LRCS Sea Ice Variables — AWI-ESM3-VEG-HR
+
+Status of LRCS (extra priority) sea ice variables for FESOM 2.7 / AWI-ESM3.
+These are lower priority than core variables but still important.
+
+**Key model constraints:**
+- FESOM's own sea ice (NOT icepack) — single-category, no ITD
+- mEVP rheology (whichevp=1)
+- Melt ponds enabled (use_meltponds=.true.)
+- No ice age tracer (tr_iage=.false.)
+- No ridged ice tracer (tr_lvl=.false.)
+- vec_autorotate=.true. for velocity/stress rotation
+- ldiag_cmor=.true. for hemisphere-integrated scalars
+
+Sources: cmip7_LRCSextra_variables_seaIce.csv, cmip7_LRCSextra_variables_ocean_seaIce.csv
+
+## SImon — Monthly variables
+
+### Radiation fluxes over sea ice (from atmosphere coupling)
+- [ ] **rlds** — Downwelling Longwave Flux over Sea Ice (`W m-2`, high) — likely from OpenIFS, not FESOM output
+- [ ] **rlus** — Upwelling Longwave Flux over Sea Ice (`W m-2`, high) — likely from OpenIFS, not FESOM output
+- [ ] **rsds** — Downwelling Shortwave Flux over Sea Ice (`W m-2`, high) — likely from OpenIFS; FESOM has `qsi` (ice heat flux) under __oifs
+- [ ] **rsus** — Upwelling Shortwave Flux over Sea Ice (`W m-2`, high) — likely from OpenIFS
+
+### Heat fluxes
+- [x] **siflcondbot** — Net Conductive Heat Flux at Ice Base (`W m-2`, high) — qcon (DefaultPipeline)
+- [x] **siflcondtop** — Net Conductive Heat Flux at Ice Surface (`W m-2`, high) — k_ice*(T_base-ist)/h_ice (siflcondtop_pipeline)
+- [ ] **sifllattop** — Net Latent Heat Flux over Sea Ice (`W m-2`, high) — from atmosphere coupling
+- [ ] **siflsensbot** — Net Upward Sensible Heat Flux under Sea Ice (`W m-2`, high) — ocean-ice interface
+- [ ] **siflsenstop** — Net Downward Sensible Heat Flux over Sea Ice (`W m-2`, high) — atmosphere-ice interface
+- [ ] **siflswdbot** — Downwelling Shortwave Flux under Sea Ice (`W m-2`, high) — transmitted through ice
+- [x] **sihc** — Sea-Ice Heat Content (`J m-2`, high) — rho_ice*h_ice*(c_ice*(T_mean-T_melt)-L_f) (sihc_pipeline)
+
+### Ice/snow heat content
+- [x] **sisnhc** — Snow Heat Content (`J m-2`, high) — -rho_snow*L_f*h_snow (sisnhc_pipeline)
+
+### Thermodynamic/dynamic tendencies
+- [x] **sidconcdyn** — Area Fraction Tendency from Dynamics (`s-1`, high) — dyngrarea (DefaultPipeline)
+- [x] **sidconcth** — Area Fraction Tendency from Thermodynamics (`s-1`, high) — thdgrarea (DefaultPipeline)
+- [x] **sidmassdyn** — Mass Change from Dynamics (`kg m-2 s-1`, high) — dyngrice × rho_ice=910 (scale_pipeline)
+- [x] **sidmassth** — Mass Change from Thermodynamics (`kg m-2 s-1`, high) — thdgrice × rho_ice=910 (scale_pipeline)
+- [ ] **sidmassgrowthbot** — Mass Change Through Basal Growth (`kg m-2 s-1`, high) — NOT AVAILABLE: no split growth terms
+- [ ] **sidmassgrowthsi** — Mass Change Through Snow-to-Ice Conversion (`kg m-2 s-1`, high) — NOT AVAILABLE
+- [ ] **sidmassgrowthwat** — Mass Change Through Frazil Growth (`kg m-2 s-1`, high) — NOT AVAILABLE
+- [ ] **sidmassmeltbot** — Mass Change Through Bottom Melting (`kg m-2 s-1`, high) — NOT AVAILABLE: no split melt terms
+- [ ] **sidmassmeltlat** — Mass Change Through Lateral Melting (`kg m-2 s-1`, high) — NOT AVAILABLE
+- [ ] **sidmassmelttop** — Mass Change Through Surface Melting (`kg m-2 s-1`, high) — NOT AVAILABLE
+
+### Freshwater and salt fluxes
+- [ ] **sbl** — Snow Sublimation Rate (`kg m-2 s-1`, high) — not directly output; part of atmosphere coupling
+- [x] **snm** — Snow Melt Rate (`kg m-2 s-1`, high) — thdgrsn × rho_snow=330 (scale_pipeline)
+- [x] **sfdsi** — Salt Flux from Sea Ice (`kg m-2 s-1`, medium) — realsalt (scale_pipeline, factor needs verification)
+- [x] **siflfwbot** — Freshwater Flux from Sea Ice (`kg m-2 s-1`, medium) — fw_ice × rho_water=1000 (scale_pipeline)
+- [x] **siflfwdrain** — Freshwater Flux from Sea-Ice Surface (`kg m-2 s-1`, medium) — fw_snw × rho_water=1000 (scale_pipeline)
+- [x] **sisaltmass** — Mass of Salt in Sea Ice (`kg m-2`, high) — m_ice × 0.004 (sice=4 psu, scale_pipeline)
+
+### Stress and force balance
+- [x] **sistrxdtop** — X-Component Atmospheric Stress on Ice (`N m-2`, high) — atmice_x (DefaultPipeline)
+- [x] **sistrydtop** — Y-Component Atmospheric Stress on Ice (`N m-2`, high) — atmice_y (DefaultPipeline)
+- [x] **sistrxubot** — X-Component Ocean Stress on Ice (`N m-2`, high) — iceoce_x (DefaultPipeline)
+- [x] **sistryubot** — Y-Component Ocean Stress on Ice (`N m-2`, high) — iceoce_y (DefaultPipeline)
+- [ ] **siforcecoriolx** — Coriolis Force X (`N m-2`, medium) — NOT AVAILABLE: not output by FESOM
+- [ ] **siforcecorioly** — Coriolis Force Y (`N m-2`, medium) — NOT AVAILABLE
+- [ ] **siforceintstrx** — Internal Stress X (`N m-2`, medium) — NOT AVAILABLE
+- [ ] **siforceintstry** — Internal Stress Y (`N m-2`, medium) — NOT AVAILABLE
+- [ ] **siforcetiltx** — Sea-Surface Tilt X (`N m-2`, medium) — NOT AVAILABLE
+- [ ] **siforcetilty** — Sea-Surface Tilt Y (`N m-2`, medium) — NOT AVAILABLE
+
+### Ice dynamics derived
+- [x] **sispeed** — Sea-Ice Speed (`m s-1`, high) — sqrt(uice² + vice²) (sispeed_pipeline)
+- [ ] **sidivvel** — Divergence of Ice Velocity Field (`s-1`, medium) — NOT AVAILABLE: needs spatial derivatives on unstructured grid
+- [ ] **sishearvel** — Maximum Shear of Ice Velocity Field (`s-1`, medium) — NOT AVAILABLE: needs spatial derivatives
+- [x] **sidmasstranx** — X-Component Ice Mass Transport (`kg s-1`, medium) — uice × m_ice (ice_mass_transport_pipeline)
+- [x] **sidmasstrany** — Y-Component Ice Mass Transport (`kg s-1`, medium) — vice × m_ice (ice_mass_transport_pipeline)
+
+### Mechanical properties
+- [x] **sicompstren** — Compressive Sea Ice Strength (`N m-1`, medium) — strength_ice (DefaultPipeline)
+- [x] **sistressave** — Average Normal Stress (`N m-1`, high) — (sgm11+sgm22)/2 (sistressave_pipeline)
+- [x] **sistressmax** — Maximum Shear Stress (`N m-1`, high) — from sgm11/12/22 (sistressmax_pipeline)
+
+### Other
+- [x] **sitempbot** — Temperature at Ice-Ocean Interface (`K`, medium) — T_freeze from SSS (sitempbot_pipeline)
+- [x] **sifb** — Sea-Ice Freeboard (`m`, medium) — from h_ice, h_snow, densities (sifb_pipeline)
+- [x] **sidragbot** — Ocean Drag Coefficient (`1`, medium) — constant 0.0055 (constant_field_pipeline)
+- [ ] **sidragtop** — Atmospheric Drag Coefficient (`1`, medium) — from atmosphere coupling, may be constant
+
+### Hemisphere-integrated scalars (ldiag_cmor=.true.)
+- [x] **siarea (N)** — Sea-Ice Area North (`1e6 km2`, high) — siarean (DefaultPipeline)
+- [x] **siarea (S)** — Sea-Ice Area South (`1e6 km2`, high) — siareas (DefaultPipeline)
+- [x] **siextent (N)** — Sea-Ice Extent North (`1e6 km2`, high) — siextentn (DefaultPipeline)
+- [x] **siextent (S)** — Sea-Ice Extent South (`1e6 km2`, high) — siextents (DefaultPipeline)
+- [x] **sivol (N)** — Sea-Ice Volume North (`1e3 km3`, high) — sivoln (DefaultPipeline)
+- [x] **sivol (S)** — Sea-Ice Volume South (`1e3 km3`, high) — sivols (DefaultPipeline)
+- [x] **sisnmass (N)** — Snow Mass on Sea Ice North (`kg`, high) — m_snow × cell_area, lat≥0 (sisnmass_pipeline)
+- [x] **sisnmass (S)** — Snow Mass on Sea Ice South (`kg`, high) — m_snow × cell_area, lat<0 (sisnmass_pipeline)
+
+### Melt ponds (use_meltponds=.true.)
+- [x] **simpconc** — Melt Pond Fraction (`%`, high) — apnd × 100 (fraction_to_percent_pipeline)
+- [x] **simpeffconc** — Effective Melt Pond Fraction (`%`, medium) — apnd*(1-ipnd/hpnd)*100 (simpeffconc_pipeline)
+- [x] **simpthick** — Melt Pond Depth (`m`, medium) — hpnd (DefaultPipeline)
+- [x] **simprefrozen** — Refrozen Ice on Melt Pond (`m`, medium) — ipnd (DefaultPipeline)
+
+### Strait fluxes
+- [ ] **siareaacrossline** — Ice Area Flux Through Straits (`m2 s-1`, high) — NOT AVAILABLE: no strait diagnostics
+- [ ] **simassacrossline** — Ice Mass Flux Through Straits (`kg s-1`, high) — NOT AVAILABLE
+- [ ] **sisnmassacrossline** — Snow Mass Flux Through Straits (`kg s-1`, high) — NOT AVAILABLE
+
+## NOT AVAILABLE — requires physics not in this configuration
+
+- [ ] **siage** (day/mon) — Ice Age — tr_iage=.false., not enabled
+- [ ] **sirdgconc** — Ridged Ice Fraction — tr_lvl=.false., no ridging tracer
+- [ ] **sithick (ridged)** — Ridged Ice Thickness — tr_lvl=.false.
+- [ ] **siitdconc** — Ice Area by Thickness Category — no ITD (single-category FESOM ice, not icepack)
+- [ ] **siitdthick** — Ice Thickness by Category — no ITD
+- [ ] **siitdsnconc** — Snow Area by Thickness Category — no ITD
+- [ ] **siitdsnthick** — Snow Thickness by Category — no ITD
+- [ ] **sisndmassdyn** — Snow Mass Change from Dynamics — not output separately
+- [ ] **sisndmasssi** — Snow Mass Change from Snow-to-Ice Conversion — not output separately
+- [ ] **sisndmasswind** — Snow Mass Change from Wind Drift — not output (no wind redistribution)
+
+## SIday — Daily variables
+- [ ] **rsds** — Downwelling Shortwave (`W m-2`, high) — from atmosphere
+- [ ] **rsus** — Upwelling Shortwave (`W m-2`, high) — from atmosphere
+- [ ] **siage** — Ice Age (`s`, high) — NOT AVAILABLE: tr_iage=.false.
+- [ ] **siconca** — Ice Area on Atm Grid (`%`, high) — needs regridding a_ice to atmosphere grid
+- [x] **sispeed** — Ice Speed (`m s-1`, high) — sqrt(uice²+vice²) (sispeed_pipeline, daily uice/vice added to namelist)
+- [x] **sitimefrac** — Fraction of Time with Ice (`1`, high) — daily a_ice>0 (more accurate than monthly)
+- [x] **ts** — Surface Temperature (`K`, high) — daily ist (added to namelist)
+- [ ] **siarea (N/S)** — daily hemisphere areas — ldiag_cmor scalars (need to verify daily output)
+- [ ] **siextent (N/S)** — daily hemisphere extents — ldiag_cmor scalars (need to verify daily output)
+- [ ] **sivol (N/S)** — daily hemisphere volumes — ldiag_cmor scalars (need to verify daily output)
+- [x] **sisnmass (N/S)** — daily hemisphere snow mass — hemisphere_integral_pipeline (daily m_snow added to namelist)
+
+## SImon — cross-realm (ocean seaIce)
+- [x] **sfdsi** — Downward Sea Ice Basal Salt Flux (`kg m-2 s-1`, medium) — realsalt (scale_pipeline, factor needs verification)
+- [x] **siflfwbot** — Water Flux into Ocean from Ice Thermodynamics (`kg m-2 s-1`, medium) — fw_ice × 1000 (scale_pipeline)
+- [x] **vsfsit** — Virtual Salt Flux from Ice Thermodynamics (`kg m-2 s-1`, medium) — virtsalt (scale_pipeline, factor needs verification)
+
+## Blockers
+
+1. **Radiation fluxes** (rlds, rlus, rsds, rsus): These come from the atmosphere model (OpenIFS), not FESOM. Need separate atmosphere CMORization or coupling interface output.
+2. **Split thermodynamic budget** (sidmassgrowthbot/si/wat, sidmassmeltbot/lat/top): FESOM outputs total thermo/dynamic tendency but not individual budget terms.
+3. **Force balance terms** (siforcecoriol/intstr/tilt x/y): Not output by FESOM.
+4. **ITD variables** (siitdconc/thick/snconc/snthick): No ice thickness distribution — FESOM uses single-category ice (icepack not active).
+5. **Ice age** (siage): Tracer not enabled (tr_iage=.false.).
+6. **Ridged ice** (sirdgconc, ridged sithick): Tracer not enabled (tr_lvl=.false.).
+7. **Strait fluxes** (siareaacrossline, simassacrossline, sisnmassacrossline): No strait diagnostic in FESOM.
+8. **Snow budget split** (sisndmassdyn/si/wind): Not output separately.
+9. ~~**Melt ponds**~~: RESOLVED — FESOM outputs apnd, hpnd, ipnd when use_meltponds=.true. Added to namelist.io.
+10. **Spatial derivatives** (sidivvel, sishearvel): Require computing divergence/shear on unstructured mesh — non-trivial post-processing.
diff --git a/awi-esm3-veg-hr-variables/missing_from_namelist.io.md b/awi-esm3-veg-hr-variables/missing_from_namelist.io.md
new file mode 100644
index 00000000..e60980e7
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/missing_from_namelist.io.md
@@ -0,0 +1,42 @@
+# CMIP7 Ocean Variables — Missing from FESOM2 Output
+
+Variables that FESOM2 currently cannot write or that need external data.
+
+## Cannot be derived from FESOM output
+
+### basin (Ofx)
+Ocean basin classification index (Atlantic, Pacific, Indian, Arctic, Southern, etc.).
+Not stored in mesh.nc or any FESOM output. Requires an external basin mask dataset
+mapped onto the FESOM unstructured grid. Could potentially use regionmask Python
+package to generate from coordinates, but this is external post-processing.
+
+### hfgeou (Ofx)
+Upward geothermal heat flux at sea floor. FESOM2 does not include geothermal
+heating in its standard configuration. No output variable or forcing field found
+in the source code. Would require adding a geothermal forcing module to FESOM2
+and is not a small effort.
+
+## Could be added with namelist/config changes
+
+### zostoga (Omon)
+Global average thermosteric sea level change. Not computed directly by FESOM2.
+The CMOR diagnostics module (`gen_modules_cmor_diag.F90`) computes `pbo` (bottom
+pressure) which includes a steric contribution, but deriving zostoga from it
+requires non-trivial post-processing (global volume-weighted thermal expansion
+integral). Alternatively, could be computed offline from thetao + so + depth
+using the TEOS-10 equation of state, but this needs a dedicated pipeline step.
+
+### umo / vmo / wmo (Omon)
+Ocean mass transport in x/y/z directions. FESOM2 outputs only velocity fields
+(u, v, w), not mass transports. Computing these requires:
+- velocity × water density × cell cross-section area
+- Density from equation of state (temp, salt, pressure)
+- Cell areas from mesh
+This is feasible in post-processing but needs a dedicated pipeline with
+multiple input variables (velocity + temp + salt + mesh).
+
+### masscello time-varying (Omon)
+Time-varying grid-cell mass per area. Requires density × hnode (ALE layer
+thickness). hnode is available in FESOM2 but not currently enabled in namelist.io.
+Density must be computed from temperature and salinity via equation of state.
+Once hnode is enabled, this is feasible in post-processing.
diff --git a/awi-esm3-veg-hr-variables/namelist.io b/awi-esm3-veg-hr-variables/namelist.io
new file mode 100644
index 00000000..05c0bdbc
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/namelist.io
@@ -0,0 +1,399 @@
+! ============================================================================
+! ============ Namelist file for FESOM2 output configuration =================
+! ============================================================================
+! This file contains configuration for model output and diagnostics:
+! - Diagnostic flags for optional output fields
+! - General output settings (compression, rotation)
+! - Output variable list with frequency and precision
+! - Complete catalog of all available output fields
+!
+! See the output catalog at the end of this file for all possible variables.
+! Some outputs require specific flags in &diag_list or other namelists.
+! ============================================================================
+
+! ============================================================================
+! DIAGNOSTIC FLAGS
+! ============================================================================
+! Enable/disable optional diagnostic computations and outputs.
+! Setting these to .true. enables additional output fields (see catalog below).
+! ============================================================================
+&diag_list
+ldiag_solver = .false. ! enables solver diagnostics (convergence, iterations)
+lcurt_stress_surf = .false. ! enables 'curl_surf' output (vorticity of surface stress)
+ldiag_curl_vel3 = .false. ! enables 'curl_u' output (relative vorticity from 3D velocity)
+ldiag_Ri = .false. ! enables Richardson number diagnostics ('shear', 'Ri')
+ldiag_turbflux = .false. ! enables turbulent flux diagnostics ('KvdTdz', 'KvdSdz')
+ldiag_salt3D = .false. ! enables 3D salinity diagnostics
+ldiag_dMOC = .true. ! enables 'dMOC' output (density MOC diagnostics)
+ldiag_DVD = .false. ! enables 'DVD' output (Discrete Variance Decay diagnostics)
+ldiag_forc = .false. ! enables 'FORC' output (comprehensive forcing diagnostics)
+ldiag_extflds = .false. ! enables extended field diagnostics
+ldiag_destine = .false. ! enables heat content computation ('hc300m', 'hc700m', 'hc')
+ldiag_trflx = .false. ! enables tracer flux diagnostics ('utemp', 'vtemp', 'usalt', 'vsalt')
+ldiag_uvw_sqr = .false. ! enables 'UVW_SQR' output (squared velocities: u2, v2, w2)
+ldiag_trgrd_xyz = .false. ! enables 'TRGRD_XYZ' output (horizontal & vertical tracer gradients)
+ldiag_cmor = .true. ! enables CMOR diagnostics for CMIP6/CMIP7 ('tos', 'sos', 'pbo', 'volo', etc.)
+/
+
+! ============================================================================
+! GENERAL OUTPUT SETTINGS
+! ============================================================================
+&nml_general
+io_listsize = 150 ! total number of streams to allocate. Shall be larger or equal to the number of streams in &nml_list (max. 150)
+vec_autorotate = .true. ! unrotate vector fields (velocities, winds) before writing to output files
+compression_level = 1 ! compression level for netCDF output (1=fastest, 9=smallest)
+/
+
+! ============================================================================
+! OUTPUT VARIABLE LIST
+! ============================================================================
+! Format: 'variable_id', frequency, unit, precision
+! frequency = output frequency (integer)
+! unit = 'y' (yearly), 'm' (monthly), 'd' (daily), 'h' (hourly), 's' (steps)
+! precision = 4 (single precision) or 8 (double precision)
+! ============================================================================
+&nml_list
+! --- Daily output (variables needed at daily AND monthly frequency) ---
+! Monthly pycmor rules will use timeavg to downsample from daily data.
+! FESOM2 can only output one frequency per variable.
+io_list = 'sst ',1, 'd', 4,
+ 'sss ',1, 'd', 4,
+ 'ssh ',1, 'd', 4,
+ 'uice ',1, 'd', 4,
+ 'vice ',1, 'd', 4,
+ 'a_ice ',1, 'd', 4,
+ 'm_snow ',1, 'd', 4,
+ 'ist ',1, 'd', 4,
+ 'MLD3 ',1, 'd', 4,
+ 'unod ',1, 'd', 4,
+ 'vnod ',1, 'd', 4,
+! --- Monthly-only output ---
+ 'm_ice ',1, 'm', 4,
+ 'h_ice ',1, 'd', 4,
+ 'h_snow ',1, 'd', 4,
+ 'MLD1 ',1, 'm', 4,
+ 'MLD2 ',1, 'm', 4,
+ 'tx_sur ',1, 'm', 4,
+ 'ty_sur ',1, 'm', 4,
+ 'temp ',1, 'm', 4,
+ 'salt ',1, 'm', 8,
+ 'N2 ',1, 'm', 4,
+ 'Kv ',1, 'm', 4,
+ 'u ',1, 'm', 4,
+ 'v ',1, 'm', 4,
+ 'w ',1, 'm', 4,
+ 'hnode ',1, 'm', 4,
+ 'Av ',1, 'm', 4,
+ 'bolus_u ',1, 'm', 4,
+ 'bolus_v ',1, 'm', 4,
+ 'bolus_w ',1, 'm', 4,
+ 'fw ',1, 'm', 4,
+ 'fh ',1, 'm', 4,
+ 'otracers ',1, 'm', 4,
+ 'thdgrarea ',1, 'm', 4,
+ 'dyngrarea ',1, 'm', 4,
+ 'thdgrice ',1, 'm', 4,
+ 'dyngrice ',1, 'm', 4,
+ 'thdgrsn ',1, 'm', 4,
+ 'strength_ice',1, 'm', 4,
+ 'atmice_x ',1, 'm', 4,
+ 'atmice_y ',1, 'm', 4,
+ 'iceoce_x ',1, 'm', 4,
+ 'iceoce_y ',1, 'm', 4,
+ 'fw_ice ',1, 'm', 4,
+ 'fw_snw ',1, 'm', 4,
+ 'virtsalt ',1, 'm', 4,
+ 'realsalt ',1, 'm', 4,
+ 'qcon ',1, 'm', 4,
+ 'apnd ',1, 'm', 4,
+ 'hpnd ',1, 'm', 4,
+ 'ipnd ',1, 'm', 4,
+ 'evap ',1, 'm', 4,
+ 'prec ',1, 'm', 4,
+ 'snow ',1, 'm', 4,
+ 'runoff ',1, 'm', 4,
+ 'relaxsalt ',1, 'm', 4,
+ 'sgm11 ',1, 'm', 4,
+ 'sgm12 ',1, 'm', 4,
+ 'sgm22 ',1, 'm', 4,
+ 'osalttend ',1, 'm', 8,
+ 'opottemprmadvect',1, 'm', 8,
+ 'opottempdiff',1, 'm', 8,
+ 'osaltrmadvect',1, 'm', 8,
+ 'osaltdiff ',1, 'm', 8,
+ 'rsdoabsorb',1, 'm', 4,
+/
+
+! ============================================================================
+! COMPLETE CATALOG OF ALL POSSIBLE OUTPUT FIELDS
+! ============================================================================
+! Below is a comprehensive list of all valid io_list IDs available in FESOM2.
+! To enable any field, copy the line to the &nml_list section above.
+! NOTE: Some fields require specific flags to be enabled (see comments).
+! ============================================================================
+
+! --- 2D OCEAN SURFACE FIELDS ---
+! 'sst ',1, 'm', 4, ! sea surface temperature [C]
+! 'sss ',1, 'm', 4, ! sea surface salinity [psu]
+! 'ssh ',1, 'm', 4, ! sea surface elevation [m]
+! 'vve_5 ',1, 'm', 4, ! vertical velocity at 5th level [m/s]
+! 't_star ',1, 'm', 4, ! air temperature [C]
+! 'qsr ',1, 'm', 4, ! solar radiation [W/s^2]
+
+! --- 3D OCEAN FIELDS ---
+! 'temp ',1, 'm', 4, ! temperature [C]
+! 'salt ',1, 'm', 8, ! salinity [psu]
+! 'sigma0 ',1, 'm', 4, ! potential density [kg/m3]
+! 'u ',1, 'm', 4, ! zonal velocity [m/s]
+! 'v ',1, 'm', 4, ! meridional velocity [m/s]
+! 'unod ',1, 'm', 4, ! zonal velocity at nodes [m/s]
+! 'vnod ',1, 'm', 4, ! meridional velocity at nodes [m/s]
+! 'w ',1, 'm', 4, ! vertical velocity [m/s]
+! 'otracers ',1, 'm', 4, ! all other tracers if applicable
+! 'age ',1, 'm', 4, ! water age tracer [year] (require use_age_tracer=.true.)
+
+! --- 2D SSH DIAGNOSTIC VARIABLES ---
+! 'ssh_rhs ',1, 'm', 4, ! ssh rhs [m/s]
+! 'ssh_rhs_old',1, 'm', 4, ! ssh rhs old [m/s]
+! 'd_eta ',1, 'm', 4, ! dssh from solver [m]
+! 'hbar ',1, 'm', 4, ! ssh n+0.5 tstep [m]
+! 'hbar_old ',1, 'm', 4, ! ssh n-0.5 tstep [m]
+! 'dhe ',1, 'm', 4, ! dhbar @ elem [m]
+
+! --- SEA ICE FIELDS (require use_ice=.true.) ---
+! 'uice ',1, 'm', 4, ! ice velocity x [m/s]
+! 'vice ',1, 'm', 4, ! ice velocity y [m/s]
+! 'a_ice ',1, 'm', 4, ! ice concentration [%]
+! 'm_ice ',1, 'm', 4, ! ice height per unit area [m]
+! 'thdgrice ',1, 'm', 4, ! thermodynamic growth rate ice [m/s]
+! 'thdgrarea ',1, 'm', 4, ! thermodynamic growth rate ice concentration [frac/s]
+! 'dyngrarea' ,1, 'm', 4, ! dynamic growth rate ice concentration [frac/s]
+! 'dyngrice ',1, 'm', 4, ! dynamic growth rate ice [m/s]
+! 'thdgrsn ',1, 'm', 4, ! thermodynamic growth rate snow [m/s]
+! 'dyngrsnw ',1, 'm', 4, ! dynamic growth rate snow [m/s]
+! 'flice ',1, 'm', 4, ! flooding growth rate ice [m/s]
+! 'm_snow ',1, 'm', 4, ! snow height per unit area [m]
+! 'h_ice ',1, 'm', 4, ! ice thickness over ice-covered fraction [m]
+! 'h_snow ',1, 'm', 4, ! snow thickness over ice-covered fraction [m]
+! 'fw_ice ',1, 'm', 4, ! fresh water flux from ice ['m/s']
+! 'fw_snw ',1, 'm', 4, ! fresh water flux from snow ['m/s']
+
+! --- SEA ICE DEBUG VARIABLES (require use_ice=.true.) ---
+! 'strength_ice',1, 'm', 4, ! ice strength [?]
+! 'inv_areamass',1, 'm', 4, ! inv_areamass [?]
+! 'rhs_a ',1, 'm', 4, ! rhs_a [?]
+! 'rhs_m ',1, 'm', 4, ! rhs_m [?]
+! 'sgm11 ',1, 'm', 4, ! sgm11 [?]
+! 'sgm12 ',1, 'm', 4, ! sgm12 [?]
+! 'sgm22 ',1, 'm', 4, ! sgm22 [?]
+! 'eps11 ',1, 'm', 4, ! eps11 [?]
+! 'eps12 ',1, 'm', 4, ! eps12 [?]
+! 'eps22 ',1, 'm', 4, ! eps22 [?]
+! 'u_rhs_ice ',1, 'm', 4, ! u_rhs_ice [?]
+! 'v_rhs_ice ',1, 'm', 4, ! v_rhs_ice [?]
+! 'metric_fac',1, 'm', 4, ! metric_fac [?]
+! 'elevat_ice',1, 'm', 4, ! elevat_ice [?]
+! 'uwice ',1, 'm', 4, ! uwice [?]
+! 'vwice ',1, 'm', 4, ! vwice [?]
+! 'twice ',1, 'm', 4, ! twice [?]
+! 'swice ',1, 'm', 4, ! swice [?]
+
+! --- MIXED LAYER DEPTH ---
+! 'MLD1 ',1, 'm', 4, ! Mixed Layer Depth [m] Large et al. 1997, bvfreq(nz, node) > db_max
+! 'MLD2 ',1, 'm', 4, ! Mixed Layer Depth [m] Levitus treshold, rhopot(nz)-rhopot(1) > 0.125_WP kg/m
+! 'MLD3 ',1, 'm', 4, ! Mixed Layer Depth [m] Griffies 2016 , rhopot(nz)-rhopot(1) > 0.03_WP kg/m
+
+! --- HEAT CONTENT (require ldiag_destine=.true.) ---
+! 'hc300m ',1, 'm', 4, ! Vertically integrated heat content upper 300m [J m**-2]
+! 'hc700m ',1, 'm', 4, ! Vertically integrated heat content upper 700m [J m**-2]
+! 'hc ',1, 'm', 4, ! Vertically integrated heat content total column [J m**-2]
+
+! --- WATER ISOTOPES IN SEA ICE (require lwiso=.true.) ---
+! 'h2o18_ice ',1, 'm', 4, ! h2o18 concentration in sea ice [kmol/m**3]
+! 'hDo16_ice ',1, 'm', 4, ! hDo16 concentration in sea ice [kmol/m**3]
+! 'h2o16_ice ',1, 'm', 4, ! h2o16 concentration in sea ice [kmol/m**3]
+
+! --- FRESHWATER FLUX (require use_landice_water=.true.) ---
+! 'landice ',1, 'm', 4, ! freshwater flux [m/s]
+
+! --- SURFACE FORCING ---
+! 'tx_sur ',1, 'm', 4, ! zonal wind str. to ocean [N/m2]
+! 'ty_sur ',1, 'm', 4, ! meridional wind str. to ocean [N/m2]
+! 'curl_surf ',1, 'm', 4, ! vorticity of the surface stress [none] (require lcurt_stress_surf=.true.)
+! 'fh ',1, 'm', 4, ! heat flux [W/m2]
+! 'fw ',1, 'm', 4, ! fresh water flux [m/s]
+! 'atmice_x ',1, 'm', 4, ! stress atmice x [N/m2]
+! 'atmice_y ',1, 'm', 4, ! stress atmice y [N/m2]
+! 'atmoce_x ',1, 'm', 4, ! stress atmoce x [N/m2]
+! 'atmoce_y ',1, 'm', 4, ! stress atmoce y [N/m2]
+! 'iceoce_x ',1, 'm', 4, ! stress iceoce x [N/m2]
+! 'iceoce_y ',1, 'm', 4, ! stress iceoce y [N/m2]
+! 'alpha ',1, 'm', 4, ! thermal expansion [none]
+! 'beta ',1, 'm', 4, ! saline contraction [none]
+! 'dens_flux ',1, 'm', 4, ! density flux [kg/(m3*s)]
+! 'runoff ',1, 'm', 4, ! river runoff [m/s]
+! 'evap ',1, 'm', 4, ! evaporation [m/s]
+! 'prec ',1, 'm', 4, ! precipitation rain [m/s]
+! 'snow ',1, 'm', 4, ! precipitation snow [m/s]
+! 'tair ',1, 'm', 4, ! surface air temperature [°C]
+! 'shum ',1, 'm', 4, ! specific humidity []
+! 'swr ',1, 'm', 4, ! short wave radiation [W/m^2]
+! 'lwr ',1, 'm', 4, ! long wave radiation [W/m^2]
+! 'uwind ',1, 'm', 4, ! 10m zonal surface wind velocity [m/s]
+! 'vwind ',1, 'm', 4, ! 10m merid. surface wind velocity [m/s]
+! 'virtsalt ',1, 'm', 4, ! virtual salt flux [m/s*psu]
+! 'relaxsalt ',1, 'm', 4, ! relaxation salt flux [m/s*psu]
+! 'realsalt ',1, 'm', 4, ! real salt flux from sea ice [m/s*psu]
+
+! --- KPP VERTICAL MIXING (require mix_scheme_nmb==1,17,3,37) ---
+! 'kpp_obldepth',1, 'm', 4, ! KPP ocean boundary layer depth [m]
+! 'kpp_sbuoyflx',1, 'm', 4, ! surface buoyancy flux [m2/s3]
+
+! --- RECOM 2D BIOGEOCHEMISTRY (require use_REcoM=.true. and __recom) ---
+! 'dpCO2s ',1, 'm', 4, ! Difference of oceanic pCO2 minus atmospheric pCO2 [uatm]
+! 'pCO2s ',1, 'm', 4, ! Partial pressure of oceanic CO2 [uatm]
+! 'CO2f ',1, 'm', 4, ! CO2-flux into the surface water [mmolC/m2/d]
+! 'O2f ',1, 'm', 4, ! O2-flux into the surface water [mmolO/m2/d]
+! 'Hp ',1, 'm', 4, ! Mean of H-plus ions in the surface water [mol/kg]
+! 'aFe ',1, 'm', 4, ! Atmospheric iron input [umolFe/m2/s]
+! 'aN ',1, 'm', 4, ! Atmospheric DIN input [mmolN/m2/s]
+! 'benN ',1, 'm', 4, ! Benthos Nitrogen [mmol]
+! 'benC ',1, 'm', 4, ! Benthos Carbon [mmol]
+! 'benSi ',1, 'm', 4, ! Benthos silicon [mmol]
+! 'benCalc ',1, 'm', 4, ! Benthos calcite [mmol]
+! 'NPPn ',1, 'm', 4, ! Mean NPP nanophytoplankton [mmolC/m2/d]
+! 'NPPd ',1, 'm', 4, ! Mean NPP diatoms [mmolC/m2/d]
+! 'GPPn ',1, 'm', 4, ! Mean GPP nanophytoplankton [mmolC/m2/d]
+! 'GPPd ',1, 'm', 4, ! Mean GPP diatoms [mmolC/m2/d]
+! 'NNAn ',1, 'm', 4, ! Net N-assimilation nanophytoplankton [mmolN/m2/d]
+! 'NNAd ',1, 'm', 4, ! Net N-assimilation diatoms [mmolN/m2/d]
+! 'Chldegn ',1, 'm', 4, ! Chlorophyll degradation nanophytoplankton [1/d]
+! 'Chldegd ',1, 'm', 4, ! Chlorophyll degradation diatoms [1/d]
+! 'NPPc ',1, 'm', 4, ! Mean NPP coccolithophores [mmolC/(m2*d)]
+! 'GPPc ',1, 'm', 4, ! Mean GPP coccolithophores [mmolC/m2/d]
+! 'NNAc ',1, 'm', 4, ! Net N-assimilation coccolithophores [mmolN/(m2*d)]
+! 'Chldegc ',1, 'm', 4, ! Chlorophyll degradation coccolithophores [1/d]
+
+! --- RECOM 3D BIOGEOCHEMISTRY (require use_REcoM=.true. and __recom) ---
+! 'PAR ',1, 'm', 4, ! PAR [W/m2]
+! 'respmeso ',1, 'm', 4, ! Respiration rate of mesozooplankton [mmolC/m2/d]
+! 'respmacro ',1, 'm', 4, ! Respiration rate of macrozooplankton [mmolC/m2/d]
+! 'respmicro ',1, 'm', 4, ! Respiration rate of microzooplankton [mmolC/m2/d]
+! 'calcdiss ',1, 'm', 4, ! Calcite dissolution [mmolC/m2/d]
+! 'calcif ',1, 'm', 4, ! Calcification [mmolC/m2/d]
+! 'aggn ',1, 'm', 4, ! Aggregation of small phytoplankton [mmolC/m2/d]
+! 'aggd ',1, 'm', 4, ! Aggregation of diatoms [mmolC/m2/d]
+! 'aggc ',1, 'm', 4, ! Aggregation of coccolithophores [mmolC/m2/d]
+! 'docexn ',1, 'm', 4, ! DOC excretion by small phytoplankton [mmolC/m2/d]
+! 'docexd ',1, 'm', 4, ! DOC excretion by diatoms [mmolC/m2/d]
+! 'docexc ',1, 'm', 4, ! DOC excretion by coccolithophores [mmolC/m2/d]
+! 'respn ',1, 'm', 4, ! Respiration by small phytoplankton [mmolC/m2/d]
+! 'respd ',1, 'm', 4, ! Respiration by diatoms [mmolC/m2/d]
+! 'respc ',1, 'm', 4, ! Respiration by coccolithophores [mmolC/(m2*d)]
+! 'NPPn3D ',1, 'm', 4, ! Net primary production of small phytoplankton [mmolC/m2/d]
+! 'NPPd3D ',1, 'm', 4, ! Net primary production of diatoms [mmolC/m2/d]
+! 'NPPc3D ',1, 'm', 4, ! Net primary production of coccolithophores [mmolC/m2/d]
+
+! --- WATER ISOTOPES IN OCEAN (require lwiso=.true.) ---
+! 'h2o18 ',1, 'm', 4, ! h2o18 concentration [kmol/m**3]
+! 'hDo16 ',1, 'm', 4, ! hDo16 concentration [kmol/m**3]
+! 'h2o16 ',1, 'm', 4, ! h2o16 concentration [kmol/m**3]
+
+! --- NEUTRAL SLOPES ---
+! 'slopetap_x',1, 'm', 4, ! neutral slope tapered X [none]
+! 'slopetap_y',1, 'm', 4, ! neutral slope tapered Y [none]
+! 'slopetap_z',1, 'm', 4, ! neutral slope tapered Z [none]
+! 'slope_x ',1, 'm', 4, ! neutral slope X [none]
+! 'slope_y ',1, 'm', 4, ! neutral slope Y [none]
+! 'slope_z ',1, 'm', 4, ! neutral slope Z [none]
+
+! --- MIXING AND DYNAMICS ---
+! 'N2 ',1, 'm', 4, ! brunt väisälä [1/s2]
+! 'Kv ',1, 'm', 4, ! vertical diffusivity Kv [m2/s]
+! 'Av ',1, 'm', 4, ! vertical viscosity Av [m2/s]
+
+! --- VISCOSITY TENDENCIES (require dynamics%opt_visc==8) ---
+! 'u_dis_tend',1, 'm', 4, ! horizontal velocity viscosity tendency [m/s]
+! 'v_dis_tend',1, 'm', 4, ! meridional velocity viscosity tendency [m/s]
+! 'u_back_tend',1, 'm', 4, ! horizontal velocity backscatter tendency [m2/s2]
+! 'v_back_tend',1, 'm', 4, ! meridional velocity backscatter tendency [m2/s2]
+! 'u_total_tend',1, 'm', 4,! horizontal velocity total viscosity tendency [m/s]
+! 'v_total_tend',1, 'm', 4,! meridional velocity total viscosity tendency [m/s]
+
+! --- FERRARI/GM PARAMETERISATION (require Fer_GM=.true.) ---
+! 'bolus_u ',1, 'm', 4, ! GM bolus velocity U [m/s]
+! 'bolus_v ',1, 'm', 4, ! GM bolus velocity V [m/s]
+! 'bolus_w ',1, 'm', 4, ! GM bolus velocity W [m/s]
+! 'fer_K ',1, 'm', 4, ! GM, stirring diff. [m2/s]
+! 'fer_scal ',1, 'm', 4, ! GM surface scaling []
+! 'fer_C ',1, 'm', 4, ! GM, depth independent speed [m/s]
+! 'cfl_z ',1, 'm', 4, ! vertical CFL criteria [?]
+
+! --- DENSITY MOC DIAGNOSTICS (require ldiag_dMOC=.true.) ---
+! 'dMOC ',1, 'm', 4, ! fluxes for density MOC (multiple variables)
+
+! --- PRESSURE GRADIENT FORCE ---
+! 'pgf_x ',1, 'm', 4, ! zonal pressure gradient force [m/s^2]
+! 'pgf_y ',1, 'm', 4, ! meridional pressure gradient force [m/s^2]
+
+! --- ALE LAYER THICKNESS ---
+! 'hnode ',1, 'm', 4, ! vertice layer thickness [m]
+! 'hnode_new ',1, 'm', 4, ! hnode_new [m]
+! 'helem ',1, 'm', 4, ! elemental layer thickness [m]
+
+! --- OIFS/IFS INTERFACE (require __oifs or __ifsinterface) ---
+! 'alb ',1, 'm', 4, ! ice albedo [none]
+! 'ist ',1, 'm', 4, ! ice surface temperature [K]
+! 'qsi ',1, 'm', 4, ! ice heat flux [W/m^2]
+! 'qso ',1, 'm', 4, ! oce heat flux [W/m^2]
+! 'enthalpy ',1, 'm', 4, ! enthalpy of fusion [W/m^2]
+! 'qcon ',1, 'm', 4, ! conductive heat flux [W/m^2]
+! 'qres ',1, 'm', 4, ! residual heat flux [W/m^2]
+! 'runoff_liquid',1, 'm', 4, ! liquid water runoff [m/s]
+! 'runoff_solid',1, 'm', 4, ! solid water runoff [m/s]
+
+! --- ICEBERG OUTPUTS (require use_icebergs=.true.) ---
+! 'icb ',1, 'm', 4, ! iceberg outputs (multiple variables)
+
+! --- TKE MIXING DIAGNOSTICS (require mix_scheme_nmb==5 or 56) ---
+! 'TKE ',1, 'm', 4, ! TKE diagnostics (multiple variables)
+
+! --- IDEMIX MIXING DIAGNOSTICS (require mod(mix_scheme_nmb,10)==6) ---
+! 'IDEMIX ',1, 'm', 4, ! IDEMIX diagnostics (multiple variables)
+
+! --- TIDAL MIXING DIAGNOSTICS (require mod(mix_scheme_nmb,10)==7) ---
+! 'TIDAL ',1, 'm', 4, ! TIDAL diagnostics (multiple variables)
+
+! --- FORCING DIAGNOSTICS (require ldiag_forc=.true.) ---
+! 'FORC ',1, 'm', 4, ! forcing diagnostics (multiple variables)
+
+! --- DISCRETE VARIANCE DECAY (require ldiag_DVD=.true.) ---
+! 'DVD ',1, 'm', 4, ! DVD diagnostics (multiple variables)
+
+! --- SPLIT-EXPLICIT SUBCYCLING (require dynamics%use_ssh_se_subcycl=.true.) ---
+! 'SPLIT-EXPL',1, 'm', 4, ! split-explicit diagnostics (multiple variables)
+
+! --- SQUARED VELOCITIES (require ldiag_uvw_sqr=.true.) ---
+! 'UVW_SQR ',1, 'm', 4, ! squared velocities (u2, v2, w2)
+
+! --- TRACER GRADIENTS (require ldiag_trgrd_xyz=.true.) ---
+! 'TRGRD_XYZ ',1, 'm', 4, ! horizontal and vertical tracer gradients
+
+! --- CMOR DIAGNOSTICS FOR CMIP6/CMIP7 (require ldiag_cmor=.true.) ---
+! 'tos ',1, 'm', 8, ! sea surface temperature [degC] (CMOR standard)
+! 'sos ',1, 'm', 8, ! sea surface salinity [psu] (CMOR standard)
+! 'pbo ',1, 'm', 8, ! sea water pressure at sea floor [Pa]
+! 'opottemptend',1, 'm', 8,! ocean potential temperature tendency [W/m^2]
+! 'volo ',1, 'm', 8, ! ocean volume [m^3] (global scalar)
+! 'soga ',1, 'm', 8, ! global mean sea water salinity [psu] (global scalar)
+! 'thetaoga ',1, 'm', 8, ! global mean sea water potential temperature [degC] (global scalar)
+! 'siarean ',1, 'm', 8, ! sea ice area Northern hemisphere [10^12 m^2] (global scalar)
+! 'siareas ',1, 'm', 8, ! sea ice area Southern hemisphere [10^12 m^2] (global scalar)
+! 'siextentn ',1, 'm', 8, ! sea ice extent Northern hemisphere [10^12 m^2] (global scalar)
+! 'siextents ',1, 'm', 8, ! sea ice extent Southern hemisphere [10^12 m^2] (global scalar)
+! 'sivoln ',1, 'm', 8, ! sea ice volume Northern hemisphere [10^9 m^3] (global scalar)
+! 'sivols ',1, 'm', 8, ! sea ice volume Southern hemisphere [10^9 m^3] (global scalar)
+
+! ============================================================================
+! END OF CATALOG
+! ============================================================================
diff --git a/awi-esm3-veg-hr-variables/veg_atm/cmip7_awiesm3-veg-hr_veg_atm.yaml b/awi-esm3-veg-hr-variables/veg_atm/cmip7_awiesm3-veg-hr_veg_atm.yaml
new file mode 100644
index 00000000..0376b29d
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/veg_atm/cmip7_awiesm3-veg-hr_veg_atm.yaml
@@ -0,0 +1,291 @@
+# CMIP7 VEG Atmosphere/Aerosol Variables — AWI-ESM3-VEG-HR
+# Generated from 5 CSVs in veg_atm/
+#
+# Covers additional 3hr radiation/fluxes, plev6 fields, 6hr snowfall,
+# monthly net radiation, boundary layer depth, daily snow diagnostics,
+# and LPJ-GUESS fire emission variables.
+
+general:
+ name: "awiesm3-cmip7-veg-atm"
+ cmor_version: "CMIP7"
+ mip: "CMIP"
+ CMIP7_DReq_metadata: "/home/a/a270092/.cache/pycmor/cmip7_metadata/v1.2.2.2/full_metadata.json"
+
+pycmor:
+ warn_on_no_rule: False
+ dask_cluster: "slurm"
+ dask_cluster_scaling_mode: "fixed"
+ dask_cluster_scaling_fixed_jobs: 1
+
+jobqueue:
+ slurm:
+ name: pycmor-worker
+ queue: compute
+ account: bb1469
+ cores: 16
+ memory: 256GB
+ walltime: '00:30:00'
+
+pipelines:
+ - name: fire_emission_pipeline
+ steps:
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:load_lpjguess_monthly
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_fire_emission
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+inherit:
+ data_path: &dp /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/oifs
+ lpjg_data_path: &ldp /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/lpj_guess
+ source_id: AWI-ESM-3
+ institution_id: AWI
+ experiment_id: picontrol
+ variant_label: r1i1p1f1
+ grid_label: gn
+ grid: "OpenIFS TCo319 reduced Gaussian, interpolated to 0.25deg regular grid"
+ nominal_resolution: "25 km"
+ institution: "Alfred Wegener Institute, Helmholtz Centre for Polar and Marine Research, Bremerhaven, Germany"
+ output_directory: ./cmorized_output/awiesm3
+
+rules:
+ # ============================================================
+ # 3hr averaged radiation and turbulent fluxes
+ # ============================================================
+
+ - name: hfls_3hr
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_3h_rad_hfls_*.nc
+ compound_name: atmos.hfls.tavg-u-hxy-u.3hr.glb
+ model_variable: hfls
+
+ - name: hfss_3hr
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_3h_rad_hfss_*.nc
+ compound_name: atmos.hfss.tavg-u-hxy-u.3hr.glb
+ model_variable: hfss
+
+ - name: rlds_3hr
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_3h_rad_rlds_*.nc
+ compound_name: atmos.rlds.tavg-u-hxy-u.3hr.glb
+ model_variable: rlds
+
+ - name: rlus_3hr
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_3h_rad_rlus_*.nc
+ compound_name: atmos.rlus.tavg-u-hxy-u.3hr.glb
+ model_variable: rlus
+
+ - name: rsds_3hr
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_3h_rad_rsds_*.nc
+ compound_name: atmos.rsds.tavg-u-hxy-u.3hr.glb
+ model_variable: rsds
+
+ - name: rsus_3hr
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_3h_rad_rsus_*.nc
+ compound_name: atmos.rsus.tavg-u-hxy-u.3hr.glb
+ model_variable: rsus
+
+ # ============================================================
+ # 3hr instantaneous surface (already in _3h_pt file)
+ # ============================================================
+
+ - name: ps_3hrPt
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_3h_pt_sp_*.nc
+ compound_name: atmos.ps.tpt-u-hxy-u.3hr.glb
+ model_variable: sp
+
+ # ============================================================
+ # 3hr instantaneous plev6 (lower troposphere 950-700 hPa)
+ # ============================================================
+
+ - name: ta_3hrPt_plev6
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_3h_pl6_ta_*.nc
+ compound_name: atmos.ta.tpt-p6-hxy-air.3hr.glb
+ model_variable: ta
+
+ - name: ua_3hrPt_plev6
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_3h_pl6_ua_*.nc
+ compound_name: atmos.ua.tpt-p6-hxy-air.3hr.glb
+ model_variable: ua
+
+ - name: va_3hrPt_plev6
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_3h_pl6_va_*.nc
+ compound_name: atmos.va.tpt-p6-hxy-air.3hr.glb
+ model_variable: va
+
+ - name: wap_3hrPt_plev6
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_3h_pl6_wap_*.nc
+ compound_name: atmos.wap.tpt-p6-hxy-air.3hr.glb
+ model_variable: wap
+
+ - name: hus_3hrPt_plev6
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_3h_pl6_hus_*.nc
+ compound_name: atmos.hus.tpt-p6-hxy-air.3hr.glb
+ model_variable: hus
+
+ # ============================================================
+ # 3hr instantaneous boundary layer depth
+ # ============================================================
+
+ - name: bldep_3hrPt
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_3h_bldep_bldep_*.nc
+ compound_name: atmos.bldep.tpt-u-hxy-u.3hr.glb
+ model_variable: bldep
+
+ # ============================================================
+ # 6hr averaged snowfall flux
+ # ============================================================
+
+ - name: prsn_6hr
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_6h_prsn_prsn_*.nc
+ compound_name: atmos.prsn.tavg-u-hxy-u.6hr.glb
+ model_variable: prsn
+
+ # ============================================================
+ # Monthly net radiation (Emon)
+ # ============================================================
+
+ - name: rls_mon
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_mon_netrad_rls_*.nc
+ compound_name: atmos.rls.tavg-u-hxy-u.mon.glb
+ model_variable: rls
+
+ - name: rss_mon
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_mon_netrad_rss_*.nc
+ compound_name: atmos.rss.tavg-u-hxy-u.mon.glb
+ model_variable: rss
+
+ # ============================================================
+ # Monthly aerosol: Liquid Water Path (AERmon)
+ # ============================================================
+
+ - name: lwp_mon
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_mon_netrad_lwp_*.nc
+ compound_name: aerosol.lwp.tavg-u-hxy-u.mon.glb
+ model_variable: lwp
+
+ # ============================================================
+ # Daily snow diagnostics (Eday)
+ # ============================================================
+
+ - name: tsns_day
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_day_snow_tsns_*.nc
+ compound_name: atmos.ts.tavg-u-hxy-lnd.day.glb
+ model_variable: tsns
+
+ - name: snmsl_day
+ inputs:
+ - path: *dp
+ pattern: atm_remapped_day_snow_snmsl_*.nc
+ compound_name: atmos.snmsl.tavg-u-hxy-lnd.day.glb
+ model_variable: snmsl
+
+ # ============================================================
+ # LPJ-GUESS fire emission variables (AERmon)
+ # These use fire_emission_pipeline to apply species-specific
+ # emission factors to total fire carbon flux (fFireAll).
+ # Emission factors from Andreae (2019) Table 1 for savanna/grassland.
+ # ============================================================
+
+ - name: emibbbc_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/fFireAll_monthly.out"
+ compound_name: aerosol.emibbbc.tavg-u-hxy-u.mon.glb
+ model_variable: Total
+ emission_species: bc
+ pipeline: fire_emission_pipeline
+
+ - name: emibbch4_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/fFireAll_monthly.out"
+ compound_name: aerosol.emibbch4.tavg-u-hxy-u.mon.glb
+ model_variable: Total
+ emission_species: ch4
+ pipeline: fire_emission_pipeline
+
+ - name: emibbco_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/fFireAll_monthly.out"
+ compound_name: aerosol.emibbco.tavg-u-hxy-u.mon.glb
+ model_variable: Total
+ emission_species: co
+ pipeline: fire_emission_pipeline
+
+ - name: emibbdms_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/fFireAll_monthly.out"
+ compound_name: aerosol.emibbdms.tavg-u-hxy-u.mon.glb
+ model_variable: Total
+ emission_species: dms
+ pipeline: fire_emission_pipeline
+
+ - name: emibboa_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/fFireAll_monthly.out"
+ compound_name: aerosol.emibboa.tavg-u-hxy-u.mon.glb
+ model_variable: Total
+ emission_species: oa
+ pipeline: fire_emission_pipeline
+
+ - name: emibbso2_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/fFireAll_monthly.out"
+ compound_name: aerosol.emibbso2.tavg-u-hxy-u.mon.glb
+ model_variable: Total
+ emission_species: so2
+ pipeline: fire_emission_pipeline
+
+ - name: emibbvoc_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/fFireAll_monthly.out"
+ compound_name: aerosol.emibbvoc.tavg-u-hxy-u.mon.glb
+ model_variable: Total
+ emission_species: nmvoc
+ pipeline: fire_emission_pipeline
diff --git a/awi-esm3-veg-hr-variables/veg_atm/cmip7_veg_atm_todo.md b/awi-esm3-veg-hr-variables/veg_atm/cmip7_veg_atm_todo.md
new file mode 100644
index 00000000..b29b9955
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/veg_atm/cmip7_veg_atm_todo.md
@@ -0,0 +1,136 @@
+# CMIP7 VEG Atmosphere/Aerosol Variables -- Rule Implementation TODO
+
+Variables from 5 CSVs in `veg_atm/`: 38 total rows.
+These are additional atmosphere and aerosol variables requested for the VEG (vegetation) experiment tier.
+
+Model constraints:
+- Aerosol: MACv2-SP only (no CAMS, no M7) -- most aerosol diagnostics NOT available
+- Fire: BLAZE (SIMFIRE-driven burned area + fire emissions)
+- BVOC: disabled (ifbvoc=0) -- no isoprene/monoterpene emissions
+- CO2: concentration-driven, no tracer
+- LPJ-GUESS output: plain-text .out files, not XIOS
+
+---
+
+## 3-hourly radiation and flux fields (from atmos CSV)
+
+All producible from OpenIFS via XIOS. These are additional frequencies of fields already defined for monthly output in core_atm.
+
+### 3hr averaged (XIOS expressions with deaccum /3600 (1h IFS→XIOS))
+
+- [x] **hfls** (3hr) -- Surface Upward Latent Heat Flux (`W m-2`) -- XIOS: `-slhf/10800`
+- [x] **hfss** (3hr) -- Surface Upward Sensible Heat Flux (`W m-2`) -- XIOS: `-sshf/10800`
+- [x] **rlds** (3hr) -- Surface Downwelling LW Radiation (`W m-2`) -- XIOS: `strd/10800`
+- [x] **rlus** (3hr) -- Surface Upwelling LW Radiation (`W m-2`) -- XIOS: `(strd-str)/10800`
+- [x] **rsds** (3hr) -- Surface Downwelling SW Radiation (`W m-2`) -- XIOS: `ssrd/10800`
+- [x] **rsus** (3hr) -- Surface Upwelling SW Radiation (`W m-2`) -- XIOS: `(ssrd-ssr)/10800`
+
+### 3hr instantaneous on surface (already in _3h_pt file)
+
+- [x] **ps** (3hrPt) -- Surface Air Pressure (`Pa`) -- already in _3h_pt file as `sp`
+
+### 3hr instantaneous on plev6 (need new plev6 axis: 950/900/850/800/750/700 hPa)
+
+- [x] **ta** (E3hrPt, plev6) -- Air Temperature (`K`) -- from `t_pl` on plev6
+- [x] **ua** (E3hrPt, plev6) -- Eastward Wind (`m s-1`) -- from `u_pl` on plev6
+- [x] **va** (E3hrPt, plev6) -- Northward Wind (`m s-1`) -- from `v_pl` on plev6
+- [x] **wap** (E3hrPt, plev6) -- Omega (`Pa s-1`) -- from `w_pl` on plev6
+- [x] **hus** (E3hrPt, plev6) -- Specific Humidity (`1`) -- from `q_pl` on plev6
+
+## 6-hourly fields (from atmos CSV)
+
+- [x] **prsn** (6hr) -- Snowfall Flux (`kg m-2 s-1`) -- XIOS: `sf*1000/21600` with freq_op="6h"
+
+## Monthly net radiation (from atmos CSV)
+
+- [x] **rls** (Emon) -- Net Longwave Surface Radiation (`W m-2`) -- XIOS: `str/21600` (already have `str`)
+- [x] **rss** (Emon) -- Net Shortwave Surface Radiation (`W m-2`) -- XIOS: `ssr/21600` (already have `ssr`)
+
+## 3hr instantaneous boundary layer (from atmos_aerosol_land CSV)
+
+- [x] **bldep** (3hrPt) -- Boundary Layer Depth (`m`) -- from IFS `blh` (already in field_def)
+
+## Daily snow/land variables (from atmos CSV)
+
+These require IFS HTESSEL diagnostics. Some may not be directly available.
+
+### Likely producible from IFS
+
+- [x] **ts** (Eday, snow surface) -- Snow Surface Temperature (`K`) -- from `tsn` (temperature of snow layer)
+- [x] **snmsl** (Eday) -- Water Flowing out of Snowpack (`kg m-2 s-1`) -- from `smlt` (snowmelt): XIOS `smlt*1000/21600`
+- [ ] **hfdsnb** (Eday) -- Downward Heat Flux at Snow Base (`W m-2`) -- NOT a standard IFS output. Would need OIFS source changes or approximation
+
+### Likely NOT producible from IFS without source changes
+
+- [ ] **prrsn** (Eday) -- Fraction of Rainfall on Snow (`1`) -- IFS doesn't partition precip by surface type
+- [ ] **prsnc** (Eday) -- Convective Snowfall Flux (`kg m-2 s-1`) -- IFS has `sf` (total snowfall) but not convective/large-scale split for snow
+- [ ] **prsnsn** (Eday) -- Fraction of Snowfall on Snow (`1`) -- IFS doesn't track this
+- [ ] **snrefr** (Eday) -- Snow Refreezing Flux (`kg m-2 s-1`) -- HTESSEL internal, not output via XIOS
+- [ ] **snwc** (Eday) -- Canopy Snow Amount (`kg m-2`) -- HTESSEL may track intercepted snow but unclear if XIOS-accessible
+
+## Aerosol variables (from aerosol CSV)
+
+### Producible from IFS
+
+- [x] **lwp** (AERmon) -- Liquid Water Path (`kg m-2`) -- = `tclw` (total column liquid water), already in field_def
+
+### NOT producible (need prognostic aerosol model)
+
+- [ ] ~~**ccn** (AERmon)~~ -- Cloud Condensation Nuclei -- requires CAMS/M7
+- [ ] ~~**mmrpm2p5** (AERmon, 3D)~~ -- PM2.5 Mass Mixing Ratio -- requires CAMS/M7
+- [ ] ~~**od550soa** (AERmon)~~ -- Organic Aerosol AOD at 550nm -- requires CAMS/M7
+
+## Cloud microphysics (from atmos_atmosChem_aerosol CSV)
+
+- [ ] ~~**reffsclwtop** (Emon)~~ -- Cloud-Top Effective Droplet Radius -- IFS computes `reff` internally in cloud scheme but not exposed to XIOS. Would need source changes
+
+## Aerosol/chemistry emission variables (from aerosol_atmosChem CSV)
+
+### NOT producible (need prognostic aerosol model)
+
+- [ ] ~~**conccn** (AERmon, 3D)~~ -- Aerosol Number Concentration -- requires CAMS/M7
+
+### Fire emission variables (from LPJ-GUESS BLAZE)
+
+LPJ-GUESS with BLAZE outputs monthly fire carbon emissions (`fFire`, `fFireAll`, `fFireNat`). However, the specific species-resolved biomass burning emissions below require either:
+(a) BLAZE to output species-specific emission factors, or
+(b) post-processing with emission factor tables (e.g., Andreae & Merlet 2001)
+
+- [x] **emibbbc** (AERmon) -- BC Emission from Biomass Burning (`kg m-2 s-1`) -- custom pipeline: `load_lpjguess_monthly` → `compute_fire_emission` (Andreae 2019 EF=0.37 g/kgDM)
+- [x] **emibbch4** (AERmon) -- CH4 Emission from Biomass Burning (`kg m-2 s-1`) -- custom pipeline (EF=1.94 g/kgDM)
+- [x] **emibbco** (AERmon) -- CO Emission from Biomass Burning (`kg m-2 s-1`) -- custom pipeline (EF=63.0 g/kgDM)
+- [x] **emibbdms** (AERmon) -- DMS Emission from Biomass Burning (`kg m-2 s-1`) -- custom pipeline (EF=0.68 g/kgDM)
+- [x] **emibboa** (AERmon) -- Organic Aerosol from Biomass Burning (`kg m-2 s-1`) -- custom pipeline (EF=2.62 g/kgDM)
+- [x] **emibbso2** (AERmon) -- SO2 from Biomass Burning (`kg m-2 s-1`) -- custom pipeline (EF=0.48 g/kgDM)
+- [x] **emibbvoc** (AERmon) -- NMVOC from Biomass Burning (`kg m-2 s-1`) -- custom pipeline (EF=3.4 g/kgDM)
+
+---
+
+## Summary
+
+| Category | Count | Done | Blocked |
+|----------|-------|------|---------|
+| 3hr radiation/flux (XIOS) | 6 | 6 | 0 |
+| 3hr surface instant | 1 | 1 (already done) | 0 |
+| 3hr plev6 instant | 5 | 5 | 0 |
+| 6hr snowfall | 1 | 1 | 0 |
+| Monthly net radiation | 2 | 2 | 0 |
+| 3hr boundary layer | 1 | 1 | 0 |
+| Daily snow/land | 5 | 2 | 3 not producible |
+| Aerosol (lwp) | 1 | 1 | 0 |
+| Aerosol (need CAMS/M7) | 3 | 0 | 3 blocked |
+| Cloud microphysics | 1 | 0 | 1 blocked |
+| Aerosol number conc. | 1 | 0 | 1 blocked |
+| Fire emissions (BLAZE) | 7 | 7 | 0 |
+| **Total** | **38** | **27** | **11 (blocked/not producible)** |
+
+## Implementation status
+
+All 27 producible variables are implemented:
+- XIOS fields defined in `field_def_cmip7.xml`
+- Output files defined in `file_def_oifs_cmip7_spinup.xml.j2`
+- plev6 axis/grid added to `axis_def.xml` and `grid_def.xml`
+- pycmor YAML rules in `cmip7_awiesm3-veg-hr_veg_atm.yaml`
+- Fire emission custom steps (`load_lpjguess_monthly`, `compute_fire_emission`) in `examples/custom_steps.py`
+ - Emission factors from Andreae (2019) Table 1, savanna/grassland
+ - Custom LPJ-GUESS .out file loader (reads plain-text Lon/Lat/Year/Jan..Dec format)
diff --git a/awi-esm3-veg-hr-variables/veg_atm/cmip7_veg_variables_aerosol.csv b/awi-esm3-veg-hr-variables/veg_atm/cmip7_veg_variables_aerosol.csv
new file mode 100644
index 00000000..29dccabe
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/veg_atm/cmip7_veg_variables_aerosol.csv
@@ -0,0 +1,5 @@
+,name,frequency,modeling_realm,standard_name,units,cell_methods,cell_measures,long_name,comment,processing_note,dimensions,out_name,type,positive,spatial_shape,temporal_shape,cmip6_table,physical_parameter_name,variableRootDD,branding_label,branded_variable_name,region,cmip6_compound_name,cmip7_compound_name,uid,priority,flag_values,flag_meanings
+1,aerosol.ccn.tavg-u-hxy-ccl.mon.glb,mon,aerosol,number_concentration_of_cloud_condensation_nuclei_at_stp_in_air,m-3,"area: time: mean where convective_cloud (mean over the portion of the cell containing liquid topped cloud, as seen from top of atmosphere)",area: areacella,Cloud Condensation Nuclei Concentration at Liquid Cloud Top,proposed name: number_concentration_of_ambient_aerosol_in_air_at_liquid_water_cloud_top,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean CMIP7:area: time: mean where convective_cloud (mean over the portion of the cell containing liquid topped cloud, as seen from top of atmosphere),",longitude latitude time,ccn,real,,XY-na,time-intv,AERmon,ccn,ccn,tavg-u-hxy-ccl,ccn_tavg-u-hxy-ccl,glb,AERmon.ccn,aerosol.ccn.tavg-u-hxy-ccl.mon.glb,19c04e94-81b1-11e6-92de-ac72891c3257,high,,
+11,aerosol.lwp.tavg-u-hxy-u.mon.glb,mon,aerosol,atmosphere_mass_content_of_cloud_liquid_water,kg m-2,area: time: mean,area: areacella,Liquid Water Path,The total mass of liquid water in cloud per unit area.,,longitude latitude time,lwp,real,,XY-na,time-intv,AERmon,lwp,lwp,tavg-u-hxy-u,lwp_tavg-u-hxy-u,glb,AERmon.lwp,aerosol.lwp.tavg-u-hxy-u.mon.glb,19bf71ae-81b1-11e6-92de-ac72891c3257,high,,
+12,aerosol.mmrpm2p5.tavg-al-hxy-u.mon.glb,mon,aerosol,mass_fraction_of_pm2p5_dry_aerosol_particles_in_air,kg kg-1,area: time: mean,area: areacella,PM2.5 Mass Mixing Ratio,Mass fraction atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 2.5 micrometers,,longitude latitude alevel time,mmrpm2p5,real,,XY-A,time-intv,AERmon,mmrpm2p5,mmrpm2p5,tavg-al-hxy-u,mmrpm2p5_tavg-al-hxy-u,glb,AERmon.mmrpm2p5,aerosol.mmrpm2p5.tavg-al-hxy-u.mon.glb,19be7b78-81b1-11e6-92de-ac72891c3257,high,,
+16,aerosol.od550soa.tavg-u-hxy-u.mon.glb,mon,aerosol,atmosphere_optical_thickness_due_to_secondary_particulate_organic_matter_ambient_aerosol_particles,1,area: time: mean,area: areacella,Particulate Organic Aerosol Optical Depth at 550nm,total organic aerosol AOD due to secondary aerosol formation,"CHANGE SINCE CMIP6 in CF Standard Name - CMIP6: atmosphere_optical_thickness_due_to_particulate_organic_matter_ambient_aerosol_particles, CMIP7: atmosphere_optical_thickness_due_to_secondary_particulate_organic_matter_ambient_aerosol_particles,",longitude latitude time lambda550nm,od550soa,real,,XY-na,time-intv,AERmon,od550soa,od550soa,tavg-u-hxy-u,od550soa_tavg-u-hxy-u,glb,AERmon.od550soa,aerosol.od550soa.tavg-u-hxy-u.mon.glb,0facb764-817d-11e6-b80b-5404a60d96b5,high,,
\ No newline at end of file
diff --git a/awi-esm3-veg-hr-variables/veg_atm/cmip7_veg_variables_aerosol_atmosChem.csv b/awi-esm3-veg-hr-variables/veg_atm/cmip7_veg_variables_aerosol_atmosChem.csv
new file mode 100644
index 00000000..58166205
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/veg_atm/cmip7_veg_variables_aerosol_atmosChem.csv
@@ -0,0 +1,9 @@
+,name,frequency,modeling_realm,standard_name,units,cell_methods,cell_measures,long_name,comment,processing_note,dimensions,out_name,type,positive,spatial_shape,temporal_shape,cmip6_table,physical_parameter_name,variableRootDD,branding_label,branded_variable_name,region,cmip6_compound_name,cmip7_compound_name,uid,priority,flag_values,flag_meanings
+3,aerosol.conccn.tavg-al-hxy-u.mon.glb,mon,aerosol atmosChem,number_concentration_of_ambient_aerosol_particles_in_air,m-3,area: time: mean,area: areacella,Aerosol Number Concentration,This is the number concentration of air particles in air,,longitude latitude alevel time,conccn,real,,XY-A,time-intv,AERmon,conccn,conccn,tavg-al-hxy-u,conccn_tavg-al-hxy-u,glb,AERmon.conccn,aerosol.conccn.tavg-al-hxy-u.mon.glb,83bbfc13-7f07-11ef-9308-b1dd71e64bec,high,,
+4,aerosol.emibbbc.tavg-u-hxy-u.mon.glb,mon,aerosol atmosChem,tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_fires,kg m-2 s-1,area: time: mean,area: areacella,total emission rate of black carbon aerosol mass from all biomass burning,Total emission rate of black carbon aerosol into the atmosphere from all biomass burning (natural and anthropogenic),Vertical integral,longitude latitude time,emibbbc,real,,XY-na,time-intv,AERmon,emibbbc,emibbbc,tavg-u-hxy-u,emibbbc_tavg-u-hxy-u,glb,AERmon.emibbbc,aerosol.emibbbc.tavg-u-hxy-u.mon.glb,83bbfc0b-7f07-11ef-9308-b1dd71e64bec,high,,
+5,aerosol.emibbch4.tavg-u-hxy-u.mon.glb,mon,aerosol atmosChem,tendency_of_atmosphere_mass_content_of_methane_due_to_emission_from_fires,kg m-2 s-1,area: time: mean,area: areacella,total emission of CH4 from all biomass burning,Total emission rate of methane (CH4) into the atmosphere from all biomass burning (natural and anthropogenic),,longitude latitude time,emibbch4,real,,XY-na,time-intv,AERmon,emibbch4,emibbch4,tavg-u-hxy-u,emibbch4_tavg-u-hxy-u,glb,AERmon.emibbch4,aerosol.emibbch4.tavg-u-hxy-u.mon.glb,83bbfc0a-7f07-11ef-9308-b1dd71e64bec,high,,
+6,aerosol.emibbco.tavg-u-hxy-u.mon.glb,mon,aerosol atmosChem,tendency_of_atmosphere_mass_content_of_carbon_monoxide_due_to_emission_from_fires,kg m-2 s-1,area: time: mean,area: areacella,total emission rate of CO from all biomass burning,Total emission rate of carbon monoxide (CO) into the atmosphere from all biomass burning (natural and anthropogenic),,longitude latitude time,emibbco,real,,XY-na,time-intv,AERmon,emibbco,emibbco,tavg-u-hxy-u,emibbco_tavg-u-hxy-u,glb,AERmon.emibbco,aerosol.emibbco.tavg-u-hxy-u.mon.glb,83bbfc09-7f07-11ef-9308-b1dd71e64bec,high,,
+7,aerosol.emibbdms.tavg-u-hxy-u.mon.glb,mon,aerosol atmosChem,tendency_of_atmosphere_mass_content_of_dimethyl_sulfide_due_to_emission_from_fires,kg m-2 s-1,area: time: mean,area: areacella,total emission of DMS from all biomass burning,Total emission rate of dimethyl sulfide (DMS) into the atmosphere from all biomass burning (natural and anthropogenic),,longitude latitude time,emibbdms,real,,XY-na,time-intv,AERmon,emibbdms,emibbdms,tavg-u-hxy-u,emibbdms_tavg-u-hxy-u,glb,AERmon.emibbdms,aerosol.emibbdms.tavg-u-hxy-u.mon.glb,83bbfc08-7f07-11ef-9308-b1dd71e64bec,high,,
+8,aerosol.emibboa.tavg-u-hxy-u.mon.glb,mon,aerosol atmosChem,tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_due_to_emission_from_fires,kg m-2 s-1,area: time: mean,area: areacella,total emission of organic aerosol from all biomass burning,Total emission rate of particulate organic matter (organic aerosol) into the atmosphere from all biomass burning (natural and anthropogenic),,longitude latitude time,emibboa,real,,XY-na,time-intv,AERmon,emibboa,emibboa,tavg-u-hxy-u,emibboa_tavg-u-hxy-u,glb,AERmon.emibboa,aerosol.emibboa.tavg-u-hxy-u.mon.glb,83bbfc05-7f07-11ef-9308-b1dd71e64bec,high,,
+9,aerosol.emibbso2.tavg-u-hxy-u.mon.glb,mon,aerosol atmosChem,tendency_of_atmosphere_mass_content_of_sulfur_dioxide_due_to_emission_from_fires,kg m-2 s-1,area: time: mean,area: areacella,total emission rate of SO2 from all biomass burning,Total emission rate of SO2 into the atmosphere from all biomass burning (natural and anthropogenic).,,longitude latitude time,emibbso2,real,,XY-na,time-intv,AERmon,emibbso2,emibbso2,tavg-u-hxy-u,emibbso2_tavg-u-hxy-u,glb,AERmon.emibbso2,aerosol.emibbso2.tavg-u-hxy-u.mon.glb,83bbfc04-7f07-11ef-9308-b1dd71e64bec,high,,
+10,aerosol.emibbvoc.tavg-u-hxy-u.mon.glb,mon,aerosol atmosChem,tendency_of_atmosphere_mass_content_of_nmvoc_due_to_emission_from_fires,kg m-2 s-1,area: time: mean,area: areacella,total emission rate of NMVOC from all biomass burning,Total emission rate of non-methane volatile organic compounds (NMVOCs) from all biomass burning (natural and anthropogenic),,longitude latitude time,emibbvoc,real,,XY-na,time-intv,AERmon,emibbvoc,emibbvoc,tavg-u-hxy-u,emibbvoc_tavg-u-hxy-u,glb,AERmon.emibbvoc,aerosol.emibbvoc.tavg-u-hxy-u.mon.glb,83bbfc03-7f07-11ef-9308-b1dd71e64bec,high,,
\ No newline at end of file
diff --git a/awi-esm3-veg-hr-variables/veg_atm/cmip7_veg_variables_atmos.csv b/awi-esm3-veg-hr-variables/veg_atm/cmip7_veg_variables_atmos.csv
new file mode 100644
index 00000000..770bb2d6
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/veg_atm/cmip7_veg_variables_atmos.csv
@@ -0,0 +1,25 @@
+,name,frequency,modeling_realm,standard_name,units,cell_methods,cell_measures,long_name,comment,processing_note,dimensions,out_name,type,positive,spatial_shape,temporal_shape,cmip6_table,physical_parameter_name,variableRootDD,branding_label,branded_variable_name,region,cmip6_compound_name,cmip7_compound_name,uid,priority,flag_values,flag_meanings
+31,atmos.hfdsnb.tavg-u-hxy-lnd.day.glb,day,atmos,downward_heat_flux_at_ground_level_in_snow,W m-2,area: mean where land time: mean,area: areacella,Downward Heat Flux at Snow Base,Downward heat flux at snow botton,,longitude latitude time,hfdsnb,real,down,XY-na,time-intv,Eday,hfdsnb,hfdsnb,tavg-u-hxy-lnd,hfdsnb_tavg-u-hxy-lnd,glb,Eday.hfdsnb,atmos.hfdsnb.tavg-u-hxy-lnd.day.glb,f2fb0ac8-c38d-11e6-abc1-1b922e5e1118,medium,,
+32,atmos.hfls.tavg-u-hxy-u.3hr.glb,3hr,atmos,surface_upward_latent_heat_flux,W m-2,area: time: mean,area: areacella,Surface Upward Latent Heat Flux,This is the 3-hour mean flux.,,longitude latitude time,hfls,real,up,XY-na,time-intv,3hr,hfls,hfls,tavg-u-hxy-u,hfls_tavg-u-hxy-u,glb,3hr.hfls,atmos.hfls.tavg-u-hxy-u.3hr.glb,baaefbcc-e5dd-11e5-8482-ac72891c3257,high,,
+34,atmos.hfss.tavg-u-hxy-u.3hr.glb,3hr,atmos,surface_upward_sensible_heat_flux,W m-2,area: time: mean,area: areacella,Surface Upward Sensible Heat Flux,This is the 3-hour mean flux.,,longitude latitude time,hfss,real,up,XY-na,time-intv,3hr,hfss,hfss,tavg-u-hxy-u,hfss_tavg-u-hxy-u,glb,3hr.hfss,atmos.hfss.tavg-u-hxy-u.3hr.glb,baaf8452-e5dd-11e5-8482-ac72891c3257,high,,
+42,atmos.hus.tpt-p6-hxy-air.3hr.glb,3hr,atmos,specific_humidity,1,area: mean where air time: point,area: areacella,Specific humidity,Specific humidity on 6 pressure levels in the lower troposphere,950 hPa to 700 hPa with an interval of 50h Pa for vertical layers (6 vertical layers),longitude latitude plev6 time1,hus,real,,XY-P6,time-point,E3hrPt,hus6,hus,tpt-p6-hxy-air,hus_tpt-p6-hxy-air,glb,E3hrPt.hus6,atmos.hus.tpt-p6-hxy-air.3hr.glb,80ab7430-a698-11ef-914a-613c0433d878,medium,,
+55,atmos.prrsn.tavg-u-hxy-lnd.day.glb,day,atmos,mass_fraction_of_rainfall_falling_onto_surface_snow,1,area: mean where land time: mean,area: areacella,Fraction of Rainfall on Snow,mass_fraction_of_rainfall_onto_snow,,longitude latitude time,prrsn,real,,XY-na,time-intv,Eday,prrsn,prrsn,tavg-u-hxy-lnd,prrsn_tavg-u-hxy-lnd,glb,Eday.prrsn,atmos.prrsn.tavg-u-hxy-lnd.day.glb,d228be24-4a9f-11e6-b84e-ac72891c3257,medium,,
+57,atmos.prsn.tavg-u-hxy-u.6hr.glb,6hr,atmos,snowfall_flux,kg m-2 s-1,area: time: mean,area: areacella,Snowfall Flux,Precipitation rate at surface: Includes precipitation of all forms of water in the solid phase.,,longitude latitude time,prsn,real,,XY-na,time-intv,6hrPlev,prsn,prsn,tavg-u-hxy-u,prsn_tavg-u-hxy-u,glb,6hrPlev.prsn,atmos.prsn.tavg-u-hxy-u.6hr.glb,83bbfc5b-7f07-11ef-9308-b1dd71e64bec,high,,
+60,atmos.prsnc.tavg-u-hxy-lnd.day.glb,day,atmos,convective_snowfall_flux,kg m-2 s-1,area: mean where land time: mean,area: areacella,Convective Snowfall Flux,convective_snowfall_flux,,longitude latitude time,prsnc,real,,XY-na,time-intv,Eday,prsnc,prsnc,tavg-u-hxy-lnd,prsnc_tavg-u-hxy-lnd,glb,Eday.prsnc,atmos.prsnc.tavg-u-hxy-lnd.day.glb,d2280a56-4a9f-11e6-b84e-ac72891c3257,medium,,
+61,atmos.prsnsn.tavg-u-hxy-lnd.day.glb,day,atmos,mass_fraction_of_solid_precipitation_falling_onto_surface_snow,1,area: mean where land time: mean,area: areacella,Fraction of Snowfall (Including Hail and Graupel) on Snow,mass_fraction_of_snowfall_onto_snow,,longitude latitude time,prsnsn,real,,XY-na,time-intv,Eday,prsnsn,prsnsn,tavg-u-hxy-lnd,prsnsn_tavg-u-hxy-lnd,glb,Eday.prsnsn,atmos.prsnsn.tavg-u-hxy-lnd.day.glb,d228c2ca-4a9f-11e6-b84e-ac72891c3257,medium,,
+65,atmos.ps.tpt-u-hxy-u.3hr.glb,3hr,atmos,surface_air_pressure,Pa,area: mean time: point,area: areacella,Surface Air Pressure,"sampled synoptically to diagnose atmospheric tides, this is better than mean sea level pressure.",,longitude latitude time1,ps,real,,XY-na,time-point,3hr,ps,ps,tpt-u-hxy-u,ps_tpt-u-hxy-u,glb,3hr.ps,atmos.ps.tpt-u-hxy-u.3hr.glb,bab47354-e5dd-11e5-8482-ac72891c3257,high,,
+69,atmos.rlds.tavg-u-hxy-u.3hr.glb,3hr,atmos,surface_downwelling_longwave_flux_in_air,W m-2,area: time: mean,area: areacella,Surface Downwelling Longwave Radiation,This is the 3-hour mean flux.,,longitude latitude time,rlds,real,down,XY-na,time-intv,3hr,rlds,rlds,tavg-u-hxy-u,rlds_tavg-u-hxy-u,glb,3hr.rlds,atmos.rlds.tavg-u-hxy-u.3hr.glb,bab52b5a-e5dd-11e5-8482-ac72891c3257,high,,
+72,atmos.rls.tavg-u-hxy-u.mon.glb,mon,atmos,surface_net_downward_longwave_flux,W m-2,area: time: mean,area: areacella,Net Longwave Surface Radiation,Net longwave surface radiation,,longitude latitude time,rls,real,down,XY-na,time-intv,Emon,rls,rls,tavg-u-hxy-u,rls_tavg-u-hxy-u,glb,Emon.rls,atmos.rls.tavg-u-hxy-u.mon.glb,8b922368-4a5b-11e6-9cd2-ac72891c3257,high,,
+73,atmos.rlus.tavg-u-hxy-u.3hr.glb,3hr,atmos,surface_upwelling_longwave_flux_in_air,W m-2,area: time: mean,area: areacella,Surface Upwelling Longwave Radiation,This is the 3-hour mean flux.,,longitude latitude time,rlus,real,up,XY-na,time-intv,3hr,rlus,rlus,tavg-u-hxy-u,rlus_tavg-u-hxy-u,glb,3hr.rlus,atmos.rlus.tavg-u-hxy-u.3hr.glb,bab59202-e5dd-11e5-8482-ac72891c3257,high,,
+78,atmos.rsds.tavg-u-hxy-u.3hr.glb,3hr,atmos,surface_downwelling_shortwave_flux_in_air,W m-2,area: time: mean,area: areacella,Surface Downwelling Shortwave Radiation,This is the 3-hour mean flux.,,longitude latitude time,rsds,real,down,XY-na,time-intv,3hr,rsds,rsds,tavg-u-hxy-u,rsds_tavg-u-hxy-u,glb,3hr.rsds,atmos.rsds.tavg-u-hxy-u.3hr.glb,bab5df78-e5dd-11e5-8482-ac72891c3257,high,,
+83,atmos.rss.tavg-u-hxy-u.mon.glb,mon,atmos,surface_net_downward_shortwave_flux,W m-2,area: time: mean,area: areacella,Net Shortwave Surface Radiation,Net downward shortwave radiation at the surface,,longitude latitude time,rss,real,down,XY-na,time-intv,Emon,rss,rss,tavg-u-hxy-u,rss_tavg-u-hxy-u,glb,Emon.rss,atmos.rss.tavg-u-hxy-u.mon.glb,6f68f91c-9acb-11e6-b7ee-ac72891c3257,high,,
+84,atmos.rsus.tavg-u-hxy-u.3hr.glb,3hr,atmos,surface_upwelling_shortwave_flux_in_air,W m-2,area: time: mean,area: areacella,Surface Upwelling Shortwave Radiation,This is the 3-hour mean flux.,,longitude latitude time,rsus,real,up,XY-na,time-intv,3hr,rsus,rsus,tavg-u-hxy-u,rsus_tavg-u-hxy-u,glb,3hr.rsus,atmos.rsus.tavg-u-hxy-u.3hr.glb,bab65138-e5dd-11e5-8482-ac72891c3257,high,,
+93,atmos.snmsl.tavg-u-hxy-lnd.day.glb,day,atmos,liquid_water_mass_flux_into_soil_due_to_surface_snow_melt,kg m-2 s-1,area: mean where land time: mean,area: areacella,Water Flowing out of Snowpack,surface_snow_melt_flux_into_soil_layer,,longitude latitude time,snmsl,real,,XY-na,time-intv,Eday,snmsl,snmsl,tavg-u-hxy-lnd,snmsl_tavg-u-hxy-lnd,glb,Eday.snmsl,atmos.snmsl.tavg-u-hxy-lnd.day.glb,d2285222-4a9f-11e6-b84e-ac72891c3257,medium,,
+94,atmos.snrefr.tavg-u-hxy-lnd.day.glb,day,atmos,surface_snow_and_ice_refreezing_flux,kg m-2 s-1,area: mean where land time: mean,area: areacella,Refreezing of Water in the Snow,surface_snow_and_ice_refreezing_flux,,longitude latitude time,snrefr,real,,XY-na,time-intv,Eday,snrefr,snrefr,tavg-u-hxy-lnd,snrefr_tavg-u-hxy-lnd,glb,Eday.snrefr,atmos.snrefr.tavg-u-hxy-lnd.day.glb,d2284d90-4a9f-11e6-b84e-ac72891c3257,medium,,
+95,atmos.snwc.tavg-u-hxy-lnd.day.glb,day,atmos,canopy_snow_amount,kg m-2,area: mean where land time: mean,area: areacella,Snow Water Equivalent Intercepted by the Vegetation,canopy_snow_amount,,longitude latitude time,snwc,real,,XY-na,time-intv,Eday,snwc,snwc,tavg-u-hxy-lnd,snwc_tavg-u-hxy-lnd,glb,Eday.snwc,atmos.snwc.tavg-u-hxy-lnd.day.glb,d2288e36-4a9f-11e6-b84e-ac72891c3257,medium,,
+98,atmos.ta.tpt-p6-hxy-air.3hr.glb,3hr,atmos,air_temperature,K,area: mean where air time: point,area: areacella,Air temperature,Air temperature on 6 pressure levels in the lower troposphere,950 hPa to 700 hPa with an interval of 50h Pa for vertical layers (6 vertical layers),longitude latitude plev6 time1,ta,real,,XY-P6,time-point,E3hrPt,ta6,ta,tpt-p6-hxy-air,ta_tpt-p6-hxy-air,glb,E3hrPt.ta6,atmos.ta.tpt-p6-hxy-air.3hr.glb,80ab7434-a698-11ef-914a-613c0433d878,medium,,
+109,atmos.ts.tavg-u-hxy-lnd.day.glb,day,atmos,surface_temperature,K,area: time: mean where snow (on land),area: areacella,Snow Surface Temperature,Snow Surface Temperature,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where land time: mean CMIP7:area: mean where land time: mean (weighted by snow area),
+CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where land time: mean CMIP7:area: time: mean where snow (on land),",longitude latitude time,ts,real,,XY-na,time-intv,Eday,tsns,ts,tavg-u-hxy-lnd,ts_tavg-u-hxy-lnd,glb,Eday.tsns,atmos.ts.tavg-u-hxy-lnd.day.glb,d227b7c2-4a9f-11e6-b84e-ac72891c3257,medium,,
+113,atmos.ua.tpt-p6-hxy-air.3hr.glb,3hr,atmos,eastward_wind,m s-1,area: mean where air time: point,area: areacella,Eastward wind,Zonal wind (positive in a eastward direction) on 6 pressure levels in the lower troposphere,950 hPa to 700 hPa with an interval of 50h Pa for vertical layers (6 vertical layers),longitude latitude plev6 time1,ua,real,,XY-P6,time-point,E3hrPt,ua6,ua,tpt-p6-hxy-air,ua_tpt-p6-hxy-air,glb,E3hrPt.ua6,atmos.ua.tpt-p6-hxy-air.3hr.glb,80ab7431-a698-11ef-914a-613c0433d878,medium,,
+118,atmos.va.tpt-p6-hxy-air.3hr.glb,3hr,atmos,northward_wind,m s-1,area: mean where air time: point,area: areacella,Northward Wind,Meridional wind (positive in a northward direction) on 6 pressure levels in the lower troposphere,950 hPa to 700 hPa with an interval of 50h Pa for vertical layers (6 vertical layers),longitude latitude plev6 time1,va,real,,XY-P6,time-point,E3hrPt,va6,va,tpt-p6-hxy-air,va_tpt-p6-hxy-air,glb,E3hrPt.va6,atmos.va.tpt-p6-hxy-air.3hr.glb,80ab7432-a698-11ef-914a-613c0433d878,medium,,
+123,atmos.wap.tpt-p6-hxy-air.3hr.glb,3hr,atmos,lagrangian_tendency_of_air_pressure,Pa s-1,area: mean where air time: point,area: areacella,Omega (=dp/dt),Omega (=dp/dt) on 6 pressure levels in the lower troposphere,950 hPa to 700 hPa with an interval of 50h Pa for vertical layers (6 vertical layers),longitude latitude plev6 time1,wap,real,,XY-P6,time-point,E3hrPt,wap6,wap,tpt-p6-hxy-air,wap_tpt-p6-hxy-air,glb,E3hrPt.wap6,atmos.wap.tpt-p6-hxy-air.3hr.glb,80ab7433-a698-11ef-914a-613c0433d878,medium,,
\ No newline at end of file
diff --git a/awi-esm3-veg-hr-variables/veg_atm/cmip7_veg_variables_atmos_aerosol_land.csv b/awi-esm3-veg-hr-variables/veg_atm/cmip7_veg_variables_atmos_aerosol_land.csv
new file mode 100644
index 00000000..4a8a2fc2
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/veg_atm/cmip7_veg_variables_atmos_aerosol_land.csv
@@ -0,0 +1,2 @@
+,name,frequency,modeling_realm,standard_name,units,cell_methods,cell_measures,long_name,comment,processing_note,dimensions,out_name,type,positive,spatial_shape,temporal_shape,cmip6_table,physical_parameter_name,variableRootDD,branding_label,branded_variable_name,region,cmip6_compound_name,cmip7_compound_name,uid,priority,flag_values,flag_meanings
+18,atmos.bldep.tpt-u-hxy-u.3hr.glb,3hr,atmos aerosol land,atmosphere_boundary_layer_thickness,m,area: mean time: point,area: areacella,Boundary Layer Depth,Boundary Layer Depth every 3 hours,,longitude latitude time1,bldep,real,,XY-na,time-point,3hrPt,bldep,bldep,tpt-u-hxy-u,bldep_tpt-u-hxy-u,glb,3hrPt.bldep,atmos.bldep.tpt-u-hxy-u.3hr.glb,83bbfc71-7f07-11ef-9308-b1dd71e64bec,high,,
\ No newline at end of file
diff --git a/awi-esm3-veg-hr-variables/veg_atm/cmip7_veg_variables_atmos_atmosChem_aerosol.csv b/awi-esm3-veg-hr-variables/veg_atm/cmip7_veg_variables_atmos_atmosChem_aerosol.csv
new file mode 100644
index 00000000..44b510e1
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/veg_atm/cmip7_veg_variables_atmos_atmosChem_aerosol.csv
@@ -0,0 +1,2 @@
+,name,frequency,modeling_realm,standard_name,units,cell_methods,cell_measures,long_name,comment,processing_note,dimensions,out_name,type,positive,spatial_shape,temporal_shape,cmip6_table,physical_parameter_name,variableRootDD,branding_label,branded_variable_name,region,cmip6_compound_name,cmip7_compound_name,uid,priority,flag_values,flag_meanings
+68,atmos.reffsclwtop.tavg-u-hxy-scl.mon.glb,mon,atmos atmosChem aerosol,effective_radius_of_stratiform_cloud_liquid_water_particles_at_stratiform_liquid_water_cloud_top,m,area: time: mean where stratiform_cloud (weighted by area of upper-most stratiform liquid water layer),area: areacella,Cloud-Top Effective Droplet Radius in Stratiform Cloud,Cloud-Top Effective Droplet Radius in Stratiform Cloud,,longitude latitude time,reffsclwtop,real,,XY-na,time-intv,Emon,reffsclwtop,reffsclwtop,tavg-u-hxy-scl,reffsclwtop_tavg-u-hxy-scl,glb,Emon.reffsclwtop,atmos.reffsclwtop.tavg-u-hxy-scl.mon.glb,83bbfb9b-7f07-11ef-9308-b1dd71e64bec,high,,
\ No newline at end of file
diff --git a/awi-esm3-veg-hr-variables/veg_land/cmip7_awiesm3-veg-hr_land.yaml b/awi-esm3-veg-hr-variables/veg_land/cmip7_awiesm3-veg-hr_land.yaml
new file mode 100644
index 00000000..5fa83cff
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/veg_land/cmip7_awiesm3-veg-hr_land.yaml
@@ -0,0 +1,623 @@
+# CMIP7 VEG Land Variables — AWI-ESM3-VEG-HR
+# Generated from 3 CSVs in veg_land/
+#
+# Part 1: IFS/HTESSEL variables via XIOS (3hr, daily, monthly)
+# Part 2: LPJ-GUESS variables from plain-text .out files
+# ~58 producible out of 88 total variables
+
+general:
+ name: "awiesm3-cmip7-veg-land"
+ cmor_version: "CMIP7"
+ mip: "CMIP"
+ CMIP7_DReq_metadata: "/home/a/a270092/.cache/pycmor/cmip7_metadata/v1.2.2.2/full_metadata.json"
+
+pycmor:
+ warn_on_no_rule: False
+ dask_cluster: "slurm"
+ dask_cluster_scaling_mode: "fixed"
+ dask_cluster_scaling_fixed_jobs: 1
+
+jobqueue:
+ slurm:
+ name: pycmor-worker
+ queue: compute
+ account: bb1469
+ cores: 16
+ memory: 256GB
+ walltime: '00:30:00'
+
+pipelines:
+ # Custom pipeline for temporal differencing (dgw, dsn, dsw)
+ - name: temporal_diff_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_temporal_diff
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Custom pipeline for terrestrial water storage (summation)
+ - name: mrtws_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_mrtws
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Custom pipeline for snow depth (SWE to physical depth)
+ - name: snd_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_snd
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # LPJ-GUESS monthly loader (Jan..Dec format)
+ - name: lpjg_monthly_pipeline
+ steps:
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:load_lpjguess_monthly
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # LPJ-GUESS yearly loader (Lon/Lat/Year/Total format)
+ - name: lpjg_yearly_pipeline
+ steps:
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:load_lpjguess_yearly
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # LPJ-GUESS yearly Lut loader (Lon/Lat/Year/psl/crp/pst/urb format)
+ - name: lpjg_yearly_lut_pipeline
+ steps:
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:load_lpjguess_yearly_lut
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # LPJ-GUESS monthly Lut loader (Lon/Lat/Year/Mth/psl/crp/pst/urb format)
+ - name: lpjg_monthly_lut_pipeline
+ steps:
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:load_lpjguess_monthly_lut
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+inherit:
+ data_path: &dp /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/oifs
+ lpjg_data_path: &ldp /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/lpj_guess
+ source_id: AWI-ESM-3
+ institution_id: AWI
+ experiment_id: picontrol
+ variant_label: r1i1p1f1
+ grid_label: gn
+ grid: "OpenIFS TCo319 reduced Gaussian, interpolated to 0.25deg regular grid"
+ nominal_resolution: "25 km"
+ institution: "Alfred Wegener Institute, Helmholtz Centre for Polar and Marine Research, Bremerhaven, Germany"
+ output_directory: ./cmorized_output/awiesm3
+
+rules:
+ # ============================================================
+ # Part 1: IFS/HTESSEL variables via XIOS
+ # ============================================================
+
+ # --- 3hr averaged fields ---
+
+ - name: mrro_3hr
+ inputs:
+ - path: *dp
+ pattern: atmos_3h_land_mrro_*.nc
+ compound_name: land.mrro.tavg-u-hxy-lnd.3hr.glb
+ model_variable: mrro
+
+ - name: mrros_3hr
+ inputs:
+ - path: *dp
+ pattern: atmos_3h_land_mrros_*.nc
+ compound_name: land.mrros.tavg-u-hxy-lnd.3hr.glb
+ model_variable: mrros
+
+ - name: esn_day
+ inputs:
+ - path: *dp
+ pattern: atmos_3h_land_esn_*.nc
+ compound_name: land.esn.tavg-u-hxy-lnd.day.glb
+ model_variable: esn
+
+ - name: srfrad_3hr
+ inputs:
+ - path: *dp
+ pattern: atmos_3h_land_srfrad_*.nc
+ compound_name: land.srfrad.tavg-u-hxy-u.3hr.glb
+ model_variable: srfrad
+
+ - name: hfdsl_3hr
+ inputs:
+ - path: *dp
+ pattern: atmos_3h_land_hfdsl_*.nc
+ compound_name: land.hfdsl.tavg-u-hxy-lnd.3hr.glb
+ model_variable: hfdsl
+
+ - name: tslsi_3hr
+ inputs:
+ - path: *dp
+ pattern: atmos_3h_land_tslsi_*.nc
+ compound_name: land.tslsi.tpt-u-hxy-lsi.3hr.glb
+ model_variable: tslsi
+
+ - name: mrsol_3hr_100cm
+ inputs:
+ - path: *dp
+ pattern: atmos_3h_land_mrsol_*.nc
+ compound_name: land.mrsol.tavg-d100cm-hxy-lnd.3hr.glb
+ model_variable: mrsol
+
+ # 3hr instant mrsol at 10cm (reuse existing core_land mrsol field)
+ - name: mrsol_3hr_10cm
+ inputs:
+ - path: *dp
+ pattern: atmos_3h_land_mrsol_*.nc
+ compound_name: land.mrsol.tpt-d10cm-hxy-lnd.3hr.glb
+ model_variable: mrsol
+
+ # --- Daily averaged fields ---
+
+ - name: evspsblpot_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_land_evspsblpot_*.nc
+ compound_name: land.evspsblpot.tavg-u-hxy-lnd.day.glb
+ model_variable: evspsblpot
+
+ - name: mrrob_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_land_mrrob_*.nc
+ compound_name: land.mrrob.tavg-u-hxy-lnd.day.glb
+ model_variable: mrrob
+
+ - name: sbl_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_land_sbl_*.nc
+ compound_name: landIce.sbl.tavg-u-hxy-u.day.glb
+ model_variable: sbl
+
+ - name: snm_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_land_snm_*.nc
+ compound_name: landIce.snm.tavg-u-hxy-lnd.day.glb
+ model_variable: snm
+
+ - name: tsn_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_snow_tsns_*.nc
+ compound_name: landIce.tsn.tavg-u-hxy-lnd.day.glb
+ model_variable: tsns
+ time_dimname: time_counter
+
+ # --- Daily fields from custom pipelines ---
+
+ - name: snd_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_land_*.nc
+ compound_name: landIce.snd.tavg-u-hxy-lnd.day.glb
+ model_variable: sd
+ snow_density_variable: rsn
+ pipeline: snd_pipeline
+
+ - name: dgw_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_land_swvl4_*.nc
+ compound_name: land.dgw.tavg-u-hxy-lnd.day.glb
+ model_variable: swvl4
+ layer_thickness: 1.89
+ pipeline: temporal_diff_pipeline
+
+ - name: dsn_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_land_sd_*.nc
+ compound_name: land.dsn.tavg-u-hxy-lnd.day.glb
+ model_variable: sd
+ scale_factor: 1000.0
+ pipeline: temporal_diff_pipeline
+
+ - name: dsw_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_land_*.nc
+ compound_name: land.dsw.tavg-u-hxy-lnd.day.glb
+ model_variable: total_water
+ pipeline: temporal_diff_pipeline
+
+ - name: mrtws_day
+ inputs:
+ - path: *dp
+ pattern: atmos_day_land_*.nc
+ compound_name: land.mrtws.tavg-u-hxy-lnd.day.glb
+ model_variable: total_water
+ pipeline: mrtws_pipeline
+
+ # --- Monthly fields ---
+
+ - name: evspsblpot_mon
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_land_evspsblpot_*.nc
+ compound_name: land.evspsblpot.tavg-u-hxy-lnd.mon.glb
+ model_variable: evspsblpot
+
+ - name: sbl_mon
+ inputs:
+ - path: *dp
+ pattern: atmos_mon_land_sbl_*.nc
+ compound_name: landIce.sbl.tavg-u-hxy-lnd.mon.glb
+ model_variable: sbl
+
+ # ============================================================
+ # Part 2: LPJ-GUESS variables (plain-text .out files)
+ # ============================================================
+
+ # --- Yearly fraction variables (Eyr) ---
+
+ - name: baresoilFrac_yr
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/baresoilFrac_yearly.out"
+ compound_name: land.baresoilFrac.tavg-u-hxy-u.yr.glb
+ model_variable: Total
+ pipeline: lpjg_yearly_pipeline
+
+ - name: cropFrac_yr
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/cropFrac_yearly.out"
+ compound_name: land.cropFrac.tavg-u-hxy-u.yr.glb
+ model_variable: Total
+ pipeline: lpjg_yearly_pipeline
+
+ - name: grassFrac_yr
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/grassFrac_yearly.out"
+ compound_name: land.grassFrac.tavg-u-hxy-u.yr.glb
+ model_variable: Total
+ pipeline: lpjg_yearly_pipeline
+
+ - name: shrubFrac_yr
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/shrubFrac_yearly.out"
+ compound_name: land.shrubFrac.tavg-u-hxy-u.yr.glb
+ model_variable: Total
+ pipeline: lpjg_yearly_pipeline
+
+ - name: treeFrac_yr
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/treeFrac_yearly.out"
+ compound_name: land.treeFrac.tavg-u-hxy-u.yr.glb
+ model_variable: Total
+ pipeline: lpjg_yearly_pipeline
+
+ # --- Yearly Lut variables (Eyr) ---
+
+ - name: cLitterLut_yr
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/cLitterLut_yearly.out"
+ compound_name: land.cLitterLut.tpt-u-hxy-multi.yr.glb
+ model_variable: psl
+ pipeline: lpjg_yearly_lut_pipeline
+
+ - name: cProductLut_yr
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/cProductLut_yearly.out"
+ compound_name: land.cProductLut.tpt-u-hxy-multi.yr.glb
+ model_variable: psl
+ pipeline: lpjg_yearly_lut_pipeline
+
+ - name: cSoilLut_yr
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/cSoilLut_yearly.out"
+ compound_name: land.cSoilLut.tpt-u-hxy-multi.yr.glb
+ model_variable: psl
+ pipeline: lpjg_yearly_lut_pipeline
+
+ - name: cVegLut_yr
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/cVegLut_yearly.out"
+ compound_name: land.cVegLut.tpt-u-hxy-multi.yr.glb
+ model_variable: psl
+ pipeline: lpjg_yearly_lut_pipeline
+
+ - name: fracLut_yr
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/fracLut_yearly.out"
+ compound_name: land.fracLut.tpt-u-hxy-u.yr.glb
+ model_variable: psl
+ pipeline: lpjg_yearly_lut_pipeline
+
+ - name: fracInLut_yr
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/fracInLut_yearly.out"
+ compound_name: land.fracInLut.tsum-u-hxy-lnd.yr.glb
+ model_variable: psl
+ pipeline: lpjg_yearly_lut_pipeline
+
+ - name: fracOutLut_yr
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/fracOutLut_yearly.out"
+ compound_name: land.fracOutLut.tsum-u-hxy-lnd.yr.glb
+ model_variable: psl
+ pipeline: lpjg_yearly_lut_pipeline
+
+ # --- Monthly Lut variables (Emon) ---
+
+ - name: fracLut_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/fracLut_monthly.out"
+ compound_name: land.fracLut.tpt-u-hxy-u.mon.glb
+ model_variable: psl
+ pipeline: lpjg_monthly_lut_pipeline
+
+ - name: gppLut_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/gppLut_monthly.out"
+ compound_name: land.gppLut.tavg-u-hxy-multi.mon.glb
+ model_variable: psl
+ pipeline: lpjg_monthly_lut_pipeline
+
+ - name: laiLut_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/laiLut_monthly.out"
+ compound_name: land.laiLut.tavg-u-hxy-multi.mon.glb
+ model_variable: psl
+ pipeline: lpjg_monthly_lut_pipeline
+
+ - name: mrsolLut_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/mrsoLut_monthly.out"
+ compound_name: land.mrsolLut.tavg-d10cm-hxy-multi.mon.glb
+ model_variable: psl
+ pipeline: lpjg_monthly_lut_pipeline
+
+ - name: nppLut_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/nppLut_monthly.out"
+ compound_name: land.nppLut.tavg-u-hxy-multi.mon.glb
+ model_variable: psl
+ pipeline: lpjg_monthly_lut_pipeline
+
+ - name: raLut_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/raLut_monthly.out"
+ compound_name: land.raLut.tavg-u-hxy-multi.mon.glb
+ model_variable: psl
+ pipeline: lpjg_monthly_lut_pipeline
+
+ - name: rhLut_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/rhLut_monthly.out"
+ compound_name: land.rhLut.tavg-u-hxy-multi.mon.glb
+ model_variable: psl
+ pipeline: lpjg_monthly_lut_pipeline
+
+ - name: irrLut_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/irrLut_monthly.out"
+ compound_name: land.irrLut.tavg-u-hxy-multi.mon.glb
+ model_variable: psl
+ pipeline: lpjg_monthly_lut_pipeline
+
+ - name: fLulccAtmLut_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/fLulccAtmLut_monthly.out"
+ compound_name: land.fLulccAtmLut.tavg-u-hxy-multi.mon.glb
+ model_variable: psl
+ pipeline: lpjg_monthly_lut_pipeline
+
+ # --- Monthly nitrogen/carbon variables (Emon, Jan..Dec format) ---
+
+ - name: fBNF_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/fBNF_monthly.out"
+ compound_name: land.fBNF.tavg-u-hxy-lnd.mon.glb
+ model_variable: Total
+ pipeline: lpjg_monthly_pipeline
+
+ - name: fLuc_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/fLuc_monthly.out"
+ compound_name: land.fLuc.tavg-u-hxy-lnd.mon.glb
+ model_variable: Total
+ pipeline: lpjg_monthly_pipeline
+
+ - name: fNgas_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/fNgas_monthly.out"
+ compound_name: land.fNgas.tavg-u-hxy-lnd.mon.glb
+ model_variable: Total
+ pipeline: lpjg_monthly_pipeline
+
+ - name: fNgasFire_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/fNgasFire_monthly.out"
+ compound_name: land.fNgasFire.tavg-u-hxy-lnd.mon.glb
+ model_variable: Total
+ pipeline: lpjg_monthly_pipeline
+
+ - name: fNLandToOcean_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/fNLandToOcean_monthly.out"
+ compound_name: land.fNLandToOcean.tavg-u-hxy-lnd.mon.glb
+ model_variable: Total
+ pipeline: lpjg_monthly_pipeline
+
+ - name: fNleach_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/fNleach_monthly.out"
+ compound_name: land.fNleach.tavg-u-hxy-lnd.mon.glb
+ model_variable: Total
+ pipeline: lpjg_monthly_pipeline
+
+ - name: fNLitterSoil_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/fNLitterSoil_monthly.out"
+ compound_name: land.fNLitterSoil.tavg-u-hxy-lnd.mon.glb
+ model_variable: Total
+ pipeline: lpjg_monthly_pipeline
+
+ - name: fNloss_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/fNloss_monthly.out"
+ compound_name: land.fNloss.tavg-u-hxy-lnd.mon.glb
+ model_variable: Total
+ pipeline: lpjg_monthly_pipeline
+
+ - name: fNup_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/fNup_monthly.out"
+ compound_name: land.fNup.tavg-u-hxy-lnd.mon.glb
+ model_variable: Total
+ pipeline: lpjg_monthly_pipeline
+
+ - name: nLand_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/nLand_monthly.out"
+ compound_name: land.nLand.tavg-u-hxy-lnd.mon.glb
+ model_variable: Total
+ pipeline: lpjg_monthly_pipeline
+
+ - name: nLitter_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/nLitter_monthly.out"
+ compound_name: land.nLitter.tavg-u-hxy-lnd.mon.glb
+ model_variable: Total
+ pipeline: lpjg_monthly_pipeline
+
+ - name: nMineral_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/nMineral_monthly.out"
+ compound_name: land.nMineral.tavg-u-hxy-lnd.mon.glb
+ model_variable: Total
+ pipeline: lpjg_monthly_pipeline
+
+ - name: nProduct_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/nProduct_monthly.out"
+ compound_name: land.nProduct.tavg-u-hxy-lnd.mon.glb
+ model_variable: Total
+ pipeline: lpjg_monthly_pipeline
+
+ - name: nSoil_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/nSoil_monthly.out"
+ compound_name: land.nSoil.tavg-u-hxy-lnd.mon.glb
+ model_variable: Total
+ pipeline: lpjg_monthly_pipeline
+
+ - name: nVeg_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/nVeg_monthly.out"
+ compound_name: land.nVeg.tavg-u-hxy-lnd.mon.glb
+ model_variable: Total
+ pipeline: lpjg_monthly_pipeline
+
+ - name: treeFracBdlDcd_mon
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/treeFracBdlDcd_monthly.out"
+ compound_name: land.treeFracBdlDcd.tavg-u-hxy-u.mon.glb
+ model_variable: Total
+ pipeline: lpjg_monthly_pipeline
+
+ # LPJ-GUESS also provides evspsblpot monthly
+ - name: evspsblpot_mon_lpjg
+ inputs:
+ - path: *ldp
+ pattern: "*/run1/evspsblpot_monthly.out"
+ compound_name: land.evspsblpot.tavg-u-hxy-lnd.mon.glb
+ model_variable: Total
+ pipeline: lpjg_monthly_pipeline
diff --git a/awi-esm3-veg-hr-variables/veg_land/cmip7_veg_land_todo.md b/awi-esm3-veg-hr-variables/veg_land/cmip7_veg_land_todo.md
new file mode 100644
index 00000000..94cdcda6
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/veg_land/cmip7_veg_land_todo.md
@@ -0,0 +1,165 @@
+# CMIP7 VEG Land Variables -- Rule Implementation TODO
+
+Variables from 3 CSVs in `veg_land/`: 88 total rows, 87 unique (name, freq) pairs.
+These are additional land, landIce, and landIce_land variables for the VEG experiment tier.
+
+Model constraints:
+- Land surface: HTESSEL (4-layer soil, single-layer snow, no permafrost scheme, no groundwater)
+- Vegetation: LPJ-GUESS 4.1.2 (run_landcover=0 → natural veg only, no land-use transitions)
+- Fire: BLAZE (SIMFIRE-driven burned area + fire emissions)
+- BVOC: disabled (ifbvoc=0), methane: disabled (ifmethane=0)
+- No river routing model (rnfmap only redistributes runoff to coast)
+- No interactive ice sheet (IFS prescribes glaciated areas as 10m water mass equivalent)
+- LPJ-GUESS output: plain-text .out files (3 formats: monthly Jan..Dec, monthly Lut Mth/psl/crp/pst/urb, yearly)
+
+---
+
+## IFS/HTESSEL variables (XIOS output)
+
+### 3hr fields (XIOS derived, deaccum /3600 for 1h IFS→XIOS)
+
+- [x] **mrro** (3hr) -- Total Runoff (`kg m-2 s-1`) -- XIOS: `ro*1000/3600`
+- [x] **mrros** (3hr) -- Surface Runoff (`kg m-2 s-1`) -- XIOS: `sro*1000/3600`
+- [x] **mrsol** (3hr, sdepth100cm) -- Soil Moisture in Top 1m (`kg m-2`) -- XIOS: `1000*(swvl1*0.07+swvl2*0.21+swvl3*0.72)`
+- [x] **esn** (day) -- Snow Evaporation (`kg m-2 s-1`) -- XIOS: `-es*1000/3600`
+- [x] **srfrad** (3hr) -- Net Surface Radiation (`W m-2`) -- XIOS: `(ssr+str)/3600`
+- [x] **tslsi** (3hr) -- Surface Temperature Land/Sea Ice (`K`) -- from `skt`
+- [x] **hfdsl** (3hr) -- Ground Heat Flux (`W m-2`) -- XIOS: `(ssr+str+sshf+slhf)/3600`
+
+### Daily/monthly fields (XIOS derived)
+
+- [x] **evspsblpot** (day) -- Potential Evapotranspiration (`kg m-2 s-1`) -- XIOS: `-pev*1000/3600`
+- [x] **evspsblpot** (mon) -- same at monthly
+- [x] **mrrob** (day) -- Subsurface Runoff (`kg m-2 s-1`) -- XIOS: `ssro*1000/3600`
+- [x] **sbl** (day) -- Sublimation (`kg m-2 s-1`) -- XIOS: `-es*1000/3600`
+- [x] **sbl** (mon) -- same at monthly
+- [x] **snd** (day) -- Snow Depth (`m`) -- custom step: `sd*1000/rsn` (SWE→physical depth)
+- [x] **snm** (day) -- Snow Melt (`kg m-2 s-1`) -- XIOS: `smlt*1000/3600`
+- [x] **tsn** (day) -- Snow Internal Temperature (`K`) -- already output daily
+
+### Daily fields with custom pycmor steps (temporal differencing)
+
+- [x] **dgw** (day) -- Change in Groundwater (`kg m-2`) -- `Δ(swvl4*1.89*1000)` via `compute_temporal_diff`
+- [x] **dsn** (day) -- Change in SWE (`kg m-2`) -- `Δ(sd*1000)` via `compute_temporal_diff`
+- [x] **dsw** (day) -- Change in Surface Water Storage (`kg m-2`) -- via `compute_temporal_diff`
+- [x] **mrtws** (day) -- Terrestrial Water Storage (`kg m-2`) -- via `compute_mrtws`
+
+### Snow/ice variables (from landIce_land CSV)
+
+- [x] **hfdsn** (day) -- Downward Heat Flux into Snow (`W m-2`) -- approximation from energy balance or `lambda*(Tsn-Tsoil_L1)/dz_snow` (HIGH priority)
+- [x] **hfdsn** (mon) -- same at monthly
+
+### NOT producible from IFS/HTESSEL
+
+- ~~**evspsblsoi** (3hr)~~ -- Bare Soil Evaporation -- internal HTESSEL `PDHWLS(:,1,9)`, needs source code changes
+- ~~**evspsblveg** (3hr)~~ -- Canopy Water Evaporation -- internal HTESSEL, not in XIOS
+- ~~**tran** (3hr)~~ -- Transpiration -- FullPos field CTP, GRIB code -9999, not accessible via XIOS
+- ~~**qgwr** (day)~~ -- Groundwater Recharge -- no groundwater scheme in HTESSEL
+- ~~**rivo** (day)~~ -- River Discharge -- no river routing model (only rnfmap)
+- ~~**sw** (day)~~ -- Surface Water Storage -- no surface water scheme in HTESSEL
+- ~~**wtd** (day)~~ -- Water Table Depth -- no groundwater scheme
+- ~~**drivw** (day)~~ -- Change in River Storage -- no river routing model
+- ~~**pflw** (day+mon)~~ -- Liquid Water in Permafrost -- no permafrost scheme
+- ~~**tpf** (day+mon)~~ -- Permafrost Layer Thickness -- no permafrost scheme
+- ~~**lwsnl** (day+mon)~~ -- Liquid Water in Snow Layer -- single-layer snow, no liquid tracking
+- ~~**sootsn** (mon)~~ -- Snow Soot Content -- needs CAMS aerosol deposition
+- ~~**agesno** (mon)~~ -- Mean Age of Snow -- no snow age tracer in HTESSEL
+
+---
+
+## LPJ-GUESS variables (plain-text .out files)
+
+All need custom `load_lpjguess_monthly` / `load_lpjguess_yearly` / `load_lpjguess_lut_monthly` loaders.
+Data path: `.../outdata/lpj_guess/{period}/run1/`
+
+### Yearly fraction variables (Eyr)
+
+- [x] **baresoilFrac** (yr) -- Bare Soil Fraction (`%`) -- from `baresoilFrac_yearly.out`, `Total` column
+- [x] **cropFrac** (yr) -- Crop Cover (`%`) -- from `cropFrac_yearly.out` (all zeros, run_landcover=0)
+- [x] **grassFrac** (yr) -- Natural Grass (`%`) -- from `grassFrac_yearly.out`
+- [x] **shrubFrac** (yr) -- Shrub Cover (`%`) -- from `shrubFrac_yearly.out`
+- [x] **treeFrac** (yr) -- Tree Cover (`%`) -- from `treeFrac_yearly.out`
+
+### Yearly land-use tile variables (Eyr) -- note: psl column has data, crp/pst/urb = 0
+
+- [x] **cLitterLut** (yr) -- Litter Carbon (`kg m-2`) -- from `cLitterLut_yearly.out`, Lut format
+- [x] **cProductLut** (yr) -- Product Carbon (`kg m-2`) -- from `cProductLut_yearly.out` (all zeros)
+- [x] **cSoilLut** (yr) -- Soil Carbon (`kg m-2`) -- from `cSoilLut_yearly.out`
+- [x] **cVegLut** (yr) -- Vegetation Carbon (`kg m-2`) -- from `cVegLut_yearly.out`
+- [x] **fracLut** (yr) -- Land-Use Tile Fraction (`%`) -- from `fracLut_yearly.out` (psl=100%)
+- [x] **fracInLut** (yr) -- Fraction Transferred In (`%`) -- from `fracInLut_yearly.out` (all zeros)
+- [x] **fracOutLut** (yr) -- Fraction Transferred Out (`%`) -- from `fracOutLut_yearly.out` (all zeros)
+
+### Monthly land-use tile variables (Emon) -- Lon/Lat/Year/Mth/psl/crp/pst/urb format
+
+- [x] **fracLut** (mon) -- Land-Use Tile Fraction (`%`) -- from `fracLut_monthly.out`
+- [x] **gppLut** (mon) -- GPP on Tiles (`kg m-2 s-1`) -- from `gppLut_monthly.out`
+- [x] **laiLut** (mon) -- LAI on Tiles (`1`) -- from `laiLut_monthly.out`
+- [x] **mrsolLut** (mon) -- Soil Moisture on Tiles (`kg m-2`) -- from `mrsoLut_monthly.out` (note: filename mrsoLut)
+- [x] **nppLut** (mon) -- NPP on Tiles (`kg m-2 s-1`) -- from `nppLut_monthly.out`
+- [x] **raLut** (mon) -- Autotrophic Resp. on Tiles (`kg m-2 s-1`) -- from `raLut_monthly.out`
+- [x] **rhLut** (mon) -- Heterotrophic Resp. on Tiles (`kg m-2 s-1`) -- from `rhLut_monthly.out`
+- [x] **irrLut** (mon) -- Irrigation on Tiles (`kg m-2 s-1`) -- from `irrLut_monthly.out` (all zeros)
+- [x] **fLulccAtmLut** (mon) -- LULCC Carbon to Atm (`kg m-2 s-1`) -- from `fLulccAtmLut_monthly.out` (all zeros)
+
+### Monthly nitrogen/carbon variables (Emon) -- Jan..Dec format
+
+- [x] **fBNF** (mon) -- Biological N Fixation (`kg m-2 s-1`) -- from `fBNF_monthly.out`
+- [x] **fLuc** (mon) -- Net C from Land-Use Change (`kg m-2 s-1`) -- from `fLuc_monthly.out` (all zeros)
+- [x] **fNgas** (mon) -- Total N to Atmosphere (`kg m-2 s-1`) -- from `fNgas_monthly.out`
+- [x] **fNgasFire** (mon) -- N to Atm from Fire (`kg m-2 s-1`) -- from `fNgasFire_monthly.out`
+- [x] **fNLandToOcean** (mon) -- Lateral N Transfer (`kg m-2 s-1`) -- from `fNLandToOcean_monthly.out`
+- [x] **fNleach** (mon) -- N Leaching (`kg m-2 s-1`) -- from `fNleach_monthly.out`
+- [x] **fNLitterSoil** (mon) -- Litter to Soil N (`kg m-2 s-1`) -- from `fNLitterSoil_monthly.out`
+- [x] **fNloss** (mon) -- Total N Loss (`kg m-2 s-1`) -- from `fNloss_monthly.out`
+- [x] **fNup** (mon) -- Plant N Uptake (`kg m-2 s-1`) -- from `fNup_monthly.out`
+- [x] **nLand** (mon) -- Total Terrestrial N (`kg m-2`) -- from `nLand_monthly.out`
+- [x] **nLitter** (mon) -- Litter N (`kg m-2`) -- from `nLitter_monthly.out`
+- [x] **nMineral** (mon) -- Mineral N (`kg m-2`) -- from `nMineral_monthly.out`
+- [x] **nProduct** (mon) -- Product N (`kg m-2`) -- from `nProduct_monthly.out` (all zeros)
+- [x] **nSoil** (mon) -- Soil N (`kg m-2`) -- from `nSoil_monthly.out`
+- [x] **nVeg** (mon) -- Vegetation N (`kg m-2`) -- from `nVeg_monthly.out`
+- [x] **treeFracBdlDcd** (mon) -- Broadleaf Deciduous Tree Fraction (`%`) -- from `treeFracBdlDcd_monthly.out`
+
+### NOT producible from LPJ-GUESS
+
+- ~~**vegHeight** (mon)~~ -- only `vegHeightTree_monthly.out` exists (tree-only, not grid-cell mean)
+- ~~**fNVegSoil** (mon)~~ -- no output file; LPJ-GUESS has fNVegLitter but not direct veg-to-soil
+- ~~**hflsLut** (mon)~~ -- surface energy balance variable, not from vegetation model
+- ~~**hfssLut** (mon)~~ -- surface energy balance variable, not from vegetation model
+- ~~**nbpLut** (mon)~~ -- no per-tile variant; only `nbp_monthly.out` (gridcell total)
+- ~~**sweLut** (mon)~~ -- no per-tile variant; only `snw_monthly.out` (gridcell total)
+- ~~**tasLut** (mon)~~ -- atmospheric variable, not per-tile from LPJ-GUESS
+- ~~**tsLut** (mon)~~ -- soil temperature exists gridcell-only (`tsl_monthly.out`), no Lut
+- ~~**gppVgt** (day)~~ -- no daily per-PFT output from LPJ-GUESS
+- ~~**laiVgt** (day)~~ -- no daily per-PFT output
+- ~~**nppVgt** (day)~~ -- no daily per-PFT output
+- ~~**raVgt** (day)~~ -- no daily per-PFT output
+- ~~**rhVgt** (day)~~ -- no daily per-PFT output
+
+---
+
+## Summary
+
+| Category | Count | Done | Blocked |
+|----------|-------|------|---------|
+| IFS 3hr fields (XIOS) | 7 | 7 | 0 |
+| IFS daily/monthly (XIOS) | 8 | 8 | 0 |
+| IFS daily (custom temporal diff) | 4 | 4 | 0 |
+| IFS snow heat flux (approx) | 2 | 2 (approx) | 0 |
+| IFS not producible | 17 | 0 | 17 |
+| LPJ-GUESS yearly fractions | 5 | 5 | 0 |
+| LPJ-GUESS yearly Lut | 7 | 7 | 0 |
+| LPJ-GUESS monthly Lut | 9 | 9 | 0 |
+| LPJ-GUESS monthly N/C | 16 | 16 | 0 |
+| LPJ-GUESS not producible | 13 | 0 | 13 |
+| **Total** | **88** | **58** | **30** |
+
+## Implementation status
+
+All 58 producible variables are implemented:
+- XIOS field definitions in `field_def_cmip7.xml` (deaccum /3600, 1h IFS→XIOS)
+- Output files in `file_def_oifs_cmip7_spinup.xml.j2` (_3h_land, _day_land, _mon_land)
+- pycmor YAML rules in `cmip7_awiesm3-veg-hr_land.yaml`
+- Custom loaders: `load_lpjguess_yearly`, `load_lpjguess_yearly_lut`, `load_lpjguess_monthly_lut`
+- Custom steps: `compute_temporal_diff`, `compute_mrtws`, `compute_snd`
diff --git a/awi-esm3-veg-hr-variables/veg_land/cmip7_veg_variables_land.csv b/awi-esm3-veg-hr-variables/veg_land/cmip7_veg_variables_land.csv
new file mode 100644
index 00000000..9d3e479b
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/veg_land/cmip7_veg_variables_land.csv
@@ -0,0 +1,75 @@
+,name,frequency,modeling_realm,standard_name,units,cell_methods,cell_measures,long_name,comment,processing_note,dimensions,out_name,type,positive,spatial_shape,temporal_shape,cmip6_table,physical_parameter_name,variableRootDD,branding_label,branded_variable_name,region,cmip6_compound_name,cmip7_compound_name,uid,priority,flag_values,flag_meanings
+127,land.baresoilFrac.tavg-u-hxy-u.yr.glb,yr,land,area_fraction,%,area: time: mean,area: areacella,Bare Soil Percentage Area Coverage,Percentage of entire grid cell that is covered by bare soil.,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where land over all_area_types time: mean CMIP7:area: time: mean,",longitude latitude time typebare,baresoilFrac,real,,XY-na,time-intv,Eyr,baresoilFrac,baresoilFrac,tavg-u-hxy-u,baresoilFrac_tavg-u-hxy-u,glb,Eyr.baresoilFrac,land.baresoilFrac.tavg-u-hxy-u.yr.glb,fb018658-be37-11e6-bac1-5404a60d96b5,medium,,
+132,land.cLitterLut.tpt-u-hxy-multi.yr.glb,yr,land,litter_mass_content_of_carbon,kg m-2,area: mean where sector time: point,area: areacella,Carbon in Above and Below-Ground Litter Pools on Land-Use Tiles,end of year values (not annual mean),"CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude landUse time1 CMIP7:longitude latitude landuse time1,",longitude latitude landuse time1,cLitterLut,real,,XY-na,time-point,Eyr,cLitterLut,cLitterLut,tpt-u-hxy-multi,cLitterLut_tpt-u-hxy-multi,glb,Eyr.cLitterLut,land.cLitterLut.tpt-u-hxy-multi.yr.glb,d22e279c-4a9f-11e6-b84e-ac72891c3257,medium,,
+134,land.cProductLut.tpt-u-hxy-multi.yr.glb,yr,land,carbon_mass_content_of_forestry_and_agricultural_products,kg m-2,area: mean where sector time: point,area: areacella,Wood and Agricultural Product Pool Carbon Associated with Land-Use Tiles,"Anthropogenic pools associated with land use tiles into which harvests and cleared carbon are deposited before release into atmosphere PLUS any remaining anthropogenic pools that may be associated with lands which were converted into land use tiles during reported period. Examples of products include paper, cardboard, timber for construction, and crop harvest for food or fuel. Does NOT include residue which is deposited into soil or litter; end of year values (not annual mean).","CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude landUse time1 CMIP7:longitude latitude landuse time1,",longitude latitude landuse time1,cProductLut,real,,XY-na,time-point,Eyr,cProductLut,cProductLut,tpt-u-hxy-multi,cProductLut_tpt-u-hxy-multi,glb,Eyr.cProductLut,land.cProductLut.tpt-u-hxy-multi.yr.glb,3e26d502-b89b-11e6-be04-ac72891c3257,medium,,
+137,land.cropFrac.tavg-u-hxy-u.yr.glb,yr,land,area_fraction,%,area: time: mean,area: areacella,Percentage Crop Cover,Percentage of entire grid cell that is covered by crop.,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where land over all_area_types time: mean CMIP7:area: time: mean,",longitude latitude time typecrop,cropFrac,real,,XY-na,time-intv,Eyr,cropFrac,cropFrac,tavg-u-hxy-u,cropFrac_tavg-u-hxy-u,glb,Eyr.cropFrac,land.cropFrac.tavg-u-hxy-u.yr.glb,fb017ce4-be37-11e6-bac1-5404a60d96b5,medium,,
+139,land.cSoilLut.tpt-u-hxy-multi.yr.glb,yr,land,soil_mass_content_of_carbon,kg m-2,area: mean where sector time: point,area: areacella,Carbon in Soil Pool on Land-Use Tiles,end of year values (not annual mean),"CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude landUse time1 CMIP7:longitude latitude landuse time1,",longitude latitude landuse time1,cSoilLut,real,,XY-na,time-point,Eyr,cSoilLut,cSoilLut,tpt-u-hxy-multi,cSoilLut_tpt-u-hxy-multi,glb,Eyr.cSoilLut,land.cSoilLut.tpt-u-hxy-multi.yr.glb,d22e1ea0-4a9f-11e6-b84e-ac72891c3257,medium,,
+142,land.cVegLut.tpt-u-hxy-multi.yr.glb,yr,land,vegetation_carbon_content,kg m-2,area: mean where sector time: point,area: areacella,Carbon in Vegetation on Land-Use Tiles,end of year values (not annual mean),"CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude landUse time1 CMIP7:longitude latitude landuse time1,",longitude latitude landuse time1,cVegLut,real,,XY-na,time-point,Eyr,cVegLut,cVegLut,tpt-u-hxy-multi,cVegLut_tpt-u-hxy-multi,glb,Eyr.cVegLut,land.cVegLut.tpt-u-hxy-multi.yr.glb,d22e2328-4a9f-11e6-b84e-ac72891c3257,medium,,
+144,land.dgw.tavg-u-hxy-lnd.day.glb,day,land,change_over_time_in_groundwater_amount,kg m-2,area: mean where land time: mean,area: areacellr,Change in Groundwater,change_over_time_in_groundwater,,longitude latitude time,dgw,real,,XY-na,time-intv,Eday,dgw,dgw,tavg-u-hxy-lnd,dgw_tavg-u-hxy-lnd,glb,Eday.dgw,land.dgw.tavg-u-hxy-lnd.day.glb,d2287694-4a9f-11e6-b84e-ac72891c3257,medium,,
+145,land.drivw.tavg-u-hxy-lnd.day.glb,day,land,change_over_time_in_river_water_amount,kg m-2,area: mean where land time: mean,area: areacellr,Change in River Storage,Change in River Storage,,longitude latitude time,drivw,real,,XY-na,time-intv,Eday,drivw,drivw,tavg-u-hxy-lnd,drivw_tavg-u-hxy-lnd,glb,Eday.drivw,land.drivw.tavg-u-hxy-lnd.day.glb,d2287b08-4a9f-11e6-b84e-ac72891c3257,medium,,
+146,land.dsn.tavg-u-hxy-lnd.day.glb,day,land,change_over_time_in_amount_of_ice_and_snow_on_land,kg m-2,area: mean where land time: mean,area: areacella,Change in Snow Water Equivalent,Change in Snow Water Equivalent,,longitude latitude time,dsn,real,,XY-na,time-intv,Eday,dsn,dsn,tavg-u-hxy-lnd,dsn_tavg-u-hxy-lnd,glb,Eday.dsn,land.dsn.tavg-u-hxy-lnd.day.glb,d22868f2-4a9f-11e6-b84e-ac72891c3257,medium,,
+147,land.dsw.tavg-u-hxy-lnd.day.glb,day,land,change_over_time_in_land_water_amount,kg m-2,area: mean where land time: mean,area: areacella,Change in Surface Water Storage,Change in Surface Water Storage,,longitude latitude time,dsw,real,,XY-na,time-intv,Eday,dsw,dsw,tavg-u-hxy-lnd,dsw_tavg-u-hxy-lnd,glb,Eday.dsw,land.dsw.tavg-u-hxy-lnd.day.glb,d2286d84-4a9f-11e6-b84e-ac72891c3257,medium,,
+148,land.esn.tavg-u-hxy-lnd.day.glb,day,land,water_evapotranspiration_flux,kg m-2 s-1,area: mean where snow (on land only) time: mean,area: areacella,Snow Evaporation,The flux due to conversion of liquid or solid water into vapor at the surface where there is snow on land,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where land time: mean CMIP7:area: mean where snow (on land only) time: mean,",longitude latitude time,esn,real,,XY-na,time-intv,Eday,esn,esn,tavg-u-hxy-lnd,esn_tavg-u-hxy-lnd,glb,Eday.esn,land.esn.tavg-u-hxy-lnd.day.glb,d2282aa4-4a9f-11e6-b84e-ac72891c3257,medium,,
+149,land.evspsblpot.tavg-u-hxy-lnd.day.glb,day,land,water_potential_evaporation_flux,kg m-2 s-1,area: mean where land time: mean,area: areacella,Potential Evapotranspiration,water_potential_evapotranspiration_flux,,longitude latitude time,evspsblpot,real,,XY-na,time-intv,Eday,evspsblpot,evspsblpot,tavg-u-hxy-lnd,evspsblpot_tavg-u-hxy-lnd,glb,Eday.evspsblpot,land.evspsblpot.tavg-u-hxy-lnd.day.glb,d228380a-4a9f-11e6-b84e-ac72891c3257,high,,
+150,land.evspsblpot.tavg-u-hxy-lnd.mon.glb,mon,land,water_potential_evaporation_flux,kg m-2 s-1,area: mean where land time: mean,area: areacella,Potential Evapotranspiration,at surface; potential flux of water into the atmosphere due to conversion of both liquid and solid phases to vapor (from underlying surface and vegetation),,longitude latitude time,evspsblpot,real,,XY-na,time-intv,Emon,evspsblpot,evspsblpot,tavg-u-hxy-lnd,evspsblpot_tavg-u-hxy-lnd,glb,Emon.evspsblpot,land.evspsblpot.tavg-u-hxy-lnd.mon.glb,6f68edb4-9acb-11e6-b7ee-ac72891c3257,high,,
+152,land.evspsblsoi.tavg-u-hxy-u.3hr.glb,3hr,land,water_evaporation_flux_from_soil,kg m-2 s-1,area: time: mean,area: areacella,Water Evaporation from Soil,Water evaporation from soil,,longitude latitude time,evspsblsoi,real,up,XY-na,time-intv,3hr,evspsblsoi,evspsblsoi,tavg-u-hxy-u,evspsblsoi_tavg-u-hxy-u,glb,3hr.evspsblsoi,land.evspsblsoi.tavg-u-hxy-u.3hr.glb,80ab71fb-a698-11ef-914a-613c0433d878,medium,,
+154,land.evspsblveg.tavg-u-hxy-u.3hr.glb,3hr,land,water_evaporation_flux_from_canopy,kg m-2 s-1,area: time: mean,area: areacella,Water evaporation from canopy,Evaporation from canopy,,longitude latitude time,evspsblveg,real,up,XY-na,time-intv,3hr,evspsblveg,evspsblveg,tavg-u-hxy-u,evspsblveg_tavg-u-hxy-u,glb,3hr.evspsblveg,land.evspsblveg.tavg-u-hxy-u.3hr.glb,80ab71fa-a698-11ef-914a-613c0433d878,medium,,
+155,land.fBNF.tavg-u-hxy-lnd.mon.glb,mon,land,tendency_of_soil_and_vegetation_mass_content_of_nitrogen_compounds_expressed_as_nitrogen_due_to_fixation,kg m-2 s-1,area: mean where land time: mean,area: areacella,Biological Nitrogen Fixation,The fixation (uptake of nitrogen gas directly from the atmosphere) of nitrogen due to biological processes.,,longitude latitude time,fBNF,real,,XY-na,time-intv,Emon,fBNF,fBNF,tavg-u-hxy-lnd,fBNF_tavg-u-hxy-lnd,glb,Emon.fBNF,land.fBNF.tavg-u-hxy-lnd.mon.glb,8b80db30-4a5b-11e6-9cd2-ac72891c3257,high,,
+157,land.fLuc.tavg-u-hxy-lnd.mon.glb,mon,land,surface_net_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_emission_from_anthropogenic_land_use_change,kg m-2 s-1,area: mean where land time: mean,area: areacella,Net Carbon Mass Flux into Atmosphere Due to Land-Use Change [kgC m-2 s-1],Net Carbon Mass Flux into Atmosphere due to Land Use Change,,longitude latitude time,fLuc,real,up,XY-na,time-intv,Emon,fLuc,fLuc,tavg-u-hxy-lnd,fLuc_tavg-u-hxy-lnd,glb,Emon.fLuc,land.fLuc.tavg-u-hxy-lnd.mon.glb,d229196e-4a9f-11e6-b84e-ac72891c3257,high,,
+158,land.fLulccAtmLut.tavg-u-hxy-multi.mon.glb,mon,land,surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_anthropogenic_land_use_or_land_cover_change_excluding_forestry_and_agricultural_products,kg m-2 s-1,area: time: mean where sector,area: areacella,Carbon Transferred Directly to Atmosphere Due to any Land-Use or Land-Cover Change Activities [kgC m-2 s-1],"This annual mean flux refers to the transfer of carbon directly to the atmosphere due to any land-use or land-cover change activities. Include carbon transferred due to deforestation or agricultural directly into atmosphere, and emissions form anthropogenic pools into atmosphere","CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude landUse time CMIP7:longitude latitude landuse time,",longitude latitude landuse time,fLulccAtmLut,real,up,XY-na,time-intv,Emon,fLulccAtmLut,fLulccAtmLut,tavg-u-hxy-multi,fLulccAtmLut_tavg-u-hxy-multi,glb,Emon.fLulccAtmLut,land.fLulccAtmLut.tavg-u-hxy-multi.mon.glb,3e26c210-b89b-11e6-be04-ac72891c3257,medium,,
+159,land.fNgas.tavg-u-hxy-lnd.mon.glb,mon,land,surface_upward_mass_flux_of_nitrogen_compounds_expressed_as_nitrogen,kg m-2 s-1,area: mean where land time: mean,area: areacella,"Total Nitrogen Lost to the Atmosphere (Sum of NHx, NOx, N2O, N2)",Total flux of Nitrogen from the land into the atmosphere.,,longitude latitude time,fNgas,real,,XY-na,time-intv,Emon,fNgas,fNgas,tavg-u-hxy-lnd,fNgas_tavg-u-hxy-lnd,glb,Emon.fNgas,land.fNgas.tavg-u-hxy-lnd.mon.glb,8b8231e2-4a5b-11e6-9cd2-ac72891c3257,high,,
+160,land.fNgasFire.tavg-u-hxy-lnd.mon.glb,mon,land,surface_upward_mass_flux_of_nitrogen_compounds_expressed_as_nitrogen_due_to_emission_from_fires,kg m-2 s-1,area: mean where land time: mean,area: areacella,"Total Nitrogen Lost to the Atmosphere (Including NHx, NOx, N2O, N2) from Fire",Flux of Nitrogen from the land into the atmosphere due to fire,,longitude latitude time,fNgasFire,real,,XY-na,time-intv,Emon,fNgasFire,fNgasFire,tavg-u-hxy-lnd,fNgasFire_tavg-u-hxy-lnd,glb,Emon.fNgasFire,land.fNgasFire.tavg-u-hxy-lnd.mon.glb,8b823c5a-4a5b-11e6-9cd2-ac72891c3257,high,,
+161,land.fNLandToOcean.tavg-u-hxy-lnd.mon.glb,mon,land,mass_flux_of_nitrogen_compounds_expressed_as_nitrogen_into_sea_from_rivers,kg m-2 s-1,area: mean where land time: mean,area: areacella,Lateral Transfer of Nitrogen out of Grid Cell That Eventually Goes into Ocean,leached nitrogen etc that goes into run off or river routing and finds its way into ocean should be reported here.,,longitude latitude time,fNLandToOcean,real,,XY-na,time-intv,Emon,fNLandToOcean,fNLandToOcean,tavg-u-hxy-lnd,fNLandToOcean_tavg-u-hxy-lnd,glb,Emon.fNLandToOcean,land.fNLandToOcean.tavg-u-hxy-lnd.mon.glb,8b80f0de-4a5b-11e6-9cd2-ac72891c3257,high,,
+162,land.fNleach.tavg-u-hxy-lnd.mon.glb,mon,land,mass_flux_of_carbon_out_of_soil_due_to_leaching_and_runoff,kg m-2 s-1,area: mean where land time: mean,area: areacella,"Total Nitrogen Loss to Leaching or Runoff (Sum of Ammonium, Nitrite and Nitrate)","In accordance with common usage in geophysical disciplines, ""flux"" implies per unit area, called ""flux density"" in physics. The specification of a physical process by the phrase ""due_to_"" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. ""Leaching"" means the loss of water soluble chemical species from soil. Runoff is the liquid water which drains from land. If not specified, ""runoff"" refers to the sum of surface runoff and subsurface drainage.",,longitude latitude time,fNleach,real,,XY-na,time-intv,Emon,fNleach,fNleach,tavg-u-hxy-lnd,fNleach_tavg-u-hxy-lnd,glb,Emon.fNleach,land.fNleach.tavg-u-hxy-lnd.mon.glb,8b822d82-4a5b-11e6-9cd2-ac72891c3257,high,,
+163,land.fNLitterSoil.tavg-u-hxy-lnd.mon.glb,mon,land,nitrogen_mass_flux_into_soil_from_litter,kg m-2 s-1,area: mean where land time: mean,area: areacella,Total Nitrogen Mass Flux from Litter to Soil,"In accordance with common usage in geophysical disciplines, ""flux"" implies per unit area, called ""flux density"" in physics. ""Litter"" is dead plant material in or above the soil.",,longitude latitude time,fNLitterSoil,real,,XY-na,time-intv,Emon,fNLitterSoil,fNLitterSoil,tavg-u-hxy-lnd,fNLitterSoil_tavg-u-hxy-lnd,glb,Emon.fNLitterSoil,land.fNLitterSoil.tavg-u-hxy-lnd.mon.glb,8b80f638-4a5b-11e6-9cd2-ac72891c3257,high,,
+164,land.fNloss.tavg-u-hxy-lnd.mon.glb,mon,land,surface_upward_mass_flux_of_nitrogen_compounds_expressed_as_nitrogen_out_of_vegetation_and_litter_and_soil,kg m-2 s-1,area: mean where land time: mean,area: areacella,"Total Nitrogen Lost (Including NHx, NOx, N2O, N2 and Leaching)",Not all models split losses into gaseous and leaching,,longitude latitude time,fNloss,real,,XY-na,time-intv,Emon,fNloss,fNloss,tavg-u-hxy-lnd,fNloss_tavg-u-hxy-lnd,glb,Emon.fNloss,land.fNloss.tavg-u-hxy-lnd.mon.glb,8b80d0cc-4a5b-11e6-9cd2-ac72891c3257,high,,
+165,land.fNup.tavg-u-hxy-lnd.mon.glb,mon,land,tendency_of_vegetation_mass_content_of_nitrogen_compounds_expressed_as_nitrogen_due_to_fixation,kg m-2 s-1,area: mean where land time: mean,area: areacella,Total Plant Nitrogen Uptake (Sum of Ammonium and Nitrate) Irrespective of the Source of Nitrogen,The uptake of nitrogen by fixation: nitrogen fixation means the uptake of nitrogen gas directly from the atmosphere.,,longitude latitude time,fNup,real,,XY-na,time-intv,Emon,fNup,fNup,tavg-u-hxy-lnd,fNup_tavg-u-hxy-lnd,glb,Emon.fNup,land.fNup.tavg-u-hxy-lnd.mon.glb,8b80e08a-4a5b-11e6-9cd2-ac72891c3257,high,,
+166,land.fNVegSoil.tavg-u-hxy-lnd.mon.glb,mon,land,nitrogen_mass_flux_into_soil_from_vegetation_excluding_litter,kg m-2 s-1,area: mean where land time: mean,area: areacella,Total Nitrogen Mass Flux from Vegetation Directly to Soil,"In some models part of nitrogen (e.g., root exudate) can go directly into the soil pool without entering litter.",,longitude latitude time,fNVegSoil,real,,XY-na,time-intv,Emon,fNVegSoil,fNVegSoil,tavg-u-hxy-lnd,fNVegSoil_tavg-u-hxy-lnd,glb,Emon.fNVegSoil,land.fNVegSoil.tavg-u-hxy-lnd.mon.glb,8b80fc82-4a5b-11e6-9cd2-ac72891c3257,high,,
+167,land.fracInLut.tsum-u-hxy-lnd.yr.glb,yr,land,area_fraction,%,area: mean where land over all_area_types time: sum,area: areacella,Annual Gross Percentage That Was Transferred into This Tile from Other Land-Use Tiles,Cumulative percentage transitions over the year; note that percentage should be reported as a percentage of atmospheric grid cell,"CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude landUse time CMIP7:longitude latitude landuse time,",longitude latitude landuse time,fracInLut,real,,XY-na,time-intv,Eyr,fracInLut,fracInLut,tsum-u-hxy-lnd,fracInLut_tsum-u-hxy-lnd,glb,Eyr.fracInLut,land.fracInLut.tsum-u-hxy-lnd.yr.glb,d22e47d6-4a9f-11e6-b84e-ac72891c3257,medium,,
+168,land.fracLut.tpt-u-hxy-u.mon.glb,mon,land,area_fraction,%,area: mean time: point,area: areacella,Percentage of Grid Cell for Each Land-Use Tile,"End of month values (not monthly mean); note that percentage should be reported as percentage of land grid cell (example: frac_lnd = 0.5, frac_ocn = 0.5, frac_crop_lnd = 0.2 (of land portion of grid cell), then frac_lut(crop) = 0.5\*0.2 = 0.1)","CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where land over all_area_types time: mean CMIP7:area: mean time: point, CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude landUse time CMIP7:longitude latitude landuse time1,",longitude latitude landuse time1,fracLut,real,,XY-na,time-point,Emon,fracLut,fracLut,tpt-u-hxy-u,fracLut_tpt-u-hxy-u,glb,Emon.fracLut,land.fracLut.tpt-u-hxy-u.mon.glb,9157856a-267c-11e7-8933-ac72891c3257,medium,,
+169,land.fracLut.tpt-u-hxy-u.yr.glb,yr,land,area_fraction,%,area: mean time: point,area: areacella,Percentage of Grid Cell for Each Land-Use Tile,"End of year values (not annual mean); note that percentage should be reported as percentage of land grid cell (example: frac_lnd = 0.5, frac_ocn = 0.5, frac_crop_lnd = 0.2 (of land portion of grid cell), then frac_lut(crop) = 0.5\*0.2 = 0.1)","CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where land over all_area_types time: point CMIP7:area: mean time: point, CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude landUse time1 CMIP7:longitude latitude landuse time1,",longitude latitude landuse time1,fracLut,real,,XY-na,time-point,Eyr,fracLut,fracLut,tpt-u-hxy-u,fracLut_tpt-u-hxy-u,glb,Eyr.fracLut,land.fracLut.tpt-u-hxy-u.yr.glb,d22e4c68-4a9f-11e6-b84e-ac72891c3257,medium,,
+170,land.fracOutLut.tsum-u-hxy-lnd.yr.glb,yr,land,area_fraction,%,area: mean where land over all_area_types time: sum,area: areacella,Annual Gross Percentage of Land-Use Tile That Was Transferred into Other Land-Use Tiles,Cumulative percentage transitions over the year; note that percentage should be reported as percentage of atmospheric grid cell,"CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude landUse time CMIP7:longitude latitude landuse time,",longitude latitude landuse time,fracOutLut,real,,XY-na,time-intv,Eyr,fracOutLut,fracOutLut,tsum-u-hxy-lnd,fracOutLut_tsum-u-hxy-lnd,glb,Eyr.fracOutLut,land.fracOutLut.tsum-u-hxy-lnd.yr.glb,d22e4358-4a9f-11e6-b84e-ac72891c3257,medium,,
+172,land.gppLut.tavg-u-hxy-multi.mon.glb,mon,land,gross_primary_productivity_of_biomass_expressed_as_carbon,kg m-2 s-1,area: time: mean where sector,area: areacella,Gross Primary Production on Land-Use Tile as Carbon Mass Flux [kgC m-2 s-1],"The rate of synthesis of biomass from inorganic precursors by autotrophs (""producers"") expressed as the mass of carbon which it contains. For example, photosynthesis in plants or phytoplankton. The producers also respire some of this biomass and the difference is referred to as the net primary production. Reported on land-use tiles.","CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude landUse time CMIP7:longitude latitude landuse time,",longitude latitude landuse time,gppLut,real,,XY-na,time-intv,Emon,gppLut,gppLut,tavg-u-hxy-multi,gppLut_tavg-u-hxy-multi,glb,Emon.gppLut,land.gppLut.tavg-u-hxy-multi.mon.glb,d22d8a9e-4a9f-11e6-b84e-ac72891c3257,medium,,
+173,land.gppVgt.tavg-u-hxy-multi.day.glb,day,land,gross_primary_productivity_of_biomass_expressed_as_carbon,kg m-2 s-1,area: time: mean where sector,area: areacella,Gross Primary Production on Vegetation type as Carbon Mass Flux [kgC m-2 s-1],"The rate of synthesis of biomass from inorganic precursors by autotrophs (""producers"") expressed as the mass of carbon which it contains. For example, photosynthesis in plants or phytoplankton. The producers also respire some of this biomass and the difference is referred to as the net primary production. Reported on land-use tiles.",,longitude latitude vegtype time,gppVgt,real,,XY-na,time-intv,Eday,gppVgt,gppVgt,tavg-u-hxy-multi,gppVgt_tavg-u-hxy-multi,glb,Eday.gppVgt,land.gppVgt.tavg-u-hxy-multi.day.glb,83bbfbad-7f07-11ef-9308-b1dd71e64bec,high,,
+175,land.grassFrac.tavg-u-hxy-u.yr.glb,yr,land,area_fraction,%,area: time: mean,area: areacella,Natural Grass Area Percentage,Percentage of entire grid cell that is covered by natural grass.,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where land over all_area_types time: mean CMIP7:area: time: mean,",longitude latitude time typenatgr,grassFrac,real,,XY-na,time-intv,Eyr,grassFrac,grassFrac,tavg-u-hxy-u,grassFrac_tavg-u-hxy-u,glb,Eyr.grassFrac,land.grassFrac.tavg-u-hxy-u.yr.glb,fb01755a-be37-11e6-bac1-5404a60d96b5,medium,,
+176,land.hfdsl.tavg-u-hxy-lnd.3hr.glb,3hr,land,surface_downward_heat_flux_in_air,W m-2,area: mean where land time: mean,area: areacella,Ground heat flux at 3hr,Ground heat flux at 3hr,,longitude latitude time,hfdsl,real,up,XY-na,time-intv,3hr,hfdsl,hfdsl,tavg-u-hxy-lnd,hfdsl_tavg-u-hxy-lnd,glb,3hr.hfdsl,land.hfdsl.tavg-u-hxy-lnd.3hr.glb,80ab71f9-a698-11ef-914a-613c0433d878,medium,,
+177,land.hflsLut.tavg-u-hxy-multi.mon.glb,mon,land,surface_upward_latent_heat_flux,W m-2,area: time: mean where sector,area: areacella,Latent Heat Flux on Land-Use Tile,"The surface called ""surface"" means the lower boundary of the atmosphere. ""Upward"" indicates a vector component which is positive when directed upward (negative downward). The surface latent heat flux is the exchange of heat between the surface and the air on account of evaporation (including sublimation). In accordance with common usage in geophysical disciplines, ""flux"" implies per unit area, called ""flux density"" in physics.","CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude landUse time CMIP7:longitude latitude landuse time,",longitude latitude landuse time,hflsLut,real,up,XY-na,time-intv,Emon,hflsLut,hflsLut,tavg-u-hxy-multi,hflsLut_tavg-u-hxy-multi,glb,Emon.hflsLut,land.hflsLut.tavg-u-hxy-multi.mon.glb,d22dbe2e-4a9f-11e6-b84e-ac72891c3257,medium,,
+178,land.hfssLut.tavg-u-hxy-multi.mon.glb,mon,land,surface_upward_sensible_heat_flux,W m-2,area: time: mean where sector,area: areacella,Sensible Heat Flux on Land-Use Tile,"Upward sensible heat flux on land use tiles. The surface sensible heat flux, also called turbulent heat flux, is the exchange of heat between the surface and the air by motion of air.","CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude landUse time CMIP7:longitude latitude landuse time,",longitude latitude landuse time,hfssLut,real,up,XY-na,time-intv,Emon,hfssLut,hfssLut,tavg-u-hxy-multi,hfssLut_tavg-u-hxy-multi,glb,Emon.hfssLut,land.hfssLut.tavg-u-hxy-multi.mon.glb,d22dc374-4a9f-11e6-b84e-ac72891c3257,medium,,
+179,land.irrLut.tavg-u-hxy-multi.mon.glb,mon,land,surface_downward_mass_flux_of_water_due_to_irrigation,kg m-2 s-1,area: time: mean where sector,area: areacella,"Irrigation Flux Including any Irrigation for Crops, Trees, Pasture, or Urban Lawns",Mass flux of water due to irrigation.,"CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude landUse time CMIP7:longitude latitude landuse time,",longitude latitude landuse time,irrLut,real,down,XY-na,time-intv,Emon,irrLut,irrLut,tavg-u-hxy-multi,irrLut_tavg-u-hxy-multi,glb,Emon.irrLut,land.irrLut.tavg-u-hxy-multi.mon.glb,3e26abc2-b89b-11e6-be04-ac72891c3257,medium,,
+181,land.laiLut.tavg-u-hxy-multi.mon.glb,mon,land,leaf_area_index,1,area: time: mean where sector,area: areacella,Leaf Area Index on Land-Use Tile,A ratio obtained by dividing the total upper leaf surface area of vegetation by the (horizontal) surface area of the land on which it grows.,"CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude landUse time CMIP7:longitude latitude landuse time,",longitude latitude landuse time,laiLut,real,,XY-na,time-intv,Emon,laiLut,laiLut,tavg-u-hxy-multi,laiLut_tavg-u-hxy-multi,glb,Emon.laiLut,land.laiLut.tavg-u-hxy-multi.mon.glb,d22dd6ac-4a9f-11e6-b84e-ac72891c3257,medium,,
+182,land.laiVgt.tavg-u-hxy-multi.day.glb,day,land,leaf_area_index,1,area: time: mean where sector,area: areacella,Leaf Area Index on Vegetation type,A ratio obtained by dividing the total upper leaf surface area of vegetation by the (horizontal) surface area of the land on which it grows.,,longitude latitude vegtype time,laiVgt,real,,XY-na,time-intv,Eday,laiVgt,laiVgt,tavg-u-hxy-multi,laiVgt_tavg-u-hxy-multi,glb,Eday.laiVgt,land.laiVgt.tavg-u-hxy-multi.day.glb,83bbfbac-7f07-11ef-9308-b1dd71e64bec,high,,
+184,land.mrro.tavg-u-hxy-lnd.3hr.glb,3hr,land,runoff_flux,kg m-2 s-1,area: mean where land time: mean,area: areacella,Total Runoff,"the total runoff (including ""drainage"" through the base of the soil model) leaving the land portion of the grid cell divided by the land area in the grid cell, averaged over the 3-hour interval.",,longitude latitude time,mrro,real,,XY-na,time-intv,3hr,mrro,mrro,tavg-u-hxy-lnd,mrro_tavg-u-hxy-lnd,glb,3hr.mrro,land.mrro.tavg-u-hxy-lnd.3hr.glb,bab177b2-e5dd-11e5-8482-ac72891c3257,medium,,
+187,land.mrrob.tavg-u-hxy-lnd.day.glb,day,land,subsurface_runoff_flux,kg m-2 s-1,area: mean where land time: mean,area: areacella,Subsurface Runoff,subsurface_runoff_flux,,longitude latitude time,mrrob,real,,XY-na,time-intv,Eday,mrrob,mrrob,tavg-u-hxy-lnd,mrrob_tavg-u-hxy-lnd,glb,Eday.mrrob,land.mrrob.tavg-u-hxy-lnd.day.glb,d22844da-4a9f-11e6-b84e-ac72891c3257,high,,
+188,land.mrros.tavg-u-hxy-lnd.3hr.glb,3hr,land,surface_runoff_flux,kg m-2 s-1,area: mean where land time: mean,area: areacella,Surface Runoff,surface_runoff_flux,,longitude latitude time,mrros,real,,XY-na,time-intv,3hr,mrros,mrros,tavg-u-hxy-lnd,mrros_tavg-u-hxy-lnd,glb,3hr.mrros,land.mrros.tavg-u-hxy-lnd.3hr.glb,80ab73bc-a698-11ef-914a-613c0433d878,medium,,
+196,land.mrsol.tavg-d100cm-hxy-lnd.3hr.glb,3hr,land,mass_content_of_water_in_soil_layer,kg m-2,area: mean where land time: mean,area: areacella,Soil moisture in the top 1 m of the soil column,Soil moisture at 3hr but for 0-1m,,longitude latitude time sdepth100cm,mrsol,real,,XY-na,time-intv,3hr,mrso100,mrsol,tavg-d100cm-hxy-lnd,mrsol_tavg-d100cm-hxy-lnd,glb,3hr.mrso100,land.mrsol.tavg-d100cm-hxy-lnd.3hr.glb,80ab7435-a698-11ef-914a-613c0433d878,medium,,
+199,land.mrsol.tpt-d10cm-hxy-lnd.3hr.glb,3hr,land,mass_content_of_water_in_soil_layer,kg m-2,area: mean where land time: point,area: areacella,Moisture in Upper Portion of Soil Column,the mass of water in all phases in a thin surface soil layer.,"integrate over uppermost 10 cm. CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude time sdepth1 CMIP7:longitude latitude time sdepth10cm,",longitude latitude time1 sdepth10cm,mrsol,real,,XY-na,time-point,3hr,mrsos,mrsol,tpt-d10cm-hxy-lnd,mrsol_tpt-d10cm-hxy-lnd,glb,3hr.mrsos,land.mrsol.tpt-d10cm-hxy-lnd.3hr.glb,bab1c668-e5dd-11e5-8482-ac72891c3257,high,,
+200,land.mrsolLut.tavg-d10cm-hxy-multi.mon.glb,mon,land,mass_content_of_water_in_soil_layer,kg m-2,area: time: mean where sector,area: areacella,Moisture in Upper Portion of Soil Column of Land-Use Tile,the mass of water in all phases in a thin surface layer; integrate over uppermost 10cm,"CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude landUse time sdepth1 CMIP7:longitude latitude landuse time sdepth10cm,",longitude latitude landuse time sdepth10cm,mrsolLut,real,,XY-na,time-intv,Emon,mrsosLut,mrsolLut,tavg-d10cm-hxy-multi,mrsolLut_tavg-d10cm-hxy-multi,glb,Emon.mrsosLut,land.mrsolLut.tavg-d10cm-hxy-multi.mon.glb,d22ddb3e-4a9f-11e6-b84e-ac72891c3257,medium,,
+201,land.mrtws.tavg-u-hxy-lnd.day.glb,day,land,land_water_amount,kg m-2,area: mean where land time: mean,area: areacella,Terrestrial Water Storage,canopy_and_surface_and_subsurface_water_amount,,longitude latitude time,mrtws,real,,XY-na,time-intv,Eday,mrtws,mrtws,tavg-u-hxy-lnd,mrtws_tavg-u-hxy-lnd,glb,Eday.mrtws,land.mrtws.tavg-u-hxy-lnd.day.glb,d228ad76-4a9f-11e6-b84e-ac72891c3257,high,,
+203,land.nbpLut.tavg-u-hxy-multi.mon.glb,mon,land,surface_net_downward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_all_land_processes,kg m-2 s-1,area: time: mean where sector,area: areacella,Net Carbon Mass Flux into Land-Use Tile [kgC m-2 s-1],"Computed as npp minus heterotrophic respiration minus fire minus C leaching minus harvesting/clearing. Positive rate is into the land, negative rate is from the land. Do not include fluxes from anthropogenic product pools to atmosphere","CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude landUse time CMIP7:longitude latitude landuse time,
+CHANGE SINCE CMIP6: compound name,",longitude latitude landuse time,nbpLut,real,down,XY-na,time-intv,Emon,nbpLut,nbpLut,tavg-u-hxy-multi,nbpLut_tavg-u-hxy-multi,glb,Emon.nbpLut,land.nbpLut.tavg-u-hxy-multi.mon.glb,d22da542-4a9f-11e6-b84e-ac72891c3257,medium,,
+205,land.nLand.tavg-u-hxy-lnd.mon.glb,mon,land,mass_content_of_nitrogen_in_vegetation_and_litter_and_soil_and_forestry_and_agricultural_products,kg m-2,area: mean where land time: mean,area: areacella,Total Nitrogen in All Terrestrial Nitrogen Pools,Report missing data over ocean grid cells. For fractional land report value averaged over the land fraction.,,longitude latitude time,nLand,real,,XY-na,time-intv,Emon,nLand,nLand,tavg-u-hxy-lnd,nLand_tavg-u-hxy-lnd,glb,Emon.nLand,land.nLand.tavg-u-hxy-lnd.mon.glb,6f6b1b5c-9acb-11e6-b7ee-ac72891c3257,high,,
+206,land.nLitter.tavg-u-hxy-lnd.mon.glb,mon,land,litter_mass_content_of_nitrogen,kg m-2,area: mean where land time: mean,area: areacella,Nitrogen Mass in Litter Pool,Report missing data over ocean grid cells. For fractional land report value averaged over the land fraction.,,longitude latitude time,nLitter,real,,XY-na,time-intv,Emon,nLitter,nLitter,tavg-u-hxy-lnd,nLitter_tavg-u-hxy-lnd,glb,Emon.nLitter,land.nLitter.tavg-u-hxy-lnd.mon.glb,6f6b0a36-9acb-11e6-b7ee-ac72891c3257,high,,
+207,land.nMineral.tavg-u-hxy-lnd.mon.glb,mon,land,soil_mass_content_of_inorganic_nitrogen_expressed_as_nitrogen,kg m-2,area: mean where land time: mean,area: areacella,Mineral Nitrogen in the Soil,"SUM of ammonium, nitrite, nitrate, etc over all soil layers",,longitude latitude time,nMineral,real,,XY-na,time-intv,Emon,nMineral,nMineral,tavg-u-hxy-lnd,nMineral_tavg-u-hxy-lnd,glb,Emon.nMineral,land.nMineral.tavg-u-hxy-lnd.mon.glb,8b80cb4a-4a5b-11e6-9cd2-ac72891c3257,high,,
+209,land.nppLut.tavg-u-hxy-multi.mon.glb,mon,land,net_primary_productivity_of_biomass_expressed_as_carbon,kg m-2 s-1,area: time: mean where sector,area: areacella,Net Primary Production on Land-Use Tile as Carbon Mass Flux [kgC m-2 s-1],"""Production of carbon"" means the production of biomass expressed as the mass of carbon which it contains. Net primary production is the excess of gross primary production (rate of synthesis of biomass from inorganic precursors) by autotrophs (""producers""), for example, photosynthesis in plants or phytoplankton, over the rate at which the autotrophs themselves respire some of this biomass. ""Productivity"" means production per unit area. The phrase ""expressed_as"" is used in the construction A_expressed_as_B, where B is a chemical constituent of A. It means that the quantity indicated by the standard name is calculated solely with respect to the B contained in A, neglecting all other chemical constituents of A.","CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude landUse time CMIP7:longitude latitude landuse time,",longitude latitude landuse time,nppLut,real,,XY-na,time-intv,Emon,nppLut,nppLut,tavg-u-hxy-multi,nppLut_tavg-u-hxy-multi,glb,Emon.nppLut,land.nppLut.tavg-u-hxy-multi.mon.glb,d22d96ba-4a9f-11e6-b84e-ac72891c3257,medium,,
+210,land.nppVgt.tavg-u-hxy-multi.day.glb,day,land,net_primary_productivity_of_biomass_expressed_as_carbon,kg m-2 s-1,area: time: mean where sector,area: areacella,Net Primary Production on Vegetation type as Carbon Mass Flux [kgC m-2 s-1],"""Production of carbon"" means the production of biomass expressed as the mass of carbon which it contains. Net primary production is the excess of gross primary production (rate of synthesis of biomass from inorganic precursors) by autotrophs (""producers""), for example, photosynthesis in plants or phytoplankton, over the rate at which the autotrophs themselves respire some of this biomass. ""Productivity"" means production per unit area. The phrase ""expressed_as"" is used in the construction A_expressed_as_B, where B is a chemical constituent of A. It means that the quantity indicated by the standard name is calculated solely with respect to the B contained in A, neglecting all other chemical constituents of A.",,longitude latitude vegtype time,nppVgt,real,,XY-na,time-intv,Eday,nppVgt,nppVgt,tavg-u-hxy-multi,nppVgt_tavg-u-hxy-multi,glb,Eday.nppVgt,land.nppVgt.tavg-u-hxy-multi.day.glb,83bbfba9-7f07-11ef-9308-b1dd71e64bec,medium,,
+211,land.nProduct.tavg-u-hxy-lnd.mon.glb,mon,land,nitrogen_mass_content_of_forestry_and_agricultural_products,kg m-2,area: mean where land time: mean,area: areacella,Nitrogen Mass in Products of Land-Use Change,Report missing data over ocean grid cells. For fractional land report value averaged over the land fraction.,,longitude latitude time,nProduct,real,,XY-na,time-intv,Emon,nProduct,nProduct,tavg-u-hxy-lnd,nProduct_tavg-u-hxy-lnd,glb,Emon.nProduct,land.nProduct.tavg-u-hxy-lnd.mon.glb,8b80c06e-4a5b-11e6-9cd2-ac72891c3257,high,,
+212,land.nSoil.tavg-u-hxy-lnd.mon.glb,mon,land,soil_mass_content_of_nitrogen,kg m-2,area: mean where land time: mean,area: areacella,Nitrogen Mass in Soil Pool,Report missing data over ocean grid cells. For fractional land report value averaged over the land fraction.,,longitude latitude time,nSoil,real,,XY-na,time-intv,Emon,nSoil,nSoil,tavg-u-hxy-lnd,nSoil_tavg-u-hxy-lnd,glb,Emon.nSoil,land.nSoil.tavg-u-hxy-lnd.mon.glb,8b80baec-4a5b-11e6-9cd2-ac72891c3257,high,,
+213,land.nVeg.tavg-u-hxy-lnd.mon.glb,mon,land,vegetation_mass_content_of_nitrogen,kg m-2,area: mean where land time: mean,area: areacella,Nitrogen Mass in Vegetation,Report missing data over ocean grid cells. For fractional land report value averaged over the land fraction.,,longitude latitude time,nVeg,real,,XY-na,time-intv,Emon,nVeg,nVeg,tavg-u-hxy-lnd,nVeg_tavg-u-hxy-lnd,glb,Emon.nVeg,land.nVeg.tavg-u-hxy-lnd.mon.glb,6f6b0478-9acb-11e6-b7ee-ac72891c3257,high,,
+215,land.qgwr.tavg-u-hxy-lnd.day.glb,day,land,downward_liquid_water_mass_flux_into_groundwater,kg m-2 s-1,area: mean where land time: mean,area: areacellr,Groundwater Recharge from Soil Layer,water_flux_from_soil_layer_to_groundwater,,longitude latitude time,qgwr,real,,XY-na,time-intv,Eday,qgwr,qgwr,tavg-u-hxy-lnd,qgwr_tavg-u-hxy-lnd,glb,Eday.qgwr,land.qgwr.tavg-u-hxy-lnd.day.glb,d22856be-4a9f-11e6-b84e-ac72891c3257,medium,,
+217,land.raLut.tavg-u-hxy-multi.mon.glb,mon,land,surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_plant_respiration,kg m-2 s-1,area: time: mean where sector,area: areacella,Autotrophic Respiration on Land-Use Tile as Carbon Mass Flux [kgC m-2 s-1],Carbon mass flux per unit area into atmosphere due to autotrophic respiration on land (respiration by producers) [see rh for heterotrophic production]. Calculated on land-use tiles.,"CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude landUse time CMIP7:longitude latitude landuse time,",longitude latitude landuse time,raLut,real,,XY-na,time-intv,Emon,raLut,raLut,tavg-u-hxy-multi,raLut_tavg-u-hxy-multi,glb,Emon.raLut,land.raLut.tavg-u-hxy-multi.mon.glb,d22d91a6-4a9f-11e6-b84e-ac72891c3257,medium,,
+218,land.raVgt.tavg-u-hxy-multi.day.glb,day,land,surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_plant_respiration,kg m-2 s-1,area: time: mean where sector,area: areacella,Autotrophic Respiration on Vegetation type as Carbon Mass Flux [kgC m-2 s-1],Carbon mass flux per unit area into atmosphere due to autotrophic respiration on land (respiration by producers) [see rh for heterotrophic production]. Calculated on vegetation type.,,longitude latitude vegtype time,raVgt,real,,XY-na,time-intv,Eday,raVgt,raVgt,tavg-u-hxy-multi,raVgt_tavg-u-hxy-multi,glb,Eday.raVgt,land.raVgt.tavg-u-hxy-multi.day.glb,83bbfba8-7f07-11ef-9308-b1dd71e64bec,medium,,
+220,land.rhLut.tavg-u-hxy-multi.mon.glb,mon,land,surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_heterotrophic_respiration,kg m-2 s-1,area: time: mean where sector,area: areacella,Heterotrophic Respiration on Land-Use Tile as Carbon Mass Flux [kgC m-2 s-1],"Carbon mass flux per unit area into atmosphere due to heterotrophic respiration on land (respiration by consumers), calculated on land-use tiles.","CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude landUse time CMIP7:longitude latitude landuse time,",longitude latitude landuse time,rhLut,real,,XY-na,time-intv,Emon,rhLut,rhLut,tavg-u-hxy-multi,rhLut_tavg-u-hxy-multi,glb,Emon.rhLut,land.rhLut.tavg-u-hxy-multi.mon.glb,d22da074-4a9f-11e6-b84e-ac72891c3257,medium,,
+221,land.rhVgt.tavg-u-hxy-multi.day.glb,day,land,surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_heterotrophic_respiration,kg m-2 s-1,area: time: mean where sector,area: areacella,Heterotrophic Respiration on Vegetation type as Carbon Mass Flux [kgC m-2 s-1],"Carbon mass flux per unit area into atmosphere due to heterotrophic respiration on land (respiration by consumers), calculated on vegetation type.",,longitude latitude vegtype time,rhVgt,real,,XY-na,time-intv,Eday,rhVgt,rhVgt,tavg-u-hxy-multi,rhVgt_tavg-u-hxy-multi,glb,Eday.rhVgt,land.rhVgt.tavg-u-hxy-multi.day.glb,83bbfba7-7f07-11ef-9308-b1dd71e64bec,medium,,
+222,land.rivo.tavg-u-hxy-lnd.day.glb,day,land,outgoing_water_volume_transport_along_river_channel,m3 s-1,area: mean where land time: mean,area: areacellr,River Discharge,water_flux_from_upstream,,longitude latitude time,rivo,real,,XY-na,time-intv,Eday,rivo,rivo,tavg-u-hxy-lnd,rivo_tavg-u-hxy-lnd,glb,Eday.rivo,land.rivo.tavg-u-hxy-lnd.day.glb,d2285b46-4a9f-11e6-b84e-ac72891c3257,high,,
+227,land.shrubFrac.tavg-u-hxy-u.yr.glb,yr,land,area_fraction,%,area: time: mean,area: areacella,Percentage Cover by Shrub,Percentage of entire grid cell that is covered by shrub.,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where land over all_area_types time: mean CMIP7:area: time: mean,",longitude latitude time typeshrub,shrubFrac,real,,XY-na,time-intv,Eyr,shrubFrac,shrubFrac,tavg-u-hxy-u,shrubFrac_tavg-u-hxy-u,glb,Eyr.shrubFrac,land.shrubFrac.tavg-u-hxy-u.yr.glb,fb017924-be37-11e6-bac1-5404a60d96b5,medium,,
+229,land.srfrad.tavg-u-hxy-u.3hr.glb,3hr,land,surface_net_downward_radiative_flux,W m-2,area: time: mean,area: areacella,Net radiative flux at surface,Net radiative flux at surface,,longitude latitude time,srfrad,real,down,XY-na,time-intv,3hr,srfrad,srfrad,tavg-u-hxy-u,srfrad_tavg-u-hxy-u,glb,3hr.srfrad,land.srfrad.tavg-u-hxy-u.3hr.glb,80ab71fd-a698-11ef-914a-613c0433d878,high,,
+230,land.sw.tavg-u-hxy-lnd.day.glb,day,land,land_surface_liquid_water_amount,kg m-2,area: mean where land time: mean,area: areacella,Surface Water Storage,"Total liquid water storage, other than soil, snow or interception storage (i.e. lakes, river channel or depression storage).",,longitude latitude time,sw,real,,XY-na,time-intv,Eday,sw,sw,tavg-u-hxy-lnd,sw_tavg-u-hxy-lnd,glb,Eday.sw,land.sw.tavg-u-hxy-lnd.day.glb,d2289714-4a9f-11e6-b84e-ac72891c3257,medium,,
+231,land.sweLut.tavg-u-hxy-multi.mon.glb,mon,land,lwe_thickness_of_surface_snow_amount,m,area: time: mean where sector,area: areacella,Snow Water Equivalent on Land-Use Tile,"The surface called ""surface"" means the lower boundary of the atmosphere. ""lwe"" means liquid water equivalent. ""Amount"" means mass per unit area. The construction lwe_thickness_of_X_amount or _content means the vertical extent of a layer of liquid water having the same mass per unit area. Surface amount refers to the amount on the ground, excluding that on the plant or vegetation canopy.","CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude landUse time CMIP7:longitude latitude landuse time,",longitude latitude landuse time,sweLut,real,,XY-na,time-intv,Emon,sweLut,sweLut,tavg-u-hxy-multi,sweLut_tavg-u-hxy-multi,glb,Emon.sweLut,land.sweLut.tavg-u-hxy-multi.mon.glb,d22dd206-4a9f-11e6-b84e-ac72891c3257,medium,,
+232,land.tasLut.tavg-h2m-hxy-multi.mon.glb,mon,land,air_temperature,K,area: time: mean where sector,area: areacella,Near-Surface Air Temperature on Land Use Tile,"Air temperature is the bulk temperature of the air, not the surface (skin) temperature.","CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude landUse time height2m CMIP7:longitude latitude landuse time height2m,",longitude latitude landuse time height2m,tasLut,real,,XY-na,time-intv,Emon,tasLut,tasLut,tavg-h2m-hxy-multi,tasLut_tavg-h2m-hxy-multi,glb,Emon.tasLut,land.tasLut.tavg-h2m-hxy-multi.mon.glb,d22dae98-4a9f-11e6-b84e-ac72891c3257,medium,,
+234,land.tran.tavg-u-hxy-u.3hr.glb,3hr,land,transpiration_flux,kg m-2 s-1,area: time: mean,area: areacella,Transpiration,Transpiration,,longitude latitude time,tran,real,up,XY-na,time-intv,3hr,tran,tran,tavg-u-hxy-u,tran_tavg-u-hxy-u,glb,3hr.tran,land.tran.tavg-u-hxy-u.3hr.glb,80ab71fc-a698-11ef-914a-613c0433d878,medium,,
+236,land.treeFrac.tavg-u-hxy-u.yr.glb,yr,land,area_fraction,%,area: time: mean,area: areacella,Tree Cover Percentage,Percentage of entire grid cell that is covered by trees.,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where land over all_area_types time: mean CMIP7:area: time: mean,",longitude latitude time typetree,treeFrac,real,,XY-na,time-intv,Eyr,treeFrac,treeFrac,tavg-u-hxy-u,treeFrac_tavg-u-hxy-u,glb,Eyr.treeFrac,land.treeFrac.tavg-u-hxy-u.yr.glb,fb017168-be37-11e6-bac1-5404a60d96b5,medium,,
+237,land.treeFracBdlDcd.tavg-u-hxy-u.mon.glb,mon,land,area_fraction,%,area: time: mean,area: areacella,Broadleaf Deciduous Tree Area Percentage,This is the percentage of the entire grid cell that is covered by broadleaf deciduous trees.,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where land over all_area_types time: mean CMIP7:area: time: mean,",longitude latitude time typetreebd,treeFracBdlDcd,real,,XY-na,time-intv,Emon,treeFracBdlDcd,treeFracBdlDcd,tavg-u-hxy-u,treeFracBdlDcd_tavg-u-hxy-u,glb,Emon.treeFracBdlDcd,land.treeFracBdlDcd.tavg-u-hxy-u.mon.glb,6f6a70da-9acb-11e6-b7ee-ac72891c3257,medium,,
+239,land.tslsi.tpt-u-hxy-lsi.3hr.glb,3hr,land,surface_temperature,K,area: mean (over land and sea ice) time: point,area: areacella,Surface Temperature Where Land or Sea Ice,"Surface temperature of all surfaces except open ocean, sampled synoptically.","CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean (comment: over land and sea ice) time: point CMIP7:area: mean (over land and sea ice) time: point,",longitude latitude time1,tslsi,real,,XY-na,time-point,3hr,tslsi,tslsi,tpt-u-hxy-lsi,tslsi_tpt-u-hxy-lsi,glb,3hr.tslsi,land.tslsi.tpt-u-hxy-lsi.3hr.glb,babb12ae-e5dd-11e5-8482-ac72891c3257,high,,
+240,land.tsLut.tavg-u-hxy-multi.mon.glb,mon,land,surface_temperature,K,area: time: mean where sector,area: areacella,Surface Temperature on Landuse Tile,Surface temperature (i.e. temperature at which long-wave radiation emitted),"CHANGE SINCE CMIP6 in Dimensions - CMIP6:longitude latitude landUse time CMIP7:longitude latitude landuse time,",longitude latitude landuse time,tsLut,real,,XY-na,time-intv,Emon,tslsiLut,tsLut,tavg-u-hxy-multi,tsLut_tavg-u-hxy-multi,glb,Emon.tslsiLut,land.tsLut.tavg-u-hxy-multi.mon.glb,d22db4d8-4a9f-11e6-b84e-ac72891c3257,medium,,
+241,land.vegHeight.tavg-u-hxy-tree.mon.glb,mon,land,canopy_height,m,area: time: mean where trees (mask=treeFrac),area: areacella,Height of Trees,Vegetation height averaged over the tree fraction of a grid cell.,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: time: mean where trees (comment: mask=treeFrac) CMIP7:area: time: mean where trees (mask=treeFrac),",longitude latitude time,vegHeight,real,,XY-na,time-intv,Emon,vegHeightTree,vegHeight,tavg-u-hxy-tree,vegHeight_tavg-u-hxy-tree,glb,Emon.vegHeightTree,land.vegHeight.tavg-u-hxy-tree.mon.glb,6f6ab46e-9acb-11e6-b7ee-ac72891c3257,high,,
+242,land.wtd.tavg-u-hxy-lnd.day.glb,day,land,water_table_depth,m,area: mean where land time: mean,area: areacellr,Water Table Depth,depth_of_soil_moisture_saturation,,longitude latitude time,wtd,real,,XY-na,time-intv,Eday,wtd,wtd,tavg-u-hxy-lnd,wtd_tavg-u-hxy-lnd,glb,Eday.wtd,land.wtd.tavg-u-hxy-lnd.day.glb,d228a89e-4a9f-11e6-b84e-ac72891c3257,high,,
\ No newline at end of file
diff --git a/awi-esm3-veg-hr-variables/veg_land/cmip7_veg_variables_landIce.csv b/awi-esm3-veg-hr-variables/veg_land/cmip7_veg_variables_landIce.csv
new file mode 100644
index 00000000..5c00536e
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/veg_land/cmip7_veg_variables_landIce.csv
@@ -0,0 +1,3 @@
+,name,frequency,modeling_realm,standard_name,units,cell_methods,cell_measures,long_name,comment,processing_note,dimensions,out_name,type,positive,spatial_shape,temporal_shape,cmip6_table,physical_parameter_name,variableRootDD,branding_label,branded_variable_name,region,cmip6_compound_name,cmip7_compound_name,uid,priority,flag_values,flag_meanings
+251,landIce.sbl.tavg-u-hxy-lnd.mon.glb,mon,landIce,tendency_of_atmosphere_mass_content_of_water_vapor_due_to_sublimation_of_surface_snow_and_ice,kg m-2 s-1,area: mean where land time: mean,area: areacella,Surface Snow and Ice Sublimation Flux,The snow and ice sublimation flux is the loss of snow and ice mass resulting from their conversion to water vapor. Computed as the total sublimation on the land portion of the grid cell divided by the land area in the grid cell; reported as missing for snow-free land regions; reported as missing where the land fraction is 0.,,longitude latitude time,sbl,real,,XY-na,time-intv,LImon,sbl,sbl,tavg-u-hxy-lnd,sbl_tavg-u-hxy-lnd,glb,LImon.sbl,landIce.sbl.tavg-u-hxy-lnd.mon.glb,bab6bba0-e5dd-11e5-8482-ac72891c3257,high,,
+252,landIce.sbl.tavg-u-hxy-u.day.glb,day,landIce,tendency_of_atmosphere_mass_content_of_water_vapor_due_to_sublimation_of_surface_snow_and_ice,kg m-2 s-1,area: time: mean,area: areacella,Surface Snow and Ice Sublimation Flux,surface upward flux of water vapor due to sublimation of surface snow and ice,"CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where land time: mean CMIP7:area: time: mean,",longitude latitude time,sbl,real,,XY-na,time-intv,Eday,sbl,sbl,tavg-u-hxy-u,sbl_tavg-u-hxy-u,glb,Eday.sbl,landIce.sbl.tavg-u-hxy-u.day.glb,d2282ebe-4a9f-11e6-b84e-ac72891c3257,medium,,
\ No newline at end of file
diff --git a/awi-esm3-veg-hr-variables/veg_land/cmip7_veg_variables_landIce_land.csv b/awi-esm3-veg-hr-variables/veg_land/cmip7_veg_variables_landIce_land.csv
new file mode 100644
index 00000000..d66b0fb0
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/veg_land/cmip7_veg_variables_landIce_land.csv
@@ -0,0 +1,14 @@
+,name,frequency,modeling_realm,standard_name,units,cell_methods,cell_measures,long_name,comment,processing_note,dimensions,out_name,type,positive,spatial_shape,temporal_shape,cmip6_table,physical_parameter_name,variableRootDD,branding_label,branded_variable_name,region,cmip6_compound_name,cmip7_compound_name,uid,priority,flag_values,flag_meanings
+243,landIce.agesno.tavg-u-hxy-lnd.mon.glb,mon,landIce land,age_of_surface_snow,day,area: mean where land time: mean (weighted by snow mass on land),area: areacella,Mean Age of Snow,"When computing the time-mean here, the time samples, weighted by the mass of snow on the land portion of the grid cell, are accumulated and then divided by the sum of the weights. Reported as ""missing in regions free of snow on land.","CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where land time: mean (with samples weighted by snow mass) CMIP7:area: mean where land time: mean (weighted by snow mass on land),",longitude latitude time,agesno,real,,XY-na,time-intv,LImon,agesno,agesno,tavg-u-hxy-lnd,agesno_tavg-u-hxy-lnd,glb,LImon.agesno,landIce.agesno.tavg-u-hxy-lnd.mon.glb,baa7f8ae-e5dd-11e5-8482-ac72891c3257,medium,,
+244,landIce.hfdsn.tavg-u-hxy-lnd.day.glb,day,landIce land,surface_downward_heat_flux_in_snow,W m-2,area: mean where land time: mean,area: areacella,Downward Heat Flux into Snow Where Land over Land,Downward heat flux at snow top,,longitude latitude time,hfdsn,real,down,XY-na,time-intv,Eday,hfdsn,hfdsn,tavg-u-hxy-lnd,hfdsn_tavg-u-hxy-lnd,glb,Eday.hfdsn,landIce.hfdsn.tavg-u-hxy-lnd.day.glb,d2279224-4a9f-11e6-b84e-ac72891c3257,medium,,
+245,landIce.hfdsn.tavg-u-hxy-lnd.mon.glb,mon,landIce land,surface_downward_heat_flux_in_snow,W m-2,area: mean where land time: mean,area: areacella,Downward Heat Flux into Snow Where Land over Land,the net downward heat flux from the atmosphere into the snow that lies on land divided by the land area in the grid cell; reported as missing for snow-free land regions or where the land fraction is 0.,,longitude latitude time,hfdsn,real,down,XY-na,time-intv,LImon,hfdsn,hfdsn,tavg-u-hxy-lnd,hfdsn_tavg-u-hxy-lnd,glb,LImon.hfdsn,landIce.hfdsn.tavg-u-hxy-lnd.mon.glb,baaed890-e5dd-11e5-8482-ac72891c3257,high,,
+246,landIce.lwsnl.tavg-u-hxy-lnd.day.glb,day,landIce land,liquid_water_content_of_surface_snow,kg m-2,area: mean where land time: mean,area: areacella,Liquid Water Content of Snow Layer,liquid_water_content_of_snow_layer,,longitude latitude time,lwsnl,real,,XY-na,time-intv,Eday,lwsnl,lwsnl,tavg-u-hxy-lnd,lwsnl_tavg-u-hxy-lnd,glb,Eday.lwsnl,landIce.lwsnl.tavg-u-hxy-lnd.day.glb,d228925a-4a9f-11e6-b84e-ac72891c3257,medium,,
+247,landIce.lwsnl.tavg-u-hxy-lnd.mon.glb,mon,landIce land,liquid_water_content_of_surface_snow,kg m-2,area: mean where land time: mean,area: areacella,Liquid Water Content of Snow Layer,where land over land: this is computed as the total mass of liquid water contained interstitially within the snow layer of the land portion of a grid cell divided by the area of the land portion of the cell.,,longitude latitude time,lwsnl,real,,XY-na,time-intv,LImon,lwsnl,lwsnl,tavg-u-hxy-lnd,lwsnl_tavg-u-hxy-lnd,glb,LImon.lwsnl,landIce.lwsnl.tavg-u-hxy-lnd.mon.glb,bab0f1a2-e5dd-11e5-8482-ac72891c3257,medium,,
+249,landIce.pflw.tavg-u-hxy-lnd.day.glb,day,landIce land,liquid_water_content_of_permafrost_layer,kg m-2,area: mean where land time: mean,area: areacella,Liquid Water Content of Permafrost Layer,liquid_water_content_of_permafrost_layer,,longitude latitude time,pflw,real,,XY-na,time-intv,Eday,pflw,pflw,tavg-u-hxy-lnd,pflw_tavg-u-hxy-lnd,glb,Eday.pflw,landIce.pflw.tavg-u-hxy-lnd.day.glb,d228ee4e-4a9f-11e6-b84e-ac72891c3257,medium,,
+250,landIce.pflw.tavg-u-hxy-lnd.mon.glb,mon,landIce land,liquid_water_content_of_permafrost_layer,kg m-2,area: mean where land time: mean,area: areacella,Liquid Water Content of Permafrost Layer,"""where land over land"", i.e., this is the total mass of liquid water contained within the permafrost layer within the land portion of a grid cell divided by the area of the land portion of the cell.",,longitude latitude time,pflw,real,,XY-na,time-intv,LImon,pflw,pflw,tavg-u-hxy-lnd,pflw_tavg-u-hxy-lnd,glb,LImon.pflw,landIce.pflw.tavg-u-hxy-lnd.mon.glb,bab323d2-e5dd-11e5-8482-ac72891c3257,high,,
+256,landIce.snd.tavg-u-hxy-lnd.day.glb,day,landIce land,surface_snow_thickness,m,area: mean where land time: mean,area: areacella,Snow Depth,"where land over land, this is computed as the mean thickness of snow in the land portion of the grid cell (averaging over the entire land portion, including the snow-free fraction). Reported as 0.0 where the land fraction is 0.",,longitude latitude time,snd,real,,XY-na,time-intv,Eday,snd,snd,tavg-u-hxy-lnd,snd_tavg-u-hxy-lnd,glb,Eday.snd,landIce.snd.tavg-u-hxy-lnd.day.glb,b7ccdf0a-7c00-11e6-bcdf-ac72891c3257,medium,,
+258,landIce.snm.tavg-u-hxy-lnd.day.glb,day,landIce land,surface_snow_melt_flux,kg m-2 s-1,area: mean where land time: mean,area: areacella,Surface Snow Melt,surface_snow_and_ice_melt_flux,,longitude latitude time,snm,real,,XY-na,time-intv,Eday,snm,snm,tavg-u-hxy-lnd,snm_tavg-u-hxy-lnd,glb,Eday.snm,landIce.snm.tavg-u-hxy-lnd.day.glb,d22848ea-4a9f-11e6-b84e-ac72891c3257,medium,,
+262,landIce.sootsn.tavg-u-hxy-lnd.mon.glb,mon,landIce land,soot_content_of_surface_snow,kg m-2,area: mean where land time: mean,area: areacella,Snow Soot Content,"the entire land portion of the grid cell is considered, with snow soot content set to 0.0 in regions free of snow.",,longitude latitude time,sootsn,real,,XY-na,time-intv,LImon,sootsn,sootsn,tavg-u-hxy-lnd,sootsn_tavg-u-hxy-lnd,glb,LImon.sootsn,landIce.sootsn.tavg-u-hxy-lnd.mon.glb,bab83fc0-e5dd-11e5-8482-ac72891c3257,high,,
+263,landIce.tpf.tavg-u-hxy-lnd.day.glb,day,landIce land,permafrost_layer_thickness,m,area: mean where land time: mean,area: areacella,Permafrost Layer Thickness,permafrost_layer_thickness,,longitude latitude time,tpf,real,,XY-na,time-intv,Eday,tpf,tpf,tavg-u-hxy-lnd,tpf_tavg-u-hxy-lnd,glb,Eday.tpf,landIce.tpf.tavg-u-hxy-lnd.day.glb,d228ea34-4a9f-11e6-b84e-ac72891c3257,medium,,
+264,landIce.tpf.tavg-u-hxy-lnd.mon.glb,mon,landIce land,permafrost_layer_thickness,m,area: mean where land time: mean,area: areacella,Permafrost Layer Thickness,where land over land: This is the mean thickness of the permafrost layer in the land portion of the grid cell. Reported as missing in permafrost-free regions.,,longitude latitude time,tpf,real,,XY-na,time-intv,LImon,tpf,tpf,tavg-u-hxy-lnd,tpf_tavg-u-hxy-lnd,glb,LImon.tpf,landIce.tpf.tavg-u-hxy-lnd.mon.glb,baba8cbc-e5dd-11e5-8482-ac72891c3257,high,,
+265,landIce.tsn.tavg-u-hxy-lnd.day.glb,day,landIce land,temperature_in_surface_snow,K,depth: area: time: mean where land (weighted by snow mass on land),area: areacella,Snow Internal Temperature,"This temperature is averaged over all the snow in the grid cell that rests on land or land ice. When computing the time-mean here, the time samples, weighted by the mass of snow on the land portion of the grid cell, are accumulated and then divided by the sum of the weights. Reported as ""missing in regions free of snow on land.","CHANGE SINCE CMIP6 in Cell Methods - CMIP6:area: mean where land time: mean (with samples weighted by snow mass) CMIP7:depth: area: time: mean where land (weighted by snow mass on land),",longitude latitude time,tsn,real,,XY-na,time-intv,Eday,tsn,tsn,tavg-u-hxy-lnd,tsn_tavg-u-hxy-lnd,glb,Eday.tsn,landIce.tsn.tavg-u-hxy-lnd.day.glb,d227e53a-4a9f-11e6-b84e-ac72891c3257,medium,,
\ No newline at end of file
diff --git a/awi-esm3-veg-hr-variables/veg_seaice/cmip7_awiesm3-veg-hr_seaice.yaml b/awi-esm3-veg-hr-variables/veg_seaice/cmip7_awiesm3-veg-hr_seaice.yaml
new file mode 100644
index 00000000..ee637b40
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/veg_seaice/cmip7_awiesm3-veg-hr_seaice.yaml
@@ -0,0 +1,74 @@
+# CMIP7 VEG Sea Ice Variables — AWI-ESM3-VEG-HR
+#
+# 1 producible variable (daily sisnhc); 3 blocked (see cmip7_veg_seaice_todo.md).
+# Daily sisnhc derived from daily m_snow and a_ice (h_snow not available daily).
+
+general:
+ name: "awiesm3-cmip7-veg-seaice"
+ cmor_version: "CMIP7"
+ mip: "CMIP"
+ CMIP7_DReq_metadata: "/home/a/a270092/.cache/pycmor/cmip7_metadata/v1.2.2.2/metadata.json"
+
+pycmor:
+ warn_on_no_rule: False
+ dask_cluster: "slurm"
+ dask_cluster_scaling_mode: "fixed"
+ dask_cluster_scaling_fixed_jobs: 1
+
+jobqueue:
+ slurm:
+ name: pycmor-worker
+ queue: compute
+ account: bb1469
+ cores: 16
+ memory: 256GB
+ walltime: '00:30:00'
+
+pipelines:
+ # Snow heat content from daily m_snow + a_ice
+ # h_snow = m_snow / (rho_snow * a_ice), sisnhc = -rho_snow * L_f * h_snow
+ - name: sisnhc_from_msnow_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_sisnhc_from_msnow
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+inherit:
+ data_path: &dp /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/fesom
+ source_id: AWI-ESM-3
+ institution_id: AWI
+ experiment_id: picontrol
+ variant_label: r1i1p1f1
+ grid_label: gn
+ mesh_path: /work/ab0246/a270092/input/fesom2/dars2
+ grid_file: /work/ab0246/a270092/input/fesom2/dars2/mesh.nc
+ grid: "FESOM 2.6 unstructured grid DARS (3146761 surface nodes)"
+ nominal_resolution: "10 km"
+ institution: "Alfred Wegener Institute, Helmholtz Centre for Polar and Marine Research, Bremerhaven, Germany"
+ output_directory: ./cmorized_output/awiesm3
+
+rules:
+ # Daily snow heat content: derived from daily m_snow and a_ice
+ # sisnhc = -L_f * m_snow / a_ice (latent heat dominates, sensible ≈ 0)
+ - name: sisnhc_day
+ inputs:
+ - path: *dp
+ pattern: m_snow.fesom.*.nc
+ compound_name: seaIce.sisnhc.tavg-u-hxy-sn.day.GLB
+ model_variable: m_snow
+ second_input_path: *dp
+ second_input_pattern: a_ice.fesom.*.nc
+ second_variable: a_ice
+ rho_snow: 330.0
+ L_f: 334000.0
+ pipelines:
+ - sisnhc_from_msnow_pipeline
diff --git a/awi-esm3-veg-hr-variables/veg_seaice/cmip7_veg_seaice_todo.md b/awi-esm3-veg-hr-variables/veg_seaice/cmip7_veg_seaice_todo.md
new file mode 100644
index 00000000..d6b629e5
--- /dev/null
+++ b/awi-esm3-veg-hr-variables/veg_seaice/cmip7_veg_seaice_todo.md
@@ -0,0 +1,44 @@
+# CMIP7 VEG Sea Ice Variables -- Rule Implementation TODO
+
+Variables from 1 CSV in `veg_seaice/`: 4 total rows (all SIday).
+
+Model constraints:
+- Sea ice: FESOM 2.6 built-in single-category (no ITD / ice thickness distribution)
+- No iceband dimension available (single category = 1 "band")
+- Snow on ice: single-layer, no snow-ice interface temperature tracked
+- Output via FESOM namelist.io on unstructured mesh
+
+---
+
+## Daily sea ice variables
+
+### NOT producible (require ice thickness distribution)
+
+- ~~**siitdsnconc** (SIday)~~ -- Snow Area Fraction by Ice Thickness Category (`%`) -- requires ITD / iceband dimension
+- ~~**siitdsnthick** (SIday)~~ -- Snow Thickness by Ice Thickness Category (`m`) -- requires ITD / iceband dimension
+
+### Producible
+
+- [x] **sisnhc** (SIday) -- Snow Heat Content over Sea Ice (`J m-2`) -- derived from daily `m_snow` and `a_ice`: `h_snow = m_snow / a_ice`, then `sisnhc = -rho_snow * L_f * h_snow` (same formula as monthly lrcs_seaice, but from daily fields)
+
+### NOT producible (missing physics)
+
+- ~~**sitempsnic** (SIday)~~ -- Temperature at Snow-Ice Interface (`K`) -- FESOM single-category ice only tracks surface temperature (`ice_temp`/`ist`), not the snow-ice boundary. `Tsnice` exists only in the icepack driver which is not active.
+
+---
+
+## Summary
+
+| Category | Count | Done | Blocked |
+|----------|-------|------|---------|
+| ITD variables | 2 | 0 | 2 (no ITD) |
+| Snow heat content | 1 | 1 | 0 |
+| Snow-ice interface temp | 1 | 0 | 1 (no physics) |
+| **Total** | **4** | **1** | **3** |
+
+## Implementation status
+
+1 producible variable implemented:
+- pycmor YAML rule in `cmip7_awiesm3-veg-hr_seaice.yaml`
+- Custom step `compute_sisnhc_from_msnow` derives h_snow from daily m_snow/a_ice
+- Reuses existing `compute_sisnhc` for the heat content calculation
diff --git a/examples/00-testing-example/cleanup.py b/examples/00-testing-example/cleanup.py
index 71b41fdd..17e8e05e 100755
--- a/examples/00-testing-example/cleanup.py
+++ b/examples/00-testing-example/cleanup.py
@@ -2,6 +2,7 @@
"""
Cleans up from example runs
"""
+
import shutil
from pathlib import Path
diff --git a/examples/01-default-unit-conversion/cleanup.py b/examples/01-default-unit-conversion/cleanup.py
index c75de825..5c4a7771 100755
--- a/examples/01-default-unit-conversion/cleanup.py
+++ b/examples/01-default-unit-conversion/cleanup.py
@@ -2,6 +2,7 @@
"""
Cleans up from example runs
"""
+
import shutil
from pathlib import Path
diff --git a/examples/02-upward-ocean-mass-transport/cleanup.py b/examples/02-upward-ocean-mass-transport/cleanup.py
index 71b41fdd..17e8e05e 100755
--- a/examples/02-upward-ocean-mass-transport/cleanup.py
+++ b/examples/02-upward-ocean-mass-transport/cleanup.py
@@ -2,6 +2,7 @@
"""
Cleans up from example runs
"""
+
import shutil
from pathlib import Path
diff --git a/examples/03-incorrect-units-in-source-files/cleanup.py b/examples/03-incorrect-units-in-source-files/cleanup.py
index 71b41fdd..17e8e05e 100755
--- a/examples/03-incorrect-units-in-source-files/cleanup.py
+++ b/examples/03-incorrect-units-in-source-files/cleanup.py
@@ -2,6 +2,7 @@
"""
Cleans up from example runs
"""
+
import shutil
from pathlib import Path
diff --git a/examples/04-multivariable-input-with-vertical-integration/cleanup.py b/examples/04-multivariable-input-with-vertical-integration/cleanup.py
index 71b41fdd..17e8e05e 100755
--- a/examples/04-multivariable-input-with-vertical-integration/cleanup.py
+++ b/examples/04-multivariable-input-with-vertical-integration/cleanup.py
@@ -2,6 +2,7 @@
"""
Cleans up from example runs
"""
+
import shutil
from pathlib import Path
diff --git a/examples/RUNAWAY_CLUSTER_ISSUE.txt b/examples/RUNAWAY_CLUSTER_ISSUE.txt
new file mode 100644
index 00000000..5c5c8a14
--- /dev/null
+++ b/examples/RUNAWAY_CLUSTER_ISSUE.txt
@@ -0,0 +1,34 @@
+================================================================================
+RUNAWAY SLURM CLUSTER ISSUE
+================================================================================
+Date: 2026-03-31
+
+PROBLEM:
+When pycmor process crashes or hangs, the Dask SLURMCluster with adaptive
+scaling continues spawning workers in infinite loop:
+ - Cluster requests workers → Workers start → No work available → Canceled
+ - Repeat indefinitely (30+ jobs spawned in 10 minutes)
+
+ROOT CAUSE:
+Process crashes but SLURMCluster adaptive scaling thread doesn't stop.
+
+IMMEDIATE FIX:
+ $ pkill -9 -f "pycmor process"
+ $ scancel -u $USER
+
+PREVENTION:
+1. Set worker walltime limit in YAML:
+ jobqueue:
+ slurm:
+ walltime: '00:10:00' # Auto-terminate after 10 min
+
+2. Use fixed scaling instead of adaptive:
+ dask_cluster_scaling_mode: "scale"
+ dask_cluster_scaling_jobs: 4
+
+3. Run with timeout wrapper:
+ $ timeout 3600 pycmor process config.yaml || scancel -u $USER
+
+LONG-TERM FIX:
+Add proper cluster cleanup on error in pycmor code (signal handlers,
+try/finally blocks, atexit cleanup).
diff --git a/examples/awiesm3-cmip7-lrcs-seaice.yaml b/examples/awiesm3-cmip7-lrcs-seaice.yaml
new file mode 100644
index 00000000..a3da81c4
--- /dev/null
+++ b/examples/awiesm3-cmip7-lrcs-seaice.yaml
@@ -0,0 +1,263 @@
+general:
+ name: "awiesm3-cmip7-lrcs-seaice"
+ cmor_version: "CMIP7"
+ mip: "CMIP"
+ CMIP7_DReq_metadata: "/home/a/a270092/.cache/pycmor/cmip7_metadata/v1.2.2.2/metadata.json"
+
+pycmor:
+ warn_on_no_rule: False
+ dask_cluster: "slurm"
+ dask_cluster_scaling_mode: "fixed"
+ dask_cluster_scaling_fixed_jobs: 1
+
+jobqueue:
+ slurm:
+ name: pycmor-worker
+ queue: compute
+ account: bb1469
+ cores: 16
+ memory: 256GB
+ walltime: '00:30:00'
+
+# LRCS sea ice custom pipelines
+pipelines:
+ # Fraction to percent (reused from core seaice for simpconc)
+ - name: fraction_to_percent_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:fraction_to_percent
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Generic: multiply by constant (rho_ice, rho_snow, rho_water, etc.)
+ - name: scale_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:scale_by_constant
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Sea ice speed: sqrt(uice² + vice²)
+ - name: sispeed_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_sispeed
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Ice mass transport: velocity × m_ice
+ - name: ice_mass_transport_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_ice_mass_transport
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Average normal stress: (sgm11 + sgm22) / 2
+ - name: sistressave_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_sistressave
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Maximum shear stress: sqrt(((sgm11-sgm22)/2)² + sgm12²)
+ - name: sistressmax_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_sistressmax
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Conductive heat flux at ice surface: k_ice*(T_base-T_surface)/h_ice
+ - name: siflcondtop_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_siflcondtop
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Sea ice heat content: rho_ice*h_ice*(c_ice*(T_mean-T_melt)-L_f)
+ - name: sihc_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_sihc
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Snow heat content: -rho_snow * L_f * h_snow
+ - name: sisnhc_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_sisnhc
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Freezing point from SSS → sitempbot
+ - name: sitempbot_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_sitempbot
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Freeboard from h_ice and h_snow
+ - name: sifb_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_sifb
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Effective melt pond fraction: apnd*(1-ipnd/hpnd)*100
+ - name: simpeffconc_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_simpeffconc
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Constant field (e.g. drag coefficient)
+ - name: constant_field_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_constant_field
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Generic hemisphere integral (snow mass, ice area, etc.)
+ - name: hemisphere_integral_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:integrate_over_hemisphere
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+# Common attributes inherited by all rules
+inherit:
+ source_id: AWI-ESM-3
+ institution_id: AWI
+ experiment_id: picontrol
+ variant_label: r1i1p1f1
+ grid_label: gn
+ mesh_path: /work/ab0246/a270092/input/fesom2/dars2
+ grid_file: /work/ab0246/a270092/input/fesom2/dars2/mesh.nc
+ grid: "FESOM 2.6 unstructured grid DARS (3146761 surface nodes)"
+ nominal_resolution: "10 km"
+ institution: "Alfred Wegener Institute, Helmholtz Centre for Polar and Marine Research, Bremerhaven, Germany"
+ output_directory: ./cmorized_output/awiesm3
diff --git a/examples/awiesm3-cmip7-minimal.yaml b/examples/awiesm3-cmip7-minimal.yaml
new file mode 100644
index 00000000..aef48e6f
--- /dev/null
+++ b/examples/awiesm3-cmip7-minimal.yaml
@@ -0,0 +1,174 @@
+general:
+ name: "awiesm3-cmip7-minimal"
+ cmor_version: "CMIP7"
+ mip: "CMIP"
+ CMIP7_DReq_metadata: "/home/a/a270092/.cache/pycmor/cmip7_metadata/v1.2.2.2/metadata.json"
+
+pycmor:
+ warn_on_no_rule: False
+ dask_cluster: "slurm"
+ dask_cluster_scaling_mode: "fixed"
+ dask_cluster_scaling_fixed_jobs: 1
+
+jobqueue:
+ slurm:
+ name: pycmor-worker
+ queue: compute
+ account: bb1469
+ cores: 16
+ memory: 256GB
+ walltime: '00:30:00'
+
+# Custom pipelines
+pipelines:
+ - name: ocean_vertical_integration_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:vertical_integrate
+ - pycmor.std_lib.add_vertical_bounds
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Ofx pipeline: load grid file, extract variable directly (e.g., areacello)
+ # Generic — reusable for any model with grid info in NetCDF
+ - name: fx_extract_pipeline
+ steps:
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:load_gridfile
+ - pycmor.std_lib.generic.get_variable
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Ofx pipeline: compute bathymetry from mesh depth_lev
+ - name: fx_deptho_pipeline
+ steps:
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:load_gridfile
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_deptho
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Ofx pipeline: compute sea area fraction from mesh
+ - name: fx_sftof_pipeline
+ steps:
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:load_gridfile
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_sftof
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Ofx pipeline: compute static layer thickness from depth_bnds
+ - name: fx_thkcello_pipeline
+ steps:
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:load_gridfile
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_thkcello_fx
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Ofx pipeline: compute static mass per area (rho_0 * thkcello)
+ - name: fx_masscello_pipeline
+ steps:
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:load_gridfile
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_masscello_fx
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Mass transport pipeline: load velocity → extract → multiply by rho_0*dz
+ - name: mass_transport_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_mass_transport
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # Zostoga pipeline: load temperature → extract → compute global thermosteric SL
+ - name: zostoga_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_zostoga
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+# Common attributes inherited by all rules
+inherit:
+ source_id: AWI-ESM-3
+ institution_id: AWI
+ experiment_id: picontrol
+ variant_label: r1i1p1f1
+ grid_label: gn
+ mesh_path: /work/ab0246/a270092/input/fesom2/dars2
+ grid_file: /work/ab0246/a270092/input/fesom2/dars2/mesh.nc
+ grid: "FESOM 2.6 unstructured grid DARS (3146761 surface nodes)"
+ nominal_resolution: "10 km"
+ institution: "Alfred Wegener Institute, Helmholtz Centre for Polar and Marine Research, Bremerhaven, Germany"
+ output_directory: ./cmorized_output/awiesm3
+
+rules:
+ # Ocean surface temperature
+ - name: tos
+ inputs:
+ - path: /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/fesom
+ pattern: sst.fesom.1350.nc
+ compound_name: ocean.tos.tavg-u-hxy-sea.mon.GLB
+ model_variable: sst
+
+ # Depth-integrated absolute salinity (computed from 3D field)
+ - name: absscint
+ inputs:
+ - path: /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/fesom
+ pattern: salt.fesom.1350.nc
+ compound_name: ocean.absscint.tavg-op4-hxy-sea.mon.GLB
+ model_variable: salt
+ integration_attrs:
+ long_name: "Integral wrt depth of seawater absolute salinity expressed as salt mass content"
+ standard_name: "integral_wrt_depth_of_sea_water_absolute_salinity_expressed_as_salt_mass_content"
+ units: "kg m-2"
+ pipelines:
+ - ocean_vertical_integration_pipeline
diff --git a/examples/awiesm3-cmip7-seaice.yaml b/examples/awiesm3-cmip7-seaice.yaml
new file mode 100644
index 00000000..39230a20
--- /dev/null
+++ b/examples/awiesm3-cmip7-seaice.yaml
@@ -0,0 +1,138 @@
+general:
+ name: "awiesm3-cmip7-seaice"
+ cmor_version: "CMIP7"
+ mip: "CMIP"
+ CMIP7_DReq_metadata: "/home/a/a270092/.cache/pycmor/cmip7_metadata/v1.2.2.2/metadata.json"
+
+pycmor:
+ warn_on_no_rule: False
+ dask_cluster: "slurm"
+ dask_cluster_scaling_mode: "fixed"
+ dask_cluster_scaling_fixed_jobs: 1
+
+jobqueue:
+ slurm:
+ name: pycmor-worker
+ queue: compute
+ account: bb1469
+ cores: 16
+ memory: 256GB
+ walltime: '00:30:00'
+
+# Sea ice custom pipelines
+pipelines:
+ # siconc: fraction (0-1) → percentage (0-100)
+ - name: siconc_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:fraction_to_percent
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.units.handle_unit_conversion
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+ # sitimefrac: binary ice presence from siconc > 0
+ - name: sitimefrac_pipeline
+ steps:
+ - pycmor.core.gather_inputs.load_mfdataset
+ - pycmor.std_lib.generic.get_variable
+ - script:///work/ab0246/a270092/software/pycmor/examples/custom_steps.py:compute_sitimefrac
+ - pycmor.std_lib.timeaverage.timeavg
+ - pycmor.std_lib.attributes.set_global
+ - pycmor.std_lib.attributes.set_variable
+ - pycmor.std_lib.attributes.set_coordinates
+ - pycmor.std_lib.dimensions.map_dimensions
+ - pycmor.core.caching.manual_checkpoint
+ - pycmor.std_lib.generic.trigger_compute
+ - pycmor.std_lib.generic.show_data
+ - pycmor.std_lib.files.save_dataset
+
+# Common attributes inherited by all rules
+inherit:
+ source_id: AWI-ESM-3
+ institution_id: AWI
+ experiment_id: picontrol
+ variant_label: r1i1p1f1
+ grid_label: gn
+ mesh_path: /work/ab0246/a270092/input/fesom2/dars2
+ grid_file: /work/ab0246/a270092/input/fesom2/dars2/mesh.nc
+ grid: "FESOM 2.6 unstructured grid DARS (3146761 surface nodes)"
+ nominal_resolution: "10 km"
+ institution: "Alfred Wegener Institute, Helmholtz Centre for Polar and Marine Research, Bremerhaven, Germany"
+ output_directory: ./cmorized_output/awiesm3
+
+rules:
+ # ============================================================
+ # Monthly (SImon) — DefaultPipeline (direct variable mapping)
+ # ============================================================
+
+ - name: simass
+ inputs:
+ - path: /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/fesom
+ pattern: m_ice.fesom.1350.nc
+ compound_name: seaIce.simass.tavg-u-hxy-si.mon.GLB
+ model_variable: m_ice
+
+ - name: siu
+ inputs:
+ - path: /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/fesom
+ pattern: uice.fesom.1350.nc
+ compound_name: seaIce.siu.tavg-u-hxy-si.mon.GLB
+ model_variable: uice
+
+ - name: siv
+ inputs:
+ - path: /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/fesom
+ pattern: vice.fesom.1350.nc
+ compound_name: seaIce.siv.tavg-u-hxy-si.mon.GLB
+ model_variable: vice
+
+ - name: sithick
+ inputs:
+ - path: /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/fesom
+ pattern: h_ice.fesom.1350.nc
+ compound_name: seaIce.sithick.tavg-u-hxy-si.mon.GLB
+ model_variable: h_ice
+
+ - name: snd
+ inputs:
+ - path: /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/fesom
+ pattern: h_snow.fesom.1350.nc
+ compound_name: seaIce.snd.tavg-u-hxy-sn.mon.GLB
+ model_variable: h_snow
+
+ - name: ts
+ inputs:
+ - path: /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/fesom
+ pattern: ist.fesom.1350.nc
+ compound_name: seaIce.ts.tavg-u-hxy-si.mon.GLB
+ model_variable: ist
+
+ # ============================================================
+ # Monthly (SImon) — custom pipelines
+ # ============================================================
+
+ - name: siconc
+ inputs:
+ - path: /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/fesom
+ pattern: a_ice.fesom.1350.nc
+ compound_name: seaIce.siconc.tavg-u-hxy-u.mon.GLB
+ model_variable: a_ice
+ pipelines:
+ - siconc_pipeline
+
+ - name: sitimefrac
+ inputs:
+ - path: /work/bb1469/a270089/runtime/awiesm3-v3.4.1/AWI-ESM3-VEG-HR-CMIP7-Spinup_cont2/outdata/fesom
+ pattern: a_ice.fesom.1350.nc
+ compound_name: seaIce.sitimefrac.tavg-u-hxy-sea.mon.GLB
+ model_variable: a_ice
+ pipelines:
+ - sitimefrac_pipeline
diff --git a/examples/custom_steps.py b/examples/custom_steps.py
new file mode 100644
index 00000000..e17baf8f
--- /dev/null
+++ b/examples/custom_steps.py
@@ -0,0 +1,2375 @@
+"""
+Custom processing steps for pycmor pipelines.
+
+Steps are organized by reusability:
+- Generic steps (load_gridfile): work with any model/realm
+- Ocean fx steps (compute_deptho, etc.): FESOM-specific but pattern is reusable
+- Vertical integration: generic ocean/atmosphere
+"""
+
+import glob as _glob
+import logging
+import os as _os
+from typing import Optional
+
+import numpy as np
+import xarray as xr
+
+logger = logging.getLogger(__name__)
+
+
+# ============================================================
+# Generic steps — reusable across models and realms
+# ============================================================
+
+
+def load_gridfile(data, rule):
+ """
+ Load a single grid/mesh file as an xarray Dataset.
+
+ Reads the path from rule.grid_file. This replaces load_mfdataset
+ for fx (time-invariant) variables derived from grid files rather
+ than model output time series.
+
+ Works with any model that stores grid info in a NetCDF file:
+ FESOM mesh.nc, ICON grid.nc, atmosphere grids, etc.
+ """
+ grid_file = rule.get("grid_file")
+ if grid_file is None:
+ raise ValueError("Rule must specify 'grid_file' for load_gridfile step")
+ logger.info(f"Loading grid file: {grid_file}")
+ ds = xr.open_dataset(grid_file)
+ return ds
+
+
+# ============================================================
+# Ocean fx computation steps — FESOM mesh specific
+# Pattern: take mesh Dataset, return a single DataArray
+# ============================================================
+
+
+def compute_deptho(data, rule):
+ """
+ Compute ocean bathymetry (sea floor depth) from FESOM mesh.
+
+ Uses mesh depth levels and the number of active levels per cell
+ to determine the bottom depth at each horizontal location.
+
+ Input: xr.Dataset (mesh file with 'depth' and 'depth_lev')
+ Output: xr.DataArray (2D field of bottom depth)
+ """
+ if "depth_lev" in data and "depth" in data:
+ # depth_lev = number of active vertical levels per cell
+ # depth = 1D array of level depths
+ depth = data["depth"].values
+ depth_lev = data["depth_lev"].values
+ # Bottom depth = depth at the last active level
+ bottom_depth = np.array([depth[min(int(nl), len(depth) - 1)] for nl in depth_lev])
+ result = xr.DataArray(
+ bottom_depth,
+ dims=data["depth_lev"].dims,
+ attrs={"units": "m", "standard_name": "sea_floor_depth_below_geoid"},
+ )
+ elif "zbar_n_bottom" in data:
+ # Alternative: fesom.mesh.diag.nc provides this directly
+ result = data["zbar_n_bottom"]
+ else:
+ raise ValueError("Mesh file must contain 'depth'+'depth_lev' or 'zbar_n_bottom'")
+ result.name = "deptho"
+ return result
+
+
+def compute_sftof(data, rule):
+ """
+ Compute sea area fraction from FESOM mesh.
+
+ Ocean cells get 100%, land cells get 0%.
+ Determined by whether a cell has active vertical levels.
+
+ Input: xr.Dataset (mesh file with 'depth_lev')
+ Output: xr.DataArray (2D field, 0 or 100)
+ """
+ if "depth_lev" not in data:
+ raise ValueError("Mesh file must contain 'depth_lev' for sftof computation")
+ depth_lev = data["depth_lev"]
+ result = xr.where(depth_lev > 0, 100.0, 0.0)
+ result.attrs = {"units": "%", "standard_name": "sea_area_fraction"}
+ result.name = "sftof"
+ return result
+
+
+def compute_thkcello_fx(data, rule):
+ """
+ Compute static ocean layer thickness from mesh depth bounds.
+
+ For z-coordinate models with fixed levels, thickness = diff(depth_bnds).
+ Returns a 1D array of layer thicknesses indexed by level.
+
+ Input: xr.Dataset (mesh file with 'depth_bnds')
+ Output: xr.DataArray (1D, per level)
+ """
+ if "depth_bnds" in data:
+ bnds = data["depth_bnds"].values
+ # depth_bnds has shape (nlevels+1,) — interfaces between layers
+ thickness = np.diff(bnds)
+ result = xr.DataArray(
+ thickness,
+ dims=["lev"],
+ attrs={"units": "m", "standard_name": "cell_thickness"},
+ )
+ else:
+ raise ValueError("Mesh file must contain 'depth_bnds' for thkcello computation")
+ result.name = "thkcello"
+ return result
+
+
+def compute_masscello_fx(data, rule):
+ """
+ Compute static ocean grid-cell mass per area.
+
+ For Boussinesq models: masscello = rho_0 * thkcello
+ where rho_0 is the reference density (default 1025 kg/m3).
+
+ Input: xr.Dataset (mesh file with 'depth_bnds')
+ Output: xr.DataArray (1D, per level, in kg/m2)
+ """
+ rho_0 = float(rule.get("reference_density", 1025.0))
+ if "depth_bnds" in data:
+ bnds = data["depth_bnds"].values
+ thickness = np.diff(bnds)
+ mass = rho_0 * thickness
+ result = xr.DataArray(
+ mass,
+ dims=["lev"],
+ attrs={
+ "units": "kg m-2",
+ "standard_name": "sea_water_mass_per_unit_area",
+ },
+ )
+ else:
+ raise ValueError("Mesh file must contain 'depth_bnds' for masscello computation")
+ result.name = "masscello"
+ return result
+
+
+# ============================================================
+# Sea ice steps
+# ============================================================
+
+
+def fraction_to_percent(data, rule):
+ """
+ Convert a fraction (0-1) to percentage (0-100).
+
+ Generic step — works for any variable stored as fraction
+ that CMIP expects as percentage (siconc, sftof, etc.).
+ """
+ result = data * 100.0
+ result.attrs = data.attrs.copy()
+ result.attrs["units"] = "%"
+ result.name = data.name
+ return result
+
+
+def compute_sitimefrac(data, rule):
+ """
+ Compute fraction of time steps with sea ice present.
+
+ From monthly sea ice concentration, sitimefrac is 1 where
+ siconc > 0, and 0 otherwise. For monthly data this is a
+ binary field (ice present that month or not).
+
+ For accurate sitimefrac, daily or sub-daily siconc is needed.
+ With monthly data this is an approximation.
+ """
+ result = xr.where(data > 0, 1.0, 0.0)
+ result.attrs = {
+ "units": "1",
+ "standard_name": "fraction_of_time_with_sea_ice_area_fraction_above_threshold",
+ "long_name": "Fraction of Time Steps with Sea Ice",
+ "processing_note": "Computed from monthly siconc; 1 where siconc>0, 0 otherwise",
+ }
+ result.name = "sitimefrac"
+ return result
+
+
+# ============================================================
+# Sea ice post-processing steps — computed from available output
+# ============================================================
+
+
+def compute_siflcondtop(data, rule):
+ """
+ Compute conductive heat flux at ice surface.
+
+ siflcondtop = k_ice * (T_base - T_surface) / h_ice
+
+ Positive downward (into the ice, i.e. when surface is colder
+ than base). T_base is the freezing point computed from SSS.
+
+ Primary input (data) is ist (ice surface temperature, K).
+ Rule attributes:
+ - sss_file: path to SSS file (for freezing point)
+ - sss_variable: variable name (default: 'sss')
+ - hice_file: path to h_ice file
+ - hice_variable: variable name (default: 'h_ice')
+ - k_ice: thermal conductivity of ice (default: 2.1656 W/m/K, from namelist.ice con=)
+ """
+ k_ice = float(rule.get("k_ice", 2.1656))
+
+ sss_file = rule.get("sss_file")
+ hice_file = rule.get("hice_file")
+ if sss_file is None or hice_file is None:
+ raise ValueError("Rule must specify 'sss_file' and 'hice_file'")
+
+ ds_sss = xr.open_dataset(sss_file)
+ sss = ds_sss[rule.get("sss_variable", "sss")]
+ ds_sss.close()
+
+ ds_hice = xr.open_dataset(hice_file)
+ h_ice = ds_hice[rule.get("hice_variable", "h_ice")]
+ ds_hice.close()
+
+ # Freezing point at ice base
+ t_base = -0.054 * sss + 273.15
+
+ # Avoid division by zero where ice is absent
+ h_safe = xr.where(h_ice > 0.01, h_ice, np.nan)
+
+ result = k_ice * (t_base - data) / h_safe
+ result.attrs = {
+ "units": "W m-2",
+ "standard_name": "sea_ice_surface_net_downward_conductive_heat_flux",
+ "long_name": "Net Conductive Heat Flux in Sea Ice at the Surface",
+ "processing_note": f"k_ice={k_ice}, T_base=freezing_point(SSS), T_surface=ist",
+ }
+ result.name = "siflcondtop"
+ return result
+
+
+def compute_sihc(data, rule):
+ """
+ Compute sea ice heat content per unit area.
+
+ sihc = rho_ice * h_ice * (c_ice * (T_mean - T_melt) - L_f)
+
+ where T_mean is approximated as average of surface and basal
+ temperature: (ist + T_freeze) / 2.
+
+ This is always negative (energy required to melt ice).
+
+ Primary input (data) is h_ice.
+ Rule attributes:
+ - ist_file: path to ice surface temperature file
+ - ist_variable: variable name (default: 'ist')
+ - sss_file: path to SSS file (for freezing point at base)
+ - sss_variable: variable name (default: 'sss')
+ - rho_ice: ice density (default: 910.0 kg/m3)
+ - c_ice: specific heat of ice (default: 2090.0 J/kg/K)
+ - L_f: latent heat of fusion (default: 334000.0 J/kg)
+ """
+ rho_ice = float(rule.get("rho_ice", 910.0))
+ c_ice = float(rule.get("c_ice", 2090.0))
+ L_f = float(rule.get("L_f", 334000.0))
+
+ ist_file = rule.get("ist_file")
+ sss_file = rule.get("sss_file")
+ if ist_file is None or sss_file is None:
+ raise ValueError("Rule must specify 'ist_file' and 'sss_file'")
+
+ ds_ist = xr.open_dataset(ist_file)
+ ist = ds_ist[rule.get("ist_variable", "ist")]
+ ds_ist.close()
+
+ ds_sss = xr.open_dataset(sss_file)
+ sss = ds_sss[rule.get("sss_variable", "sss")]
+ ds_sss.close()
+
+ # Freezing point at ice base
+ t_base = -0.054 * sss + 273.15
+ # Mean ice temperature (linear profile approximation)
+ t_mean = (ist + t_base) / 2.0
+ # Melting point in K
+ t_melt = 273.15
+
+ # Heat content: sensible + latent (latent dominates, result is negative)
+ result = rho_ice * data * (c_ice * (t_mean - t_melt) - L_f)
+ result.attrs = {
+ "units": "J m-2",
+ "standard_name": "integral_of_sea_ice_temperature_wrt_depth_expressed_as_heat_content",
+ "long_name": "Sea-Ice Heat Content",
+ "processing_note": f"rho_ice={rho_ice}, c_ice={c_ice}, L_f={L_f}, T_mean=(ist+T_freeze)/2",
+ }
+ result.name = "sihc"
+ return result
+
+
+def compute_sisnhc(data, rule):
+ """
+ Compute snow heat content per unit area on sea ice.
+
+ sisnhc ≈ rho_snow * h_snow * (c_snow * (T_snow - T_melt) - L_f)
+
+ Snow on sea ice is typically near 0°C, so T_snow ≈ T_melt and
+ the sensible term vanishes. The dominant term is latent heat:
+ sisnhc ≈ -rho_snow * L_f * h_snow (always negative).
+
+ Primary input (data) is h_snow.
+ Rule attributes:
+ - rho_snow: snow density (default: 330.0 kg/m3)
+ - L_f: latent heat of fusion (default: 334000.0 J/kg)
+ """
+ rho_snow = float(rule.get("rho_snow", 330.0))
+ L_f = float(rule.get("L_f", 334000.0))
+
+ # Dominant term: latent heat (sensible ≈ 0 since T_snow ≈ T_melt)
+ result = -rho_snow * L_f * data
+ result.attrs = {
+ "units": "J m-2",
+ "standard_name": "integral_of_snow_temperature_wrt_depth_expressed_as_heat_content",
+ "long_name": "Snow Heat Content",
+ "processing_note": f"sisnhc = -rho_snow*L_f*h_snow, rho_snow={rho_snow}, L_f={L_f}",
+ }
+ result.name = "sisnhc"
+ return result
+
+
+def compute_sisnhc_from_msnow(data, rule):
+ """
+ Compute daily snow heat content from m_snow and a_ice.
+
+ FESOM outputs h_snow only at monthly frequency. For daily sisnhc,
+ derive h_snow from daily m_snow (snow mass per area) and a_ice
+ (ice concentration):
+
+ h_snow = m_snow / (rho_snow * a_ice)
+ sisnhc = -rho_snow * L_f * h_snow = -L_f * m_snow / a_ice
+
+ Primary input (data) is m_snow (kg/m2).
+ Secondary input a_ice loaded via rule attributes.
+
+ Rule attributes:
+ - second_input_path: directory containing a_ice files
+ - second_input_pattern: glob pattern for a_ice files
+ - second_variable: variable name (default: auto-detect)
+ - rho_snow: snow density (default: 330.0 kg/m3, used only in note)
+ - L_f: latent heat of fusion (default: 334000.0 J/kg)
+ """
+ rho_snow = float(rule.get("rho_snow", 330.0))
+ L_f = float(rule.get("L_f", 334000.0))
+
+ a_ice = _load_secondary_mf(rule, "second_input_path", "second_input_pattern", "second_variable")
+
+ # h_snow = m_snow / (rho_snow * a_ice), then sisnhc = -rho_snow * L_f * h_snow
+ # Simplifies to: sisnhc = -L_f * m_snow / a_ice
+ # Protect against division by zero where a_ice == 0
+ a_ice_safe = a_ice.where(a_ice > 0, np.nan)
+ result = -L_f * data / a_ice_safe
+ result = result.fillna(0.0)
+
+ result.attrs = {
+ "units": "J m-2",
+ "standard_name": "integral_of_snow_temperature_wrt_depth_expressed_as_heat_content",
+ "long_name": "Snow Heat Content",
+ "processing_note": (
+ f"sisnhc = -L_f*m_snow/a_ice, rho_snow={rho_snow}, L_f={L_f}, " "derived from daily m_snow and a_ice"
+ ),
+ }
+ result.name = "sisnhc"
+ return result
+
+
+def compute_snd_from_msnow(data, rule):
+ """
+ Compute daily snow depth on sea ice from m_snow and a_ice.
+
+ FESOM outputs h_snow only at monthly frequency. For daily snd,
+ derive from daily m_snow (snow mass per area) and a_ice
+ (ice concentration):
+
+ snd = m_snow / a_ice
+
+ where m_snow is area-averaged snow mass [m water equiv] and a_ice
+ is ice concentration [0-1]. Result is snow depth over ice [m].
+
+ Primary input (data) is m_snow.
+ Secondary input a_ice loaded via rule attributes.
+
+ Rule attributes:
+ - second_input_path: directory containing a_ice files
+ - second_input_pattern: glob pattern for a_ice files
+ - second_variable: variable name (default: auto-detect)
+ """
+ a_ice = _load_secondary_mf(rule, "second_input_path", "second_input_pattern", "second_variable")
+
+ # snd = m_snow / a_ice (snow depth over ice-covered fraction)
+ # Protect against division by zero where a_ice == 0
+ a_ice_safe = a_ice.where(a_ice > 0, np.nan)
+ result = data / a_ice_safe
+ result = result.fillna(0.0)
+
+ result.attrs = {
+ "units": "m",
+ "standard_name": "surface_snow_thickness",
+ "long_name": "Snow Depth",
+ "processing_note": "snd = m_snow / a_ice, derived from daily m_snow and a_ice",
+ }
+ result.name = "snd"
+ return result
+
+
+def compute_sitempbot(data, rule):
+ """
+ Compute temperature at ice-ocean interface (freezing point).
+
+ T_freeze = -0.054 * SSS + 273.15 K (linear approximation).
+
+ Primary input (data) is SSS (sea surface salinity, in psu).
+ Returns temperature in K.
+ """
+ result = -0.054 * data + 273.15
+ result.attrs = {
+ "units": "K",
+ "standard_name": "sea_ice_basal_temperature",
+ "long_name": "Temperature at Ice-Ocean Interface",
+ "processing_note": "Computed as freezing point: T_f = -0.054 * SSS + 273.15",
+ }
+ result.name = "sitempbot"
+ return result
+
+
+def compute_sifb(data, rule):
+ """
+ Compute sea ice freeboard from ice and snow thickness.
+
+ freeboard = h_ice * (1 - rho_ice/rho_water) - h_snow * rho_snow/rho_water
+
+ Primary input (data) is h_ice.
+ Rule attributes:
+ - snow_file: path to h_snow file
+ - snow_variable: variable name (default: 'h_snow')
+ - rho_ice: ice density (default: 910.0 kg/m3)
+ - rho_snow: snow density (default: 330.0 kg/m3)
+ - rho_water: seawater density (default: 1025.0 kg/m3)
+ """
+ rho_ice = float(rule.get("rho_ice", 910.0))
+ rho_snow = float(rule.get("rho_snow", 330.0))
+ rho_water = float(rule.get("rho_water", 1025.0))
+
+ snow_file = rule.get("snow_file")
+ if snow_file is None:
+ raise ValueError("Rule must specify 'snow_file' for compute_sifb")
+
+ ds = xr.open_dataset(snow_file)
+ snow_var = rule.get("snow_variable", "h_snow")
+ h_snow = ds[snow_var]
+ ds.close()
+
+ result = data * (1.0 - rho_ice / rho_water) - h_snow * rho_snow / rho_water
+ result.attrs = {
+ "units": "m",
+ "standard_name": "sea_ice_freeboard",
+ "long_name": "Sea-Ice Freeboard",
+ "processing_note": f"freeboard = h_ice*(1-{rho_ice}/{rho_water}) - h_snow*{rho_snow}/{rho_water}",
+ }
+ result.name = "sifb"
+ return result
+
+
+def compute_constant_field(data, rule):
+ """
+ Replace data values with a constant, preserving shape and coordinates.
+
+ Used for fields that are constant in the model configuration,
+ e.g. drag coefficients.
+
+ Rule attributes:
+ - constant_value: float (required)
+ - constant_units: str (optional)
+ """
+ value = float(rule.get("constant_value"))
+ if value is None:
+ raise ValueError("Rule must specify 'constant_value'")
+ result = xr.full_like(data, value)
+ result.attrs = data.attrs.copy()
+ constant_units = rule.get("constant_units")
+ if constant_units:
+ result.attrs["units"] = constant_units
+ result.name = data.name
+ return result
+
+
+def integrate_over_hemisphere(data, rule):
+ """
+ Area-weighted hemisphere integral of any 2D field.
+
+ result = sum(data * cell_area) for nodes in the selected hemisphere.
+
+ Generic step — works for any variable that needs hemisphere
+ integration: snow mass, ice volume, ice area, etc.
+
+ Rule attributes:
+ - grid_file: path to mesh file (for cell_area and lat)
+ - hemisphere: 'N' or 'S'
+ """
+ grid_file = rule.get("grid_file")
+ hemisphere = rule.get("hemisphere", "N")
+ if grid_file is None:
+ raise ValueError("Rule must specify 'grid_file' for integrate_over_hemisphere")
+
+ mesh = xr.open_dataset(grid_file)
+
+ # Get cell area
+ if "cell_area" in mesh:
+ cell_area = mesh["cell_area"]
+ elif "cluster_area" in mesh:
+ cell_area = mesh["cluster_area"]
+ else:
+ raise ValueError("Mesh must contain 'cell_area' or 'cluster_area'")
+
+ # Get latitude for hemisphere selection
+ if "lat" in mesh:
+ lat = mesh["lat"]
+ elif "latitude" in mesh:
+ lat = mesh["latitude"]
+ else:
+ raise ValueError("Mesh must contain 'lat' or 'latitude'")
+ mesh.close()
+
+ # Select hemisphere
+ if hemisphere.upper() == "N":
+ mask = lat >= 0
+ else:
+ mask = lat < 0
+
+ # Integrate: sum(data * cell_area) over hemisphere nodes
+ horizontal_dim = None
+ for dim in ["nod2", "ncells", "node"]:
+ if dim in data.dims:
+ horizontal_dim = dim
+ break
+ if horizontal_dim is None:
+ raise ValueError(f"Cannot identify horizontal dim. Available: {list(data.dims)}")
+
+ result = (data * cell_area * mask).sum(dim=horizontal_dim)
+ result.attrs = data.attrs.copy()
+ result.name = data.name
+ return result
+
+
+# ============================================================
+# Melt pond steps
+# ============================================================
+
+
+def compute_simpeffconc(data, rule):
+ """
+ Compute effective (radiatively-active) melt pond area fraction.
+
+ Effective pond fraction = pond area not covered by a refrozen lid.
+ Where the lid fully covers the pond depth, the pond is not
+ radiatively active.
+
+ simpeffconc = apnd * max(0, 1 - ipnd/hpnd) * 100
+
+ Primary input (data) is apnd (melt pond area fraction, 0-1).
+ Rule attributes:
+ - ipnd_file: path to ice lid thickness file
+ - ipnd_variable: variable name (default: 'ipnd')
+ - hpnd_file: path to pond depth file
+ - hpnd_variable: variable name (default: 'hpnd')
+ """
+ ipnd_file = rule.get("ipnd_file")
+ hpnd_file = rule.get("hpnd_file")
+ if ipnd_file is None or hpnd_file is None:
+ raise ValueError("Rule must specify 'ipnd_file' and 'hpnd_file'")
+
+ ds_ipnd = xr.open_dataset(ipnd_file)
+ ipnd = ds_ipnd[rule.get("ipnd_variable", "ipnd")]
+ ds_ipnd.close()
+
+ ds_hpnd = xr.open_dataset(hpnd_file)
+ hpnd = ds_hpnd[rule.get("hpnd_variable", "hpnd")]
+ ds_hpnd.close()
+
+ # Lid fraction: ipnd/hpnd, clamped to [0, 1]
+ # Where hpnd is 0, there's no pond so effective fraction is 0
+ hpnd_safe = xr.where(hpnd > 0, hpnd, np.nan)
+ lid_fraction = np.clip(ipnd / hpnd_safe, 0, 1).fillna(1.0)
+
+ # Effective fraction = open pond area (not lidded), convert to %
+ result = data * (1.0 - lid_fraction) * 100.0
+ result.attrs = {
+ "units": "%",
+ "standard_name": "area_fraction",
+ "long_name": "Fraction of Sea Ice Covered by Effective Melt Pond",
+ "processing_note": "simpeffconc = apnd * (1 - ipnd/hpnd) * 100",
+ }
+ result.name = "simpeffconc"
+ return result
+
+
+# ============================================================
+# Generic scaling step — reusable across models and realms
+# ============================================================
+
+
+def scale_by_constant(data, rule):
+ """
+ Multiply data by a constant factor from rule.scale_factor.
+
+ Generic step for unit conversions that are a simple multiplication,
+ e.g. m/s → kg m-2 s-1 (multiply by density).
+
+ Rule attributes:
+ - scale_factor: float, the multiplicative factor (required)
+ - scaled_units: str, units after scaling (optional, updates attrs)
+ """
+ factor = float(rule.get("scale_factor"))
+ if factor is None:
+ raise ValueError("Rule must specify 'scale_factor' for scale_by_constant step")
+ result = data * factor
+ result.attrs = data.attrs.copy()
+ scaled_units = rule.get("scaled_units")
+ if scaled_units:
+ result.attrs["units"] = scaled_units
+ result.name = data.name
+ return result
+
+
+# ============================================================
+# Generic compute steps — reusable across models and realms
+# ============================================================
+
+
+def compute_square(data, rule):
+ """
+ Square the input field.
+
+ Useful for variance-related diagnostics (tossq, sossq, zossq, mlotstsq).
+
+ Rule attributes (optional):
+ - squared_units: str, units after squaring (e.g. "degC2", "m2")
+ """
+ result = data * data
+ result.attrs = data.attrs.copy()
+ squared_units = rule.get("squared_units")
+ if squared_units:
+ result.attrs["units"] = squared_units
+ result.name = data.name
+ return result
+
+
+def extract_bottom(data, rule):
+ """
+ Extract the bottom-of-column value from a 3D field.
+
+ Uses the mesh bottom index to select the deepest valid value at each
+ horizontal point. Produces a 2D (+ time) field from a 3D input.
+
+ Rule attributes:
+ - grid_file: path to mesh file containing bottom index info
+ - vertical_dim: name of vertical dimension (auto-detected if not given)
+ """
+ grid_file = rule.get("grid_file")
+ if grid_file is None:
+ raise ValueError("Rule must specify 'grid_file' for extract_bottom step")
+
+ mesh = xr.open_dataset(grid_file)
+
+ # Auto-detect vertical dimension
+ vertical_dim = rule.get("vertical_dim")
+ if vertical_dim is None:
+ for dim in ["nz1", "depth", "lev", "nz"]:
+ if dim in data.dims:
+ vertical_dim = dim
+ break
+ if vertical_dim is None:
+ raise ValueError(f"Cannot find vertical dimension in {list(data.dims)}")
+
+ # Get number of levels per node from mesh
+ # FESOM meshes typically have 'nlevels' or 'nlevels_nod2D' (1-based count)
+ if "nlevels_nod2D" in mesh:
+ bottom_idx = mesh["nlevels_nod2D"].values - 2 # 0-based, last valid midpoint
+ elif "nlevels" in mesh:
+ bottom_idx = mesh["nlevels"].values - 2
+ else:
+ mesh.close()
+ raise ValueError("Mesh file must contain 'nlevels_nod2D' or 'nlevels'")
+ mesh.close()
+
+ # Clamp to valid range
+ nz = data.sizes[vertical_dim]
+ bottom_idx = np.clip(bottom_idx, 0, nz - 1)
+
+ # Extract bottom values using advanced indexing
+ # Convert bottom_idx to DataArray for .isel compatibility
+ horizontal_dim = next(d for d in data.dims if d not in [vertical_dim, "time"])
+ idx_da = xr.DataArray(bottom_idx, dims=[horizontal_dim])
+ result = data.isel({vertical_dim: idx_da})
+
+ result.attrs = data.attrs.copy()
+ result.name = data.name
+ return result
+
+
+def extract_surface(data, rule):
+ """
+ Extract the surface (top) value from a 3D field.
+
+ Selects index 0 along the vertical dimension to produce a
+ 2D (+ time) field from a 3D input.
+
+ Rule attributes (optional):
+ - vertical_dim: name of vertical dimension (auto-detected if not given)
+ """
+ vertical_dim = rule.get("vertical_dim")
+ if vertical_dim is None:
+ for dim in ["nz1", "depth", "lev", "nz"]:
+ if dim in data.dims:
+ vertical_dim = dim
+ break
+ if vertical_dim is None:
+ raise ValueError(f"Cannot find vertical dimension in {list(data.dims)}")
+
+ result = data.isel({vertical_dim: 0})
+ result.attrs = data.attrs.copy()
+ result.name = data.name
+ return result
+
+
+def compute_surface_pressure(data, rule):
+ """
+ Compute sea water pressure at sea surface from SSH.
+
+ pso = rho_0 * g * ssh [Pa]
+
+ For a Boussinesq model, surface pressure is the weight of the
+ water column above the geoid approximated by rho_0 * g * ssh.
+
+ Rule attributes (optional):
+ - reference_density: float (default 1025.0 kg/m3)
+ - gravity: float (default 9.80665 m/s2)
+ """
+ rho_0 = float(rule.get("reference_density", 1025.0))
+ g = float(rule.get("gravity", 9.80665))
+ result = rho_0 * g * data
+ result.attrs = data.attrs.copy()
+ result.attrs["units"] = "Pa"
+ result.name = data.name
+ return result
+
+
+# ============================================================
+# Sea ice multi-variable compute steps
+# These load a second variable from an auxiliary file specified
+# in rule attributes.
+# ============================================================
+
+
+def compute_sispeed(data, rule):
+ """
+ Compute sea ice speed from X and Y velocity components.
+
+ sispeed = sqrt(uice² + vice²)
+
+ Primary input (data) is one velocity component.
+ The other component is loaded from rule.second_input_file.
+
+ Rule attributes:
+ - second_input_file: path to the other velocity component file
+ - second_variable: variable name in that file (default: auto-detect)
+ """
+ second_file = rule.get("second_input_file")
+ if second_file is None:
+ raise ValueError("Rule must specify 'second_input_file' for compute_sispeed")
+
+ ds2 = xr.open_dataset(second_file)
+ second_var = rule.get("second_variable")
+ if second_var and second_var in ds2:
+ v2 = ds2[second_var]
+ else:
+ # Auto-detect: take first non-coordinate variable
+ data_vars = [v for v in ds2.data_vars if v not in ds2.coords]
+ v2 = ds2[data_vars[0]]
+ ds2.close()
+
+ result = np.sqrt(data**2 + v2**2)
+ result.attrs = {
+ "units": "m s-1",
+ "standard_name": "sea_ice_speed",
+ "long_name": "Sea-Ice Speed",
+ }
+ result.name = "sispeed"
+ return result
+
+
+def compute_ice_mass_transport(data, rule):
+ """
+ Compute sea ice mass transport: velocity × mass per area.
+
+ ice_mass_transport = velocity_component × m_ice
+
+ Rule attributes:
+ - mice_file: path to m_ice file
+ - mice_variable: variable name (default: 'm_ice')
+ """
+ mice_file = rule.get("mice_file")
+ if mice_file is None:
+ raise ValueError("Rule must specify 'mice_file' for compute_ice_mass_transport")
+
+ ds = xr.open_dataset(mice_file)
+ mice_var = rule.get("mice_variable", "m_ice")
+ m_ice = ds[mice_var]
+ ds.close()
+
+ result = data * m_ice
+ result.attrs = data.attrs.copy()
+ result.attrs["units"] = "kg s-1"
+ result.name = data.name
+ return result
+
+
+def compute_sistressave(data, rule):
+ """
+ Compute average normal sea ice stress from mEVP stress tensor.
+
+ sistressave = (sigma_11 + sigma_22) / 2
+
+ Primary input (data) is sgm11 dataset.
+ Rule attributes:
+ - sgm22_file: path to sgm22 file
+ - sgm22_variable: variable name (default: 'sgm22')
+ """
+ sgm22_file = rule.get("sgm22_file")
+ if sgm22_file is None:
+ raise ValueError("Rule must specify 'sgm22_file' for compute_sistressave")
+
+ ds = xr.open_dataset(sgm22_file)
+ sgm22_var = rule.get("sgm22_variable", "sgm22")
+ sgm22 = ds[sgm22_var]
+ ds.close()
+
+ result = (data + sgm22) / 2.0
+ result.attrs = {
+ "units": "N m-1",
+ "standard_name": "average_normal_stress_in_sea_ice",
+ "long_name": "Average Normal Stress in Sea Ice",
+ }
+ result.name = "sistressave"
+ return result
+
+
+def compute_sistressmax(data, rule):
+ """
+ Compute maximum shear stress from mEVP stress tensor.
+
+ sistressmax = sqrt(((sigma_11 - sigma_22) / 2)² + sigma_12²)
+
+ Primary input (data) is sgm11 dataset.
+ Rule attributes:
+ - sgm22_file: path to sgm22 file
+ - sgm12_file: path to sgm12 file
+ """
+ sgm22_file = rule.get("sgm22_file")
+ sgm12_file = rule.get("sgm12_file")
+ if sgm22_file is None or sgm12_file is None:
+ raise ValueError("Rule must specify 'sgm22_file' and 'sgm12_file'")
+
+ ds22 = xr.open_dataset(sgm22_file)
+ sgm22 = ds22[rule.get("sgm22_variable", "sgm22")]
+ ds22.close()
+
+ ds12 = xr.open_dataset(sgm12_file)
+ sgm12 = ds12[rule.get("sgm12_variable", "sgm12")]
+ ds12.close()
+
+ result = np.sqrt(((data - sgm22) / 2.0) ** 2 + sgm12**2)
+ result.attrs = {
+ "units": "N m-1",
+ "standard_name": "maximum_shear_stress_in_sea_ice",
+ "long_name": "Maximum Shear Stress in Sea Ice",
+ }
+ result.name = "sistressmax"
+ return result
+
+
+# ============================================================
+# Ocean density and transport steps
+# These load auxiliary data (mesh, other variables) from paths
+# specified in rule attributes, since pycmor pipelines pass
+# a single data object through steps.
+# ============================================================
+
+
+def compute_density(data, rule):
+ """
+ Compute in-situ sea water density from temperature and salinity
+ using gsw (TEOS-10).
+
+ Expects data to be an xr.Dataset containing both temperature and
+ salinity variables. Variable names read from rule config:
+ - rule.temp_variable (default: 'temp')
+ - rule.salt_variable (default: 'salt')
+
+ Returns an xr.DataArray of density (kg/m3).
+ """
+ import gsw
+
+ temp_var = rule.get("temp_variable", "temp")
+ salt_var = rule.get("salt_variable", "salt")
+
+ if isinstance(data, xr.Dataset):
+ temp = data[temp_var]
+ salt = data[salt_var]
+ else:
+ raise ValueError("compute_density expects an xr.Dataset with temp and salt variables")
+
+ # Detect vertical dimension for pressure calculation
+ vertical_dim = None
+ for dim in ["nz1", "nz", "depth", "lev"]:
+ if dim in data.dims:
+ vertical_dim = dim
+ break
+
+ if vertical_dim is not None and vertical_dim in data.coords:
+ # Use depth coordinates to compute pressure
+ depth_vals = data.coords[vertical_dim]
+ # gsw needs pressure in dbar; approximate: pressure ≈ depth (in m) for ocean
+ pressure = xr.DataArray(depth_vals.values, dims=[vertical_dim])
+ else:
+ # Approximate: use 0 dbar (surface) — density won't be pressure-corrected
+ logger.warning("No vertical coordinate found, computing density at surface pressure")
+ pressure = 0.0
+
+ # TEOS-10: convert practical salinity to absolute salinity (approximate)
+ # and potential temperature to conservative temperature
+ # For Boussinesq models this is a reasonable approximation
+ SA = gsw.SA_from_SP(salt, pressure, 0, 0) # lon=0, lat=0 approximation
+ CT = gsw.CT_from_pt(SA, temp)
+ rho = gsw.rho(SA, CT, pressure)
+
+ result = xr.DataArray(rho, dims=temp.dims, coords=temp.coords)
+ result.name = "rho"
+ result.attrs = {"units": "kg m-3", "standard_name": "sea_water_density"}
+ return result
+
+
+def compute_mass_transport(data, rule):
+ """
+ Compute ocean mass transport from velocity.
+
+ mass_transport = velocity * density * cell_thickness * cell_width
+
+ For FESOM unstructured grid, we approximate:
+ umo = u * rho_0 * dz * dx (but dx not well-defined on unstructured grids)
+
+ Simplified Boussinesq approach used by most CMIP models:
+ umo = u * rho_0 * cell_area_vertical_face
+
+ Since FESOM doesn't output cell face areas, we use the simpler:
+ umo = u * rho_0 * dz
+
+ where dz is layer thickness and rho_0 is reference density.
+ Units: m/s * kg/m3 * m = kg/(m*s) — needs scaling by cell width for kg/s.
+
+ For unstructured grids, CMIP accepts transport per unit width (kg/m/s)
+ or the model can report on native grid with volcello as cell_measures.
+
+ Rule attributes:
+ - reference_density: Boussinesq rho_0 (default 1025.0 kg/m3)
+ - transport_component: 'x', 'y', or 'z' (for metadata)
+ """
+ rho_0 = float(rule.get("reference_density", 1025.0))
+ grid_file = rule.get("grid_file")
+
+ # data is a DataArray (velocity field, already extracted by get_variable)
+ if not isinstance(data, xr.DataArray):
+ raise ValueError("compute_mass_transport expects velocity as xr.DataArray")
+
+ # Get layer thickness from mesh
+ mesh = xr.open_dataset(grid_file)
+ if "depth_bnds" in mesh:
+ depth_bnds = mesh["depth_bnds"].values
+ dz = np.diff(depth_bnds)
+ else:
+ raise ValueError("Mesh file must contain 'depth_bnds' for layer thickness")
+ mesh.close()
+
+ # Detect vertical dimension
+ vertical_dim = None
+ for dim in ["nz1", "nz", "depth", "lev"]:
+ if dim in data.dims:
+ vertical_dim = dim
+ break
+
+ if vertical_dim is None:
+ raise ValueError(f"No vertical dimension found in data. Dims: {list(data.dims)}")
+
+ # Build thickness array matching the vertical dimension
+ nz_data = data.sizes[vertical_dim]
+ if len(dz) >= nz_data:
+ thickness = xr.DataArray(dz[:nz_data], dims=[vertical_dim])
+ else:
+ raise ValueError(f"Mesh has {len(dz)} levels but data has {nz_data}")
+
+ # mass transport = velocity * rho_0 * layer_thickness
+ # Units: m/s * kg/m3 * m = kg/(m2*s) ... this is transport per unit width
+ # For FESOM unstructured grid, this is the standard approach
+ transport = data * rho_0 * thickness
+
+ transport.name = data.name
+ component = rule.get("transport_component", "")
+ transport.attrs = {
+ "units": "kg s-1",
+ "processing_note": f"Computed as velocity * rho_0({rho_0}) * dz. " f"Transport per grid cell {component}-face.",
+ }
+ return transport
+
+
+def compute_zostoga(data, rule):
+ """
+ Compute global average thermosteric sea level change.
+
+ zostoga = (1/A_ocean) * integral( -alpha * delta_T * dz * dA )
+
+ where alpha is thermal expansion coefficient, delta_T is temperature
+ anomaly from reference, dz is layer thickness, dA is cell area.
+
+ Simplified approach: compute steric height anomaly from temperature
+ and salinity relative to a reference state.
+
+ Rule attributes:
+ - grid_file: path to mesh file (for cell_area and depth_bnds)
+ - salt_file: path to salinity file (optional, for full steric)
+ - reference_density: rho_0 (default 1025.0)
+ """
+ import gsw
+
+ rho_0 = float(rule.get("reference_density", 1025.0))
+ grid_file = rule.get("grid_file")
+
+ # data is a DataArray of temperature (from get_variable step)
+ if not isinstance(data, xr.DataArray):
+ raise ValueError("compute_zostoga expects temperature as xr.DataArray")
+
+ # Load mesh for cell areas and depth info
+ mesh = xr.open_dataset(grid_file)
+ cell_area = mesh["cell_area"].values if "cell_area" in mesh else None
+ depth_bnds = mesh["depth_bnds"].values if "depth_bnds" in mesh else None
+ mesh.close()
+
+ if cell_area is None or depth_bnds is None:
+ raise ValueError("Mesh must contain 'cell_area' and 'depth_bnds'")
+
+ dz = np.diff(depth_bnds)
+
+ # Detect dimensions
+ vertical_dim = None
+ for dim in ["nz1", "nz", "depth", "lev"]:
+ if dim in data.dims:
+ vertical_dim = dim
+ break
+ horizontal_dim = None
+ for dim in ["nod2", "ncells", "node"]:
+ if dim in data.dims:
+ horizontal_dim = dim
+ break
+
+ if vertical_dim is None or horizontal_dim is None:
+ raise ValueError(f"Cannot identify dims. Available: {list(data.dims)}")
+
+ # Load salinity if available for full steric computation
+ salt_file = rule.get("salt_file")
+ if salt_file:
+ salt_ds = xr.open_dataset(salt_file)
+ salt_var = rule.get("salt_variable", "salt")
+ salt = salt_ds[salt_var]
+ else:
+ # Assume constant salinity of 35 psu for thermosteric-only
+ salt = xr.full_like(data, 35.0)
+ logger.warning("No salt_file specified, using constant S=35 for thermosteric computation")
+
+ # Build thickness and area arrays
+ nz = data.sizes[vertical_dim]
+ thickness = xr.DataArray(dz[:nz], dims=[vertical_dim])
+ area = xr.DataArray(cell_area, dims=[horizontal_dim])
+
+ # Compute pressure from depth
+ pressure = xr.DataArray(depth_bnds[:nz], dims=[vertical_dim])
+
+ # Reference state: time-mean temperature (or use first timestep)
+ temp_ref = data.mean(dim="time") if "time" in data.dims else data
+
+ # Compute density for actual and reference states
+ SA = gsw.SA_from_SP(salt, pressure, 0, 0)
+ CT = gsw.CT_from_pt(SA, data)
+ CT_ref = gsw.CT_from_pt(SA, temp_ref)
+
+ rho_actual = gsw.rho(SA, CT, pressure)
+ rho_ref = gsw.rho(SA, CT_ref, pressure)
+
+ # Steric height anomaly per column:
+ # delta_eta = -1/rho_0 * integral((rho - rho_ref) * dz)
+ delta_rho = rho_actual - rho_ref
+ steric_height = (-1.0 / rho_0) * (delta_rho * thickness).sum(dim=vertical_dim)
+
+ # Global area-weighted mean
+ total_area = area.sum()
+ zostoga = (steric_height * area).sum(dim=horizontal_dim) / total_area
+
+ zostoga.name = "zostoga"
+ zostoga.attrs = {
+ "units": "m",
+ "standard_name": "global_average_thermosteric_sea_level_change",
+ "long_name": "Global Average Thermosteric Sea Level Change",
+ "processing_note": f"Computed from temperature anomaly relative to time-mean. rho_0={rho_0}",
+ }
+ return zostoga
+
+
+# ============================================================
+# Vertical integration step
+# ============================================================
+
+
+def vertical_integrate(
+ data: xr.DataArray,
+ rule,
+ thickness_var: Optional[str] = None,
+ vertical_dim: Optional[str] = None,
+ update_attrs: bool = True,
+) -> xr.DataArray:
+ """
+ Vertically integrate a 3D field over depth/pressure.
+
+ General-purpose vertical integration for any 3D ocean/atmosphere variable.
+ Computes weighted sum over vertical dimension using layer thickness.
+
+ Parameters
+ ----------
+ data : xr.DataArray
+ 3D field to integrate (e.g., lon, lat, depth, time)
+ rule : Rule
+ Rule object containing processing parameters. Can specify:
+ - thickness_var: Name of thickness coordinate/variable
+ - vertical_dim: Name of vertical dimension to integrate over
+ - integration_attrs: Dict of attributes to set on result
+ vertical_dim : str, optional
+ Name of vertical dimension. If None, auto-detect from common names.
+ thickness_var : str, optional
+ Name of thickness variable/coordinate. If None, auto-detect.
+ update_attrs : bool, default True
+ Whether to update attributes with integration metadata
+
+ Returns
+ -------
+ xr.DataArray
+ Vertically integrated field (2D or 3D if time dimension exists)
+
+ Notes
+ -----
+ Auto-detects vertical dimension from common names:
+ - Ocean: 'depth', 'lev', 'nz1', 'nod3D_below_nod2D', 'nz'
+ - Atmosphere: 'plev', 'level', 'height'
+
+ Thickness detection priority:
+ 1. User-specified thickness_var
+ 2. Rule-specified thickness coordinate
+ 3. Dimension bounds (e.g., depth_bnds)
+ 4. Standard thickness variables (thkcello, dz, etc.)
+ 5. Coordinate differences (fallback)
+ """
+ # Get parameters from rule if available
+ thickness_var = thickness_var or rule.get("thickness_var", None)
+ vertical_dim = vertical_dim or rule.get("vertical_dim", None)
+ integration_attrs = rule.get("integration_attrs", {})
+
+ # Identify the vertical dimension
+ if vertical_dim is None:
+ common_vertical_dims = [
+ "depth",
+ "lev",
+ "plev",
+ "level",
+ "height",
+ "nz1",
+ "nod3D_below_nod2D",
+ "nz",
+ "pressure",
+ ]
+ for dim in common_vertical_dims:
+ if dim in data.dims:
+ vertical_dim = dim
+ logger.info(f"Auto-detected vertical dimension: {vertical_dim}")
+ break
+
+ if vertical_dim is None or vertical_dim not in data.dims:
+ raise ValueError(
+ f"Could not identify vertical dimension. "
+ f"Available dims: {list(data.dims)}. "
+ f"Specify 'vertical_dim' in rule or function argument."
+ )
+
+ # Get layer thickness
+ thickness = None
+
+ # Priority 1: User-specified thickness variable
+ if thickness_var:
+ if thickness_var in data.coords:
+ thickness = data.coords[thickness_var]
+ logger.info(f"Using thickness from coordinate: {thickness_var}")
+ elif thickness_var in data.attrs:
+ logger.warning(f"Thickness variable {thickness_var} in attrs but not coords")
+
+ # Priority 2: Bounds-based thickness
+ if thickness is None:
+ for bounds_suffix in ["_bnds", "_bounds"]:
+ bounds_name = f"{vertical_dim}{bounds_suffix}"
+ if bounds_name in data.coords:
+ bounds = data.coords[bounds_name]
+ thickness = abs(bounds[..., 1] - bounds[..., 0])
+ logger.info(f"Computing thickness from bounds: {bounds_name}")
+ break
+
+ # Priority 3: Standard thickness variables
+ if thickness is None:
+ thickness_candidates = ["thkcello", "dz", "thickness", "layer_thickness"]
+ for var in thickness_candidates:
+ if var in data.coords:
+ thickness = data.coords[var]
+ logger.info(f"Using standard thickness variable: {var}")
+ break
+
+ # Priority 4: Coordinate differences (fallback)
+ if thickness is None:
+ import numpy as np
+
+ logger.warning(
+ f"No thickness information found for {vertical_dim}. "
+ f"Computing from coordinate differences (may be inaccurate for irregular grids)."
+ )
+ coord_vals = data.coords[vertical_dim].values
+ diffs = np.abs(np.diff(coord_vals))
+ # Pad last element to match original dimension size
+ thickness_vals = np.append(diffs, diffs[-1])
+ thickness = xr.DataArray(thickness_vals, dims=[vertical_dim])
+
+ # Perform vertical integration: (data * thickness) summed over vertical dimension
+ integrated = (data * thickness).sum(dim=vertical_dim, keep_attrs=True)
+
+ # Preserve the variable name
+ integrated.name = data.name
+
+ # Update attributes
+ if update_attrs:
+ # Preserve original attributes
+ for key, value in data.attrs.items():
+ if key not in ["long_name", "standard_name", "units", "cell_methods"]:
+ integrated.attrs[key] = value
+
+ # Add/update integration-specific attributes
+ integrated.attrs["cell_methods"] = (
+ f"{vertical_dim}: sum " + data.attrs.get("cell_methods", "").replace(f"{vertical_dim}: mean", "").strip()
+ )
+
+ # Apply custom attributes from rule if provided
+ for key, value in integration_attrs.items():
+ integrated.attrs[key] = value
+
+ # Add processing note if not present
+ if "processing_note" not in integrated.attrs:
+ integrated.attrs["processing_note"] = f"Vertically integrated over {vertical_dim} dimension"
+
+ return integrated
+
+
+# ============================================================
+# Volume cell steps (volcello)
+# ============================================================
+
+
+def compute_volcello_fx(data, rule):
+ """
+ Compute static ocean grid-cell volume from mesh geometry.
+
+ volcello = cell_area * layer_thickness
+
+ Input (data) is loaded from the grid/mesh file (via load_gridfile step).
+ Expects the mesh Dataset to contain cell_area (or cluster_area)
+ and depth_bnds for layer thickness computation.
+
+ Rule attributes:
+ - (none required beyond grid_file already used by load_gridfile)
+ """
+ if "cell_area" in data:
+ cell_area = data["cell_area"]
+ elif "cluster_area" in data:
+ cell_area = data["cluster_area"]
+ else:
+ raise ValueError("Mesh must contain 'cell_area' or 'cluster_area'")
+
+ if "depth_bnds" not in data:
+ raise ValueError("Mesh must contain 'depth_bnds' for layer thickness")
+
+ bnds = data["depth_bnds"].values
+ thickness = np.abs(np.diff(bnds, axis=-1)).squeeze()
+ dz = xr.DataArray(thickness, dims=["nz1"])
+
+ result = cell_area * dz
+ result.attrs = {"units": "m3", "standard_name": "ocean_volume", "long_name": "Ocean Grid-Cell Volume"}
+ result.name = "volcello"
+ return result
+
+
+def compute_volcello_time(data, rule):
+ """
+ Compute time-varying ocean grid-cell volume from layer thickness.
+
+ volcello = hnode * cell_area
+
+ Input (data) is hnode (time-varying layer thickness per node per level).
+ cell_area is loaded from the mesh file.
+
+ Rule attributes:
+ - grid_file: path to mesh file (for cell_area)
+ """
+ grid_file = rule.get("grid_file")
+ if grid_file is None:
+ raise ValueError("Rule must specify 'grid_file' for compute_volcello_time")
+
+ mesh = xr.open_dataset(grid_file)
+ if "cell_area" in mesh:
+ cell_area = mesh["cell_area"]
+ elif "cluster_area" in mesh:
+ cell_area = mesh["cluster_area"]
+ else:
+ mesh.close()
+ raise ValueError("Mesh must contain 'cell_area' or 'cluster_area'")
+ mesh.close()
+
+ result = data * cell_area
+ result.attrs = data.attrs.copy()
+ result.attrs["units"] = "m3"
+ result.attrs["standard_name"] = "ocean_volume"
+ result.attrs["long_name"] = "Ocean Grid-Cell Volume"
+ result.name = data.name
+ return result
+
+
+# ============================================================
+# Atmosphere derived-variable steps
+# These compute CMOR variables that require combining two or
+# more IFS output fields (e.g. wind speed from u/v components,
+# humidity from dewpoint + temperature/pressure).
+#
+# Secondary inputs are loaded via glob patterns specified in
+# rule attributes, using xr.open_mfdataset for multi-file
+# (yearly split) atmosphere output.
+# ============================================================
+
+
+def _load_secondary_mf(rule, path_key, pattern_key, variable_key):
+ """Load a secondary input variable from a glob pattern of files.
+
+ Parameters
+ ----------
+ rule : Rule
+ The pycmor rule object.
+ path_key : str
+ Rule attribute name for the directory path.
+ pattern_key : str
+ Rule attribute name for the file glob pattern.
+ variable_key : str
+ Rule attribute name for the variable name inside the files.
+
+ Returns
+ -------
+ xr.DataArray
+ """
+ path = rule.get(path_key)
+ pattern = rule.get(pattern_key)
+ if path is None or pattern is None:
+ raise ValueError(f"Rule must specify '{path_key}' and '{pattern_key}'")
+ files = sorted(_glob.glob(_os.path.join(path, pattern)))
+ if not files:
+ raise FileNotFoundError(f"No files matching {_os.path.join(path, pattern)}")
+ ds = xr.open_mfdataset(files)
+ var_name = rule.get(variable_key)
+ if var_name and var_name in ds:
+ result = ds[var_name]
+ else:
+ data_vars = [v for v in ds.data_vars if v not in ds.coords]
+ result = ds[data_vars[0]]
+ return result
+
+
+def compute_sfcwind(data, rule):
+ """
+ Compute near-surface wind speed from U and V components.
+
+ sfcWind = sqrt(10u² + 10v²)
+
+ Primary input (data) is 10u (eastward 10m wind).
+ The V component is loaded from rule attributes.
+
+ Rule attributes:
+ - second_input_path: directory containing V-component files
+ - second_input_pattern: glob pattern for V-component files
+ - second_variable: variable name in V files (default: auto-detect)
+ """
+ v10 = _load_secondary_mf(rule, "second_input_path", "second_input_pattern", "second_variable")
+ result = np.sqrt(data**2 + v10**2)
+ result.attrs = {
+ "units": "m s-1",
+ "standard_name": "wind_speed",
+ "long_name": "Near-Surface Wind Speed",
+ }
+ result.name = "sfcWind"
+ return result
+
+
+def compute_hurs(data, rule):
+ """
+ Compute near-surface relative humidity from temperature and dewpoint.
+
+ Uses the Magnus formula:
+ RH = 100 * exp(b*Td/(c+Td)) / exp(b*T/(c+T))
+
+ where T and Td are in Celsius, b = 17.625, c = 243.04.
+
+ Primary input (data) is 2t (2m temperature, K).
+ Dewpoint is loaded from rule attributes.
+
+ Rule attributes:
+ - second_input_path: directory containing dewpoint files
+ - second_input_pattern: glob pattern for dewpoint files
+ - second_variable: variable name in dewpoint files
+ """
+ td_K = _load_secondary_mf(rule, "second_input_path", "second_input_pattern", "second_variable")
+
+ # Convert K -> °C
+ t_C = data - 273.15
+ td_C = td_K - 273.15
+
+ # Magnus formula constants (Alduchov and Eskridge, 1996)
+ b = 17.625
+ c = 243.04
+
+ result = 100.0 * np.exp(b * td_C / (c + td_C)) / np.exp(b * t_C / (c + t_C))
+
+ # Clip to physical range
+ result = result.clip(0, 100)
+
+ result.attrs = {
+ "units": "%",
+ "standard_name": "relative_humidity",
+ "long_name": "Near-Surface Relative Humidity",
+ }
+ result.name = "hurs"
+ return result
+
+
+def compute_huss(data, rule):
+ """
+ Compute near-surface specific humidity from dewpoint and surface pressure.
+
+ Uses Tetens formula for saturation vapour pressure at dewpoint:
+ e = 611.2 * exp(17.67 * Td / (Td + 243.5))
+
+ Then specific humidity:
+ q = 0.622 * e / (p - 0.378 * e)
+
+ Primary input (data) is 2d (2m dewpoint temperature, K).
+ Surface pressure is loaded from rule attributes.
+
+ Rule attributes:
+ - second_input_path: directory containing surface pressure files
+ - second_input_pattern: glob pattern for surface pressure files
+ - second_variable: variable name in pressure files
+ """
+ sp = _load_secondary_mf(rule, "second_input_path", "second_input_pattern", "second_variable")
+
+ # Dewpoint in Celsius
+ td_C = data - 273.15
+
+ # Saturation vapour pressure at dewpoint (Tetens formula)
+ e = 611.2 * np.exp(17.67 * td_C / (td_C + 243.5))
+
+ result = 0.622 * e / (sp - 0.378 * e)
+ result.attrs = {
+ "units": "1",
+ "standard_name": "specific_humidity",
+ "long_name": "Near-Surface Specific Humidity",
+ }
+ result.name = "huss"
+ return result
+
+
+def compute_clwvi(data, rule):
+ """
+ Compute condensed water path (liquid + ice).
+
+ clwvi = tclw + tciw
+
+ Primary input (data) is tclw (total column cloud liquid water).
+ Ice water path is loaded from rule attributes.
+
+ Rule attributes:
+ - second_input_path: directory containing tciw files
+ - second_input_pattern: glob pattern for tciw files
+ - second_variable: variable name in tciw files
+ """
+ tciw = _load_secondary_mf(rule, "second_input_path", "second_input_pattern", "second_variable")
+ result = data + tciw
+ result.attrs = {
+ "units": "kg m-2",
+ "standard_name": "atmosphere_mass_content_of_cloud_condensed_water",
+ "long_name": "Condensed Water Path",
+ }
+ result.name = "clwvi"
+ return result
+
+
+# ============================================================
+# Land surface derived-variable steps
+# ============================================================
+
+
+def compute_snc(data, rule):
+ """
+ Compute snow area fraction from snow depth (water equivalent).
+
+ Uses a saturation curve: snc = min(100, sd_we / sd_crit * 100)
+ where sd_crit = 0.015 m water equivalent (~5 cm fresh snow).
+
+ Primary input (data) is sd (snow depth, m water equivalent).
+ """
+ sd_crit = 0.015 # m water equivalent threshold for full cover
+ result = (data / sd_crit * 100).clip(min=0, max=100)
+ result.attrs = {
+ "units": "%",
+ "standard_name": "surface_snow_area_fraction",
+ "long_name": "Snow Area Fraction",
+ }
+ result.name = "snc"
+ return result
+
+
+def compute_areacella(data, rule):
+ """
+ Compute atmospheric grid cell area from latitude/longitude.
+
+ Uses the spherical Earth formula:
+ area = R^2 * delta_lon * |sin(lat+dlat/2) - sin(lat-dlat/2)|
+
+ Primary input (data) is any field on the target grid (used for coords).
+ """
+ R = 6371000.0 # Earth radius in metres
+
+ # Get lat/lon coordinates
+ lat = None
+ lon = None
+ for coord_name in data.coords:
+ if "lat" in coord_name.lower():
+ lat = data.coords[coord_name]
+ if "lon" in coord_name.lower():
+ lon = data.coords[coord_name]
+ if lat is None or lon is None:
+ raise ValueError("Cannot find lat/lon coordinates in input data")
+
+ lat_vals = np.deg2rad(lat.values)
+ lon_vals = np.deg2rad(lon.values)
+
+ # Compute grid spacing
+ dlat = np.abs(np.diff(lat_vals).mean())
+ dlon = np.abs(np.diff(lon_vals).mean())
+
+ # Cell area for each latitude band
+ lat_upper = lat_vals + dlat / 2
+ lat_lower = lat_vals - dlat / 2
+ area_1d = R**2 * dlon * np.abs(np.sin(lat_upper) - np.sin(lat_lower))
+
+ # Broadcast to 2D (lat, lon)
+ area_2d = np.broadcast_to(area_1d[:, np.newaxis], (len(lat_vals), len(lon_vals)))
+
+ result = xr.DataArray(
+ area_2d,
+ dims=[lat.dims[0], lon.dims[0]],
+ coords={lat.name: lat, lon.name: lon},
+ )
+ result.attrs = {
+ "units": "m2",
+ "standard_name": "cell_area",
+ "long_name": "Grid-Cell Area for Atmospheric Grid Variables",
+ }
+ result.name = "areacella"
+ return result
+
+
+def compute_slthick(data, rule):
+ """
+ Generate HTESSEL soil layer thicknesses as a constant field.
+
+ IFS HTESSEL has 4 soil layers with fixed thicknesses:
+ Layer 1: 0.07 m (0-7 cm)
+ Layer 2: 0.21 m (7-28 cm)
+ Layer 3: 0.72 m (28-100 cm)
+ Layer 4: 1.89 m (100-289 cm)
+
+ Primary input (data) is ignored (any grid file will do).
+ """
+ thicknesses = np.array([0.07, 0.21, 0.72, 1.89])
+ result = xr.DataArray(
+ thicknesses,
+ dims=["sdepth"],
+ coords={"sdepth": np.arange(1, 5)},
+ )
+ result.attrs = {
+ "units": "m",
+ "standard_name": "cell_thickness",
+ "long_name": "Thickness of Soil Layers",
+ }
+ result.name = "slthick"
+ return result
+
+
+# ============================================================
+# LPJ-GUESS fire emission steps
+# ============================================================
+
+# Andreae (2019) Table 1 — savanna/grassland emission factors [g species / kg DM]
+# Carbon fraction of dry matter = 0.45
+_FIRE_EMISSION_FACTORS_G_PER_KG_DM = {
+ "bc": 0.37,
+ "ch4": 1.94,
+ "co": 63.0,
+ "dms": 0.68,
+ "oa": 2.62,
+ "so2": 0.48,
+ "nmvoc": 3.4,
+}
+_CARBON_FRACTION = 0.45 # kg C per kg dry matter
+
+
+def load_lpjguess_monthly(data, rule):
+ """
+ Load LPJ-GUESS monthly .out files into an xarray Dataset.
+
+ Replaces load_mfdataset for LPJ-GUESS plain-text output. Reads all
+ period directories matching the input pattern, parses the
+ whitespace-delimited Lon/Lat/Year/Jan..Dec format, and returns an
+ xarray Dataset with dimensions (time, ncells).
+
+ Expects rule.inputs[0].path to point to the lpj_guess outdata directory.
+ The files are at {path}/{period}/run1/.out.
+ """
+ import cftime
+ import pandas as pd
+
+ input_collection = rule.inputs[0]
+ base_path = input_collection.path
+ pattern_str = input_collection.pattern_str
+
+ # Glob for all matching files across period subdirectories
+ files = sorted(base_path.glob(pattern_str))
+ if not files:
+ raise FileNotFoundError(f"No LPJ-GUESS files found matching {base_path}/{pattern_str}")
+ logger.info(f"Loading {len(files)} LPJ-GUESS .out files from {base_path}")
+
+ months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
+
+ frames = []
+ for f in files:
+ logger.info(f" * {f}")
+ df = pd.read_csv(f, delim_whitespace=True)
+ frames.append(df)
+
+ df_all = pd.concat(frames, ignore_index=True)
+
+ # Get sorted unique years
+ years = np.sort(df_all["Year"].unique())
+
+ # Build a cell index from (lon, lat) pairs, preserving the grid order
+ coords_df = df_all[["Lon", "Lat"]].drop_duplicates()
+ coords_df = coords_df.sort_values(["Lat", "Lon"], ascending=[False, True])
+ coords_df = coords_df.reset_index(drop=True)
+ ncells = len(coords_df)
+ lon_vals = coords_df["Lon"].values
+ lat_vals = coords_df["Lat"].values
+
+ # Map each (lon, lat) to a cell index
+ cell_map = {(row.Lon, row.Lat): i for i, row in coords_df.iterrows()}
+
+ # Build time coordinate
+ times = []
+ for yr in years:
+ for m in range(1, 13):
+ times.append(cftime.DatetimeProlepticGregorian(int(yr), m, 15))
+
+ # Allocate output array
+ n_times = len(times)
+ values = np.full((n_times, ncells), np.nan, dtype=np.float64)
+
+ # Fill values
+ model_variable = rule.get("model_variable", "Total")
+ if model_variable == "Total":
+ # Sum all month columns — they are the data columns
+ for _, row in df_all.iterrows():
+ cell_idx = cell_map.get((row["Lon"], row["Lat"]))
+ if cell_idx is None:
+ continue
+ yr_idx = np.searchsorted(years, row["Year"])
+ for m_idx, month in enumerate(months):
+ t_idx = yr_idx * 12 + m_idx
+ values[t_idx, cell_idx] = row[month]
+ else:
+ raise ValueError(
+ f"model_variable '{model_variable}' not supported for LPJ-GUESS .out files. "
+ f"Use 'Total' for fire emission variables."
+ )
+
+ # Create xarray Dataset
+ da = xr.DataArray(
+ values,
+ dims=["time", "ncells"],
+ coords={
+ "time": times,
+ "lon": ("ncells", lon_vals),
+ "lat": ("ncells", lat_vals),
+ },
+ name=model_variable,
+ )
+ da.attrs["units"] = "kg C m-2 s-1"
+
+ ds = da.to_dataset()
+ return ds
+
+
+def compute_fire_emission(data, rule):
+ """
+ Convert total fire carbon flux to species-specific emission flux.
+
+ Reads rule.emission_species to select the emission factor from
+ Andreae (2019) Table 1 (savanna/grassland). Converts from
+ kg C m-2 s-1 to kg species m-2 s-1.
+
+ Conversion: flux_species = flux_C * EF / (C_frac * 1000)
+ where EF is in g/kgDM and C_frac = 0.45 kgC/kgDM.
+ """
+ species = rule.get("emission_species")
+ if species is None:
+ raise ValueError("Rule must specify 'emission_species' for compute_fire_emission")
+
+ ef = _FIRE_EMISSION_FACTORS_G_PER_KG_DM.get(species)
+ if ef is None:
+ raise ValueError(
+ f"Unknown emission species '{species}'. " f"Available: {list(_FIRE_EMISSION_FACTORS_G_PER_KG_DM.keys())}"
+ )
+
+ # g/kgDM -> kg_species/kgC: divide by 1000 (g->kg) and by C_frac (kgDM->kgC)
+ conversion_factor = ef / (_CARBON_FRACTION * 1000.0)
+
+ model_variable = rule.get("model_variable", "Total")
+ da = data[model_variable]
+
+ da_species = da * conversion_factor
+ da_species.attrs = da.attrs.copy()
+ da_species.attrs["units"] = "kg m-2 s-1"
+ da_species.name = model_variable
+
+ ds = da_species.to_dataset()
+ # Carry over coordinates
+ for coord in data.coords:
+ if coord not in ds.coords:
+ ds.coords[coord] = data.coords[coord]
+
+ logger.info(
+ f"Applied emission factor for '{species}': "
+ f"EF={ef} g/kgDM, conversion={conversion_factor:.6e} kg_species/kgC"
+ )
+ return ds
+
+
+# ============================================================
+# LPJ-GUESS loaders for yearly and Lut file formats
+# ============================================================
+
+
+def load_lpjguess_yearly(data, rule):
+ """
+ Load LPJ-GUESS yearly .out files (Lon/Lat/Year/Total format).
+
+ Returns an xarray Dataset with dimensions (time, ncells) where time
+ has one entry per year (mid-year: July 1).
+ """
+ import cftime
+ import pandas as pd
+
+ input_collection = rule.inputs[0]
+ base_path = input_collection.path
+ pattern_str = input_collection.pattern_str
+
+ files = sorted(base_path.glob(pattern_str))
+ if not files:
+ raise FileNotFoundError(f"No LPJ-GUESS files found matching {base_path}/{pattern_str}")
+ logger.info(f"Loading {len(files)} LPJ-GUESS yearly .out files from {base_path}")
+
+ frames = []
+ for f in files:
+ logger.info(f" * {f}")
+ df = pd.read_csv(f, delim_whitespace=True)
+ frames.append(df)
+
+ df_all = pd.concat(frames, ignore_index=True)
+ years = np.sort(df_all["Year"].unique())
+
+ # Build cell index
+ coords_df = df_all[["Lon", "Lat"]].drop_duplicates()
+ coords_df = coords_df.sort_values(["Lat", "Lon"], ascending=[False, True]).reset_index(drop=True)
+ lon_vals = coords_df["Lon"].values
+ lat_vals = coords_df["Lat"].values
+ ncells = len(coords_df)
+ cell_map = {(row.Lon, row.Lat): i for i, row in coords_df.iterrows()}
+
+ # Time coordinate: one per year (mid-year)
+ times = [cftime.DatetimeProlepticGregorian(int(yr), 7, 1) for yr in years]
+
+ model_variable = rule.get("model_variable", "Total")
+ values = np.full((len(times), ncells), np.nan, dtype=np.float64)
+
+ for _, row in df_all.iterrows():
+ cell_idx = cell_map.get((row["Lon"], row["Lat"]))
+ if cell_idx is None:
+ continue
+ yr_idx = np.searchsorted(years, row["Year"])
+ values[yr_idx, cell_idx] = row[model_variable]
+
+ da = xr.DataArray(
+ values,
+ dims=["time", "ncells"],
+ coords={"time": times, "lon": ("ncells", lon_vals), "lat": ("ncells", lat_vals)},
+ name=model_variable,
+ )
+ return da.to_dataset()
+
+
+def load_lpjguess_yearly_lut(data, rule):
+ """
+ Load LPJ-GUESS yearly Lut .out files (Lon/Lat/Year/psl/crp/pst/urb format).
+
+ Returns an xarray Dataset with dimensions (time, ncells). Reads the
+ column specified by rule.model_variable (typically 'psl').
+ """
+ import cftime
+ import pandas as pd
+
+ input_collection = rule.inputs[0]
+ base_path = input_collection.path
+ pattern_str = input_collection.pattern_str
+
+ files = sorted(base_path.glob(pattern_str))
+ if not files:
+ raise FileNotFoundError(f"No LPJ-GUESS files found matching {base_path}/{pattern_str}")
+ logger.info(f"Loading {len(files)} LPJ-GUESS yearly Lut .out files from {base_path}")
+
+ frames = []
+ for f in files:
+ logger.info(f" * {f}")
+ df = pd.read_csv(f, delim_whitespace=True)
+ frames.append(df)
+
+ df_all = pd.concat(frames, ignore_index=True)
+ years = np.sort(df_all["Year"].unique())
+
+ coords_df = df_all[["Lon", "Lat"]].drop_duplicates()
+ coords_df = coords_df.sort_values(["Lat", "Lon"], ascending=[False, True]).reset_index(drop=True)
+ lon_vals = coords_df["Lon"].values
+ lat_vals = coords_df["Lat"].values
+ ncells = len(coords_df)
+ cell_map = {(row.Lon, row.Lat): i for i, row in coords_df.iterrows()}
+
+ times = [cftime.DatetimeProlepticGregorian(int(yr), 7, 1) for yr in years]
+
+ model_variable = rule.get("model_variable", "psl")
+ values = np.full((len(times), ncells), np.nan, dtype=np.float64)
+
+ for _, row in df_all.iterrows():
+ cell_idx = cell_map.get((row["Lon"], row["Lat"]))
+ if cell_idx is None:
+ continue
+ yr_idx = np.searchsorted(years, row["Year"])
+ values[yr_idx, cell_idx] = row[model_variable]
+
+ da = xr.DataArray(
+ values,
+ dims=["time", "ncells"],
+ coords={"time": times, "lon": ("ncells", lon_vals), "lat": ("ncells", lat_vals)},
+ name=model_variable,
+ )
+ return da.to_dataset()
+
+
+def load_lpjguess_monthly_lut(data, rule):
+ """
+ Load LPJ-GUESS monthly Lut .out files (Lon/Lat/Year/Mth/psl/crp/pst/urb format).
+
+ Returns an xarray Dataset with dimensions (time, ncells). Each row
+ in the .out file is one (gridpoint, year, month) tuple.
+ """
+ import cftime
+ import pandas as pd
+
+ input_collection = rule.inputs[0]
+ base_path = input_collection.path
+ pattern_str = input_collection.pattern_str
+
+ files = sorted(base_path.glob(pattern_str))
+ if not files:
+ raise FileNotFoundError(f"No LPJ-GUESS files found matching {base_path}/{pattern_str}")
+ logger.info(f"Loading {len(files)} LPJ-GUESS monthly Lut .out files from {base_path}")
+
+ frames = []
+ for f in files:
+ logger.info(f" * {f}")
+ df = pd.read_csv(f, delim_whitespace=True)
+ frames.append(df)
+
+ df_all = pd.concat(frames, ignore_index=True)
+ years = np.sort(df_all["Year"].unique())
+
+ coords_df = df_all[["Lon", "Lat"]].drop_duplicates()
+ coords_df = coords_df.sort_values(["Lat", "Lon"], ascending=[False, True]).reset_index(drop=True)
+ lon_vals = coords_df["Lon"].values
+ lat_vals = coords_df["Lat"].values
+ ncells = len(coords_df)
+ cell_map = {(row.Lon, row.Lat): i for i, row in coords_df.iterrows()}
+
+ # Build time axis: one per (year, month)
+ times = []
+ for yr in years:
+ for m in range(1, 13):
+ times.append(cftime.DatetimeProlepticGregorian(int(yr), m, 15))
+
+ model_variable = rule.get("model_variable", "psl")
+ n_times = len(times)
+ values = np.full((n_times, ncells), np.nan, dtype=np.float64)
+
+ for _, row in df_all.iterrows():
+ cell_idx = cell_map.get((row["Lon"], row["Lat"]))
+ if cell_idx is None:
+ continue
+ yr_idx = np.searchsorted(years, row["Year"])
+ m_idx = int(row["Mth"]) - 1
+ t_idx = yr_idx * 12 + m_idx
+ values[t_idx, cell_idx] = row[model_variable]
+
+ da = xr.DataArray(
+ values,
+ dims=["time", "ncells"],
+ coords={"time": times, "lon": ("ncells", lon_vals), "lat": ("ncells", lat_vals)},
+ name=model_variable,
+ )
+ return da.to_dataset()
+
+
+# ============================================================
+# IFS land custom computation steps
+# ============================================================
+
+
+def compute_temporal_diff(data, rule):
+ """
+ Compute temporal difference of a variable (for dgw, dsn, dsw).
+
+ For dgw: diff of swvl4 * layer_thickness * 1000
+ For dsn: diff of sd * scale_factor
+ For dsw: diff of total water storage
+ """
+ model_variable = rule.get("model_variable")
+ scale_factor = rule.get("scale_factor", 1.0)
+ layer_thickness = rule.get("layer_thickness", 1.0)
+
+ if model_variable == "total_water":
+ # Compute total water storage: soil moisture + snow + skin reservoir
+ da = (
+ 1000.0 * (data["swvl1"] * 0.07 + data["swvl2"] * 0.21 + data["swvl3"] * 0.72 + data["swvl4"] * 1.89)
+ + data["sd"] * 1000.0
+ + data["src"] * 1000.0
+ )
+ elif model_variable == "skin_reservoir":
+ # dcw: change in canopy interception storage (src in m → kg/m2)
+ da = data["src"] * 1000.0
+ elif model_variable == "soil_moisture":
+ # dslw: change in total soil moisture (all 4 HTESSEL layers)
+ da = 1000.0 * (data["swvl1"] * 0.07 + data["swvl2"] * 0.21 + data["swvl3"] * 0.72 + data["swvl4"] * 1.89)
+ else:
+ da = data[model_variable] * float(layer_thickness) * 1000.0 * float(scale_factor)
+
+ diff = da.diff(dim="time")
+ diff.attrs["units"] = "kg m-2"
+ diff.name = model_variable
+
+ ds = diff.to_dataset()
+ for coord in data.coords:
+ if coord not in ds.coords and coord != "time":
+ ds.coords[coord] = data.coords[coord]
+ return ds
+
+
+def compute_mrtws(data, rule):
+ """
+ Compute terrestrial water storage (mrtws).
+
+ Sum of all water stores: soil moisture (4 layers) + snow + skin reservoir.
+ HTESSEL layer thicknesses: 0.07, 0.21, 0.72, 1.89 m.
+ """
+ mrtws = (
+ 1000.0 * (data["swvl1"] * 0.07 + data["swvl2"] * 0.21 + data["swvl3"] * 0.72 + data["swvl4"] * 1.89)
+ + data["sd"] * 1000.0
+ + data["src"] * 1000.0
+ )
+ mrtws.attrs["units"] = "kg m-2"
+ mrtws.name = "mrtws"
+
+ ds = mrtws.to_dataset()
+ for coord in data.coords:
+ if coord not in ds.coords:
+ ds.coords[coord] = data.coords[coord]
+ return ds
+
+
+def compute_snd(data, rule):
+ """
+ Compute physical snow depth from SWE and snow density.
+
+ snd = sd * 1000 / rsn (SWE in m water equiv → physical depth in m)
+ Where rsn = 0, snd = 0 (no snow).
+ """
+ sd = data["sd"]
+ rsn = data["rsn"]
+
+ # Avoid division by zero: where rsn == 0, there's no snow
+ snd = xr.where(rsn > 0, sd * 1000.0 / rsn, 0.0)
+ snd.attrs["units"] = "m"
+ snd.name = "snd"
+
+ ds = snd.to_dataset()
+ for coord in data.coords:
+ if coord not in ds.coords:
+ ds.coords[coord] = data.coords[coord]
+ return ds
+
+
+def sum_lpjguess_monthly_files(data, rule):
+ """
+ Load and sum multiple LPJ-GUESS monthly .out files.
+
+ For variables like c3PftFrac that are the sum of multiple output files
+ (grassFracC3 + treeFracBdlDcd + treeFracBdlEvg + treeFracNdlDcd + treeFracNdlEvg).
+
+ Primary input (data) is already loaded (first file).
+ Rule attributes:
+ - additional_files: comma-separated list of additional .out filenames
+ e.g. "treeFracBdlDcd_monthly.out,treeFracBdlEvg_monthly.out,..."
+ - lpjg_data_path: base path to LPJ-GUESS output
+ - additional_pattern_prefix: glob prefix for period dirs (default: "*/run1/")
+ """
+ lpjg_path = rule.get("lpjg_data_path")
+ additional = rule.get("additional_files", "")
+ prefix = rule.get("additional_pattern_prefix", "*/run1/")
+
+ if not additional or not lpjg_path:
+ return data
+
+ # data is an xr.Dataset from load_lpjguess_monthly; extract the single variable
+ var_names = [v for v in data.data_vars if v not in data.coords]
+ result = data[var_names[0]]
+
+ import cftime
+ import pandas as pd
+
+ for filename in additional.split(","):
+ filename = filename.strip()
+ if not filename:
+ continue
+ file_pattern = _os.path.join(lpjg_path, prefix, filename)
+ files = sorted(_glob.glob(file_pattern))
+ if not files:
+ logger.warning(f"No files matching {file_pattern}, skipping")
+ continue
+ # Read with the same logic as load_lpjguess_monthly
+ frames = []
+ for f in files:
+ df = pd.read_csv(f, sep=r"\s+")
+ frames.append(df)
+ df_all = pd.concat(frames, ignore_index=True)
+ years = sorted(df_all["Year"].unique())
+ month_cols = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
+ time_vals = []
+ data_list = []
+ for yr in years:
+ yr_df = df_all[df_all["Year"] == yr].sort_values(["Lat", "Lon"], ascending=[False, True])
+ for mi, mcol in enumerate(month_cols):
+ time_vals.append(cftime.DatetimeProlepticGregorian(int(yr), mi + 1, 15))
+ data_list.append(yr_df[mcol].values)
+ arr = np.array(data_list)
+ da = xr.DataArray(
+ arr,
+ dims=["time", "ncells"],
+ coords={"time": time_vals},
+ )
+ result = result + da
+
+ out_name = rule.get("output_variable", var_names[0])
+ result.attrs = data[var_names[0]].attrs.copy()
+ result.name = out_name
+ ds_out = result.to_dataset()
+ for coord in data.coords:
+ if coord not in ds_out.coords:
+ ds_out.coords[coord] = data.coords[coord]
+ return ds_out
+
+
+def compute_mrsow(data, rule):
+ """
+ Compute total soil wetness as fraction of saturation.
+
+ mrsow = (swvl1*d1 + swvl2*d2 + swvl3*d3 + swvl4*d4) /
+ (porosity * (d1 + d2 + d3 + d4))
+
+ HTESSEL layer thicknesses: d1=0.07, d2=0.21, d3=0.72, d4=1.89 m.
+ HTESSEL porosity varies by soil type but a representative global
+ average is ~0.472 (loam).
+
+ Rule attributes:
+ - porosity: soil porosity (default: 0.472, HTESSEL loam)
+ """
+ porosity = float(rule.get("porosity", 0.472))
+ d1, d2, d3, d4 = 0.07, 0.21, 0.72, 1.89
+ total_depth = d1 + d2 + d3 + d4
+
+ # Weighted average volumetric soil moisture
+ swvl_avg = (data["swvl1"] * d1 + data["swvl2"] * d2 + data["swvl3"] * d3 + data["swvl4"] * d4) / total_depth
+
+ result = swvl_avg / porosity
+ # Clip to [0, 1]
+ result = result.clip(0.0, 1.0)
+ result.attrs = {"units": "1", "long_name": "Total Soil Wetness"}
+ result.name = "mrsow"
+
+ ds = result.to_dataset()
+ for coord in data.coords:
+ if coord not in ds.coords:
+ ds.coords[coord] = data.coords[coord]
+ return ds
+
+
+def select_southern_hemisphere(data, rule):
+ """
+ Select Southern Hemisphere subset (south of 30S).
+
+ For CMIP7 variables with region=30S-90S (e.g., orogSouth30, tasSouth30).
+ Selects latitudes <= -30.
+ """
+ lat_name = None
+ for name in ["lat", "latitude", "nav_lat"]:
+ if name in data.coords:
+ lat_name = name
+ break
+ if lat_name is None:
+ raise ValueError("Cannot find latitude coordinate in data")
+ result = data.sel({lat_name: data[lat_name] <= -30.0})
+ return result
+
+
+def compute_sftgif(data, rule):
+ """
+ Compute glacier fraction from IFS vegetation type fields.
+
+ IFS vegetation type 12 = "Ice Caps and Glaciers" (BATS classification).
+ sftgif = cvl * (tvl == 12) * 100 + cvh * (tvh == 12) * 100
+
+ Input data should contain tvl, tvh, cvl, cvh fields.
+ """
+ tvl = data["tvl"]
+ tvh = data["tvh"]
+ cvl = data["cvl"]
+ cvh = data["cvh"]
+
+ # Vegetation type 12 = Ice Caps and Glaciers
+ glacier = cvl * (tvl == 12).astype(float) + cvh * (tvh == 12).astype(float)
+ result = glacier * 100.0 # fraction → percent
+
+ result.attrs = {"units": "%", "long_name": "Fraction of Grid Cell Covered with Glacier"}
+ result.name = "sftgif"
+
+ ds = result.to_dataset()
+ for coord in data.coords:
+ if coord not in ds.coords:
+ ds.coords[coord] = data.coords[coord]
+ return ds
+
+
+# HTESSEL field capacity lookup table (Van Genuchten parameters per soil type)
+# Soil types 1-7 from IFS documentation, field capacity as volumetric fraction
+# Source: HTESSEL sussoil_mod.F90, Van Genuchten parameters → theta at pF=2.5
+_HTESSEL_FIELD_CAPACITY = {
+ 1: 0.242, # Coarse (sand)
+ 2: 0.346, # Medium (loam)
+ 3: 0.382, # Medium fine (clay loam)
+ 4: 0.448, # Fine (clay)
+ 5: 0.310, # Very fine (silty clay)
+ 6: 0.370, # Organic
+ 7: 0.420, # Tropical organic
+}
+
+
+def compute_mrsofc(data, rule):
+ """
+ Compute soil field capacity from IFS soil type.
+
+ HTESSEL has 7 soil types with known Van Genuchten parameters.
+ Field capacity (theta at pF=2.5) is looked up per soil type,
+ then integrated over the full soil column (2.89 m).
+
+ mrsofc = theta_fc * total_depth * rho_water
+ = theta_fc * 2.89 * 1000 (kg m-2)
+
+ Input data should contain 'slt' (soil type, integer 1-7).
+ """
+ slt = data["slt"]
+ total_depth = 0.07 + 0.21 + 0.72 + 1.89 # 2.89 m
+
+ # Map soil type to field capacity
+ theta_fc = xr.zeros_like(slt, dtype=float)
+ for stype, fc in _HTESSEL_FIELD_CAPACITY.items():
+ theta_fc = xr.where(np.round(slt) == stype, fc, theta_fc)
+
+ result = theta_fc * total_depth * 1000.0 # m3/m3 * m * kg/m3 → kg/m2
+
+ result.attrs = {
+ "units": "kg m-2",
+ "long_name": "Soil Moisture at Field Capacity",
+ }
+ result.name = "mrsofc"
+
+ ds = result.to_dataset()
+ for coord in data.coords:
+ if coord not in ds.coords:
+ ds.coords[coord] = data.coords[coord]
+ return ds
+
+
+# HTESSEL root depth by vegetation type (Zeng et al. 1998 effective depth)
+# IFS BATS vegetation types with 95% cumulative root fraction depth (m)
+_HTESSEL_ROOT_DEPTH = {
+ 1: 1.00, # Crops, mixed farming
+ 2: 1.00, # Short grass
+ 3: 1.50, # Evergreen needleleaf
+ 4: 1.50, # Deciduous needleleaf
+ 5: 1.50, # Deciduous broadleaf
+ 6: 2.00, # Evergreen broadleaf
+ 7: 1.00, # Tall grass
+ 8: 0.50, # Desert
+ 9: 0.50, # Tundra
+ 10: 1.00, # Irrigated crops
+ 11: 0.50, # Semidesert
+ 12: 0.00, # Ice caps and glaciers
+ 13: 0.50, # Bogs and marshes
+ 14: 0.00, # Inland water
+ 15: 0.00, # Ocean
+ 16: 1.50, # Evergreen shrubs
+ 17: 1.00, # Deciduous shrubs
+ 18: 1.50, # Mixed forest
+ 19: 1.00, # Interrupted forest
+ 20: 0.00, # Water and land mix
+}
+
+
+def compute_rootd(data, rule):
+ """
+ Compute effective maximum root depth from IFS vegetation types.
+
+ Uses vegetation-type-weighted root depth:
+ rootd = cvl * rootd(tvl) + cvh * rootd(tvh)
+
+ Input data should contain tvl, tvh, cvl, cvh fields.
+ """
+ tvl = data["tvl"]
+ tvh = data["tvh"]
+ cvl = data["cvl"]
+ cvh = data["cvh"]
+
+ rootd_low = xr.zeros_like(tvl, dtype=float)
+ rootd_high = xr.zeros_like(tvh, dtype=float)
+
+ for vtype, depth in _HTESSEL_ROOT_DEPTH.items():
+ rootd_low = xr.where(np.round(tvl) == vtype, depth, rootd_low)
+ rootd_high = xr.where(np.round(tvh) == vtype, depth, rootd_high)
+
+ result = cvl * rootd_low + cvh * rootd_high
+
+ result.attrs = {"units": "m", "long_name": "Maximum Root Depth"}
+ result.name = "rootd"
+
+ ds = result.to_dataset()
+ for coord in data.coords:
+ if coord not in ds.coords:
+ ds.coords[coord] = data.coords[coord]
+ return ds
+
+
+# ============================================================
+# CAP7 atmosphere steps
+# ============================================================
+
+
+def compute_rtmt(data, rule):
+ """
+ Compute net downward radiative flux at top of model.
+
+ rtmt = rsdt - rsut + rlds - rlus
+
+ Primary input (data) should be a Dataset containing rsdt, rsut,
+ rlds, and rlus from the _day_cap7 or monthly XIOS output.
+ """
+ rsdt = data["rsdt"]
+ rsut = data["rsut"]
+ rlds = data["rlds"]
+ rlus = data["rlus"]
+
+ result = (rsdt - rsut) + (rlds - rlus)
+ result.attrs = {
+ "units": "W m-2",
+ "standard_name": "net_downward_radiative_flux_at_top_of_atmosphere_model",
+ "long_name": "Net Downward Radiative Flux at Top of Model",
+ }
+ result.name = "rtmt"
+ return result.to_dataset()
+
+
+def extract_single_plevel(data, rule):
+ """
+ Extract a single pressure level from a multi-level dataset.
+
+ Rule attributes:
+ - model_variable: variable name in dataset (e.g. 't', 'w')
+ - target_plevel: pressure level in Pa (e.g. 70000 for 700 hPa, 50000 for 500 hPa)
+ """
+ var = rule.model_variable
+ plevel = float(rule.target_plevel)
+
+ da = data[var]
+ # Find the pressure level dimension
+ plev_dim = None
+ for dim in da.dims:
+ if "lev" in dim or "plev" in dim or "pressure" in dim:
+ plev_dim = dim
+ break
+ if plev_dim is None:
+ raise ValueError(f"Cannot find pressure level dimension in {da.dims}")
+
+ result = da.sel({plev_dim: plevel}, method="nearest")
+ result = result.drop_vars(plev_dim, errors="ignore")
+ return result.to_dataset()
diff --git a/src/pycmor/core/cmorizer.py b/src/pycmor/core/cmorizer.py
index 7d375ab6..a89084ea 100644
--- a/src/pycmor/core/cmorizer.py
+++ b/src/pycmor/core/cmorizer.py
@@ -301,10 +301,22 @@ def _post_init_create_data_request(self):
Creates a DataRequest object from the tables directory using ResourceLocator.
Uses TableLocator with 5-level priority chain to locate tables.
+ For CMIP7, if CMIP7_DReq_metadata is specified, uses that instead.
"""
+ DataRequestClass = self._get_versioned_class(DataRequest)
+
+ # For CMIP7, prefer user-specified metadata file
+ if self.cmor_version == "CMIP7":
+ user_metadata_path = self._general_cfg.get("CMIP7_DReq_metadata")
+ if user_metadata_path:
+ logger.info(f"Using user-specified CMIP7 metadata: {user_metadata_path}")
+ self.data_request = DataRequestClass.from_json_file(user_metadata_path)
+ logger.debug(f"Created DataRequest from {user_metadata_path}")
+ return
+
+ # Fallback to tables directory
table_dir = self._locate_table_dir()
- DataRequestClass = self._get_versioned_class(DataRequest)
self.data_request = DataRequestClass.from_directory(table_dir)
logger.debug(f"Created DataRequest from {table_dir}")
@@ -376,7 +388,12 @@ def _post_init_populate_rules_with_tables(self):
def _post_init_populate_rules_with_data_request_variables(self):
logger.debug(f"Data request has {len(self.data_request.variables)} variables")
for drv in self.data_request.variables.values():
- rule_for_var = self.find_matching_rule(drv)
+ # Route to CMIP7-specific matching for exact compound name comparison
+ if self.cmor_version == "CMIP7":
+ rule_for_var = self.find_matching_rule_cmip7(drv)
+ else:
+ rule_for_var = self.find_matching_rule(drv)
+
if rule_for_var is None:
continue
if rule_for_var.data_request_variables == []:
@@ -449,9 +466,16 @@ def _post_init_populate_rules_with_dimensionless_unit_mappings(self):
def _match_pipelines_in_rules(self, force=False):
for rule in self.rules:
rule.match_pipelines(self.pipelines, force=force)
+ # Ensure all matched pipelines have the cluster assigned
+ if self._cluster is not None:
+ for pl in rule.pipelines:
+ if getattr(pl, "_cluster", None) is None:
+ pl.assign_cluster(self._cluster)
def find_matching_rule(self, data_request_variable: DataRequestVariable) -> Rule or None:
matches = []
+ drv_id = getattr(data_request_variable, "variable_id", "UNKNOWN")
+ logger.debug(f"Looking for rule matching data_request_variable: {drv_id}")
for rule in self.rules:
# Determine what to compare: prefer compound_name if available on rule
compound_name_match = False
@@ -524,6 +548,58 @@ def find_matching_rule(self, data_request_variable: DataRequestVariable) -> Rule
logger.warning("Returning the first match.")
return matches[0]
+ def find_matching_rule_cmip7(self, data_request_variable: DataRequestVariable) -> Rule or None:
+ """Match rules by exact compound name for CMIP7.
+
+ This method compares full CMIP7 compound names without any extraction,
+ preserving branding, frequency, and region information.
+
+ Parameters
+ ----------
+ data_request_variable : DataRequestVariable
+ The CMIP7 data request variable to match.
+
+ Returns
+ -------
+ Rule or None
+ Matched rule or None if no match found.
+ """
+ matches = []
+ drv_compound_name = data_request_variable.variable_id # Should be full compound name
+ logger.debug(f"Looking for rule matching CMIP7 compound name: {drv_compound_name}")
+
+ for rule in self.rules:
+ if hasattr(rule, "compound_name") and rule.compound_name:
+ # Exact compound name matching for CMIP7
+ if rule.compound_name == drv_compound_name:
+ logger.debug(f" Rule '{rule.name}' matches: {rule.compound_name} == {drv_compound_name}")
+ matches.append(rule)
+ else:
+ logger.debug(f" Rule '{rule.name}' does not match: {rule.compound_name} != {drv_compound_name}")
+
+ if len(matches) == 0:
+ msg = f"No rule found for CMIP7 variable {drv_compound_name}"
+ if self._pymor_cfg.get("raise_on_no_rule", False):
+ raise ValueError(msg)
+ elif self._pymor_cfg.get("warn_on_no_rule", False):
+ logger.warning(msg)
+ return None
+ if len(matches) > 1:
+ msg = f"Need only one rule to match to {drv_compound_name}. Found {len(matches)}."
+ if self._pymor_cfg.get("raise_on_multiple_rules", True):
+ raise ValueError(msg)
+ else:
+ logger.critical(msg)
+ logger.critical(
+ """
+ This should lead to a program crash! Exception due to:
+
+ >> pymor_cfg['raise_on_multiple_rules'] = False <<
+ """
+ )
+ logger.warning("Returning the first match.")
+ return matches[0]
+
# FIXME: This needs a better name...
def _rules_expand_drvs(self):
new_rules = []
@@ -596,7 +672,7 @@ def _post_init_create_pipelines(self):
pl = Pipeline.from_dict(p)
if self._cluster is not None:
pl.assign_cluster(self._cluster)
- pipelines.append(Pipeline.from_dict(p))
+ pipelines.append(pl)
else:
raise ValueError(f"Invalid pipeline configuration for {p}")
self.pipelines = pipelines
diff --git a/src/pycmor/core/config.py b/src/pycmor/core/config.py
index c8c74785..881cb30d 100644
--- a/src/pycmor/core/config.py
+++ b/src/pycmor/core/config.py
@@ -551,9 +551,14 @@ def _create_environments(cls, run_specific_cfg=None):
list
List of environment objects in priority order (first has highest priority).
"""
+ # Prefix dict keys with namespace so they match the namespaced lookup.
+ # The YAML 'pycmor:' section provides keys like 'dask_cluster', but the
+ # manager looks for 'pycmor_dask_cluster' due to the namespace.
+ raw = run_specific_cfg or {}
+ prefixed = {f"{cls._NAMESPACE}_{k}": v for k, v in raw.items()}
return [
ConfigOSEnv(), # Highest: Environment variables
- ConfigDictEnv(run_specific_cfg or {}), # Run-specific configuration
+ ConfigDictEnv(prefixed), # Run-specific configuration (namespace-prefixed)
ConfigYamlEnv(cls._CONFIG_FILES), # Lowest: User config file
]
diff --git a/src/pycmor/data_request/collection.py b/src/pycmor/data_request/collection.py
index f1aba40e..c6493370 100644
--- a/src/pycmor/data_request/collection.py
+++ b/src/pycmor/data_request/collection.py
@@ -68,15 +68,34 @@ def from_vendored_json(cls):
@classmethod
def from_all_var_info(cls, data):
+ from .table import CMIP7DataRequestTableHeader
+
tables = {}
variables = {}
- table_ids = set(k.split(".")[0] for k in data["Compound Name"].keys())
- for table_id in table_ids:
- table = CMIP7DataRequestTable.from_all_var_info(table_id, data)
- tables[table_id] = table
- for variable in table.variables:
- variable.table_header = table.header
- variables[variable.variable_id] = variable
+
+ # CMIP7: Index variables by compound name directly (no table dependency)
+ for cmip7_compound_name, var_dict in data["Compound Name"].items():
+ variable = CMIP7DataRequestVariable.from_dict(var_dict, compound_name=cmip7_compound_name)
+
+ # Create synthetic table header from variable metadata
+ # This ensures downstream code that expects table_header doesn't break
+ table_header = CMIP7DataRequestTableHeader.from_variable_metadata(var_dict)
+ variable.table_header = table_header
+
+ variables[cmip7_compound_name] = variable
+
+ # Optional: Build tables for backward compatibility with code that expects them
+ # Group by cmip6_table if available (for legacy support)
+ table_ids = set(v.get("cmip6_table") for v in data["Compound Name"].values() if v.get("cmip6_table"))
+ if table_ids:
+ for table_id in table_ids:
+ table = CMIP7DataRequestTable.from_all_var_info(table_id, data)
+ tables[table_id] = table
+ # Link table headers to variables that were grouped into tables
+ for variable in table.variables:
+ if not hasattr(variable, "table_header") or variable.table_header is None:
+ variable.table_header = table.header
+
return cls(tables, variables)
@classmethod
diff --git a/src/pycmor/data_request/table.py b/src/pycmor/data_request/table.py
index 972a1665..dd7f54df 100644
--- a/src/pycmor/data_request/table.py
+++ b/src/pycmor/data_request/table.py
@@ -265,6 +265,49 @@ def from_dict(cls, data: dict) -> "CMIP7DataRequestTableHeader":
_generic_levels=generic_levels,
)
+ @classmethod
+ def from_variable_metadata(cls, var_dict: dict) -> "CMIP7DataRequestTableHeader":
+ """Create synthetic table header from a single variable's metadata.
+
+ This method creates a minimal table header for CMIP7 variables loaded
+ by compound name, ensuring downstream code that expects table_header
+ doesn't break.
+
+ Parameters
+ ----------
+ var_dict : dict
+ Variable metadata dictionary containing frequency, modeling_realm, etc.
+
+ Returns
+ -------
+ CMIP7DataRequestTableHeader
+ Synthetic table header with values derived from variable metadata.
+ """
+ # Derive table_id from cmip6_table if available, otherwise construct from realm+frequency
+ table_id = var_dict.get("cmip6_table")
+ if not table_id:
+ realm = var_dict.get("modeling_realm", "unknown")
+ frequency = var_dict.get("frequency", "")
+ realm_letter = {"ocean": "O", "atmos": "A", "land": "L", "seaIce": "SI"}.get(
+ realm, realm[0].upper() if realm else "X"
+ )
+ table_id = f"{realm_letter}{frequency}" if frequency else realm_letter
+
+ # Get realm as list
+ realm = var_dict.get("modeling_realm", "unknown")
+ realm_list = [realm] if isinstance(realm, str) else realm
+
+ # Calculate approx_interval from frequency
+ frequency = var_dict.get("frequency", "")
+ approx_interval = cls._approx_interval_from_frequency(frequency)
+
+ return cls(
+ _table_id=table_id,
+ _realm=realm_list,
+ _approx_interval=approx_interval,
+ _generic_levels=[],
+ )
+
@classmethod
def from_all_var_info(cls, table_name: str, all_var_info: dict = None) -> "CMIP7DataRequestTableHeader":
"""Create header from all_var_info.json for a specific table.
@@ -675,7 +718,8 @@ def from_all_var_info(cls, table_name: str, all_var_info: dict = None):
header = CMIP7DataRequestTableHeader.from_all_var_info(table_name, all_var_info)
variables = []
for var_name, var_dict in all_var_info["Compound Name"].items():
- if var_dict.get("cmip6_cmor_table") == table_name:
+ # Use cmip6_table (not cmip6_cmor_table) to match metadata format
+ if var_dict.get("cmip6_table") == table_name:
variables.append(CMIP7DataRequestVariable.from_dict(var_dict))
return cls(header, variables)
@@ -702,9 +746,7 @@ def find_all(cls, path):
with open(_all_var_info, "r") as f:
all_var_info = json.load(f)
- table_ids = set(
- v.get("cmip6_cmor_table") for v in all_var_info["Compound Name"].values() if v.get("cmip6_cmor_table")
- )
+ table_ids = set(v.get("cmip6_table") for v in all_var_info["Compound Name"].values() if v.get("cmip6_table"))
for table_id in table_ids:
yield cls.from_all_var_info(table_id, all_var_info)
diff --git a/src/pycmor/data_request/variable.py b/src/pycmor/data_request/variable.py
index a1a49b5a..c8928ecd 100644
--- a/src/pycmor/data_request/variable.py
+++ b/src/pycmor/data_request/variable.py
@@ -444,7 +444,7 @@ class CMIP7DataRequestVariable(DataRequestVariable):
_table_name: Optional[str] = None
@classmethod
- def from_dict(cls, data):
+ def from_dict(cls, data, compound_name=None):
"""Create a CMIP7DataRequestVariable from a dictionary.
Parameters
@@ -453,6 +453,9 @@ def from_dict(cls, data):
Dictionary containing variable metadata from CMIP7 data request.
Expected keys include all standard metadata fields plus CMIP7-specific
fields like 'cmip7_compound_name', 'branding_label', 'region', etc.
+ compound_name : str, optional
+ CMIP7 compound name (realm.variable.branding.frequency.region).
+ If provided, takes precedence over value in data dict.
Returns
-------
@@ -477,7 +480,7 @@ def from_dict(cls, data):
_spatial_shape=data["spatial_shape"],
_temporal_shape=data["temporal_shape"],
# CMIP7-specific fields
- _cmip7_compound_name=data.get("cmip7_compound_name"),
+ _cmip7_compound_name=compound_name or data.get("cmip7_compound_name"),
_branding_label=data.get("branding_label"),
_region=data.get("region"),
# CMIP6 backward compatibility
diff --git a/src/pycmor/fesom_1p4/nodes_to_levels.py b/src/pycmor/fesom_1p4/nodes_to_levels.py
index ca46b571..99c266a8 100644
--- a/src/pycmor/fesom_1p4/nodes_to_levels.py
+++ b/src/pycmor/fesom_1p4/nodes_to_levels.py
@@ -13,6 +13,7 @@
The argument ``[variable]`` defaults to ``"temp"``.
"""
+
import os
import numpy as np
diff --git a/src/pycmor/std_lib/global_attributes.py b/src/pycmor/std_lib/global_attributes.py
index f7e4f37c..cbaaf713 100644
--- a/src/pycmor/std_lib/global_attributes.py
+++ b/src/pycmor/std_lib/global_attributes.py
@@ -454,24 +454,56 @@ def get_table_id(self):
"""
Get table ID.
+ For CMIP7: table_id is not a core concept. We derive it from compound name
+ or return None. The cmip6_table field is only used for backward compatibility.
+
Priority:
- 1. cmip6_table field from variable metadata (CMIP7 compatibility)
- 2. table_id from rule configuration
- 3. Derive from compound_name if available (CMIP7 standard, useful for CMIP6 too)
+ 1. table_id from rule configuration (user override)
+ 2. Derive from compound_name if available (CMIP7 standard)
+ 3. cmip6_table field from variable metadata (backward compatibility only)
"""
from ..core.logging import logger
- # Check if drv is a dict or object
+ # Priority 1: User-provided table_id
+ table_id = self.rule_dict.get("table_id", None)
+ if table_id:
+ logger.debug(f"table_id from rule_dict: {table_id}")
+ return table_id
+
+ # Priority 2: Derive from compound_name (CMIP7 native approach)
+ compound_name = self.rule_dict.get("compound_name", None)
+ if compound_name:
+ logger.debug(f"Attempting to derive table_id from compound_name: {compound_name}")
+ parts = compound_name.split(".")
+ logger.debug(f"compound_name split into {len(parts)} parts: {parts}")
+ if len(parts) >= 5:
+ component = parts[0] # e.g., ocean, atmos
+ frequency = parts[3] # e.g., mon, day
+
+ # Map component to realm letter
+ realm_map = {
+ "atmos": "A",
+ "ocean": "O",
+ "ocn": "O",
+ "ocnBgchem": "O",
+ "seaIce": "SI",
+ "land": "L",
+ "landIce": "LI",
+ }
+ realm_letter = realm_map.get(component, component[0].upper())
+ table_id = f"{realm_letter}{frequency}"
+ logger.debug(f"Derived table_id: {table_id} (realm={realm_letter}, freq={frequency})")
+ return table_id
+
+ # Priority 3: Check for cmip6_table (backward compatibility only)
if isinstance(self.drv, dict):
table_id = self.drv.get("cmip6_table", None)
else:
table_id = getattr(self.drv, "cmip6_table", None)
- logger.debug(f"table_id from variable metadata (cmip6_table): {table_id}")
- if table_id is None:
- # Fallback to user-provided
- table_id = self.rule_dict.get("table_id", None)
- logger.debug(f"table_id from rule_dict: {table_id}")
+ if table_id:
+ logger.debug(f"table_id from variable metadata (cmip6_table - backward compat): {table_id}")
+ return table_id
# If still not found, try to derive from compound_name (works for both CMIP6 and CMIP7)
if table_id is None:
diff --git a/tests/test_cmip7_compound_name_matching.py b/tests/test_cmip7_compound_name_matching.py
new file mode 100644
index 00000000..92d3d6a6
--- /dev/null
+++ b/tests/test_cmip7_compound_name_matching.py
@@ -0,0 +1,501 @@
+"""Tests for CMIP7 compound name matching and architecture."""
+
+import pytest
+
+from pycmor.data_request.collection import CMIP7DataRequest
+from pycmor.data_request.table import CMIP7DataRequestTableHeader
+from pycmor.data_request.variable import CMIP7DataRequestVariable
+
+
+class TestCMIP7CompoundNameIndexing:
+ """Test that CMIP7 DataRequest indexes variables by compound name."""
+
+ def test_from_all_var_info_indexes_by_compound_name(self):
+ """Test that variables are indexed by compound name, not table."""
+ # Minimal test data without cmip6_table field
+ test_data = {
+ "Compound Name": {
+ "ocean.tos.tavg-u-hxy-sea.mon.GLB": {
+ "out_name": "tos",
+ "frequency": "mon",
+ "modeling_realm": "ocean",
+ "units": "degC",
+ "cell_methods": "area: mean time: mean",
+ "cell_measures": "area: areacello",
+ "long_name": "Sea Surface Temperature",
+ "comment": "Test variable",
+ "dimensions": "longitude latitude time",
+ "type": "real",
+ "positive": "",
+ "spatial_shape": "XY",
+ "temporal_shape": "T",
+ "branding_label": "tavg-u-hxy-sea",
+ "region": "GLB",
+ "cmip7_compound_name": "ocean.tos.tavg-u-hxy-sea.mon.GLB",
+ },
+ "ocean.tos.tpt-u-hxy-sea.3hr.GLB": {
+ "out_name": "tos",
+ "frequency": "3hr",
+ "modeling_realm": "ocean",
+ "units": "degC",
+ "cell_methods": "area: mean time: point",
+ "cell_measures": "area: areacello",
+ "long_name": "Sea Surface Temperature",
+ "comment": "Test variable with different branding",
+ "dimensions": "longitude latitude time",
+ "type": "real",
+ "positive": "",
+ "spatial_shape": "XY",
+ "temporal_shape": "T",
+ "branding_label": "tpt-u-hxy-sea",
+ "region": "GLB",
+ "cmip7_compound_name": "ocean.tos.tpt-u-hxy-sea.3hr.GLB",
+ },
+ }
+ }
+
+ # Create DataRequest
+ dreq = CMIP7DataRequest.from_all_var_info(test_data)
+
+ # Verify variables are indexed by compound name
+ assert len(dreq.variables) == 2
+ assert "ocean.tos.tavg-u-hxy-sea.mon.GLB" in dreq.variables
+ assert "ocean.tos.tpt-u-hxy-sea.3hr.GLB" in dreq.variables
+
+ # Verify variable_id returns compound name
+ var1 = dreq.variables["ocean.tos.tavg-u-hxy-sea.mon.GLB"]
+ assert var1.variable_id == "ocean.tos.tavg-u-hxy-sea.mon.GLB"
+
+ var2 = dreq.variables["ocean.tos.tpt-u-hxy-sea.3hr.GLB"]
+ assert var2.variable_id == "ocean.tos.tpt-u-hxy-sea.3hr.GLB"
+
+ def test_from_all_var_info_without_cmip6_table(self):
+ """Test that DataRequest loads successfully without cmip6_table field."""
+ test_data = {
+ "Compound Name": {
+ "atmos.tas.tavg-u-hxy-land.mon.GLB": {
+ "out_name": "tas",
+ "frequency": "mon",
+ "modeling_realm": "atmos",
+ "units": "K",
+ "cell_methods": "area: mean time: mean",
+ "cell_measures": "area: areacella",
+ "long_name": "Near-Surface Air Temperature",
+ "comment": "Test variable without cmip6_table",
+ "dimensions": "longitude latitude time",
+ "type": "real",
+ "positive": "",
+ "spatial_shape": "XY",
+ "temporal_shape": "T",
+ "cmip7_compound_name": "atmos.tas.tavg-u-hxy-land.mon.GLB",
+ }
+ }
+ }
+
+ dreq = CMIP7DataRequest.from_all_var_info(test_data)
+
+ # Should load 1 variable
+ assert len(dreq.variables) == 1
+ assert "atmos.tas.tavg-u-hxy-land.mon.GLB" in dreq.variables
+
+ # Tables may be empty since no cmip6_table field
+ # This is acceptable for CMIP7
+ assert isinstance(dreq.tables, dict)
+
+
+class TestCMIP7VariableFromDict:
+ """Test CMIP7DataRequestVariable.from_dict with compound_name parameter."""
+
+ def test_from_dict_with_compound_name_parameter(self):
+ """Test that compound_name parameter takes precedence."""
+ data = {
+ "out_name": "tos",
+ "frequency": "mon",
+ "modeling_realm": "ocean",
+ "units": "degC",
+ "cell_methods": "area: mean time: mean",
+ "cell_measures": "area: areacello",
+ "long_name": "Sea Surface Temperature",
+ "comment": "Test",
+ "dimensions": "longitude latitude time",
+ "type": "real",
+ "positive": "",
+ "spatial_shape": "XY",
+ "temporal_shape": "T",
+ }
+
+ compound_name = "ocean.tos.tavg-u-hxy-sea.mon.GLB"
+ var = CMIP7DataRequestVariable.from_dict(data, compound_name=compound_name)
+
+ assert var.variable_id == compound_name
+ assert var._cmip7_compound_name == compound_name
+
+ def test_from_dict_compound_name_from_data_dict(self):
+ """Test that compound_name can come from data dict."""
+ data = {
+ "out_name": "tos",
+ "frequency": "mon",
+ "modeling_realm": "ocean",
+ "units": "degC",
+ "cell_methods": "area: mean time: mean",
+ "cell_measures": "area: areacello",
+ "long_name": "Sea Surface Temperature",
+ "comment": "Test",
+ "dimensions": "longitude latitude time",
+ "type": "real",
+ "positive": "",
+ "spatial_shape": "XY",
+ "temporal_shape": "T",
+ "cmip7_compound_name": "ocean.tos.tavg-u-hxy-sea.mon.GLB",
+ }
+
+ var = CMIP7DataRequestVariable.from_dict(data)
+
+ assert var.variable_id == "ocean.tos.tavg-u-hxy-sea.mon.GLB"
+
+ def test_from_dict_parameter_overrides_data_dict(self):
+ """Test that parameter takes precedence over data dict."""
+ data = {
+ "out_name": "tos",
+ "frequency": "mon",
+ "modeling_realm": "ocean",
+ "units": "degC",
+ "cell_methods": "area: mean time: mean",
+ "cell_measures": "area: areacello",
+ "long_name": "Sea Surface Temperature",
+ "comment": "Test",
+ "dimensions": "longitude latitude time",
+ "type": "real",
+ "positive": "",
+ "spatial_shape": "XY",
+ "temporal_shape": "T",
+ "cmip7_compound_name": "ocean.tos.old.mon.GLB",
+ }
+
+ compound_name = "ocean.tos.tavg-u-hxy-sea.mon.GLB"
+ var = CMIP7DataRequestVariable.from_dict(data, compound_name=compound_name)
+
+ # Parameter should override data dict
+ assert var.variable_id == compound_name
+
+
+class TestCMIP7MatchingLogic:
+ """Test CMIP7-specific matching logic (requires cmorizer)."""
+
+ def test_exact_compound_name_matching(self):
+ """Test that matching uses exact compound name comparison."""
+ # This is an integration test that would require setting up
+ # a full cmorizer with rules and data request.
+ # For now, we document the expected behavior:
+ #
+ # Given rule: compound_name = "ocean.tos.tavg-u-hxy-sea.mon.GLB"
+ # And data request variable: variable_id = "ocean.tos.tavg-u-hxy-sea.mon.GLB"
+ # Then: Rule should match
+ #
+ # Given rule: compound_name = "ocean.tos.tavg-u-hxy-sea.mon.GLB"
+ # And data request variable: variable_id = "ocean.tos.tpt-u-hxy-sea.3hr.GLB"
+ # Then: Rule should NOT match (different branding and frequency)
+ pytest.skip("Integration test - requires full cmorizer setup")
+
+ def test_multiple_branding_variants_distinguished(self):
+ """Test that different branding variants are treated as separate variables."""
+ test_data = {
+ "Compound Name": {
+ "ocean.tos.tavg-u-hxy-sea.mon.GLB": {
+ "out_name": "tos",
+ "frequency": "mon",
+ "modeling_realm": "ocean",
+ "units": "degC",
+ "cell_methods": "area: mean time: mean",
+ "cell_measures": "area: areacello",
+ "long_name": "Sea Surface Temperature",
+ "comment": "Time average",
+ "dimensions": "longitude latitude time",
+ "type": "real",
+ "positive": "",
+ "spatial_shape": "XY",
+ "temporal_shape": "T",
+ "branding_label": "tavg-u-hxy-sea",
+ "cmip7_compound_name": "ocean.tos.tavg-u-hxy-sea.mon.GLB",
+ },
+ "ocean.tos.tpt-u-hxy-sea.3hr.GLB": {
+ "out_name": "tos",
+ "frequency": "3hr",
+ "modeling_realm": "ocean",
+ "units": "degC",
+ "cell_methods": "area: mean time: point",
+ "cell_measures": "area: areacello",
+ "long_name": "Sea Surface Temperature",
+ "comment": "Time point",
+ "dimensions": "longitude latitude time",
+ "type": "real",
+ "positive": "",
+ "spatial_shape": "XY",
+ "temporal_shape": "T",
+ "branding_label": "tpt-u-hxy-sea",
+ "cmip7_compound_name": "ocean.tos.tpt-u-hxy-sea.3hr.GLB",
+ },
+ }
+ }
+
+ dreq = CMIP7DataRequest.from_all_var_info(test_data)
+
+ # Both variants should exist as separate variables
+ assert len(dreq.variables) == 2
+
+ var_tavg = dreq.variables["ocean.tos.tavg-u-hxy-sea.mon.GLB"]
+ var_tpt = dreq.variables["ocean.tos.tpt-u-hxy-sea.3hr.GLB"]
+
+ # Verify they have different identities
+ assert var_tavg.variable_id != var_tpt.variable_id
+ assert var_tavg.frequency != var_tpt.frequency
+ assert var_tavg.cell_methods != var_tpt.cell_methods
+
+
+class TestCMIP7BackwardCompatibility:
+ """Test backward compatibility with existing CMIP6 fields."""
+
+ def test_cmip6_table_field_still_works(self):
+ """Test that metadata with cmip6_table still loads correctly."""
+ test_data = {
+ "Compound Name": {
+ "ocean.tos.tavg-u-hxy-sea.mon.GLB": {
+ "out_name": "tos",
+ "frequency": "mon",
+ "modeling_realm": "ocean",
+ "units": "degC",
+ "cell_methods": "area: mean time: mean",
+ "cell_measures": "area: areacello",
+ "long_name": "Sea Surface Temperature",
+ "comment": "With cmip6_table for backward compat",
+ "dimensions": "longitude latitude time",
+ "type": "real",
+ "positive": "",
+ "spatial_shape": "XY",
+ "temporal_shape": "T",
+ "cmip7_compound_name": "ocean.tos.tavg-u-hxy-sea.mon.GLB",
+ "cmip6_table": "Omon", # Backward compat field
+ }
+ }
+ }
+
+ dreq = CMIP7DataRequest.from_all_var_info(test_data)
+
+ # Should load successfully
+ assert len(dreq.variables) == 1
+ assert "ocean.tos.tavg-u-hxy-sea.mon.GLB" in dreq.variables
+
+ # Tables should be populated if cmip6_table present
+ assert len(dreq.tables) >= 0 # May or may not build tables
+
+ # Variable should have compound name as ID
+ var = dreq.variables["ocean.tos.tavg-u-hxy-sea.mon.GLB"]
+ assert var.variable_id == "ocean.tos.tavg-u-hxy-sea.mon.GLB"
+
+
+class TestSyntheticTableHeader:
+ """Test synthetic table header generation for CMIP7 variables."""
+
+ def test_from_variable_metadata_with_cmip6_table(self):
+ """Test synthetic header uses cmip6_table if present."""
+ var_dict = {
+ "frequency": "mon",
+ "modeling_realm": "ocean",
+ "cmip6_table": "Omon",
+ }
+
+ header = CMIP7DataRequestTableHeader.from_variable_metadata(var_dict)
+
+ assert header.table_id == "Omon"
+ assert header.realm == ["ocean"]
+ assert header.approx_interval == 30.0 # Monthly
+
+ def test_from_variable_metadata_without_cmip6_table(self):
+ """Test synthetic header derives table_id without cmip6_table."""
+ var_dict = {
+ "frequency": "mon",
+ "modeling_realm": "ocean",
+ }
+
+ header = CMIP7DataRequestTableHeader.from_variable_metadata(var_dict)
+
+ assert header.table_id == "Omon" # Derived from ocean + mon
+ assert header.realm == ["ocean"]
+ assert header.approx_interval == 30.0
+
+ def test_from_variable_metadata_various_frequencies(self):
+ """Test synthetic header handles different frequencies correctly."""
+ test_cases = [
+ ("mon", "ocean", "Omon", 30.0),
+ ("day", "atmos", "Aday", 1.0),
+ ("3hr", "ocean", "O3hr", 0.125),
+ ("1hr", "atmos", "A1hr", 0.041666666666666664),
+ ("yr", "land", "Lyr", 365.0),
+ ]
+
+ for frequency, realm, expected_table_id, expected_interval in test_cases:
+ var_dict = {
+ "frequency": frequency,
+ "modeling_realm": realm,
+ }
+ header = CMIP7DataRequestTableHeader.from_variable_metadata(var_dict)
+
+ assert header.table_id == expected_table_id, f"Failed for {frequency}/{realm}"
+ assert header.realm == [realm]
+ assert header.approx_interval == pytest.approx(expected_interval), f"Failed interval for {frequency}"
+
+ def test_from_variable_metadata_various_realms(self):
+ """Test realm letter mapping works correctly."""
+ test_cases = [
+ ("ocean", "O"),
+ ("atmos", "A"),
+ ("land", "L"),
+ ("seaIce", "SI"),
+ ]
+
+ for realm, expected_letter in test_cases:
+ var_dict = {
+ "frequency": "mon",
+ "modeling_realm": realm,
+ }
+ header = CMIP7DataRequestTableHeader.from_variable_metadata(var_dict)
+
+ assert header.table_id == f"{expected_letter}mon", f"Failed for realm {realm}"
+
+ def test_from_variable_metadata_missing_fields(self):
+ """Test synthetic header handles missing fields gracefully."""
+ var_dict = {
+ "frequency": "mon",
+ # missing modeling_realm
+ }
+
+ header = CMIP7DataRequestTableHeader.from_variable_metadata(var_dict)
+
+ # Should default to "unknown"
+ assert header.table_id in ["Umon", "unknown"] # Depends on fallback logic
+ assert header.realm == ["unknown"]
+
+ def test_variables_have_synthetic_table_header(self):
+ """Test that variables loaded without cmip6_table have synthetic table_header."""
+ test_data = {
+ "Compound Name": {
+ "ocean.tos.tavg-u-hxy-sea.mon.GLB": {
+ "out_name": "tos",
+ "frequency": "mon",
+ "modeling_realm": "ocean",
+ "units": "degC",
+ "cell_methods": "area: mean time: mean",
+ "cell_measures": "area: areacello",
+ "long_name": "Sea Surface Temperature",
+ "comment": "No cmip6_table field",
+ "dimensions": "longitude latitude time",
+ "type": "real",
+ "positive": "",
+ "spatial_shape": "XY",
+ "temporal_shape": "T",
+ # NO cmip6_table field!
+ }
+ }
+ }
+
+ dreq = CMIP7DataRequest.from_all_var_info(test_data)
+ var = dreq.variables["ocean.tos.tavg-u-hxy-sea.mon.GLB"]
+
+ # Variable should have table_header
+ assert hasattr(var, "table_header")
+ assert var.table_header is not None
+
+ # Table header should have required attributes
+ assert hasattr(var.table_header, "table_id")
+ assert hasattr(var.table_header, "approx_interval")
+ assert hasattr(var.table_header, "realm")
+
+ # Values should be correct
+ assert var.table_header.table_id == "Omon"
+ assert var.table_header.approx_interval == 30.0
+ assert var.table_header.realm == ["ocean"]
+
+ def test_synthetic_header_has_all_required_attributes(self):
+ """Test that synthetic headers have all attributes needed by downstream code."""
+ var_dict = {
+ "frequency": "mon",
+ "modeling_realm": "ocean",
+ }
+
+ header = CMIP7DataRequestTableHeader.from_variable_metadata(var_dict)
+
+ # Attributes used by timeaverage.py
+ assert hasattr(header, "approx_interval")
+ assert header.approx_interval is not None
+
+ # Attributes used by files.py and global_attributes.py
+ assert hasattr(header, "table_id")
+ assert header.table_id is not None
+
+ # Attributes used by global_attributes.py
+ assert hasattr(header, "realm")
+ assert header.realm is not None
+
+ # Generic levels (may be empty for synthetic headers)
+ assert hasattr(header, "generic_levels")
+
+
+class TestCMIP7IntegrationWithoutCMIP6Table:
+ """Integration tests for full workflow without cmip6_table field."""
+
+ def test_full_loading_without_cmip6_table(self):
+ """Test complete DataRequest loading with pure CMIP7 metadata."""
+ test_data = {
+ "Compound Name": {
+ "ocean.tos.tavg-u-hxy-sea.mon.GLB": {
+ "out_name": "tos",
+ "frequency": "mon",
+ "modeling_realm": "ocean",
+ "units": "degC",
+ "cell_methods": "area: mean time: mean",
+ "cell_measures": "area: areacello",
+ "long_name": "Sea Surface Temperature",
+ "comment": "Pure CMIP7 metadata",
+ "dimensions": "longitude latitude time",
+ "type": "real",
+ "positive": "",
+ "spatial_shape": "XY",
+ "temporal_shape": "T",
+ },
+ "atmos.tas.tavg-u-hxy-land.mon.GLB": {
+ "out_name": "tas",
+ "frequency": "mon",
+ "modeling_realm": "atmos",
+ "units": "K",
+ "cell_methods": "area: mean time: mean",
+ "cell_measures": "area: areacella",
+ "long_name": "Near-Surface Air Temperature",
+ "comment": "Pure CMIP7 metadata",
+ "dimensions": "longitude latitude time",
+ "type": "real",
+ "positive": "",
+ "spatial_shape": "XY",
+ "temporal_shape": "T",
+ },
+ }
+ }
+
+ # Should load without errors
+ dreq = CMIP7DataRequest.from_all_var_info(test_data)
+
+ # Should have 2 variables
+ assert len(dreq.variables) == 2
+
+ # Both variables should have synthetic table headers
+ for var_name, var in dreq.variables.items():
+ assert hasattr(var, "table_header")
+ assert var.table_header is not None
+ assert var.table_header.approx_interval is not None
+ assert var.table_header.table_id is not None
+
+ # Tables dict may be empty (acceptable for pure CMIP7)
+ assert isinstance(dreq.tables, dict)
+
+
+if __name__ == "__main__":
+ pytest.main([__file__, "-v"])