diff --git a/config/config.default.yaml b/config/config.default.yaml index b5ed334b5..18a095df8 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -785,11 +785,23 @@ solving: # io_api: "direct" # Increases performance but only supported for the highs and gurobi solvers # options that go into the optimize function track_iterations: false - min_iterations: 4 - max_iterations: 6 + min_iterations: 2 + max_iterations: 3 transmission_losses: 2 linearized_unit_commitment: true horizon: 365 + post_discretization: + enable: false + line_unit_size: 1700 + line_threshold: 0.3 + link_unit_size: + DC: 2000 + H2 pipeline: 1200 + gas pipeline: 1500 + link_threshold: + DC: 0.3 + H2 pipeline: 0.3 + gas pipeline: 0.3 constraints: CCL: false diff --git a/doc/configtables/solving.csv b/doc/configtables/solving.csv index 4d2451953..ad8778a3a 100644 --- a/doc/configtables/solving.csv +++ b/doc/configtables/solving.csv @@ -14,6 +14,14 @@ options,,, -- transmission_losses,int,[0-9],"Add piecewise linear approximation of transmission losses based on n tangents. Defaults to 0, which means losses are ignored." -- linearized_unit_commitment,bool,"{'true','false'}",Whether to optimise using the linearized unit commitment formulation. -- horizon,--,int,Number of snapshots to consider in each iteration. Defaults to 100. +-- post_discretization,,, +-- -- enable,bool,"{'true','false'}",Switch to enable post-discretization of the network. Disabled by default. +-- -- line_unit_size,MW,float,Discrete unit size of lines in MW. +-- -- line_threshold,,float,The threshold relative to the discrete line unit size beyond which to round up to the next unit. +-- -- link_unit_size,MW,float,Discrete unit size of links in MW by carrier (given in dictionary style). +-- -- -- {carrier},,, +-- -- link_threshold,,float,The threshold relative to the discrete link unit size beyond which to round up to the next unit by carrier (given in dictionary style). +-- -- -- {carrier},,, constraints ,,, -- CCL,bool,"{'true','false'}",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``. -- EQ,bool/string,"{'false',`n(c| )``; i.e. ``0.5``-``0.7c``}",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. diff --git a/doc/release_notes.rst b/doc/release_notes.rst index b653d0e87..2588ecc70 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -46,6 +46,11 @@ Upcoming Release * Allow dictionary for the config aviation_demand_factor. +* Add option to post-discretize line and link capacities based on unit sizes and + rounding thresholds specified in the configuration under ``solving: options: + post_discretization:`` when iterative solving is enables (``solving: optiosn: + skip_iterations: false``). This option is disabled by default. + * Group existing capacities to the earlier grouping_year for consistency with optimized capacities. * Update data bundle: diff --git a/envs/environment.yaml b/envs/environment.yaml index 58835603d..dc5fad2b5 100644 --- a/envs/environment.yaml +++ b/envs/environment.yaml @@ -11,7 +11,7 @@ dependencies: - pip - atlite>=0.2.9 -- pypsa>=0.26.1 +- pypsa>=0.28 - linopy - dask diff --git a/scripts/solve_network.py b/scripts/solve_network.py index a9bcafea0..30275926f 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -1007,9 +1007,12 @@ def solve_network(n, config, solving, **kwargs): elif skip_iterations: status, condition = n.optimize(**kwargs) else: - kwargs["track_iterations"] = (cf_solving.get("track_iterations", False),) - kwargs["min_iterations"] = (cf_solving.get("min_iterations", 4),) - kwargs["max_iterations"] = (cf_solving.get("max_iterations", 6),) + kwargs["track_iterations"] = cf_solving["track_iterations"] + kwargs["min_iterations"] = cf_solving["min_iterations"] + kwargs["max_iterations"] = cf_solving["max_iterations"] + if cf_solving["post_discretization"].pop("enable"): + logger.info("Add post-discretization parameters.") + kwargs.update(cf_solving["post_discretization"]) status, condition = n.optimize.optimize_transmission_expansion_iteratively( **kwargs )