Source code for openairclim.calc_metric

"""
Calculates climate metric for each species and scenario
"""

import numpy as np
from openairclim.read_netcdf import get_results


[docs] def calc_climate_metrics(config: dict) -> dict: """Get all combinations of required climate metrics Args: config (dict): Configuration from config file Returns: dict: Dictionary of dictionaries containing climate metrics values, keys are unique climate metrics identifiers for each combination and species """ metrics_type_arr = config["metrics"]["types"] t_zero_arr = config["metrics"]["t_0"] horizon_arr = config["metrics"]["H"] _emis_dict, _conc_dict, rf_dict, dtemp_dict = get_results(config) out_dict = {} for metrics_type in metrics_type_arr: for t_zero in t_zero_arr: for horizon in horizon_arr: key = ( metrics_type + "_" + format(horizon, ".0f") + "_" + format(t_zero, ".0f") ) if metrics_type == "ATR": metrics_dict = calc_atr( config, t_zero, horizon, dtemp_dict ) elif metrics_type == "AGWP": metrics_dict = calc_agwp(config, t_zero, horizon, rf_dict) elif metrics_type == "AGTP": metrics_dict = calc_agtp( config, t_zero, horizon, dtemp_dict ) else: pass out_dict[key] = metrics_dict return out_dict
[docs] def calc_atr( config: dict, t_zero: float, horizon: float, dtemp_dict: dict ) -> dict: """ Calculates Average Temperature Response (ATR) climate metrics for each species and the total Args: config (dict): Configuration from config file t_zero (float): start year for metrics calculation horizon (float): time horizon in years dtemp_dict (dict): Dictionary containing temperature changes for each species Returns: dict: Dictionary containing ATR values, keys are species and total """ time_config = config["time"]["range"] delta_t = time_config[2] dtemp_metrics_dict = get_metrics_dict(config, t_zero, horizon, dtemp_dict) # Calcultate ATR for temperature array # # Dallara, E. S., Kroo, I. M., & Waitz, I. A. (2011). # Metric for comparing lifetime average climate impact of aircraft. # AIAA journal, 49(8), 1600-1613. http://dx.doi.org/10.2514/1.J050763 atr_dict = {} for spec, dtemp_arr in dtemp_metrics_dict.items(): atr = 0 for dtemp in dtemp_arr: atr = atr + (dtemp / horizon) * delta_t atr_dict[spec] = atr # Calcultate total ATR (sum of all species) atr_dict["total"] = sum(atr_dict.values()) return atr_dict
[docs] def calc_agwp( config: dict, t_zero: float, horizon: float, rf_dict: dict ) -> dict: """ Calculates the Absolute Global Warming Potential (AGWP) climate metrics for each species and the total Args: config (dict): Configuration from the configuration file. t_zero (float): The start year for the metrics calculation. horizon (float): The time horizon in years. rf_dict (dict): A dictionary containing the RF values for each species. Returns: dict: A dictionary containing the AGWP values for each species and the total. """ # Rodhe, H. (1990). A comparison of the contribution of various gases # to the greenhouse effect. Science, 248(4960), 1217-1219. # http://dx.doi.org/10.1126/science.248.4960.1217 time_config = config["time"]["range"] delta_t = time_config[2] rf_metrics_dict = get_metrics_dict(config, t_zero, horizon, rf_dict) agwp_dict = {} for spec, rf_arr in rf_metrics_dict.items(): agwp = 0 for rf in rf_arr: agwp = agwp + rf * delta_t agwp_dict[spec] = agwp # Calculate total AGWP (sum of all species) agwp_dict["total"] = sum(agwp_dict.values()) return agwp_dict
[docs] def calc_agtp( config: dict, t_zero: float, horizon: float, dtemp_dict: dict ) -> dict: """ Calculates the Absolute Global Temperature Change Potential (AGTP) climate metrics for each species and the total Args: config (dict): Configuration from the configuration file. t_zero (float): The start year for the metrics calculation. horizon (float): The time horizon in years. dtemp_dict (dict): A dictionary containing the temperature changes for each species. Returns: dict: A dictionary containing the AGTP values for each species and the total. """ # Shine, K. P., Fuglestvedt, J. S., Hailemariam, K., & Stuber, N. (2005). # Alternatives to the global warming potential for comparing climate impacts # of emissions of greenhouse gases. Climatic change, 68(3), 281-302. # https://doi.org/10.1007/s10584-005-1146-9 dtemp_metrics_dict = get_metrics_dict(config, t_zero, horizon, dtemp_dict) agtp_dict = {} for spec, dtemp_arr in dtemp_metrics_dict.items(): agtp = dtemp_arr[-1] agtp_dict[spec] = agtp # Calculate total AGTP (sum of all species) agtp_dict["total"] = sum(agtp_dict.values()) return agtp_dict
[docs] def get_metrics_dict( config: dict, t_zero: float, horizon: float, resp_dict: dict ) -> dict: """ Get subset of timeseries dictionary: only for years in time_metrics Args: config (dict): Configuration from config file t_zero (float): start year for metrics calculation horizon (float): time horizon in years resp_dict (dict): Dictionary containing response (RF or dtemp) values for each species Returns: dict: Dictionary containig metrics values only for years in time_metrics, keys are species (and total) """ time_config = config["time"]["range"] time_range = np.arange( time_config[0], time_config[1], time_config[2], dtype=int ) delta_t = time_config[2] # Metrics time range time_metrics = np.arange(t_zero, (t_zero + horizon), delta_t) # Get values in resp_dict for years in time_metrics i = 0 index_arr = [] for year_config in time_range: if year_config in time_metrics: index_arr.append(i) else: pass i = i + 1 resp_metrics_dict = {} for spec, resp_arr in resp_dict.items(): resp_metrics_arr = np.zeros(len(time_metrics)) i = 0 for index in index_arr: resp_metrics_arr[i] = resp_arr[index] i = i + 1 resp_metrics_dict[spec] = resp_metrics_arr return resp_metrics_dict