diff --git a/config.default.yaml b/config.default.yaml index fecf222a..ee1c5059 100644 --- a/config.default.yaml +++ b/config.default.yaml @@ -178,19 +178,25 @@ sector: bev_avail_mean: 0.8 v2g: true #allows feed-in to grid from EV battery #what is not EV or FCEV is oil-fuelled ICE - land_transport_fuel_cell_share: # 1 means all FCEVs + land_transport_fuel_cell_share: 2020: 0 2030: 0.05 2040: 0.1 2050: 0.15 - land_transport_electric_share: # 1 means all EVs + land_transport_electric_share: 2020: 0 2030: 0.25 2040: 0.6 2050: 0.85 + land_transport_ice_share: + 2020: 1 + 2030: 0.7 + 2040: 0.3 + 2050: 0 transport_fuel_cell_efficiency: 0.5 transport_internal_combustion_efficiency: 0.3 agriculture_machinery_electric_share: 0 + agriculture_machinery_oil_share: 1 agriculture_machinery_fuel_efficiency: 0.7 # fuel oil per use agriculture_machinery_electric_efficiency: 0.3 # electricity per use MWh_MeOH_per_MWh_H2: 0.8787 # in LHV, source: DECHEMA (2017): Low carbon energy and feedstock for the European chemical industry , pg. 64. @@ -202,6 +208,8 @@ sector: shipping_oil_share: 0 shipping_methanol_efficiency: 0.46 # 10-15% higher https://www.iea-amf.org/app/webroot/files/file/Annex%20Reports/AMF_Annex_56.pdf, https://users.ugent.be/~lsileghe/documents/extended_abstract.pdf shipping_oil_efficiency: 0.40 #For conversion of fuel oil to propulsion in 2011 + aviation_demand_factor: 1. # relative aviation demand compared to today + HVC_demand_factor: 1. # relative HVC demand compared to today time_dep_hp_cop: true #time dependent heat pump coefficient of performance heat_pump_sink_T: 55. # Celsius, based on DTU / large area radiators; used in build_cop_profiles.py # conservatively high to cover hot water and space heating in poorly-insulated buildings diff --git a/doc/release_notes.rst b/doc/release_notes.rst index ef92357a..fd9a3549 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -88,6 +88,11 @@ incorporates retrofitting options to hydrogen. * Improved network plots including better legends, hydrogen retrofitting network display, and change to EqualEarth projection. +* New config options for changing energy demands in aviation + (``aviation_demand_factor``) and HVC industry (``HVC_demand_factor``), as well + as explicit ICE shares for land transport (``land_transport_ice_share``) and + agriculture machinery (``agriculture_machinery_oil_share``). + **Bugfixes** * The CO2 sequestration limit implemented as GlobalConstraint (introduced in the previous version) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index b40c2084..491c44dc 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1273,13 +1273,15 @@ def add_land_transport(n, costs): fuel_cell_share = get(options["land_transport_fuel_cell_share"], investment_year) electric_share = get(options["land_transport_electric_share"], investment_year) - ice_share = 1 - fuel_cell_share - electric_share + ice_share = get(options["land_transport_ice_share"], investment_year) + + total_share = fuel_cell_share + electric_share + ice_share + if total_share != 1: + logger.warning(f"Total land transport shares sum up to {total_share*100}%, corresponding to increased or decreased demand assumptions.") - print("FCEV share", fuel_cell_share) - print("EV share", electric_share) - print("ICEV share", ice_share) - - assert ice_share >= 0, "Error, more FCEV and EV share than 1." + logger.info(f"FCEV share: {fuel_cell_share*100}%") + logger.info(f"EV share: {electric_share*100}%") + logger.info(f"ICEV share: {ice_share*100}%") nodes = pop_layout.index @@ -2321,15 +2323,23 @@ def add_industry(n, costs): lifetime=costs.at['Fischer-Tropsch', 'lifetime'] ) + demand_factor = options.get("HVC_demand_factor", 1) + p_set = demand_factor * industrial_demand.loc[nodes, "naphtha"].sum() / 8760 + if demand_factor != 1: + logger.warning(f"Changing HVC demand by {demand_factor*100-100:+.2f}%.") + n.madd("Load", ["naphtha for industry"], bus=spatial.oil.nodes, carrier="naphtha for industry", - p_set=industrial_demand.loc[nodes, "naphtha"].sum() / 8760 + p_set=p_set ) + demand_factor = options.get("aviation_demand_factor", 1) all_aviation = ["total international aviation", "total domestic aviation"] - p_set = pop_weighted_energy_totals.loc[nodes, all_aviation].sum(axis=1).sum() * 1e6 / 8760 + p_set = demand_factor * pop_weighted_energy_totals.loc[nodes, all_aviation].sum(axis=1).sum() * 1e6 / 8760 + if demand_factor != 1: + logger.warning(f"Changing aviation demand by {demand_factor*100-100:+.2f}%.") n.madd("Load", ["kerosene for aviation"], @@ -2480,8 +2490,11 @@ def add_agriculture(n, costs): # machinery electric_share = get(options["agriculture_machinery_electric_share"], investment_year) - assert electric_share <= 1. - ice_share = 1 - electric_share + oil_share = get(options["agriculture_machinery_oil_share"], investment_year) + + total_share = electric_share + oil_share + if total_share != 1: + logger.warning(f"Total agriculture machinery shares sum up to {total_share*100}%, corresponding to increased or decreased demand assumptions.") machinery_nodal_energy = pop_weighted_energy_totals.loc[nodes, "total agriculture machinery"] @@ -2497,16 +2510,16 @@ def add_agriculture(n, costs): p_set=electric_share / efficiency_gain * machinery_nodal_energy * 1e6 / 8760, ) - if ice_share > 0: + if oil_share > 0: n.madd("Load", ["agriculture machinery oil"], bus=spatial.oil.nodes, carrier="agriculture machinery oil", - p_set=ice_share * machinery_nodal_energy.sum() * 1e6 / 8760 + p_set=oil_share * machinery_nodal_energy.sum() * 1e6 / 8760 ) - co2 = ice_share * machinery_nodal_energy.sum() * 1e6 / 8760 * costs.at["oil", 'CO2 intensity'] + co2 = oil_share * machinery_nodal_energy.sum() * 1e6 / 8760 * costs.at["oil", 'CO2 intensity'] n.add("Load", "agriculture machinery oil emissions",