Source code for energy_demand.assumptions.strategy_vars_def

"""Strategy variable assumptions provided as parameters to smif
"""
from collections import defaultdict

from energy_demand.read_write import narrative_related

[docs]def generate_default_parameter_narratives( default_streategy_vars, end_yr=2050, base_yr=2015 ): """Load default parameters and create default timesteps Arguments --------- default_streategy_vars : dict Default parameter values end_yr : int Simulation end year base_yr : int Base year Returns ------- strategy_vars : dict Strategy variables """ strategy_vars = defaultdict(dict) # Create default narrative for every simulation parameter for var_name, var_entries in default_streategy_vars.items(): crit_single_dim = narrative_related.crit_dim_var(var_entries) if crit_single_dim: # Create default narrative with only one timestep from simulation base year to simulation end year strategy_vars[var_name] = narrative_related.default_narrative( end_yr=end_yr, value_by=var_entries['default_value'], value_ey=var_entries['default_value'], diffusion_choice=var_entries['diffusion_type'], base_yr=base_yr, regional_specific=var_entries['regional_specific']) # Criteria whether the same for all regions or not else: # Standard narrative for multidimensional narrative for sub_var_name, sub_var_entries in var_entries.items(): try: scenario_value = sub_var_entries['scenario_value'] except TypeError: raise TypeError("{}: Var_entries dict: {}".format(var_name, var_entries)) # Crate single-step default narratives (up to end_year) strategy_vars[var_name][sub_var_name] = narrative_related.default_narrative( end_yr=end_yr, value_by=sub_var_entries['default_value'], value_ey=scenario_value, diffusion_choice=sub_var_entries['diffusion_type'], base_yr=base_yr, regional_specific=sub_var_entries['regional_specific']) return dict(strategy_vars)
[docs]def load_param_assump( default_values=None, hard_coded_default_val=True ): """All assumptions of the energy demand model are loaded and added to the data dictionary Arguments --------- Returns ------- data : dict Data dictionary with added ssumption dict """ strategy_vars = defaultdict(dict) if hard_coded_default_val: default_values = { 'ss_t_cooling': 5, 'is_t_heating': 15.5, 'gshp_fraction': 0.1, 'p_cold_rolling_steel_by': 0.2, 'rs_t_heating': 15.5, 'smart_meter_p_by': 0.05, 'cooled_ss_floorarea_by': 0.35, 'speed_con_max': 1, 'spatial_explicit_diffusion': 0, 'ss_t_heating': 15.5} default_enduses = { # Submodel Residential 'rs_space_heating': 0, 'rs_water_heating': 0, 'rs_lighting': 0, 'rs_cooking': 0, 'rs_cold': 0, 'rs_wet': 0, 'rs_consumer_electronics': 0, 'rs_home_computing': 0, # Submodel Service (Table 5.5a) # same % improvements from baseline over all sectors 'ss_space_heating': 0, 'ss_water_heating': 0, 'ss_cooling_humidification': 0, 'ss_fans': 0, 'ss_lighting': 0, 'ss_catering': 0, 'ss_small_power': 0, 'ss_ICT_equipment': 0, 'ss_cooled_storage': 0, 'ss_other_gas': 0, 'ss_other_electricity': 0, # Submodel Industry # same % improvements from baseline over all sectors 'is_high_temp_process': 0, 'is_low_temp_process': 0, 'is_drying_separation': 0, 'is_motors': 0, 'is_compressed_air': 0, 'is_lighting': 0, 'is_space_heating': 0, 'is_other': 0, 'is_refrigeration': 0} # ------------------ # Spatial explicit diffusion # ------------------ strategy_vars['spatial_explicit_diffusion'] = { "name": "spatial_explicit_diffusion", "description": "Criteria to define spatial or non spatial diffusion", "default_value": default_values['spatial_explicit_diffusion'], "sector": True, 'regional_specific': False, 'diffusion_type': 'linear'} strategy_vars['speed_con_max'] = { "name": "speed_con_max", "description": "Maximum speed of penetration (for spatial explicit diffusion)", "default_value": default_values['speed_con_max'], "sector": True, 'regional_specific': False, 'diffusion_type': 'linear'} # ---------------------- # Heat pump technology mix # Source: Hannon 2015: Raising the temperature of the UK heat pump market: Learning lessons from Finland # ---------------------- strategy_vars['gshp_fraction'] = { "name": "gshp_fraction", "description": "Relative GSHP (%) to GSHP+ASHP", "default_value": default_values['gshp_fraction'], "sector": True, 'regional_specific': False, 'diffusion_type': 'linear'} # ============================================================ # Demand management assumptions (daily demand shape) # An improvement in load factor improvement can be assigned # for every enduse (peak shaving) # # Example: 0.2 --> Improvement in load factor until ey # ============================================================ # Helper function to create description of parameters for all enduses for demand_name, scenario_value in default_enduses.items(): strategy_vars['dm_improvement'][demand_name] = { "name": demand_name, "description": "reduction in load factor for enduse {}".format(demand_name), "default_value": scenario_value, "sector": True, "enduse": [demand_name], 'regional_specific': True, 'diffusion_type': 'linear'} # ============================================================ # Base temperature assumptions for heating and cooling demand # The diffusion is asumed to be linear # ============================================================ strategy_vars['rs_t_base_heating'] = { "name": "rs_t_base_heating", "description": "Base temperature assumption residential heating", "default_value": default_values['rs_t_heating'], "sector": True, 'regional_specific': False, 'diffusion_type': 'linear'} # Future base year temperature strategy_vars['ss_t_base_heating'] = { "name": "ss_t_base_heating", "description": "Base temperature assumption service sector heating", "default_value": default_values['ss_t_heating'], "sector": True, 'regional_specific': False, 'diffusion_type': 'linear'} # Cooling base temperature # Future base year temperature strategy_vars['ss_t_base_cooling'] = { "name": "ss_t_base_cooling", "description": "Base temperature assumption service sector cooling", "default_value": default_values['ss_t_cooling'], "sector": True, 'regional_specific': False, 'diffusion_type': 'linear'} # Future base year temperature strategy_vars['is_t_base_heating'] = { "name": "is_t_base_heating", "description": "Base temperature assumption service sector heating", "default_value": default_values['is_t_heating'], "sector": True, 'regional_specific': False, 'diffusion_type': 'linear'} # ============================================================ # Smart meter penetration # ============================================================ strategy_vars['smart_meter_p'] = { "name": "smart_meter_p", "description": "Improvement of smart meter penetration", "default_value": default_values['smart_meter_p_by'], "sector": True, 'regional_specific': True, 'diffusion_type': 'linear'} # ============================================================ # Cooling # ============================================================ cooled_floorarea = { 'ss_cooling_humidification': default_values['cooled_ss_floorarea_by'], 'ss_fans': default_values['cooled_ss_floorarea_by']} for sub_param_name, sub_param_value in cooled_floorarea.items(): strategy_vars['cooled_floorarea'][sub_param_name] = { "name": sub_param_name, "description": "Change in cooling of floor area (service sector)", "default_value": sub_param_value, "sector": True, 'regional_specific': True, 'diffusion_type': 'linear'} # ============================================================ # Industrial processes # ============================================================ strategy_vars['p_cold_rolling_steel'] = { "name": "p_cold_rolling_steel", "description": "Sectoral share of cold rolling in steel manufacturing)", "default_value": default_values['p_cold_rolling_steel_by'], "sector": True, 'regional_specific': True, 'diffusion_type': 'linear'} # ============================================================ # Heat recycling & reuse # ============================================================ heat_recovered = { 'rs_space_heating': 0, 'ss_space_heating': 0, 'is_space_heating': 0, 'rs_water_heating': 0, 'ss_water_heating': 0} for sub_param_name, sub_param_value in heat_recovered.items(): strategy_vars['heat_recovered'][sub_param_name] = { "name": sub_param_name, "description": "Reduction in heat because of heat recovery and recycling", "default_value": sub_param_value, "sector": True, "enduse": [sub_param_name], 'regional_specific': True, 'diffusion_type': 'linear'} # ============================================================ # Air leakage # ============================================================ air_leakage = { 'rs_space_heating': 0, 'ss_space_heating': 0, 'is_space_heating': 0} for sub_param_name, sub_param_value in air_leakage.items(): strategy_vars['air_leakage'][sub_param_name] = { "name": sub_param_name, "description": "Reduction in heat because of air leakage improvement (residential sector)", "default_value": sub_param_value, "sector": True, "enduse": [sub_param_name], 'regional_specific': True, 'diffusion_type': 'linear'} # --------------------------------------------------------- # General change in fuel consumption for specific enduses # --------------------------------------------------------- # With these assumptions, general efficiency gain (across all fueltypes) # can be defined for specific enduses. This may be e.g. due to general # efficiency gains or anticipated increases in demand. # NTH: Specific hanges per fueltype (not across al fueltesp) # # Change in fuel until the simulation end year ( # if no change set to 1, if e.g. 10% decrease change to 0.9) # ------------------------------------------------------- # Helper function to create description of parameters for all enduses for enduse, param_value in default_enduses.items(): strategy_vars['generic_enduse_change'][enduse] = { "name": enduse, "description": "Enduse specific change {}".format(enduse), "default_value": param_value, "sector": True, "enduse": [enduse], "sector": [], 'regional_specific': True, 'diffusion_type': 'linear'} # ============================================================ # Technologies & efficiencies # ============================================================ # --Assumption how much of technological efficiency is reached strategy_vars["f_eff_achieved"] = { "name": "f_eff_achieved", "description": "Fraction achieved of efficiency improvements", "default_value": 0, # Default is no efficiency improvement "sector": True, 'regional_specific': False, 'diffusion_type': 'linear'} # -------------------------------------- # Floor area per person change # --------------------------------------- strategy_vars["assump_diff_floorarea_pp"] = { "name": "assump_diff_floorarea_pp", "description": "Change in floor area per person (%, 1=100%)", "default_value": 0, "sector": True, 'regional_specific': False, 'diffusion_type': 'linear'} # ----------------------- # Generic enduse and sector specific fuel switches # ----------------------- for enduse, param_value in default_enduses.items(): strategy_vars["generic_fuel_switch"][enduse] = { "name": "generic_fuel_switch", "description": "Generic fuel switches to switch fuel in any enduse and sector", "default_value": param_value, "enduse": enduse, "sector": True, 'regional_specific': True, 'diffusion_type': 'linear'} strategy_vars_out = autocomplete_strategy_vars(strategy_vars) return dict(strategy_vars_out)
[docs]def autocomplete_strategy_vars( strategy_vars, narrative_crit=False ): """Autocomplete all narratives or strategy variables with and 'enduse' or 'sector' in case they are not defined. Arguments ---------- strategy_vars Returns ------- narrative_crit : bool Criteria wheter inputs are a narrative or not """ if not narrative_crit: out_dict = defaultdict(dict) for var_name, var_entries in strategy_vars.items(): crit_single_dim = narrative_related.crit_dim_var(var_entries) if crit_single_dim: out_dict[var_name] = var_entries # If no 'enduse' defined, add empty list of affected enduses out_dict[var_name]['scenario_value'] = var_entries['default_value'] if 'enduse' not in var_entries: out_dict[var_name]['enduse'] = [] if 'sector' not in var_entries: out_dict[var_name]['sector'] = True # All sector else: for sub_var_name, sub_var_entries in var_entries.items(): out_dict[var_name][sub_var_name] = sub_var_entries out_dict[var_name][sub_var_name]['scenario_value'] = sub_var_entries['default_value'] # If no 'enduse' defined, add empty list of affected enduses if 'enduse' not in sub_var_entries: out_dict[var_name][sub_var_name]['enduse'] = [] if 'sector' not in sub_var_entries: out_dict[var_name][sub_var_name]['sector'] = True # All sector else: # Same but narratives which need to be iterated out_dict = {} for var_name, var_entries in strategy_vars.items(): out_dict[var_name] = {} crit_single_dim = narrative_related.crit_dim_var(var_entries) if crit_single_dim: updated_narratives = [] for narrative in var_entries: #If no 'enduse' defined, add empty list of affected enduses if 'enduse' not in narrative: narrative['enduse'] = [] if 'sector' not in narrative: narrative['sector'] = 'dummy_sector' # All sector updated_narratives.append(narrative) out_dict[var_name] = updated_narratives else: #print(" ...user defined variable: %s", var_name) for sub_var_name, sector_sub_var_entries in var_entries.items(): if type(sector_sub_var_entries) is dict: # If sectors are defined for sector, sub_var_entries in sector_sub_var_entries.items(): out_dict[var_name][sub_var_name] = {} updated_narratives = [] for narrative in sub_var_entries: # If no 'enduse' defined, add empty list of affected enduses if 'enduse' not in narrative: narrative['enduse'] = [] if 'sector' not in narrative: narrative['sector'] = sector updated_narratives.append(narrative) out_dict[var_name][sub_var_name][sector] = updated_narratives else: # no sectors defined updated_narratives = [] for narrative in sector_sub_var_entries: if 'enduse' not in narrative: narrative['enduse'] = [sub_var_name] updated_narratives.append(narrative) out_dict[var_name][sub_var_name] = updated_narratives return dict(out_dict)
[docs]def get_affected_enduse(strategy_vars, name): """Get all defined affected enduses of a scenario variable Arguments --------- strategy_vars : dict Dict with all defined strategy variables name : str Name of variable to get Returns ------- enduses : list AFfected enduses of scenario variable """ try: for var in strategy_vars: if var['name'] == name: enduses = var['enduse'] return enduses except KeyError: # Not affected enduses defined enduses = [] return enduses