Skip to content

Commit 091a560

Browse files
committed
Add a parameter to ignore QPercent for remote voltage control.
Signed-off-by: Didier Vidal <[email protected]>
1 parent 77cae66 commit 091a560

11 files changed

+103
-34
lines changed

src/main/java/com/powsybl/openloadflow/OpenLoadFlowParameters.java

+30-6
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,8 @@ public enum FictitiousGeneratorVoltageControlCheckMode {
147147

148148
public static final boolean FORCE_TARGET_Q_IN_REACTIVE_LIMITS_DEFAULT_VALUE = false;
149149

150+
public static final boolean REMOTE_VOLTAGE_CONTROL_IGNORE_QPERCENT_DEFAULT_VALUE = false;
151+
150152
public static final String SLACK_BUS_SELECTION_MODE_PARAM_NAME = "slackBusSelectionMode";
151153

152154
public static final String SLACK_BUSES_IDS_PARAM_NAME = "slackBusesIds";
@@ -295,6 +297,8 @@ public enum FictitiousGeneratorVoltageControlCheckMode {
295297

296298
public static final String DISABLE_INCONSISTENT_VOLTAGE_CONTROLS_PARAM_NAME = "disableInconsistentVoltageControls";
297299

300+
public static final String REMOTE_VOLTAGE_CONTROL_IGNORE_QPERCENT_PARAM_NAME = "remoteVoltageControlIgnoreQPercent";
301+
298302
public static <E extends Enum<E>> List<Object> getEnumPossibleValues(Class<E> enumClass) {
299303
return EnumSet.allOf(enumClass).stream().map(Enum::name).collect(Collectors.toList());
300304
}
@@ -439,7 +443,8 @@ public static List<Object> getAcSolverTypePossibleValues() {
439443
new Parameter(AREA_INTERCHANGE_P_MAX_MISMATCH_PARAM_NAME, ParameterType.DOUBLE, "Area interchange max active power mismatch", AREA_INTERCHANGE_P_MAX_MISMATCH_DEFAULT_VALUE, ParameterScope.FUNCTIONAL, SLACK_DISTRIBUTION_CATEGORY_KEY),
440444
new Parameter(VOLTAGE_REMOTE_CONTROL_ROBUST_MODE_PARAM_NAME, ParameterType.BOOLEAN, "Generator voltage remote control robust mode", VOLTAGE_REMOTE_CONTROL_ROBUST_MODE_DEFAULT_VALUE, ParameterScope.FUNCTIONAL, GENERATOR_VOLTAGE_CONTROL_CATEGORY_KEY),
441445
new Parameter(FORCE_TARGET_Q_IN_REACTIVE_LIMITS_PARAM_NAME, ParameterType.BOOLEAN, "Force targetQ in the reactive limit diagram", FORCE_TARGET_Q_IN_REACTIVE_LIMITS_DEFAULT_VALUE, ParameterScope.FUNCTIONAL, REACTIVE_POWER_CONTROL_CATEGORY_KEY),
442-
new Parameter(DISABLE_INCONSISTENT_VOLTAGE_CONTROLS_PARAM_NAME, ParameterType.BOOLEAN, "Disable inconsistent voltage controls", LfNetworkParameters.DISABLE_INCONSISTENT_VOLTAGE_CONTROLS_DEFAULT_VALUE, ParameterScope.FUNCTIONAL, GENERATOR_VOLTAGE_CONTROL_CATEGORY_KEY)
446+
new Parameter(DISABLE_INCONSISTENT_VOLTAGE_CONTROLS_PARAM_NAME, ParameterType.BOOLEAN, "Disable inconsistent voltage controls", LfNetworkParameters.DISABLE_INCONSISTENT_VOLTAGE_CONTROLS_DEFAULT_VALUE, ParameterScope.FUNCTIONAL, GENERATOR_VOLTAGE_CONTROL_CATEGORY_KEY),
447+
new Parameter(REMOTE_VOLTAGE_CONTROL_IGNORE_QPERCENT_PARAM_NAME, ParameterType.BOOLEAN, "Ignore qPercent for remote voltage control and use reactive power range as key instead", REMOTE_VOLTAGE_CONTROL_IGNORE_QPERCENT_DEFAULT_VALUE, ParameterScope.FUNCTIONAL, VOLTAGE_CONTROLS_CATEGORY_KEY)
443448
);
444449

445450
public enum VoltageInitModeOverride {
@@ -629,6 +634,8 @@ public enum ReactiveRangeCheckMode {
629634

630635
private boolean disableInconsistentVoltageControls = LfNetworkParameters.DISABLE_INCONSISTENT_VOLTAGE_CONTROLS_DEFAULT_VALUE;
631636

637+
private boolean remoteVoltageControlIgnoreQpercent = REMOTE_VOLTAGE_CONTROL_IGNORE_QPERCENT_DEFAULT_VALUE;
638+
632639
public static double checkParameterValue(double parameterValue, boolean condition, String parameterName) {
633640
if (!condition) {
634641
throw new IllegalArgumentException("Invalid value for parameter " + parameterName + ": " + parameterValue);
@@ -1381,6 +1388,15 @@ public OpenLoadFlowParameters setDisableInconsistentVoltageControls(boolean disa
13811388
return this;
13821389
}
13831390

1391+
public boolean isRemoteVoltageControlIgnoreQpercent() {
1392+
return remoteVoltageControlIgnoreQpercent;
1393+
}
1394+
1395+
public OpenLoadFlowParameters setRemoteVoltageControlIgnoreQpercent(boolean remoteVoltageControlIgnoreQpercent) {
1396+
this.remoteVoltageControlIgnoreQpercent = remoteVoltageControlIgnoreQpercent;
1397+
return this;
1398+
}
1399+
13841400
public static OpenLoadFlowParameters load() {
13851401
return load(PlatformConfig.defaultConfig());
13861402
}
@@ -1460,7 +1476,8 @@ public static OpenLoadFlowParameters load(PlatformConfig platformConfig) {
14601476
.setAreaInterchangeControl(config.getBooleanProperty(AREA_INTERCHANGE_CONTROL_PARAM_NAME, AREA_INTERCHANGE_CONTROL_DEFAULT_VALUE))
14611477
.setAreaInterchangeControlAreaType(config.getStringProperty(AREA_INTERCHANGE_CONTROL_AREA_TYPE_PARAM_NAME, LfNetworkParameters.AREA_INTERCHANGE_CONTROL_AREA_TYPE_DEFAULT_VALUE))
14621478
.setAreaInterchangePMaxMismatch(config.getDoubleProperty(AREA_INTERCHANGE_P_MAX_MISMATCH_PARAM_NAME, AREA_INTERCHANGE_P_MAX_MISMATCH_DEFAULT_VALUE))
1463-
.setDisableInconsistentVoltageControls(config.getBooleanProperty(DISABLE_INCONSISTENT_VOLTAGE_CONTROLS_PARAM_NAME, LfNetworkParameters.DISABLE_INCONSISTENT_VOLTAGE_CONTROLS_DEFAULT_VALUE)));
1479+
.setDisableInconsistentVoltageControls(config.getBooleanProperty(DISABLE_INCONSISTENT_VOLTAGE_CONTROLS_PARAM_NAME, LfNetworkParameters.DISABLE_INCONSISTENT_VOLTAGE_CONTROLS_DEFAULT_VALUE))
1480+
.setRemoteVoltageControlIgnoreQpercent(config.getBooleanProperty(REMOTE_VOLTAGE_CONTROL_IGNORE_QPERCENT_PARAM_NAME, REMOTE_VOLTAGE_CONTROL_IGNORE_QPERCENT_DEFAULT_VALUE)));
14641481
return parameters;
14651482
}
14661483

@@ -1627,6 +1644,8 @@ public OpenLoadFlowParameters update(Map<String, String> properties) {
16271644
.ifPresent(prop -> this.setForceTargetQInReactiveLimits(Boolean.parseBoolean(prop)));
16281645
Optional.ofNullable(properties.get(DISABLE_INCONSISTENT_VOLTAGE_CONTROLS_PARAM_NAME))
16291646
.ifPresent(prop -> this.setDisableInconsistentVoltageControls(Boolean.parseBoolean(prop)));
1647+
Optional.ofNullable(properties.get(REMOTE_VOLTAGE_CONTROL_IGNORE_QPERCENT_PARAM_NAME))
1648+
.ifPresent(prop -> this.setRemoteVoltageControlIgnoreQpercent(Boolean.parseBoolean(prop)));
16301649
return this;
16311650
}
16321651

@@ -1706,6 +1725,7 @@ public Map<String, Object> toMap() {
17061725
map.put(VOLTAGE_REMOTE_CONTROL_ROBUST_MODE_PARAM_NAME, voltageRemoteControlRobustMode);
17071726
map.put(FORCE_TARGET_Q_IN_REACTIVE_LIMITS_PARAM_NAME, forceTargetQInReactiveLimits);
17081727
map.put(DISABLE_INCONSISTENT_VOLTAGE_CONTROLS_PARAM_NAME, disableInconsistentVoltageControls);
1728+
map.put(REMOTE_VOLTAGE_CONTROL_IGNORE_QPERCENT_PARAM_NAME, remoteVoltageControlIgnoreQpercent);
17091729
return map;
17101730
}
17111731

@@ -1864,7 +1884,8 @@ static LfNetworkParameters getNetworkParameters(LoadFlowParameters parameters, O
18641884
.setAreaInterchangeControl(parametersExt.isAreaInterchangeControl())
18651885
.setAreaInterchangeControlAreaType(parametersExt.getAreaInterchangeControlAreaType())
18661886
.setForceTargetQInReactiveLimits(parametersExt.isForceTargetQInReactiveLimits())
1867-
.setDisableInconsistentVoltageControls(parametersExt.isDisableInconsistentVoltageControls());
1887+
.setDisableInconsistentVoltageControls(parametersExt.isDisableInconsistentVoltageControls())
1888+
.setRemoteVoltageControlIgnoreQPercent(parametersExt.isRemoteVoltageControlIgnoreQpercent());
18681889
}
18691890

18701891
public static AcLoadFlowParameters createAcParameters(Network network, LoadFlowParameters parameters, OpenLoadFlowParameters parametersExt,
@@ -1974,7 +1995,8 @@ public static DcLoadFlowParameters createDcParameters(LoadFlowParameters paramet
19741995
.setReferenceBusSelector(ReferenceBusSelector.fromMode(parametersExt.getReferenceBusSelectionMode()))
19751996
.setAreaInterchangeControl(parametersExt.isAreaInterchangeControl())
19761997
.setAreaInterchangeControlAreaType(parametersExt.getAreaInterchangeControlAreaType())
1977-
.setDisableInconsistentVoltageControls(parametersExt.isDisableInconsistentVoltageControls());
1998+
.setDisableInconsistentVoltageControls(parametersExt.isDisableInconsistentVoltageControls())
1999+
.setRemoteVoltageControlIgnoreQPercent(parametersExt.isRemoteVoltageControlIgnoreQpercent());
19782000

19792001
var equationSystemCreationParameters = new DcEquationSystemCreationParameters()
19802002
.setUpdateFlows(true)
@@ -2105,7 +2127,8 @@ public static boolean equals(LoadFlowParameters parameters1, LoadFlowParameters
21052127
extension1.getAreaInterchangePMaxMismatch() == extension2.getAreaInterchangePMaxMismatch() &&
21062128
extension1.isVoltageRemoteControlRobustMode() == extension2.isVoltageRemoteControlRobustMode() &&
21072129
extension1.isForceTargetQInReactiveLimits() == extension2.isForceTargetQInReactiveLimits() &&
2108-
extension1.isDisableInconsistentVoltageControls() == extension2.isDisableInconsistentVoltageControls();
2130+
extension1.isDisableInconsistentVoltageControls() == extension2.isDisableInconsistentVoltageControls() &&
2131+
extension1.isRemoteVoltageControlIgnoreQpercent() == extension2.isRemoteVoltageControlIgnoreQpercent();
21092132
}
21102133

21112134
public static LoadFlowParameters clone(LoadFlowParameters parameters) {
@@ -2204,7 +2227,8 @@ public static LoadFlowParameters clone(LoadFlowParameters parameters) {
22042227
.setAreaInterchangePMaxMismatch(extension.getAreaInterchangePMaxMismatch())
22052228
.setVoltageRemoteControlRobustMode(extension.isVoltageRemoteControlRobustMode())
22062229
.setForceTargetQInReactiveLimits(extension.isForceTargetQInReactiveLimits())
2207-
.setDisableInconsistentVoltageControls(extension.isDisableInconsistentVoltageControls());
2230+
.setDisableInconsistentVoltageControls(extension.isDisableInconsistentVoltageControls())
2231+
.setRemoteVoltageControlIgnoreQpercent(extension.isRemoteVoltageControlIgnoreQpercent());
22082232

22092233
if (extension2 != null) {
22102234
parameters2.addExtension(OpenLoadFlowParameters.class, extension2);

src/main/java/com/powsybl/openloadflow/network/Control.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,14 @@ private static double[] createReactiveKeysFromMaxReactivePowerRange(List<LfBus>
5858
return qKeys;
5959
}
6060

61-
static double[] createReactiveKeys(List<LfBus> controllerBuses, LfGenerator.GeneratorControlType generatorControlType) {
61+
static double[] createReactiveKeys(List<LfBus> controllerBuses,
62+
LfGenerator.GeneratorControlType generatorControlType,
63+
boolean ignoreQPercent) {
6264
double[] qKeys = new double[controllerBuses.size()];
6365
for (int i = 0; i < controllerBuses.size(); i++) {
6466
LfBus controllerBus = controllerBuses.get(i);
6567
for (LfGenerator generator : controllerBus.getGenerators()) {
66-
double qKey = generator.getRemoteControlReactiveKey().orElse(Double.NaN);
68+
double qKey = ignoreQPercent ? Double.NaN : generator.getRemoteControlReactiveKey().orElse(Double.NaN);
6769
if (Double.isNaN(qKey)) {
6870
// in case of one missing key, we fallback to keys based on reactive power range
6971
return createReactiveKeysFromMaxReactivePowerRange(controllerBuses, generatorControlType);

src/main/java/com/powsybl/openloadflow/network/GeneratorReactivePowerControl.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@
1717
public class GeneratorReactivePowerControl extends ReactivePowerControl {
1818

1919
private final List<LfBus> controllerBuses = new ArrayList<>();
20+
private final boolean ignoreQPercent;
2021

21-
public GeneratorReactivePowerControl(LfBranch controlledBranch, TwoSides controlledSide, double targetValue) {
22+
public GeneratorReactivePowerControl(LfBranch controlledBranch, TwoSides controlledSide, double targetValue, boolean ignoreQPercent) {
2223
super(controlledBranch, controlledSide, targetValue);
24+
this.ignoreQPercent = ignoreQPercent;
2325
}
2426

2527
public List<LfBus> getControllerBuses() {
@@ -33,7 +35,7 @@ public void addControllerBus(LfBus controllerBus) {
3335
}
3436

3537
public void updateReactiveKeys() {
36-
double[] reactiveKeys = createReactiveKeys(controllerBuses, LfGenerator.GeneratorControlType.REMOTE_REACTIVE_POWER);
38+
double[] reactiveKeys = createReactiveKeys(controllerBuses, LfGenerator.GeneratorControlType.REMOTE_REACTIVE_POWER, ignoreQPercent);
3739

3840
// key is 0 only on disabled controllers
3941
for (int i = 0; i < controllerBuses.size(); i++) {

src/main/java/com/powsybl/openloadflow/network/GeneratorVoltageControl.java

+8-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
/**
2-
* Copyright (c) 2021, RTE (http://www.rte-france.com)
1+
/*
2+
* Copyright (c) 2021-2025, RTE (http://www.rte-france.com)
33
* This Source Code Form is subject to the terms of the Mozilla Public
44
* License, v. 2.0. If a copy of the MPL was not distributed with this
55
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -17,8 +17,11 @@
1717
*/
1818
public class GeneratorVoltageControl extends VoltageControl<LfBus> {
1919

20-
public GeneratorVoltageControl(LfBus controlledBus, int targetPriority, double targetValue) {
20+
private final boolean ignoreQPercent;
21+
22+
public GeneratorVoltageControl(LfBus controlledBus, int targetPriority, double targetValue, boolean ignoreQPercent) {
2123
super(targetValue, Type.GENERATOR, targetPriority, controlledBus);
24+
this.ignoreQPercent = ignoreQPercent;
2225
}
2326

2427
@Override
@@ -64,7 +67,7 @@ public boolean isSharedControl() {
6467
public void updateReactiveKeys() {
6568
List<LfBus> controllerBuses = getMergedControllerElements();
6669

67-
double[] reactiveKeys = createReactiveKeys(controllerBuses, LfGenerator.GeneratorControlType.VOLTAGE);
70+
double[] reactiveKeys = createReactiveKeys(controllerBuses, LfGenerator.GeneratorControlType.VOLTAGE, ignoreQPercent);
6871

6972
// no reactive dispatch on PQ buses, so we set the key to 0
7073
for (int i = 0; i < controllerBuses.size(); i++) {
@@ -93,7 +96,7 @@ public List<GeneratorVoltageControl> toLocalVoltageControls() {
9396
// create one (local) generator control per controller bus and remove this one
9497
controlledBus.setGeneratorVoltageControl(null);
9598
for (LfBus controllerBus : controllerElements) {
96-
var generatorVoltageControl = new GeneratorVoltageControl(controllerBus, targetPriority, targetValue);
99+
var generatorVoltageControl = new GeneratorVoltageControl(controllerBus, targetPriority, targetValue, ignoreQPercent);
97100
generatorVoltageControl.addControllerElement(controllerBus);
98101
generatorVoltageControls.add(generatorVoltageControl);
99102
}

src/main/java/com/powsybl/openloadflow/network/LfNetworkParameters.java

+15-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
/**
2-
* Copyright (c) 2020, RTE (http://www.rte-france.com)
1+
/*
2+
* Copyright (c) 2020-2025, RTE (http://www.rte-france.com)
33
* This Source Code Form is subject to the terms of the Mozilla Public
44
* License, v. 2.0. If a copy of the MPL was not distributed with this
55
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -154,6 +154,8 @@ public class LfNetworkParameters {
154154

155155
private boolean disableInconsistentVoltageControls = DISABLE_INCONSISTENT_VOLTAGE_CONTROLS_DEFAULT_VALUE;
156156

157+
private boolean remoteVoltageControlIgnoreQPercent = OpenLoadFlowParameters.REMOTE_VOLTAGE_CONTROL_IGNORE_QPERCENT_DEFAULT_VALUE;
158+
157159
public LfNetworkParameters() {
158160
}
159161

@@ -201,6 +203,7 @@ public LfNetworkParameters(LfNetworkParameters other) {
201203
this.areaInterchangeControl = other.areaInterchangeControl;
202204
this.areaInterchangeControlAreaType = other.areaInterchangeControlAreaType;
203205
this.forceTargetQInReactiveLimits = other.forceTargetQInReactiveLimits;
206+
this.remoteVoltageControlIgnoreQPercent = other.remoteVoltageControlIgnoreQPercent;
204207
}
205208

206209
public SlackBusSelector getSlackBusSelector() {
@@ -622,6 +625,15 @@ public LfNetworkParameters setDisableInconsistentVoltageControls(boolean disable
622625
return this;
623626
}
624627

628+
public boolean isRemoteVoltageControlIgnoreQPercent() {
629+
return remoteVoltageControlIgnoreQPercent;
630+
}
631+
632+
public LfNetworkParameters setRemoteVoltageControlIgnoreQPercent(boolean remoteVoltageControlIgnoreQPercent) {
633+
this.remoteVoltageControlIgnoreQPercent = remoteVoltageControlIgnoreQPercent;
634+
return this;
635+
}
636+
625637
@Override
626638
public String toString() {
627639
return "LfNetworkParameters(" +
@@ -665,6 +677,7 @@ public String toString() {
665677
", areaInterchangeControlAreaType=" + areaInterchangeControlAreaType +
666678
", forceTargetQInReactiveLimits=" + forceTargetQInReactiveLimits +
667679
", disableInconsistentVoltageControls=" + disableInconsistentVoltageControls +
680+
", ignoreQPercent=" + remoteVoltageControlIgnoreQPercent +
668681
')';
669682
}
670683
}

0 commit comments

Comments
 (0)