diff --git a/commons/src/main/resources/com/powsybl/dynawo/commons/reports.properties b/commons/src/main/resources/com/powsybl/dynawo/commons/reports.properties index bbcf87fa7..8bd70d3de 100644 --- a/commons/src/main/resources/com/powsybl/dynawo/commons/reports.properties +++ b/commons/src/main/resources/com/powsybl/dynawo/commons/reports.properties @@ -33,6 +33,7 @@ dynawo.dynasim.jsonEventModels = Dynawo Event Models Supplier dynawo.dynasim.lowDynawoVersion = Model version ${modelVersion} is too low for the current dynawo version ${currentVersion} ({$endCauses}) -> model ${modelName} ${dynamicId} will be skipped dynawo.dynasim.modelInstantiation = Model ${modelName} ${dynamicId} instantiation ${state} dynawo.dynasim.modelNotFound = Model ${lib} not found for ${builderName} +dynawo.dynasim.notEnergized = '${fieldName}' field value '${staticId}' should be energized dynawo.dynasim.outputVariableInstantiationError = Output variable ${id} cannot be instantiated dynawo.dynasim.staticIdUnknown = '${fieldName}' field value '${staticId}' not found for equipment type(s) ${equipmentType}, id will be used as pure dynamic model id dynawo.dynasim.unknownIdToDynamic = '${fieldName}' field value '${staticId}' not found for equipment type(s) ${equipmentType} diff --git a/dynawo-algorithms/dynawo-algorithms-commons/src/test/java/com/powsybl/dynawo/algorithms/ContingencyEventModelsTest.java b/dynawo-algorithms/dynawo-algorithms-commons/src/test/java/com/powsybl/dynawo/algorithms/ContingencyEventModelsTest.java index 2742bda5a..49878425d 100644 --- a/dynawo-algorithms/dynawo-algorithms-commons/src/test/java/com/powsybl/dynawo/algorithms/ContingencyEventModelsTest.java +++ b/dynawo-algorithms/dynawo-algorithms-commons/src/test/java/com/powsybl/dynawo/algorithms/ContingencyEventModelsTest.java @@ -31,7 +31,7 @@ class ContingencyEventModelsTest { @Test void test() { - Network network = EurostagTutorialExample1Factory.create(); + Network network = EurostagTutorialExample1Factory.createWithLFResults(); BlackBoxModelSupplier bbmSupplier = BlackBoxModelSupplier.createFrom(List.of( BaseGeneratorBuilder.of(network) .staticId("GEN") diff --git a/dynawo-algorithms/dynawo-margin-calculation/src/test/java/com/powsybl/dynawo/margincalculation/xml/MultiplesJobsXmlTest.java b/dynawo-algorithms/dynawo-margin-calculation/src/test/java/com/powsybl/dynawo/margincalculation/xml/MultiplesJobsXmlTest.java index 9de108cec..f02bf2fdf 100644 --- a/dynawo-algorithms/dynawo-margin-calculation/src/test/java/com/powsybl/dynawo/margincalculation/xml/MultiplesJobsXmlTest.java +++ b/dynawo-algorithms/dynawo-margin-calculation/src/test/java/com/powsybl/dynawo/margincalculation/xml/MultiplesJobsXmlTest.java @@ -21,6 +21,8 @@ import java.util.List; import static com.powsybl.dynawo.algorithms.xml.AlgorithmsConstants.MULTIPLE_JOBS_FILENAME; +import static com.powsybl.iidm.network.test.EurostagTutorialExample1Factory.NGEN; +import static com.powsybl.iidm.network.test.EurostagTutorialExample1Factory.NHV1; /** * @author Laurent Issertial @@ -30,6 +32,18 @@ class MultiplesJobsXmlTest extends AbstractDynamicModelXmlTest { @Override protected void setupNetwork() { network = EurostagTutorialExample1Factory.createWithMultipleConnectedComponents(); + network.getBusBreakerView().getBus(NGEN) + .setV(24.500000610351563) + .setAngle(2.3259763717651367); + network.getBusBreakerView().getBus(NHV1) + .setV(402.1428451538086) + .setAngle(0.0); + network.getBusBreakerView().getBus("NHV2") + .setV(389.9526763916016) + .setAngle(-3.5063576698303223); + network.getBusBreakerView().getBus("NLOAD") + .setV(147.57861328125) + .setAngle(-9.614486694335938); } @Override diff --git a/dynawo-dsl/src/test/java/com/powsybl/dynawo/dsl/EventModelsSupplierTest.java b/dynawo-dsl/src/test/java/com/powsybl/dynawo/dsl/EventModelsSupplierTest.java index 2680507d6..37d959cda 100644 --- a/dynawo-dsl/src/test/java/com/powsybl/dynawo/dsl/EventModelsSupplierTest.java +++ b/dynawo-dsl/src/test/java/com/powsybl/dynawo/dsl/EventModelsSupplierTest.java @@ -14,11 +14,10 @@ import com.powsybl.dynamicsimulation.groovy.GroovyEventModelsSupplier; import com.powsybl.dynamicsimulation.groovy.GroovyExtension; import com.powsybl.dynawo.DynawoSimulationProvider; +import com.powsybl.dynawo.LfResultsUtils; import com.powsybl.dynawo.models.events.*; import com.powsybl.iidm.network.Network; import com.powsybl.iidm.network.test.EurostagTutorialExample1Factory; -import com.powsybl.iidm.network.test.HvdcTestNetwork; -import com.powsybl.iidm.network.test.SvcTestCaseFactory; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -77,38 +76,39 @@ void assertEventModel(AbstractEvent em, String dynamicId, String equipmentStatic private static Stream provideEventModelData() { return Stream.of( - Arguments.of("/eventModels/branchDisconnection.groovy", EventBranchDisconnection.class, EurostagTutorialExample1Factory.create(), "NHV1_NHV2_1", "Disconnect_NHV1_NHV2_1", "EventQuadripoleDisconnection", 4), - Arguments.of("/eventModels/equipmentDisconnection.groovy", EventInjectionDisconnection.class, EurostagTutorialExample1Factory.create(), "GEN", "Disconnect_GEN", null, 1), - Arguments.of("/eventModels/hvdcDisconnection.groovy", EventHvdcDisconnection.class, HvdcTestNetwork.createVsc(), "L", "Disconnect_L", null, 2), - Arguments.of("/eventModels/nodeFault.groovy", NodeFaultEvent.class, EurostagTutorialExample1Factory.create(), "NGEN", "NodeFault_NGEN", "NodeFault", 1), - Arguments.of("/eventModels/step.groovy", EventActivePowerVariation.class, EurostagTutorialExample1Factory.create(), "LOAD", "Step_LOAD", null, 2) + Arguments.of("/eventModels/branchDisconnection.groovy", EventBranchDisconnection.class, EurostagTutorialExample1Factory.createWithLFResults(), "NHV1_NHV2_1", "Disconnect_NHV1_NHV2_1", "EventQuadripoleDisconnection", 4), + Arguments.of("/eventModels/equipmentDisconnection.groovy", EventInjectionDisconnection.class, EurostagTutorialExample1Factory.createWithLFResults(), "GEN", "Disconnect_GEN", null, 1), + Arguments.of("/eventModels/hvdcDisconnection.groovy", EventHvdcDisconnection.class, LfResultsUtils.createHvdcTestNetworkVscWithLFResults(), "L", "Disconnect_L", null, 2), + Arguments.of("/eventModels/nodeFault.groovy", NodeFaultEvent.class, EurostagTutorialExample1Factory.createWithLFResults(), "NGEN", "NodeFault_NGEN", "NodeFault", 1), + Arguments.of("/eventModels/step.groovy", EventActivePowerVariation.class, EurostagTutorialExample1Factory.createWithLFResults(), "LOAD", "Step_LOAD", null, 2) ); } private static Stream provideWarningsModel() { return Stream.of( - Arguments.of("/eventWarnings/missingStaticId.groovy", EurostagTutorialExample1Factory.create(), + Arguments.of("/eventWarnings/missingStaticId.groovy", EurostagTutorialExample1Factory.createWithLFResults(), """ + DSL tests + Groovy Event Models Supplier + Model NodeFault NodeFault_GEN instantiation failed 'staticId' field value 'GEN' not found for equipment type(s) BUS """), - Arguments.of("/eventWarnings/missingStartTime.groovy", EurostagTutorialExample1Factory.create(), + Arguments.of("/eventWarnings/missingStartTime.groovy", EurostagTutorialExample1Factory.createWithLFResults(), """ + DSL tests + Groovy Event Models Supplier + Model NodeFault NodeFault_NGEN instantiation failed 'startTime' field is not set """), - Arguments.of("/eventWarnings/missingNodeFaultParameters.groovy", EurostagTutorialExample1Factory.create(), + Arguments.of("/eventWarnings/missingNodeFaultParameters.groovy", EurostagTutorialExample1Factory.createWithLFResults(), """ + DSL tests + Groovy Event Models Supplier + Model NodeFault NodeFault_NGEN instantiation failed faultTime should be strictly positive (0.0) """), - Arguments.of("/eventWarnings/missingAPVParameters.groovy", SvcTestCaseFactory.create(), + Arguments.of("/eventWarnings/missingAPVParameters.groovy", + LfResultsUtils.createSvcTestCaseWithLFResults(), """ + DSL tests + Groovy Event Models Supplier @@ -116,14 +116,14 @@ faultTime should be strictly positive (0.0) 'staticId' field value 'SVC2' not found for equipment type(s) GENERATOR/LOAD 'deltaP' field is not set """), - Arguments.of("/eventWarnings/missingDisconnectionEquipment.groovy", EurostagTutorialExample1Factory.create(), + Arguments.of("/eventWarnings/missingDisconnectionEquipment.groovy", EurostagTutorialExample1Factory.createWithLFResults(), """ + DSL tests + Groovy Event Models Supplier + Model Disconnect Disconnect_WRONG_ID instantiation failed 'staticId' field value 'WRONG_ID' not found for equipment type(s) Disconnectable equipment """), - Arguments.of("/eventWarnings/missingDisconnectionSide.groovy", EurostagTutorialExample1Factory.create(), + Arguments.of("/eventWarnings/missingDisconnectionSide.groovy", EurostagTutorialExample1Factory.createWithLFResults(), """ + DSL tests + Groovy Event Models Supplier diff --git a/dynawo-simulation/src/main/java/com/powsybl/dynawo/builders/BuilderReports.java b/dynawo-simulation/src/main/java/com/powsybl/dynawo/builders/BuilderReports.java index acb7d7b48..14a5c86ae 100644 --- a/dynawo-simulation/src/main/java/com/powsybl/dynawo/builders/BuilderReports.java +++ b/dynawo-simulation/src/main/java/com/powsybl/dynawo/builders/BuilderReports.java @@ -18,6 +18,7 @@ public final class BuilderReports { private static final String FIELD_NAME = "fieldName"; private static final String EQUIPMENT_TYPE_FIELD = "equipmentType"; + private static final String STATIC_ID = "staticId"; private BuilderReports() { } @@ -79,7 +80,7 @@ public static void reportStaticIdUnknown(ReportNode reportNode, String fieldName .withMessageTemplate("dynawo.dynasim.unknownIdToDynamic") .withUntypedValue(EQUIPMENT_TYPE_FIELD, equipmentType) .withUntypedValue(FIELD_NAME, fieldName) - .withUntypedValue("staticId", staticId) + .withUntypedValue(STATIC_ID, staticId) .withSeverity(TypedValue.WARN_SEVERITY) .add(); } @@ -89,7 +90,7 @@ public static void reportDifferentNetwork(ReportNode reportNode, String fieldNam .withMessageTemplate("dynawo.dynasim.wrongNetwork") .withUntypedValue(EQUIPMENT_TYPE_FIELD, equipmentType) .withUntypedValue(FIELD_NAME, fieldName) - .withUntypedValue("staticId", staticId) + .withUntypedValue(STATIC_ID, staticId) .withSeverity(TypedValue.WARN_SEVERITY) .add(); } @@ -98,7 +99,8 @@ public static void reportUnknownStaticIdHandling(ReportNode reportNode, String f reportNode.newReportNode() .withMessageTemplate("dynawo.dynasim.staticIdUnknown") .withUntypedValue(EQUIPMENT_TYPE_FIELD, equipmentType) - .withUntypedValue(FIELD_NAME, fieldName).withUntypedValue("staticId", staticId) + .withUntypedValue(FIELD_NAME, fieldName) + .withUntypedValue(STATIC_ID, staticId) .withSeverity(TypedValue.INFO_SEVERITY) .add(); } @@ -148,4 +150,13 @@ public static void reportFieldConflict(ReportNode reportNode, String firstFieldN .withSeverity(TypedValue.TRACE_SEVERITY) .add(); } + + public static void reportNotEnergized(ReportNode reportNode, String fieldName, String staticId) { + reportNode.newReportNode() + .withMessageTemplate("dynawo.dynasim.notEnergized") + .withUntypedValue(FIELD_NAME, fieldName) + .withTypedValue(STATIC_ID, staticId, TypedValue.ID) + .withSeverity(TypedValue.WARN_SEVERITY) + .add(); + } } diff --git a/dynawo-simulation/src/main/java/com/powsybl/dynawo/builders/BuildersUtil.java b/dynawo-simulation/src/main/java/com/powsybl/dynawo/builders/BuildersUtil.java index abf527433..fa7a6e3a7 100644 --- a/dynawo-simulation/src/main/java/com/powsybl/dynawo/builders/BuildersUtil.java +++ b/dynawo-simulation/src/main/java/com/powsybl/dynawo/builders/BuildersUtil.java @@ -9,6 +9,8 @@ import com.powsybl.iidm.network.*; +import static com.powsybl.dynawo.models.utils.EnergizedUtils.isEnergized; + /** * @author Laurent Issertial {@literal } */ @@ -29,18 +31,9 @@ private BuildersUtil() { public static Identifiable getActionConnectionPoint(Network network, String staticId) { BusbarSection busbarSection = network.getBusbarSection(staticId); if (busbarSection != null) { - return isEnergizedBus(busbarSection.getTerminal().getBusBreakerView().getBus()) ? busbarSection : null; + return isEnergized(busbarSection) ? busbarSection : null; } Bus bus = network.getBusBreakerView().getBus(staticId); - return isEnergizedBus(bus) ? bus : null; - } - - /** - * Verifies a bus is energized and in main connected component - * @param bus the reviewed bus - * @return true if energized, false if not - */ - private static boolean isEnergizedBus(Bus bus) { - return bus != null && !Double.isNaN(bus.getV()) && bus.isInMainConnectedComponent(); + return isEnergized(bus) ? bus : null; } } diff --git a/dynawo-simulation/src/main/java/com/powsybl/dynawo/models/events/EventDisconnectionBuilder.java b/dynawo-simulation/src/main/java/com/powsybl/dynawo/models/events/EventDisconnectionBuilder.java index e1ae2b6f1..66567226c 100644 --- a/dynawo-simulation/src/main/java/com/powsybl/dynawo/models/events/EventDisconnectionBuilder.java +++ b/dynawo-simulation/src/main/java/com/powsybl/dynawo/models/events/EventDisconnectionBuilder.java @@ -8,11 +8,9 @@ package com.powsybl.dynawo.models.events; import com.powsybl.commons.report.ReportNode; -import com.powsybl.dynawo.builders.BuilderEquipment; -import com.powsybl.dynawo.builders.BuilderReports; -import com.powsybl.dynawo.builders.EventModelInfo; -import com.powsybl.dynawo.builders.ModelInfo; +import com.powsybl.dynawo.builders.*; import com.powsybl.dynawo.commons.DynawoVersion; +import com.powsybl.dynawo.models.utils.EnergizedUtils; import com.powsybl.iidm.network.*; /** @@ -86,17 +84,46 @@ protected void checkData() { super.checkData(); if (builderEquipment.hasEquipment()) { setDisconnectionType(builderEquipment.getEquipment().getType()); - if (disconnectionType == DisconnectionType.NONE) { - BuilderReports.reportStaticIdUnknown(reportNode, "staticId", builderEquipment.getStaticId(), "Disconnectable equipment"); - isInstantiable = false; - } - if ((DisconnectionType.INJECTION == disconnectionType || DisconnectionType.BUS == disconnectionType) && disconnectSide != null) { - BuilderReports.reportFieldSetWithWrongEquipment(reportNode, "disconnectOnly", builderEquipment.getEquipment().getType(), builderEquipment.getStaticId()); - isInstantiable = false; + switch (disconnectionType) { + case BUS -> { + Bus bus = (Bus) builderEquipment.getEquipment(); + handleNotEnergized(EnergizedUtils.isEnergized(bus)); + if (disconnectSide != null) { + BuilderReports.reportFieldSetWithWrongEquipment(reportNode, "disconnectOnly", bus.getType(), bus.getId()); + isInstantiable = false; + } + } + case INJECTION -> { + Injection injection = (Injection) builderEquipment.getEquipment(); + handleNotEnergized(EnergizedUtils.isEnergized(injection)); + if (disconnectSide != null) { + BuilderReports.reportFieldSetWithWrongEquipment(reportNode, "disconnectOnly", injection.getType(), injection.getId()); + isInstantiable = false; + } + } + case BRANCH -> { + Branch branch = (Branch) builderEquipment.getEquipment(); + handleNotEnergized(disconnectSide != null ? EnergizedUtils.isEnergized(branch, disconnectSide) : EnergizedUtils.isEnergized(branch)); + } + case HVDC -> { + HvdcLine hvdcLine = (HvdcLine) builderEquipment.getEquipment(); + handleNotEnergized(disconnectSide != null ? EnergizedUtils.isEnergized(hvdcLine, disconnectSide) : EnergizedUtils.isEnergized(hvdcLine)); + } + case NONE -> { + BuilderReports.reportStaticIdUnknown(reportNode, "staticId", builderEquipment.getStaticId(), "Disconnectable equipment"); + isInstantiable = false; + } } } } + private void handleNotEnergized(boolean isEnergized) { + if (!isEnergized) { + BuilderReports.reportNotEnergized(reportNode, "staticId", builderEquipment.getStaticId()); + isInstantiable = false; + } + } + @Override public AbstractEvent build() { if (isInstantiable()) { diff --git a/dynawo-simulation/src/main/java/com/powsybl/dynawo/models/utils/EnergizedUtils.java b/dynawo-simulation/src/main/java/com/powsybl/dynawo/models/utils/EnergizedUtils.java new file mode 100644 index 000000000..75ed994d5 --- /dev/null +++ b/dynawo-simulation/src/main/java/com/powsybl/dynawo/models/utils/EnergizedUtils.java @@ -0,0 +1,58 @@ +/** + * Copyright (c) 2025, 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/. + * SPDX-License-Identifier: MPL-2.0 + */ +package com.powsybl.dynawo.models.utils; + +import com.powsybl.iidm.network.*; + +/** + * Verifies na equipment terminal(s) are connected and the relates buses are energized and in main connected component + * @author Laurent Issertial {@literal } + */ +public final class EnergizedUtils { + + private EnergizedUtils() { + } + + public static boolean isEnergized(Injection equipment) { + return isEnergized(equipment.getTerminal()); + } + + public static boolean isEnergized(Branch equipment) { + return isEnergized(equipment.getTerminal1()) && isEnergized(equipment.getTerminal2()); + } + + public static boolean isEnergized(Branch equipment, TwoSides side) { + return TwoSides.ONE == side ? isEnergized(equipment.getTerminal1()) : isEnergized(equipment.getTerminal2()); + } + + public static boolean isEnergized(HvdcLine equipment) { + return isEnergized(equipment.getConverterStation1().getTerminal()) + && isEnergized(equipment.getConverterStation1().getTerminal()); + } + + public static boolean isEnergized(HvdcLine equipment, TwoSides side) { + return TwoSides.ONE == side ? isEnergized(equipment.getConverterStation1().getTerminal()) + : isEnergized(equipment.getConverterStation2().getTerminal()); + } + + public static boolean isEnergized(Terminal terminal) { + if (!terminal.isConnected()) { + return false; + } + return isEnergized(terminal.getBusBreakerView().getBus()); + } + + /** + * Verifies a bus is energized and in main connected component + * @param bus the reviewed bus + * @return true if energized, false if not + */ + public static boolean isEnergized(Bus bus) { + return bus != null && !Double.isNaN(bus.getV()) && bus.isInMainConnectedComponent(); + } +} diff --git a/dynawo-simulation/src/test/java/com/powsybl/dynawo/LfResultsUtils.java b/dynawo-simulation/src/test/java/com/powsybl/dynawo/LfResultsUtils.java new file mode 100644 index 000000000..1fbb561ab --- /dev/null +++ b/dynawo-simulation/src/test/java/com/powsybl/dynawo/LfResultsUtils.java @@ -0,0 +1,34 @@ +/** + * Copyright (c) 2025, 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/. + * SPDX-License-Identifier: MPL-2.0 + */ +package com.powsybl.dynawo; + +import com.powsybl.iidm.network.Network; +import com.powsybl.iidm.network.test.HvdcTestNetwork; +import com.powsybl.iidm.network.test.SvcTestCaseFactory; + +/** + * @author Laurent Issertial {@literal } + */ +public final class LfResultsUtils { + + private LfResultsUtils() { + } + + public static Network createSvcTestCaseWithLFResults() { + Network network = SvcTestCaseFactory.create(); + network.getBusBreakerView().getBuses().forEach(b -> b.setV(400).setAngle(0)); + return network; + } + + public static Network createHvdcTestNetworkVscWithLFResults() { + Network network = HvdcTestNetwork.createVsc(); + network.getBusBreakerView().getBus("B1").setV(400).setAngle(0); + network.getVoltageLevel("VL2").getBusView().getBuses().forEach(b -> b.setV(400).setAngle(0)); + return network; + } +} diff --git a/dynawo-simulation/src/test/java/com/powsybl/dynawo/suppliers/DynawoEventModelsSupplierTest.java b/dynawo-simulation/src/test/java/com/powsybl/dynawo/suppliers/DynawoEventModelsSupplierTest.java index 4f0ec077f..06a968d65 100644 --- a/dynawo-simulation/src/test/java/com/powsybl/dynawo/suppliers/DynawoEventModelsSupplierTest.java +++ b/dynawo-simulation/src/test/java/com/powsybl/dynawo/suppliers/DynawoEventModelsSupplierTest.java @@ -38,7 +38,7 @@ class DynawoEventModelsSupplierTest { @Test void testEventSupplier() { - Network network = EurostagTutorialExample1Factory.create(); + Network network = EurostagTutorialExample1Factory.createWithLFResults(); List eventModelConfigList = getEventConfigs(); List events = new DynawoEventModelsSupplier(eventModelConfigList).get(network, ReportNode.NO_OP); diff --git a/dynawo-simulation/src/test/java/com/powsybl/dynawo/xml/DisconnectBranchEventXmlTest.java b/dynawo-simulation/src/test/java/com/powsybl/dynawo/xml/DisconnectBranchEventXmlTest.java index 519a2f54f..e11fd9e28 100644 --- a/dynawo-simulation/src/test/java/com/powsybl/dynawo/xml/DisconnectBranchEventXmlTest.java +++ b/dynawo-simulation/src/test/java/com/powsybl/dynawo/xml/DisconnectBranchEventXmlTest.java @@ -23,7 +23,7 @@ class DisconnectBranchEventXmlTest extends AbstractDynamicModelXmlTest { @Override protected void setupNetwork() { - network = EurostagTutorialExample1Factory.create(); + network = EurostagTutorialExample1Factory.createWithLFResults(); } @Override diff --git a/dynawo-simulation/src/test/java/com/powsybl/dynawo/xml/DisconnectBusEventXmlTest.java b/dynawo-simulation/src/test/java/com/powsybl/dynawo/xml/DisconnectBusEventXmlTest.java index 35453c756..de8ad11ce 100644 --- a/dynawo-simulation/src/test/java/com/powsybl/dynawo/xml/DisconnectBusEventXmlTest.java +++ b/dynawo-simulation/src/test/java/com/powsybl/dynawo/xml/DisconnectBusEventXmlTest.java @@ -8,8 +8,8 @@ package com.powsybl.dynawo.xml; import com.powsybl.dynawo.DynawoSimulationConstants; +import com.powsybl.dynawo.LfResultsUtils; import com.powsybl.dynawo.models.events.EventDisconnectionBuilder; -import com.powsybl.iidm.network.test.SvcTestCaseFactory; import org.junit.jupiter.api.Test; import org.xml.sax.SAXException; @@ -22,7 +22,7 @@ class DisconnectBusEventXmlTest extends AbstractDynamicModelXmlTest { @Override protected void setupNetwork() { - network = SvcTestCaseFactory.create(); + network = LfResultsUtils.createSvcTestCaseWithLFResults(); } @Override diff --git a/dynawo-simulation/src/test/java/com/powsybl/dynawo/xml/DisconnectDynamicBusEventXmlTest.java b/dynawo-simulation/src/test/java/com/powsybl/dynawo/xml/DisconnectDynamicBusEventXmlTest.java index ca5a65b98..edb9b63a6 100644 --- a/dynawo-simulation/src/test/java/com/powsybl/dynawo/xml/DisconnectDynamicBusEventXmlTest.java +++ b/dynawo-simulation/src/test/java/com/powsybl/dynawo/xml/DisconnectDynamicBusEventXmlTest.java @@ -8,11 +8,11 @@ package com.powsybl.dynawo.xml; import com.powsybl.dynawo.DynawoSimulationConstants; +import com.powsybl.dynawo.LfResultsUtils; import com.powsybl.dynawo.models.buses.StandardBusBuilder; import com.powsybl.dynawo.models.events.EventDisconnectionBuilder; import com.powsybl.dynawo.models.generators.BaseGeneratorBuilder; import com.powsybl.dynawo.models.lines.LineBuilder; -import com.powsybl.iidm.network.test.SvcTestCaseFactory; import org.junit.jupiter.api.Test; import org.xml.sax.SAXException; @@ -25,7 +25,7 @@ class DisconnectDynamicBusEventXmlTest extends AbstractDynamicModelXmlTest { @Override protected void setupNetwork() { - network = SvcTestCaseFactory.create(); + network = LfResultsUtils.createSvcTestCaseWithLFResults(); } @Override diff --git a/dynawo-simulation/src/test/java/com/powsybl/dynawo/xml/DisconnectEventXmlTest.java b/dynawo-simulation/src/test/java/com/powsybl/dynawo/xml/DisconnectEventXmlTest.java index 94be21006..b676af4bb 100644 --- a/dynawo-simulation/src/test/java/com/powsybl/dynawo/xml/DisconnectEventXmlTest.java +++ b/dynawo-simulation/src/test/java/com/powsybl/dynawo/xml/DisconnectEventXmlTest.java @@ -29,6 +29,8 @@ protected void setupNetwork() { network = SvcTestCaseFactory.create(); VoltageLevel vl = network.getVoltageLevel("VL1"); Bus b = vl.getBusBreakerView().getBus("B1"); + b.setV(400).setAngle(0); + network.getBusBreakerView().getBus("B2").setV(400).setAngle(0); vl.newShuntCompensator() .setId("SH1") .setConnectableBus(b.getId()) diff --git a/dynawo-simulation/src/test/java/com/powsybl/dynawo/xml/DisconnectHvdcEventXmlTest.java b/dynawo-simulation/src/test/java/com/powsybl/dynawo/xml/DisconnectHvdcEventXmlTest.java index c8c052875..380035f46 100644 --- a/dynawo-simulation/src/test/java/com/powsybl/dynawo/xml/DisconnectHvdcEventXmlTest.java +++ b/dynawo-simulation/src/test/java/com/powsybl/dynawo/xml/DisconnectHvdcEventXmlTest.java @@ -8,13 +8,13 @@ package com.powsybl.dynawo.xml; import com.powsybl.dynawo.DynawoSimulationConstants; +import com.powsybl.dynawo.LfResultsUtils; import com.powsybl.dynawo.models.events.EventDisconnectionBuilder; import com.powsybl.dynawo.models.hvdc.HvdcPBuilder; import com.powsybl.dynawo.models.hvdc.HvdcVscBuilder; import com.powsybl.dynawo.models.BlackBoxModel; import com.powsybl.iidm.network.Network; import com.powsybl.iidm.network.TwoSides; -import com.powsybl.iidm.network.test.HvdcTestNetwork; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; @@ -42,7 +42,7 @@ void setup(String dydName, Function< Network, BlackBoxModel> hvdcConstructor, Fu } protected void setupNetwork() { - network = HvdcTestNetwork.createVsc(); + network = LfResultsUtils.createHvdcTestNetworkVscWithLFResults(); } protected void addDynamicModels(Function< Network, BlackBoxModel> hvdcConstructor, Function< Network, BlackBoxModel> disconnectConstructor) { diff --git a/dynawo-simulation/src/test/java/com/powsybl/dynawo/xml/DisconnectionExceptionXmlTest.java b/dynawo-simulation/src/test/java/com/powsybl/dynawo/xml/DisconnectionExceptionXmlTest.java index 6e989640e..9e31d083d 100644 --- a/dynawo-simulation/src/test/java/com/powsybl/dynawo/xml/DisconnectionExceptionXmlTest.java +++ b/dynawo-simulation/src/test/java/com/powsybl/dynawo/xml/DisconnectionExceptionXmlTest.java @@ -8,13 +8,13 @@ package com.powsybl.dynawo.xml; import com.powsybl.commons.PowsyblException; +import com.powsybl.dynawo.LfResultsUtils; import com.powsybl.dynawo.models.BlackBoxModel; import com.powsybl.dynawo.models.events.EventDisconnectionBuilder; import com.powsybl.dynawo.models.hvdc.HvdcPBuilder; import com.powsybl.dynawo.models.hvdc.HvdcVscBuilder; import com.powsybl.iidm.network.Network; import com.powsybl.iidm.network.TwoSides; -import com.powsybl.iidm.network.test.HvdcTestNetwork; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; @@ -40,7 +40,7 @@ void setup(String exception, TwoSides side, BiFunction constructor) { diff --git a/dynawo-simulation/src/test/java/com/powsybl/dynawo/xml/DynawoTestUtil.java b/dynawo-simulation/src/test/java/com/powsybl/dynawo/xml/DynawoTestUtil.java index 5e10aabdd..40936097d 100644 --- a/dynawo-simulation/src/test/java/com/powsybl/dynawo/xml/DynawoTestUtil.java +++ b/dynawo-simulation/src/test/java/com/powsybl/dynawo/xml/DynawoTestUtil.java @@ -165,7 +165,7 @@ public void validate(String schemaDefinition, String expectedResourceName, Path } private static Network createEurostagTutorialExample1WithMoreLoads() { - Network network = EurostagTutorialExample1Factory.create(NetworkFactory.findDefault()); + Network network = EurostagTutorialExample1Factory.createWithLFResults(); VoltageLevel vlload = network.getVoltageLevel("VLLOAD"); Bus nload = vlload.getBusBreakerView().getBus("NLOAD"); diff --git a/dynawo-simulation/src/test/java/com/powsybl/dynawo/xml/NotEnergizedDisconnectEventTest.java b/dynawo-simulation/src/test/java/com/powsybl/dynawo/xml/NotEnergizedDisconnectEventTest.java new file mode 100644 index 000000000..718300e69 --- /dev/null +++ b/dynawo-simulation/src/test/java/com/powsybl/dynawo/xml/NotEnergizedDisconnectEventTest.java @@ -0,0 +1,79 @@ +/** + * Copyright (c) 2025, 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/. + * SPDX-License-Identifier: MPL-2.0 + */ +package com.powsybl.dynawo.xml; + +import com.powsybl.dynawo.models.BlackBoxModel; +import com.powsybl.dynawo.models.events.EventDisconnectionBuilder; +import com.powsybl.iidm.network.Network; +import com.powsybl.iidm.network.TwoSides; +import com.powsybl.iidm.network.test.EurostagTutorialExample1Factory; +import com.powsybl.iidm.network.test.HvdcTestNetwork; +import org.junit.jupiter.api.Test; + +import static com.powsybl.iidm.network.test.EurostagTutorialExample1Factory.NGEN; +import static com.powsybl.iidm.network.test.EurostagTutorialExample1Factory.NHV1_NHV2_1; +import static org.junit.jupiter.api.Assertions.assertNull; + +/** + * @author Laurent Issertial {@literal } + */ +class NotEnergizedDisconnectEventTest { + + @Test + void testBus() { + Network network = EurostagTutorialExample1Factory.create(); + BlackBoxModel nullEvent = EventDisconnectionBuilder.of(network) + .staticId(NGEN) + .startTime(5) + .build(); + assertNull(nullEvent); + } + + @Test + void testInjection() { + Network network = EurostagTutorialExample1Factory.create(); + network.getGenerator("GEN").disconnect(); + BlackBoxModel nullEvent = EventDisconnectionBuilder.of(network) + .staticId("GEN") + .startTime(5) + .build(); + assertNull(nullEvent); + } + + @Test + void testBranch() { + Network network = EurostagTutorialExample1Factory.create(); + BlackBoxModel nullEvent = EventDisconnectionBuilder.of(network) + .staticId(NHV1_NHV2_1) + .startTime(5) + .build(); + assertNull(nullEvent); + nullEvent = EventDisconnectionBuilder.of(network) + .staticId(NHV1_NHV2_1) + .disconnectOnly(TwoSides.TWO) + .startTime(5) + .build(); + assertNull(nullEvent); + } + + @Test + void testHvdc() { + Network network = HvdcTestNetwork.createVsc(); + BlackBoxModel nullEvent = EventDisconnectionBuilder.of(network) + .staticId("L") + .startTime(5) + .build(); + assertNull(nullEvent); + nullEvent = EventDisconnectionBuilder.of(network) + .staticId("L") + .disconnectOnly(TwoSides.TWO) + .startTime(5) + .build(); + assertNull(nullEvent); + } +}