Version Checks
Affected Component/Workflow
Change Classification
Standard
Security & Data Risk Check
Risk Level of Fix
N/A
Bug Description
There's an issue where if using Gurobi in the CBA workflow as the solver of choice for the rolling horizon solves, after one rolling horizon is done, the Gurobi license is not immediately released in the environment. After the first rolling horizon is successfully done solving, a new rolling horizon (either for the same project or, if running multiple projects, another project's rolling horizon) would try to access the same license. This is not allowed (at least not on the same node), so then the solve fails.
Actual Behavior
This is the logger from a single project's solve:
[Fri Jun 19 12:20:33 2026]
localrule solve_cba_network:
input: resources/tyndp/NT/cba/networks/project_t4_2030.nc
output: results/tyndp/NT/cba/networks/project_t4_2030.nc
log: results/tyndp/NT/logs/cba/projects/project_t4_2030_solver.log, results/tyndp/NT/logs/cba/projects/project_t4_2030_memory.log, results/tyndp/NT/logs/cba/projects/project_t4_2030_python.log
jobid: 0
reason: Forced execution
wildcards: run=NT, cba_project=t4, planning_horizons=2030
resources: mem_mb=40000, mem_mib=38147, disk_mb=8000, disk_mib=7630, tmpdir=/scratch/local, runtime=60, partition=big
getfattr: Removing leading '/' from absolute path names
INFO:pypsa.network.io:New version 1.2.3 available! (Current: 1.2.1)
INFO:pypsa.network.io:Imported network 'PyPSA-Eur (tyndp)' has buses, carriers, generators, global_constraints, links, loads, shapes, storage_units, stores, sub_networks
INFO:scripts.solve_network:Add load shedding for all carriers.
WARNING:pypsa.network.io:The following generators are already defined and will be skipped (use overwrite=True to overwrite): AL H2 load shedding, AT H2 load shedding, BA H2 load shedding, BE H2 load shedding, BG H2 load shedding, CH H2 load shedding, CY H2 load shedding, CZ H2 load shedding, DE H2 load shedding, DK H2 load shedding, EE H2 load shedding, ES H2 load shedding, FI H2 load shedding, FR H2 load shedding, GB H2 load shedding, GR H2 load shedding, HR H2 load shedding, HU H2 load shedding, IE H2 load shedding, IT H2 load shedding, LT H2 load shedding, LU H2 load shedding, LV H2 load shedding, ME H2 load shedding, MK H2 load shedding, MT H2 load shedding, NL H2 load shedding, NO H2 load shedding, PL H2 load shedding, PT H2 load shedding, RO H2 load shedding, RS H2 load shedding, SE H2 load shedding, SI H2 load shedding, SK H2 load shedding, IBIT H2 load shedding, IBFI H2 load shedding
WARNING:pypsa.network.io:The following generators are already defined and will be skipped (use overwrite=True to overwrite): AL00 load shedding, AT00 load shedding, BA00 load shedding, BE00 load shedding, BG00 load shedding, CH00 load shedding, CY00 load shedding, CZ00 load shedding, DE00 load shedding, DKE1 load shedding, DKW1 load shedding, EE00 load shedding, ES00 load shedding, FI00 load shedding, FR00 load shedding, FR15 load shedding, GB00 load shedding, GBNI load shedding, GR00 load shedding, GR03 load shedding, HR00 load shedding, HU00 load shedding, IE00 load shedding, ITCA load shedding, ITCN load shedding, ITCS load shedding, ITN1 load shedding, ITS1 load shedding, ITSA load shedding, ITSI load shedding, LT00 load shedding, LUB1 load shedding, LUF1 load shedding, LUG1 load shedding, LUV1 load shedding, LV00 load shedding, ME00 load shedding, MK00 load shedding, MT00 load shedding, NL00 load shedding, NOM1 load shedding, NON1 load shedding, NOS0 load shedding, PL00 load shedding, PT00 load shedding, RO00 load shedding, RS00 load shedding, SE01 load shedding, SE02 load shedding, SE03 load shedding, SE04 load shedding, SI00 load shedding, SK00 load shedding, ITCO load shedding, ITVI load shedding
WARNING:scripts.add_electricity:tech_colors for carriers ['none'] not defined in config.
0%| | 0/53 [00:00<?, ?it/s]INFO:__main__:Optimizing network for snapshot horizon [2009-01-01 00:00:00:2009-01-07 23:00:00] (1/53).
/scratch/htc-panfs/mmeng/open-tyndp/.pixi/envs/open-tyndp/lib/python3.12/site-packages/pypsa/optimization/optimize.py:566: FutureWarning: Passing an int for `transmission_losses` is deprecated and will be removed in PyPSA 2.0. Explicitly pass {'mode': 'tangents', 'segments': 2} (current behavior) or use the new secant-based losses via `transmission_losses=True`.
m = n.optimize.create_model(
INFO:linopy.model: Solve problem using Gurobi solver
INFO:linopy.model:Solver logs written to `results/tyndp/NT/logs/cba/projects/project_t4_2030_solver.log`.
INFO:linopy.model:Solver options:
- threads: 32
- method: 1
- NodeMethod: 1
- Seed: 123
- AggFill: 0
- PreDual: 0
- FeasibilityTol: 1e-06
- OptimalityTol: 1e-06
- ScaleFlag: -1
Set parameter WLSAccessID
Set parameter WLSSecret
Set parameter LicenseID to value 2464355
WLS license 2464355 - registered to Open Energy Transition GmbH
Warning for adding constraints: zero or small (< 1e-13) coefficients, ignored
Set parameter Threads to value 32
Set parameter Method to value 1
Set parameter NodeMethod to value 1
Set parameter Seed to value 123
Set parameter AggFill to value 0
Set parameter PreDual to value 0
Set parameter FeasibilityTol to value 1e-06
Set parameter OptimalityTol to value 1e-06
Set parameter ScaleFlag to value -1
Set parameter LogFile to value "/scratch/htc-panfs/mmeng/open-tyndp/results/tyndp/NT/logs/cba/projects/project_t4_2030_solver.log"
Gurobi Optimizer version 13.0.2 build v13.0.2rc1 (linux64 - "Debian GNU/Linux 13 (trixie)")
CPU model: AMD EPYC 7542 32-Core Processor, instruction set [SSE2|AVX|AVX2]
Thread count: 64 physical cores, 128 logical processors, using up to 8 threads
Non-default parameters:
Method 1
NodeMethod 1
AggFill 0
PreDual 0
Seed 123
Threads 32
WLS license 2464355 - registered to Open Energy Transition GmbH
Optimize a model with 783062 rows, 397320 columns and 1391514 nonzeros (Min)
Model fingerprint: 0xc7fce7a4
Model has 360528 linear objective coefficients
Coefficient statistics:
Matrix range [1e-02, 1e+00]
Objective range [9e-03, 1e+05]
Bounds range [3e+00, 2e+03]
RHS range [1e-02, 2e+09]
Warning: Model contains large rhs
Consider reformulating model or setting NumericFocus parameter
to avoid numerical issues.
Presolve time: 0.80s
Presolved: 30773 rows, 227643 columns, 383073 nonzeros
Iteration Objective Primal Inf. Dual Inf. Time
0 6.5506517e+09 2.839106e+07 0.000000e+00 1s
Extra simplex iterations after uncrush: 168
55807 1.2026253e+10 0.000000e+00 0.000000e+00 3s
Solved in 55807 iterations and 3.11 seconds (3.13 work units)
Optimal objective 1.202625323e+10
Warning: environment still referenced so free is deferred (Continue to use WLS)
INFO:linopy.constants: Optimization successful:
Status: ok
Termination condition: optimal
Solution: 397320 primals, 783062 duals
Objective: 1.20e+10
Solver model: available
Solver message: 2
2%|▏ | 1/53 [00:29<25:09, 29.04s/it]INFO:__main__:Optimizing network for snapshot horizon [2009-01-07 23:00:00:2009-01-14 22:00:00] (2/53).
WARNING:pypsa.optimization.constraints:Stores ['AT00 battery', 'BE00 battery', 'BG00 battery', 'DE00 battery', 'DKW1 battery', 'ES00 battery', 'GB00 battery', 'GBNI battery', 'GR00 battery', 'HU00 battery', 'ITCA battery', 'ITN1 battery', 'ITSA battery', 'ITSI battery', 'LT00 battery', 'LUG1 battery', 'LV00 battery', 'NL00 battery', 'RO00 battery', 'SE01 battery', 'SE02 battery', 'SE03 battery', 'SE04 battery', 'SK00 battery']: Cyclic energy level constraint overrules initial value setting. User-defined e_initial will be ignored.
/scratch/htc-panfs/mmeng/open-tyndp/.pixi/envs/open-tyndp/lib/python3.12/site-packages/pypsa/optimization/optimize.py:566: FutureWarning: Passing an int for `transmission_losses` is deprecated and will be removed in PyPSA 2.0. Explicitly pass {'mode': 'tangents', 'segments': 2} (current behavior) or use the new secant-based losses via `transmission_losses=True`.
m = n.optimize.create_model(
INFO:linopy.model: Solve problem using Gurobi solver
INFO:linopy.model:Solver logs written to `results/tyndp/NT/logs/cba/projects/project_t4_2030_solver.log`.
INFO:linopy.model:Solver options:
- threads: 32
- method: 1
- NodeMethod: 1
- Seed: 123
- AggFill: 0
- PreDual: 0
- FeasibilityTol: 1e-06
- OptimalityTol: 1e-06
- ScaleFlag: -1
Set parameter WLSAccessID
Set parameter WLSSecret
Set parameter LicenseID to value 2464355
WLS license 2464355 - registered to Open Energy Transition GmbH
2%|▏ | 1/53 [00:33<28:46, 33.20s/it]
ERROR:root:Uncaught exception
Traceback (most recent call last):
File "/scratch/htc-panfs/mmeng/open-tyndp/.snakemake/scripts/tmpna845r9j.solve_cba_network.py", line 340, in <module>
solve_network(
File "/scratch/htc-panfs/mmeng/open-tyndp/.snakemake/scripts/tmpna845r9j.solve_cba_network.py", line 281, in solve_network
status, condition = optimize_with_rolling_horizon(n, **all_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/scratch/htc-panfs/mmeng/open-tyndp/.snakemake/scripts/tmpna845r9j.solve_cba_network.py", line 182, in optimize_with_rolling_horizon
status, condition = n.optimize(sns, **kwargs) # type: ignore
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/scratch/htc-panfs/mmeng/open-tyndp/.pixi/envs/open-tyndp/lib/python3.12/site-packages/pypsa/optimization/optimize.py", line 581, in __call__
status, condition = m.solve(
^^^^^^^^
File "/scratch/htc-panfs/mmeng/open-tyndp/.pixi/envs/open-tyndp/lib/python3.12/site-packages/linopy/model.py", line 1403, in solve
result = solver.solve_problem_from_model(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/scratch/htc-panfs/mmeng/open-tyndp/.pixi/envs/open-tyndp/lib/python3.12/site-packages/linopy/solvers.py", line 1088, in solve_problem_from_model
env_ = stack.enter_context(gurobipy.Env())
^^^^^^^^^^^^^^
File "src/gurobipy/env.pxi", line 112, in gurobipy._core.Env.__init__
gurobipy._exception.GurobiError: Single-use license. Another Gurobi process with pid 4064723 running.
RuleException:
CalledProcessError in file "/scratch/htc-panfs/mmeng/open-tyndp/rules/cba.smk", line 427:
Command 'set -euo pipefail; /scratch/htc-panfs/mmeng/open-tyndp/.pixi/envs/open-tyndp/bin/python3.12 /scratch/htc-panfs/mmeng/open-tyndp/.snakemake/scripts/tmpna845r9j.solve_cba_network.py' returned non-zero exit status 1.
[Fri Jun 19 12:21:18 2026]
Error in rule solve_cba_network:
message: None
jobid: 0
input: resources/tyndp/NT/cba/networks/project_t4_2030.nc
output: results/tyndp/NT/cba/networks/project_t4_2030.nc
log: results/tyndp/NT/logs/cba/projects/project_t4_2030_solver.log, results/tyndp/NT/logs/cba/projects/project_t4_2030_memory.log, results/tyndp/NT/logs/cba/projects/project_t4_2030_python.log (check log file(s) for error details)
Shutting down, this might take some time.
Exiting because a job execution failed. Look below for error messages
[Fri Jun 19 12:21:18 2026]
Error in rule solve_cba_network:
message: None
jobid: 0
input: resources/tyndp/NT/cba/networks/project_t4_2030.nc
output: results/tyndp/NT/cba/networks/project_t4_2030.nc
log: results/tyndp/NT/logs/cba/projects/project_t4_2030_solver.log, results/tyndp/NT/logs/cba/projects/project_t4_2030_memory.log, results/tyndp/NT/logs/cba/projects/project_t4_2030_python.log (check log file(s) for error details)
Storing output in storage.
WorkflowError:
At least one job did not complete successfully.
Expected Behavior
Instead, the logger should look something more like this:
[Fri Jun 19 12:28:59 2026]
localrule solve_cba_network:
input: resources/tyndp/NT/cba/networks/project_t4_2030.nc
output: results/tyndp/NT/cba/networks/project_t4_2030.nc
log: results/tyndp/NT/logs/cba/projects/project_t4_2030_solver.log, results/tyndp/NT/logs/cba/projects/project_t4_2030_memory.log, results/tyndp/NT/logs/cba/projects/project_t4_2030_python.log
jobid: 0
reason: Forced execution
wildcards: run=NT, cba_project=t4, planning_horizons=2030
resources: mem_mb=80000, mem_mib=76294, disk_mb=8000, disk_mib=7630, tmpdir=/scratch/local, runtime=180, partition=big
getfattr: Removing leading '/' from absolute path names
INFO:pypsa.network.io:New version 1.2.3 available! (Current: 1.2.1)
INFO:pypsa.network.io:Imported network 'PyPSA-Eur (tyndp)' has buses, carriers, generators, global_constraints, links, loads, shapes, storage_units, stores, sub_networks
INFO:scripts.solve_network:Add load shedding for all carriers.
WARNING:pypsa.network.io:The following generators are already defined and will be skipped (use overwrite=True to overwrite): AL H2 load shedding, AT H2 load shedding, BA H2 load shedding, BE H2 load shedding, BG H2 load shedding, CH H2 load shedding, CY H2 load shedding, CZ H2 load shedding, DE H2 load shedding, DK H2 load shedding, EE H2 load shedding, ES H2 load shedding, FI H2 load shedding, FR H2 load shedding, GB H2 load shedding, GR H2 load shedding, HR H2 load shedding, HU H2 load shedding, IE H2 load shedding, IT H2 load shedding, LT H2 load shedding, LU H2 load shedding, LV H2 load shedding, ME H2 load shedding, MK H2 load shedding, MT H2 load shedding, NL H2 load shedding, NO H2 load shedding, PL H2 load shedding, PT H2 load shedding, RO H2 load shedding, RS H2 load shedding, SE H2 load shedding, SI H2 load shedding, SK H2 load shedding, IBIT H2 load shedding, IBFI H2 load shedding
WARNING:pypsa.network.io:The following generators are already defined and will be skipped (use overwrite=True to overwrite): AL00 load shedding, AT00 load shedding, BA00 load shedding, BE00 load shedding, BG00 load shedding, CH00 load shedding, CY00 load shedding, CZ00 load shedding, DE00 load shedding, DKE1 load shedding, DKW1 load shedding, EE00 load shedding, ES00 load shedding, FI00 load shedding, FR00 load shedding, FR15 load shedding, GB00 load shedding, GBNI load shedding, GR00 load shedding, GR03 load shedding, HR00 load shedding, HU00 load shedding, IE00 load shedding, ITCA load shedding, ITCN load shedding, ITCS load shedding, ITN1 load shedding, ITS1 load shedding, ITSA load shedding, ITSI load shedding, LT00 load shedding, LUB1 load shedding, LUF1 load shedding, LUG1 load shedding, LUV1 load shedding, LV00 load shedding, ME00 load shedding, MK00 load shedding, MT00 load shedding, NL00 load shedding, NOM1 load shedding, NON1 load shedding, NOS0 load shedding, PL00 load shedding, PT00 load shedding, RO00 load shedding, RS00 load shedding, SE01 load shedding, SE02 load shedding, SE03 load shedding, SE04 load shedding, SI00 load shedding, SK00 load shedding, ITCO load shedding, ITVI load shedding
WARNING:scripts.add_electricity:tech_colors for carriers ['none'] not defined in config.
0%| | 0/53 [00:00<?, ?it/s]INFO:__main__:Optimizing network for snapshot horizon [2009-01-01 00:00:00:2009-01-07 23:00:00] (1/53).
/scratch/htc-panfs/mmeng/open-tyndp/.pixi/envs/open-tyndp/lib/python3.12/site-packages/pypsa/optimization/optimize.py:566: FutureWarning: Passing an int for `transmission_losses` is deprecated and will be removed in PyPSA 2.0. Explicitly pass {'mode': 'tangents', 'segments': 2} (current behavior) or use the new secant-based losses via `transmission_losses=True`.
m = n.optimize.create_model(
INFO:linopy.model: Solve problem using Gurobi solver
INFO:linopy.model:Solver logs written to `results/tyndp/NT/logs/cba/projects/project_t4_2030_solver.log`.
INFO:linopy.model:Solver options:
- threads: 32
- method: 1
- NodeMethod: 1
- Seed: 123
- AggFill: 0
- PreDual: 0
- FeasibilityTol: 1e-06
- OptimalityTol: 1e-06
- ScaleFlag: -1
Set parameter WLSAccessID
Set parameter WLSSecret
Set parameter LicenseID to value 2464355
WLS license 2464355 - registered to Open Energy Transition GmbH
Warning for adding constraints: zero or small (< 1e-13) coefficients, ignored
Set parameter Threads to value 32
Set parameter Method to value 1
Set parameter NodeMethod to value 1
Set parameter Seed to value 123
Set parameter AggFill to value 0
Set parameter PreDual to value 0
Set parameter FeasibilityTol to value 1e-06
Set parameter OptimalityTol to value 1e-06
Set parameter ScaleFlag to value -1
Set parameter LogFile to value "/scratch/htc-panfs/mmeng/open-tyndp/results/tyndp/NT/logs/cba/projects/project_t4_2030_solver.log"
Gurobi Optimizer version 13.0.2 build v13.0.2rc1 (linux64 - "Debian GNU/Linux 13 (trixie)")
CPU model: Intel(R) Xeon(R) Gold 6338 CPU @ 2.00GHz, instruction set [SSE2|AVX|AVX2|AVX512]
Thread count: 64 physical cores, 128 logical processors, using up to 8 threads
Non-default parameters:
Method 1
NodeMethod 1
AggFill 0
PreDual 0
Seed 123
Threads 32
WLS license 2464355 - registered to Open Energy Transition GmbH
Optimize a model with 783062 rows, 397320 columns and 1391514 nonzeros (Min)
Model fingerprint: 0xc7fce7a4
Model has 360528 linear objective coefficients
Coefficient statistics:
Matrix range [1e-02, 1e+00]
Objective range [9e-03, 1e+05]
Bounds range [3e+00, 2e+03]
RHS range [1e-02, 2e+09]
Warning: Model contains large rhs
Consider reformulating model or setting NumericFocus parameter
to avoid numerical issues.
Presolve time: 2.39s
Presolved: 30773 rows, 227643 columns, 383073 nonzeros
Iteration Objective Primal Inf. Dual Inf. Time
0 6.5506517e+09 2.839106e+07 0.000000e+00 3s
25844 1.1135405e+10 2.085439e+07 0.000000e+00 5s
Extra simplex iterations after uncrush: 168
55807 1.2026253e+10 0.000000e+00 0.000000e+00 10s
Solved in 55807 iterations and 9.80 seconds (3.13 work units)
Optimal objective 1.202625323e+10
Warning: environment still referenced so free is deferred (Continue to use WLS)
INFO:linopy.constants: Optimization successful:
Status: ok
Termination condition: optimal
Solution: 397320 primals, 783062 duals
Objective: 1.20e+10
Solver model: available
Solver message: 2
2%|▏ | 1/53 [01:43<1:29:38, 103.42s/it]INFO:__main__:Optimizing network for snapshot horizon [2009-01-07 23:00:00:2009-01-14 22:00:00] (2/53).
WARNING:pypsa.optimization.constraints:Stores ['AT00 battery', 'BE00 battery', 'BG00 battery', 'DE00 battery', 'DKW1 battery', 'ES00 battery', 'GB00 battery', 'GBNI battery', 'GR00 battery', 'HU00 battery', 'ITCA battery', 'ITN1 battery', 'ITSA battery', 'ITSI battery', 'LT00 battery', 'LUG1 battery', 'LV00 battery', 'NL00 battery', 'RO00 battery', 'SE01 battery', 'SE02 battery', 'SE03 battery', 'SE04 battery', 'SK00 battery']: Cyclic energy level constraint overrules initial value setting. User-defined e_initial will be ignored.
/scratch/htc-panfs/mmeng/open-tyndp/.pixi/envs/open-tyndp/lib/python3.12/site-packages/pypsa/optimization/optimize.py:566: FutureWarning: Passing an int for `transmission_losses` is deprecated and will be removed in PyPSA 2.0. Explicitly pass {'mode': 'tangents', 'segments': 2} (current behavior) or use the new secant-based losses via `transmission_losses=True`.
m = n.optimize.create_model(
INFO:linopy.model: Solve problem using Gurobi solver
INFO:linopy.model:Solver logs written to `results/tyndp/NT/logs/cba/projects/project_t4_2030_solver.log`.
INFO:linopy.model:Solver options:
- threads: 32
- method: 1
- NodeMethod: 1
- Seed: 123
- AggFill: 0
- PreDual: 0
- FeasibilityTol: 1e-06
- OptimalityTol: 1e-06
- ScaleFlag: -1
Set parameter WLSAccessID
Set parameter WLSSecret
Set parameter LicenseID to value 2464355
WLS license 2464355 - registered to Open Energy Transition GmbH
Warning for adding constraints: zero or small (< 1e-13) coefficients, ignored
Set parameter Threads to value 32
Set parameter Method to value 1
Set parameter NodeMethod to value 1
Set parameter Seed to value 123
Set parameter AggFill to value 0
Set parameter PreDual to value 0
Set parameter FeasibilityTol to value 1e-06
Set parameter OptimalityTol to value 1e-06
Set parameter ScaleFlag to value -1
Set parameter LogFile to value "/scratch/htc-panfs/mmeng/open-tyndp/results/tyndp/NT/logs/cba/projects/project_t4_2030_solver.log"
Gurobi Optimizer version 13.0.2 build v13.0.2rc1 (linux64 - "Debian GNU/Linux 13 (trixie)")
CPU model: Intel(R) Xeon(R) Gold 6338 CPU @ 2.00GHz, instruction set [SSE2|AVX|AVX2|AVX512]
Thread count: 64 physical cores, 128 logical processors, using up to 8 threads
Non-default parameters:
Method 1
NodeMethod 1
AggFill 0
PreDual 0
Seed 123
Threads 32
WLS license 2464355 - registered to Open Energy Transition GmbH
Optimize a model with 783098 rows, 397320 columns and 1391514 nonzeros (Min)
Model fingerprint: 0xd9598b46
Model has 360528 linear objective coefficients
Coefficient statistics:
Matrix range [1e-02, 1e+00]
Objective range [9e-03, 1e+05]
Bounds range [2e+00, 7e+03]
RHS range [6e-03, 2e+09]
Warning: Model contains large rhs
Consider reformulating model or setting NumericFocus parameter
to avoid numerical issues.
Presolve time: 2.47s
Presolved: 31101 rows, 228336 columns, 384028 nonzeros
Iteration Objective Primal Inf. Dual Inf. Time
0 6.3455365e+09 2.919759e+07 0.000000e+00 3s
30689 1.1344649e+10 9.389194e+06 0.000000e+00 5s
Extra simplex iterations after uncrush: 203
54152 1.1775352e+10 0.000000e+00 0.000000e+00 9s
Solved in 54152 iterations and 8.60 seconds (2.79 work units)
Optimal objective 1.177535153e+10
Warning: environment still referenced so free is deferred (Continue to use WLS)
INFO:linopy.constants: Optimization successful:
Status: ok
Termination condition: optimal
Solution: 397320 primals, 783098 duals
Objective: 1.18e+10
Solver model: available
Solver message: 2
Steps to Reproduce
I think I generally run into this issue more on ZIB.
Make sure the config settings are set so that the CBA rolling horizon solves use Gurobi as the solver:
cba:
solving:
options:
include_objective_constant: false
partition: big
mem_mb: 40000
runtime: 2h
solver:
name: gurobi
options: gurobi-simplex
solver_options:
gurobi-simplex:
FeasibilityTol: 1.0e-06
OptimalityTol: 1.0e-06
Other settings I generally use are running NT, for 1H resolution, on a single project to test (e.g., t4).
Then run something like snakemake --profile profiles/slurm -call cba --configfile config/config.tyndp.yaml config/config.zib.yaml.
Environment Information
No response
Version Checks
masterbranch of Open-TYNDP.masterbranch of PyPSA-Eur (therefore, the bug is likely Open-TYNDP specific).Affected Component/Workflow
Change Classification
Standard
Security & Data Risk Check
Risk Level of Fix
N/A
Bug Description
There's an issue where if using Gurobi in the CBA workflow as the solver of choice for the rolling horizon solves, after one rolling horizon is done, the Gurobi license is not immediately released in the environment. After the first rolling horizon is successfully done solving, a new rolling horizon (either for the same project or, if running multiple projects, another project's rolling horizon) would try to access the same license. This is not allowed (at least not on the same node), so then the solve fails.
Actual Behavior
This is the logger from a single project's solve:
[Fri Jun 19 12:20:33 2026] localrule solve_cba_network: input: resources/tyndp/NT/cba/networks/project_t4_2030.nc output: results/tyndp/NT/cba/networks/project_t4_2030.nc log: results/tyndp/NT/logs/cba/projects/project_t4_2030_solver.log, results/tyndp/NT/logs/cba/projects/project_t4_2030_memory.log, results/tyndp/NT/logs/cba/projects/project_t4_2030_python.log jobid: 0 reason: Forced execution wildcards: run=NT, cba_project=t4, planning_horizons=2030 resources: mem_mb=40000, mem_mib=38147, disk_mb=8000, disk_mib=7630, tmpdir=/scratch/local, runtime=60, partition=big getfattr: Removing leading '/' from absolute path names INFO:pypsa.network.io:New version 1.2.3 available! (Current: 1.2.1) INFO:pypsa.network.io:Imported network 'PyPSA-Eur (tyndp)' has buses, carriers, generators, global_constraints, links, loads, shapes, storage_units, stores, sub_networks INFO:scripts.solve_network:Add load shedding for all carriers. WARNING:pypsa.network.io:The following generators are already defined and will be skipped (use overwrite=True to overwrite): AL H2 load shedding, AT H2 load shedding, BA H2 load shedding, BE H2 load shedding, BG H2 load shedding, CH H2 load shedding, CY H2 load shedding, CZ H2 load shedding, DE H2 load shedding, DK H2 load shedding, EE H2 load shedding, ES H2 load shedding, FI H2 load shedding, FR H2 load shedding, GB H2 load shedding, GR H2 load shedding, HR H2 load shedding, HU H2 load shedding, IE H2 load shedding, IT H2 load shedding, LT H2 load shedding, LU H2 load shedding, LV H2 load shedding, ME H2 load shedding, MK H2 load shedding, MT H2 load shedding, NL H2 load shedding, NO H2 load shedding, PL H2 load shedding, PT H2 load shedding, RO H2 load shedding, RS H2 load shedding, SE H2 load shedding, SI H2 load shedding, SK H2 load shedding, IBIT H2 load shedding, IBFI H2 load shedding WARNING:pypsa.network.io:The following generators are already defined and will be skipped (use overwrite=True to overwrite): AL00 load shedding, AT00 load shedding, BA00 load shedding, BE00 load shedding, BG00 load shedding, CH00 load shedding, CY00 load shedding, CZ00 load shedding, DE00 load shedding, DKE1 load shedding, DKW1 load shedding, EE00 load shedding, ES00 load shedding, FI00 load shedding, FR00 load shedding, FR15 load shedding, GB00 load shedding, GBNI load shedding, GR00 load shedding, GR03 load shedding, HR00 load shedding, HU00 load shedding, IE00 load shedding, ITCA load shedding, ITCN load shedding, ITCS load shedding, ITN1 load shedding, ITS1 load shedding, ITSA load shedding, ITSI load shedding, LT00 load shedding, LUB1 load shedding, LUF1 load shedding, LUG1 load shedding, LUV1 load shedding, LV00 load shedding, ME00 load shedding, MK00 load shedding, MT00 load shedding, NL00 load shedding, NOM1 load shedding, NON1 load shedding, NOS0 load shedding, PL00 load shedding, PT00 load shedding, RO00 load shedding, RS00 load shedding, SE01 load shedding, SE02 load shedding, SE03 load shedding, SE04 load shedding, SI00 load shedding, SK00 load shedding, ITCO load shedding, ITVI load shedding WARNING:scripts.add_electricity:tech_colors for carriers ['none'] not defined in config. 0%| | 0/53 [00:00<?, ?it/s]INFO:__main__:Optimizing network for snapshot horizon [2009-01-01 00:00:00:2009-01-07 23:00:00] (1/53). /scratch/htc-panfs/mmeng/open-tyndp/.pixi/envs/open-tyndp/lib/python3.12/site-packages/pypsa/optimization/optimize.py:566: FutureWarning: Passing an int for `transmission_losses` is deprecated and will be removed in PyPSA 2.0. Explicitly pass {'mode': 'tangents', 'segments': 2} (current behavior) or use the new secant-based losses via `transmission_losses=True`. m = n.optimize.create_model( INFO:linopy.model: Solve problem using Gurobi solver INFO:linopy.model:Solver logs written to `results/tyndp/NT/logs/cba/projects/project_t4_2030_solver.log`. INFO:linopy.model:Solver options: - threads: 32 - method: 1 - NodeMethod: 1 - Seed: 123 - AggFill: 0 - PreDual: 0 - FeasibilityTol: 1e-06 - OptimalityTol: 1e-06 - ScaleFlag: -1 Set parameter WLSAccessID Set parameter WLSSecret Set parameter LicenseID to value 2464355 WLS license 2464355 - registered to Open Energy Transition GmbH Warning for adding constraints: zero or small (< 1e-13) coefficients, ignored Set parameter Threads to value 32 Set parameter Method to value 1 Set parameter NodeMethod to value 1 Set parameter Seed to value 123 Set parameter AggFill to value 0 Set parameter PreDual to value 0 Set parameter FeasibilityTol to value 1e-06 Set parameter OptimalityTol to value 1e-06 Set parameter ScaleFlag to value -1 Set parameter LogFile to value "/scratch/htc-panfs/mmeng/open-tyndp/results/tyndp/NT/logs/cba/projects/project_t4_2030_solver.log" Gurobi Optimizer version 13.0.2 build v13.0.2rc1 (linux64 - "Debian GNU/Linux 13 (trixie)") CPU model: AMD EPYC 7542 32-Core Processor, instruction set [SSE2|AVX|AVX2] Thread count: 64 physical cores, 128 logical processors, using up to 8 threads Non-default parameters: Method 1 NodeMethod 1 AggFill 0 PreDual 0 Seed 123 Threads 32 WLS license 2464355 - registered to Open Energy Transition GmbH Optimize a model with 783062 rows, 397320 columns and 1391514 nonzeros (Min) Model fingerprint: 0xc7fce7a4 Model has 360528 linear objective coefficients Coefficient statistics: Matrix range [1e-02, 1e+00] Objective range [9e-03, 1e+05] Bounds range [3e+00, 2e+03] RHS range [1e-02, 2e+09] Warning: Model contains large rhs Consider reformulating model or setting NumericFocus parameter to avoid numerical issues. Presolve time: 0.80s Presolved: 30773 rows, 227643 columns, 383073 nonzeros Iteration Objective Primal Inf. Dual Inf. Time 0 6.5506517e+09 2.839106e+07 0.000000e+00 1s Extra simplex iterations after uncrush: 168 55807 1.2026253e+10 0.000000e+00 0.000000e+00 3s Solved in 55807 iterations and 3.11 seconds (3.13 work units) Optimal objective 1.202625323e+10 Warning: environment still referenced so free is deferred (Continue to use WLS) INFO:linopy.constants: Optimization successful: Status: ok Termination condition: optimal Solution: 397320 primals, 783062 duals Objective: 1.20e+10 Solver model: available Solver message: 2 2%|▏ | 1/53 [00:29<25:09, 29.04s/it]INFO:__main__:Optimizing network for snapshot horizon [2009-01-07 23:00:00:2009-01-14 22:00:00] (2/53). WARNING:pypsa.optimization.constraints:Stores ['AT00 battery', 'BE00 battery', 'BG00 battery', 'DE00 battery', 'DKW1 battery', 'ES00 battery', 'GB00 battery', 'GBNI battery', 'GR00 battery', 'HU00 battery', 'ITCA battery', 'ITN1 battery', 'ITSA battery', 'ITSI battery', 'LT00 battery', 'LUG1 battery', 'LV00 battery', 'NL00 battery', 'RO00 battery', 'SE01 battery', 'SE02 battery', 'SE03 battery', 'SE04 battery', 'SK00 battery']: Cyclic energy level constraint overrules initial value setting. User-defined e_initial will be ignored. /scratch/htc-panfs/mmeng/open-tyndp/.pixi/envs/open-tyndp/lib/python3.12/site-packages/pypsa/optimization/optimize.py:566: FutureWarning: Passing an int for `transmission_losses` is deprecated and will be removed in PyPSA 2.0. Explicitly pass {'mode': 'tangents', 'segments': 2} (current behavior) or use the new secant-based losses via `transmission_losses=True`. m = n.optimize.create_model( INFO:linopy.model: Solve problem using Gurobi solver INFO:linopy.model:Solver logs written to `results/tyndp/NT/logs/cba/projects/project_t4_2030_solver.log`. INFO:linopy.model:Solver options: - threads: 32 - method: 1 - NodeMethod: 1 - Seed: 123 - AggFill: 0 - PreDual: 0 - FeasibilityTol: 1e-06 - OptimalityTol: 1e-06 - ScaleFlag: -1 Set parameter WLSAccessID Set parameter WLSSecret Set parameter LicenseID to value 2464355 WLS license 2464355 - registered to Open Energy Transition GmbH 2%|▏ | 1/53 [00:33<28:46, 33.20s/it] ERROR:root:Uncaught exception Traceback (most recent call last): File "/scratch/htc-panfs/mmeng/open-tyndp/.snakemake/scripts/tmpna845r9j.solve_cba_network.py", line 340, in <module> solve_network( File "/scratch/htc-panfs/mmeng/open-tyndp/.snakemake/scripts/tmpna845r9j.solve_cba_network.py", line 281, in solve_network status, condition = optimize_with_rolling_horizon(n, **all_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/scratch/htc-panfs/mmeng/open-tyndp/.snakemake/scripts/tmpna845r9j.solve_cba_network.py", line 182, in optimize_with_rolling_horizon status, condition = n.optimize(sns, **kwargs) # type: ignore ^^^^^^^^^^^^^^^^^^^^^^^^^ File "/scratch/htc-panfs/mmeng/open-tyndp/.pixi/envs/open-tyndp/lib/python3.12/site-packages/pypsa/optimization/optimize.py", line 581, in __call__ status, condition = m.solve( ^^^^^^^^ File "/scratch/htc-panfs/mmeng/open-tyndp/.pixi/envs/open-tyndp/lib/python3.12/site-packages/linopy/model.py", line 1403, in solve result = solver.solve_problem_from_model( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/scratch/htc-panfs/mmeng/open-tyndp/.pixi/envs/open-tyndp/lib/python3.12/site-packages/linopy/solvers.py", line 1088, in solve_problem_from_model env_ = stack.enter_context(gurobipy.Env()) ^^^^^^^^^^^^^^ File "src/gurobipy/env.pxi", line 112, in gurobipy._core.Env.__init__ gurobipy._exception.GurobiError: Single-use license. Another Gurobi process with pid 4064723 running. RuleException: CalledProcessError in file "/scratch/htc-panfs/mmeng/open-tyndp/rules/cba.smk", line 427: Command 'set -euo pipefail; /scratch/htc-panfs/mmeng/open-tyndp/.pixi/envs/open-tyndp/bin/python3.12 /scratch/htc-panfs/mmeng/open-tyndp/.snakemake/scripts/tmpna845r9j.solve_cba_network.py' returned non-zero exit status 1. [Fri Jun 19 12:21:18 2026] Error in rule solve_cba_network: message: None jobid: 0 input: resources/tyndp/NT/cba/networks/project_t4_2030.nc output: results/tyndp/NT/cba/networks/project_t4_2030.nc log: results/tyndp/NT/logs/cba/projects/project_t4_2030_solver.log, results/tyndp/NT/logs/cba/projects/project_t4_2030_memory.log, results/tyndp/NT/logs/cba/projects/project_t4_2030_python.log (check log file(s) for error details) Shutting down, this might take some time. Exiting because a job execution failed. Look below for error messages [Fri Jun 19 12:21:18 2026] Error in rule solve_cba_network: message: None jobid: 0 input: resources/tyndp/NT/cba/networks/project_t4_2030.nc output: results/tyndp/NT/cba/networks/project_t4_2030.nc log: results/tyndp/NT/logs/cba/projects/project_t4_2030_solver.log, results/tyndp/NT/logs/cba/projects/project_t4_2030_memory.log, results/tyndp/NT/logs/cba/projects/project_t4_2030_python.log (check log file(s) for error details) Storing output in storage. WorkflowError: At least one job did not complete successfully.Expected Behavior
Instead, the logger should look something more like this:
Steps to Reproduce
I think I generally run into this issue more on ZIB.
Make sure the config settings are set so that the CBA rolling horizon solves use Gurobi as the solver:
Other settings I generally use are running
NT, for 1H resolution, on a single project to test (e.g.,t4).Then run something like
snakemake --profile profiles/slurm -call cba --configfile config/config.tyndp.yaml config/config.zib.yaml.Environment Information
No response