diff --git a/changelog/473.feature.md b/changelog/473.feature.md new file mode 100644 index 000000000..23b2982f8 --- /dev/null +++ b/changelog/473.feature.md @@ -0,0 +1 @@ +Added ESMValTool ozone diagnostics. diff --git a/packages/climate-ref-core/src/climate_ref_core/data/cmip6_cmip7_variable_map.json b/packages/climate-ref-core/src/climate_ref_core/data/cmip6_cmip7_variable_map.json index bd179da7f..b465080c2 100644 --- a/packages/climate-ref-core/src/climate_ref_core/data/cmip6_cmip7_variable_map.json +++ b/packages/climate-ref-core/src/climate_ref_core/data/cmip6_cmip7_variable_map.json @@ -5,6 +5,36 @@ "description": "CMIP6-to-CMIP7 variable mappings extracted from the CMIP7 Data Request. Filtered to mon/fx tables and variables used by REF providers. Keyed by CMIP6 compound name (table_id.variable_id). Regenerate with: uv run python scripts/extract-data-request-mappings.py " }, "variables": { + "AERmon.o3": { + "table_id": "AERmon", + "variable_id": "o3", + "cmip6_compound_name": "AERmon.o3", + "cmip7_compound_name": "atmosChem.o3.tavg-al-hxy-u.mon.glb", + "branded_variable": "o3_tavg-al-hxy-u", + "branding_suffix": "tavg-al-hxy-u", + "temporal_label": "tavg", + "vertical_label": "al", + "horizontal_label": "hxy", + "area_label": "u", + "realm": "atmosChem", + "region": "glb", + "frequency": "mon" + }, + "AERmon.o3inst": { + "table_id": "AERmon", + "variable_id": "o3", + "cmip6_compound_name": "AERmon.o3inst", + "cmip7_compound_name": "atmosChem.o3.tpt-al-hxy-u.mon.glb", + "branded_variable": "o3_tpt-al-hxy-u", + "branding_suffix": "tpt-al-hxy-u", + "temporal_label": "tpt", + "vertical_label": "al", + "horizontal_label": "hxy", + "area_label": "u", + "realm": "atmosChem aerosol", + "region": "glb", + "frequency": "mon" + }, "AERmon.toz": { "table_id": "AERmon", "variable_id": "toz", @@ -65,6 +95,21 @@ "region": "glb", "frequency": "mon" }, + "AERmonZ.o3": { + "table_id": "AERmonZ", + "variable_id": "o3", + "cmip6_compound_name": "AERmonZ.o3", + "cmip7_compound_name": "atmosChem.o3.tavg-p39-hy-air.mon.glb", + "branded_variable": "o3_tavg-p39-hy-air", + "branding_suffix": "tavg-p39-hy-air", + "temporal_label": "tavg", + "vertical_label": "p39", + "horizontal_label": "hy", + "area_label": "air", + "realm": "atmosChem", + "region": "glb", + "frequency": "mon" + }, "AERmonZ.ta": { "table_id": "AERmonZ", "variable_id": "ta", @@ -395,6 +440,36 @@ "region": "30S-90S", "frequency": "mon" }, + "Amon.o3": { + "table_id": "Amon", + "variable_id": "o3", + "cmip6_compound_name": "Amon.o3", + "cmip7_compound_name": "atmosChem.o3.tavg-p19-hxy-air.mon.glb", + "branded_variable": "o3_tavg-p19-hxy-air", + "branding_suffix": "tavg-p19-hxy-air", + "temporal_label": "tavg", + "vertical_label": "p19", + "horizontal_label": "hxy", + "area_label": "air", + "realm": "atmosChem", + "region": "glb", + "frequency": "mon" + }, + "Amon.o3Clim": { + "table_id": "Amon", + "variable_id": "o3", + "cmip6_compound_name": "Amon.o3Clim", + "cmip7_compound_name": "atmosChem.o3.tclm-p19-hxy-air.mon.glb", + "branded_variable": "o3_tclm-p19-hxy-air", + "branding_suffix": "tclm-p19-hxy-air", + "temporal_label": "tclm", + "vertical_label": "p19", + "horizontal_label": "hxy", + "area_label": "air", + "realm": "atmosChem", + "region": "glb", + "frequency": "mon" + }, "Amon.pr": { "table_id": "Amon", "variable_id": "pr", diff --git a/packages/climate-ref-core/src/climate_ref_core/esgf/obs4mips.py b/packages/climate-ref-core/src/climate_ref_core/esgf/obs4mips.py index fe1609d5f..337d67c61 100644 --- a/packages/climate-ref-core/src/climate_ref_core/esgf/obs4mips.py +++ b/packages/climate-ref-core/src/climate_ref_core/esgf/obs4mips.py @@ -71,7 +71,7 @@ def __init__( Optional time range filter (start, end) in YYYY-MM format """ self.slug = slug - self.facets = facets + self.facets = {"project": "obs4MIPs", **facets} self.remove_ensembles = remove_ensembles self.time_span = time_span diff --git a/packages/climate-ref-core/tests/unit/esgf/test_obs4mips.py b/packages/climate-ref-core/tests/unit/esgf/test_obs4mips.py index 73d84ce8d..98a0700dd 100644 --- a/packages/climate-ref-core/tests/unit/esgf/test_obs4mips.py +++ b/packages/climate-ref-core/tests/unit/esgf/test_obs4mips.py @@ -15,7 +15,11 @@ def test_init_basic(self): facets={"source_id": "GPCP-SG", "variable_id": "pr"}, ) assert request.slug == "test-obs" - assert request.facets == {"source_id": "GPCP-SG", "variable_id": "pr"} + assert request.facets == { + "project": "obs4MIPs", + "source_id": "GPCP-SG", + "variable_id": "pr", + } assert request.remove_ensembles is False assert request.time_span is None assert request.source_type == "obs4MIPs" diff --git a/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/dataset_registry/data.txt b/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/dataset_registry/data.txt index f1744d279..94ce67251 100644 --- a/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/dataset_registry/data.txt +++ b/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/dataset_registry/data.txt @@ -80,6 +80,7 @@ ESMValTool/OBS/Tier2/ESACCI-CLOUD/OBS_ESACCI-CLOUD_sat_AVHRR-AMPM-fv3.0_Amon_rlu ESMValTool/OBS/Tier2/ESACCI-CLOUD/OBS_ESACCI-CLOUD_sat_AVHRR-AMPM-fv3.0_Amon_rlutcs_198201-201612.nc 21f096ecafff659e5c7e3338060425f7194e5d1b39c9510865496e04ecac3d75 ESMValTool/OBS/Tier2/ESACCI-CLOUD/OBS_ESACCI-CLOUD_sat_AVHRR-AMPM-fv3.0_Amon_rsut_198201-201612.nc f2c3f3afcdc2e730df7985c210a3de89b0d4f83b150e0c3846f7ac3c5fa9c54a ESMValTool/OBS/Tier2/ESACCI-CLOUD/OBS_ESACCI-CLOUD_sat_AVHRR-AMPM-fv3.0_Amon_rsutcs_198201-201612.nc d180d3140d4c1f6b9bb1960e07b45f192643f047e7c272c8c8c7070296ca3ab7 +ESMValTool/OBS/Tier2/ESACCI-OZONE/OBS6_ESACCI-OZONE_sat_L3_AERmon_o3_198410-202212.nc 7ed9446b66e3b8382df4b6ce3074499a9ad00b7173a784c95df289fc9971ce69 ESMValTool/OBS/Tier2/HadCRUT5/OBS_HadCRUT5_ground_5.0.1.0-analysis_Amon_tas_185001-202112.nc edc3ee50b942dfbeccfd58b574df3393555379c2de3418c9717ac11dbafc12fc ESMValTool/OBS/Tier2/ISCCP-FH/OBS_ISCCP-FH_sat_v0_Amon_rlut_198401-201612.nc 650b347df432f6e5f3f693310aad695a7502f2905ac545753c7d4ccb0592adbe ESMValTool/OBS/Tier2/ISCCP-FH/OBS_ISCCP-FH_sat_v0_Amon_rlutcs_198401-201612.nc a90d9e035447f8778a2f64362411c079536d9dea559f6d53d032710b2c9b00e3 diff --git a/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/__init__.py b/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/__init__.py index 6ed1dac88..3d88468c6 100644 --- a/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/__init__.py +++ b/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/__init__.py @@ -13,6 +13,13 @@ from climate_ref_esmvaltool.diagnostics.ecs import EquilibriumClimateSensitivity from climate_ref_esmvaltool.diagnostics.enso import ENSOBasicClimatology, ENSOCharacteristics from climate_ref_esmvaltool.diagnostics.example import GlobalMeanTimeseries +from climate_ref_esmvaltool.diagnostics.ozone import ( + O3LatMonthMapplot, + O3LatTimeMapplot, + O3PolarCapTimeseriesNH, + O3PolarCapTimeseriesSH, + O3ZonalMeanProfiles, +) from climate_ref_esmvaltool.diagnostics.regional_historical_changes import ( RegionalHistoricalAnnualCycle, RegionalHistoricalTimeSeries, @@ -37,6 +44,11 @@ "ENSOCharacteristics", "EquilibriumClimateSensitivity", "GlobalMeanTimeseries", + "O3LatMonthMapplot", + "O3LatTimeMapplot", + "O3PolarCapTimeseriesNH", + "O3PolarCapTimeseriesSH", + "O3ZonalMeanProfiles", "RegionalHistoricalAnnualCycle", "RegionalHistoricalTimeSeries", "RegionalHistoricalTrend", diff --git a/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/ozone.py b/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/ozone.py new file mode 100644 index 000000000..bdd239a41 --- /dev/null +++ b/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/ozone.py @@ -0,0 +1,377 @@ +import pandas + +from climate_ref_core.constraints import ( + AddSupplementaryDataset, + PartialDateTime, + RequireContiguousTimerange, + RequireTimerange, +) +from climate_ref_core.datasets import FacetFilter, SourceDatasetType +from climate_ref_core.diagnostics import DataRequirement +from climate_ref_core.esgf.cmip6 import CMIP6Request +from climate_ref_core.esgf.cmip7 import CMIP7Request +from climate_ref_core.esgf.obs4mips import Obs4MIPsRequest +from climate_ref_core.testing import TestCase, TestDataSpecification +from climate_ref_esmvaltool.diagnostics.base import ESMValToolDiagnostic, get_cmip_source_type +from climate_ref_esmvaltool.recipe import dataframe_to_recipe +from climate_ref_esmvaltool.types import Recipe + +ozone_obs_filter = FacetFilter( + facets={ + "variable_id": "toz", + "source_id": "C3S-GTO-ECV-9-0", + "frequency": "mon", + }, +) + +toz_data_requirement = ( + ( + DataRequirement( + source_type=SourceDatasetType.CMIP6, + filters=( + FacetFilter( + facets={ + "variable_id": "toz", + "experiment_id": "historical", + "table_id": "AERmon", + }, + ), + ), + group_by=("source_id", "member_id", "grid_label"), + constraints=( + RequireTimerange( + group_by=("instance_id",), + start=PartialDateTime(1996, 1), + end=PartialDateTime(2014, 12), + ), + RequireContiguousTimerange(group_by=("instance_id",)), + AddSupplementaryDataset.from_defaults("areacella", SourceDatasetType.CMIP6), + ), + ), + DataRequirement( + source_type=SourceDatasetType.obs4MIPs, + filters=(ozone_obs_filter,), + group_by=("source_id",), + constraints=( + RequireTimerange( + group_by=("instance_id",), + start=PartialDateTime(1996, 1), + end=PartialDateTime(2014, 12), + ), + ), + ), + ), + ( + DataRequirement( + source_type=SourceDatasetType.CMIP7, + filters=( + FacetFilter( + facets={ + "variable_id": "toz", + "experiment_id": "historical", + "branded_variable": "toz_tavg-u-hxy-u", + "frequency": "mon", + "region": "glb", + }, + ), + ), + group_by=("source_id", "variant_label", "grid_label"), + constraints=( + RequireTimerange( + group_by=("instance_id",), + start=PartialDateTime(1996, 1), + end=PartialDateTime(2014, 12), + ), + RequireContiguousTimerange(group_by=("instance_id",)), + AddSupplementaryDataset.from_defaults("areacella", SourceDatasetType.CMIP7), + ), + ), + DataRequirement( + source_type=SourceDatasetType.obs4MIPs, + filters=(ozone_obs_filter,), + group_by=("source_id",), + constraints=( + RequireTimerange( + group_by=("instance_id",), + start=PartialDateTime(1996, 1), + end=PartialDateTime(2014, 12), + ), + ), + ), + ), +) +toz_test_spec = TestDataSpecification( + test_cases=( + TestCase( + name="cmip6", + description="Test with CMIP6 data.", + requests=( + CMIP6Request( + slug="cmip6", + facets={ + "experiment_id": "historical", + "frequency": "mon", + "source_id": "GFDL-ESM4", + "variable_id": "toz", + }, + remove_ensembles=True, + time_span=("1996", "2015"), + ), + Obs4MIPsRequest( + slug="obs4mips", + facets=ozone_obs_filter.facets, + remove_ensembles=False, + time_span=("1980", "2009"), + ), + ), + ), + TestCase( + name="cmip7", + description="Test with CMIP7 data.", + requests=( + CMIP7Request( + slug="cmip7", + facets={ + "experiment_id": ["historical"], + "source_id": "GFDL-ESM4", + "variable_id": "toz", + "branded_variable": [ + "toz_tavg-u-hxy-u", + ], + "variant_label": "r1i1p1f1", + "frequency": ["fx", "mon"], + "region": "glb", + }, + remove_ensembles=True, + time_span=("1980", "2009"), + ), + Obs4MIPsRequest( + slug="obs4mips", + facets=ozone_obs_filter.facets, + remove_ensembles=False, + time_span=("1980", "2009"), + ), + ), + ), + ), +) + + +class O3LatTimeMapplot(ESMValToolDiagnostic): + """ + Calculate the ozone diagnostics - zonal mean total column ozone vs. time. + """ + + name = "Ozone Diagnostics" + slug = "ozone-lat-time" + base_recipe = "ref/recipe_ref_ozone.yml" + + data_requirements = toz_data_requirement + facets = () + test_data_spec = toz_test_spec + + @staticmethod + def update_recipe( + recipe: Recipe, + input_files: dict[SourceDatasetType, pandas.DataFrame], + ) -> None: + """Update the recipe.""" + recipe_variables = dataframe_to_recipe(input_files[get_cmip_source_type(input_files)]) + dataset = recipe_variables["toz"]["additional_datasets"][0] + # set time range of model (CMIP6) dataset (should match observational period) + dataset["timerange"] = "1996/2014" + recipe["datasets"] = [dataset] + diagnostic = "lat_time_mapplot" + recipe["diagnostics"] = {diagnostic: recipe["diagnostics"][diagnostic]} + recipe["diagnostics"][diagnostic]["variables"]["toz"]["timerange"] = "1996/2014" + + +class O3PolarCapTimeseriesSH(ESMValToolDiagnostic): + """ + Calculate the ozone diagnostics - October SH polar mean (60S-85S) time series. + """ + + name = "Ozone Diagnostics" + slug = "ozone-sh-oct" + base_recipe = "ref/recipe_ref_ozone.yml" + + data_requirements = toz_data_requirement + facets = () + test_data_spec = toz_test_spec + + @staticmethod + def update_recipe( + recipe: Recipe, + input_files: dict[SourceDatasetType, pandas.DataFrame], + ) -> None: + """Update the recipe.""" + recipe_variables = dataframe_to_recipe(input_files[get_cmip_source_type(input_files)]) + dataset = recipe_variables["toz"]["additional_datasets"][0] + # set model (CMIP6) time range to 1950...2014 + dataset["timerange"] = "1950/2014" + recipe["datasets"] = [dataset] + diagnostic = "polar_cap_time_series_SH" + recipe["diagnostics"] = {diagnostic: recipe["diagnostics"][diagnostic]} + + +class O3PolarCapTimeseriesNH(ESMValToolDiagnostic): + """ + Calculate the ozone diagnostics - March NH polar mean (60N-80N) time series. + """ + + name = "Ozone Diagnostics" + slug = "ozone-nh-mar" + base_recipe = "ref/recipe_ref_ozone.yml" + + data_requirements = toz_data_requirement + facets = () + test_data_spec = toz_test_spec + + @staticmethod + def update_recipe( + recipe: Recipe, + input_files: dict[SourceDatasetType, pandas.DataFrame], + ) -> None: + """Update the recipe.""" + # Make sure only grid cells south of 80N are considered as there are no + # measurements north of 80N in March. Specifying 85N as northern boundary + # in the orignal 'recipe_ref_ozone.yml' is a bug! + recipe["preprocessors"]["create_time_series_NH"]["extract_region"]["end_latitude"] = 80 + recipe_variables = dataframe_to_recipe(input_files[get_cmip_source_type(input_files)]) + dataset = recipe_variables["toz"]["additional_datasets"][0] + # set model (CMIP6) time range to 1950...2014 + dataset["timerange"] = "1950/2014" + recipe["datasets"] = [dataset] + diagnostic = "polar_cap_time_series_NH" + # adjust plot title to reflect bug fix regarding northern boundary (see above) + recipe["diagnostics"][diagnostic]["scripts"]["plot"]["plots"]["timeseries"]["pyplot_kwargs"][ + "title" + ] = "Total Column Ozone, 60-80N, March" + recipe["diagnostics"] = {diagnostic: recipe["diagnostics"][diagnostic]} + + +class O3ZonalMeanProfiles(ESMValToolDiagnostic): + """ + Calculate the ozone diagnostics - stratospheric zonal mean profiles. + """ + + name = "Ozone Diagnostics" + slug = "ozone-zonal" + base_recipe = "ref/recipe_ref_ozone.yml" + + data_requirements = ( + DataRequirement( + source_type=SourceDatasetType.CMIP6, + filters=( + FacetFilter( + facets={ + "variable_id": "o3", + "experiment_id": "historical", + "table_id": "Amon", + }, + ), + ), + group_by=("source_id", "member_id", "grid_label"), + constraints=( + RequireTimerange( + group_by=("instance_id",), + start=PartialDateTime(2005, 1), + end=PartialDateTime(2014, 12), + ), + RequireContiguousTimerange(group_by=("instance_id",)), + ), + ), + # TODO: Use ESACCI-OZONE (SAGE-OMPS, variable o3) from obs4MIPs once available. + ) + facets = () + test_data_spec = TestDataSpecification( + test_cases=( + TestCase( + name="cmip6", + description="Test with CMIP6 data.", + requests=( + CMIP6Request( + slug="cmip6", + facets={ + "experiment_id": "historical", + "frequency": "mon", + "source_id": "GFDL-ESM4", + "variable_id": "o3", + }, + remove_ensembles=True, + time_span=("1996", "2015"), + ), + ), + ), + TestCase( + name="cmip7", + description="Test with CMIP7 data.", + requests=( + CMIP7Request( + slug="cmip7", + facets={ + "experiment_id": ["historical"], + "source_id": "GFDL-ESM4", + "variable_id": "o3", + "branded_variable": [ + "o3_tavg-al-hxy-u", + ], + "variant_label": "r1i1p1f1", + "frequency": ["fx", "mon"], + "region": "glb", + }, + remove_ensembles=True, + time_span=("1980", "2009"), + ), + ), + ), + ), + ) + + @staticmethod + def update_recipe( + recipe: Recipe, + input_files: dict[SourceDatasetType, pandas.DataFrame], + ) -> None: + """Update the recipe.""" + recipe_variables = dataframe_to_recipe(input_files[get_cmip_source_type(input_files)]) + dataset = recipe_variables["o3"]["additional_datasets"][0] + # set model (CMIP6) time range to 2005...2014 + dataset["timerange"] = "2005/2014" + recipe["datasets"] = [dataset] + diagnostic = "zonal_mean_profiles" + # adjust plot title to actual time range + recipe["diagnostics"][diagnostic]["scripts"]["plot"]["plots"]["zonal_mean_profile"]["pyplot_kwargs"][ + "suptitle" + ] = "{long_name} (2005-2014 mean)" + recipe["diagnostics"] = {diagnostic: recipe["diagnostics"][diagnostic]} + recipe["diagnostics"][diagnostic]["variables"]["o3"]["timerange"] = "2005/2014" + + +class O3LatMonthMapplot(ESMValToolDiagnostic): + """ + Calculate the ozone diagnostics - zonal mean total column ozone vs. annual cycle plot. + """ + + name = "Ozone Diagnostics" + slug = "ozone-annual-cycle" + base_recipe = "ref/recipe_ref_ozone.yml" + + data_requirements = toz_data_requirement + facets = () + test_data_spec = toz_test_spec + + @staticmethod + def update_recipe( + recipe: Recipe, + input_files: dict[SourceDatasetType, pandas.DataFrame], + ) -> None: + """Update the recipe.""" + recipe_variables = dataframe_to_recipe(input_files[get_cmip_source_type(input_files)]) + dataset = recipe_variables["toz"]["additional_datasets"][0] + # set model (CMIP6) time range to 2005...2014 + dataset["timerange"] = "2005/2014" + recipe["datasets"] = [dataset] + diagnostic = "lat_month_mapplot" + recipe["diagnostics"] = {diagnostic: recipe["diagnostics"][diagnostic]} + recipe["diagnostics"][diagnostic]["variables"]["toz"]["timerange"] = "2005/2014" diff --git a/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/recipes.txt b/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/recipes.txt index 27f0e9f82..6c4044b30 100644 --- a/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/recipes.txt +++ b/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/recipes.txt @@ -10,6 +10,7 @@ ref/recipe_enso_characteristics.yml 34c2518b138068ac96d212910b979d54a8fc ref/recipe_ref_annual_cycle_region.yml 88e0c2f07a76c4de4276547badcc74091516e03840eddb1f0e62469c67a0a86d ref/recipe_ref_cre.yml 4375f262479c3b3e1b348b71080a6d758e195bda76516a591182045a3a29aa32 ref/recipe_ref_fire.yml 2ad82effaca4e742d8abe6a0aa07bb46e1e92ef0d2d240760f7623b0ba045926 +ref/recipe_ref_ozone.yml 388aaf01721c0856ab7143b47b9d2f1efeaaae4ef57e11572c1e133b49aad0a6 ref/recipe_ref_sea_ice_area_basic.yml 7d01a8527880663ca28284772f83a8356d9972fb4f022a4000e50a56ce044b09 ref/recipe_ref_scatterplot.yml b99d1736e16256d161847b025811d7088ad9f892d4887fb009fa99c4079135a0 ref/recipe_ref_timeseries_region.yml deee4403ea25867401e163f6c9d7fcc4fee09d3088009007fcad6a29d01247a8 diff --git a/packages/climate-ref-esmvaltool/tests/integration/test_diagnostics.py b/packages/climate-ref-esmvaltool/tests/integration/test_diagnostics.py index 59e1e8a10..bd4022922 100644 --- a/packages/climate-ref-esmvaltool/tests/integration/test_diagnostics.py +++ b/packages/climate-ref-esmvaltool/tests/integration/test_diagnostics.py @@ -22,6 +22,12 @@ def provider_test_data_dir() -> Path: SKIP = { "regional-historical-annual-cycle", "regional-historical-timeseries", + # No data in sample data catalog + "ozone-annual-cycle", + "ozone-lat-time", + "ozone-nh-mar", + "ozone-sh-oct", + "ozone-zonal", } diagnostics = [ diff --git a/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_climate_at_global_warming_levels_cmip6.yml b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_climate_at_global_warming_levels_cmip6.yml index 53200348a..da425d084 100644 --- a/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_climate_at_global_warming_levels_cmip6.yml +++ b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_climate_at_global_warming_levels_cmip6.yml @@ -181,6 +181,18 @@ datasets: - historical grid: gn mip: Amon +- project: CMIP6 + activity: + - ScenarioMIP + - CMIP + dataset: GFDL-ESM4 + ensemble: r1i1p1f1 + institute: NOAA-GFDL + exp: + - ssp126 + - historical + grid: gr1 + mip: Amon - project: CMIP6 activity: - ScenarioMIP diff --git a/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_annual_cycle_cmip6_obs4mips.yml b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_annual_cycle_cmip6_obs4mips.yml new file mode 100644 index 000000000..b8763045d --- /dev/null +++ b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_annual_cycle_cmip6_obs4mips.yml @@ -0,0 +1,138 @@ +documentation: + title: Model evaluation with focus on total column and stratospheric ozone. + description: 'Plot climatologies, zonal means, and selected monthly means for total + column ozone and stratospheric ozone for the REF. + + ' + authors: + - schlund_manuel + - hassler_birgit + maintainer: + - hassler_birgit +preprocessors: + create_time_series_SH: + annual_statistics: + operator: mean + keep_group_coordinates: true + area_statistics: + operator: mean + extract_region: + start_latitude: -85 + end_latitude: -60 + start_longitude: 0 + end_longitude: 360 + extract_month: + month: 10 + convert_units: + units: DU + create_time_series_NH: + annual_statistics: + operator: mean + keep_group_coordinates: true + area_statistics: + operator: mean + extract_region: + start_latitude: 60 + end_latitude: 85 + start_longitude: 0 + end_longitude: 360 + extract_month: + month: 3 + convert_units: + units: DU + create_lat_time_map: + regrid: + scheme: linear + target_grid: 5x5 + regrid_time: + calendar: standard + zonal_statistics: + operator: mean + convert_units: + units: DU + create_lat_month_map: + regrid: + scheme: linear + target_grid: 5x5 + climate_statistics: + operator: mean + period: month + zonal_statistics: + operator: mean + convert_units: + units: DU + create_zonal_mean_profile: + zonal_statistics: + operator: mean + regrid: + scheme: linear + target_grid: 5x5 + extract_levels: + levels: + - 15000 + - 10000 + - 7000 + - 5000 + - 3000 + - 2000 + - 1000 + - 500 + - 100 + scheme: linear_extrapolate + coordinate: air_pressure + climate_statistics: + operator: mean + period: full + convert_units: + units: ppm +datasets: +- project: CMIP6 + activity: CMIP + dataset: GFDL-ESM4 + ensemble: r1i1p1f1 + institute: NOAA-GFDL + exp: historical + grid: gr1 + mip: AERmon + timerange: 2005/2014 +timerange_for_toz_monthly_data: + timerange: 1950/2014 +timerange_for_toz_zonal_mean: + timerange: 1997/2014 +timerange_for_ozone_profile: + timerange: 1990/2000 +diagnostics: + lat_month_mapplot: + variables: + toz: + timerange: 2005/2014 + mip: AERmon + exp: historical + preprocessor: create_lat_month_map + additional_datasets: + - project: obs4MIPs + dataset: C3S-GTO-ECV-9-0 + tier: 1 + alias: GTO-ECV + frequency: mon + reference_for_monitor_diags: true + scripts: + plot: + script: monitor/multi_datasets.py + facet_used_for_labels: alias + plot_folder: '{plot_dir}' + plot_filename: '{plot_type}_{real_name}_LatTime_Map' + matplotlib_rc_params: + xtick.labelsize: 6 + ytick.labelsize: 8 + axes.labelsize: 8 + axes.titlesize: 8 + savefig_kwargs: + dpi: 150 + bbox_inches: tight + orientation: landscape + plots: + hovmoeller_anncyc_vs_lat_or_lon: + common_cbar: true + show_x_minor_ticks: false + time_on: x-axis diff --git a/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_annual_cycle_cmip7_obs4mips.yml b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_annual_cycle_cmip7_obs4mips.yml new file mode 100644 index 000000000..2dc88b34f --- /dev/null +++ b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_annual_cycle_cmip7_obs4mips.yml @@ -0,0 +1,142 @@ +documentation: + title: Model evaluation with focus on total column and stratospheric ozone. + description: 'Plot climatologies, zonal means, and selected monthly means for total + column ozone and stratospheric ozone for the REF. + + ' + authors: + - schlund_manuel + - hassler_birgit + maintainer: + - hassler_birgit +preprocessors: + create_time_series_SH: + annual_statistics: + operator: mean + keep_group_coordinates: true + area_statistics: + operator: mean + extract_region: + start_latitude: -85 + end_latitude: -60 + start_longitude: 0 + end_longitude: 360 + extract_month: + month: 10 + convert_units: + units: DU + create_time_series_NH: + annual_statistics: + operator: mean + keep_group_coordinates: true + area_statistics: + operator: mean + extract_region: + start_latitude: 60 + end_latitude: 85 + start_longitude: 0 + end_longitude: 360 + extract_month: + month: 3 + convert_units: + units: DU + create_lat_time_map: + regrid: + scheme: linear + target_grid: 5x5 + regrid_time: + calendar: standard + zonal_statistics: + operator: mean + convert_units: + units: DU + create_lat_month_map: + regrid: + scheme: linear + target_grid: 5x5 + climate_statistics: + operator: mean + period: month + zonal_statistics: + operator: mean + convert_units: + units: DU + create_zonal_mean_profile: + zonal_statistics: + operator: mean + regrid: + scheme: linear + target_grid: 5x5 + extract_levels: + levels: + - 15000 + - 10000 + - 7000 + - 5000 + - 3000 + - 2000 + - 1000 + - 500 + - 100 + scheme: linear_extrapolate + coordinate: air_pressure + climate_statistics: + operator: mean + period: full + convert_units: + units: ppm +datasets: +- project: CMIP7 + activity: CMIP + branding_suffix: tavg-u-hxy-u + dataset: GFDL-ESM4 + ensemble: r1i1p1f1 + exp: historical + frequency: mon + grid: gr1 + institute: NOAA-GFDL + mip: aerosol + region: glb + timerange: 2005/2014 +timerange_for_toz_monthly_data: + timerange: 1950/2014 +timerange_for_toz_zonal_mean: + timerange: 1997/2014 +timerange_for_ozone_profile: + timerange: 1990/2000 +diagnostics: + lat_month_mapplot: + variables: + toz: + timerange: 2005/2014 + mip: aerosol + exp: historical + preprocessor: create_lat_month_map + additional_datasets: + - project: obs4MIPs + dataset: C3S-GTO-ECV-9-0 + tier: 1 + alias: GTO-ECV + frequency: mon + reference_for_monitor_diags: true + mip: AERmon + scripts: + plot: + script: monitor/multi_datasets.py + facet_used_for_labels: alias + plot_folder: '{plot_dir}' + plot_filename: '{plot_type}_{real_name}_LatTime_Map' + matplotlib_rc_params: + xtick.labelsize: 6 + ytick.labelsize: 8 + axes.labelsize: 8 + axes.titlesize: 8 + savefig_kwargs: + dpi: 150 + bbox_inches: tight + orientation: landscape + plots: + hovmoeller_anncyc_vs_lat_or_lon: + common_cbar: true + show_x_minor_ticks: false + time_on: x-axis diff --git a/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_lat_time_cmip6_obs4mips.yml b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_lat_time_cmip6_obs4mips.yml new file mode 100644 index 000000000..15a5c0b11 --- /dev/null +++ b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_lat_time_cmip6_obs4mips.yml @@ -0,0 +1,139 @@ +documentation: + title: Model evaluation with focus on total column and stratospheric ozone. + description: 'Plot climatologies, zonal means, and selected monthly means for total + column ozone and stratospheric ozone for the REF. + + ' + authors: + - schlund_manuel + - hassler_birgit + maintainer: + - hassler_birgit +preprocessors: + create_time_series_SH: + annual_statistics: + operator: mean + keep_group_coordinates: true + area_statistics: + operator: mean + extract_region: + start_latitude: -85 + end_latitude: -60 + start_longitude: 0 + end_longitude: 360 + extract_month: + month: 10 + convert_units: + units: DU + create_time_series_NH: + annual_statistics: + operator: mean + keep_group_coordinates: true + area_statistics: + operator: mean + extract_region: + start_latitude: 60 + end_latitude: 85 + start_longitude: 0 + end_longitude: 360 + extract_month: + month: 3 + convert_units: + units: DU + create_lat_time_map: + regrid: + scheme: linear + target_grid: 5x5 + regrid_time: + calendar: standard + zonal_statistics: + operator: mean + convert_units: + units: DU + create_lat_month_map: + regrid: + scheme: linear + target_grid: 5x5 + climate_statistics: + operator: mean + period: month + zonal_statistics: + operator: mean + convert_units: + units: DU + create_zonal_mean_profile: + zonal_statistics: + operator: mean + regrid: + scheme: linear + target_grid: 5x5 + extract_levels: + levels: + - 15000 + - 10000 + - 7000 + - 5000 + - 3000 + - 2000 + - 1000 + - 500 + - 100 + scheme: linear_extrapolate + coordinate: air_pressure + climate_statistics: + operator: mean + period: full + convert_units: + units: ppm +datasets: +- project: CMIP6 + activity: CMIP + dataset: GFDL-ESM4 + ensemble: r1i1p1f1 + institute: NOAA-GFDL + exp: historical + grid: gr1 + mip: AERmon + timerange: 1996/2014 +timerange_for_toz_monthly_data: + timerange: 1950/2014 +timerange_for_toz_zonal_mean: + timerange: 1997/2014 +timerange_for_ozone_profile: + timerange: 1990/2000 +diagnostics: + lat_time_mapplot: + variables: + toz: + timerange: 1996/2014 + mip: AERmon + exp: historical + preprocessor: create_lat_time_map + additional_datasets: + - project: obs4MIPs + dataset: C3S-GTO-ECV-9-0 + tier: 1 + alias: GTO-ECV + frequency: mon + reference_for_monitor_diags: true + scripts: + plot: + script: monitor/multi_datasets.py + facet_used_for_labels: alias + plot_folder: '{plot_dir}' + plot_filename: '{plot_type}_{real_name}_LatTime_Map' + matplotlib_rc_params: + xtick.labelsize: 6 + ytick.labelsize: 8 + axes.labelsize: 8 + axes.titlesize: 8 + savefig_kwargs: + dpi: 150 + bbox_inches: tight + orientation: landscape + plots: + hovmoeller_time_vs_lat_or_lon: + common_cbar: true + show_x_minor_ticks: false + time_format: '%Y' + time_on: x-axis diff --git a/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_lat_time_cmip7_obs4mips.yml b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_lat_time_cmip7_obs4mips.yml new file mode 100644 index 000000000..6c444f87b --- /dev/null +++ b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_lat_time_cmip7_obs4mips.yml @@ -0,0 +1,143 @@ +documentation: + title: Model evaluation with focus on total column and stratospheric ozone. + description: 'Plot climatologies, zonal means, and selected monthly means for total + column ozone and stratospheric ozone for the REF. + + ' + authors: + - schlund_manuel + - hassler_birgit + maintainer: + - hassler_birgit +preprocessors: + create_time_series_SH: + annual_statistics: + operator: mean + keep_group_coordinates: true + area_statistics: + operator: mean + extract_region: + start_latitude: -85 + end_latitude: -60 + start_longitude: 0 + end_longitude: 360 + extract_month: + month: 10 + convert_units: + units: DU + create_time_series_NH: + annual_statistics: + operator: mean + keep_group_coordinates: true + area_statistics: + operator: mean + extract_region: + start_latitude: 60 + end_latitude: 85 + start_longitude: 0 + end_longitude: 360 + extract_month: + month: 3 + convert_units: + units: DU + create_lat_time_map: + regrid: + scheme: linear + target_grid: 5x5 + regrid_time: + calendar: standard + zonal_statistics: + operator: mean + convert_units: + units: DU + create_lat_month_map: + regrid: + scheme: linear + target_grid: 5x5 + climate_statistics: + operator: mean + period: month + zonal_statistics: + operator: mean + convert_units: + units: DU + create_zonal_mean_profile: + zonal_statistics: + operator: mean + regrid: + scheme: linear + target_grid: 5x5 + extract_levels: + levels: + - 15000 + - 10000 + - 7000 + - 5000 + - 3000 + - 2000 + - 1000 + - 500 + - 100 + scheme: linear_extrapolate + coordinate: air_pressure + climate_statistics: + operator: mean + period: full + convert_units: + units: ppm +datasets: +- project: CMIP7 + activity: CMIP + branding_suffix: tavg-u-hxy-u + dataset: GFDL-ESM4 + ensemble: r1i1p1f1 + exp: historical + frequency: mon + grid: gr1 + institute: NOAA-GFDL + mip: aerosol + region: glb + timerange: 1996/2014 +timerange_for_toz_monthly_data: + timerange: 1950/2014 +timerange_for_toz_zonal_mean: + timerange: 1997/2014 +timerange_for_ozone_profile: + timerange: 1990/2000 +diagnostics: + lat_time_mapplot: + variables: + toz: + timerange: 1996/2014 + mip: aerosol + exp: historical + preprocessor: create_lat_time_map + additional_datasets: + - project: obs4MIPs + dataset: C3S-GTO-ECV-9-0 + tier: 1 + alias: GTO-ECV + frequency: mon + reference_for_monitor_diags: true + mip: AERmon + scripts: + plot: + script: monitor/multi_datasets.py + facet_used_for_labels: alias + plot_folder: '{plot_dir}' + plot_filename: '{plot_type}_{real_name}_LatTime_Map' + matplotlib_rc_params: + xtick.labelsize: 6 + ytick.labelsize: 8 + axes.labelsize: 8 + axes.titlesize: 8 + savefig_kwargs: + dpi: 150 + bbox_inches: tight + orientation: landscape + plots: + hovmoeller_time_vs_lat_or_lon: + common_cbar: true + show_x_minor_ticks: false + time_format: '%Y' + time_on: x-axis diff --git a/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_nh_mar_cmip6_obs4mips.yml b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_nh_mar_cmip6_obs4mips.yml new file mode 100644 index 000000000..a0395b1f7 --- /dev/null +++ b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_nh_mar_cmip6_obs4mips.yml @@ -0,0 +1,136 @@ +documentation: + title: Model evaluation with focus on total column and stratospheric ozone. + description: 'Plot climatologies, zonal means, and selected monthly means for total + column ozone and stratospheric ozone for the REF. + + ' + authors: + - schlund_manuel + - hassler_birgit + maintainer: + - hassler_birgit +preprocessors: + create_time_series_SH: + annual_statistics: + operator: mean + keep_group_coordinates: true + area_statistics: + operator: mean + extract_region: + start_latitude: -85 + end_latitude: -60 + start_longitude: 0 + end_longitude: 360 + extract_month: + month: 10 + convert_units: + units: DU + create_time_series_NH: + annual_statistics: + operator: mean + keep_group_coordinates: true + area_statistics: + operator: mean + extract_region: + start_latitude: 60 + end_latitude: 80 + start_longitude: 0 + end_longitude: 360 + extract_month: + month: 3 + convert_units: + units: DU + create_lat_time_map: + regrid: + scheme: linear + target_grid: 5x5 + regrid_time: + calendar: standard + zonal_statistics: + operator: mean + convert_units: + units: DU + create_lat_month_map: + regrid: + scheme: linear + target_grid: 5x5 + climate_statistics: + operator: mean + period: month + zonal_statistics: + operator: mean + convert_units: + units: DU + create_zonal_mean_profile: + zonal_statistics: + operator: mean + regrid: + scheme: linear + target_grid: 5x5 + extract_levels: + levels: + - 15000 + - 10000 + - 7000 + - 5000 + - 3000 + - 2000 + - 1000 + - 500 + - 100 + scheme: linear_extrapolate + coordinate: air_pressure + climate_statistics: + operator: mean + period: full + convert_units: + units: ppm +datasets: +- project: CMIP6 + activity: CMIP + dataset: GFDL-ESM4 + ensemble: r1i1p1f1 + institute: NOAA-GFDL + exp: historical + grid: gr1 + mip: AERmon + timerange: 1950/2014 +timerange_for_toz_monthly_data: + timerange: 1950/2014 +timerange_for_toz_zonal_mean: + timerange: 1997/2014 +timerange_for_ozone_profile: + timerange: 1990/2000 +diagnostics: + polar_cap_time_series_NH: + variables: + toz: + timerange: 1950/2014 + mip: AERmon + exp: historical + preprocessor: create_time_series_NH + facet_used_for_labels: alias + additional_datasets: + - project: obs4MIPs + dataset: C3S-GTO-ECV-9-0 + tier: 1 + timerange: 1996/2021 + alias: GTO-ECV + frequency: mon + scripts: + plot: + script: monitor/multi_datasets.py + plot_folder: '{plot_dir}' + plot_filename: '{plot_type}_{real_name}_NH_MAR' + facet_used_for_labels: alias + savefig_kwargs: + dpi: 150 + bbox_inches: tight + orientation: landscape + plots: + timeseries: + plot_kwargs: + OBS: + color: black + pyplot_kwargs: + title: Total Column Ozone, 60-80N, March diff --git a/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_nh_mar_cmip7_obs4mips.yml b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_nh_mar_cmip7_obs4mips.yml new file mode 100644 index 000000000..1fad1a667 --- /dev/null +++ b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_nh_mar_cmip7_obs4mips.yml @@ -0,0 +1,139 @@ +documentation: + title: Model evaluation with focus on total column and stratospheric ozone. + description: 'Plot climatologies, zonal means, and selected monthly means for total + column ozone and stratospheric ozone for the REF. + + ' + authors: + - schlund_manuel + - hassler_birgit + maintainer: + - hassler_birgit +preprocessors: + create_time_series_SH: + annual_statistics: + operator: mean + keep_group_coordinates: true + area_statistics: + operator: mean + extract_region: + start_latitude: -85 + end_latitude: -60 + start_longitude: 0 + end_longitude: 360 + extract_month: + month: 10 + convert_units: + units: DU + create_time_series_NH: + annual_statistics: + operator: mean + keep_group_coordinates: true + area_statistics: + operator: mean + extract_region: + start_latitude: 60 + end_latitude: 80 + start_longitude: 0 + end_longitude: 360 + extract_month: + month: 3 + convert_units: + units: DU + create_lat_time_map: + regrid: + scheme: linear + target_grid: 5x5 + regrid_time: + calendar: standard + zonal_statistics: + operator: mean + convert_units: + units: DU + create_lat_month_map: + regrid: + scheme: linear + target_grid: 5x5 + climate_statistics: + operator: mean + period: month + zonal_statistics: + operator: mean + convert_units: + units: DU + create_zonal_mean_profile: + zonal_statistics: + operator: mean + regrid: + scheme: linear + target_grid: 5x5 + extract_levels: + levels: + - 15000 + - 10000 + - 7000 + - 5000 + - 3000 + - 2000 + - 1000 + - 500 + - 100 + scheme: linear_extrapolate + coordinate: air_pressure + climate_statistics: + operator: mean + period: full + convert_units: + units: ppm +datasets: +- project: CMIP7 + activity: CMIP + branding_suffix: tavg-u-hxy-u + dataset: GFDL-ESM4 + ensemble: r1i1p1f1 + exp: historical + frequency: mon + grid: gr1 + institute: NOAA-GFDL + mip: aerosol + region: glb + timerange: 1950/2014 +timerange_for_toz_monthly_data: + timerange: 1950/2014 +timerange_for_toz_zonal_mean: + timerange: 1997/2014 +timerange_for_ozone_profile: + timerange: 1990/2000 +diagnostics: + polar_cap_time_series_NH: + variables: + toz: + timerange: 1950/2014 + mip: aerosol + exp: historical + preprocessor: create_time_series_NH + facet_used_for_labels: alias + additional_datasets: + - project: obs4MIPs + dataset: C3S-GTO-ECV-9-0 + tier: 1 + timerange: 1996/2021 + alias: GTO-ECV + frequency: mon + scripts: + plot: + script: monitor/multi_datasets.py + plot_folder: '{plot_dir}' + plot_filename: '{plot_type}_{real_name}_NH_MAR' + facet_used_for_labels: alias + savefig_kwargs: + dpi: 150 + bbox_inches: tight + orientation: landscape + plots: + timeseries: + plot_kwargs: + OBS: + color: black + pyplot_kwargs: + title: Total Column Ozone, 60-80N, March diff --git a/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_sh_oct_cmip6_obs4mips.yml b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_sh_oct_cmip6_obs4mips.yml new file mode 100644 index 000000000..e390e8b97 --- /dev/null +++ b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_sh_oct_cmip6_obs4mips.yml @@ -0,0 +1,135 @@ +documentation: + title: Model evaluation with focus on total column and stratospheric ozone. + description: 'Plot climatologies, zonal means, and selected monthly means for total + column ozone and stratospheric ozone for the REF. + + ' + authors: + - schlund_manuel + - hassler_birgit + maintainer: + - hassler_birgit +preprocessors: + create_time_series_SH: + annual_statistics: + operator: mean + keep_group_coordinates: true + area_statistics: + operator: mean + extract_region: + start_latitude: -85 + end_latitude: -60 + start_longitude: 0 + end_longitude: 360 + extract_month: + month: 10 + convert_units: + units: DU + create_time_series_NH: + annual_statistics: + operator: mean + keep_group_coordinates: true + area_statistics: + operator: mean + extract_region: + start_latitude: 60 + end_latitude: 85 + start_longitude: 0 + end_longitude: 360 + extract_month: + month: 3 + convert_units: + units: DU + create_lat_time_map: + regrid: + scheme: linear + target_grid: 5x5 + regrid_time: + calendar: standard + zonal_statistics: + operator: mean + convert_units: + units: DU + create_lat_month_map: + regrid: + scheme: linear + target_grid: 5x5 + climate_statistics: + operator: mean + period: month + zonal_statistics: + operator: mean + convert_units: + units: DU + create_zonal_mean_profile: + zonal_statistics: + operator: mean + regrid: + scheme: linear + target_grid: 5x5 + extract_levels: + levels: + - 15000 + - 10000 + - 7000 + - 5000 + - 3000 + - 2000 + - 1000 + - 500 + - 100 + scheme: linear_extrapolate + coordinate: air_pressure + climate_statistics: + operator: mean + period: full + convert_units: + units: ppm +datasets: +- project: CMIP6 + activity: CMIP + dataset: GFDL-ESM4 + ensemble: r1i1p1f1 + institute: NOAA-GFDL + exp: historical + grid: gr1 + mip: AERmon + timerange: 1950/2014 +timerange_for_toz_monthly_data: + timerange: 1950/2014 +timerange_for_toz_zonal_mean: + timerange: 1997/2014 +timerange_for_ozone_profile: + timerange: 1990/2000 +diagnostics: + polar_cap_time_series_SH: + variables: + toz: + timerange: 1950/2014 + mip: AERmon + exp: historical + preprocessor: create_time_series_SH + additional_datasets: + - project: obs4MIPs + dataset: C3S-GTO-ECV-9-0 + tier: 1 + timerange: 1996/2021 + alias: GTO-ECV + frequency: mon + scripts: + plot: + script: monitor/multi_datasets.py + plot_folder: '{plot_dir}' + plot_filename: '{plot_type}_{real_name}_SH_Oct' + facet_used_for_labels: alias + savefig_kwargs: + dpi: 150 + bbox_inches: tight + orientation: landscape + plots: + timeseries: + plot_kwargs: + OBS: + color: black + pyplot_kwargs: + title: Total Column Ozone, 60-85S, October diff --git a/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_sh_oct_cmip7_obs4mips.yml b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_sh_oct_cmip7_obs4mips.yml new file mode 100644 index 000000000..725d4ab5a --- /dev/null +++ b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_sh_oct_cmip7_obs4mips.yml @@ -0,0 +1,138 @@ +documentation: + title: Model evaluation with focus on total column and stratospheric ozone. + description: 'Plot climatologies, zonal means, and selected monthly means for total + column ozone and stratospheric ozone for the REF. + + ' + authors: + - schlund_manuel + - hassler_birgit + maintainer: + - hassler_birgit +preprocessors: + create_time_series_SH: + annual_statistics: + operator: mean + keep_group_coordinates: true + area_statistics: + operator: mean + extract_region: + start_latitude: -85 + end_latitude: -60 + start_longitude: 0 + end_longitude: 360 + extract_month: + month: 10 + convert_units: + units: DU + create_time_series_NH: + annual_statistics: + operator: mean + keep_group_coordinates: true + area_statistics: + operator: mean + extract_region: + start_latitude: 60 + end_latitude: 85 + start_longitude: 0 + end_longitude: 360 + extract_month: + month: 3 + convert_units: + units: DU + create_lat_time_map: + regrid: + scheme: linear + target_grid: 5x5 + regrid_time: + calendar: standard + zonal_statistics: + operator: mean + convert_units: + units: DU + create_lat_month_map: + regrid: + scheme: linear + target_grid: 5x5 + climate_statistics: + operator: mean + period: month + zonal_statistics: + operator: mean + convert_units: + units: DU + create_zonal_mean_profile: + zonal_statistics: + operator: mean + regrid: + scheme: linear + target_grid: 5x5 + extract_levels: + levels: + - 15000 + - 10000 + - 7000 + - 5000 + - 3000 + - 2000 + - 1000 + - 500 + - 100 + scheme: linear_extrapolate + coordinate: air_pressure + climate_statistics: + operator: mean + period: full + convert_units: + units: ppm +datasets: +- project: CMIP7 + activity: CMIP + branding_suffix: tavg-u-hxy-u + dataset: GFDL-ESM4 + ensemble: r1i1p1f1 + exp: historical + frequency: mon + grid: gr1 + institute: NOAA-GFDL + mip: aerosol + region: glb + timerange: 1950/2014 +timerange_for_toz_monthly_data: + timerange: 1950/2014 +timerange_for_toz_zonal_mean: + timerange: 1997/2014 +timerange_for_ozone_profile: + timerange: 1990/2000 +diagnostics: + polar_cap_time_series_SH: + variables: + toz: + timerange: 1950/2014 + mip: aerosol + exp: historical + preprocessor: create_time_series_SH + additional_datasets: + - project: obs4MIPs + dataset: C3S-GTO-ECV-9-0 + tier: 1 + timerange: 1996/2021 + alias: GTO-ECV + frequency: mon + scripts: + plot: + script: monitor/multi_datasets.py + plot_folder: '{plot_dir}' + plot_filename: '{plot_type}_{real_name}_SH_Oct' + facet_used_for_labels: alias + savefig_kwargs: + dpi: 150 + bbox_inches: tight + orientation: landscape + plots: + timeseries: + plot_kwargs: + OBS: + color: black + pyplot_kwargs: + title: Total Column Ozone, 60-85S, October diff --git a/packages/climate-ref-esmvaltool/tests/unit/diagnostics/test_recipes.py b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/test_recipes.py index 8375f855b..74720bc7a 100644 --- a/packages/climate-ref-esmvaltool/tests/unit/diagnostics/test_recipes.py +++ b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/test_recipes.py @@ -11,10 +11,24 @@ from climate_ref.solver import solve_executions from climate_ref_core.datasets import SourceDatasetType +SKIP = { + "ozone-zonal", +} -@pytest.mark.parametrize( - "diagnostic", [pytest.param(diagnostic, id=diagnostic.slug) for diagnostic in provider.diagnostics()] -) +diagnostics = [ + pytest.param( + diagnostic, + id=diagnostic.slug, + marks=pytest.mark.skipif( + diagnostic.slug in SKIP, + reason="Missing datasets", + ), + ) + for diagnostic in provider.diagnostics() +] + + +@pytest.mark.parametrize("diagnostic", diagnostics) def test_write_recipe( tmp_path: Path, file_regression: FileRegressionFixture, diff --git a/packages/climate-ref-esmvaltool/tests/unit/test_provider.py b/packages/climate-ref-esmvaltool/tests/unit/test_provider.py index bfc62b685..1c66d1c7d 100644 --- a/packages/climate-ref-esmvaltool/tests/unit/test_provider.py +++ b/packages/climate-ref-esmvaltool/tests/unit/test_provider.py @@ -17,6 +17,7 @@ def test_provider(): "cloud_scatterplots.py": 5, "enso.py": 2, "regional_historical_changes.py": 3, + "ozone.py": 5, } n_diagnostics = sum(diagnostics_per_module.get(f.name, 1) for f in diagnostic_modules) assert len(provider) == n_diagnostics diff --git a/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_annual_cycle_.yml b/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_annual_cycle_.yml new file mode 100644 index 000000000..b9c297465 --- /dev/null +++ b/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_annual_cycle_.yml @@ -0,0 +1,152 @@ +cmip6_gn_r1i1p1f1_EC-Earth3-AerChem__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.EC-Earth-Consortium.EC-Earth3-AerChem.historical.r1i1p1f1.AERmon.toz.gn.v20200624 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p1f1_MPI-ESM-1-2-HAM__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.HAMMOZ-Consortium.MPI-ESM-1-2-HAM.historical.r1i1p1f1.AERmon.toz.gn.v20190627 + - CMIP6.CMIP.HAMMOZ-Consortium.MPI-ESM-1-2-HAM.historical.r1i1p1f1.fx.areacella.gn.v20190627 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p1f1_MRI-ESM2-0__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.MRI.MRI-ESM2-0.historical.r1i1p1f1.AERmon.toz.gn.v20200207 + - CMIP6.CMIP.MRI.MRI-ESM2-0.historical.r1i1p1f1.fx.areacella.gn.v20190603 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p1f2_UKESM1-0-LL__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.MOHC.UKESM1-0-LL.historical.r1i1p1f2.AERmon.toz.gn.v20190406 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p1f2_UKESM1-1-LL__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.MOHC.UKESM1-1-LL.historical.r1i1p1f2.AERmon.toz.gn.v20220512 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p3f1_GISS-E2-1-G__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.NASA-GISS.GISS-E2-1-G.historical.r1i1p3f1.AERmon.toz.gn.v20220525 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p3f1_GISS-E2-1-H__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.NASA-GISS.GISS-E2-1-H.historical.r1i1p3f1.AERmon.toz.gn.v20220525 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p3f1_GISS-E2-2-G__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.NASA-GISS.GISS-E2-2-G.historical.r1i1p3f1.AERmon.toz.gn.v20211020 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p4f2_MIROC-ES2H__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.MIROC.MIROC-ES2H.historical.r1i1p4f2.AERmon.toz.gn.v20220322 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr1_r1i1p1f1_GFDL-ESM4__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.NOAA-GFDL.GFDL-ESM4.historical.r1i1p1f1.AERmon.toz.gr1.v20190726 + - CMIP6.CMIP.NOAA-GFDL.GFDL-ESM4.historical.r1i1p1f1.fx.areacella.gr1.v20190726 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr_r1i1p1f1_IPSL-CM5A2-INCA__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.IPSL.IPSL-CM5A2-INCA.historical.r1i1p1f1.AERmon.toz.gr.v20200729 + - CMIP6.CMIP.IPSL.IPSL-CM5A2-INCA.historical.r1i1p1f1.fx.areacella.gr.v20200729 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr_r1i1p1f1_IPSL-CM6A-LR-INCA__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.IPSL.IPSL-CM6A-LR-INCA.historical.r1i1p1f1.AERmon.toz.gr.v20210216 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr_r1i1p1f2_CNRM-CM6-1__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.CNRM-CERFACS.CNRM-CM6-1.historical.r1i1p1f2.AERmon.toz.gr.v20180917 + - CMIP6.CMIP.CNRM-CERFACS.CNRM-CM6-1.historical.r1i1p1f2.fx.areacella.gr.v20180917 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr_r1i1p1f2_CNRM-ESM2-1__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.CNRM-CERFACS.CNRM-ESM2-1.historical.r13i1p1f2.fx.areacella.gr.v20250328 + - CMIP6.CMIP.CNRM-CERFACS.CNRM-ESM2-1.historical.r1i1p1f2.AERmon.toz.gr.v20181206 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_EC-Earth3-AerChem_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.EC-Earth-Consortium.EC-Earth3-AerChem.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gn.v20200624 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_GISS-E2-1-G_r1i1p3f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.NASA-GISS.GISS-E2-1-G.historical.r1i1p3f1.glb.mon.toz.tavg-u-hxy-u.gn.v20220525 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_GISS-E2-1-H_r1i1p3f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.NASA-GISS.GISS-E2-1-H.historical.r1i1p3f1.glb.mon.toz.tavg-u-hxy-u.gn.v20220525 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_GISS-E2-2-G_r1i1p3f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.NASA-GISS.GISS-E2-2-G.historical.r1i1p3f1.glb.mon.toz.tavg-u-hxy-u.gn.v20211020 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_MIROC-ES2H_r1i1p4f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.MIROC.MIROC-ES2H.historical.r1i1p4f2.glb.mon.toz.tavg-u-hxy-u.gn.v20220322 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_MPI-ESM-1-2-HAM_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.HAMMOZ-Consortium.MPI-ESM-1-2-HAM.historical.r1i1p1f1.glb.fx.areacella.ti-u-hxy-u.gn.v20190627 + - CMIP7.CMIP.HAMMOZ-Consortium.MPI-ESM-1-2-HAM.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gn.v20190627 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_MRI-ESM2-0_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.MRI.MRI-ESM2-0.historical.r1i1p1f1.glb.fx.areacella.ti-u-hxy-u.gn.v20190603 + - CMIP7.CMIP.MRI.MRI-ESM2-0.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gn.v20200207 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_UKESM1-0-LL_r1i1p1f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.MOHC.UKESM1-0-LL.historical.r1i1p1f2.glb.mon.toz.tavg-u-hxy-u.gn.v20190406 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_UKESM1-1-LL_r1i1p1f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.MOHC.UKESM1-1-LL.historical.r1i1p1f2.glb.mon.toz.tavg-u-hxy-u.gn.v20220512 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr1_GFDL-ESM4_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.NOAA-GFDL.GFDL-ESM4.historical.r1i1p1f1.glb.fx.areacella.ti-u-hxy-u.gr1.v20190726 + - CMIP7.CMIP.NOAA-GFDL.GFDL-ESM4.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gr1.v20190726 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr_CNRM-CM6-1_r1i1p1f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.CNRM-CERFACS.CNRM-CM6-1.historical.r1i1p1f2.glb.fx.areacella.ti-u-hxy-u.gr.v20180917 + - CMIP7.CMIP.CNRM-CERFACS.CNRM-CM6-1.historical.r1i1p1f2.glb.mon.toz.tavg-u-hxy-u.gr.v20180917 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr_CNRM-ESM2-1_r1i1p1f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.CNRM-CERFACS.CNRM-ESM2-1.historical.r13i1p1f2.glb.fx.areacella.ti-u-hxy-u.gr.v20250328 + - CMIP7.CMIP.CNRM-CERFACS.CNRM-ESM2-1.historical.r1i1p1f2.glb.mon.toz.tavg-u-hxy-u.gr.v20181206 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr_IPSL-CM5A2-INCA_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.IPSL.IPSL-CM5A2-INCA.historical.r1i1p1f1.glb.fx.areacella.ti-u-hxy-u.gr.v20200729 + - CMIP7.CMIP.IPSL.IPSL-CM5A2-INCA.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gr.v20200729 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr_IPSL-CM6A-LR-INCA_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.IPSL.IPSL-CM6A-LR-INCA.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gr.v20210216 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 diff --git a/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_lat_time_.yml b/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_lat_time_.yml new file mode 100644 index 000000000..b9c297465 --- /dev/null +++ b/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_lat_time_.yml @@ -0,0 +1,152 @@ +cmip6_gn_r1i1p1f1_EC-Earth3-AerChem__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.EC-Earth-Consortium.EC-Earth3-AerChem.historical.r1i1p1f1.AERmon.toz.gn.v20200624 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p1f1_MPI-ESM-1-2-HAM__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.HAMMOZ-Consortium.MPI-ESM-1-2-HAM.historical.r1i1p1f1.AERmon.toz.gn.v20190627 + - CMIP6.CMIP.HAMMOZ-Consortium.MPI-ESM-1-2-HAM.historical.r1i1p1f1.fx.areacella.gn.v20190627 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p1f1_MRI-ESM2-0__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.MRI.MRI-ESM2-0.historical.r1i1p1f1.AERmon.toz.gn.v20200207 + - CMIP6.CMIP.MRI.MRI-ESM2-0.historical.r1i1p1f1.fx.areacella.gn.v20190603 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p1f2_UKESM1-0-LL__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.MOHC.UKESM1-0-LL.historical.r1i1p1f2.AERmon.toz.gn.v20190406 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p1f2_UKESM1-1-LL__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.MOHC.UKESM1-1-LL.historical.r1i1p1f2.AERmon.toz.gn.v20220512 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p3f1_GISS-E2-1-G__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.NASA-GISS.GISS-E2-1-G.historical.r1i1p3f1.AERmon.toz.gn.v20220525 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p3f1_GISS-E2-1-H__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.NASA-GISS.GISS-E2-1-H.historical.r1i1p3f1.AERmon.toz.gn.v20220525 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p3f1_GISS-E2-2-G__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.NASA-GISS.GISS-E2-2-G.historical.r1i1p3f1.AERmon.toz.gn.v20211020 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p4f2_MIROC-ES2H__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.MIROC.MIROC-ES2H.historical.r1i1p4f2.AERmon.toz.gn.v20220322 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr1_r1i1p1f1_GFDL-ESM4__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.NOAA-GFDL.GFDL-ESM4.historical.r1i1p1f1.AERmon.toz.gr1.v20190726 + - CMIP6.CMIP.NOAA-GFDL.GFDL-ESM4.historical.r1i1p1f1.fx.areacella.gr1.v20190726 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr_r1i1p1f1_IPSL-CM5A2-INCA__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.IPSL.IPSL-CM5A2-INCA.historical.r1i1p1f1.AERmon.toz.gr.v20200729 + - CMIP6.CMIP.IPSL.IPSL-CM5A2-INCA.historical.r1i1p1f1.fx.areacella.gr.v20200729 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr_r1i1p1f1_IPSL-CM6A-LR-INCA__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.IPSL.IPSL-CM6A-LR-INCA.historical.r1i1p1f1.AERmon.toz.gr.v20210216 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr_r1i1p1f2_CNRM-CM6-1__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.CNRM-CERFACS.CNRM-CM6-1.historical.r1i1p1f2.AERmon.toz.gr.v20180917 + - CMIP6.CMIP.CNRM-CERFACS.CNRM-CM6-1.historical.r1i1p1f2.fx.areacella.gr.v20180917 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr_r1i1p1f2_CNRM-ESM2-1__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.CNRM-CERFACS.CNRM-ESM2-1.historical.r13i1p1f2.fx.areacella.gr.v20250328 + - CMIP6.CMIP.CNRM-CERFACS.CNRM-ESM2-1.historical.r1i1p1f2.AERmon.toz.gr.v20181206 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_EC-Earth3-AerChem_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.EC-Earth-Consortium.EC-Earth3-AerChem.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gn.v20200624 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_GISS-E2-1-G_r1i1p3f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.NASA-GISS.GISS-E2-1-G.historical.r1i1p3f1.glb.mon.toz.tavg-u-hxy-u.gn.v20220525 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_GISS-E2-1-H_r1i1p3f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.NASA-GISS.GISS-E2-1-H.historical.r1i1p3f1.glb.mon.toz.tavg-u-hxy-u.gn.v20220525 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_GISS-E2-2-G_r1i1p3f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.NASA-GISS.GISS-E2-2-G.historical.r1i1p3f1.glb.mon.toz.tavg-u-hxy-u.gn.v20211020 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_MIROC-ES2H_r1i1p4f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.MIROC.MIROC-ES2H.historical.r1i1p4f2.glb.mon.toz.tavg-u-hxy-u.gn.v20220322 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_MPI-ESM-1-2-HAM_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.HAMMOZ-Consortium.MPI-ESM-1-2-HAM.historical.r1i1p1f1.glb.fx.areacella.ti-u-hxy-u.gn.v20190627 + - CMIP7.CMIP.HAMMOZ-Consortium.MPI-ESM-1-2-HAM.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gn.v20190627 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_MRI-ESM2-0_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.MRI.MRI-ESM2-0.historical.r1i1p1f1.glb.fx.areacella.ti-u-hxy-u.gn.v20190603 + - CMIP7.CMIP.MRI.MRI-ESM2-0.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gn.v20200207 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_UKESM1-0-LL_r1i1p1f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.MOHC.UKESM1-0-LL.historical.r1i1p1f2.glb.mon.toz.tavg-u-hxy-u.gn.v20190406 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_UKESM1-1-LL_r1i1p1f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.MOHC.UKESM1-1-LL.historical.r1i1p1f2.glb.mon.toz.tavg-u-hxy-u.gn.v20220512 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr1_GFDL-ESM4_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.NOAA-GFDL.GFDL-ESM4.historical.r1i1p1f1.glb.fx.areacella.ti-u-hxy-u.gr1.v20190726 + - CMIP7.CMIP.NOAA-GFDL.GFDL-ESM4.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gr1.v20190726 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr_CNRM-CM6-1_r1i1p1f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.CNRM-CERFACS.CNRM-CM6-1.historical.r1i1p1f2.glb.fx.areacella.ti-u-hxy-u.gr.v20180917 + - CMIP7.CMIP.CNRM-CERFACS.CNRM-CM6-1.historical.r1i1p1f2.glb.mon.toz.tavg-u-hxy-u.gr.v20180917 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr_CNRM-ESM2-1_r1i1p1f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.CNRM-CERFACS.CNRM-ESM2-1.historical.r13i1p1f2.glb.fx.areacella.ti-u-hxy-u.gr.v20250328 + - CMIP7.CMIP.CNRM-CERFACS.CNRM-ESM2-1.historical.r1i1p1f2.glb.mon.toz.tavg-u-hxy-u.gr.v20181206 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr_IPSL-CM5A2-INCA_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.IPSL.IPSL-CM5A2-INCA.historical.r1i1p1f1.glb.fx.areacella.ti-u-hxy-u.gr.v20200729 + - CMIP7.CMIP.IPSL.IPSL-CM5A2-INCA.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gr.v20200729 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr_IPSL-CM6A-LR-INCA_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.IPSL.IPSL-CM6A-LR-INCA.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gr.v20210216 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 diff --git a/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_nh_mar_.yml b/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_nh_mar_.yml new file mode 100644 index 000000000..b9c297465 --- /dev/null +++ b/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_nh_mar_.yml @@ -0,0 +1,152 @@ +cmip6_gn_r1i1p1f1_EC-Earth3-AerChem__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.EC-Earth-Consortium.EC-Earth3-AerChem.historical.r1i1p1f1.AERmon.toz.gn.v20200624 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p1f1_MPI-ESM-1-2-HAM__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.HAMMOZ-Consortium.MPI-ESM-1-2-HAM.historical.r1i1p1f1.AERmon.toz.gn.v20190627 + - CMIP6.CMIP.HAMMOZ-Consortium.MPI-ESM-1-2-HAM.historical.r1i1p1f1.fx.areacella.gn.v20190627 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p1f1_MRI-ESM2-0__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.MRI.MRI-ESM2-0.historical.r1i1p1f1.AERmon.toz.gn.v20200207 + - CMIP6.CMIP.MRI.MRI-ESM2-0.historical.r1i1p1f1.fx.areacella.gn.v20190603 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p1f2_UKESM1-0-LL__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.MOHC.UKESM1-0-LL.historical.r1i1p1f2.AERmon.toz.gn.v20190406 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p1f2_UKESM1-1-LL__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.MOHC.UKESM1-1-LL.historical.r1i1p1f2.AERmon.toz.gn.v20220512 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p3f1_GISS-E2-1-G__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.NASA-GISS.GISS-E2-1-G.historical.r1i1p3f1.AERmon.toz.gn.v20220525 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p3f1_GISS-E2-1-H__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.NASA-GISS.GISS-E2-1-H.historical.r1i1p3f1.AERmon.toz.gn.v20220525 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p3f1_GISS-E2-2-G__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.NASA-GISS.GISS-E2-2-G.historical.r1i1p3f1.AERmon.toz.gn.v20211020 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p4f2_MIROC-ES2H__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.MIROC.MIROC-ES2H.historical.r1i1p4f2.AERmon.toz.gn.v20220322 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr1_r1i1p1f1_GFDL-ESM4__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.NOAA-GFDL.GFDL-ESM4.historical.r1i1p1f1.AERmon.toz.gr1.v20190726 + - CMIP6.CMIP.NOAA-GFDL.GFDL-ESM4.historical.r1i1p1f1.fx.areacella.gr1.v20190726 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr_r1i1p1f1_IPSL-CM5A2-INCA__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.IPSL.IPSL-CM5A2-INCA.historical.r1i1p1f1.AERmon.toz.gr.v20200729 + - CMIP6.CMIP.IPSL.IPSL-CM5A2-INCA.historical.r1i1p1f1.fx.areacella.gr.v20200729 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr_r1i1p1f1_IPSL-CM6A-LR-INCA__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.IPSL.IPSL-CM6A-LR-INCA.historical.r1i1p1f1.AERmon.toz.gr.v20210216 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr_r1i1p1f2_CNRM-CM6-1__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.CNRM-CERFACS.CNRM-CM6-1.historical.r1i1p1f2.AERmon.toz.gr.v20180917 + - CMIP6.CMIP.CNRM-CERFACS.CNRM-CM6-1.historical.r1i1p1f2.fx.areacella.gr.v20180917 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr_r1i1p1f2_CNRM-ESM2-1__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.CNRM-CERFACS.CNRM-ESM2-1.historical.r13i1p1f2.fx.areacella.gr.v20250328 + - CMIP6.CMIP.CNRM-CERFACS.CNRM-ESM2-1.historical.r1i1p1f2.AERmon.toz.gr.v20181206 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_EC-Earth3-AerChem_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.EC-Earth-Consortium.EC-Earth3-AerChem.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gn.v20200624 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_GISS-E2-1-G_r1i1p3f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.NASA-GISS.GISS-E2-1-G.historical.r1i1p3f1.glb.mon.toz.tavg-u-hxy-u.gn.v20220525 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_GISS-E2-1-H_r1i1p3f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.NASA-GISS.GISS-E2-1-H.historical.r1i1p3f1.glb.mon.toz.tavg-u-hxy-u.gn.v20220525 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_GISS-E2-2-G_r1i1p3f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.NASA-GISS.GISS-E2-2-G.historical.r1i1p3f1.glb.mon.toz.tavg-u-hxy-u.gn.v20211020 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_MIROC-ES2H_r1i1p4f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.MIROC.MIROC-ES2H.historical.r1i1p4f2.glb.mon.toz.tavg-u-hxy-u.gn.v20220322 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_MPI-ESM-1-2-HAM_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.HAMMOZ-Consortium.MPI-ESM-1-2-HAM.historical.r1i1p1f1.glb.fx.areacella.ti-u-hxy-u.gn.v20190627 + - CMIP7.CMIP.HAMMOZ-Consortium.MPI-ESM-1-2-HAM.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gn.v20190627 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_MRI-ESM2-0_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.MRI.MRI-ESM2-0.historical.r1i1p1f1.glb.fx.areacella.ti-u-hxy-u.gn.v20190603 + - CMIP7.CMIP.MRI.MRI-ESM2-0.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gn.v20200207 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_UKESM1-0-LL_r1i1p1f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.MOHC.UKESM1-0-LL.historical.r1i1p1f2.glb.mon.toz.tavg-u-hxy-u.gn.v20190406 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_UKESM1-1-LL_r1i1p1f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.MOHC.UKESM1-1-LL.historical.r1i1p1f2.glb.mon.toz.tavg-u-hxy-u.gn.v20220512 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr1_GFDL-ESM4_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.NOAA-GFDL.GFDL-ESM4.historical.r1i1p1f1.glb.fx.areacella.ti-u-hxy-u.gr1.v20190726 + - CMIP7.CMIP.NOAA-GFDL.GFDL-ESM4.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gr1.v20190726 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr_CNRM-CM6-1_r1i1p1f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.CNRM-CERFACS.CNRM-CM6-1.historical.r1i1p1f2.glb.fx.areacella.ti-u-hxy-u.gr.v20180917 + - CMIP7.CMIP.CNRM-CERFACS.CNRM-CM6-1.historical.r1i1p1f2.glb.mon.toz.tavg-u-hxy-u.gr.v20180917 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr_CNRM-ESM2-1_r1i1p1f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.CNRM-CERFACS.CNRM-ESM2-1.historical.r13i1p1f2.glb.fx.areacella.ti-u-hxy-u.gr.v20250328 + - CMIP7.CMIP.CNRM-CERFACS.CNRM-ESM2-1.historical.r1i1p1f2.glb.mon.toz.tavg-u-hxy-u.gr.v20181206 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr_IPSL-CM5A2-INCA_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.IPSL.IPSL-CM5A2-INCA.historical.r1i1p1f1.glb.fx.areacella.ti-u-hxy-u.gr.v20200729 + - CMIP7.CMIP.IPSL.IPSL-CM5A2-INCA.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gr.v20200729 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr_IPSL-CM6A-LR-INCA_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.IPSL.IPSL-CM6A-LR-INCA.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gr.v20210216 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 diff --git a/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_sh_oct_.yml b/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_sh_oct_.yml new file mode 100644 index 000000000..b9c297465 --- /dev/null +++ b/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_sh_oct_.yml @@ -0,0 +1,152 @@ +cmip6_gn_r1i1p1f1_EC-Earth3-AerChem__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.EC-Earth-Consortium.EC-Earth3-AerChem.historical.r1i1p1f1.AERmon.toz.gn.v20200624 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p1f1_MPI-ESM-1-2-HAM__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.HAMMOZ-Consortium.MPI-ESM-1-2-HAM.historical.r1i1p1f1.AERmon.toz.gn.v20190627 + - CMIP6.CMIP.HAMMOZ-Consortium.MPI-ESM-1-2-HAM.historical.r1i1p1f1.fx.areacella.gn.v20190627 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p1f1_MRI-ESM2-0__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.MRI.MRI-ESM2-0.historical.r1i1p1f1.AERmon.toz.gn.v20200207 + - CMIP6.CMIP.MRI.MRI-ESM2-0.historical.r1i1p1f1.fx.areacella.gn.v20190603 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p1f2_UKESM1-0-LL__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.MOHC.UKESM1-0-LL.historical.r1i1p1f2.AERmon.toz.gn.v20190406 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p1f2_UKESM1-1-LL__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.MOHC.UKESM1-1-LL.historical.r1i1p1f2.AERmon.toz.gn.v20220512 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p3f1_GISS-E2-1-G__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.NASA-GISS.GISS-E2-1-G.historical.r1i1p3f1.AERmon.toz.gn.v20220525 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p3f1_GISS-E2-1-H__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.NASA-GISS.GISS-E2-1-H.historical.r1i1p3f1.AERmon.toz.gn.v20220525 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p3f1_GISS-E2-2-G__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.NASA-GISS.GISS-E2-2-G.historical.r1i1p3f1.AERmon.toz.gn.v20211020 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p4f2_MIROC-ES2H__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.MIROC.MIROC-ES2H.historical.r1i1p4f2.AERmon.toz.gn.v20220322 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr1_r1i1p1f1_GFDL-ESM4__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.NOAA-GFDL.GFDL-ESM4.historical.r1i1p1f1.AERmon.toz.gr1.v20190726 + - CMIP6.CMIP.NOAA-GFDL.GFDL-ESM4.historical.r1i1p1f1.fx.areacella.gr1.v20190726 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr_r1i1p1f1_IPSL-CM5A2-INCA__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.IPSL.IPSL-CM5A2-INCA.historical.r1i1p1f1.AERmon.toz.gr.v20200729 + - CMIP6.CMIP.IPSL.IPSL-CM5A2-INCA.historical.r1i1p1f1.fx.areacella.gr.v20200729 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr_r1i1p1f1_IPSL-CM6A-LR-INCA__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.IPSL.IPSL-CM6A-LR-INCA.historical.r1i1p1f1.AERmon.toz.gr.v20210216 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr_r1i1p1f2_CNRM-CM6-1__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.CNRM-CERFACS.CNRM-CM6-1.historical.r1i1p1f2.AERmon.toz.gr.v20180917 + - CMIP6.CMIP.CNRM-CERFACS.CNRM-CM6-1.historical.r1i1p1f2.fx.areacella.gr.v20180917 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr_r1i1p1f2_CNRM-ESM2-1__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.CNRM-CERFACS.CNRM-ESM2-1.historical.r13i1p1f2.fx.areacella.gr.v20250328 + - CMIP6.CMIP.CNRM-CERFACS.CNRM-ESM2-1.historical.r1i1p1f2.AERmon.toz.gr.v20181206 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_EC-Earth3-AerChem_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.EC-Earth-Consortium.EC-Earth3-AerChem.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gn.v20200624 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_GISS-E2-1-G_r1i1p3f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.NASA-GISS.GISS-E2-1-G.historical.r1i1p3f1.glb.mon.toz.tavg-u-hxy-u.gn.v20220525 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_GISS-E2-1-H_r1i1p3f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.NASA-GISS.GISS-E2-1-H.historical.r1i1p3f1.glb.mon.toz.tavg-u-hxy-u.gn.v20220525 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_GISS-E2-2-G_r1i1p3f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.NASA-GISS.GISS-E2-2-G.historical.r1i1p3f1.glb.mon.toz.tavg-u-hxy-u.gn.v20211020 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_MIROC-ES2H_r1i1p4f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.MIROC.MIROC-ES2H.historical.r1i1p4f2.glb.mon.toz.tavg-u-hxy-u.gn.v20220322 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_MPI-ESM-1-2-HAM_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.HAMMOZ-Consortium.MPI-ESM-1-2-HAM.historical.r1i1p1f1.glb.fx.areacella.ti-u-hxy-u.gn.v20190627 + - CMIP7.CMIP.HAMMOZ-Consortium.MPI-ESM-1-2-HAM.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gn.v20190627 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_MRI-ESM2-0_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.MRI.MRI-ESM2-0.historical.r1i1p1f1.glb.fx.areacella.ti-u-hxy-u.gn.v20190603 + - CMIP7.CMIP.MRI.MRI-ESM2-0.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gn.v20200207 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_UKESM1-0-LL_r1i1p1f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.MOHC.UKESM1-0-LL.historical.r1i1p1f2.glb.mon.toz.tavg-u-hxy-u.gn.v20190406 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_UKESM1-1-LL_r1i1p1f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.MOHC.UKESM1-1-LL.historical.r1i1p1f2.glb.mon.toz.tavg-u-hxy-u.gn.v20220512 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr1_GFDL-ESM4_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.NOAA-GFDL.GFDL-ESM4.historical.r1i1p1f1.glb.fx.areacella.ti-u-hxy-u.gr1.v20190726 + - CMIP7.CMIP.NOAA-GFDL.GFDL-ESM4.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gr1.v20190726 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr_CNRM-CM6-1_r1i1p1f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.CNRM-CERFACS.CNRM-CM6-1.historical.r1i1p1f2.glb.fx.areacella.ti-u-hxy-u.gr.v20180917 + - CMIP7.CMIP.CNRM-CERFACS.CNRM-CM6-1.historical.r1i1p1f2.glb.mon.toz.tavg-u-hxy-u.gr.v20180917 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr_CNRM-ESM2-1_r1i1p1f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.CNRM-CERFACS.CNRM-ESM2-1.historical.r13i1p1f2.glb.fx.areacella.ti-u-hxy-u.gr.v20250328 + - CMIP7.CMIP.CNRM-CERFACS.CNRM-ESM2-1.historical.r1i1p1f2.glb.mon.toz.tavg-u-hxy-u.gr.v20181206 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr_IPSL-CM5A2-INCA_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.IPSL.IPSL-CM5A2-INCA.historical.r1i1p1f1.glb.fx.areacella.ti-u-hxy-u.gr.v20200729 + - CMIP7.CMIP.IPSL.IPSL-CM5A2-INCA.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gr.v20200729 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr_IPSL-CM6A-LR-INCA_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.IPSL.IPSL-CM6A-LR-INCA.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gr.v20210216 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 diff --git a/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_zonal_.yml b/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_zonal_.yml new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_zonal_.yml @@ -0,0 +1 @@ +{} diff --git a/packages/climate-ref/src/climate_ref/conftest_plugin.py b/packages/climate-ref/src/climate_ref/conftest_plugin.py index 96761d275..0bf5a7c62 100644 --- a/packages/climate-ref/src/climate_ref/conftest_plugin.py +++ b/packages/climate-ref/src/climate_ref/conftest_plugin.py @@ -178,7 +178,7 @@ def esgf_data_catalog_trimmed( result = {} for source_type, df in esgf_solve_catalog.items(): if source_type in (SourceDatasetType.CMIP6, SourceDatasetType.CMIP7): - source_ids = ["ACCESS-ESM1-5", "CESM2", "MPI-ESM1-2-LR"] + source_ids = ["ACCESS-ESM1-5", "CESM2", "MPI-ESM1-2-LR", "GFDL-ESM4"] result[source_type] = df[df["source_id"].isin(source_ids)] else: result[source_type] = df diff --git a/scripts/extract-data-request-mappings.py b/scripts/extract-data-request-mappings.py index b3adbafe9..757e02f2e 100644 --- a/scripts/extract-data-request-mappings.py +++ b/scripts/extract-data-request-mappings.py @@ -93,6 +93,7 @@ "ts", # Ozone "toz", + "o3", # Atmosphere: winds "tauu", "ua", diff --git a/scripts/fetch-esgf.py b/scripts/fetch-esgf.py index ad05a97d0..9538ca5ce 100644 --- a/scripts/fetch-esgf.py +++ b/scripts/fetch-esgf.py @@ -248,11 +248,18 @@ def fetch(self, remove_ensembles: bool = True): CMIP6Request( id="esmvaltool-ozone", facets=dict( - variable_id=["toz"], + variable_id=["toz", "o3"], experiment_id=["historical"], table_id="AERmon", ), ), + Obs4MIPsRequest( + id="esmvaltool-ozone-obs4mips", + facets=dict( + source_id="C3S-GTO-ECV-9-0", + variable_id="toz", + ), + ), # ILAMB data CMIP6Request( id="ilamb-data", diff --git a/tests/test-data/esgf-catalog/obs4mips_catalog.parquet b/tests/test-data/esgf-catalog/obs4mips_catalog.parquet index 37d84e4cc..013db46c1 100644 Binary files a/tests/test-data/esgf-catalog/obs4mips_catalog.parquet and b/tests/test-data/esgf-catalog/obs4mips_catalog.parquet differ