From 7d1500604fd1027a7d8952daa4cc40c58444ff66 Mon Sep 17 00:00:00 2001 From: martavp Date: Tue, 14 Jul 2020 13:28:10 +0200 Subject: [PATCH] import prepare_cost function from prepare_sector_network --- scripts/add_brownfield.py | 38 +++++----------------- scripts/add_existing_baseyear.py | 32 +++---------------- scripts/prepare_sector_network.py | 52 +++++++++++++++++++++---------- 3 files changed, 48 insertions(+), 74 deletions(-) diff --git a/scripts/add_brownfield.py b/scripts/add_brownfield.py index 4776a7dd..72b2d382 100755 --- a/scripts/add_brownfield.py +++ b/scripts/add_brownfield.py @@ -24,7 +24,7 @@ from add_existing_baseyear import add_power_capacities_installed_before_baseyear from add_existing_baseyear import add_heating_capacities_installed_before_baseyear -from add_existing_baseyear import prepare_costs +from prepare_sector_network import prepare_costs #First tell PyPSA that links can have multiple outputs by #overriding the component_attrs. This can be done for @@ -40,33 +40,6 @@ override_component_attrs["Link"].loc["p2"] = ["series","MW",0.,"2nd bus output", override_component_attrs["Link"].loc["p3"] = ["series","MW",0.,"3rd bus output","Output"] -def prepare_costs(): - - #set all asset costs and other parameters - #costs = pd.read_csv(snakemake.input.costs,index_col=list(range(3))).sort_index() - - costs = pd.read_csv(snakemake.input.costs,index_col=list(range(2))).sort_index() - - #correct units to MW and EUR - costs.loc[costs.unit.str.contains("/kW"),"value"]*=1e3 - costs.loc[costs.unit.str.contains("USD"),"value"]*=snakemake.config['costs']['USD2013_to_EUR2013'] - - #cost_year = snakemake.config['costs']['year'] - #costs = costs.loc[idx[:,cost_year,:],"value"].unstack(level=2).groupby(level="technology").sum(min_count=1) - costs = costs.loc[:, "value"].unstack(level=1).groupby("technology").sum() - costs = costs.fillna({"CO2 intensity" : 0, - "FOM" : 0, - "VOM" : 0, - "discount rate" : snakemake.config['costs']['discountrate'], - "efficiency" : 1, - "fuel" : 0, - "investment" : 0, - "lifetime" : 25 - }) - - costs["fixed"] = [(annuity(v["lifetime"],v["discount rate"])+v["FOM"]/100.)*v["investment"]*Nyears for i,v in costs.iterrows()] - return costs - def add_brownfield(n, n_p, year): print("adding brownfield") @@ -179,9 +152,12 @@ if __name__ == "__main__": add_brownfield(n, n_p, year) Nyears = n.snapshot_weightings.sum()/8760. - - costs = prepare_costs() - + + costs = prepare_costs(snakemake.input.costs, + snakemake.config['costs']['USD2013_to_EUR2013'], + snakemake.config['costs']['discountrate'], + Nyears) + baseyear = snakemake.config['scenario']["planning_horizons"][0] add_power_capacities_installed_before_baseyear(n, year, baseyear, costs) # only the capacities with YearDecomissioning > year are added diff --git a/scripts/add_existing_baseyear.py b/scripts/add_existing_baseyear.py index 41a6140b..1c07d5ad 100755 --- a/scripts/add_existing_baseyear.py +++ b/scripts/add_existing_baseyear.py @@ -20,6 +20,7 @@ import pytz from vresutils.costdata import annuity +from prepare_sector_network import prepare_costs #First tell PyPSA that links can have multiple outputs by #overriding the component_attrs. This can be done for @@ -34,32 +35,6 @@ override_component_attrs["Link"].loc["efficiency3"] = ["static or series","per u override_component_attrs["Link"].loc["p2"] = ["series","MW",0.,"2nd bus output","Output"] override_component_attrs["Link"].loc["p3"] = ["series","MW",0.,"3rd bus output","Output"] -def prepare_costs(): - - #set all asset costs and other parameters - #costs = pd.read_csv(snakemake.input.costs,index_col=list(range(3))).sort_index() - - costs = pd.read_csv(snakemake.input.costs,index_col=list(range(2))).sort_index() - - #correct units to MW and EUR - costs.loc[costs.unit.str.contains("/kW"),"value"]*=1e3 - costs.loc[costs.unit.str.contains("USD"),"value"]*=snakemake.config['costs']['USD2013_to_EUR2013'] - - #cost_year = snakemake.config['costs']['year'] - #costs = costs.loc[idx[:,cost_year,:],"value"].unstack(level=2).groupby(level="technology").sum(min_count=1) - costs = costs.loc[:, "value"].unstack(level=1).groupby("technology").sum() - costs = costs.fillna({"CO2 intensity" : 0, - "FOM" : 0, - "VOM" : 0, - "discount rate" : snakemake.config['costs']['discountrate'], - "efficiency" : 1, - "fuel" : 0, - "investment" : 0, - "lifetime" : 25 - }) - - costs["fixed"] = [(annuity(v["lifetime"],v["discount rate"])+v["FOM"]/100.)*v["investment"]*Nyears for i,v in costs.iterrows()] - return costs def add_power_capacities_installed_before_baseyear(n, year, baseyear, costs): """ @@ -375,7 +350,10 @@ if __name__ == "__main__": override_component_attrs=override_component_attrs) Nyears = n.snapshot_weightings.sum()/8760. - costs = prepare_costs() + costs = prepare_costs(snakemake.input.costs, + snakemake.config['costs']['USD2013_to_EUR2013'], + snakemake.config['costs']['discountrate'], + Nyears) add_power_capacities_installed_before_baseyear(n, baseyear, baseyear, costs) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index a1221b7a..1e3d8219 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -424,23 +424,23 @@ def prepare_data(network): -def prepare_costs(): +def prepare_costs(cost_file, USD_to_EUR, discount_rate, Nyears): #set all asset costs and other parameters - costs = pd.read_csv(snakemake.input.costs,index_col=list(range(3))).sort_index() - #costs = pd.read_csv(snakemake.input.costs,index_col=list(range(2))).sort_index() + #costs = pd.read_csv(snakemake.input.costs,index_col=list(range(3))).sort_index() + costs = pd.read_csv(cost_file,index_col=list(range(2))).sort_index() #correct units to MW and EUR costs.loc[costs.unit.str.contains("/kW"),"value"]*=1e3 - costs.loc[costs.unit.str.contains("USD"),"value"]*=snakemake.config['costs']['USD2013_to_EUR2013'] + costs.loc[costs.unit.str.contains("USD"),"value"]*=USD_to_EUR - cost_year = snakemake.config['costs']['year'] - costs = costs.loc[idx[:,cost_year,:],"value"].unstack(level=2).groupby(level="technology").sum(min_count=1) - #costs = costs.loc[:, "value"].unstack(level=1).groupby("technology").sum() + #cost_year = snakemake.config['costs']['year'] + #costs = costs.loc[idx[:,cost_year,:],"value"].unstack(level=2).groupby(level="technology").sum(min_count=1) + costs = costs.loc[:, "value"].unstack(level=1).groupby("technology").sum() costs = costs.fillna({"CO2 intensity" : 0, "FOM" : 0, "VOM" : 0, - "discount rate" : snakemake.config['costs']['discountrate'], + "discount rate" : discount_rate, "efficiency" : 1, "fuel" : 0, "investment" : 0, @@ -648,7 +648,8 @@ def add_storage(network): capital_cost=costs.at["fuel cell","fixed"]*costs.at["fuel cell","efficiency"]) #NB: fixed cost is per MWel if options['hydrogen_underground_storage']: - h2_capital_cost = costs.at["hydrogen underground storage","fixed"] + h2_capital_cost = costs.at["gas storage","fixed"] + #h2_capital_cost = costs.at["hydrogen underground storage","fixed"] else: h2_capital_cost = costs.at["hydrogen storage","fixed"] @@ -1500,7 +1501,8 @@ def remove_h2_network(n): n.stores.drop(["EU H2 Store"],inplace=True) if options['hydrogen_underground_storage']: - h2_capital_cost = costs.at["hydrogen underground storage","fixed"] + h2_capital_cost = costs.at["gas storage","fixed"] + #h2_capital_cost = costs.at["hydrogen underground storage","fixed"] else: h2_capital_cost = costs.at["hydrogen storage","fixed"] @@ -1520,13 +1522,28 @@ if __name__ == "__main__": if 'snakemake' not in globals(): from vresutils.snakemake import MockSnakemake snakemake = MockSnakemake( - wildcards=dict(network='elec', simpl='', clusters='39', lv='1.0', + wildcards=dict(network='elec', simpl='', clusters='37', lv='1.0', opts='', planning_horizons='2020', + co2_budget_name='go', sector_opts='Co2L0-168H-T-H-B-I-solar3-dist1'), input=dict(network='pypsa-eur/networks/{network}_s{simpl}_{clusters}_ec_lv{lv}_{opts}.nc', timezone_mappings='pypsa-eur-sec/data/timezone_mappings.csv', - co2_budget='pypsa-eur-sec/data/co2_budget.csv'), - output=['pypsa-eur-sec/results/test/prenetworks/{network}_s{simpl}_{clusters}_lv{lv}__{sector_opts}_{planning_horizons}.nc'] + co2_budget='pypsa-eur-sec/data/co2_budget.csv', + clustered_pop_layout='pypsa-eur-sec/resources/pop_layout_{network}_s{simpl}_{clusters}.csv', + #costs='pypsa-eur-sec/data/costs.csv', + 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', + solar_thermal_total='pypsa-eur-sec/resources/solar_thermal_total_{network}_s{simpl}_{clusters}.nc', + energy_totals_name='pypsa-eur-sec/data/energy_totals.csv', + heat_demand_total='pypsa-eur-sec/resources/heat_demand_total_{network}_s{simpl}_{clusters}.nc', + heat_profile='pypsa-eur-sec/data/heat_load_profile_BDEW.csv', + transport_name='pypsa-eur-sec/data/transport_data.csv', + temp_air_total='pypsa-eur-sec/resources/temp_air_total_{network}_s{simpl}_{clusters}.nc', + co2_totals_name='pypsa-eur-sec/data/co2_totals.csv', + biomass_potentials='pypsa-eur-sec/data/biomass_potentials.csv', + industrial_demand='pypsa-eur-sec/resources/industrial_demand_{network}_s{simpl}_{clusters}.csv',), + output=['pypsa-eur-sec/results/test/prenetworks/{network}_s{simpl}_{clusters}_lv{lv}__{sector_opts}_{co2_budget_name}_{planning_horizons}.nc'] ) import yaml with open('config.yaml') as f: @@ -1545,14 +1562,17 @@ if __name__ == "__main__": override_component_attrs=override_component_attrs) Nyears = n.snapshot_weightings.sum()/8760. -#%% + pop_layout = pd.read_csv(snakemake.input.clustered_pop_layout,index_col=0) pop_layout["ct"] = pop_layout.index.str[:2] ct_total = pop_layout.total.groupby(pop_layout["ct"]).sum() pop_layout["ct_total"] = pop_layout["ct"].map(ct_total.get) pop_layout["fraction"] = pop_layout["total"]/pop_layout["ct_total"] -#%% - costs = prepare_costs() + + costs = prepare_costs(snakemake.input.costs, + snakemake.config['costs']['USD2013_to_EUR2013'], + snakemake.config['costs']['discountrate'], + Nyears) remove_elec_base_techs(n)