From 33dd63ba46473442ddf0a6852d5b3aa9d083a754 Mon Sep 17 00:00:00 2001 From: David SARTORI Date: Wed, 24 Jan 2024 20:53:38 +0100 Subject: [PATCH 1/3] Fixed bug when adding new modification point for batteries and generators --- .../modifications/BatteryModification.java | 17 ++++--- .../modifications/GeneratorModification.java | 28 ++++++++---- .../modifications/ModificationUtils.java | 45 +++++++++++-------- 3 files changed, 57 insertions(+), 33 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/server/modifications/BatteryModification.java b/src/main/java/org/gridsuite/modification/server/modifications/BatteryModification.java index 065f5354b..73fb49b48 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/BatteryModification.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/BatteryModification.java @@ -9,16 +9,21 @@ import com.powsybl.commons.reporter.Report; import com.powsybl.commons.reporter.Reporter; import com.powsybl.commons.reporter.TypedValue; -import com.powsybl.iidm.network.*; +import com.powsybl.iidm.network.Battery; +import com.powsybl.iidm.network.MinMaxReactiveLimits; +import com.powsybl.iidm.network.MinMaxReactiveLimitsAdder; +import com.powsybl.iidm.network.Network; +import com.powsybl.iidm.network.ReactiveCapabilityCurve; +import com.powsybl.iidm.network.ReactiveCapabilityCurveAdder; +import com.powsybl.iidm.network.ReactiveLimits; +import com.powsybl.iidm.network.ReactiveLimitsKind; import com.powsybl.iidm.network.extensions.ActivePowerControl; import com.powsybl.iidm.network.extensions.ActivePowerControlAdder; import com.powsybl.network.store.iidm.impl.MinMaxReactiveLimitsImpl; import org.gridsuite.modification.server.NetworkModificationException; import org.gridsuite.modification.server.dto.BatteryModificationInfos; import org.gridsuite.modification.server.dto.ReactiveCapabilityCurveModificationInfos; -import org.springframework.util.CollectionUtils; -import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -49,11 +54,9 @@ public void check(Network network) throws NetworkModificationException { MinMaxReactiveLimits minMaxReactiveLimits = battery.getReactiveLimits(MinMaxReactiveLimits.class); ModificationUtils.getInstance().checkMaxReactivePowerGreaterThanMinReactivePower(minMaxReactiveLimits, modificationInfos.getMinimumReactivePower(), modificationInfos.getMaximumReactivePower(), MODIFY_BATTERY_ERROR, errorMessage); } - Collection points = battery.getReactiveLimits().getKind() == ReactiveLimitsKind.CURVE ? battery.getReactiveLimits(ReactiveCapabilityCurve.class).getPoints() : List.of(); - List batteryPoints = new ArrayList<>(points); List modificationPoints = modificationInfos.getReactiveCapabilityCurvePoints(); - if (!CollectionUtils.isEmpty(points) && modificationPoints != null) { - ModificationUtils.getInstance().checkMaxQGreaterThanMinQ(batteryPoints, modificationPoints, MODIFY_BATTERY_ERROR, errorMessage); + if (modificationPoints != null) { + ModificationUtils.getInstance().checkMaxQGreaterThanMinQ(modificationPoints, MODIFY_BATTERY_ERROR, errorMessage); } checkActivePowerZeroOrBetweenMinAndMaxActivePowerBattery(modificationInfos, battery, MODIFY_BATTERY_ERROR, errorMessage); } diff --git a/src/main/java/org/gridsuite/modification/server/modifications/GeneratorModification.java b/src/main/java/org/gridsuite/modification/server/modifications/GeneratorModification.java index 2a34c1bfd..130c30a03 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/GeneratorModification.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/GeneratorModification.java @@ -9,8 +9,23 @@ import com.powsybl.commons.reporter.Report; import com.powsybl.commons.reporter.Reporter; import com.powsybl.commons.reporter.TypedValue; -import com.powsybl.iidm.network.*; -import com.powsybl.iidm.network.extensions.*; +import com.powsybl.iidm.network.Generator; +import com.powsybl.iidm.network.MinMaxReactiveLimits; +import com.powsybl.iidm.network.MinMaxReactiveLimitsAdder; +import com.powsybl.iidm.network.Network; +import com.powsybl.iidm.network.ReactiveCapabilityCurve; +import com.powsybl.iidm.network.ReactiveCapabilityCurveAdder; +import com.powsybl.iidm.network.ReactiveLimits; +import com.powsybl.iidm.network.ReactiveLimitsKind; +import com.powsybl.iidm.network.Terminal; +import com.powsybl.iidm.network.VoltageLevel; +import com.powsybl.iidm.network.extensions.ActivePowerControl; +import com.powsybl.iidm.network.extensions.ActivePowerControlAdder; +import com.powsybl.iidm.network.extensions.CoordinatedReactiveControl; +import com.powsybl.iidm.network.extensions.GeneratorShortCircuit; +import com.powsybl.iidm.network.extensions.GeneratorShortCircuitAdder; +import com.powsybl.iidm.network.extensions.GeneratorStartup; +import com.powsybl.iidm.network.extensions.GeneratorStartupAdder; import com.powsybl.network.store.iidm.impl.MinMaxReactiveLimitsImpl; import com.powsybl.network.store.iidm.impl.extensions.CoordinatedReactiveControlAdderImpl; import org.gridsuite.modification.server.NetworkModificationException; @@ -18,13 +33,12 @@ import org.gridsuite.modification.server.dto.OperationType; import org.gridsuite.modification.server.dto.ReactiveCapabilityCurveModificationInfos; import org.gridsuite.modification.server.dto.VoltageRegulationType; -import org.springframework.util.CollectionUtils; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import static org.gridsuite.modification.server.NetworkModificationException.Type.*; +import static org.gridsuite.modification.server.NetworkModificationException.Type.MODIFY_GENERATOR_ERROR; /** * @author Ayoub Labidi @@ -54,11 +68,9 @@ public void check(Network network) throws NetworkModificationException { ModificationUtils.getInstance().checkMaxReactivePowerGreaterThanMinReactivePower(minMaxReactiveLimits, modificationInfos.getMinimumReactivePower(), modificationInfos.getMaximumReactivePower(), MODIFY_GENERATOR_ERROR, errorMessage); } // check reactive capability curve limits - Collection points = generator.getReactiveLimits().getKind() == ReactiveLimitsKind.CURVE ? generator.getReactiveLimits(ReactiveCapabilityCurve.class).getPoints() : List.of(); - List generatorPoints = new ArrayList<>(points); List modificationPoints = modificationInfos.getReactiveCapabilityCurvePoints(); - if (!CollectionUtils.isEmpty(points) && modificationPoints != null) { - ModificationUtils.getInstance().checkMaxQGreaterThanMinQ(generatorPoints, modificationPoints, MODIFY_GENERATOR_ERROR, errorMessage); + if (modificationPoints != null) { + ModificationUtils.getInstance().checkMaxQGreaterThanMinQ(modificationPoints, MODIFY_GENERATOR_ERROR, errorMessage); } // check regulated terminal if (modificationInfos.getRegulatingTerminalId() != null && modificationInfos.getRegulatingTerminalType() != null && diff --git a/src/main/java/org/gridsuite/modification/server/modifications/ModificationUtils.java b/src/main/java/org/gridsuite/modification/server/modifications/ModificationUtils.java index 53bdc9410..e2522d732 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/ModificationUtils.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/ModificationUtils.java @@ -854,24 +854,33 @@ public Reporter modifyActivePowerControlAttributes(ActivePowerControl activeP return subReporterSetpoints2; } - public void checkMaxQGreaterThanMinQ(List equipmentPoints, List modificationPoints, - NetworkModificationException.Type exceptionType, String errorMessage) { - IntStream.range(0, modificationPoints.size()) - .forEach(i -> { - ReactiveCapabilityCurve.Point oldPoint = equipmentPoints.get(i); - ReactiveCapabilityCurveModificationInfos newPoint = modificationPoints.get(i); - Double oldMaxQ = Double.NaN; - Double oldMinQ = Double.NaN; - if (oldPoint != null) { - oldMaxQ = oldPoint.getMaxQ(); - oldMinQ = oldPoint.getMinQ(); - } - var maxQ = newPoint.getQmaxP() != null ? newPoint.getQmaxP() : oldMaxQ; - var minQ = newPoint.getQminP() != null ? newPoint.getQminP() : oldMinQ; - if (maxQ < minQ) { - throw new NetworkModificationException(exceptionType, errorMessage + "maximum reactive power " + maxQ + " is expected to be greater than or equal to minimum reactive power " + minQ); - } - }); + public void checkMaxQGreaterThanMinQ( + List modificationPoints, + NetworkModificationException.Type exceptionType, String errorMessage + ) { + for (var point : modificationPoints) { + double maxQ = Double.NaN; + double minQ = Double.NaN; + + if (point.getQmaxP() != null) { + maxQ = point.getQmaxP(); + } else if (point.getOldQmaxP() != null) { + maxQ = point.getOldQmaxP(); + } + + if (point.getQminP() != null) { + minQ = point.getQminP(); + } else if (point.getOldQminP() != null) { + minQ = point.getOldQminP(); + } + + if (maxQ < minQ) { + throw new NetworkModificationException( + exceptionType, + errorMessage + "maximum reactive power " + maxQ + " is expected to be greater than or equal to minimum reactive power " + minQ + ); + } + } } public void checkMaxReactivePowerGreaterThanMinReactivePower(MinMaxReactiveLimits minMaxReactiveLimits, AttributeModification minimumReactivePowerInfo, AttributeModification maximumReactivePowerInfo, NetworkModificationException.Type exceptionType, String errorMessage) { From fff322ed322f47628d44f218466ddb74df7874dc Mon Sep 17 00:00:00 2001 From: David SARTORI Date: Thu, 25 Jan 2024 13:03:55 +0100 Subject: [PATCH 2/3] Added tests --- .../modifications/ModificationUtilsTest.java | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 src/test/java/org/gridsuite/modification/server/modifications/ModificationUtilsTest.java diff --git a/src/test/java/org/gridsuite/modification/server/modifications/ModificationUtilsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/ModificationUtilsTest.java new file mode 100644 index 000000000..9a1717867 --- /dev/null +++ b/src/test/java/org/gridsuite/modification/server/modifications/ModificationUtilsTest.java @@ -0,0 +1,76 @@ +/** + * Copyright (c) 2024, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +package org.gridsuite.modification.server.modifications; + +import org.gridsuite.modification.server.NetworkModificationException; +import org.gridsuite.modification.server.dto.ReactiveCapabilityCurveModificationInfos; +import org.junit.jupiter.api.Test; + +import java.util.Collections; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.catchRuntimeException; +import static org.gridsuite.modification.server.NetworkModificationException.Type.MODIFY_GENERATOR_ERROR; + +/** + * @author David SARTORI + */ + +public class ModificationUtilsTest { + + @Test + public void testCheckMaxQGreaterThanMinQ() { + var point1 = ReactiveCapabilityCurveModificationInfos.builder().oldQminP(2.0).oldQmaxP(1.0).qminP(10.0).qmaxP(20.0).build(); + ModificationUtils.getInstance().checkMaxQGreaterThanMinQ( + Collections.singletonList(point1), + MODIFY_GENERATOR_ERROR, + "old KO, new OK: No exception should be thrown"); + + var point2 = ReactiveCapabilityCurveModificationInfos.builder().oldQminP(1.0).oldQmaxP(2.0).qminP(20.0).qmaxP(10.0).build(); + var exception = (NetworkModificationException) catchRuntimeException(() -> ModificationUtils.getInstance().checkMaxQGreaterThanMinQ( + Collections.singletonList(point2), + MODIFY_GENERATOR_ERROR, + "old OK, new KO: ") + ); + assertThat(exception.getType()).isEqualTo(MODIFY_GENERATOR_ERROR); + assertThat(exception) + .hasMessageEndingWith("old OK, new KO: maximum reactive power 10.0 is expected to be greater than or equal to minimum reactive power 20.0"); + + var point3 = ReactiveCapabilityCurveModificationInfos.builder().qminP(20.0).qmaxP(10.0).build(); + exception = (NetworkModificationException) catchRuntimeException(() -> ModificationUtils.getInstance().checkMaxQGreaterThanMinQ( + Collections.singletonList(point3), + MODIFY_GENERATOR_ERROR, + "old null, new KO: ") + ); + assertThat(exception.getType()).isEqualTo(MODIFY_GENERATOR_ERROR); + assertThat(exception) + .hasMessageEndingWith("old null, new KO: maximum reactive power 10.0 is expected to be greater than or equal to minimum reactive power 20.0"); + + var point4 = ReactiveCapabilityCurveModificationInfos.builder().qminP(10.0).qmaxP(20.0).build(); + ModificationUtils.getInstance().checkMaxQGreaterThanMinQ( + Collections.singletonList(point4), + MODIFY_GENERATOR_ERROR, + "old null, new OK: No exception should be thrown"); + + var point5 = ReactiveCapabilityCurveModificationInfos.builder().oldQminP(10.0).oldQmaxP(20.0).build(); + ModificationUtils.getInstance().checkMaxQGreaterThanMinQ( + Collections.singletonList(point5), + MODIFY_GENERATOR_ERROR, + "old OK, new null: No exception should be thrown"); + + var point6 = ReactiveCapabilityCurveModificationInfos.builder().oldQminP(20.0).oldQmaxP(10.0).build(); + exception = (NetworkModificationException) catchRuntimeException(() -> ModificationUtils.getInstance().checkMaxQGreaterThanMinQ( + Collections.singletonList(point6), + MODIFY_GENERATOR_ERROR, + "old KO, new null: ") + ); + assertThat(exception.getType()).isEqualTo(MODIFY_GENERATOR_ERROR); + assertThat(exception) + .hasMessageEndingWith("old KO, new null: maximum reactive power 10.0 is expected to be greater than or equal to minimum reactive power 20.0"); + } +} From 100e3497c638500739bfff3f4d989a73aaf86ea3 Mon Sep 17 00:00:00 2001 From: David SARTORI Date: Mon, 29 Jan 2024 16:40:19 +0100 Subject: [PATCH 3/3] Removed public modifiers from test class --- .../server/modifications/ModificationUtilsTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/gridsuite/modification/server/modifications/ModificationUtilsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/ModificationUtilsTest.java index 9a1717867..fc6060118 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/ModificationUtilsTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/ModificationUtilsTest.java @@ -21,10 +21,10 @@ * @author David SARTORI */ -public class ModificationUtilsTest { +class ModificationUtilsTest { @Test - public void testCheckMaxQGreaterThanMinQ() { + void testCheckMaxQGreaterThanMinQ() { var point1 = ReactiveCapabilityCurveModificationInfos.builder().oldQminP(2.0).oldQmaxP(1.0).qminP(10.0).qmaxP(20.0).build(); ModificationUtils.getInstance().checkMaxQGreaterThanMinQ( Collections.singletonList(point1),