From c56f59a51f656d56ee085fe6b0fb3becc369ace6 Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Mon, 24 Jun 2024 15:23:48 +0200 Subject: [PATCH] to revert Signed-off-by: Etienne LESOT --- cpp/powsybl-cpp/powsybl-api.h | 8 ++++++++ cpp/powsybl-cpp/powsybl-cpp.cpp | 3 ++- cpp/powsybl-cpp/powsybl-cpp.h | 2 ++ cpp/pypowsybl-cpp/bindings.cpp | 17 ++++++++++++++++ .../ShortCircuitAnalysisCUtils.java | 2 +- pypowsybl/_pypowsybl.pyi | 20 ++++++++++++++++++- pypowsybl/shortcircuit/__init__.py | 1 + pypowsybl/shortcircuit/impl/parameters.py | 11 +++++++++- tests/test_shortcircuit_analysis.py | 5 +++++ 9 files changed, 65 insertions(+), 4 deletions(-) diff --git a/cpp/powsybl-cpp/powsybl-api.h b/cpp/powsybl-cpp/powsybl-api.h index f8b5b8503d..6f1d8f636c 100644 --- a/cpp/powsybl-cpp/powsybl-api.h +++ b/cpp/powsybl-cpp/powsybl-api.h @@ -375,6 +375,13 @@ typedef enum { THREE, } ThreeSide; +typedef struct voltage_range_struct { + double minimum_nominal_voltage; + double maximum_nominal_voltage; + double voltage; + double range_coefficient; +} voltage_range; + typedef struct shortcircuit_analysis_parameters_struct { unsigned char with_voltage_result; unsigned char with_feeder_result; @@ -383,6 +390,7 @@ typedef struct shortcircuit_analysis_parameters_struct { unsigned char with_fortescue_result; double min_voltage_drop_proportional_threshold; int initial_voltage_profile_mode; + array voltage_ranges; char** provider_parameters_keys; int provider_parameters_keys_count; char** provider_parameters_values; diff --git a/cpp/powsybl-cpp/powsybl-cpp.cpp b/cpp/powsybl-cpp/powsybl-cpp.cpp index 43c5ace58f..27e97eb6f9 100644 --- a/cpp/powsybl-cpp/powsybl-cpp.cpp +++ b/cpp/powsybl-cpp/powsybl-cpp.cpp @@ -1344,7 +1344,8 @@ void deleteShortCircuitAnalysisParameters(shortcircuit_analysis_parameters* ptr) pypowsybl::deleteCharPtrPtr(ptr->provider_parameters_values, ptr->provider_parameters_values_count); } -ShortCircuitAnalysisParameters::ShortCircuitAnalysisParameters(shortcircuit_analysis_parameters* src) +ShortCircuitAnalysisParameters::ShortCircuitAnalysisParameters(shortcircuit_analysis_parameters* src): + voltage_ranges(&src->voltage_ranges) { with_feeder_result = (bool) src->with_feeder_result; with_limit_violations = (bool) src->with_limit_violations; diff --git a/cpp/powsybl-cpp/powsybl-cpp.h b/cpp/powsybl-cpp/powsybl-cpp.h index 24c348807d..fb815f221e 100644 --- a/cpp/powsybl-cpp/powsybl-cpp.h +++ b/cpp/powsybl-cpp/powsybl-cpp.h @@ -190,6 +190,7 @@ typedef Array PostContingencyResultArray; typedef Array OperatorStrategyResultArray; typedef Array LimitViolationArray; typedef Array SeriesArray; +typedef Array VoltageRangeArray; template @@ -444,6 +445,7 @@ class ShortCircuitAnalysisParameters { bool with_fortescue_result; double min_voltage_drop_proportional_threshold; InitialVoltageProfileMode initial_voltage_profile_mode; + VoltageRangeArray voltage_ranges; std::vector provider_parameters_keys; std::vector provider_parameters_values; diff --git a/cpp/pypowsybl-cpp/bindings.cpp b/cpp/pypowsybl-cpp/bindings.cpp index 635b0c9491..235a134e76 100644 --- a/cpp/pypowsybl-cpp/bindings.cpp +++ b/cpp/pypowsybl-cpp/bindings.cpp @@ -998,6 +998,22 @@ PYBIND11_MODULE(_pypowsybl, m) { .value("STEADY_STATE", pypowsybl::ShortCircuitStudyType::STEADY_STATE, "The last stage of the short circuit, once all transient effects are gone."); + py::class_(m, "VoltageRange") + .def_property_readonly("minimum_nominal_voltage", [](const voltage_range& v) { + return v.minimum_nominal_voltage; + }) + .def_property_readonly("maximum_nominal_voltage", [](const voltage_range& v) { + return v.maximum_nominal_voltage; + }) + .def_property_readonly("voltage", [](const voltage_range& v) { + return v.voltage; + }) + .def_property_readonly("range_coefficient", [](const voltage_range& v) { + return v.range_coefficient; + }); + + bindArray(m, "VoltageRangeArray"); + py::class_(m, "ShortCircuitAnalysisParameters") .def(py::init(&pypowsybl::createShortCircuitAnalysisParameters)) .def_readwrite("with_voltage_result", &pypowsybl::ShortCircuitAnalysisParameters::with_voltage_result) @@ -1007,6 +1023,7 @@ PYBIND11_MODULE(_pypowsybl, m) { .def_readwrite("with_fortescue_result", &pypowsybl::ShortCircuitAnalysisParameters::with_fortescue_result) .def_readwrite("min_voltage_drop_proportional_threshold", &pypowsybl::ShortCircuitAnalysisParameters::min_voltage_drop_proportional_threshold) .def_readwrite("initial_voltage_profile_mode", &pypowsybl::ShortCircuitAnalysisParameters::initial_voltage_profile_mode) + .def_readwrite("voltage_ranges", &pypowsybl::ShortCircuitAnalysisParameters::voltage_ranges) .def_readwrite("provider_parameters_keys", &pypowsybl::ShortCircuitAnalysisParameters::provider_parameters_keys) .def_readwrite("provider_parameters_values", &pypowsybl::ShortCircuitAnalysisParameters::provider_parameters_values); diff --git a/java/src/main/java/com/powsybl/python/shortcircuit/ShortCircuitAnalysisCUtils.java b/java/src/main/java/com/powsybl/python/shortcircuit/ShortCircuitAnalysisCUtils.java index a7ac9926f3..31caf04571 100644 --- a/java/src/main/java/com/powsybl/python/shortcircuit/ShortCircuitAnalysisCUtils.java +++ b/java/src/main/java/com/powsybl/python/shortcircuit/ShortCircuitAnalysisCUtils.java @@ -68,7 +68,7 @@ private static ShortCircuitParameters createShortCircuitAnalysisParameters(PyPow private static List createVoltageRangeList(PyPowsyblApiHeader.ArrayPointer voltageRangePointerArrayPointer) { List voltageRanges = new ArrayList<>(); - for (int i=0; i<= voltageRangePointerArrayPointer.getLength(); i++) { + for (int i = 0; i <= voltageRangePointerArrayPointer.getLength(); i++) { PyPowsyblApiHeader.VoltageRangePointer voltageRangePointer = voltageRangePointerArrayPointer.getPtr().addressOf(i); voltageRanges.add(new VoltageRange(voltageRangePointer.getMinimumNominalVoltage(), voltageRangePointer.getMaximumNominalVoltage(), diff --git a/pypowsybl/_pypowsybl.pyi b/pypowsybl/_pypowsybl.pyi index 1c68a56fd6..247a0881c3 100644 --- a/pypowsybl/_pypowsybl.pyi +++ b/pypowsybl/_pypowsybl.pyi @@ -689,6 +689,23 @@ class InitialVoltageProfileMode: CONFIGURED: ClassVar[InitialVoltageProfileMode] = ... PREVIOUS_VALUE: ClassVar[InitialVoltageProfileMode] = ... +class VoltageRange: + @property + def minimum_nominal_voltage(self) -> float: ... + + @property + def maximum_nominal_voltage(self) -> float: ... + + @property + def voltage(self) -> float: ... + @property + def range_coefficient(self) -> float: ... + +class VoltageRangeArray: + def __iter__(self) -> Iterator: ... + def __len__(self) -> int: ... + def __getitem__(self) -> VoltageRange: ... + class ShortCircuitAnalysisParameters: with_voltage_result: bool with_feeder_result: bool @@ -696,9 +713,10 @@ class ShortCircuitAnalysisParameters: study_type: ShortCircuitStudyType with_fortescue_result: bool min_voltage_drop_proportional_threshold: float + initial_voltage_profile_mode: InitialVoltageProfileMode + voltage_ranges: VoltageRangeArray provider_parameters_keys: List[str] provider_parameters_values: List[str] - initial_voltage_profile_mode: InitialVoltageProfileMode def __init__(self) -> None: ... def add_contingency(analysis_context: JavaHandle, contingency_id: str, elements_ids: List[str]) -> None: ... diff --git a/pypowsybl/shortcircuit/__init__.py b/pypowsybl/shortcircuit/__init__.py index 656b829b44..64080474d1 100644 --- a/pypowsybl/shortcircuit/__init__.py +++ b/pypowsybl/shortcircuit/__init__.py @@ -12,3 +12,4 @@ get_default_provider, get_provider_names, get_provider_parameters_names) +from .impl.voltage_range import VoltageRange diff --git a/pypowsybl/shortcircuit/impl/parameters.py b/pypowsybl/shortcircuit/impl/parameters.py index 26713f77e8..29a479f841 100644 --- a/pypowsybl/shortcircuit/impl/parameters.py +++ b/pypowsybl/shortcircuit/impl/parameters.py @@ -8,6 +8,7 @@ from pypowsybl import _pypowsybl from pypowsybl._pypowsybl import ShortCircuitStudyType, InitialVoltageProfileMode +from .voltage_range import VoltageRange ShortCircuitStudyType.__module__ = __name__ ShortCircuitStudyType.__name__ = 'ShortCircuitStudyType' @@ -37,6 +38,7 @@ class Parameters: # pylint: disable=too-few-public-methods min_voltage_drop_proportional_threshold: specifies a threshold for filtering the voltage results. Only nodes where the voltage drop due to the short circuit is greater than this property are retained. study_type: specifies the type of short-circuit study. It can be SUB_TRANSIENT, TRANSIENT or STEADY_STATE. + voltage_ranges: initial_voltage_profile_mode: specify how the computation is initialized. It can be NOMINAL, CONFIGURED or PREVIOUS_VALUE """ @@ -48,7 +50,8 @@ def __init__(self, study_type: ShortCircuitStudyType = None, provider_parameters: Dict[str, str] = None, with_fortescue_result: bool = None, - initial_voltage_profile_mode: InitialVoltageProfileMode = None): + initial_voltage_profile_mode: InitialVoltageProfileMode = None, + voltage_ranges: list[VoltageRange] = None): self._init_with_default_values() if with_feeder_result is not None: self.with_feeder_result = with_feeder_result @@ -66,6 +69,8 @@ def __init__(self, self.with_fortescue_result = with_fortescue_result if initial_voltage_profile_mode is not None: self.initial_voltage_profile_mode = initial_voltage_profile_mode + if voltage_ranges is not None: + self.voltage_ranges = voltage_ranges def _init_from_c(self, c_parameters: _pypowsybl.ShortCircuitAnalysisParameters) -> None: self.with_feeder_result = c_parameters.with_feeder_result @@ -77,6 +82,7 @@ def _init_from_c(self, c_parameters: _pypowsybl.ShortCircuitAnalysisParameters) zip(c_parameters.provider_parameters_keys, c_parameters.provider_parameters_values)) self.with_fortescue_result = c_parameters.with_fortescue_result self.initial_voltage_profile_mode = c_parameters.initial_voltage_profile_mode + self.voltage_ranges = c_parameters.voltage_ranges def _init_with_default_values(self) -> None: self._init_from_c(_pypowsybl.ShortCircuitAnalysisParameters()) @@ -87,6 +93,7 @@ def _init_with_default_values(self) -> None: self.study_type = ShortCircuitStudyType.TRANSIENT self.with_fortescue_result = False self.initial_voltage_profile_mode = InitialVoltageProfileMode.NOMINAL + self.voltage_ranges = [] def _to_c_parameters(self) -> _pypowsybl.ShortCircuitAnalysisParameters: c_parameters = _pypowsybl.ShortCircuitAnalysisParameters() @@ -97,6 +104,7 @@ def _to_c_parameters(self) -> _pypowsybl.ShortCircuitAnalysisParameters: c_parameters.with_fortescue_result = self.with_fortescue_result c_parameters.min_voltage_drop_proportional_threshold = self.min_voltage_drop_proportional_threshold c_parameters.initial_voltage_profile_mode = self.initial_voltage_profile_mode + c_parameters.voltage_ranges = [] c_parameters.provider_parameters_keys = [] c_parameters.provider_parameters_values = [] return c_parameters @@ -110,4 +118,5 @@ def __repr__(self) -> str: f", study_type={self.study_type!r}" \ f", with_fortescue_result={self.with_fortescue_result!r}" \ f", initial_voltage_profile_mode={self.initial_voltage_profile_mode!r}" \ + f", voltage_ranges={self.voltage_ranges!r}" \ f")" diff --git a/tests/test_shortcircuit_analysis.py b/tests/test_shortcircuit_analysis.py index 7fb45cc84b..b53a6b8e29 100644 --- a/tests/test_shortcircuit_analysis.py +++ b/tests/test_shortcircuit_analysis.py @@ -7,6 +7,7 @@ # import pypowsybl as pp import pypowsybl.network as pn +from pypowsybl.shortcircuit import VoltageRange import pytest import pathlib import pandas as pd @@ -83,3 +84,7 @@ def test_run_analysis(): # run the short-circuit analysis using a nonexistent provider with pytest.raises(Exception, match='No short-circuit analysis provider for name \'provider-unknown\''): results = sc.run(n, pars, 'provider-unknown') + + +def test_voltage_range_parameter(): + pars = pp.shortcircuit.Parameters(voltage_ranges=[VoltageRange(1, 2, 3, 4)])