diff --git a/scripts/add_brownfield.py b/scripts/add_brownfield.py index 72b2d382..f79c0fa3 100755 --- a/scripts/add_brownfield.py +++ b/scripts/add_brownfield.py @@ -55,7 +55,10 @@ def add_brownfield(n, n_p, year): 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))]) + #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))]) + 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))]) # generators whose capacity was optimized in the previous year are renamed n_p.generators.index=np.where(n_p.generators.index.str[-4:].isin(previous_timesteps)==False, @@ -70,14 +73,19 @@ def add_brownfield(n, n_p, year): marginal_cost=n_p.generators.marginal_cost, capital_cost=n_p.generators.capital_cost, efficiency=n_p.generators.efficiency, - p_max_pu=n_p.generators_t.p_max_pu) + p_max_pu=n_p.generators_t.p_max_pu, + build_year=int(previous_timestep), + lifetime=snakemake.config['costs']['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 (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))]) + # stores whose capacity was optimized in the previous year are renamed n_p.stores.index=np.where(n_p.stores.index.str[-4:].isin(previous_timesteps)==False, n_p.stores.index + '-' + previous_timestep, @@ -88,7 +96,9 @@ def add_brownfield(n, n_p, year): carrier=n_p.stores.carrier, e_nom=n_p.stores.e_nom_opt, e_cyclic=True, - capital_cost=n_p.stores.capital_cost) + capital_cost=n_p.stores.capital_cost, + build_year=int(previous_timestep), + lifetime=snakemake.config['costs']['lifetime']) ## add links from previous steps # TODO: add_chp_constraint() in solve_network needs to be adjusted @@ -96,8 +106,11 @@ 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 (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))]) + # links whose installationYear + lifetime < year are removed n_p.links.index=np.where(n_p.links.index.str[-4:].isin(previous_timesteps)==False, n_p.links.index + '-' + previous_timestep, @@ -112,7 +125,9 @@ def add_brownfield(n, n_p, year): marginal_cost=n_p.links.marginal_cost, capital_cost=n_p.links.capital_cost, efficiency=n_p.links.efficiency, - efficiency2=n_p.links.efficiency2) + efficiency2=n_p.links.efficiency2, + build_year=int(previous_timestep), + lifetime=snakemake.config['costs']['lifetime']) if __name__ == "__main__": @@ -123,9 +138,9 @@ 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='2050'), + planning_horizons='2030'), 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}_2040.nc', + network_p='pypsa-eur-sec/results/test/postnetworks/{network}_s{simpl}_{clusters}_lv{lv}__{sector_opts}_{co2_budget_name}_2020.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"), @@ -148,7 +163,7 @@ if __name__ == "__main__": n_p = pypsa.Network(snakemake.input.network_p, override_component_attrs=override_component_attrs) - +#%% add_brownfield(n, n_p, year) Nyears = n.snapshot_weightings.sum()/8760. diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 1e3d8219..a13d9876 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1664,4 +1664,13 @@ 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])