address review commments
This commit is contained in:
parent
8622398ceb
commit
ad6322bcb3
4
.gitignore
vendored
4
.gitignore
vendored
@ -16,7 +16,7 @@ gurobi.log
|
|||||||
/networks
|
/networks
|
||||||
/benchmarks
|
/benchmarks
|
||||||
/logs
|
/logs
|
||||||
# /notebooks
|
/notebooks
|
||||||
/data
|
/data
|
||||||
/cutouts
|
/cutouts
|
||||||
|
|
||||||
@ -68,7 +68,7 @@ doc/_build
|
|||||||
|
|
||||||
*.geojson
|
*.geojson
|
||||||
|
|
||||||
# *.ipynb
|
*.ipynb
|
||||||
|
|
||||||
data/costs_*
|
data/costs_*
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@ if not exists("config/config.yaml"):
|
|||||||
|
|
||||||
|
|
||||||
configfile: "config/config.yaml"
|
configfile: "config/config.yaml"
|
||||||
|
configfile: "config/config.validation.yaml"
|
||||||
|
|
||||||
|
|
||||||
COSTS = f"data/costs_{config['costs']['year']}.csv"
|
COSTS = f"data/costs_{config['costs']['year']}.csv"
|
||||||
|
@ -669,6 +669,7 @@ solving:
|
|||||||
glpk-default: {} # Used in CI
|
glpk-default: {} # Used in CI
|
||||||
|
|
||||||
mem: 30000 #memory in MB; 20 GB enough for 50+B+I+H2; 100 GB for 181+B+I+H2
|
mem: 30000 #memory in MB; 20 GB enough for 50+B+I+H2; 100 GB for 181+B+I+H2
|
||||||
|
walltime: "12:00:00"
|
||||||
|
|
||||||
# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#plotting
|
# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#plotting
|
||||||
plotting:
|
plotting:
|
||||||
|
@ -62,7 +62,7 @@ renewable:
|
|||||||
flatten_dispatch: 0.01
|
flatten_dispatch: 0.01
|
||||||
|
|
||||||
conventional:
|
conventional:
|
||||||
unit_commitment: true
|
unit_commitment: false
|
||||||
dynamic_fuel_price: true
|
dynamic_fuel_price: true
|
||||||
nuclear:
|
nuclear:
|
||||||
p_max_pu: "data/nuclear_p_max_pu.csv"
|
p_max_pu: "data/nuclear_p_max_pu.csv"
|
||||||
|
@ -3,6 +3,7 @@ Trigger, Description, Definition, Status
|
|||||||
``nSEG``; e.g. ``4380SEG``, "Apply time series segmentation with `tsam <https://tsam.readthedocs.io/en/latest/index.html>`_ package to ``n`` adjacent snapshots of varying lengths based on capacity factors of varying renewables, hydro inflow and load.", ``prepare_network``: apply_time_segmentation(), In active use
|
``nSEG``; e.g. ``4380SEG``, "Apply time series segmentation with `tsam <https://tsam.readthedocs.io/en/latest/index.html>`_ package to ``n`` adjacent snapshots of varying lengths based on capacity factors of varying renewables, hydro inflow and load.", ``prepare_network``: apply_time_segmentation(), In active use
|
||||||
``Co2L``, Add an overall absolute carbon-dioxide emissions limit configured in ``electricity: co2limit``. If a float is appended an overall emission limit relative to the emission level given in ``electricity: co2base`` is added (e.g. ``Co2L0.05`` limits emissisions to 5% of what is given in ``electricity: co2base``), ``prepare_network``: `add_co2limit() <https://github.com/PyPSA/pypsa-eur/blob/6b964540ed39d44079cdabddee8333f486d0cd63/scripts/prepare_network.py#L19>`_ and its `caller <https://github.com/PyPSA/pypsa-eur/blob/6b964540ed39d44079cdabddee8333f486d0cd63/scripts/prepare_network.py#L154>`__, In active use
|
``Co2L``, Add an overall absolute carbon-dioxide emissions limit configured in ``electricity: co2limit``. If a float is appended an overall emission limit relative to the emission level given in ``electricity: co2base`` is added (e.g. ``Co2L0.05`` limits emissisions to 5% of what is given in ``electricity: co2base``), ``prepare_network``: `add_co2limit() <https://github.com/PyPSA/pypsa-eur/blob/6b964540ed39d44079cdabddee8333f486d0cd63/scripts/prepare_network.py#L19>`_ and its `caller <https://github.com/PyPSA/pypsa-eur/blob/6b964540ed39d44079cdabddee8333f486d0cd63/scripts/prepare_network.py#L154>`__, In active use
|
||||||
``Ep``, Add cost for a carbon-dioxide price configured in ``costs: emission_prices: co2`` to ``marginal_cost`` of generators (other emission types listed in ``network.carriers`` possible as well), ``prepare_network``: `add_emission_prices() <https://github.com/PyPSA/pypsa-eur/blob/6b964540ed39d44079cdabddee8333f486d0cd63/scripts/prepare_network.py#L24>`_ and its `caller <https://github.com/PyPSA/pypsa-eur/blob/6b964540ed39d44079cdabddee8333f486d0cd63/scripts/prepare_network.py#L158>`__, In active use
|
``Ep``, Add cost for a carbon-dioxide price configured in ``costs: emission_prices: co2`` to ``marginal_cost`` of generators (other emission types listed in ``network.carriers`` possible as well), ``prepare_network``: `add_emission_prices() <https://github.com/PyPSA/pypsa-eur/blob/6b964540ed39d44079cdabddee8333f486d0cd63/scripts/prepare_network.py#L24>`_ and its `caller <https://github.com/PyPSA/pypsa-eur/blob/6b964540ed39d44079cdabddee8333f486d0cd63/scripts/prepare_network.py#L158>`__, In active use
|
||||||
|
``Ept``, Add monthly cost for a carbon-dioxide price based on historical values built by the rule ``build_monthly_prices``, In active use
|
||||||
``CCL``, Add minimum and maximum levels of generator nominal capacity per carrier for individual countries. These can be specified in the file linked at ``electricity: agg_p_nom_limits`` in the configuration. File defaults to ``data/agg_p_nom_minmax.csv``., ``solve_network``, In active use
|
``CCL``, Add minimum and maximum levels of generator nominal capacity per carrier for individual countries. These can be specified in the file linked at ``electricity: agg_p_nom_limits`` in the configuration. File defaults to ``data/agg_p_nom_minmax.csv``., ``solve_network``, In active use
|
||||||
``EQ``, "Require each country or node to on average produce a minimal share of its total consumption itself. Example: ``EQ0.5c`` demands each country to produce on average at least 50% of its consumption; ``EQ0.5`` demands each node to produce on average at least 50% of its consumption.", ``solve_network``, In active use
|
``EQ``, "Require each country or node to on average produce a minimal share of its total consumption itself. Example: ``EQ0.5c`` demands each country to produce on average at least 50% of its consumption; ``EQ0.5`` demands each node to produce on average at least 50% of its consumption.", ``solve_network``, In active use
|
||||||
``ATK``, "Require each node to be autarkic. Example: ``ATK`` removes all lines and links. ``ATKc`` removes all cross-border lines and links.", ``prepare_network``, In active use
|
``ATK``, "Require each node to be autarkic. Example: ``ATK`` removes all lines and links. ``ATKc`` removes all cross-border lines and links.", ``prepare_network``, In active use
|
||||||
|
Can't render this file because it has a wrong number of fields in line 6.
|
@ -27,7 +27,7 @@ rule solve_network:
|
|||||||
threads: 4
|
threads: 4
|
||||||
resources:
|
resources:
|
||||||
mem_mb=memory,
|
mem_mb=memory,
|
||||||
walltime="24:00:00",
|
walltime=config["solving"].get("walltime", "12:00:00"),
|
||||||
shadow:
|
shadow:
|
||||||
"minimal"
|
"minimal"
|
||||||
conda:
|
conda:
|
||||||
@ -58,6 +58,7 @@ rule solve_operations_network:
|
|||||||
threads: 4
|
threads: 4
|
||||||
resources:
|
resources:
|
||||||
mem_mb=(lambda w: 10000 + 372 * int(w.clusters)),
|
mem_mb=(lambda w: 10000 + 372 * int(w.clusters)),
|
||||||
|
walltime=config["solving"].get("walltime", "12:00:00"),
|
||||||
shadow:
|
shadow:
|
||||||
"minimal"
|
"minimal"
|
||||||
conda:
|
conda:
|
||||||
|
@ -106,6 +106,7 @@ rule solve_sector_network_myopic:
|
|||||||
threads: 4
|
threads: 4
|
||||||
resources:
|
resources:
|
||||||
mem_mb=config["solving"]["mem"],
|
mem_mb=config["solving"]["mem"],
|
||||||
|
walltime=config["solving"].get("walltime", "12:00:00"),
|
||||||
benchmark:
|
benchmark:
|
||||||
(
|
(
|
||||||
BENCHMARKS
|
BENCHMARKS
|
||||||
|
@ -28,6 +28,7 @@ rule solve_sector_network:
|
|||||||
threads: config["solving"]["solver"].get("threads", 4)
|
threads: config["solving"]["solver"].get("threads", 4)
|
||||||
resources:
|
resources:
|
||||||
mem_mb=config["solving"]["mem"],
|
mem_mb=config["solving"]["mem"],
|
||||||
|
walltime=config["solving"].get("walltime", "12:00:00"),
|
||||||
benchmark:
|
benchmark:
|
||||||
(
|
(
|
||||||
RESULTS
|
RESULTS
|
||||||
|
@ -115,14 +115,17 @@ def add_dynamic_emission_prices(n):
|
|||||||
co2_price = (
|
co2_price = (
|
||||||
co2_price.reindex(n.snapshots).fillna(method="ffill").fillna(method="bfill")
|
co2_price.reindex(n.snapshots).fillna(method="ffill").fillna(method="bfill")
|
||||||
)
|
)
|
||||||
# TODO: enable this without having dynamic marginal costs defined beforehand
|
|
||||||
emissions = (
|
emissions = (
|
||||||
n.generators.carrier.map(n.carriers.co2_emissions) / n.generators.efficiency
|
n.generators.carrier.map(n.carriers.co2_emissions) / n.generators.efficiency
|
||||||
)
|
)
|
||||||
co2_cost = expand_series(emissions, n.snapshots).T.mul(co2_price.iloc[:, 0], axis=0)
|
co2_cost = expand_series(emissions, n.snapshots).T.mul(co2_price.iloc[:, 0], axis=0)
|
||||||
n.generators_t.marginal_cost += co2_cost.reindex(
|
|
||||||
columns=n.generators_t.marginal_cost.columns
|
static = n.generators.marginal_cost
|
||||||
)
|
dynamic = n.get_switchable_as_dense("Generator", "marginal_cost")
|
||||||
|
|
||||||
|
marginal_cost = dynamic + co2_cost.reindex(columns=dynamic.columns, fill_value=0)
|
||||||
|
n.generators_t.marginal_cost = marginal_cost.loc[:, marginal_cost.ne(static).any()]
|
||||||
|
|
||||||
|
|
||||||
def set_line_s_max_pu(n, s_max_pu=0.7):
|
def set_line_s_max_pu(n, s_max_pu=0.7):
|
||||||
@ -277,7 +280,7 @@ if __name__ == "__main__":
|
|||||||
from _helpers import mock_snakemake
|
from _helpers import mock_snakemake
|
||||||
|
|
||||||
snakemake = mock_snakemake(
|
snakemake = mock_snakemake(
|
||||||
"prepare_network", simpl="", clusters="37c", ll="v1.0", opts="24H-Ept"
|
"prepare_network", simpl="", clusters="37", ll="v1.0", opts="Ept"
|
||||||
)
|
)
|
||||||
configure_logging(snakemake)
|
configure_logging(snakemake)
|
||||||
|
|
||||||
@ -351,7 +354,12 @@ if __name__ == "__main__":
|
|||||||
c.df.loc[sel, attr] *= factor
|
c.df.loc[sel, attr] *= factor
|
||||||
|
|
||||||
for o in opts:
|
for o in opts:
|
||||||
if "Ep" in o:
|
if "Ept" in o:
|
||||||
|
logger.info(
|
||||||
|
"Setting time dependent emission prices according spot market price"
|
||||||
|
)
|
||||||
|
add_dynamic_emission_prices(n)
|
||||||
|
elif "Ep" in o:
|
||||||
m = re.findall("[0-9]*\.?[0-9]+$", o)
|
m = re.findall("[0-9]*\.?[0-9]+$", o)
|
||||||
if len(m) > 0:
|
if len(m) > 0:
|
||||||
logger.info("Setting emission prices according to wildcard value.")
|
logger.info("Setting emission prices according to wildcard value.")
|
||||||
@ -360,11 +368,6 @@ if __name__ == "__main__":
|
|||||||
logger.info("Setting emission prices according to config value.")
|
logger.info("Setting emission prices according to config value.")
|
||||||
add_emission_prices(n, snakemake.params.costs["emission_prices"])
|
add_emission_prices(n, snakemake.params.costs["emission_prices"])
|
||||||
break
|
break
|
||||||
if "Ept" in o:
|
|
||||||
logger.info(
|
|
||||||
"Setting time dependent emission prices according spot market price"
|
|
||||||
)
|
|
||||||
add_dynamic_emission_prices(n)
|
|
||||||
|
|
||||||
ll_type, factor = snakemake.wildcards.ll[0], snakemake.wildcards.ll[1:]
|
ll_type, factor = snakemake.wildcards.ll[0], snakemake.wildcards.ll[1:]
|
||||||
set_transmission_limit(n, ll_type, factor, costs, Nyears)
|
set_transmission_limit(n, ll_type, factor, costs, Nyears)
|
||||||
|
Loading…
Reference in New Issue
Block a user