Skip to content

climate_ref_esmvaltool.diagnostics.climate_at_global_warming_levels #

ClimateAtGlobalWarmingLevels #

Bases: ESMValToolDiagnostic

Calculate climate variables at global warming levels.

Source code in packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/climate_at_global_warming_levels.py
class ClimateAtGlobalWarmingLevels(ESMValToolDiagnostic):
    """
    Calculate climate variables at global warming levels.
    """

    name = "Climate variables at global warming levels"
    slug = "climate-at-global-warming-levels"
    base_recipe = "recipe_calculate_gwl_exceedance_stats.yml"

    variables = (
        "pr",
        "tas",
    )

    matching_facets = (
        "source_id",
        "member_id",
        "grid_label",
        "table_id",
        "variable_id",
    )

    data_requirements = (
        DataRequirement(
            source_type=SourceDatasetType.CMIP6,
            filters=(
                FacetFilter(
                    facets={
                        "variable_id": variables,
                        "experiment_id": (
                            "ssp126",
                            "ssp245",
                            "ssp370",
                            "ssp585",
                        ),
                        "table_id": "Amon",
                    },
                ),
            ),
            group_by=("experiment_id",),
            constraints=(
                AddSupplementaryDataset(
                    supplementary_facets={"experiment_id": "historical"},
                    matching_facets=matching_facets,
                    optional_matching_facets=tuple(),
                ),
                RequireTimerange(
                    group_by=matching_facets,
                    start=PartialDateTime(year=1850, month=1),
                    end=PartialDateTime(year=2100, month=12),
                ),
                RequireFacets(
                    "experiment_id",
                    required_facets=("historical",),
                    group_by=matching_facets,
                ),
                RequireFacets(
                    "variable_id",
                    required_facets=variables,
                    group_by=("experiment_id", "source_id", "member_id", "grid_label", "table_id"),
                ),
                AddSupplementaryDataset.from_defaults("areacella", SourceDatasetType.CMIP6),
            ),
        ),
    )
    facets = ()

    @staticmethod
    def update_recipe(
        recipe: Recipe,
        input_files: dict[SourceDatasetType, pandas.DataFrame],
    ) -> None:
        """Update the recipe."""
        # Set up the datasets
        diagnostics = recipe["diagnostics"]
        for diagnostic in diagnostics.values():
            diagnostic.pop("additional_datasets")
        recipe_variables = dataframe_to_recipe(
            input_files[SourceDatasetType.CMIP6],
            group_by=(
                "source_id",
                "member_id",
                "grid_label",
                "table_id",
                "variable_id",
            ),
        )
        datasets = recipe_variables["tas"]["additional_datasets"]
        datasets = [ds for ds in datasets if ds["exp"] != "historical"]
        for dataset in datasets:
            dataset.pop("timerange")
        recipe["datasets"] = datasets

        # Specify the timeranges
        diagnostics["calculate_gwl_exceedance_years"]["variables"]["tas_anomaly"] = {
            "short_name": "tas",
            "preprocessor": "calculate_anomalies",
            "timerange": "1850/2100",
        }

        diagnostics["gwl_mean_plots_tas"]["variables"]["tas"] = {
            "short_name": "tas",
            "preprocessor": "multi_model_gwl_stats",
            "timerange": "2000/2100",
        }

        diagnostics["gwl_mean_plots_pr"]["variables"]["pr"] = {
            "short_name": "pr",
            "preprocessor": "multi_model_gwl_stats",
            "timerange": "2000/2100",
        }

update_recipe(recipe, input_files) staticmethod #

Update the recipe.

Source code in packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/climate_at_global_warming_levels.py
@staticmethod
def update_recipe(
    recipe: Recipe,
    input_files: dict[SourceDatasetType, pandas.DataFrame],
) -> None:
    """Update the recipe."""
    # Set up the datasets
    diagnostics = recipe["diagnostics"]
    for diagnostic in diagnostics.values():
        diagnostic.pop("additional_datasets")
    recipe_variables = dataframe_to_recipe(
        input_files[SourceDatasetType.CMIP6],
        group_by=(
            "source_id",
            "member_id",
            "grid_label",
            "table_id",
            "variable_id",
        ),
    )
    datasets = recipe_variables["tas"]["additional_datasets"]
    datasets = [ds for ds in datasets if ds["exp"] != "historical"]
    for dataset in datasets:
        dataset.pop("timerange")
    recipe["datasets"] = datasets

    # Specify the timeranges
    diagnostics["calculate_gwl_exceedance_years"]["variables"]["tas_anomaly"] = {
        "short_name": "tas",
        "preprocessor": "calculate_anomalies",
        "timerange": "1850/2100",
    }

    diagnostics["gwl_mean_plots_tas"]["variables"]["tas"] = {
        "short_name": "tas",
        "preprocessor": "multi_model_gwl_stats",
        "timerange": "2000/2100",
    }

    diagnostics["gwl_mean_plots_pr"]["variables"]["pr"] = {
        "short_name": "pr",
        "preprocessor": "multi_model_gwl_stats",
        "timerange": "2000/2100",
    }