land transport: allow share of fossil-FCEV-EV to change over time
Allow share of land transport to be set exogenously in config.yaml.
This commit is contained in:
parent
801f0a403d
commit
90e1d75df6
@ -73,8 +73,8 @@ existing_capacities:
|
|||||||
sector:
|
sector:
|
||||||
'central' : True
|
'central' : True
|
||||||
'central_fraction' : 0.6
|
'central_fraction' : 0.6
|
||||||
'dsm_restriction_value' : 0.75 #Set to 0 for no restriction on BEV DSM
|
'bev_dsm_restriction_value' : 0.75 #Set to 0 for no restriction on BEV DSM
|
||||||
'dsm_restriction_time' : 7 #Time at which SOC of BEV has to be dsm_restriction_value
|
'bev_dsm_restriction_time' : 7 #Time at which SOC of BEV has to be dsm_restriction_value
|
||||||
'transport_heating_deadband_upper' : 20.
|
'transport_heating_deadband_upper' : 20.
|
||||||
'transport_heating_deadband_lower' : 15.
|
'transport_heating_deadband_lower' : 15.
|
||||||
'ICE_lower_degree_factor' : 0.375 #in per cent increase in fuel consumption per degree above deadband
|
'ICE_lower_degree_factor' : 0.375 #in per cent increase in fuel consumption per degree above deadband
|
||||||
@ -82,10 +82,22 @@ sector:
|
|||||||
'EV_lower_degree_factor' : 0.98
|
'EV_lower_degree_factor' : 0.98
|
||||||
'EV_upper_degree_factor' : 0.63
|
'EV_upper_degree_factor' : 0.63
|
||||||
'district_heating_loss' : 0.15
|
'district_heating_loss' : 0.15
|
||||||
'bev' : True #turns on EV battery
|
'bev_dsm' : True #turns on EV battery
|
||||||
'bev_availability' : 0.5 #How many cars do smart charging
|
'bev_availability' : 0.5 #How many cars do smart charging
|
||||||
'v2g' : True #allows feed-in to grid from EV battery
|
'v2g' : True #allows feed-in to grid from EV battery
|
||||||
'transport_fuel_cell_share' : 0. #0 means all EVs, 1 means all FCs
|
#what is not EV or FCEV is fossil-fuelled
|
||||||
|
'land_transport_fuel_cell_share': # 1 means all FCEVs
|
||||||
|
2020: 0
|
||||||
|
2030: 0.05
|
||||||
|
2040: 0.1
|
||||||
|
2050: 0.15
|
||||||
|
'land_transport_electric_share': # 1 means all EVs
|
||||||
|
2020: 0
|
||||||
|
2030: 0.25
|
||||||
|
2040: 0.6
|
||||||
|
2050: 0.85
|
||||||
|
'transport_fuel_cell_efficiency': 0.5
|
||||||
|
'transport_internal_combustion_efficiency': 0.3
|
||||||
'shipping_average_efficiency' : 0.4 #For conversion of fuel oil to propulsion in 2011
|
'shipping_average_efficiency' : 0.4 #For conversion of fuel oil to propulsion in 2011
|
||||||
'time_dep_hp_cop' : True
|
'time_dep_hp_cop' : True
|
||||||
'space_heating_fraction' : 1.0 #fraction of space heating active
|
'space_heating_fraction' : 1.0 #fraction of space heating active
|
||||||
@ -293,6 +305,7 @@ plotting:
|
|||||||
"Fischer-Tropsch" : "#44DD33"
|
"Fischer-Tropsch" : "#44DD33"
|
||||||
"kerosene for aviation": "#44BB11"
|
"kerosene for aviation": "#44BB11"
|
||||||
"naphtha for industry" : "#44FF55"
|
"naphtha for industry" : "#44FF55"
|
||||||
|
"land transport fossil" : "#44DD33"
|
||||||
"water tanks" : "#BBBBBB"
|
"water tanks" : "#BBBBBB"
|
||||||
"hot water storage" : "#BBBBBB"
|
"hot water storage" : "#BBBBBB"
|
||||||
"hot water charging" : "#BBBBBB"
|
"hot water charging" : "#BBBBBB"
|
||||||
@ -304,7 +317,6 @@ plotting:
|
|||||||
"Ambient" : "k"
|
"Ambient" : "k"
|
||||||
"Electric load" : "b"
|
"Electric load" : "b"
|
||||||
"Heat load" : "r"
|
"Heat load" : "r"
|
||||||
"Transport load" : "grey"
|
|
||||||
"heat" : "darkred"
|
"heat" : "darkred"
|
||||||
"rural heat" : "#880000"
|
"rural heat" : "#880000"
|
||||||
"central heat" : "#b22222"
|
"central heat" : "#b22222"
|
||||||
@ -319,7 +331,7 @@ plotting:
|
|||||||
"building retrofitting" : "purple"
|
"building retrofitting" : "purple"
|
||||||
"BEV charger" : "grey"
|
"BEV charger" : "grey"
|
||||||
"V2G" : "grey"
|
"V2G" : "grey"
|
||||||
"transport" : "grey"
|
"land transport EV" : "grey"
|
||||||
"electricity" : "k"
|
"electricity" : "k"
|
||||||
"gas for industry" : "#333333"
|
"gas for industry" : "#333333"
|
||||||
"solid biomass for industry" : "#555555"
|
"solid biomass for industry" : "#555555"
|
||||||
@ -328,7 +340,7 @@ plotting:
|
|||||||
"process emissions to stored" : "#444444"
|
"process emissions to stored" : "#444444"
|
||||||
"process emissions to atmosphere" : "#888888"
|
"process emissions to atmosphere" : "#888888"
|
||||||
"process emissions" : "#222222"
|
"process emissions" : "#222222"
|
||||||
"transport fuel cell" : "#AAAAAA"
|
"land transport fuel cell" : "#AAAAAA"
|
||||||
"biogas" : "#800000"
|
"biogas" : "#800000"
|
||||||
"solid biomass" : "#DAA520"
|
"solid biomass" : "#DAA520"
|
||||||
"today" : "#D2691E"
|
"today" : "#D2691E"
|
||||||
|
@ -520,7 +520,7 @@ def prepare_data(network):
|
|||||||
|
|
||||||
dsm_week = np.zeros((24*7,))
|
dsm_week = np.zeros((24*7,))
|
||||||
|
|
||||||
dsm_week[(np.arange(0,7,1)*24+options['dsm_restriction_time'])] = options['dsm_restriction_value']
|
dsm_week[(np.arange(0,7,1)*24+options['bev_dsm_restriction_time'])] = options['bev_dsm_restriction_value']
|
||||||
|
|
||||||
dsm_profile = generate_periodic_profiles(dt_index=network.snapshots.tz_localize("UTC"),
|
dsm_profile = generate_periodic_profiles(dt_index=network.snapshots.tz_localize("UTC"),
|
||||||
nodes=pop_layout.index,
|
nodes=pop_layout.index,
|
||||||
@ -963,10 +963,28 @@ def add_storage(network):
|
|||||||
lifetime=costs.at['SMR','lifetime'])
|
lifetime=costs.at['SMR','lifetime'])
|
||||||
|
|
||||||
|
|
||||||
def add_transport(network):
|
def add_land_transport(network):
|
||||||
print("adding transport")
|
|
||||||
|
print("adding land transport")
|
||||||
|
|
||||||
|
fuel_cell_share = get_parameter(options["land_transport_fuel_cell_share"])
|
||||||
|
electric_share = get_parameter(options["land_transport_electric_share"])
|
||||||
|
fossil_share = 1 - fuel_cell_share - electric_share
|
||||||
|
|
||||||
|
print("shares of FCEV, EV and ICEV are",
|
||||||
|
fuel_cell_share,
|
||||||
|
electric_share,
|
||||||
|
fossil_share)
|
||||||
|
|
||||||
|
if fossil_share < 0:
|
||||||
|
print("Error, more FCEV and EV share than 1.")
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
nodes = pop_layout.index
|
nodes = pop_layout.index
|
||||||
|
|
||||||
|
|
||||||
|
if electric_share > 0:
|
||||||
|
|
||||||
network.add("Carrier","Li ion")
|
network.add("Carrier","Li ion")
|
||||||
|
|
||||||
network.madd("Bus",
|
network.madd("Bus",
|
||||||
@ -977,12 +995,12 @@ def add_transport(network):
|
|||||||
|
|
||||||
network.madd("Load",
|
network.madd("Load",
|
||||||
nodes,
|
nodes,
|
||||||
suffix=" transport",
|
suffix=" land transport EV",
|
||||||
bus=nodes + " EV battery",
|
bus=nodes + " EV battery",
|
||||||
carrier="transport",
|
carrier="land transport EV",
|
||||||
p_set=(1-options['transport_fuel_cell_share'])*(transport[nodes]+shift_df(transport[nodes],1)+shift_df(transport[nodes],2))/3.)
|
p_set=electric_share*(transport[nodes]+shift_df(transport[nodes],1)+shift_df(transport[nodes],2))/3.)
|
||||||
|
|
||||||
p_nom = nodal_transport_data["number cars"]*0.011*(1-options['transport_fuel_cell_share']) #3-phase charger with 11 kW * x% of time grid-connected
|
p_nom = nodal_transport_data["number cars"]*0.011*electric_share #3-phase charger with 11 kW * x% of time grid-connected
|
||||||
|
|
||||||
network.madd("Link",
|
network.madd("Link",
|
||||||
nodes,
|
nodes,
|
||||||
@ -1013,7 +1031,7 @@ def add_transport(network):
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
if options["bev"]:
|
if options["bev_dsm"]:
|
||||||
|
|
||||||
network.madd("Store",
|
network.madd("Store",
|
||||||
nodes,
|
nodes,
|
||||||
@ -1021,21 +1039,30 @@ def add_transport(network):
|
|||||||
bus=nodes + " EV battery",
|
bus=nodes + " EV battery",
|
||||||
carrier="battery storage",
|
carrier="battery storage",
|
||||||
e_cyclic=True,
|
e_cyclic=True,
|
||||||
e_nom=nodal_transport_data["number cars"]*0.05*options["bev_availability"]*(1-options['transport_fuel_cell_share']), #50 kWh battery http://www.zeit.de/mobilitaet/2014-10/auto-fahrzeug-bestand
|
e_nom=nodal_transport_data["number cars"]*0.05*options["bev_availability"]*electric_share, #50 kWh battery http://www.zeit.de/mobilitaet/2014-10/auto-fahrzeug-bestand
|
||||||
e_max_pu=1,
|
e_max_pu=1,
|
||||||
e_min_pu=dsm_profile[nodes])
|
e_min_pu=dsm_profile[nodes])
|
||||||
|
|
||||||
|
|
||||||
if options['transport_fuel_cell_share'] != 0:
|
if fuel_cell_share > 0:
|
||||||
|
|
||||||
network.madd("Load",
|
network.madd("Load",
|
||||||
nodes,
|
nodes,
|
||||||
suffix=" transport fuel cell",
|
suffix=" land transport fuel cell",
|
||||||
bus=nodes + " H2",
|
bus=nodes + " H2",
|
||||||
carrier="transport fuel cell",
|
carrier="land transport fuel cell",
|
||||||
p_set=options['transport_fuel_cell_share']/costs.at["fuel cell","efficiency"]*transport[nodes])
|
p_set=fuel_cell_share/options['transport_fuel_cell_efficiency']*transport[nodes])
|
||||||
|
|
||||||
|
|
||||||
|
if fossil_share > 0:
|
||||||
|
|
||||||
|
network.madd("Load",
|
||||||
|
nodes,
|
||||||
|
suffix=" land transport fossil",
|
||||||
|
bus="Fischer-Tropsch",
|
||||||
|
carrier="land transport fossil",
|
||||||
|
p_set=fossil_share/options['transport_internal_combustion_efficiency']*transport[nodes])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def add_heat(network):
|
def add_heat(network):
|
||||||
@ -1738,6 +1765,13 @@ def remove_h2_network(n):
|
|||||||
carrier="H2 Store",
|
carrier="H2 Store",
|
||||||
capital_cost=h2_capital_cost)
|
capital_cost=h2_capital_cost)
|
||||||
|
|
||||||
|
def get_parameter(item):
|
||||||
|
"""Check whether it depends on investment year"""
|
||||||
|
if type(item) is dict:
|
||||||
|
return item[investment_year]
|
||||||
|
else:
|
||||||
|
return item
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
@ -1782,6 +1816,8 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
opts = snakemake.wildcards.sector_opts.split('-')
|
opts = snakemake.wildcards.sector_opts.split('-')
|
||||||
|
|
||||||
|
investment_year=int(snakemake.wildcards.planning_horizons[-4:])
|
||||||
|
|
||||||
n = pypsa.Network(snakemake.input.network,
|
n = pypsa.Network(snakemake.input.network,
|
||||||
override_component_attrs=override_component_attrs)
|
override_component_attrs=override_component_attrs)
|
||||||
|
|
||||||
@ -1838,7 +1874,7 @@ if __name__ == "__main__":
|
|||||||
options["central"] = False
|
options["central"] = False
|
||||||
|
|
||||||
if "T" in opts:
|
if "T" in opts:
|
||||||
add_transport(n)
|
add_land_transport(n)
|
||||||
|
|
||||||
if "H" in opts:
|
if "H" in opts:
|
||||||
add_heat(n)
|
add_heat(n)
|
||||||
@ -1867,11 +1903,7 @@ if __name__ == "__main__":
|
|||||||
logger.info("No resampling")
|
logger.info("No resampling")
|
||||||
|
|
||||||
#process CO2 limit
|
#process CO2 limit
|
||||||
if type(snakemake.config["co2_budget"]) == dict:
|
limit = get_parameter(snakemake.config["co2_budget"])
|
||||||
year=int(snakemake.wildcards.planning_horizons[-4:])
|
|
||||||
limit=snakemake.config["co2_budget"][year]
|
|
||||||
else:
|
|
||||||
limit=snakemake.config["co2_budget"]
|
|
||||||
print("CO2 limit set to",limit)
|
print("CO2 limit set to",limit)
|
||||||
|
|
||||||
for o in opts:
|
for o in opts:
|
||||||
|
Loading…
Reference in New Issue
Block a user