add option for exogenously retrofitting, space heat demand is reduced before adding losses in DH

This commit is contained in:
lisazeyen 2020-10-21 14:30:26 +02:00
parent 75ff2d19ee
commit 301d74f059
3 changed files with 26 additions and 69 deletions

View File

@ -78,10 +78,11 @@ sector:
'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
'retrofitting' : False 'retrofitting' :
'retroI-fraction' : 0.25 'retro_exogen': True # space heat demand savings exogenously
'retroII-fraction' : 0.55 'dE': 0.4 # reduction of space heat demand (applied before losses in DH)
'retrofitting-cost_factor' : 1.0 'retro_endogen': False # co-optimise space heat savings
'retrofitting-cost_factor' : 1.0
'tes' : True 'tes' : True
'tes_tau' : 3. 'tes_tau' : 3.
'boilers' : True 'boilers' : True

View File

@ -78,10 +78,11 @@ sector:
'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
'retrofitting' : False 'retrofitting' :
'retroI-fraction' : 0.25 'retro_exogen': True # space heat demand savings exogenously
'retroII-fraction' : 0.55 'dE': [0.0, 0.1, 0.2, 0.5] # reduction of space heat demand per year (applied before losses in DH)
'retrofitting-cost_factor' : 1.0 'retro_endogen': False # co-optimise space heat savings
'retrofitting-cost_factor' : 1.0
'tes' : True 'tes' : True
'tes_tau' : 3. 'tes_tau' : 3.
'boilers' : True 'boilers' : True

View File

@ -1056,7 +1056,21 @@ def add_heat(network):
urban_fraction = options['central_fraction']*pop_layout["urban"]/(pop_layout[["urban","rural"]].sum(axis=1)) urban_fraction = options['central_fraction']*pop_layout["urban"]/(pop_layout[["urban","rural"]].sum(axis=1))
for name in ["residential rural","services rural","residential urban decentral","services urban decentral","urban central"]: # building retrofitting, exogenously reduce space heat demand
if options["retrofitting"]["retro_exogen"]:
dE = options["retrofitting"]["dE"]
if snakemake.config["foresight"]=='myopic':
year = int(snakemake.wildcards.planning_horizons[-4:])
dE = dE[snakemake.config["scenario"]["planning_horizons"].index(year)]
print("retrofitting exogenously, assumed space heat reduction of ",
dE)
for sector in sectors:
heat_demand[sector + " space"] = heat_demand[sector + " space"].apply(lambda x: retro_exogen(x, dE))
heat_systems = ["residential rural", "services rural",
"residential urban decentral","services urban decentral",
"urban central"]
for name in heat_systems:
name_type = "central" if name == "urban central" else "decentral" name_type = "central" if name == "urban central" else "decentral"
@ -1079,6 +1093,7 @@ def add_heat(network):
if sector in name: if sector in name:
heat_load = heat_demand[[sector + " water",sector + " space"]].groupby(level=1,axis=1).sum()[nodes[name]].multiply(factor) heat_load = heat_demand[[sector + " water",sector + " space"]].groupby(level=1,axis=1).sum()[nodes[name]].multiply(factor)
if name == "urban central": if name == "urban central":
heat_load = heat_demand.groupby(level=1,axis=1).sum()[nodes[name]].multiply(urban_fraction[nodes[name]]*(1+options['district_heating_loss'])) heat_load = heat_demand.groupby(level=1,axis=1).sum()[nodes[name]].multiply(urban_fraction[nodes[name]]*(1+options['district_heating_loss']))
@ -1269,66 +1284,6 @@ def add_heat(network):
lifetime=costs.at['micro CHP','lifetime']) lifetime=costs.at['micro CHP','lifetime'])
#NB: this currently doesn't work for pypsa-eur model
if options['retrofitting']:
retro_nodes = pd.Index(["DE"])
space_heat_demand = space_heat_demand[retro_nodes]
square_metres = population[retro_nodes]/population['DE']*5.7e9 #HPI 3.4e9m^2 for DE res, 2.3e9m^2 for tert https://doi.org/10.1016/j.rser.2013.09.012
space_peak = space_heat_demand.max()
space_pu = space_heat_demand.divide(space_peak)
network.add("Carrier", "retrofitting")
network.madd('Generator',
retro_nodes,
suffix=' retrofitting I',
bus=retro_nodes+' heat',
carrier="retrofitting",
p_nom_extendable=True,
p_nom_max=options['retroI-fraction']*space_peak*(1-urban_fraction),
p_max_pu=space_pu,
p_min_pu=space_pu,
capital_cost=options['retrofitting-cost_factor']*costs.at['retrofitting I','fixed']*square_metres/(options['retroI-fraction']*space_peak))
network.madd('Generator',
retro_nodes,
suffix=' retrofitting II',
bus=retro_nodes+' heat',
carrier="retrofitting",
p_nom_extendable=True,
p_nom_max=options['retroII-fraction']*space_peak*(1-urban_fraction),
p_max_pu=space_pu,
p_min_pu=space_pu,
capital_cost=options['retrofitting-cost_factor']*costs.at['retrofitting II','fixed']*square_metres/(options['retroII-fraction']*space_peak))
network.madd('Generator',
retro_nodes,
suffix=' urban retrofitting I',
bus=retro_nodes+' urban heat',
carrier="retrofitting",
p_nom_extendable=True,
p_nom_max=options['retroI-fraction']*space_peak*urban_fraction,
p_max_pu=space_pu,
p_min_pu=space_pu,
capital_cost=options['retrofitting-cost_factor']*costs.at['retrofitting I','fixed']*square_metres/(options['retroI-fraction']*space_peak))
network.madd('Generator',
retro_nodes,
suffix=' urban retrofitting II',
bus=retro_nodes+' urban heat',
carrier="retrofitting",
p_nom_extendable=True,
p_nom_max=options['retroII-fraction']*space_peak*urban_fraction,
p_max_pu=space_pu,
p_min_pu=space_pu,
capital_cost=options['retrofitting-cost_factor']*costs.at['retrofitting II','fixed']*square_metres/(options['retroII-fraction']*space_peak))
def create_nodes_for_heat_sector(): def create_nodes_for_heat_sector():
sectors = ["residential", "services"] sectors = ["residential", "services"]
# stores the different groups of nodes # stores the different groups of nodes