Add lifetime attribute to generators, links and stores in prepare_sector_network and use that attribute to check if a generator optimized in a previous time step should be added in add_brownfield (or if its lifetime has expired)

This commit is contained in:
martavp 2020-07-17 15:20:20 +02:00
parent fa0b88a9b1
commit 17a348d1e6
2 changed files with 128 additions and 64 deletions

View File

@ -44,6 +44,26 @@ override_component_attrs["Link"].loc["p3"] = ["series","MW",0.,"3rd bus output",
def add_brownfield(n, n_p, year):
print("adding brownfield")
#first, remove generators, links and stores that track CO2 or global EU values
n_p.mremove("Generator", [index for index in n_p.generators.index.to_list() if 'ror' in index])
n_p.mremove("Generator", ['EU fossil gas', 'fossil oil'] )
n_p.mremove("Store", ['co2 atmosphere', 'co2 stored', 'EU gas Store'] )
n_p.mremove("Link", ['co2 vent'] )
if "H" in opts:
n_p.mremove("Link", [index for index in n_p.links.index.to_list() if 'water tanks charger' in index])
n_p.mremove("Link", [index for index in n_p.links.index.to_list() if 'water tanks discharger' in index])
if "B" in opts:
n_p.mremove("Store", ['EU biogas', 'EU solid biomass'])
n_p.mremove("Link", ['biogas to gas'])
if "I" in opts:
n_p.mremove("Store", ['Fischer-Tropsch Store'])
n_p.mremove("Link", ['process emissions' , 'gas for industry', 'solid biomass for industry'])
if "T" in opts:
n_p.mremove("Store", [index for index in n_p.stores.index.to_list() if 'battery storage' in index])
n_p.mremove("Link", [index for index in n_p.links.index.to_list() if 'BEV charger' in index])
n_p.mremove("Link", [index for index in n_p.links.index.to_list() if 'V2G' in index])
previous_timestep=snakemake.config['scenario']['planning_horizons'][snakemake.config['scenario']['planning_horizons'].index(year)-1]
previous_timesteps=snakemake.config['scenario']['planning_horizons'][0:snakemake.config['scenario']['planning_horizons'].index(year)]
@ -52,10 +72,7 @@ def add_brownfield(n, n_p, year):
# with updated capacities (some of them have been decomissioned)
n_p.mremove("Generator", [index for index in n_p.generators.index.to_list() if '<'+snakemake.config['scenario']['planning_horizons'][0] in index])
n_p.mremove("Generator", [index for index in n_p.generators.index.to_list() if 'ror' in index])
# generators whose installationYear + lifetime < year are removed
#n_p.mremove("Generator", [index for index in n_p.generators.index.to_list() if (index[-4:] in previous_timesteps) and (int(index[-4:])+snakemake.config['costs']['lifetime'] < int(year))])
# generators whose build_year + lifetime < year are removed
n_p.mremove("Generator", [index for index in n_p.generators.index.to_list()
if (n_p.generators.loc[index, 'build_year'] in previous_timesteps)
and (n_p.generators.loc[index, 'build_year']+n_p.generators.loc[index, 'lifetime'] < int(year))])
@ -64,6 +81,9 @@ def add_brownfield(n, n_p, year):
n_p.generators.index=np.where(n_p.generators.index.str[-4:].isin(previous_timesteps)==False,
n_p.generators.index + '-' + previous_timestep,
n_p.generators.index)
n_p.generators.loc[[index for index in n_p.generators.index.to_list()
if previous_timestep in index], 'build_year']=int(previous_timestep)
#add generators from previous step
n.madd("Generator",
n_p.generators.index,
@ -74,14 +94,12 @@ def add_brownfield(n, n_p, year):
capital_cost=n_p.generators.capital_cost,
efficiency=n_p.generators.efficiency,
p_max_pu=n_p.generators_t.p_max_pu,
build_year=int(previous_timestep),
lifetime=snakemake.config['costs']['lifetime'])
build_year=n_p.generators.build_year,
lifetime=n_p.generators.lifetime)
#add stores from previous steps
n_p.mremove("Store", ['co2 atmosphere', 'co2 stored', 'EU gas Store'] )
# stores whose installationYear + lifetime < year are removed
#n_p.mremove("Store", [index for index in n_p.stores.index.to_list() if (index[-4:] in previous_timesteps) and (int(index[-4:])+snakemake.config['costs']['lifetime'] < int(year))])
n_p.mremove("Store", [index for index in n_p.stores.index.to_list()
if (n_p.stores.loc[index, 'build_year'] in previous_timesteps)
and (n_p.stores.loc[index, 'build_year']+n_p.stores.loc[index, 'lifetime'] < int(year))])
@ -90,6 +108,8 @@ def add_brownfield(n, n_p, year):
n_p.stores.index=np.where(n_p.stores.index.str[-4:].isin(previous_timesteps)==False,
n_p.stores.index + '-' + previous_timestep,
n_p.stores.index)
n_p.stores.loc[[index for index in n_p.stores.index.to_list()
if previous_timestep in index], 'build_year']=int(previous_timestep)
n.madd("Store",
n_p.stores.index,
bus=n_p.stores.bus,
@ -97,8 +117,8 @@ def add_brownfield(n, n_p, year):
e_nom=n_p.stores.e_nom_opt,
e_cyclic=True,
capital_cost=n_p.stores.capital_cost,
build_year=int(previous_timestep),
lifetime=snakemake.config['costs']['lifetime'])
build_year=n_p.stores.build_year,
lifetime=n_p.stores.lifetime)
## add links from previous steps
# TODO: add_chp_constraint() in solve_network needs to be adjusted
@ -106,7 +126,6 @@ def add_brownfield(n, n_p, year):
n_p.mremove("Link", [index for index in n_p.links.index.to_list() if 'CHP' in index])
# stores whose installationYear + lifetime < year are removed
#n_p.mremove("Link", [index for index in n_p.links.index.to_list() if (index[-4:] in previous_timesteps) and (int(index[-4:])+snakemake.config['costs']['lifetime'] < int(year))])
n_p.mremove("Link", [index for index in n_p.links.index.to_list()
if (n_p.links.loc[index, 'build_year'] in previous_timesteps)
and (n_p.links.loc[index, 'build_year']+n_p.links.loc[index, 'lifetime'] < int(year))])
@ -115,6 +134,8 @@ def add_brownfield(n, n_p, year):
n_p.links.index=np.where(n_p.links.index.str[-4:].isin(previous_timesteps)==False,
n_p.links.index + '-' + previous_timestep,
n_p.links.index)
n_p.links.loc[[index for index in n_p.links.index.to_list()
if previous_timestep in index], 'build_year']=int(previous_timestep)
n.madd("Link",
n_p.links.index,
bus0=n_p.links.bus0,
@ -126,8 +147,8 @@ def add_brownfield(n, n_p, year):
capital_cost=n_p.links.capital_cost,
efficiency=n_p.links.efficiency,
efficiency2=n_p.links.efficiency2,
build_year=int(previous_timestep),
lifetime=snakemake.config['costs']['lifetime'])
build_year=n_p.links.build_year,
lifetime=n_p.links.lifetime)
if __name__ == "__main__":
@ -138,13 +159,13 @@ if __name__ == "__main__":
wildcards=dict(network='elec', simpl='', clusters='37', lv='1.0',
sector_opts='Co2L0-168H-T-H-B-I-solar3-dist1',
co2_budget_name='go',
planning_horizons='2030'),
planning_horizons='2050'),
input=dict(network='pypsa-eur-sec/results/test/prenetworks/{network}_s{simpl}_{clusters}_lv{lv}__{sector_opts}_{co2_budget_name}_{planning_horizons}.nc',
network_p='pypsa-eur-sec/results/test/postnetworks/{network}_s{simpl}_{clusters}_lv{lv}__{sector_opts}_{co2_budget_name}_2020.nc',
network_p='pypsa-eur-sec/results/test/postnetworks/{network}_s{simpl}_{clusters}_lv{lv}__{sector_opts}_{co2_budget_name}_2040.nc',
costs='pypsa-eur-sec/data/costs/costs_{planning_horizons}.csv',
cop_air_total="pypsa-eur-sec/resources/cop_air_total_{network}_s{simpl}_{clusters}.nc",
cop_soil_total="pypsa-eur-sec/resources/cop_soil_total_{network}_s{simpl}_{clusters}.nc"),
output=['pypsa-eur-sec/results/test/prenetworks_bf/{network}_s{simpl}_{clusters}_lv{lv}__{sector_opts}_{planning_horizons}.nc']
output=['pypsa-eur-sec/results/test/prenetworks_brownfied/{network}_s{simpl}_{clusters}_lv{lv}__{sector_opts}_{planning_horizons}.nc']
)
import yaml
with open('config.yaml') as f:

View File

@ -102,7 +102,8 @@ def add_co2_tracking(n):
carrier="DAC",
marginal_cost=75.,
efficiency=1.,
p_nom_extendable=True)
p_nom_extendable=True,
lifetime=costs.at['DAC','lifetime'])
def add_co2limit(n, Nyears=1.,limit=0.):
@ -492,7 +493,8 @@ def add_generation(network):
p_nom_extendable=True,
carrier=generator,
efficiency=costs.at[generator,'efficiency'],
efficiency2=costs.at[carrier,'CO2 intensity'])
efficiency2=costs.at[carrier,'CO2 intensity'],
lifetime=costs.at[generator,'lifetime'])
def add_wave(network, wave_cost_factor):
wave_fn = "data/WindWaveWEC_GLTB.xlsx"
@ -547,6 +549,7 @@ def insert_electricity_distribution_grid(network):
carrier="electricity distribution grid",
efficiency=1,
marginal_cost=0,
lifetime=costs.at['electricity distribution grid','lifetime'],
capital_cost=costs.at['electricity distribution grid','fixed']*snakemake.config["sector"]['electricity_distribution_grid_cost_factor'])
loads = network.loads.index[network.loads.carrier=="electricity"]
@ -574,7 +577,8 @@ def insert_electricity_distribution_grid(network):
marginal_cost=network.generators.loc[solar, 'marginal_cost'],
capital_cost=costs.at['solar-rooftop','fixed'],
efficiency=network.generators.loc[solar, 'efficiency'],
p_max_pu=network.generators_t.p_max_pu[solar])
p_max_pu=network.generators_t.p_max_pu[solar],
lifetime=costs.at['solar-rooftop','lifetime'])
@ -590,7 +594,8 @@ def insert_electricity_distribution_grid(network):
e_cyclic=True,
e_nom_extendable=True,
carrier="home battery",
capital_cost=costs.at['battery storage','fixed'])
capital_cost=costs.at['battery storage','fixed'],
lifetime=costs.at['battery storage','lifetime'])
network.madd("Link",
nodes + " home battery charger",
@ -599,7 +604,8 @@ def insert_electricity_distribution_grid(network):
carrier="home battery charger",
efficiency=costs.at['battery inverter','efficiency']**0.5,
capital_cost=costs.at['battery inverter','fixed'],
p_nom_extendable=True)
p_nom_extendable=True,
lifetime=costs.at['battery inverter','lifetime'])
network.madd("Link",
nodes + " home battery discharger",
@ -608,7 +614,8 @@ def insert_electricity_distribution_grid(network):
carrier="home battery discharger",
efficiency=costs.at['battery inverter','efficiency']**0.5,
marginal_cost=options['marginal_cost_storage'],
p_nom_extendable=True)
p_nom_extendable=True,
lifetime=costs.at['battery inverter','lifetime'])
def add_electricity_grid_connection(network):
@ -636,7 +643,8 @@ def add_storage(network):
p_nom_extendable=True,
carrier="H2 Electrolysis",
efficiency=costs.at["electrolysis","efficiency"],
capital_cost=costs.at["electrolysis","fixed"])
capital_cost=costs.at["electrolysis","fixed"],
lifetime=costs.at['electrolysis','lifetime'])
network.madd("Link",
nodes + " H2 Fuel Cell",
@ -645,10 +653,12 @@ def add_storage(network):
p_nom_extendable=True,
carrier ="H2 Fuel Cell",
efficiency=costs.at["fuel cell","efficiency"],
capital_cost=costs.at["fuel cell","fixed"]*costs.at["fuel cell","efficiency"]) #NB: fixed cost is per MWel
capital_cost=costs.at["fuel cell","fixed"]*costs.at["fuel cell","efficiency"], #NB: fixed cost is per MWel
lifetime=costs.at['fuel cell','lifetime'])
if options['hydrogen_underground_storage']:
h2_capital_cost = costs.at["gas storage","fixed"]
#TODO: change gas storage to hydrogen underground storage when cost database is updated
#h2_capital_cost = costs.at["hydrogen underground storage","fixed"]
else:
h2_capital_cost = costs.at["hydrogen storage","fixed"]
@ -659,7 +669,8 @@ def add_storage(network):
e_nom_extendable=True,
e_cyclic=True,
carrier="H2 Store",
capital_cost=h2_capital_cost)
capital_cost=h2_capital_cost,
lifetime=costs.at['gas storage','lifetime'])
h2_links = pd.DataFrame(columns=["bus0","bus1","length"])
prefix = "H2 pipeline "
@ -687,7 +698,8 @@ def add_storage(network):
p_nom_extendable=True,
length=h2_links.length.values,
capital_cost=costs.at['H2 pipeline','fixed']*h2_links.length.values,
carrier="H2 pipeline")
carrier="H2 pipeline",
lifetime=costs.at['H2 pipeline','lifetime'])
network.add("Carrier","battery")
@ -702,7 +714,8 @@ def add_storage(network):
e_cyclic=True,
e_nom_extendable=True,
carrier="battery",
capital_cost=costs.at['battery storage','fixed'])
capital_cost=costs.at['battery storage','fixed'],
lifetime=costs.at['battery storage','lifetime'])
network.madd("Link",
nodes + " battery charger",
@ -711,7 +724,8 @@ def add_storage(network):
carrier="battery charger",
efficiency=costs.at['battery inverter','efficiency']**0.5,
capital_cost=costs.at['battery inverter','fixed'],
p_nom_extendable=True)
p_nom_extendable=True,
lifetime=costs.at['battery inverter','lifetime'])
network.madd("Link",
nodes + " battery discharger",
@ -720,7 +734,8 @@ def add_storage(network):
carrier="battery discharger",
efficiency=costs.at['battery inverter','efficiency']**0.5,
marginal_cost=options['marginal_cost_storage'],
p_nom_extendable=True)
p_nom_extendable=True,
lifetime=costs.at['battery inverter','lifetime'])
if options['methanation']:
@ -733,7 +748,8 @@ def add_storage(network):
carrier="Sabatier",
efficiency=costs.at["methanation","efficiency"],
efficiency2=-costs.at["methanation","efficiency"]*costs.at['gas','CO2 intensity'],
capital_cost=costs.at["methanation","fixed"])
capital_cost=costs.at["methanation","fixed"],
lifetime=costs.at['methanation','lifetime'])
if options['helmeth']:
network.madd("Link",
@ -745,7 +761,8 @@ def add_storage(network):
p_nom_extendable=True,
efficiency=costs.at["helmeth","efficiency"],
efficiency2=-costs.at["helmeth","efficiency"]*costs.at['gas','CO2 intensity'],
capital_cost=costs.at["helmeth","fixed"])
capital_cost=costs.at["helmeth","fixed"],
lifetime=costs.at['helmeth','lifetime'])
if options['SMR']:
@ -760,7 +777,8 @@ def add_storage(network):
efficiency=costs.at["SMR CCS","efficiency"],
efficiency2=costs.at['gas','CO2 intensity']*(1-options["ccs_fraction"]),
efficiency3=costs.at['gas','CO2 intensity']*options["ccs_fraction"],
capital_cost=costs.at["SMR CCS","fixed"])
capital_cost=costs.at["SMR CCS","fixed"],
lifetime=costs.at['SMR CCS','lifetime'])
network.madd("Link",
nodes + " SMR",
@ -771,7 +789,8 @@ def add_storage(network):
carrier="SMR",
efficiency=costs.at["SMR","efficiency"],
efficiency2=costs.at['gas','CO2 intensity'],
capital_cost=costs.at["SMR","fixed"])
capital_cost=costs.at["SMR","fixed"],
lifetime=costs.at['SMR','lifetime'])
def add_transport(network):
@ -909,7 +928,8 @@ def add_heat(network):
carrier="{} {} heat pump".format(name,heat_pump_type),
efficiency=efficiency,
capital_cost=costs.at[costs_name,'efficiency']*costs.at[costs_name,'fixed'],
p_nom_extendable=True)
p_nom_extendable=True,
lifetime=costs.at[costs_name,'lifetime'])
if options["tes"]:
@ -946,8 +966,8 @@ def add_heat(network):
e_nom_extendable=True,
carrier=name + " water tanks",
standing_loss=1-np.exp(-1/(24.*tes_time_constant_days)),
capital_cost=costs.at[name_type + ' water tank storage','fixed']/(1.17e-3*40)) #conversion from EUR/m^3 to EUR/MWh for 40 K diff and 1.17 kWh/m^3/K
capital_cost=costs.at[name_type + ' water tank storage','fixed']/(1.17e-3*40), #conversion from EUR/m^3 to EUR/MWh for 40 K diff and 1.17 kWh/m^3/K
lifetime=costs.at[name_type + ' water tank storage','lifetime'])
if options["boilers"]:
@ -958,7 +978,8 @@ def add_heat(network):
carrier=name + " resistive heater",
efficiency=costs.at[name_type + ' resistive heater','efficiency'],
capital_cost=costs.at[name_type + ' resistive heater','efficiency']*costs.at[name_type + ' resistive heater','fixed'],
p_nom_extendable=True)
p_nom_extendable=True,
lifetime=costs.at[name_type + ' resistive heater','lifetime'])
network.madd("Link",
nodes[name] + " " + name + " gas boiler",
@ -969,7 +990,8 @@ def add_heat(network):
carrier=name + " gas boiler",
efficiency=costs.at[name_type + ' gas boiler','efficiency'],
efficiency2=costs.at['gas','CO2 intensity'],
capital_cost=costs.at[name_type + ' gas boiler','efficiency']*costs.at[name_type + ' gas boiler','fixed'])
capital_cost=costs.at[name_type + ' gas boiler','efficiency']*costs.at[name_type + ' gas boiler','fixed'],
lifetime=costs.at[name_type + ' gas boiler','lifetime'])
@ -984,7 +1006,8 @@ def add_heat(network):
carrier=name + " solar thermal",
p_nom_extendable=True,
capital_cost=costs.at[name_type + ' solar thermal','fixed'],
p_max_pu=solar_thermal[nodes[name]])
p_max_pu=solar_thermal[nodes[name]],
lifetime=costs.at[name_type + ' solar thermal','lifetime'])
if options["chp"]:
@ -1004,7 +1027,8 @@ def add_heat(network):
efficiency2=costs.at['gas','CO2 intensity'],
c_b=costs.at['central gas CHP','c_b'],
c_v=costs.at['central gas CHP','c_v'],
p_nom_ratio=costs.at['central gas CHP','p_nom_ratio'])
p_nom_ratio=costs.at['central gas CHP','p_nom_ratio'],
lifetime=costs.at['central gas CHP','lifetime'])
network.madd("Link",
nodes[name] + " urban central gas CHP heat",
@ -1015,7 +1039,8 @@ def add_heat(network):
p_nom_extendable=True,
marginal_cost=costs.at['central gas CHP','VOM'],
efficiency=costs.at['central gas CHP','efficiency']/costs.at['central gas CHP','c_v'],
efficiency2=costs.at['gas','CO2 intensity'])
efficiency2=costs.at['gas','CO2 intensity'],
lifetime=costs.at['central gas CHP','lifetime'])
network.madd("Link",
nodes[name] + " urban central gas CHP CCS electric",
@ -1032,7 +1057,8 @@ def add_heat(network):
efficiency3=costs.at['gas','CO2 intensity']*options["ccs_fraction"],
c_b=costs.at['central gas CHP CCS','c_b'],
c_v=costs.at['central gas CHP CCS','c_v'],
p_nom_ratio=costs.at['central gas CHP CCS','p_nom_ratio'])
p_nom_ratio=costs.at['central gas CHP CCS','p_nom_ratio'],
lifetime=costs.at['central gas CHP CCS','lifetime'])
network.madd("Link",
nodes[name] + " urban central gas CHP CCS heat",
@ -1045,7 +1071,8 @@ def add_heat(network):
marginal_cost=costs.at['central gas CHP CCS','VOM'],
efficiency=costs.at['central gas CHP CCS','efficiency']/costs.at['central gas CHP CCS','c_v'],
efficiency2=costs.at['gas','CO2 intensity']*(1-options["ccs_fraction"]),
efficiency3=costs.at['gas','CO2 intensity']*options["ccs_fraction"])
efficiency3=costs.at['gas','CO2 intensity']*options["ccs_fraction"],
lifetime=costs.at['central gas CHP CCS','lifetime'])
else:
network.madd("Link",
@ -1059,7 +1086,8 @@ def add_heat(network):
efficiency=costs.at['micro CHP','efficiency'],
efficiency2=costs.at['micro CHP','efficiency-heat'],
efficiency3=costs.at['gas','CO2 intensity'],
capital_cost=costs.at['micro CHP','fixed'])
capital_cost=costs.at['micro CHP','fixed'],
lifetime=costs.at['micro CHP','lifetime'])
#NB: this currently doesn't work for pypsa-eur model
@ -1207,7 +1235,8 @@ def add_biomass(network):
efficiency=costs.at['central solid biomass CHP','efficiency'],
c_b=costs.at['central solid biomass CHP','c_b'],
c_v=costs.at['central solid biomass CHP','c_v'],
p_nom_ratio=costs.at['central solid biomass CHP','p_nom_ratio'])
p_nom_ratio=costs.at['central solid biomass CHP','p_nom_ratio'],
lifetime=costs.at['central solid biomass CHP','lifetime'])
network.madd("Link",
@ -1217,7 +1246,8 @@ def add_biomass(network):
carrier="urban central solid biomass CHP heat",
p_nom_extendable=True,
marginal_cost=costs.at['central solid biomass CHP','VOM'],
efficiency=costs.at['central solid biomass CHP','efficiency']/costs.at['central solid biomass CHP','c_v'])
efficiency=costs.at['central solid biomass CHP','efficiency']/costs.at['central solid biomass CHP','c_v'],
lifetime=costs.at['central solid biomass CHP','lifetime'])
network.madd("Link",
urban_central + " urban central solid biomass CHP CCS electric",
@ -1234,7 +1264,8 @@ def add_biomass(network):
efficiency3=costs.at['solid biomass','CO2 intensity']*options["ccs_fraction"],
c_b=costs.at['central solid biomass CHP','c_b'],
c_v=costs.at['central solid biomass CHP','c_v'],
p_nom_ratio=costs.at['central solid biomass CHP','p_nom_ratio'])
p_nom_ratio=costs.at['central solid biomass CHP','p_nom_ratio'],
lifetime=costs.at['central solid biomass CHP CCS','lifetime'])
network.madd("Link",
urban_central + " urban central solid biomass CHP CCS heat",
@ -1247,7 +1278,8 @@ def add_biomass(network):
marginal_cost=costs.at['central solid biomass CHP CCS','VOM'],
efficiency=costs.at['central solid biomass CHP CCS','efficiency']/costs.at['central solid biomass CHP CCS','c_v'],
efficiency2=-costs.at['solid biomass','CO2 intensity']*options["ccs_fraction"],
efficiency3=costs.at['solid biomass','CO2 intensity']*options["ccs_fraction"])
efficiency3=costs.at['solid biomass','CO2 intensity']*options["ccs_fraction"],
lifetime=costs.at['central solid biomass CHP CCS','lifetime'])
def add_industry(network):
@ -1292,7 +1324,8 @@ def add_industry(network):
capital_cost=costs.at["industry CCS","fixed"]*costs.at['solid biomass','CO2 intensity']*8760, #8760 converts EUR/(tCO2/a) to EUR/(tCO2/h)
efficiency=0.9,
efficiency2=-costs.at['solid biomass','CO2 intensity']*options["ccs_fraction"],
efficiency3=costs.at['solid biomass','CO2 intensity']*options["ccs_fraction"])
efficiency3=costs.at['solid biomass','CO2 intensity']*options["ccs_fraction"],
lifetime=costs.at['industry CCS','lifetime'])
network.madd("Bus",
@ -1326,7 +1359,8 @@ def add_industry(network):
capital_cost=costs.at["industry CCS","fixed"]*costs.at['gas','CO2 intensity']*8760, #8760 converts EUR/(tCO2/a) to EUR/(tCO2/h)
efficiency=0.9,
efficiency2=costs.at['gas','CO2 intensity']*(1-options["ccs_fraction"]),
efficiency3=costs.at['gas','CO2 intensity']*options["ccs_fraction"])
efficiency3=costs.at['gas','CO2 intensity']*options["ccs_fraction"],
lifetime=costs.at['industry CCS','lifetime'])
network.madd("Load",
@ -1380,7 +1414,8 @@ def add_industry(network):
efficiency=costs.at['decentral oil boiler', 'efficiency'],
efficiency2=costs.at['oil', 'CO2 intensity'],
capital_cost=costs.at['decentral oil boiler', 'efficiency'] * costs.at[
'decentral oil boiler', 'fixed'])
'decentral oil boiler', 'fixed'],
lifetime=costs.at['decentral oil boiler','lifetime'])
network.madd("Link",
nodes + " Fischer-Tropsch",
@ -1391,7 +1426,8 @@ def add_industry(network):
efficiency=costs.at["Fischer-Tropsch",'efficiency'],
capital_cost=costs.at["Fischer-Tropsch",'fixed'],
efficiency2=-costs.at["oil",'CO2 intensity']*costs.at["Fischer-Tropsch",'efficiency'],
p_nom_extendable=True)
p_nom_extendable=True,
lifetime=costs.at['Fischer-Tropsch','lifetime'])
network.madd("Load",
["naphtha for industry"],
@ -1460,7 +1496,8 @@ def add_industry(network):
p_nom_extendable=True,
capital_cost=costs.at["industry CCS","fixed"]*8760, #8760 converts EUR/(tCO2/a) to EUR/(tCO2/h)
efficiency=(1-options["ccs_fraction"]),
efficiency2=options["ccs_fraction"])
efficiency2=options["ccs_fraction"],
lifetime=costs.at['industry CCS','lifetime'])
@ -1578,6 +1615,20 @@ if __name__ == "__main__":
n.loads["carrier"] = "electricity"
# Add lifetime and build_year attributes to generators, links and stores
n.generators["lifetime"]=np.nan
n.generators["build_year"]=np.nan
n.links["lifetime"]=np.nan
n.links["build_year"]=np.nan
n.stores["lifetime"]=np.nan
# Add lifetime for solar and wind generators
for carrier in ['solar', 'onwind', 'offwind-dc', 'offwind-ac']:
carrier_name='offwind' if carrier in ['offwind-dc', 'offwind-ac'] else carrier
n.generators.loc[[index for index in n.generators.index.to_list()
if carrier in index], 'lifetime']=costs.at[carrier_name,'lifetime']
add_co2_tracking(n)
add_generation(n)
@ -1664,13 +1715,5 @@ if __name__ == "__main__":
if snakemake.config["sector"]['electricity_grid_connection']:
add_electricity_grid_connection(n)
# Add lifetime and build_year attributes to generators, links and stores
n.generators["lifetime"]=np.nan
n.generators["build_year"]=np.nan
n.links["lifetime"]=np.nan
n.links["build_year"]=np.nan
n.stores["lifetime"]=np.nan
n.stores["build_year"]=np.nan
n.export_to_netcdf(snakemake.output[0])