diff --git a/config/config.default.yaml b/config/config.default.yaml index d3b45fda..657c23bd 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -630,15 +630,18 @@ solving: #tmpdir: "path/to/tmp" options: clip_p_max_pu: 1.e-2 - linearized_unit_commitment: true load_shedding: false - transmission_losses: 0 noisy_costs: true skip_iterations: true + rolling_horizon: false + seed: 123 + # options that go into the optimize function track_iterations: false min_iterations: 4 max_iterations: 6 - seed: 123 + transmission_losses: 0 + linearized_unit_commitment: true + horizon: 365 solver: name: gurobi @@ -666,7 +669,6 @@ solving: AggFill: 0 PreDual: 0 GURO_PAR_BARDENSETHRESH: 200 - seed: 10 # Consistent seed for all plattforms gurobi-numeric-focus: name: gurobi NumericFocus: 3 # Favour numeric stability over speed diff --git a/config/config.validation.yaml b/config/config.validation.yaml index 79c5dd00..0dc69027 100644 --- a/config/config.validation.yaml +++ b/config/config.validation.yaml @@ -70,7 +70,7 @@ renewable: cutout: europe-2019-era5 conventional: - unit_commitment: true + unit_commitment: false dynamic_fuel_price: true nuclear: p_max_pu: "data/nuclear_p_max_pu.csv" # float of file name @@ -88,3 +88,5 @@ solving: #tmpdir: "path/to/tmp" options: load_shedding: true + rolling_horizon: true + horizon: 365 diff --git a/config/test/config.validation.yaml b/config/test/config.validation.yaml index 63259773..1870d4aa 100644 --- a/config/test/config.validation.yaml +++ b/config/test/config.validation.yaml @@ -7,11 +7,14 @@ run: scenario: clusters: # number of nodes in Europe, any integer between 37 (1 node per country-zone) and several hundred - - 37 + - 37c opts: # only relevant for PyPSA-Eur - 'Ept' snapshots: - start: "2019-04-01" - end: "2019-04-10" + start: "2019-01-01" + end: "2019-02-01" inclusive: 'left' # include start, not end + +conventional: + unit_commitment: false diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 20aae820..0c898d0e 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -598,47 +598,43 @@ def extra_functionality(n, snapshots): def solve_network(n, config, solving, opts="", **kwargs): set_of_options = solving["solver"]["options"] - solver_options = solving["solver_options"][set_of_options] if set_of_options else {} - solver_name = solving["solver"]["name"] cf_solving = solving["options"] - track_iterations = cf_solving.get("track_iterations", False) - min_iterations = cf_solving.get("min_iterations", 4) - max_iterations = cf_solving.get("max_iterations", 6) - transmission_losses = cf_solving.get("transmission_losses", 0) - linearized_unit_commitment = cf_solving.get("linearized_unit_commitment", False) + kwargs["solver_options"] = ( + solving["solver_options"][set_of_options] if set_of_options else {} + ) + kwargs["solver_name"] = solving["solver"]["name"] + kwargs["extra_functionality"] = extra_functionality + kwargs["transmission_losses"] = cf_solving.get("transmission_losses", False) + kwargs["linearized_unit_commitment"] = cf_solving.get( + "linearized_unit_commitment", False + ) + + rolling_horizon = cf_solving.pop("rolling_horizon", False) + skip_iterations = cf_solving.pop("skip_iterations", False) + if not n.lines.s_nom_extendable.any(): + skip_iterations = True + logger.info("No expandable lines found. Skipping iterative solving.") # add to network for extra_functionality n.config = config n.opts = opts - skip_iterations = cf_solving.get("skip_iterations", False) - if not n.lines.s_nom_extendable.any(): - skip_iterations = True - logger.info("No expandable lines found. Skipping iterative solving.") - - if skip_iterations: - status, condition = n.optimize( - solver_name=solver_name, - transmission_losses=transmission_losses, - extra_functionality=extra_functionality, - linearized_unit_commitment=linearized_unit_commitment, - **solver_options, - **kwargs, - ) + if rolling_horizon: + kwargs["horizon"] = cf_solving.get("horizon", 365) + kwargs["overlap"] = cf_solving.get("overlap", 0) + n.optimize.optimize_with_rolling_horizon(**kwargs) + status, condition = "", "" + 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),) status, condition = n.optimize.optimize_transmission_expansion_iteratively( - solver_name=solver_name, - track_iterations=track_iterations, - min_iterations=min_iterations, - max_iterations=max_iterations, - linearized_unit_commitment=linearized_unit_commitment, - transmission_losses=transmission_losses, - extra_functionality=extra_functionality, - **solver_options, - **kwargs, + **kwargs ) - if status != "ok": + if status != "ok" and not rolling_horizon: logger.warning( f"Solving status '{status}' with termination condition '{condition}'" )