|
1 | | -# Copyright (c) 2023-2024, RTE (https://www.rte-france.com) |
| 1 | +# Copyright (c) 2023-2025, RTE (https://www.rte-france.com) |
2 | 2 | # See AUTHORS.txt |
3 | 3 | # This Source Code Form is subject to the terms of the Mozilla Public License, version 2.0. |
4 | 4 | # If a copy of the Mozilla Public License, version 2.0 was not distributed with this file, |
|
11 | 11 | import numpy as np |
12 | 12 | import pandas as pd |
13 | 13 | import pypowsybl as pypo |
14 | | -from typing import Optional, Union |
| 14 | +from typing import Dict, Iterable, Optional, Union |
15 | 15 | from packaging import version |
16 | 16 | from lightsim2grid_cpp import GridModel |
17 | 17 |
|
| 18 | + |
| 19 | +from ._aux_handle_slack import handle_slack_iterable, handle_slack_one_el |
| 20 | + |
18 | 21 | PP_BUG_RATIO_TAP_CHANGER = version.parse("1.9") |
19 | 22 | PYPOWSYBL_VER = version.parse(pypo.__version__) |
20 | 23 |
|
@@ -42,7 +45,7 @@ def _aux_get_bus(bus_df, df, conn_key="connected", bus_key="bus_id"): |
42 | 45 |
|
43 | 46 |
|
44 | 47 | def init(net : pypo.network.Network, |
45 | | - gen_slack_id: Union[int, str] = None, |
| 48 | + gen_slack_id: Union[int, str, Iterable[str], Dict[str, float]] = None, |
46 | 49 | slack_bus_id: int = None, |
47 | 50 | sn_mva : float = 100., # only used if not present in the grid |
48 | 51 | sort_index : bool =True, |
@@ -467,19 +470,23 @@ def init(net : pypo.network.Network, |
467 | 470 | if slack_bus_id is not None: |
468 | 471 | raise RuntimeError("You provided both gen_slack_id and slack_bus_id " |
469 | 472 | "which is not possible.") |
470 | | - |
471 | | - if isinstance(gen_slack_id, str): |
472 | | - gen_slack_id_int = int((df_gen.index == gen_slack_id).nonzero()[0][0]) |
| 473 | + if isinstance(gen_slack_id, (str, int, np.int32, np.int64, np.str_, tuple)): |
| 474 | + single_slack = True |
| 475 | + fun_slack = handle_slack_one_el |
| 476 | + else: |
| 477 | + single_slack = False |
| 478 | + fun_slack = handle_slack_iterable |
| 479 | + gen_slack_ids_int, gen_slack_weights = fun_slack(df_gen, gen_slack_id) |
| 480 | + if single_slack: |
| 481 | + if gen_slack_ids_int is None or gen_slack_weights is None: |
| 482 | + raise RuntimeError(f"The slack {gen_slack_id} is disconnected.") |
| 483 | + gen_slack_ids_int = [gen_slack_ids_int] |
| 484 | + gen_slack_weights = [1.] |
473 | 485 | else: |
474 | | - try: |
475 | | - gen_slack_id_int = int(gen_slack_id) |
476 | | - except Exception as exc_: |
477 | | - raise RuntimeError("'gen_slack_id' should be either an int or " |
478 | | - "a generator names") from exc_ |
479 | | - if gen_slack_id_int != gen_slack_id: |
480 | | - raise RuntimeError("'gen_slack_id' should be either an int or a " |
481 | | - "generator names") |
482 | | - model.add_gen_slackbus(gen_slack_id_int, 1.) |
| 486 | + gen_slack_weights = np.asarray(gen_slack_weights) |
| 487 | + gen_slack_weights /= gen_slack_weights.sum() |
| 488 | + for gen_slack_id_int, gen_slack_weight in zip(gen_slack_ids_int, gen_slack_weights): |
| 489 | + model.add_gen_slackbus(gen_slack_id_int, gen_slack_weight) |
483 | 490 | elif slack_bus_id is not None: |
484 | 491 | gen_bus = np.array([el.bus_id for el in model.get_generators()]) |
485 | 492 | gen_is_conn_slack = gen_bus == model._orig_to_ls[slack_bus_id] |
|
0 commit comments