diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index a62c2816..383951bd 100644 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -395,7 +395,7 @@ rule simplify_network: BENCHMARKS + "simplify_network/elec_s{simpl}" threads: 1 resources: - mem_mb=10000, + mem_mb=12000, conda: "../envs/environment.yaml" script: diff --git a/rules/build_sector.smk b/rules/build_sector.smk index 4fe561a8..356abdc5 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -295,7 +295,7 @@ rule build_biomass_potentials: "../scripts/build_biomass_potentials.py" -if config["sector"]["biomass_transport"]: +if config["sector"]["biomass_transport"] or config["sector"]["biomass_spatial"]: rule build_biomass_transport_costs: input: @@ -320,9 +320,8 @@ if config["sector"]["biomass_transport"]: build_biomass_transport_costs_output = rules.build_biomass_transport_costs.output -if not config["sector"]["biomass_transport"]: +if not (config["sector"]["biomass_transport"] or config["sector"]["biomass_spatial"]): # this is effecively an `else` statement which is however not liked by snakefmt - build_biomass_transport_costs_output = {} diff --git a/rules/postprocess.smk b/rules/postprocess.smk index e6e6ab33..05a05f50 100644 --- a/rules/postprocess.smk +++ b/rules/postprocess.smk @@ -39,7 +39,7 @@ rule copy_config: params: RDIR=RDIR, output: - RESULTS + "config/config.yaml", + RESULTS + "config.yaml", threads: 1 resources: mem_mb=1000, @@ -51,22 +51,6 @@ rule copy_config: "../scripts/copy_config.py" -rule copy_conda_env: - output: - RESULTS + "config/environment.yaml", - threads: 1 - resources: - mem_mb=500, - log: - LOGS + "copy_conda_env.log", - benchmark: - BENCHMARKS + "copy_conda_env" - conda: - "../envs/environment.yaml" - shell: - "conda env export -f {output} --no-builds" - - rule make_summary: params: foresight=config["foresight"], diff --git a/rules/solve_electricity.smk b/rules/solve_electricity.smk index 757639f1..7da42a11 100644 --- a/rules/solve_electricity.smk +++ b/rules/solve_electricity.smk @@ -13,6 +13,7 @@ rule solve_network: ), input: network=RESOURCES + "networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc", + config=RESULTS + "config.yaml", output: network=RESULTS + "networks/elec_s{simpl}_{clusters}_ec_l{ll}_{opts}.nc", log: diff --git a/rules/solve_myopic.smk b/rules/solve_myopic.smk index ba2787a1..6e84e5f4 100644 --- a/rules/solve_myopic.smk +++ b/rules/solve_myopic.smk @@ -92,7 +92,7 @@ rule solve_sector_network_myopic: network=RESULTS + "prenetworks-brownfield/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", costs="data/costs_{planning_horizons}.csv", - config=RESULTS + "config/config.yaml", + config=RESULTS + "config.yaml", output: RESULTS + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", diff --git a/rules/solve_overnight.smk b/rules/solve_overnight.smk index d0313f30..a01c1195 100644 --- a/rules/solve_overnight.smk +++ b/rules/solve_overnight.smk @@ -14,9 +14,7 @@ rule solve_sector_network: input: network=RESULTS + "prenetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", - costs="data/costs_{}.csv".format(config["costs"]["year"]), - config=RESULTS + "config/config.yaml", - #env=RDIR + 'config/environment.yaml', + config=RESULTS + "config.yaml", output: RESULTS + "postnetworks/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", diff --git a/scripts/copy_config.py b/scripts/copy_config.py index 79d2e32b..a549d893 100644 --- a/scripts/copy_config.py +++ b/scripts/copy_config.py @@ -11,25 +11,13 @@ from shutil import copy import yaml -files = { - "config/config.yaml": "config.yaml", - "Snakefile": "Snakefile", - "scripts/solve_network.py": "solve_network.py", - "scripts/prepare_sector_network.py": "prepare_sector_network.py", -} - if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake snakemake = mock_snakemake("copy_config") - basepath = Path(f"results/{snakemake.params.RDIR}config/") - - for f, name in files.items(): - copy(f, basepath / name) - - with open(basepath / "config.snakemake.yaml", "w") as yaml_file: + with open(snakemake.output[0], "w") as yaml_file: yaml.dump( snakemake.config, yaml_file, diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index e0afbcd8..0c1faacc 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -2156,12 +2156,11 @@ def add_biomass(n, costs): ) if options["biomass_transport"]: - transport_costs = pd.read_csv( - snakemake.input.biomass_transport_costs, - index_col=0, - ).squeeze() - # add biomass transport + transport_costs = pd.read_csv( + snakemake.input.biomass_transport_costs, index_col=0 + ) + transport_costs = transport_costs.squeeze() biomass_transport = create_network_topology( n, "biomass transport ", bidirectional=False ) @@ -2185,6 +2184,27 @@ def add_biomass(n, costs): carrier="solid biomass transport", ) + elif options["biomass_spatial"]: + # add artificial biomass generators at nodes which include transport costs + transport_costs = pd.read_csv( + snakemake.input.biomass_transport_costs, index_col=0 + ) + transport_costs = transport_costs.squeeze() + bus_transport_costs = spatial.biomass.nodes.to_series().apply( + lambda x: transport_costs[x[:2]] + ) + average_distance = 200 # km #TODO: validate this assumption + + n.madd( + "Generator", + spatial.biomass.nodes, + bus=spatial.biomass.nodes, + carrier="solid biomass", + p_nom=10000, + marginal_cost=costs.at["solid biomass", "fuel"] + + bus_transport_costs * average_distance, + ) + # AC buses with district heating urban_central = n.buses.index[n.buses.carrier == "urban central heat"] if not urban_central.empty and options["chp"]: