Skip to content

Commit 09de88c

Browse files
committed
c/cpp part does not work, to be fixed
Signed-off-by: Etienne LESOT <[email protected]>
1 parent 7af2b13 commit 09de88c

File tree

11 files changed

+116
-10
lines changed

11 files changed

+116
-10
lines changed

cpp/powsybl-cpp/powsybl-api.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,13 @@ typedef enum {
375375
THREE,
376376
} ThreeSide;
377377

378+
typedef struct voltage_range_struct {
379+
double minimum_nominal_voltage;
380+
double maximum_nominal_voltage;
381+
double voltage;
382+
double range_coefficient;
383+
} voltage_range;
384+
378385
typedef struct shortcircuit_analysis_parameters_struct {
379386
unsigned char with_voltage_result;
380387
unsigned char with_feeder_result;
@@ -383,6 +390,7 @@ typedef struct shortcircuit_analysis_parameters_struct {
383390
unsigned char with_fortescue_result;
384391
double min_voltage_drop_proportional_threshold;
385392
int initial_voltage_profile_mode;
393+
array voltage_ranges;
386394
char** provider_parameters_keys;
387395
int provider_parameters_keys_count;
388396
char** provider_parameters_values;

cpp/powsybl-cpp/powsybl-cpp.cpp

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,11 @@ Array<limit_violation>::~Array() {
104104
// already freed by contingency_result
105105
}
106106

107+
template<>
108+
Array<voltage_range>::~Array() {
109+
// already freed by short circuit parameters
110+
}
111+
107112
template<>
108113
Array<series>::~Array() {
109114
PowsyblCaller::get()->callJava<>(::freeSeriesArray, delegate_);
@@ -221,6 +226,11 @@ void copyCharPtrPtrToVector(char** src, int count, std::vector<std::string>& des
221226
std::copy(src, src + count, std::back_inserter(dest));
222227
}
223228

229+
void copyVoltageRangePtrPtrToVector(voltage_range** src, int count, std::vector<voltage_range>& dest) {
230+
dest.clear();
231+
std::copy(src, src + count, std::back_inserter(dest));
232+
}
233+
224234
void deleteLoadFlowParameters(loadflow_parameters* ptr) {
225235
pypowsybl::deleteCharPtrPtr(ptr->countries_to_balance, ptr->countries_to_balance_count);
226236
pypowsybl::deleteCharPtrPtr(ptr->provider_parameters_keys, ptr->provider_parameters_keys_count);
@@ -1344,16 +1354,48 @@ void deleteShortCircuitAnalysisParameters(shortcircuit_analysis_parameters* ptr)
13441354
pypowsybl::deleteCharPtrPtr(ptr->provider_parameters_values, ptr->provider_parameters_values_count);
13451355
}
13461356

1347-
ShortCircuitAnalysisParameters::ShortCircuitAnalysisParameters(shortcircuit_analysis_parameters* src)
1348-
{
1357+
::voltage_range* createVoltageRange(double minimum_nominal_voltage, double maximum_nominal_voltage, double voltage, double range_coefficient) {
1358+
auto vr = pypowsybl::PowsyblCaller::get()->callJava<voltage_range*>(::createVoltageRange);
1359+
vr->minimum_nominal_voltage = minimum_nominal_voltage;
1360+
vr->maximum_nominal_voltage = maximum_nominal_voltage;
1361+
vr->voltage = voltage;
1362+
vr->range_coefficient = range_coefficient;
1363+
return vr;
1364+
}
1365+
1366+
void deleteVoltageRange(::voltage_range* vr) {
1367+
pypowsybl::PowsyblCaller::get()->callJava(::deleteVoltageRange, vr);
1368+
}
1369+
1370+
class VoltageRangesPtr {
1371+
public:
1372+
VoltageRangesPtr(const std::vector<voltage_range*>& vector)
1373+
: vector_(vector) {
1374+
}
1375+
1376+
~VoltageRangesPtr() {
1377+
for (auto vr : vector_) {
1378+
deleteVoltageRange(vr);
1379+
}
1380+
}
1381+
1382+
::voltage_range** get() const {
1383+
return (::voltage_range**) &vector_[0];
1384+
}
1385+
1386+
private:
1387+
const std::vector<::voltage_range*>& vector_;
1388+
};
1389+
1390+
ShortCircuitAnalysisParameters::ShortCircuitAnalysisParameters(shortcircuit_analysis_parameters* src) {
13491391
with_feeder_result = (bool) src->with_feeder_result;
13501392
with_limit_violations = (bool) src->with_limit_violations;
13511393
study_type = static_cast<ShortCircuitStudyType>(src->study_type);
13521394
with_fortescue_result = (bool) src->with_fortescue_result;
13531395
with_voltage_result = (bool) src->with_voltage_result;
13541396
min_voltage_drop_proportional_threshold = (double) src->min_voltage_drop_proportional_threshold;
13551397
initial_voltage_profile_mode = static_cast<InitialVoltageProfileMode>(src->initial_voltage_profile_mode);
1356-
1398+
// smthg to copy voltage range to vector
13571399
copyCharPtrPtrToVector(src->provider_parameters_keys, src->provider_parameters_keys_count, provider_parameters_keys);
13581400
copyCharPtrPtrToVector(src->provider_parameters_values, src->provider_parameters_values_count, provider_parameters_values);
13591401
}
@@ -1367,7 +1409,7 @@ std::shared_ptr<shortcircuit_analysis_parameters> ShortCircuitAnalysisParameters
13671409
res->with_fortescue_result = (bool) with_fortescue_result;
13681410
res->min_voltage_drop_proportional_threshold = min_voltage_drop_proportional_threshold;
13691411
res->initial_voltage_profile_mode = initial_voltage_profile_mode;
1370-
1412+
// smthg to copy voltage range to array
13711413
res->provider_parameters_keys = pypowsybl::copyVectorStringToCharPtrPtr(provider_parameters_keys);
13721414
res->provider_parameters_keys_count = provider_parameters_keys.size();
13731415
res->provider_parameters_values = pypowsybl::copyVectorStringToCharPtrPtr(provider_parameters_values);

cpp/powsybl-cpp/powsybl-cpp.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,7 @@ class ShortCircuitAnalysisParameters {
445445
double min_voltage_drop_proportional_threshold;
446446
InitialVoltageProfileMode initial_voltage_profile_mode;
447447

448+
std::vector<voltage_range> voltage_ranges;
448449
std::vector<std::string> provider_parameters_keys;
449450
std::vector<std::string> provider_parameters_values;
450451
};
@@ -812,6 +813,6 @@ SeriesArray* getFaultResults(const JavaHandle& shortCircuitAnalysisResult, bool
812813
SeriesArray* getFeederResults(const JavaHandle& shortCircuitAnalysisResult, bool withFortescueResult);
813814
SeriesArray* getShortCircuitLimitViolations(const JavaHandle& shortCircuitAnalysisResult);
814815
SeriesArray* getShortCircuitBusResults(const JavaHandle& shortCircuitAnalysisResult, bool withFortescueResult);
815-
816+
::voltage_range* createVoltageRange(const double minimum_nominal_voltage, const double maximum_nominal_voltage, const double voltage, const double range_coefficient);
816817
}
817818
#endif //PYPOWSYBL_H

cpp/pypowsybl-cpp/bindings.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -998,6 +998,11 @@ PYBIND11_MODULE(_pypowsybl, m) {
998998
.value("STEADY_STATE", pypowsybl::ShortCircuitStudyType::STEADY_STATE,
999999
"The last stage of the short circuit, once all transient effects are gone.");
10001000

1001+
py::class_<::voltage_range>(m, "VoltageRange")
1002+
.def(py::init([](const double minimum_nominal_voltage, const double maximum_nominal_voltage, const double voltage, const double range_coefficient) {
1003+
return pypowsybl::createVoltageRange(minimum_nominal_voltage, maximum_nominal_voltage, voltage, range_coefficient);
1004+
}), py::arg("minimum_nominal_voltage"), py::arg("maximum_nominal_voltage"), py::arg("voltage"), py::arg("range_coefficient"));
1005+
10011006
py::class_<pypowsybl::ShortCircuitAnalysisParameters>(m, "ShortCircuitAnalysisParameters")
10021007
.def(py::init(&pypowsybl::createShortCircuitAnalysisParameters))
10031008
.def_readwrite("with_voltage_result", &pypowsybl::ShortCircuitAnalysisParameters::with_voltage_result)
@@ -1007,6 +1012,7 @@ PYBIND11_MODULE(_pypowsybl, m) {
10071012
.def_readwrite("with_fortescue_result", &pypowsybl::ShortCircuitAnalysisParameters::with_fortescue_result)
10081013
.def_readwrite("min_voltage_drop_proportional_threshold", &pypowsybl::ShortCircuitAnalysisParameters::min_voltage_drop_proportional_threshold)
10091014
.def_readwrite("initial_voltage_profile_mode", &pypowsybl::ShortCircuitAnalysisParameters::initial_voltage_profile_mode)
1015+
.def_readwrite("voltage_ranges", &pypowsybl::ShortCircuitAnalysisParameters::voltage_ranges)
10101016
.def_readwrite("provider_parameters_keys", &pypowsybl::ShortCircuitAnalysisParameters::provider_parameters_keys)
10111017
.def_readwrite("provider_parameters_values", &pypowsybl::ShortCircuitAnalysisParameters::provider_parameters_values);
10121018

java/src/main/java/com/powsybl/python/commons/CommonCFunctions.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,12 @@ public static CCharPointer getVersionTable(IsolateThread thread, ExceptionHandle
5656
return doCatch(exceptionHandlerPtr, () -> CTypeUtil.toCharPtr(Version.getTableString()));
5757
}
5858

59+
@CEntryPoint(name = "freeVoltageRangeArray")
60+
public static void freeVoltageRangeArray(IsolateThread thread, ArrayPointer<VoltageRangePointer> arrayPtr,
61+
ExceptionHandlerPointer exceptionHandlerPtr) {
62+
doCatch(exceptionHandlerPtr, () -> freeVoltageRangeArrayContent(arrayPtr));
63+
}
64+
5965
@CEntryPoint(name = "freeStringArray")
6066
public static void freeStringArray(IsolateThread thread, ArrayPointer<CCharPointerPointer> arrayPtr,
6167
ExceptionHandlerPointer exceptionHandlerPtr) {
@@ -99,6 +105,12 @@ private static void freeArrayContent(ArrayPointer<CCharPointerPointer> array) {
99105
}
100106
}
101107

108+
private static void freeVoltageRangeArrayContent(ArrayPointer<VoltageRangePointer> array) {
109+
for (int i = 0; i < array.getLength(); i++) {
110+
UnmanagedMemory.free(array.getPtr().read(i));
111+
}
112+
}
113+
102114
@CEntryPoint(name = "destroyObjectHandle")
103115
public static void destroyObjectHandle(IsolateThread thread, ObjectHandle objectHandle, ExceptionHandlerPointer exceptionHandlerPtr) {
104116
doCatch(exceptionHandlerPtr, () -> ObjectHandles.getGlobal().destroy(objectHandle));

java/src/main/java/com/powsybl/python/shortcircuit/ShortCircuitAnalysisCFunctions.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,16 @@ public static ObjectHandle createShortCircuitAnalysis(IsolateThread thread, PyPo
7878
return doCatch(exceptionHandlerPtr, () -> ObjectHandles.getGlobal().create(new ShortCircuitAnalysisContext()));
7979
}
8080

81+
@CEntryPoint(name = "createVoltageRange")
82+
public static PyPowsyblApiHeader.VoltageRangePointer createVoltageRange(IsolateThread thread, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) {
83+
return doCatch(exceptionHandlerPtr, () -> UnmanagedMemory.<PyPowsyblApiHeader.VoltageRangePointer>calloc(SizeOf.get(PyPowsyblApiHeader.VoltageRangePointer.class)));
84+
}
85+
86+
@CEntryPoint(name = "deleteVoltageRange")
87+
public static void deleteVoltageRange(IsolateThread thread, PyPowsyblApiHeader.VoltageRangePointer voltageRangePointer, PyPowsyblApiHeader.ExceptionHandlerPointer exceptionHandlerPtr) {
88+
doCatch(exceptionHandlerPtr, () -> UnmanagedMemory.free(voltageRangePointer));
89+
}
90+
8191
private static ShortCircuitAnalysisProvider getProvider(String name) {
8292
String actualName = name.isEmpty() ? PyPowsyblConfiguration.getDefaultShortCircuitAnalysisProvider() : name;
8393
return ShortCircuitAnalysisProvider.findAll().stream()

java/src/main/java/com/powsybl/python/shortcircuit/ShortCircuitAnalysisCUtils.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public static ShortCircuitAnalysisProvider getShortCircuitAnalysisProvider(Strin
3535
}
3636

3737
public static ShortCircuitParameters createShortCircuitAnalysisParameters() {
38-
return PyPowsyblConfiguration.isReadConfig() ? ShortCircuitParameters.load() : new ShortCircuitParameters();
38+
return PyPowsyblConfiguration.isReadConfig() ? ShortCircuitParameters.load() : new ShortCircuitParameters().setVoltageRanges(new ArrayList<>());
3939
}
4040

4141
public static ShortCircuitParameters createShortCircuitAnalysisParameters(PyPowsyblApiHeader.ShortCircuitAnalysisParametersPointer shortCircuitAnalysisParametersPointer,
@@ -68,7 +68,7 @@ private static ShortCircuitParameters createShortCircuitAnalysisParameters(PyPow
6868

6969
private static List<VoltageRange> createVoltageRangeList(PyPowsyblApiHeader.ArrayPointer<PyPowsyblApiHeader.VoltageRangePointer> voltageRangePointerArrayPointer) {
7070
List<VoltageRange> voltageRanges = new ArrayList<>();
71-
for (int i=0; i<= voltageRangePointerArrayPointer.getLength(); i++) {
71+
for (int i = 0; i <= voltageRangePointerArrayPointer.getLength(); i++) {
7272
PyPowsyblApiHeader.VoltageRangePointer voltageRangePointer = voltageRangePointerArrayPointer.getPtr().addressOf(i);
7373
voltageRanges.add(new VoltageRange(voltageRangePointer.getMinimumNominalVoltage(),
7474
voltageRangePointer.getMaximumNominalVoltage(),

pypowsybl/_pypowsybl.pyi

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -689,16 +689,32 @@ class InitialVoltageProfileMode:
689689
CONFIGURED: ClassVar[InitialVoltageProfileMode] = ...
690690
PREVIOUS_VALUE: ClassVar[InitialVoltageProfileMode] = ...
691691

692+
class VoltageRange:
693+
def __init__(self, minimum_nominal_voltage: float, maximum_nominal_voltage: float, voltage: float, range_coefficient: float) -> None: ...
694+
695+
@property
696+
def minimum_nominal_voltage(self) -> float: ...
697+
698+
@property
699+
def maximum_nominal_voltage(self) -> float: ...
700+
701+
@property
702+
def voltage(self) -> float: ...
703+
704+
@property
705+
def range_coefficient(self) -> float: ...
706+
692707
class ShortCircuitAnalysisParameters:
693708
with_voltage_result: bool
694709
with_feeder_result: bool
695710
with_limit_violations: bool
696711
study_type: ShortCircuitStudyType
697712
with_fortescue_result: bool
698713
min_voltage_drop_proportional_threshold: float
714+
initial_voltage_profile_mode: InitialVoltageProfileMode
715+
voltage_ranges: List[VoltageRange]
699716
provider_parameters_keys: List[str]
700717
provider_parameters_values: List[str]
701-
initial_voltage_profile_mode: InitialVoltageProfileMode
702718
def __init__(self) -> None: ...
703719

704720
def add_contingency(analysis_context: JavaHandle, contingency_id: str, elements_ids: List[str]) -> None: ...

pypowsybl/shortcircuit/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@
1212
get_default_provider,
1313
get_provider_names,
1414
get_provider_parameters_names)
15+
from .impl.voltage_range import VoltageRange

pypowsybl/shortcircuit/impl/parameters.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@
44
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
55
# SPDX-License-Identifier: MPL-2.0
66
#
7-
from typing import Dict
7+
from typing import Dict, List
88

99
from pypowsybl import _pypowsybl
1010
from pypowsybl._pypowsybl import ShortCircuitStudyType, InitialVoltageProfileMode
11+
from .voltage_range import VoltageRange
1112

1213
ShortCircuitStudyType.__module__ = __name__
1314
ShortCircuitStudyType.__name__ = 'ShortCircuitStudyType'
@@ -37,6 +38,7 @@ class Parameters: # pylint: disable=too-few-public-methods
3738
min_voltage_drop_proportional_threshold: specifies a threshold for filtering the voltage results.
3839
Only nodes where the voltage drop due to the short circuit is greater than this property are retained.
3940
study_type: specifies the type of short-circuit study. It can be SUB_TRANSIENT, TRANSIENT or STEADY_STATE.
41+
voltage_ranges:
4042
initial_voltage_profile_mode: specify how the computation is initialized. It can be NOMINAL, CONFIGURED or PREVIOUS_VALUE
4143
"""
4244

@@ -48,7 +50,8 @@ def __init__(self,
4850
study_type: ShortCircuitStudyType = None,
4951
provider_parameters: Dict[str, str] = None,
5052
with_fortescue_result: bool = None,
51-
initial_voltage_profile_mode: InitialVoltageProfileMode = None):
53+
initial_voltage_profile_mode: InitialVoltageProfileMode = None,
54+
voltage_ranges: List[VoltageRange] = None):
5255
self._init_with_default_values()
5356
if with_feeder_result is not None:
5457
self.with_feeder_result = with_feeder_result
@@ -66,6 +69,8 @@ def __init__(self,
6669
self.with_fortescue_result = with_fortescue_result
6770
if initial_voltage_profile_mode is not None:
6871
self.initial_voltage_profile_mode = initial_voltage_profile_mode
72+
if voltage_ranges is not None:
73+
self.voltage_ranges = voltage_ranges
6974

7075
def _init_from_c(self, c_parameters: _pypowsybl.ShortCircuitAnalysisParameters) -> None:
7176
self.with_feeder_result = c_parameters.with_feeder_result
@@ -77,6 +82,7 @@ def _init_from_c(self, c_parameters: _pypowsybl.ShortCircuitAnalysisParameters)
7782
zip(c_parameters.provider_parameters_keys, c_parameters.provider_parameters_values))
7883
self.with_fortescue_result = c_parameters.with_fortescue_result
7984
self.initial_voltage_profile_mode = c_parameters.initial_voltage_profile_mode
85+
self.voltage_ranges = [VoltageRange(vr.minimum_nominal_voltage, vr.maximum_nominal_voltage, vr.voltage, vr.range_coefficient) for vr in c_parameters.voltage_ranges]
8086

8187
def _init_with_default_values(self) -> None:
8288
self._init_from_c(_pypowsybl.ShortCircuitAnalysisParameters())
@@ -87,6 +93,7 @@ def _init_with_default_values(self) -> None:
8793
self.study_type = ShortCircuitStudyType.TRANSIENT
8894
self.with_fortescue_result = False
8995
self.initial_voltage_profile_mode = InitialVoltageProfileMode.NOMINAL
96+
self.voltage_ranges = []
9097

9198
def _to_c_parameters(self) -> _pypowsybl.ShortCircuitAnalysisParameters:
9299
c_parameters = _pypowsybl.ShortCircuitAnalysisParameters()
@@ -97,6 +104,7 @@ def _to_c_parameters(self) -> _pypowsybl.ShortCircuitAnalysisParameters:
97104
c_parameters.with_fortescue_result = self.with_fortescue_result
98105
c_parameters.min_voltage_drop_proportional_threshold = self.min_voltage_drop_proportional_threshold
99106
c_parameters.initial_voltage_profile_mode = self.initial_voltage_profile_mode
107+
c_parameters.voltage_ranges = [_pypowsybl.VoltageRange(vr.minimum_nominal_voltage, vr.maximum_nominal_voltage, vr.voltage, vr.range_coefficient) for vr in self.voltage_ranges]
100108
c_parameters.provider_parameters_keys = []
101109
c_parameters.provider_parameters_values = []
102110
return c_parameters
@@ -110,4 +118,5 @@ def __repr__(self) -> str:
110118
f", study_type={self.study_type!r}" \
111119
f", with_fortescue_result={self.with_fortescue_result!r}" \
112120
f", initial_voltage_profile_mode={self.initial_voltage_profile_mode!r}" \
121+
f", voltage_ranges={self.voltage_ranges!r}" \
113122
f")"

0 commit comments

Comments
 (0)