Skip to content

Commit 539d3db

Browse files
authored
Merge pull request #25 from E3SM-Project/add-pcmdi
Add pcmdi
2 parents 98fa8dc + c430c3f commit 539d3db

24 files changed

+5597
-4
lines changed

.github/workflows/build_workflow.yml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ jobs:
5454
needs: check-jobs-to-skip
5555
if: ${{ needs.check-jobs-to-skip.outputs.should_skip != 'true' }}
5656
runs-on: ubuntu-latest
57+
timeout-minutes: 15
5758
strategy:
5859
matrix:
5960
python-version: ["3.11", "3.12", "3.13"]
@@ -79,7 +80,7 @@ jobs:
7980
miniforge-variant: Miniforge3
8081
miniforge-version: latest
8182
environment-file: conda/dev.yml
82-
channel-priority: flexible # Changed from strict to flexible
83+
channel-priority: strict
8384
auto-update-conda: true
8485
python-version: ${{ matrix.python-version }}
8586
channels: conda-forge
@@ -142,7 +143,7 @@ jobs:
142143
# miniforge-variant: Miniforge3
143144
# miniforge-version: latest
144145
# environment-file: conda/dev.yml
145-
# channel-priority: flexible # Changed from strict to flexible
146+
# channel-priority: strict
146147
# auto-update-conda: true
147148
# python-version: "3.13" # Use stable Python version for docs
148149

conda/dev.yml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,11 @@ dependencies:
1818
- beautifulsoup4
1919
- lxml
2020
- matplotlib-base >=3.8.2,<3.10
21-
- mpas_tools >=0.21.0
21+
- mpas_tools
2222
- netcdf4
2323
- numpy >=2.0,<3.0
2424
- output_viewer=1.3.3
25+
- pcmdi_metrics>=3.9.3
2526
- xarray >=2023.02.0
2627
- xcdat >=0.7.3,<1.0
2728
# Testing
@@ -40,10 +41,13 @@ dependencies:
4041
- black ==25.1.0
4142
- flake8 ==7.3.0
4243
- isort ==6.0.1
43-
- mypy ==1.18.2
44+
#- mypy ==1.18.2
4445
- pre-commit ==4.3.0
4546
- types-PyYAML >=6.0.0
4647
# Developer Tools
4748
# =======================
4849
- tbump=6.9.0
4950
- ipykernel
51+
# pip dependencies
52+
- pip:
53+
- mypy==1.18.2

pyproject.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ dependencies = [
2323
"matplotlib >=3.8.2,<3.10",
2424
"netcdf4",
2525
"numpy >=2.0,<3.0",
26+
"pcmdi_metrics>=3.9.3",
2627
"xarray >=2023.02.0",
2728
"xcdat >=0.7.3,<1.0",
2829
]
@@ -116,6 +117,11 @@ version = { attr = "zppy_interfaces.version.__version__" }
116117
# evolution of options.entry-points
117118
[project.scripts]
118119
zi-global-time-series = "zppy_interfaces.global_time_series.__main__:main"
120+
zi-pcmdi-link-observation = "zppy_interfaces.pcmdi_diags.link_observation:main"
121+
zi-pcmdi-mean-climate = "zppy_interfaces.pcmdi_diags.pcmdi_mean_cimate:main"
122+
zi-pcmdi-variability-modes = "zppy_interfaces.pcmdi_diags.pcmdi_variability_modes:main"
123+
zi-pcmdi-enso = "zppy_interfaces.pcmdi_diags.pcmdi_enso:main"
124+
zi-pcmdi-synthetic-plots = "zppy_interfaces.pcmdi_diags.pcmdi_synthetic_plots:main"
119125

120126
[project.urls]
121127
Documentation = "https://docs.e3sm.org/zppy-interfaces"
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
from typing import List
2+
3+
from zppy_interfaces.pcmdi_diags.pcmdi_mean_cimate import generate_mean_clim_cmds
4+
5+
6+
def test_generate_mean_clim_cmds():
7+
# Sample of mean_climate default vars in zppy/defaults/default.ini
8+
variables: List[str] = ["tauu", "tauv", "ta-200"]
9+
# Example: /lcrc/group/e3sm/ac.forsyth2/zppy_pr719_output/unique_id_48/v3.LR.amip_0101/post/scripts/tmp.pcmdi_diags_mean_climate_model_vs_obs_2005-2014.915900.07Jq/pcmdi_diags/climo_ref_mean_climate_catalogue.json
10+
obs_dic = {
11+
"tauu": {"set": "default"},
12+
"tauv": {"set": "default"},
13+
"ta": {"set": "default"}, # Not in the example json file above
14+
}
15+
# Example: Appears after "AC" in .nc files in /lcrc/group/e3sm/ac.forsyth2/zppy_pr719_output/unique_id_48/v3.LR.amip_0101/post/scripts/tmp.pcmdi_diags_mean_climate_model_vs_obs_2005-2014.915900.07Jq/climo
16+
case_id: str = "v20250923"
17+
actual = generate_mean_clim_cmds(
18+
variables=variables,
19+
obs_dic=obs_dic,
20+
case_id=case_id,
21+
)
22+
expected: List[str] = [
23+
"mean_climate_driver.py -p parameterfile.py --vars tauu -r default --case_id v20250923",
24+
"mean_climate_driver.py -p parameterfile.py --vars tauv -r default --case_id v20250923",
25+
"mean_climate_driver.py -p parameterfile.py --vars ta-200 -r default --case_id v20250923",
26+
]
27+
assert actual == expected
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from zppy_interfaces.pcmdi_diags.pcmdi_setup import (
2+
DataCatalogueBuilder,
3+
LandSeaMaskGenerator,
4+
)
5+
6+
7+
def test_DataCatalogueBuilder():
8+
dcb = DataCatalogueBuilder("", [], "", [], [], "", "")
9+
10+
assert dcb._get_base_varname("ta-200") == "ta"
11+
assert dcb._get_base_varname("ta_200") == "ta"
12+
assert dcb._get_base_varname("pr") == "pr"
13+
14+
15+
def test_LandSeaMaskGenerator():
16+
lsmg = LandSeaMaskGenerator("", "", "", "")
17+
assert lsmg._parse_flag("True")
18+
assert lsmg._parse_flag("Y")
19+
assert lsmg._parse_flag("Yes")
20+
assert lsmg._parse_flag("true")
21+
assert lsmg._parse_flag("y")
22+
assert lsmg._parse_flag("yes")
23+
assert not lsmg._parse_flag("False")
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
from zppy_interfaces.pcmdi_diags.pcmdi_variability_modes import (
2+
VariabilityMetricsCollector,
3+
generate_varmode_cmds,
4+
)
5+
6+
7+
def test_VariabilityMetricsCollector():
8+
vmc = VariabilityMetricsCollector(
9+
["mode"],
10+
"png",
11+
"mip",
12+
"exp",
13+
"model",
14+
"relm",
15+
"v20250923",
16+
"dir_%(metric_type)",
17+
"",
18+
)
19+
assert vmc.input_dir == "dir_variability_modes"
20+
assert vmc.model_name == "mip.exp.model_relm"
21+
assert vmc.seasons == ["DJF", "MAM", "JJA", "SON", "yearly", "monthly"]
22+
assert vmc.fig_sets["MOV_eoftest"] == ["diagnostic_results", "EG_Spec*"]
23+
assert vmc.fig_sets["MOV_compose"] == ["graphics", "*compare_obs"]
24+
assert vmc.fig_sets["MOV_telecon"] == ["graphics", "*teleconnection"]
25+
assert vmc.fig_sets["MOV_pattern"] == ["graphics", "*"]
26+
assert (
27+
vmc._classify_output_name("graphics", "mode", "DJF", "invalid.txt")
28+
== "graphics_mode_DJF_unknown.png"
29+
)
30+
assert (
31+
vmc._classify_output_name("graphics", "mode", "DJF", "North_test.txt")
32+
== "graphics_mode_DJF_EG_Spec.png"
33+
)
34+
assert (
35+
vmc._classify_output_name("graphics", "mode", "DJF", "_cbf_.txt")
36+
== "graphics_mode_DJF_cbf.png"
37+
)
38+
assert (
39+
vmc._classify_output_name("graphics", "mode", "DJF", "EOF1.txt")
40+
== "graphics_mode_DJF_eof1.png"
41+
)
42+
assert (
43+
vmc._classify_output_name("graphics", "mode", "DJF", "EOF2.txt")
44+
== "graphics_mode_DJF_eof2.png"
45+
)
46+
assert (
47+
vmc._classify_output_name("graphics", "mode", "DJF", "EOF3.txt")
48+
== "graphics_mode_DJF_eof3.png"
49+
)
50+
51+
52+
def test_generate_varmode_cmds():
53+
actual = generate_varmode_cmds(
54+
["mode1", "mode2"],
55+
"varOBS",
56+
"reftyrs",
57+
"reftyre",
58+
"refname",
59+
"refpath",
60+
"v20250923",
61+
)
62+
expected = [
63+
"variability_modes_driver.py -p parameterfile.py --variability_mode mode1 --eofn_mod 1 --eofn_obs 1 --varOBS varOBS --osyear reftyrs --oeyear reftyre --reference_data_name refname --reference_data_path refpath --case_id v20250923",
64+
"variability_modes_driver.py -p parameterfile.py --variability_mode mode2 --eofn_mod 1 --eofn_obs 1 --varOBS varOBS --osyear reftyrs --oeyear reftyre --reference_data_name refname --reference_data_path refpath --case_id v20250923",
65+
]
66+
assert actual == expected
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from zppy_interfaces.pcmdi_diags.synthetic_plots.utils import get_highlight_models
2+
3+
4+
def test_get_highlight_models():
5+
all_models = [
6+
"CESM2-FV2",
7+
"CESM2-WACCM",
8+
"CESM2-WACCM-FV2",
9+
"GFDL-AM4",
10+
"GFDL-CM4",
11+
"GFDL-ESM4",
12+
"E3SM-1-0",
13+
"E3SM-2-0",
14+
]
15+
model_name = ["CESM2-FV2", "E3SM"]
16+
actual = get_highlight_models(all_models, model_name)
17+
expected = [
18+
"E3SM-1-0",
19+
"E3SM-2-0",
20+
"CESM2-FV2",
21+
]
22+
assert actual == expected
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from zppy_interfaces.pcmdi_diags.viewer import safe_join
2+
3+
4+
def test_safe_join():
5+
assert safe_join("a", "b") == "a/b"
6+
assert safe_join("a/", "b") == "a/b"

zppy_interfaces/pcmdi_diags/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)