Skip to content

Include the l, ln and ml scenarios and tighten PBS requests - #167

Open
paul-leopardi wants to merge 4 commits into
mainfrom
166-scen7-l-ln-and-ml
Open

paul-leopardi wants to merge 4 commits into
mainfrom
166-scen7-l-ln-and-ml

Conversation

@paul-leopardi

@paul-leopardi paul-leopardi commented Oct 9, 2026 •

Copy link
Copy Markdown
Collaborator

Closes #166 by adding the l, ln and ml ScenarioMIP forcings. Also reduces the requested walltime and memory in all PBS jobs.

The changes are AI-assisted, using Google Antigravity and Google Gemini models.

@paul-leopardi

Copy link
Copy Markdown
Collaborator Author

I successfully ran the workflow twice, as run2 and run3.

For run2, before f6bc441:

For run3, after f6bc441:

@penguian
penguian added this pull request to stack #168 October 12, 2026 03:27
@MartinDix

Copy link
Copy Markdown
Collaborator

CO2 emissions look correct
co2_emissions_scenario
co2_2100_l
co2_2100_ln
co2_2100_ml

@MartinDix

Copy link
Copy Markdown
Collaborator

Ozone looks ok
ozone_80S_scen
ozone_scen_timeseries
ozone_scen_2100

@MartinDix

Copy link
Copy Markdown
Collaborator

Nitrogen look ok
nitrogen_scenarios

@blimlim

blimlim commented Oct 13, 2026

Copy link
Copy Markdown
Collaborator

I'd missed this in the last review but it's relevant here too. The GHGs in the namelist all finish in 2150: https://github.com/ACCESS-NRI/access-esm1.6-configs/blob/401b65672c35adbcc9e9060cd0fb4227e8a9e2b9/atmosphere/namelists#L1072-L1074

As @MartinDix noted here, we actually need an additional year of data for the UM's interpolation of the GHGs to work properly in the final year. @paul-leopardi, are you able to include 2151 in the GHG output?

Otherwise, the actual data in the namelists looks good:

download-93 download-92 download-91

Comment on lines +392 to +394
'l': 'FZJ-CMIP-ozone-l-2-0',
'ln': 'FZJ-CMIP-ozone-ln-2-0',
'ml': 'FZJ-CMIP-ozone-ml-2-0',}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

It looks like only the version 2-0 zmta data is available for the 3 new scenarios - is that correct?

Also just wanted to confirm, does the note here have any implications for our processing:

The meaning is unchanged from the v1.0 files. However values which were set to NaN in the v1.0 files because they were below the Earth's surface have been set to the surface values in v2.0. Please be aware of this when processing the files.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

I have just searched https://esgf-node.ornl.gov/search?project=input4MIPs and have confirmed that only the version 2.0 zmta data is available for the 3 new scenarios.

The zmta values are dealt with in the UKMO code as amended for nci-gadi. The code does not explictly tests for NaN values, but Iris itself may propagate them. It is therefore better not to have unmasked NaN values in any NetCDF file read by Iris, especially when Iris cubes obtained from that file are used in interpolation.

I will try running with the 2.0 files for the h, hl, m and vl forcings, to see if that makes a difference to the resulting .anc files.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

I have run the workflow again using the 2.0 files for the h, hl, m and vl forcings, and the output differs for those forcings now.

Logs are in /scratch/tm70/pcl851/cylc-run/cmip7-esm1p6-scen7-l-ln-ml/run5/log/.

Output is in /g/data/tm70/pcl851/CMIP7/esm1p6_ancil/2026.10.20

[pcl851@gadi-login-08 ~]$ for f in $files20; do g=${f//10.20/10.09}; ls $f; mule-cumf --stashmaster 7.3 --summary $f $g; done
/g/data/tm70/pcl851/CMIP7/esm1p6_ancil/2026.10.20/modern/scen7-h/atmosphere/forcing/global.N96/2026.10.20/ozone_h_2022_2150_cmip7.anc
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
* (CUMF-II) Module Information *
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

mule       : /g/data/access/projects/access/apps/pythonlib/mule_python3/2026.03.2/mule_lib_intel_python3/mule/__init__.py (version 2025.10.1)
um_utils   : /g/data/access/projects/access/apps/pythonlib/mule_python3/2026.03.2/mule_lib_intel_python3/um_utils/__init__.py (version 2025.10.1)
um_packing : /g/data/access/projects/access/apps/pythonlib/mule_python3/2026.03.2/mule_lib_intel_python3/um_packing/__init__.py (version 2025.10.1) (packing lib from SHUMlib: 2024111)


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
* CUMF-II Comparison Report *
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

File 1: /g/data/tm70/pcl851/CMIP7/esm1p6_ancil/2026.10.20/modern/scen7-h/atmosphere/forcing/global.N96/2026.10.20/ozone_h_2022_2150_cmip7.anc
File 2: /g/data/tm70/pcl851/CMIP7/esm1p6_ancil/2026.10.09/modern/scen7-h/atmosphere/forcing/global.N96/2026.10.09/ozone_h_2022_2150_cmip7.anc
Files DO NOT compare
  * 0 differences in fixed_length_header (with 7 ignored indices)
  * 59128 field differences, of which 59128 are in data

Compared 59736/59736 fields, with 608 matches

Maximum RMS diff as % of data in file 1: 45.846706180299726 (field 17917)
Maximum RMS diff as % of data in file 2: 37.970776184645203 (field 17917)

/g/data/tm70/pcl851/CMIP7/esm1p6_ancil/2026.10.20/modern/scen7-hl/atmosphere/forcing/global.N96/2026.10.20/ozone_hl_2022_2150_cmip7.anc
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
* (CUMF-II) Module Information *
...
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
* CUMF-II Comparison Report *
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

File 1: /g/data/tm70/pcl851/CMIP7/esm1p6_ancil/2026.10.20/modern/scen7-hl/atmosphere/forcing/global.N96/2026.10.20/ozone_hl_2022_2150_cmip7.anc
File 2: /g/data/tm70/pcl851/CMIP7/esm1p6_ancil/2026.10.09/modern/scen7-hl/atmosphere/forcing/global.N96/2026.10.09/ozone_hl_2022_2150_cmip7.anc
Files DO NOT compare
  * 0 differences in fixed_length_header (with 7 ignored indices)
  * 59546 field differences, of which 59546 are in data

Compared 59736/59736 fields, with 190 matches

Maximum RMS diff as % of data in file 1: 48.705590113357935 (field 32054)
Maximum RMS diff as % of data in file 2: 39.549670034255882 (field 34488)

/g/data/tm70/pcl851/CMIP7/esm1p6_ancil/2026.10.20/modern/scen7-l/atmosphere/forcing/global.N96/2026.10.20/ozone_l_2022_2150_cmip7.anc
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
* (CUMF-II) Module Information *
...
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
* CUMF-II Comparison Report *
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

File 1: /g/data/tm70/pcl851/CMIP7/esm1p6_ancil/2026.10.20/modern/scen7-l/atmosphere/forcing/global.N96/2026.10.20/ozone_l_2022_2150_cmip7.anc
File 2: /g/data/tm70/pcl851/CMIP7/esm1p6_ancil/2026.10.09/modern/scen7-l/atmosphere/forcing/global.N96/2026.10.09/ozone_l_2022_2150_cmip7.anc
Files compare
  * 0 differences in fixed_length_header (with 7 ignored indices)
  * 0 field differences, of which 0 are in data

Compared 59736/59736 fields, with 59736 matches

/g/data/tm70/pcl851/CMIP7/esm1p6_ancil/2026.10.20/modern/scen7-ln/atmosphere/forcing/global.N96/2026.10.20/ozone_ln_2022_2150_cmip7.anc
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
* (CUMF-II) Module Information *
...
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
* CUMF-II Comparison Report *
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

File 1: /g/data/tm70/pcl851/CMIP7/esm1p6_ancil/2026.10.20/modern/scen7-ln/atmosphere/forcing/global.N96/2026.10.20/ozone_ln_2022_2150_cmip7.anc
File 2: /g/data/tm70/pcl851/CMIP7/esm1p6_ancil/2026.10.09/modern/scen7-ln/atmosphere/forcing/global.N96/2026.10.09/ozone_ln_2022_2150_cmip7.anc
Files compare
  * 0 differences in fixed_length_header (with 7 ignored indices)
  * 0 field differences, of which 0 are in data

Compared 59736/59736 fields, with 59736 matches

/g/data/tm70/pcl851/CMIP7/esm1p6_ancil/2026.10.20/modern/scen7-m/atmosphere/forcing/global.N96/2026.10.20/ozone_m_2022_2150_cmip7.anc
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
* (CUMF-II) Module Information *
...
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
* CUMF-II Comparison Report *
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

File 1: /g/data/tm70/pcl851/CMIP7/esm1p6_ancil/2026.10.20/modern/scen7-m/atmosphere/forcing/global.N96/2026.10.20/ozone_m_2022_2150_cmip7.anc
File 2: /g/data/tm70/pcl851/CMIP7/esm1p6_ancil/2026.10.09/modern/scen7-m/atmosphere/forcing/global.N96/2026.10.09/ozone_m_2022_2150_cmip7.anc
Files DO NOT compare
  * 0 differences in fixed_length_header (with 7 ignored indices)
  * 57456 field differences, of which 57456 are in data

Compared 59736/59736 fields, with 2280 matches

Maximum RMS diff as % of data in file 1: 47.001714729616459 (field 24456)
Maximum RMS diff as % of data in file 2: 38.683370000147818 (field 24456)

/g/data/tm70/pcl851/CMIP7/esm1p6_ancil/2026.10.20/modern/scen7-ml/atmosphere/forcing/global.N96/2026.10.20/ozone_ml_2022_2150_cmip7.anc
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
* (CUMF-II) Module Information *
...
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
* CUMF-II Comparison Report *
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

File 1: /g/data/tm70/pcl851/CMIP7/esm1p6_ancil/2026.10.20/modern/scen7-ml/atmosphere/forcing/global.N96/2026.10.20/ozone_ml_2022_2150_cmip7.anc
File 2: /g/data/tm70/pcl851/CMIP7/esm1p6_ancil/2026.10.09/modern/scen7-ml/atmosphere/forcing/global.N96/2026.10.09/ozone_ml_2022_2150_cmip7.anc
Files compare
  * 0 differences in fixed_length_header (with 7 ignored indices)
  * 0 field differences, of which 0 are in data

Compared 59736/59736 fields, with 59736 matches

/g/data/tm70/pcl851/CMIP7/esm1p6_ancil/2026.10.20/modern/scen7-vl/atmosphere/forcing/global.N96/2026.10.20/ozone_vl_2022_2150_cmip7.anc
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
* (CUMF-II) Module Information *
...
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
* CUMF-II Comparison Report *
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

File 1: /g/data/tm70/pcl851/CMIP7/esm1p6_ancil/2026.10.20/modern/scen7-vl/atmosphere/forcing/global.N96/2026.10.20/ozone_vl_2022_2150_cmip7.anc
File 2: /g/data/tm70/pcl851/CMIP7/esm1p6_ancil/2026.10.09/modern/scen7-vl/atmosphere/forcing/global.N96/2026.10.09/ozone_vl_2022_2150_cmip7.anc
Files DO NOT compare
  * 0 differences in fixed_length_header (with 7 ignored indices)
  * 59736 field differences, of which 59736 are in data

Compared 59736/59736 fields, with 0 matches

Maximum RMS diff as % of data in file 1: 59.72826856171033  (field 25669)
Maximum RMS diff as % of data in file 2: 45.253260318252501 (field 25669)

@MartinDix

Copy link
Copy Markdown
Collaborator

Aerosols look ok

inew inew

SO2

so2_2150_all

Black carbon
bc_2150_all

Organic carbon
oc_2150_all

Biomass burning
bb_2150_all

@penguian
penguian removed this pull request from stack #168 October 22, 2026 03:48
@paul-leopardi
paul-leopardi added this pull request to stack #173 October 22, 2026 03:57
@blimlim

blimlim commented Oct 22, 2026

Copy link
Copy Markdown
Collaborator

Thanks @paul-leopardi for rerunning the h, m, l, and vl ozone with the 2-0 zmta file. I've been looking into the reported differences between the two versions for the h scenario.

Differences in zmta files

As noted on the input4mips page:

The meaning is unchanged from the v1.0 files. However values which were set to NaN in the v1.0 files because they were below the Earth's surface have been set to the surface values in v2.0. Please be aware of this when processing the files.

Other than the differences in missing values, the 2-0 and 1-0 zmta files have different values at some of the points near antarctica, and the differences can be quite large:

download-78

Above ~600hpa and north of -50 degrees, the two files are identical. As a result, the differences should only affect the resulting ozone above Antarctica.

Differences in heights for interpolation

The UKMO code uses the zmta data to estimate the altitude of the pressure levels in the ozone dataset, roughly by approximating the Δh of each level, and sequentially adding them up:

https://github.com/ACCESS-NRI/ancillary-file-science/blob/78264a2b739ae3a7c8f9fa540b594583e7261c4d/Projects/CMIP/CMIP7/ozone_ancil/site/nci-gadi/ozone_cmip6_ancillary_for_suite.py#L388-L426

In the first step, it calculates the heights of the level boundaries:

        z[:, i + 1, :] = z[:, i, :] + dlogp[i] * integrant.data[:, i, :]

Where integrant $\propto$ zmta. Because it's accumulating over the levels, I thought that an NaN in at one level would propagate to the rest of the column above it, but from inspecting the output values this is not the case, and z itself is not NaN anywhere:

    print("z")
    print(type(z))
    print(np.isnan(z).sum())

> z
> <class 'numpy.ndarray'>
> 0

It turns out z is a numpy.ndarray, while integrant.data is a np.ma.masked_array and that inserting values from a masked array into a np.ndarray doesn't preserve the masking. Printing out values from the script, z ends up as 0.0 at points where integrant.data is masked.

As a result, the 1-0 zmta data gives an altitude of zero at the surface of Antarctica, while the zmta calculates the altitude using a constant temperature below the surface (I'm not sure what's better here).

The following plots compare the z2_pressure_height from the ozone script for the 2-0 zmta data and the 1-0 data. This is the height calculated for the ozone data's pressure levels, after it has been interpolated to the ESM1.6 grid:

download-87

The different treatment of the underground levels leads to offsets up to 2000m over Antarctica.

Differences in resulting ozone forcings

As the calculated pressure level heights are used to interpolate the ozone data, the differences affect the final ozone ancillaries.

The following compares the 2100 total column ozone in the input4MIPs data, the ESM1.6 ancillary produced from the zmta-1-0 data and the ancillary produced from the zmta-2-0 data.

download-88

The differences can be quite large over the south pole. Currently working with @MartinDix to figure out how to best process the remaining datasets.

@paul-leopardi

Copy link
Copy Markdown
Collaborator Author

@blimlim @MartinDix It may be best to use the zmta-2-0 forcings for all scenarios, for the sake of accuracy and consistency.

@paul-leopardi

Copy link
Copy Markdown
Collaborator Author

See PCMDI/input4MIPs_CVs#490 for the request for 1.0 zmta datasets.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Produce ancillaries for the ACCESS-ESM1.6 ScenarioMIP l, ln and ml experiments

3 participants