Skip to content

Commit 79a5a85

Browse files
p-arvySo-Fras
andauthored
Add interface of new OpenReac parameters (#757)
* Add selection of log levels/reactive slacks repartition. * Add parameters to tune plausible voltage limits. * Add other open reac parameters. --------- Signed-off-by: p-arvy <[email protected]> Co-authored-by: Sophie Frasnedo <[email protected]>
1 parent ff0a045 commit 79a5a85

File tree

12 files changed

+637
-5
lines changed

12 files changed

+637
-5
lines changed

cpp/powsybl-cpp/powsybl-api.h

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -397,4 +397,23 @@ typedef enum {
397397
MIN_GENERATION = 0,
398398
BETWEEN_HIGH_AND_LOW_VOLTAGE_LIMIT,
399399
SPECIFIC_VOLTAGE_PROFILE,
400-
} VoltageInitializerObjective;
400+
} VoltageInitializerObjective;
401+
402+
typedef enum {
403+
DEBUG = 0,
404+
INFO,
405+
WARNING,
406+
ERROR,
407+
} VoltageInitializerLogLevelAmpl;
408+
409+
typedef enum {
410+
NOTHING = 0,
411+
ONLY_RESULTS,
412+
EVERYTHING,
413+
} VoltageInitializerLogLevelSolver;
414+
415+
typedef enum {
416+
CONFIGURED = 0,
417+
NO_GENERATION,
418+
ALL_BUSES,
419+
} VoltageInitializerReactiveSlackBusesMode;

cpp/powsybl-cpp/powsybl-cpp.cpp

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1467,6 +1467,10 @@ void voltageInitializerAddVariableTwoWindingsTransformers(const JavaHandle& para
14671467
pypowsybl::PowsyblCaller::get()->callJava(::voltageInitializerAddVariableTwoWindingsTransformers, paramsHandle, (char*) idPtr.c_str());
14681468
}
14691469

1470+
void voltageInitializerAddConfiguredReactiveSlackBuses(const JavaHandle& paramsHandle, const std::string& idPtr) {
1471+
pypowsybl::PowsyblCaller::get()->callJava(::voltageInitializerAddConfiguredReactiveSlackBuses, paramsHandle, (char*) idPtr.c_str());
1472+
}
1473+
14701474
void voltageInitializerSetObjective(const JavaHandle& paramsHandle, VoltageInitializerObjective cObjective) {
14711475
pypowsybl::PowsyblCaller::get()->callJava(::voltageInitializerSetObjective, paramsHandle, cObjective);
14721476
}
@@ -1475,6 +1479,66 @@ void voltageInitializerSetObjectiveDistance(const JavaHandle& paramsHandle, doub
14751479
pypowsybl::PowsyblCaller::get()->callJava(::voltageInitializerSetObjectiveDistance, paramsHandle, dist);
14761480
}
14771481

1482+
void voltageInitializerSetLogLevelAmpl(const JavaHandle& paramsHandle, VoltageInitializerLogLevelAmpl logLevelAmpl) {
1483+
pypowsybl::PowsyblCaller::get()->callJava(::voltageInitializerSetLogLevelAmpl, paramsHandle, logLevelAmpl);
1484+
}
1485+
1486+
void voltageInitializerSetLogLevelSolver(const JavaHandle& paramsHandle, VoltageInitializerLogLevelSolver logLevelSolver) {
1487+
pypowsybl::PowsyblCaller::get()->callJava(::voltageInitializerSetLogLevelSolver, paramsHandle, logLevelSolver);
1488+
}
1489+
1490+
void voltageInitializerSetReactiveSlackBusesMode(const JavaHandle& paramsHandle, VoltageInitializerReactiveSlackBusesMode reactiveSlackBusesMode) {
1491+
pypowsybl::PowsyblCaller::get()->callJava(::voltageInitializerSetReactiveSlackBusesMode, paramsHandle, reactiveSlackBusesMode);
1492+
}
1493+
1494+
void voltageInitializerSetMinPlausibleLowVoltageLimit(const JavaHandle& paramsHandle, double min_plausible_low_voltage_limit) {
1495+
pypowsybl::PowsyblCaller::get()->callJava(::voltageInitializerSetMinPlausibleLowVoltageLimit, paramsHandle, min_plausible_low_voltage_limit);
1496+
}
1497+
1498+
void voltageInitializerSetMaxPlausibleHighVoltageLimit(const JavaHandle& paramsHandle, double max_plausible_high_voltage_limit) {
1499+
pypowsybl::PowsyblCaller::get()->callJava(::voltageInitializerSetMaxPlausibleHighVoltageLimit, paramsHandle, max_plausible_high_voltage_limit);
1500+
}
1501+
1502+
void voltageInitializerSetActivePowerVariationRate(const JavaHandle& paramsHandle, double active_power_variation_rate) {
1503+
pypowsybl::PowsyblCaller::get()->callJava(::voltageInitializerSetActivePowerVariationRate, paramsHandle, active_power_variation_rate);
1504+
}
1505+
1506+
void voltageInitializerSetMinPlausibleActivePowerThreshold(const JavaHandle& paramsHandle, double min_plausible_active_power_threshold) {
1507+
pypowsybl::PowsyblCaller::get()->callJava(::voltageInitializerSetMinPlausibleActivePowerThreshold, paramsHandle, min_plausible_active_power_threshold);
1508+
}
1509+
1510+
void voltageInitializerSetLowImpedanceThreshold(const JavaHandle& paramsHandle, double low_impedance_threshold) {
1511+
pypowsybl::PowsyblCaller::get()->callJava(::voltageInitializerSetLowImpedanceThreshold, paramsHandle, low_impedance_threshold);
1512+
}
1513+
1514+
void voltageInitializerSetMinNominalVoltageIgnoredBus(const JavaHandle& paramsHandle, double min_nominal_voltage_ignored_bus) {
1515+
pypowsybl::PowsyblCaller::get()->callJava(::voltageInitializerSetMinNominalVoltageIgnoredBus, paramsHandle, min_nominal_voltage_ignored_bus);
1516+
}
1517+
1518+
void voltageInitializerSetMinNominalVoltageIgnoredVoltageBounds(const JavaHandle& paramsHandle, double min_nominal_voltage_ignored_voltage_bounds) {
1519+
pypowsybl::PowsyblCaller::get()->callJava(::voltageInitializerSetMinNominalVoltageIgnoredVoltageBounds, paramsHandle, min_nominal_voltage_ignored_voltage_bounds);
1520+
}
1521+
1522+
void voltageInitializerSetMaxPlausiblePowerLimit(const JavaHandle& paramsHandle, double max_plausible_power_limit) {
1523+
pypowsybl::PowsyblCaller::get()->callJava(::voltageInitializerSetMaxPlausiblePowerLimit, paramsHandle, max_plausible_power_limit);
1524+
}
1525+
1526+
void voltageInitializerSetDefaultMinimalQPRange(const JavaHandle& paramsHandle, double default_minimal_qp_range) {
1527+
pypowsybl::PowsyblCaller::get()->callJava(::voltageInitializerSetDefaultMinimalQPRange, paramsHandle, default_minimal_qp_range);
1528+
}
1529+
1530+
void voltageInitializerSetHighActivePowerDefaultLimit(const JavaHandle& paramsHandle, double high_active_power_default_limit) {
1531+
pypowsybl::PowsyblCaller::get()->callJava(::voltageInitializerSetHighActivePowerDefaultLimit, paramsHandle, high_active_power_default_limit);
1532+
}
1533+
1534+
void voltageInitializerSetLowActivePowerDefaultLimit(const JavaHandle& paramsHandle, double low_active_power_default_limit) {
1535+
pypowsybl::PowsyblCaller::get()->callJava(::voltageInitializerSetLowActivePowerDefaultLimit, paramsHandle, low_active_power_default_limit);
1536+
}
1537+
1538+
void voltageInitializerSetDefaultQmaxPmaxRatio(const JavaHandle& paramsHandle, double default_qmax_pmax_ratio) {
1539+
pypowsybl::PowsyblCaller::get()->callJava(::voltageInitializerSetDefaultQmaxPmaxRatio, paramsHandle, default_qmax_pmax_ratio);
1540+
}
1541+
14781542
void voltageInitializerSetDefaultVariableScalingFactor(const JavaHandle& paramsHandle, double defaultVariableScalingFactor) {
14791543
pypowsybl::PowsyblCaller::get()->callJava(::voltageInitializerSetDefaultVariableScalingFactor, paramsHandle, defaultVariableScalingFactor);
14801544
}
@@ -1489,6 +1553,7 @@ void voltageInitializerSetReactiveSlackVariableScalingFactor(const JavaHandle& p
14891553

14901554
void voltageInitializerSetTwoWindingTransformerRatioVariableScalingFactor(const JavaHandle& paramsHandle, double twoWindingTransformerRatioVariableScalingFactor) {
14911555
pypowsybl::PowsyblCaller::get()->callJava(::voltageInitializerSetTwoWindingTransformerRatioVariableScalingFactor, paramsHandle, twoWindingTransformerRatioVariableScalingFactor);
1556+
14921557
}
14931558

14941559
void voltageInitializerApplyAllModifications(const JavaHandle& resultHandle, const JavaHandle& networkHandle) {

cpp/powsybl-cpp/powsybl-cpp.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -756,12 +756,29 @@ void voltageInitializerAddSpecificHighVoltageLimits(const JavaHandle& paramsHand
756756
void voltageInitializerAddVariableShuntCompensators(const JavaHandle& paramsHandle, const std::string& idPtr);
757757
void voltageInitializerAddConstantQGenerators(const JavaHandle& paramsHandle, const std::string& idPtr);
758758
void voltageInitializerAddVariableTwoWindingsTransformers(const JavaHandle& paramsHandle, const std::string& idPtr);
759+
void voltageInitializerAddConfiguredReactiveSlackBuses(const JavaHandle& paramsHandle, const std::string& idPtr);
759760
void voltageInitializerSetObjective(const JavaHandle& paramsHandle, VoltageInitializerObjective cObjective);
760761
void voltageInitializerSetObjectiveDistance(const JavaHandle& paramsHandle, double dist);
762+
void voltageInitializerSetLogLevelAmpl(const JavaHandle& paramsHandle, VoltageInitializerLogLevelAmpl logLevelAmpl);
763+
void voltageInitializerSetLogLevelSolver(const JavaHandle& paramsHandle, VoltageInitializerLogLevelSolver logLevelSolver);
764+
void voltageInitializerSetReactiveSlackBusesMode(const JavaHandle& paramsHandle, VoltageInitializerReactiveSlackBusesMode reactiveSlackBusesMode);
765+
void voltageInitializerSetMinPlausibleLowVoltageLimit(const JavaHandle& paramsHandle, double min_plausible_low_voltage_limit);
766+
void voltageInitializerSetMaxPlausibleHighVoltageLimit(const JavaHandle& paramsHandle, double max_plausible_high_voltage_limit);
767+
void voltageInitializerSetActivePowerVariationRate(const JavaHandle& paramsHandle, double active_power_variation_rate);
768+
void voltageInitializerSetMinPlausibleActivePowerThreshold(const JavaHandle& paramsHandle, double min_plausible_active_power_threshold);
769+
void voltageInitializerSetLowImpedanceThreshold(const JavaHandle& paramsHandle, double low_impedance_threshold);
770+
void voltageInitializerSetMinNominalVoltageIgnoredBus(const JavaHandle& paramsHandle, double min_nominal_voltage_ignored_bus);
771+
void voltageInitializerSetMinNominalVoltageIgnoredVoltageBounds(const JavaHandle& paramsHandle, double min_nominal_voltage_ignored_voltage_bounds);
772+
void voltageInitializerSetMaxPlausiblePowerLimit(const JavaHandle& paramsHandle, double max_plausible_power_limit);
773+
void voltageInitializerSetDefaultMinimalQPRange(const JavaHandle& paramsHandle, double default_minimal_qp_range);
774+
void voltageInitializerSetHighActivePowerDefaultLimit(const JavaHandle& paramsHandle, double high_active_power_default_limit);
775+
void voltageInitializerSetLowActivePowerDefaultLimit(const JavaHandle& paramsHandle, double low_active_power_default_limit);
776+
void voltageInitializerSetDefaultQmaxPmaxRatio(const JavaHandle& paramsHandle, double default_qmax_pmax_ratio);
761777
void voltageInitializerSetDefaultVariableScalingFactor(const JavaHandle& paramsHandle, double defaultVariableScalingFactor);
762778
void voltageInitializerSetDefaultConstraintScalingFactor(const JavaHandle& paramsHandle, double defaultConstraintScalingFactor);
763779
void voltageInitializerSetReactiveSlackVariableScalingFactor(const JavaHandle& paramsHandle, double reactiveSlackVariableScalingFactor);
764780
void voltageInitializerSetTwoWindingTransformerRatioVariableScalingFactor(const JavaHandle& paramsHandle, double twoWindingTransformerRatioVariableScalingFactor);
781+
765782
void voltageInitializerApplyAllModifications(const JavaHandle& resultHandle, const JavaHandle& networkHandle);
766783
VoltageInitializerStatus voltageInitializerGetStatus(const JavaHandle& resultHandle);
767784
std::map<std::string, std::string> voltageInitializerGetIndicators(const JavaHandle& resultHandle);

cpp/pypowsybl-cpp/bindings.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,13 +188,30 @@ void voltageInitializerBinding(py::module_& m) {
188188
.value("BETWEEN_HIGH_AND_LOW_VOLTAGE_LIMIT", VoltageInitializerObjective::BETWEEN_HIGH_AND_LOW_VOLTAGE_LIMIT)
189189
.value("SPECIFIC_VOLTAGE_PROFILE", VoltageInitializerObjective::SPECIFIC_VOLTAGE_PROFILE);
190190

191+
py::enum_<VoltageInitializerLogLevelAmpl>(m, "VoltageInitializerLogLevelAmpl")
192+
.value("DEBUG", VoltageInitializerLogLevelAmpl::DEBUG)
193+
.value("INFO", VoltageInitializerLogLevelAmpl::INFO)
194+
.value("WARNING", VoltageInitializerLogLevelAmpl::WARNING)
195+
.value("ERROR", VoltageInitializerLogLevelAmpl::ERROR);
196+
197+
py::enum_<VoltageInitializerLogLevelSolver>(m, "VoltageInitializerLogLevelSolver")
198+
.value("NOTHING", VoltageInitializerLogLevelSolver::NOTHING)
199+
.value("ONLY_RESULTS", VoltageInitializerLogLevelSolver::ONLY_RESULTS)
200+
.value("EVERYTHING", VoltageInitializerLogLevelSolver::EVERYTHING);
201+
202+
py::enum_<VoltageInitializerReactiveSlackBusesMode>(m, "VoltageInitializerReactiveSlackBusesMode")
203+
.value("CONFIGURED", VoltageInitializerReactiveSlackBusesMode::CONFIGURED)
204+
.value("NO_GENERATION", VoltageInitializerReactiveSlackBusesMode::NO_GENERATION)
205+
.value("ALL_BUSES", VoltageInitializerReactiveSlackBusesMode::ALL_BUSES);
206+
191207
m.def("create_voltage_initializer_params", &pypowsybl::createVoltageInitializerParams);
192208

193209
m.def("voltage_initializer_add_variable_shunt_compensators", &pypowsybl::voltageInitializerAddVariableShuntCompensators, py::arg("params_handle"), py::arg("id_ptr"));
194210
m.def("voltage_initializer_add_constant_q_generators", &pypowsybl::voltageInitializerAddConstantQGenerators, py::arg("params_handle"), py::arg("id_ptr"));
195211
m.def("voltage_initializer_add_variable_two_windings_transformers", &pypowsybl::voltageInitializerAddVariableTwoWindingsTransformers, py::arg("params_handle"), py::arg("id_ptr"));
196212
m.def("voltage_initializer_add_specific_low_voltage_limits", &pypowsybl::voltageInitializerAddSpecificLowVoltageLimits, py::arg("params_handle"), py::arg("voltage_level_id"), py::arg("is_relative"), py::arg("limit"));
197213
m.def("voltage_initializer_add_specific_high_voltage_limits", &pypowsybl::voltageInitializerAddSpecificHighVoltageLimits, py::arg("params_handle"), py::arg("voltage_level_id"), py::arg("is_relative"), py::arg("limit"));
214+
m.def("voltage_initializer_add_configured_reactive_slack_buses", &pypowsybl::voltageInitializerAddConfiguredReactiveSlackBuses, py::arg("params_handle"), py::arg("id_ptr"));
198215

199216
m.def("voltage_initializer_set_objective", &pypowsybl::voltageInitializerSetObjective, py::arg("params_handle"), py::arg("c_objective"));
200217
m.def("voltage_initializer_set_objective_distance", &pypowsybl::voltageInitializerSetObjectiveDistance, py::arg("params_handle"), py::arg("dist"));
@@ -206,6 +223,22 @@ void voltageInitializerBinding(py::module_& m) {
206223

207224
m.def("run_voltage_initializer", &pypowsybl::runVoltageInitializer, py::arg("debug"), py::arg("network_handle"), py::arg("params_handle"));
208225

226+
m.def("voltage_initializer_set_log_level_ampl", &pypowsybl::voltageInitializerSetLogLevelAmpl, py::arg("params_handle"), py::arg("log_level_ampl"));
227+
m.def("voltage_initializer_set_log_level_solver", &pypowsybl::voltageInitializerSetLogLevelSolver, py::arg("params_handle"), py::arg("log_level_solver"));
228+
m.def("voltage_initializer_set_reactive_slack_buses_mode", &pypowsybl::voltageInitializerSetReactiveSlackBusesMode, py::arg("params_handle"), py::arg("reactive_slack_buses_mode"));
229+
m.def("voltage_initializer_set_min_plausible_low_voltage_limit", &pypowsybl::voltageInitializerSetMinPlausibleLowVoltageLimit, py::arg("params_handle"), py::arg("min_plausible_low_voltage_limit"));
230+
m.def("voltage_initializer_set_max_plausible_high_voltage_limit", &pypowsybl::voltageInitializerSetMaxPlausibleHighVoltageLimit, py::arg("params_handle"), py::arg("max_plausible_high_voltage_limit"));
231+
m.def("voltage_initializer_set_active_power_variation_rate", &pypowsybl::voltageInitializerSetActivePowerVariationRate, py::arg("params_handle"), py::arg("active_power_variation_rate"));
232+
m.def("voltage_initializer_set_min_plausible_active_power_threshold", &pypowsybl::voltageInitializerSetMinPlausibleActivePowerThreshold, py::arg("params_handle"), py::arg("min_plausible_active_power_threshold"));
233+
m.def("voltage_initializer_set_low_impedance_threshold", &pypowsybl::voltageInitializerSetLowImpedanceThreshold, py::arg("params_handle"), py::arg("low_impedance_threshold"));
234+
m.def("voltage_initializer_set_min_nominal_voltage_ignored_bus", &pypowsybl::voltageInitializerSetMinNominalVoltageIgnoredBus, py::arg("params_handle"), py::arg("min_nominal_voltage_ignored_bus"));
235+
m.def("voltage_initializer_set_min_nominal_voltage_ignored_voltage_bounds", &pypowsybl::voltageInitializerSetMinNominalVoltageIgnoredVoltageBounds, py::arg("params_handle"), py::arg("min_nominal_voltage_ignored_voltage_bounds"));
236+
m.def("voltage_initializer_set_max_plausible_power_limit", &pypowsybl::voltageInitializerSetMaxPlausiblePowerLimit, py::arg("params_handle"), py::arg("max_plausible_power_limit"));
237+
m.def("voltage_initializer_set_high_active_power_default_limit", &pypowsybl::voltageInitializerSetHighActivePowerDefaultLimit, py::arg("params_handle"), py::arg("high_active_power_default_limit"));
238+
m.def("voltage_initializer_set_low_active_power_default_limit", &pypowsybl::voltageInitializerSetLowActivePowerDefaultLimit, py::arg("params_handle"), py::arg("low_active_power_default_limit"));
239+
m.def("voltage_initializer_set_default_minimal_qp_range", &pypowsybl::voltageInitializerSetDefaultMinimalQPRange, py::arg("params_handle"), py::arg("default_minimal_qp_range"));
240+
m.def("voltage_initializer_set_default_qmax_pmax_ratio", &pypowsybl::voltageInitializerSetDefaultQmaxPmaxRatio, py::arg("params_handle"), py::arg("default_qmax_pmax_ratio"));
241+
209242
m.def("voltage_initializer_apply_all_modifications", &pypowsybl::voltageInitializerApplyAllModifications, py::arg("result_handle"), py::arg("network_handle"));
210243
m.def("voltage_initializer_get_status", &pypowsybl::voltageInitializerGetStatus, py::arg("result_handle"));
211244
m.def("voltage_initializer_get_indicators", &pypowsybl::voltageInitializerGetIndicators, py::arg("result_handle"));

docs/user_guide/voltage_initializer.rst

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,62 @@ Here is a simple starting example:
5050
Available settings in the VoltageInitializerParameters class
5151
-------------
5252

53+
- Specify which buses will have reactive slacks attached in the ACOPF solving.
54+
55+
.. code-block:: python
56+
import pypowsybl as pp
57+
import pypowsybl.voltage_initializer as v_init
58+
params = v_init.VoltageInitializerParameters()
59+
params.set_reactive_slack_buses_mode(va.VoltageInitializerReactiveSlackBusesMode.NO_GENERATION)
60+
61+
- Specify what is the log level of the AMPL solving.
62+
63+
.. code-block:: python
64+
import pypowsybl as pp
65+
import pypowsybl.voltage_initializer as v_init
66+
params = v_init.VoltageInitializerParameters()
67+
params.set_log_level_ampl(va.VoltageInitializerLogLevelAmpl.ERROR)
68+
params.set_log_level_solver(va.VoltageInitializerLogLevelSolver.EVERYTHING)
69+
70+
- Change plausible voltage level limits in ACOPF solving.
71+
72+
.. code-block:: python
73+
import pypowsybl as pp
74+
import pypowsybl.voltage_initializer as v_init
75+
params = v_init.VoltageInitializerParameters()
76+
params.set_min_plausible_low_voltage_limit(0.45)
77+
params.set_max_plausible_high_voltage_limit(1.2)
78+
79+
- Tune the threshold defining null values in AMPL.
80+
81+
.. code-block:: python
82+
import pypowsybl as pp
83+
import pypowsybl.voltage_initializer as v_init
84+
params = v_init.VoltageInitializerParameters()
85+
params.set_min_plausible_active_power_threshold(1)
86+
params.set_low_impedance_threshold(1e-5)
87+
88+
- Modify the parameters used for the correction of generator limits.
89+
90+
.. code-block:: python
91+
import pypowsybl as pp
92+
import pypowsybl.voltage_initializer as v_init
93+
params = v_init.VoltageInitializerParameters()
94+
params.set_max_plausible_power_limit(7800)
95+
params.set_high_active_power_default_limit(950)
96+
params.set_low_active_power_default_limit(0.5)
97+
params.set_default_minimal_qp_range(0.45)
98+
params.set_default_qmax_pmax_ratio(0.45)
99+
100+
- Tune the thresholds used to ignore buses or voltage level limits with nominal voltage lower than them.
101+
102+
.. code-block:: python
103+
import pypowsybl as pp
104+
import pypowsybl.voltage_initializer as v_init
105+
params = v_init.VoltageInitializerParameters()
106+
params.set_min_nominal_voltage_ignored_bus(0.5)
107+
params.set_min_nominal_voltage_ignored_voltage_bounds(1)
108+
53109
- Specify which parameters will be variable or fixed in the ACOPF solving
54110

55111
.. code-block:: python
@@ -105,4 +161,5 @@ Available settings in the VoltageInitializerParameters class
105161
params.set_default_variable_scaling_factor(1.1)
106162
params.set_default_constraint_scaling_factor(0.9)
107163
params.set_reactive_slack_variable_scaling_factor(0.15)
108-
params.set_twt_ratio_variable_scaling_factor(0.002)
164+
params.set_twt_ratio_variable_scaling_factor(0.002)
165+

0 commit comments

Comments
 (0)