From 1cb3c1872d30ace644243353f5345d27ea39b014 Mon Sep 17 00:00:00 2001 From: Lisrte <123391009+Lisrte@users.noreply.github.com> Date: Fri, 21 Apr 2023 16:14:41 +0200 Subject: [PATCH] Refactor disconnection events (#197) * Create Event disconnection in DSL with EventInjectionDisconnection and EventQuadripoleDisconnection * Add default model and quadripole disconnection for Transformer * Add disconnection UT * Handle default & dynamic model disconnection * Add default model Load * Add default model generator * Merge equipment and quadripole equipment disconnection event in DSL * Refactor event constructor Signed-off-by: lisrte --- .../AbstractPureDynamicGroovyExtension.groovy | 5 +- .../events/AbstractEventModelBuilder.groovy | 10 +- .../EventDisconnectionGroovyExtension.groovy | 94 +++++++++++++++++++ ...dripoleDisconnectionGroovyExtension.groovy | 51 ---------- ...EventSetPointBooleanGroovyExtension.groovy | 46 --------- ...urrentLimitAutomatonGroovyExtension.groovy | 3 +- .../dsl/EventModelsSupplierTest.java | 10 +- .../src/test/resources/eventModels.groovy | 8 +- ...n.groovy => equipmentDisconnection.groovy} | 4 +- .../quadripoleDisconnection.groovy | 8 +- .../config/models.par | 2 +- .../dynawaltz-inputs/ieee14bus.par | 2 +- .../dynawaltz-inputs/models.par | 2 +- .../dynawaltz-inputs/powsybl_dynawaltz.dyd | 4 +- .../powsybl-inputs/eventModels.groovy | 8 +- .../ieee14-disconnectline/config/models.par | 2 +- .../dynawaltz-inputs/ieee14bus.par | 2 +- .../dynawaltz-inputs/models.par | 2 +- .../dynawaltz-inputs/powsybl_dynawaltz.dyd | 4 +- .../powsybl-inputs/eventModels.groovy | 17 +--- .../config/models.par | 2 +- .../dynawaltz-inputs/ieee57bus.par | 2 +- .../dynawaltz-inputs/models.par | 2 +- .../dynawaltz-inputs/powsybl_dynawaltz.dyd | 6 +- .../powsybl-inputs/eventModels.groovy | 4 +- .../powsybl/dynawaltz/DynaWaltzContext.java | 14 ++- .../models/AbstractBlackBoxModel.java | 7 ++ .../AbstractPureDynamicBlackBoxModel.java | 4 + .../dynawaltz/models/NetworkModel.java | 39 +++++++- .../models/events/AbstractEventModel.java | 18 ++-- .../events/DisconnectableEquipment.java | 17 ++++ .../events/EventInjectionDisconnection.java | 81 ++++++++++++++++ .../events/EventQuadripoleDisconnection.java | 17 ++-- .../models/events/EventSetPointBoolean.java | 51 ---------- .../QuadripoleDisconnectableEquipment.java | 18 ++++ .../generators/AbstractGeneratorModel.java | 18 ++-- .../generators/DefaultGeneratorModel.java | 40 ++++++++ .../models/generators/GeneratorModel.java | 14 +-- .../generators/GeneratorSynchronousModel.java | 1 + .../generators/OmegaRefGeneratorModel.java | 8 ++ .../models/lines/DefaultLineModel.java | 8 +- .../dynawaltz/models/lines/StandardLine.java | 8 +- .../dynawaltz/models/loads/AbstractLoad.java | 12 ++- .../models/loads/DefaultLoadModel.java | 35 +++++++ .../dynawaltz/models/loads/LoadModel.java | 17 ++++ .../transformers/DefaultTransformerModel.java | 36 +++++++ .../transformers/TransformerFixedRatio.java | 13 ++- .../models/transformers/TransformerModel.java | 19 ++++ .../xml/AbstractDynamicModelXmlTest.java | 2 +- .../dynawaltz/xml/DisconnectEventXmlTest.java | 43 +++++++++ .../xml/DisconnectQuadripoleEventXmlTest.java | 41 ++++++++ .../dynawaltz/xml/DynaWaltzTestUtil.java | 6 +- .../dynawaltz/xml/DynamicModelsXmlTest.java | 24 ++++- .../powsybl/dynawaltz/xml/EventXmlTest.java | 14 ++- .../src/test/resources/disconnect_dyd.xml | 26 +++++ .../src/test/resources/disconnect_par.xml | 11 +++ .../resources/disconnect_quadripole_dyd.xml | 13 +++ .../resources/disconnect_quadripole_par.xml | 13 +++ dynawaltz/src/test/resources/events.xml | 14 +-- dynawaltz/src/test/resources/omega_ref.xml | 6 +- .../ieee14/disconnectline/eventModels.groovy | 17 +--- .../ieee14/disconnectline/models.par | 2 +- 62 files changed, 740 insertions(+), 287 deletions(-) create mode 100644 dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/events/EventDisconnectionGroovyExtension.groovy delete mode 100644 dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/events/EventQuadripoleDisconnectionGroovyExtension.groovy delete mode 100644 dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/events/EventSetPointBooleanGroovyExtension.groovy rename dynawaltz-dsl/src/test/resources/eventModels/{setPointBoolean.groovy => equipmentDisconnection.groovy} (83%) create mode 100644 dynawaltz/src/main/java/com/powsybl/dynawaltz/models/events/DisconnectableEquipment.java create mode 100644 dynawaltz/src/main/java/com/powsybl/dynawaltz/models/events/EventInjectionDisconnection.java delete mode 100644 dynawaltz/src/main/java/com/powsybl/dynawaltz/models/events/EventSetPointBoolean.java create mode 100644 dynawaltz/src/main/java/com/powsybl/dynawaltz/models/events/QuadripoleDisconnectableEquipment.java create mode 100644 dynawaltz/src/main/java/com/powsybl/dynawaltz/models/generators/DefaultGeneratorModel.java create mode 100644 dynawaltz/src/main/java/com/powsybl/dynawaltz/models/loads/DefaultLoadModel.java create mode 100644 dynawaltz/src/main/java/com/powsybl/dynawaltz/models/loads/LoadModel.java create mode 100644 dynawaltz/src/main/java/com/powsybl/dynawaltz/models/transformers/DefaultTransformerModel.java create mode 100644 dynawaltz/src/main/java/com/powsybl/dynawaltz/models/transformers/TransformerModel.java create mode 100644 dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/DisconnectEventXmlTest.java create mode 100644 dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/DisconnectQuadripoleEventXmlTest.java create mode 100644 dynawaltz/src/test/resources/disconnect_dyd.xml create mode 100644 dynawaltz/src/test/resources/disconnect_par.xml create mode 100644 dynawaltz/src/test/resources/disconnect_quadripole_dyd.xml create mode 100644 dynawaltz/src/test/resources/disconnect_quadripole_par.xml diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/AbstractPureDynamicGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/AbstractPureDynamicGroovyExtension.groovy index 72b58daed..b4a3b4f31 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/AbstractPureDynamicGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/AbstractPureDynamicGroovyExtension.groovy @@ -9,6 +9,7 @@ package com.powsybl.dynawaltz.dsl import com.powsybl.dynawaltz.DynaWaltzProvider +import com.powsybl.iidm.network.Network import java.util.function.Consumer @@ -19,7 +20,7 @@ abstract class AbstractPureDynamicGroovyExtension { protected List modelTags - abstract protected ModelBuilder createBuilder(); + abstract protected ModelBuilder createBuilder(Network network); String getName() { return DynaWaltzProvider.NAME @@ -29,7 +30,7 @@ abstract class AbstractPureDynamicGroovyExtension { modelTags.forEach { binding.setVariable(it, { Closure closure -> def cloned = closure.clone() - ModelBuilder builder = createBuilder() + ModelBuilder builder = createBuilder(binding.getVariable("network") as Network) cloned.delegate = builder cloned() consumer.accept(builder.build()) diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/events/AbstractEventModelBuilder.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/events/AbstractEventModelBuilder.groovy index 4b158f0af..6d18feb89 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/events/AbstractEventModelBuilder.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/events/AbstractEventModelBuilder.groovy @@ -11,18 +11,19 @@ package com.powsybl.dynawaltz.dsl.events import com.powsybl.dsl.DslException import com.powsybl.dynamicsimulation.EventModel import com.powsybl.dynawaltz.dsl.ModelBuilder +import com.powsybl.iidm.network.Network /** * @author Laurent Issertial */ abstract class AbstractEventModelBuilder implements ModelBuilder { - String eventModelId + Network network String staticId double startTime - void eventModelId(String eventModelId) { - this.eventModelId = eventModelId + AbstractEventModelBuilder(Network network) { + this.network = network } void staticId(String staticId) { @@ -40,9 +41,6 @@ abstract class AbstractEventModelBuilder implements ModelBuilder { if (!startTime) { throw new DslException("'startTime' field is not set") } - if (!eventModelId) { - eventModelId = staticId - } } @Override diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/events/EventDisconnectionGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/events/EventDisconnectionGroovyExtension.groovy new file mode 100644 index 000000000..12f8d09d0 --- /dev/null +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/events/EventDisconnectionGroovyExtension.groovy @@ -0,0 +1,94 @@ +/** + * Copyright (c) 2023, 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.dynawaltz.dsl.events + +import com.google.auto.service.AutoService +import com.powsybl.dsl.DslException +import com.powsybl.dynamicsimulation.EventModel +import com.powsybl.dynamicsimulation.groovy.EventModelGroovyExtension +import com.powsybl.dynawaltz.dsl.AbstractPureDynamicGroovyExtension +import com.powsybl.dynawaltz.models.events.AbstractEventModel +import com.powsybl.dynawaltz.models.events.EventQuadripoleDisconnection +import com.powsybl.dynawaltz.models.events.EventInjectionDisconnection +import com.powsybl.iidm.network.Branch +import com.powsybl.iidm.network.Identifiable +import com.powsybl.iidm.network.IdentifiableType +import com.powsybl.iidm.network.Network + +/** + * @author Laurent Issertial + */ +@AutoService(EventModelGroovyExtension.class) +class EventDisconnectionGroovyExtension extends AbstractPureDynamicGroovyExtension implements EventModelGroovyExtension { + + private static final EnumSet connectableEquipments = EnumSet.of(IdentifiableType.GENERATOR, IdentifiableType.LOAD) + + private static final EnumSet connectableQuadripoleEquipments = EnumSet.of(IdentifiableType.LINE, IdentifiableType.TWO_WINDINGS_TRANSFORMER) + + EventDisconnectionGroovyExtension() { + modelTags = ["Disconnect"] + } + + @Override + protected EventQuadripoleDisconnectionBuilder createBuilder(Network network) { + new EventQuadripoleDisconnectionBuilder(network) + } + + static class EventQuadripoleDisconnectionBuilder extends AbstractEventModelBuilder { + + boolean disconnectSide = false + boolean isEquipment = false + boolean isQuadripoleEquipment = false + + boolean disconnectOrigin = true + boolean disconnectExtremity = true + Identifiable identifiable + + EventQuadripoleDisconnectionBuilder(Network network) { + super(network) + } + + void disconnectOnly(Branch.Side side) { + disconnectSide = true + switch(side) { + case Branch.Side.ONE : + disconnectOrigin = true + disconnectExtremity = false + break + case Branch.Side.TWO : + disconnectOrigin = false + disconnectExtremity = true + break + } + } + + void checkData() { + super.checkData() + identifiable = network.getIdentifiable(staticId) + if (identifiable == null) { + throw new DslException("Identifiable static id unknown: " + getStaticId()) + } + isEquipment = connectableEquipments.contains(identifiable.getType()) + isQuadripoleEquipment = connectableQuadripoleEquipments.contains(identifiable.getType()) + if (!isEquipment && !isQuadripoleEquipment) { + throw new DslException("Equipment ${getStaticId()} cannot be disconnected") + } else if(isEquipment && disconnectSide) { + throw new DslException("'disconnectSide' has been set but ${identifiable.getType() } ${getStaticId()} is not a quadripole with a disconnectable side") + } + } + + @Override + AbstractEventModel build() { + checkData() + if(isEquipment) + new EventInjectionDisconnection(identifiable, startTime) + else if (isQuadripoleEquipment) + new EventQuadripoleDisconnection(identifiable, startTime, disconnectOrigin, disconnectExtremity) + } + } +} diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/events/EventQuadripoleDisconnectionGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/events/EventQuadripoleDisconnectionGroovyExtension.groovy deleted file mode 100644 index 54d92f9a6..000000000 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/events/EventQuadripoleDisconnectionGroovyExtension.groovy +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Copyright (c) 2020, 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 com.powsybl.dynawaltz.dsl.events - -import com.google.auto.service.AutoService -import com.powsybl.dynamicsimulation.EventModel -import com.powsybl.dynamicsimulation.groovy.EventModelGroovyExtension -import com.powsybl.dynawaltz.dsl.AbstractPureDynamicGroovyExtension -import com.powsybl.dynawaltz.models.events.EventQuadripoleDisconnection - -/** - * An implementation of {@link EventModelGroovyExtension} that adds the
EventQuadripoleDisconnection
keyword to the DSL - * - * @author Marcos de Miguel - */ -@AutoService(EventModelGroovyExtension.class) -class EventQuadripoleDisconnectionGroovyExtension extends AbstractPureDynamicGroovyExtension implements EventModelGroovyExtension { - - EventQuadripoleDisconnectionGroovyExtension() { - modelTags = ["EventQuadripoleDisconnection"] - } - - @Override - protected EventQuadripoleDisconnectionBuilder createBuilder() { - new EventQuadripoleDisconnectionBuilder() - } - - static class EventQuadripoleDisconnectionBuilder extends AbstractEventModelBuilder { - - boolean disconnectOrigin - boolean disconnectExtremity - - void disconnectOrigin(boolean disconnectOrigin) { - this.disconnectOrigin = disconnectOrigin - } - - void disconnectExtremity(boolean disconnectExtremity) { - this.disconnectExtremity = disconnectExtremity - } - - @Override - EventQuadripoleDisconnection build() { - checkData() - new EventQuadripoleDisconnection(eventModelId, staticId, startTime, disconnectOrigin, disconnectExtremity) - } - } -} diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/events/EventSetPointBooleanGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/events/EventSetPointBooleanGroovyExtension.groovy deleted file mode 100644 index 7c4ccac21..000000000 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/events/EventSetPointBooleanGroovyExtension.groovy +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Copyright (c) 2020, 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 com.powsybl.dynawaltz.dsl.events - -import com.google.auto.service.AutoService -import com.powsybl.dynamicsimulation.EventModel -import com.powsybl.dynamicsimulation.groovy.EventModelGroovyExtension -import com.powsybl.dynawaltz.dsl.AbstractPureDynamicGroovyExtension -import com.powsybl.dynawaltz.models.events.EventSetPointBoolean - -/** - * An implementation of {@link EventModelGroovyExtension} that adds the
EventSetPointBoolean
keyword to the DSL - * - * @author Mathieu BAGUE {@literal } - */ -@AutoService(EventModelGroovyExtension.class) -class EventSetPointBooleanGroovyExtension extends AbstractPureDynamicGroovyExtension implements EventModelGroovyExtension { - - EventSetPointBooleanGroovyExtension() { - modelTags = ["EventSetPointBoolean"] - } - - @Override - protected EventSetPointBooleanBuilder createBuilder() { - new EventSetPointBooleanBuilder() - } - - static class EventSetPointBooleanBuilder extends AbstractEventModelBuilder { - - boolean stateEvent - - void stateEvent(boolean stateEvent) { - this.stateEvent = stateEvent - } - - @Override - EventModel build() { - checkData() - new EventSetPointBoolean(eventModelId, staticId, startTime, stateEvent) - } - } -} diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/automatons/CurrentLimitAutomatonGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/automatons/CurrentLimitAutomatonGroovyExtension.groovy index 30fdd0a4d..4349d6e98 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/automatons/CurrentLimitAutomatonGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/automatons/CurrentLimitAutomatonGroovyExtension.groovy @@ -17,6 +17,7 @@ import com.powsybl.dynawaltz.models.Side import com.powsybl.dynawaltz.models.automatons.CurrentLimitAutomaton import com.powsybl.dynawaltz.models.utils.SideConverter import com.powsybl.iidm.network.Branch +import com.powsybl.iidm.network.Network /** * An implementation of {@link DynamicModelGroovyExtension} that adds the
CurrentLimitAutomaton
keyword to the DSL @@ -31,7 +32,7 @@ class CurrentLimitAutomatonGroovyExtension extends AbstractPureDynamicGroovyExte } @Override - protected CurrentLimitAutomatonBuilder createBuilder() { + protected CurrentLimitAutomatonBuilder createBuilder(Network network) { new CurrentLimitAutomatonBuilder() } diff --git a/dynawaltz-dsl/src/test/java/com/powsybl/dynawaltz/dsl/EventModelsSupplierTest.java b/dynawaltz-dsl/src/test/java/com/powsybl/dynawaltz/dsl/EventModelsSupplierTest.java index a101f7cac..fd02ef0a1 100644 --- a/dynawaltz-dsl/src/test/java/com/powsybl/dynawaltz/dsl/EventModelsSupplierTest.java +++ b/dynawaltz-dsl/src/test/java/com/powsybl/dynawaltz/dsl/EventModelsSupplierTest.java @@ -13,7 +13,7 @@ import com.powsybl.dynawaltz.DynaWaltzProvider; import com.powsybl.dynawaltz.models.events.AbstractEventModel; import com.powsybl.dynawaltz.models.events.EventQuadripoleDisconnection; -import com.powsybl.dynawaltz.models.events.EventSetPointBoolean; +import com.powsybl.dynawaltz.models.events.EventInjectionDisconnection; import com.powsybl.iidm.network.Network; import com.powsybl.iidm.network.test.EurostagTutorialExample1Factory; import org.junit.jupiter.api.Test; @@ -37,7 +37,7 @@ class EventModelsSupplierTest extends AbstractModelSupplierTest { @Test void testGroovyExtensionCount() { - assertEquals(2, EXTENSIONS.size()); + assertEquals(1, EXTENSIONS.size()); } @ParameterizedTest(name = "{0}") @@ -52,7 +52,7 @@ void testEventModels(String groovyScriptName, Class provideEventModelData() { return Stream.of( - Arguments.of("quadripoleDisconnection", EventQuadripoleDisconnection.class, EurostagTutorialExample1Factory.create(), "NHV1_NHV2_1", "EM_NHV1_NHV2_1", "EventQuadripoleDisconnection", 4), - Arguments.of("setPointBoolean", EventSetPointBoolean.class, EurostagTutorialExample1Factory.create(), "GEN", "EM_GEN", "EventSetPointBoolean", 1) + Arguments.of("quadripoleDisconnection", EventQuadripoleDisconnection.class, EurostagTutorialExample1Factory.create(), "NHV1_NHV2_1", "Disconnect_NHV1_NHV2_1", "EventQuadripoleDisconnection", 4), + Arguments.of("equipmentDisconnection", EventInjectionDisconnection.class, EurostagTutorialExample1Factory.create(), "GEN", "Disconnect_GEN", null, 1) ); } diff --git a/dynawaltz-dsl/src/test/resources/eventModels.groovy b/dynawaltz-dsl/src/test/resources/eventModels.groovy index ca7963860..c632eda86 100644 --- a/dynawaltz-dsl/src/test/resources/eventModels.groovy +++ b/dynawaltz-dsl/src/test/resources/eventModels.groovy @@ -6,14 +6,12 @@ */ import com.powsybl.iidm.network.Line - +import com.powsybl.iidm.network.Branch for (Line line : network.lines) { - EventQuadripoleDisconnection { + Disconnect { staticId line.id - eventModelId "EM_" + line.id startTime 4 - disconnectOrigin false - disconnectExtremity true + disconnectOnly Branch.Side.TWO } } diff --git a/dynawaltz-dsl/src/test/resources/eventModels/setPointBoolean.groovy b/dynawaltz-dsl/src/test/resources/eventModels/equipmentDisconnection.groovy similarity index 83% rename from dynawaltz-dsl/src/test/resources/eventModels/setPointBoolean.groovy rename to dynawaltz-dsl/src/test/resources/eventModels/equipmentDisconnection.groovy index d89b5e87e..d765d1216 100644 --- a/dynawaltz-dsl/src/test/resources/eventModels/setPointBoolean.groovy +++ b/dynawaltz-dsl/src/test/resources/eventModels/equipmentDisconnection.groovy @@ -8,9 +8,7 @@ package eventModels -EventSetPointBoolean { +Disconnect { staticId "GEN" - eventModelId "EM_GEN" startTime 1 - stateEvent true } diff --git a/dynawaltz-dsl/src/test/resources/eventModels/quadripoleDisconnection.groovy b/dynawaltz-dsl/src/test/resources/eventModels/quadripoleDisconnection.groovy index d61767251..1e3c5ad9e 100644 --- a/dynawaltz-dsl/src/test/resources/eventModels/quadripoleDisconnection.groovy +++ b/dynawaltz-dsl/src/test/resources/eventModels/quadripoleDisconnection.groovy @@ -8,10 +8,10 @@ package eventModels -EventQuadripoleDisconnection { +import com.powsybl.iidm.network.Branch + +Disconnect { staticId "NHV1_NHV2_1" - eventModelId "EM_NHV1_NHV2_1" startTime 4 - disconnectOrigin false - disconnectExtremity true + disconnectOnly Branch.Side.ONE } diff --git a/dynawaltz-dsl/src/test/resources/ieee14-currentlimitautomaton/config/models.par b/dynawaltz-dsl/src/test/resources/ieee14-currentlimitautomaton/config/models.par index 538fd806f..11f0bcae6 100644 --- a/dynawaltz-dsl/src/test/resources/ieee14-currentlimitautomaton/config/models.par +++ b/dynawaltz-dsl/src/test/resources/ieee14-currentlimitautomaton/config/models.par @@ -254,7 +254,7 @@ - + diff --git a/dynawaltz-dsl/src/test/resources/ieee14-currentlimitautomaton/dynawaltz-inputs/ieee14bus.par b/dynawaltz-dsl/src/test/resources/ieee14-currentlimitautomaton/dynawaltz-inputs/ieee14bus.par index dd8fe1c79..933549c9f 100644 --- a/dynawaltz-dsl/src/test/resources/ieee14-currentlimitautomaton/dynawaltz-inputs/ieee14bus.par +++ b/dynawaltz-dsl/src/test/resources/ieee14-currentlimitautomaton/dynawaltz-inputs/ieee14bus.par @@ -8,7 +8,7 @@ - + diff --git a/dynawaltz-dsl/src/test/resources/ieee14-currentlimitautomaton/dynawaltz-inputs/models.par b/dynawaltz-dsl/src/test/resources/ieee14-currentlimitautomaton/dynawaltz-inputs/models.par index 538fd806f..11f0bcae6 100644 --- a/dynawaltz-dsl/src/test/resources/ieee14-currentlimitautomaton/dynawaltz-inputs/models.par +++ b/dynawaltz-dsl/src/test/resources/ieee14-currentlimitautomaton/dynawaltz-inputs/models.par @@ -254,7 +254,7 @@ - + diff --git a/dynawaltz-dsl/src/test/resources/ieee14-currentlimitautomaton/dynawaltz-inputs/powsybl_dynawaltz.dyd b/dynawaltz-dsl/src/test/resources/ieee14-currentlimitautomaton/dynawaltz-inputs/powsybl_dynawaltz.dyd index 32bfca816..cd6df7cdc 100644 --- a/dynawaltz-dsl/src/test/resources/ieee14-currentlimitautomaton/dynawaltz-inputs/powsybl_dynawaltz.dyd +++ b/dynawaltz-dsl/src/test/resources/ieee14-currentlimitautomaton/dynawaltz-inputs/powsybl_dynawaltz.dyd @@ -51,7 +51,7 @@ - + @@ -128,5 +128,5 @@ - + diff --git a/dynawaltz-dsl/src/test/resources/ieee14-currentlimitautomaton/powsybl-inputs/eventModels.groovy b/dynawaltz-dsl/src/test/resources/ieee14-currentlimitautomaton/powsybl-inputs/eventModels.groovy index 418d9ad1b..448840913 100644 --- a/dynawaltz-dsl/src/test/resources/ieee14-currentlimitautomaton/powsybl-inputs/eventModels.groovy +++ b/dynawaltz-dsl/src/test/resources/ieee14-currentlimitautomaton/powsybl-inputs/eventModels.groovy @@ -5,10 +5,10 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -EventQuadripoleDisconnection { +import com.powsybl.iidm.network.Branch + +Disconnect { staticId "_BUS____1-BUS____5-1_AC" - eventModelId "DISCONNECT_LINE" startTime 5 - disconnectOrigin false - disconnectExtremity true + disconnectOnly Branch.Side.TWO } diff --git a/dynawaltz-dsl/src/test/resources/ieee14-disconnectline/config/models.par b/dynawaltz-dsl/src/test/resources/ieee14-disconnectline/config/models.par index 8a87f17f3..e9a9e654b 100644 --- a/dynawaltz-dsl/src/test/resources/ieee14-disconnectline/config/models.par +++ b/dynawaltz-dsl/src/test/resources/ieee14-disconnectline/config/models.par @@ -264,7 +264,7 @@ - + diff --git a/dynawaltz-dsl/src/test/resources/ieee14-disconnectline/dynawaltz-inputs/ieee14bus.par b/dynawaltz-dsl/src/test/resources/ieee14-disconnectline/dynawaltz-inputs/ieee14bus.par index 7a0eb4d48..852ff339e 100644 --- a/dynawaltz-dsl/src/test/resources/ieee14-disconnectline/dynawaltz-inputs/ieee14bus.par +++ b/dynawaltz-dsl/src/test/resources/ieee14-disconnectline/dynawaltz-inputs/ieee14bus.par @@ -8,7 +8,7 @@ - + diff --git a/dynawaltz-dsl/src/test/resources/ieee14-disconnectline/dynawaltz-inputs/models.par b/dynawaltz-dsl/src/test/resources/ieee14-disconnectline/dynawaltz-inputs/models.par index 8a87f17f3..e9a9e654b 100644 --- a/dynawaltz-dsl/src/test/resources/ieee14-disconnectline/dynawaltz-inputs/models.par +++ b/dynawaltz-dsl/src/test/resources/ieee14-disconnectline/dynawaltz-inputs/models.par @@ -264,7 +264,7 @@ - + diff --git a/dynawaltz-dsl/src/test/resources/ieee14-disconnectline/dynawaltz-inputs/powsybl_dynawaltz.dyd b/dynawaltz-dsl/src/test/resources/ieee14-disconnectline/dynawaltz-inputs/powsybl_dynawaltz.dyd index af18993ac..a4395e580 100644 --- a/dynawaltz-dsl/src/test/resources/ieee14-disconnectline/dynawaltz-inputs/powsybl_dynawaltz.dyd +++ b/dynawaltz-dsl/src/test/resources/ieee14-disconnectline/dynawaltz-inputs/powsybl_dynawaltz.dyd @@ -49,7 +49,7 @@ - + @@ -119,5 +119,5 @@ - + diff --git a/dynawaltz-dsl/src/test/resources/ieee14-disconnectline/powsybl-inputs/eventModels.groovy b/dynawaltz-dsl/src/test/resources/ieee14-disconnectline/powsybl-inputs/eventModels.groovy index 2b595aa94..585e7a483 100644 --- a/dynawaltz-dsl/src/test/resources/ieee14-disconnectline/powsybl-inputs/eventModels.groovy +++ b/dynawaltz-dsl/src/test/resources/ieee14-disconnectline/powsybl-inputs/eventModels.groovy @@ -5,17 +5,10 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import com.powsybl.iidm.network.Line +import com.powsybl.iidm.network.Branch - -for (Line line : network.lines) { - if (line.id == "_BUS____1-BUS____5-1_AC") { - EventQuadripoleDisconnection { - staticId line.id - eventModelId "DISCONNECT_LINE" - startTime 1 - disconnectOrigin false - disconnectExtremity true - } - } +Disconnect { + staticId "_BUS____1-BUS____5-1_AC" + startTime 1 + disconnectOnly Branch.Side.TWO } diff --git a/dynawaltz-dsl/src/test/resources/ieee57-disconnectgenerator/config/models.par b/dynawaltz-dsl/src/test/resources/ieee57-disconnectgenerator/config/models.par index 17469bb91..ce9fc7f86 100644 --- a/dynawaltz-dsl/src/test/resources/ieee57-disconnectgenerator/config/models.par +++ b/dynawaltz-dsl/src/test/resources/ieee57-disconnectgenerator/config/models.par @@ -350,7 +350,7 @@ - + diff --git a/dynawaltz-dsl/src/test/resources/ieee57-disconnectgenerator/dynawaltz-inputs/ieee57bus.par b/dynawaltz-dsl/src/test/resources/ieee57-disconnectgenerator/dynawaltz-inputs/ieee57bus.par index 4a1832a5c..e63480d80 100644 --- a/dynawaltz-dsl/src/test/resources/ieee57-disconnectgenerator/dynawaltz-inputs/ieee57bus.par +++ b/dynawaltz-dsl/src/test/resources/ieee57-disconnectgenerator/dynawaltz-inputs/ieee57bus.par @@ -10,7 +10,7 @@ - + diff --git a/dynawaltz-dsl/src/test/resources/ieee57-disconnectgenerator/dynawaltz-inputs/models.par b/dynawaltz-dsl/src/test/resources/ieee57-disconnectgenerator/dynawaltz-inputs/models.par index 17469bb91..ce9fc7f86 100644 --- a/dynawaltz-dsl/src/test/resources/ieee57-disconnectgenerator/dynawaltz-inputs/models.par +++ b/dynawaltz-dsl/src/test/resources/ieee57-disconnectgenerator/dynawaltz-inputs/models.par @@ -350,7 +350,7 @@ - + diff --git a/dynawaltz-dsl/src/test/resources/ieee57-disconnectgenerator/dynawaltz-inputs/powsybl_dynawaltz.dyd b/dynawaltz-dsl/src/test/resources/ieee57-disconnectgenerator/dynawaltz-inputs/powsybl_dynawaltz.dyd index 3444c9065..07ad83c5e 100644 --- a/dynawaltz-dsl/src/test/resources/ieee57-disconnectgenerator/dynawaltz-inputs/powsybl_dynawaltz.dyd +++ b/dynawaltz-dsl/src/test/resources/ieee57-disconnectgenerator/dynawaltz-inputs/powsybl_dynawaltz.dyd @@ -22,7 +22,7 @@ - + @@ -35,7 +35,7 @@ - + @@ -64,5 +64,5 @@ - + diff --git a/dynawaltz-dsl/src/test/resources/ieee57-disconnectgenerator/powsybl-inputs/eventModels.groovy b/dynawaltz-dsl/src/test/resources/ieee57-disconnectgenerator/powsybl-inputs/eventModels.groovy index 853d0262d..6c708b5b7 100644 --- a/dynawaltz-dsl/src/test/resources/ieee57-disconnectgenerator/powsybl-inputs/eventModels.groovy +++ b/dynawaltz-dsl/src/test/resources/ieee57-disconnectgenerator/powsybl-inputs/eventModels.groovy @@ -5,9 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -EventSetPointBoolean { +Disconnect { staticId "_GEN___12_SM" - eventModelId "DisconnectGenerator" startTime 1 - stateEvent true } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzContext.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzContext.java index f1f6a056e..48c5bc64d 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzContext.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzContext.java @@ -13,6 +13,7 @@ import com.powsybl.dynawaltz.models.*; import com.powsybl.dynawaltz.models.generators.OmegaRefGeneratorModel; import com.powsybl.dynawaltz.xml.MacroStaticReference; +import com.powsybl.iidm.network.Identifiable; import com.powsybl.iidm.network.Network; import java.nio.file.FileSystem; @@ -114,7 +115,18 @@ public T getDynamicModel(String staticId, Class clazz) { if (clazz.isInstance(bbm)) { return clazz.cast(bbm); } - throw new PowsyblException("The model identified by the static id " + staticId + " is not the correct model"); + throw new PowsyblException("The model identified by the static id " + staticId + " does not match not the expected model (" + clazz.getSimpleName() + ")"); + } + + public T getDynamicModel(Identifiable equipment, Class connectableClass) { + BlackBoxModel bbm = staticIdBlackBoxModelMap.get(equipment.getId()); + if (bbm == null) { + return networkModel.getDefaultModel(equipment, connectableClass); + } + if (connectableClass.isInstance(bbm)) { + return connectableClass.cast(bbm); + } + throw new PowsyblException("The model identified by the static id " + equipment.getId() + " does not match not the expected model (" + connectableClass.getSimpleName() + ")"); } private EquipmentBlackBoxModelModel mergeDuplicateStaticId(EquipmentBlackBoxModelModel bbm1, EquipmentBlackBoxModelModel bbm2) { diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/AbstractBlackBoxModel.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/AbstractBlackBoxModel.java index 54f752a36..a5242e02d 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/AbstractBlackBoxModel.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/AbstractBlackBoxModel.java @@ -7,6 +7,7 @@ package com.powsybl.dynawaltz.models; import com.powsybl.dynawaltz.DynaWaltzContext; +import com.powsybl.iidm.network.Identifiable; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; @@ -99,6 +100,12 @@ protected final void createMacroConnections(String modelStatic createMacroConnections(connectedModel, varConnectionsSupplier.apply(connectedModel), context, connectFromAttributes); } + protected void createMacroConnections(Identifiable equipment, Class modelClass, Function> varConnectionsSupplier, DynaWaltzContext context) { + T connectedModel = context.getDynamicModel(equipment, modelClass); + String macroConnectorId = context.addMacroConnector(getName(), connectedModel.getName(), varConnectionsSupplier.apply(connectedModel)); + context.addMacroConnect(macroConnectorId, getMacroConnectFromAttributes(), connectedModel.getMacroConnectToAttributes()); + } + /** * Suffixes MacroConnector id with side name */ diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/AbstractPureDynamicBlackBoxModel.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/AbstractPureDynamicBlackBoxModel.java index d86db8229..6ed96007c 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/AbstractPureDynamicBlackBoxModel.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/AbstractPureDynamicBlackBoxModel.java @@ -25,6 +25,10 @@ protected AbstractPureDynamicBlackBoxModel(String dynamicModelId, String paramet super(dynamicModelId, parameterSetId); } + protected AbstractPureDynamicBlackBoxModel(String dynamicModelId) { + super(dynamicModelId, dynamicModelId); + } + @Override public final List getVarsMapping() { // No static-dynamic mapping as purely dynamic diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/NetworkModel.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/NetworkModel.java index 93657fea5..014690409 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/NetworkModel.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/NetworkModel.java @@ -9,11 +9,20 @@ import com.powsybl.commons.PowsyblException; import com.powsybl.dynawaltz.models.buses.BusModel; import com.powsybl.dynawaltz.models.buses.DefaultBusModel; +import com.powsybl.dynawaltz.models.generators.GeneratorModel; +import com.powsybl.dynawaltz.models.generators.DefaultGeneratorModel; import com.powsybl.dynawaltz.models.lines.DefaultLineModel; import com.powsybl.dynawaltz.models.lines.LineModel; +import com.powsybl.dynawaltz.models.loads.DefaultLoadModel; +import com.powsybl.dynawaltz.models.loads.LoadModel; import com.powsybl.dynawaltz.models.shunts.DefaultShuntModel; import com.powsybl.dynawaltz.models.shunts.ShuntModel; +import com.powsybl.dynawaltz.models.transformers.DefaultTransformerModel; +import com.powsybl.dynawaltz.models.transformers.TransformerModel; +import com.powsybl.iidm.network.Identifiable; +import com.powsybl.iidm.network.IdentifiableType; +import java.util.EnumMap; import java.util.Map; /** @@ -22,12 +31,23 @@ */ public class NetworkModel { + private final Map> powSyBlTypeToModel = new EnumMap<>(IdentifiableType.class); private final Map, DefaultModelFactory> factoryMap; public NetworkModel() { factoryMap = Map.of(BusModel.class, new DefaultModelFactory(DefaultBusModel::new), + GeneratorModel.class, new DefaultModelFactory(DefaultGeneratorModel::new), LineModel.class, new DefaultModelFactory(DefaultLineModel::new), - ShuntModel.class, new DefaultModelFactory(DefaultShuntModel::new)); + LoadModel.class, new DefaultModelFactory(DefaultLoadModel::new), + ShuntModel.class, new DefaultModelFactory(DefaultShuntModel::new), + TransformerModel.class, new DefaultModelFactory(DefaultTransformerModel::new)); + + powSyBlTypeToModel.put(IdentifiableType.BUS, BusModel.class); + powSyBlTypeToModel.put(IdentifiableType.GENERATOR, GeneratorModel.class); + powSyBlTypeToModel.put(IdentifiableType.LINE, LineModel.class); + powSyBlTypeToModel.put(IdentifiableType.LOAD, LoadModel.class); + powSyBlTypeToModel.put(IdentifiableType.SHUNT_COMPENSATOR, ShuntModel.class); + powSyBlTypeToModel.put(IdentifiableType.TWO_WINDINGS_TRANSFORMER, TransformerModel.class); } public T getDefaultModel(String staticId, Class clazz) { @@ -37,4 +57,21 @@ public T getDefaultModel(String staticId, Class clazz) { } throw new PowsyblException("Default model not implemented for " + clazz.getSimpleName()); } + + public T getDefaultModel(Identifiable equipment, Class connectableClass) { + + Class equipmentClass = powSyBlTypeToModel.get(equipment.getType()); + if (equipmentClass == null) { + throw new PowsyblException("No dynamic model associated with " + equipment.getType()); + } + DefaultModelFactory dmf = factoryMap.get(equipmentClass); + if (dmf != null) { + Model defaultModel = dmf.getDefaultModel(equipment.getId()); + if (connectableClass.isInstance(defaultModel)) { + return connectableClass.cast(defaultModel); + } + throw new PowsyblException("Default model " + defaultModel.getClass().getSimpleName() + " does not implement " + connectableClass.getSimpleName() + " interface"); + } + throw new PowsyblException("Default model not implemented for " + equipmentClass.getSimpleName()); + } } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/events/AbstractEventModel.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/events/AbstractEventModel.java index 297088f5a..70acdd758 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/events/AbstractEventModel.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/events/AbstractEventModel.java @@ -11,6 +11,7 @@ import com.powsybl.dynawaltz.DynaWaltzContext; import com.powsybl.dynawaltz.models.AbstractPureDynamicBlackBoxModel; import com.powsybl.dynawaltz.xml.ParametersXml; +import com.powsybl.iidm.network.Identifiable; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; @@ -24,17 +25,22 @@ */ public abstract class AbstractEventModel extends AbstractPureDynamicBlackBoxModel implements EventModel { - private final String equipmentStaticId; + private static final String DISCONNECT_PREFIX = "Disconnect_"; + private final Identifiable equipment; private final double startTime; - protected AbstractEventModel(String dynamicModelId, String equipmentStaticId, double startTime) { - super(dynamicModelId, dynamicModelId); - this.equipmentStaticId = equipmentStaticId; + protected AbstractEventModel(Identifiable equipment, double startTime) { + super(generateEventId(equipment.getId())); + this.equipment = equipment; this.startTime = startTime; } - public String getEquipmentStaticId() { - return equipmentStaticId; + protected static String generateEventId(String equipmentStaticId) { + return DISCONNECT_PREFIX + equipmentStaticId; + } + + public Identifiable getEquipment() { + return equipment; } @Override diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/events/DisconnectableEquipment.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/events/DisconnectableEquipment.java new file mode 100644 index 000000000..16b453934 --- /dev/null +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/events/DisconnectableEquipment.java @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2023, 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.dynawaltz.models.events; + +import com.powsybl.dynawaltz.models.Model; + +/** + * @author Laurent Issertial + */ +public interface DisconnectableEquipment extends Model { + String getDisconnectableVarName(); +} diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/events/EventInjectionDisconnection.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/events/EventInjectionDisconnection.java new file mode 100644 index 000000000..1551324dc --- /dev/null +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/events/EventInjectionDisconnection.java @@ -0,0 +1,81 @@ +/** + * Copyright (c) 2020, 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 com.powsybl.dynawaltz.models.events; + +import com.powsybl.dynawaltz.DynaWaltzContext; +import com.powsybl.dynawaltz.models.VarConnection; +import com.powsybl.dynawaltz.xml.ParametersXml; +import com.powsybl.iidm.network.Generator; +import com.powsybl.iidm.network.Load; + +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamWriter; +import java.util.List; + +import static com.powsybl.dynawaltz.DynaWaltzParametersDatabase.ParameterType.BOOL; + +/** + * @author Mathieu BAGUE {@literal } + * @author Laurent Issertial + */ +public class EventInjectionDisconnection extends AbstractEventModel { + + private static final String DYNAMIC_MODEL_LIB = "EventSetPointBoolean"; + private static final String DEFAULT_MODEL_LIB = "EventConnectedStatus"; + + private final boolean disconnect; + + public EventInjectionDisconnection(Generator equipment, double startTime, boolean disconnect) { + super(equipment, startTime); + this.disconnect = disconnect; + } + + public EventInjectionDisconnection(Generator equipment, double startTime) { + this(equipment, startTime, true); + } + + public EventInjectionDisconnection(Load equipment, double startTime, boolean disconnect) { + super(equipment, startTime); + this.disconnect = disconnect; + } + + public EventInjectionDisconnection(Load equipment, double startTime) { + this(equipment, startTime, true); + } + + @Override + public String getLib() { + return null; + } + + private List getVarConnectionsWithDisconnectable(DisconnectableEquipment connected) { + return List.of(new VarConnection("event_state1", connected.getDisconnectableVarName())); + } + + @Override + public void createMacroConnections(DynaWaltzContext context) { + createMacroConnections(getEquipment(), DisconnectableEquipment.class, this::getVarConnectionsWithDisconnectable, context); + } + + @Override + protected void writeEventSpecificParameters(XMLStreamWriter writer, DynaWaltzContext context) throws XMLStreamException { + ParametersXml.writeParameter(writer, BOOL, "event_stateEvent1", Boolean.toString(disconnect)); + } + + @Override + public String getName() { + return EventInjectionDisconnection.class.getSimpleName(); + } + + @Override + protected void writeDynamicAttributes(XMLStreamWriter writer, DynaWaltzContext context) throws XMLStreamException { + writer.writeAttribute("id", getDynamicModelId()); + writer.writeAttribute("lib", context.isWithoutBlackBoxDynamicModel(getEquipment().getId()) ? DEFAULT_MODEL_LIB : DYNAMIC_MODEL_LIB); + writer.writeAttribute("parFile", getParFile(context)); + writer.writeAttribute("parId", getParameterSetId()); + } +} diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/events/EventQuadripoleDisconnection.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/events/EventQuadripoleDisconnection.java index e0b710d9f..a63f86613 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/events/EventQuadripoleDisconnection.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/events/EventQuadripoleDisconnection.java @@ -8,8 +8,8 @@ import com.powsybl.dynawaltz.DynaWaltzContext; import com.powsybl.dynawaltz.models.VarConnection; -import com.powsybl.dynawaltz.models.lines.LineModel; import com.powsybl.dynawaltz.xml.ParametersXml; +import com.powsybl.iidm.network.Branch; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; @@ -26,25 +26,28 @@ public class EventQuadripoleDisconnection extends AbstractEventModel { private final boolean disconnectOrigin; private final boolean disconnectExtremity; - public EventQuadripoleDisconnection(String eventModelId, String lineStaticId, double startTime, - boolean disconnectOrigin, boolean disconnectExtremity) { - super(eventModelId, lineStaticId, startTime); + public EventQuadripoleDisconnection(Branch equipment, double startTime, boolean disconnectOrigin, boolean disconnectExtremity) { + super(equipment, startTime); this.disconnectOrigin = disconnectOrigin; this.disconnectExtremity = disconnectExtremity; } + public EventQuadripoleDisconnection(Branch equipment, double startTime) { + this(equipment, startTime, true, true); + } + @Override public String getLib() { return "EventQuadripoleDisconnection"; } - private List getVarConnectionsWithLine(LineModel connected) { - return List.of(new VarConnection("event_state1_value", connected.getStateValueVarName())); + private List getVarConnectionsWithQuadripoleEquipment(QuadripoleDisconnectableEquipment connected) { + return List.of(new VarConnection("event_state1_value", connected.getDisconnectableVarName())); } @Override public void createMacroConnections(DynaWaltzContext context) { - createMacroConnections(getEquipmentStaticId(), LineModel.class, this::getVarConnectionsWithLine, context); + createMacroConnections(getEquipment(), QuadripoleDisconnectableEquipment.class, this::getVarConnectionsWithQuadripoleEquipment, context); } @Override diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/events/EventSetPointBoolean.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/events/EventSetPointBoolean.java deleted file mode 100644 index 2f09ea2da..000000000 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/events/EventSetPointBoolean.java +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Copyright (c) 2020, 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 com.powsybl.dynawaltz.models.events; - -import com.powsybl.dynawaltz.DynaWaltzContext; -import com.powsybl.dynawaltz.models.VarConnection; -import com.powsybl.dynawaltz.models.generators.GeneratorModel; -import com.powsybl.dynawaltz.xml.ParametersXml; - -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamWriter; -import java.util.List; - -import static com.powsybl.dynawaltz.DynaWaltzParametersDatabase.ParameterType.BOOL; - -/** - * @author Mathieu BAGUE {@literal } - * @author Laurent Issertial - */ -public class EventSetPointBoolean extends AbstractEventModel { - - private final boolean stateEvent; - - public EventSetPointBoolean(String eventModelId, String generatorStaticId, double startTime, boolean stateEvent) { - super(eventModelId, generatorStaticId, startTime); - this.stateEvent = stateEvent; - } - - @Override - public String getLib() { - return "EventSetPointBoolean"; - } - - private List getVarConnectionsWithGenerator(GeneratorModel connected) { - return List.of(new VarConnection("event_state1", connected.getSwitchOffSignalEventVarName())); - } - - @Override - public void createMacroConnections(DynaWaltzContext context) { - createMacroConnections(getEquipmentStaticId(), GeneratorModel.class, this::getVarConnectionsWithGenerator, context); - } - - @Override - protected void writeEventSpecificParameters(XMLStreamWriter writer, DynaWaltzContext context) throws XMLStreamException { - ParametersXml.writeParameter(writer, BOOL, "event_stateEvent1", Boolean.toString(stateEvent)); - } -} diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/events/QuadripoleDisconnectableEquipment.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/events/QuadripoleDisconnectableEquipment.java new file mode 100644 index 000000000..34f61f099 --- /dev/null +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/events/QuadripoleDisconnectableEquipment.java @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2023, 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.dynawaltz.models.events; + +import com.powsybl.dynawaltz.models.Model; + +/** + * @author Laurent Issertial + */ +public interface QuadripoleDisconnectableEquipment extends Model { + + String getDisconnectableVarName(); +} diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/generators/AbstractGeneratorModel.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/generators/AbstractGeneratorModel.java index 7fc300794..e447ba7b1 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/generators/AbstractGeneratorModel.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/generators/AbstractGeneratorModel.java @@ -11,6 +11,7 @@ import com.powsybl.dynawaltz.models.VarConnection; import com.powsybl.dynawaltz.models.VarMapping; import com.powsybl.dynawaltz.models.buses.BusModel; +import com.powsybl.dynawaltz.models.events.DisconnectableEquipment; import com.powsybl.dynawaltz.models.utils.BusUtils; import com.powsybl.iidm.network.Generator; @@ -22,7 +23,7 @@ * @author Marcos de Miguel * @author Laurent Issertial */ -public abstract class AbstractGeneratorModel extends AbstractEquipmentBlackBoxModel implements GeneratorModel { +public abstract class AbstractGeneratorModel extends AbstractEquipmentBlackBoxModel implements GeneratorModel, DisconnectableEquipment { protected static final List VAR_MAPPING = Arrays.asList( new VarMapping("generator_PGenPu", "p"), @@ -66,33 +67,28 @@ private List getVarConnectionsWithBus(BusModel connected) { return varConnections; } - @Override public String getTerminalVarName() { return terminalVarName; } - @Override public String getSwitchOffSignalNodeVarName() { return switchOffSignalNodeVarName; } - @Override - public String getSwitchOffSignalEventVarName() { - return switchOffSignalEventVarName; - } - - @Override public String getSwitchOffSignalAutomatonVarName() { return switchOffSignalAutomatonVarName; } - @Override public String getRunningVarName() { return runningVarName; } - @Override public String getQStatorPuVarName() { return "generator_QStatorPu"; } + + @Override + public String getDisconnectableVarName() { + return switchOffSignalEventVarName; + } } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/generators/DefaultGeneratorModel.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/generators/DefaultGeneratorModel.java new file mode 100644 index 000000000..4c0909c8f --- /dev/null +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/generators/DefaultGeneratorModel.java @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2023, 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.dynawaltz.models.generators; + +import com.powsybl.dynawaltz.models.AbstractNetworkModel; +import com.powsybl.dynawaltz.models.events.DisconnectableEquipment; + +/** + * @author Laurent Issertial + */ +public class DefaultGeneratorModel extends AbstractNetworkModel implements GeneratorModel, DisconnectableEquipment { + + public DefaultGeneratorModel(String staticId) { + super(staticId); + } + + @Override + public String getName() { + return "NetworkGenerator"; + } + + public String getStateValueVarName() { + return "@NAME@_state_value"; + } + + @Override + public String getDisconnectableVarName() { + return getStateValueVarName(); + } + + @Override + public String getTerminalVarName() { + return "@NAME@_terminal"; + } +} diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/generators/GeneratorModel.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/generators/GeneratorModel.java index 4defee5e3..0e22a6d16 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/generators/GeneratorModel.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/generators/GeneratorModel.java @@ -6,21 +6,11 @@ */ package com.powsybl.dynawaltz.models.generators; -import com.powsybl.dynawaltz.models.EquipmentBlackBoxModelModel; +import com.powsybl.dynawaltz.models.Model; /** * @author Florian Dupuy */ -public interface GeneratorModel extends EquipmentBlackBoxModelModel { +public interface GeneratorModel extends Model { String getTerminalVarName(); - - String getSwitchOffSignalNodeVarName(); - - String getSwitchOffSignalEventVarName(); - - String getSwitchOffSignalAutomatonVarName(); - - String getRunningVarName(); - - String getQStatorPuVarName(); } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/generators/GeneratorSynchronousModel.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/generators/GeneratorSynchronousModel.java index 20b6be251..b80e7e3bc 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/generators/GeneratorSynchronousModel.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/generators/GeneratorSynchronousModel.java @@ -10,4 +10,5 @@ * @author Florian Dupuy */ public interface GeneratorSynchronousModel extends OmegaRefGeneratorModel { + } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/generators/OmegaRefGeneratorModel.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/generators/OmegaRefGeneratorModel.java index 7b388eb6d..7be2028fc 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/generators/OmegaRefGeneratorModel.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/generators/OmegaRefGeneratorModel.java @@ -16,7 +16,15 @@ */ public interface OmegaRefGeneratorModel extends GeneratorModel { + String getRunningVarName(); + List getOmegaRefVarConnections(); String getConnectableBusId(); + + String getLib(); + + String getDynamicModelId(); + + String getParameterSetId(); } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/lines/DefaultLineModel.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/lines/DefaultLineModel.java index 5effda998..c30fc1c26 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/lines/DefaultLineModel.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/lines/DefaultLineModel.java @@ -8,11 +8,12 @@ import com.powsybl.dynawaltz.models.AbstractNetworkModel; import com.powsybl.dynawaltz.models.Side; +import com.powsybl.dynawaltz.models.events.QuadripoleDisconnectableEquipment; /** * @author Florian Dupuy */ -public class DefaultLineModel extends AbstractNetworkModel implements LineModel { +public class DefaultLineModel extends AbstractNetworkModel implements LineModel, QuadripoleDisconnectableEquipment { public DefaultLineModel(String staticId) { super(staticId); @@ -42,4 +43,9 @@ public String getStateValueVarName() { public String getDesactivateCurrentLimitsVarName() { return "@NAME@_desactivate_currentLimits"; } + + @Override + public String getDisconnectableVarName() { + return getStateValueVarName(); + } } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/lines/StandardLine.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/lines/StandardLine.java index 43fd12ef5..ba1a1fe22 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/lines/StandardLine.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/lines/StandardLine.java @@ -12,6 +12,7 @@ import com.powsybl.dynawaltz.models.Side; import com.powsybl.dynawaltz.models.VarConnection; import com.powsybl.dynawaltz.models.buses.BusModel; +import com.powsybl.dynawaltz.models.events.QuadripoleDisconnectableEquipment; import com.powsybl.dynawaltz.models.utils.BusUtils; import com.powsybl.dynawaltz.models.utils.SideConverter; import com.powsybl.iidm.network.Line; @@ -21,7 +22,7 @@ /** * @author Laurent Issertial */ -public class StandardLine extends AbstractEquipmentBlackBoxModel implements LineModel { +public class StandardLine extends AbstractEquipmentBlackBoxModel implements LineModel, QuadripoleDisconnectableEquipment { public StandardLine(String dynamicModelId, Line line, String parameterSetId) { super(dynamicModelId, parameterSetId, line); @@ -72,4 +73,9 @@ public String getIVarName(Side side) { public String getDesactivateCurrentLimitsVarName() { throw new UnsupportedOperationException("deactivateCurrentLimits variable not implemented in StandardLine dynawo's model"); } + + @Override + public String getDisconnectableVarName() { + return getStateValueVarName(); + } } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/loads/AbstractLoad.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/loads/AbstractLoad.java index d9282e400..d9babb1fb 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/loads/AbstractLoad.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/loads/AbstractLoad.java @@ -10,6 +10,7 @@ import com.powsybl.dynawaltz.models.AbstractEquipmentBlackBoxModel; import com.powsybl.dynawaltz.models.VarConnection; import com.powsybl.dynawaltz.models.buses.BusModel; +import com.powsybl.dynawaltz.models.events.DisconnectableEquipment; import com.powsybl.dynawaltz.models.utils.BusUtils; import com.powsybl.iidm.network.Load; @@ -19,7 +20,7 @@ * @author Marcos de Miguel * @author Laurent Issertial */ -public abstract class AbstractLoad extends AbstractEquipmentBlackBoxModel { +public abstract class AbstractLoad extends AbstractEquipmentBlackBoxModel implements LoadModel, DisconnectableEquipment { protected final String terminalVarName; @@ -38,4 +39,13 @@ public void createMacroConnections(DynaWaltzContext context) { } abstract List getVarConnectionsWithBus(BusModel connected); + + public String getSwitchOffSignalNodeVarName() { + return "load_switchOffSignal2"; + } + + @Override + public String getDisconnectableVarName() { + return getSwitchOffSignalNodeVarName(); + } } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/loads/DefaultLoadModel.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/loads/DefaultLoadModel.java new file mode 100644 index 000000000..194ae375a --- /dev/null +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/loads/DefaultLoadModel.java @@ -0,0 +1,35 @@ +/** + * Copyright (c) 2023, 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.dynawaltz.models.loads; + +import com.powsybl.dynawaltz.models.AbstractNetworkModel; +import com.powsybl.dynawaltz.models.events.DisconnectableEquipment; + +/** + * @author Laurent Issertial + */ +public class DefaultLoadModel extends AbstractNetworkModel implements LoadModel, DisconnectableEquipment { + + public DefaultLoadModel(String staticId) { + super(staticId); + } + + @Override + public String getName() { + return "NetworkLoad"; + } + + public String getStateValueVarName() { + return "@NAME@_state_value"; + } + + @Override + public String getDisconnectableVarName() { + return getStateValueVarName(); + } +} diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/loads/LoadModel.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/loads/LoadModel.java new file mode 100644 index 000000000..2b36f6407 --- /dev/null +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/loads/LoadModel.java @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2023, 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.dynawaltz.models.loads; + +import com.powsybl.dynawaltz.models.Model; + +/** + * @author Laurent Issertial + */ +public interface LoadModel extends Model { + +} diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/transformers/DefaultTransformerModel.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/transformers/DefaultTransformerModel.java new file mode 100644 index 000000000..0ce44c60e --- /dev/null +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/transformers/DefaultTransformerModel.java @@ -0,0 +1,36 @@ +/** + * Copyright (c) 2023, 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.dynawaltz.models.transformers; + +import com.powsybl.dynawaltz.models.AbstractNetworkModel; +import com.powsybl.dynawaltz.models.events.QuadripoleDisconnectableEquipment; + +/** + * @author Laurent Issertial + */ +public class DefaultTransformerModel extends AbstractNetworkModel implements TransformerModel, QuadripoleDisconnectableEquipment { + + public DefaultTransformerModel(String staticId) { + super(staticId); + } + + @Override + public String getName() { + return "NetworkTransformer"; + } + + @Override + public String getStateValueVarName() { + return "@NAME@_state_value"; + } + + @Override + public String getDisconnectableVarName() { + return getStateValueVarName(); + } +} diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/transformers/TransformerFixedRatio.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/transformers/TransformerFixedRatio.java index 8cd45e07c..5908c7cdd 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/transformers/TransformerFixedRatio.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/transformers/TransformerFixedRatio.java @@ -12,6 +12,7 @@ import com.powsybl.dynawaltz.models.Side; import com.powsybl.dynawaltz.models.VarConnection; import com.powsybl.dynawaltz.models.buses.BusModel; +import com.powsybl.dynawaltz.models.events.QuadripoleDisconnectableEquipment; import com.powsybl.dynawaltz.models.utils.BusUtils; import com.powsybl.dynawaltz.models.utils.SideConverter; import com.powsybl.iidm.network.TwoWindingsTransformer; @@ -22,7 +23,7 @@ /** * @author Laurent Issertial */ -public class TransformerFixedRatio extends AbstractEquipmentBlackBoxModel { +public class TransformerFixedRatio extends AbstractEquipmentBlackBoxModel implements TransformerModel, QuadripoleDisconnectableEquipment { private final String transformerLib; @@ -51,4 +52,14 @@ public void createMacroConnections(DynaWaltzContext context) { createMacroConnections(busStaticId, BusModel.class, this::getVarConnectionsWithBus, context, SideConverter.convert(equipment.getSide(t))); }); } + + @Override + public String getStateValueVarName() { + return "transformer_state_value"; + } + + @Override + public String getDisconnectableVarName() { + return getStateValueVarName(); + } } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/transformers/TransformerModel.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/transformers/TransformerModel.java new file mode 100644 index 000000000..6ca6c3e12 --- /dev/null +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/transformers/TransformerModel.java @@ -0,0 +1,19 @@ +/** + * Copyright (c) 2023, 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.dynawaltz.models.transformers; + +import com.powsybl.dynawaltz.models.Model; + +/** + * @author Laurent Issertial + */ +public interface TransformerModel extends Model { + + String getStateValueVarName(); + +} diff --git a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/AbstractDynamicModelXmlTest.java b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/AbstractDynamicModelXmlTest.java index edf2bc1d1..81694097f 100644 --- a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/AbstractDynamicModelXmlTest.java +++ b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/AbstractDynamicModelXmlTest.java @@ -74,7 +74,7 @@ public void validate(String schemaDefinition, String expectedResourceName, Path void setupDynawaltzContext() { DynamicSimulationParameters parameters = DynamicSimulationParameters.load(); DynaWaltzParameters dynawoParameters = DynaWaltzParameters.load(); - context = new DynaWaltzContext(network, network.getVariantManager().getWorkingVariantId(), dynamicModels, new ArrayList<>(), curves, parameters, dynawoParameters); + context = new DynaWaltzContext(network, network.getVariantManager().getWorkingVariantId(), dynamicModels, eventModels, curves, parameters, dynawoParameters); } protected abstract void setupNetwork(); diff --git a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/DisconnectEventXmlTest.java b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/DisconnectEventXmlTest.java new file mode 100644 index 000000000..0f24fe24d --- /dev/null +++ b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/DisconnectEventXmlTest.java @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2023, 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.dynawaltz.xml; + +import com.powsybl.dynawaltz.models.events.EventInjectionDisconnection; +import com.powsybl.dynawaltz.models.generators.GeneratorFictitious; +import com.powsybl.iidm.network.test.EurostagTutorialExample1Factory; +import org.junit.jupiter.api.Test; +import org.xml.sax.SAXException; + +import javax.xml.stream.XMLStreamException; +import java.io.IOException; + +/** + * @author Laurent Issertial + */ +class DisconnectEventXmlTest extends AbstractDynamicModelXmlTest { + + @Override + protected void setupNetwork() { + network = EurostagTutorialExample1Factory.create(); + } + + @Override + protected void addDynamicModels() { + dynamicModels.add(new GeneratorFictitious("BBM_GEN", network.getGenerator("GEN"), "GF")); + eventModels.add(new EventInjectionDisconnection(network.getGenerator("GEN"), 1)); + eventModels.add(new EventInjectionDisconnection(network.getLoad("LOAD"), 1)); + } + + @Test + void writeDisconnectModel() throws SAXException, IOException, XMLStreamException { + DydXml.write(tmpDir, context); + ParametersXml.write(tmpDir, context); + validate("dyd.xsd", "disconnect_dyd.xml", tmpDir.resolve(DynaWaltzConstants.DYD_FILENAME)); + validate("parameters.xsd", "disconnect_par.xml", tmpDir.resolve(context.getSimulationParFile())); + } +} diff --git a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/DisconnectQuadripoleEventXmlTest.java b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/DisconnectQuadripoleEventXmlTest.java new file mode 100644 index 000000000..a2256bdfd --- /dev/null +++ b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/DisconnectQuadripoleEventXmlTest.java @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2023, 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.dynawaltz.xml; + +import com.powsybl.dynawaltz.models.events.EventQuadripoleDisconnection; +import com.powsybl.iidm.network.test.EurostagTutorialExample1Factory; +import org.junit.jupiter.api.Test; +import org.xml.sax.SAXException; + +import javax.xml.stream.XMLStreamException; +import java.io.IOException; + +/** + * @author Laurent Issertial + */ +class DisconnectQuadripoleEventXmlTest extends AbstractDynamicModelXmlTest { + + @Override + protected void setupNetwork() { + network = EurostagTutorialExample1Factory.create(); + } + + @Override + protected void addDynamicModels() { + eventModels.add(new EventQuadripoleDisconnection(network.getLine("NHV1_NHV2_1"), 1)); + eventModels.add(new EventQuadripoleDisconnection(network.getTwoWindingsTransformer("NGEN_NHV1"), 1, true, false)); + } + + @Test + void writeDisconnectModel() throws SAXException, IOException, XMLStreamException { + DydXml.write(tmpDir, context); + ParametersXml.write(tmpDir, context); + validate("dyd.xsd", "disconnect_quadripole_dyd.xml", tmpDir.resolve(DynaWaltzConstants.DYD_FILENAME)); + validate("parameters.xsd", "disconnect_quadripole_par.xml", tmpDir.resolve(context.getSimulationParFile())); + } +} diff --git a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/DynaWaltzTestUtil.java b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/DynaWaltzTestUtil.java index 0a924d9ec..d901dd5a2 100644 --- a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/DynaWaltzTestUtil.java +++ b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/DynaWaltzTestUtil.java @@ -13,7 +13,7 @@ import com.powsybl.dynawaltz.models.Side; import com.powsybl.dynawaltz.models.automatons.CurrentLimitAutomaton; import com.powsybl.dynawaltz.models.events.EventQuadripoleDisconnection; -import com.powsybl.dynawaltz.models.events.EventSetPointBoolean; +import com.powsybl.dynawaltz.models.events.EventInjectionDisconnection; import com.powsybl.dynawaltz.models.generators.GeneratorFictitious; import com.powsybl.dynawaltz.models.generators.GeneratorSynchronous; import com.powsybl.dynawaltz.models.generators.OmegaRefGenerator; @@ -98,10 +98,10 @@ void setup() { // Events eventModels = new ArrayList<>(); - network.getLineStream().forEach(l -> eventModels.add(new EventQuadripoleDisconnection("EM_" + l.getId(), l.getId(), 5, false, true))); + network.getLineStream().forEach(l -> eventModels.add(new EventQuadripoleDisconnection(l, 5, false, true))); network.getGeneratorStream().forEach(g -> { if (g.getId().equals("GEN2")) { - eventModels.add(new EventSetPointBoolean("EM_" + g.getId(), g.getId(), 1, true)); + eventModels.add(new EventInjectionDisconnection(g, 1)); } }); diff --git a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/DynamicModelsXmlTest.java b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/DynamicModelsXmlTest.java index 68eb88444..dcf16560f 100644 --- a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/DynamicModelsXmlTest.java +++ b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/DynamicModelsXmlTest.java @@ -10,9 +10,11 @@ import com.powsybl.dynamicsimulation.DynamicSimulationParameters; import com.powsybl.dynawaltz.DynaWaltzContext; import com.powsybl.dynawaltz.DynaWaltzParameters; +import com.powsybl.dynawaltz.models.events.DisconnectableEquipment; import com.powsybl.dynawaltz.models.generators.GeneratorFictitious; import com.powsybl.dynawaltz.models.generators.GeneratorSynchronousModel; import com.powsybl.dynawaltz.models.lines.LineModel; +import com.powsybl.iidm.network.Identifiable; import org.junit.jupiter.api.Test; import org.xml.sax.SAXException; @@ -75,10 +77,30 @@ void testDynamicModelGetterException() { // incorrect model Exception e = assertThrows(PowsyblException.class, () -> dc.getDynamicModel("GEN5", LineModel.class)); - assertEquals("The model identified by the static id GEN5 is not the correct model", e.getMessage()); + assertEquals("The model identified by the static id GEN5 does not match not the expected model (LineModel)", e.getMessage()); // default model not implemented e = assertThrows(PowsyblException.class, () -> dc.getDynamicModel("unknownID", GeneratorSynchronousModel.class)); assertEquals("Default model not implemented for GeneratorSynchronousModel", e.getMessage()); } + + @Test + void testDynamicModelGetterFromIdentifiableTypeException() { + DynaWaltzContext dc = new DynaWaltzContext(network, network.getVariantManager().getWorkingVariantId(), dynamicModels, eventModels, curves, DynamicSimulationParameters.load(), DynaWaltzParameters.load()); + + // incorrect model + Identifiable gen = network.getIdentifiable("GEN5"); + Exception e = assertThrows(PowsyblException.class, () -> dc.getDynamicModel(gen, LineModel.class)); + assertEquals("The model identified by the static id GEN5 does not match not the expected model (LineModel)", e.getMessage()); + + // dynamic model not found + Identifiable substation = network.getIdentifiable("P1"); + e = assertThrows(PowsyblException.class, () -> dc.getDynamicModel(substation, DisconnectableEquipment.class)); + assertEquals("No dynamic model associated with SUBSTATION", e.getMessage()); + + // requested interface not implemented + Identifiable transformer = network.getIdentifiable("NGEN_NHV1"); + e = assertThrows(PowsyblException.class, () -> dc.getDynamicModel(transformer, DisconnectableEquipment.class)); + assertEquals("Default model DefaultTransformerModel does not implement DisconnectableEquipment interface", e.getMessage()); + } } diff --git a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/EventXmlTest.java b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/EventXmlTest.java index efb2b44c5..a2dea49d2 100644 --- a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/EventXmlTest.java +++ b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/EventXmlTest.java @@ -11,7 +11,7 @@ import com.powsybl.dynawaltz.DynaWaltzContext; import com.powsybl.dynawaltz.DynaWaltzParameters; import com.powsybl.dynawaltz.models.events.EventQuadripoleDisconnection; -import com.powsybl.dynawaltz.models.events.EventSetPointBoolean; +import com.powsybl.dynawaltz.models.events.EventInjectionDisconnection; import com.powsybl.dynawaltz.models.generators.GeneratorSynchronous; import org.junit.jupiter.api.Test; import org.xml.sax.SAXException; @@ -43,15 +43,13 @@ void writeDynamicModel() throws SAXException, IOException, XMLStreamException { @Test void duplicateEventId() { eventModels.clear(); - network.getLineStream().forEach(l -> eventModels.add(new EventQuadripoleDisconnection("duplicateID", l.getId(), 5, false, true))); - network.getGeneratorStream().forEach(g -> { - if (g.getId().equals("GEN2") || g.getId().equals("GEN4")) { - eventModels.add(new EventSetPointBoolean("duplicateID2", g.getId(), 1, true)); - } - }); + eventModels.add(new EventQuadripoleDisconnection(network.getLine("NHV1_NHV2_1"), 5)); + eventModels.add(new EventQuadripoleDisconnection(network.getLine("NHV1_NHV2_1"), 5, true, false)); + eventModels.add(new EventInjectionDisconnection(network.getGenerator("GEN2"), 1, true)); + eventModels.add(new EventInjectionDisconnection(network.getGenerator("GEN2"), 1, false)); String workingVariantId = network.getVariantManager().getWorkingVariantId(); Exception e = assertThrows(PowsyblException.class, () -> new DynaWaltzContext(network, workingVariantId, dynamicModels, eventModels, curves, null, null)); - assertEquals("Duplicate dynamicId: [duplicateID, duplicateID2]", e.getMessage()); + assertEquals("Duplicate dynamicId: [Disconnect_NHV1_NHV2_1, Disconnect_GEN2]", e.getMessage()); } } diff --git a/dynawaltz/src/test/resources/disconnect_dyd.xml b/dynawaltz/src/test/resources/disconnect_dyd.xml new file mode 100644 index 000000000..3d6a03a7d --- /dev/null +++ b/dynawaltz/src/test/resources/disconnect_dyd.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dynawaltz/src/test/resources/disconnect_par.xml b/dynawaltz/src/test/resources/disconnect_par.xml new file mode 100644 index 000000000..4728c7ba4 --- /dev/null +++ b/dynawaltz/src/test/resources/disconnect_par.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/dynawaltz/src/test/resources/disconnect_quadripole_dyd.xml b/dynawaltz/src/test/resources/disconnect_quadripole_dyd.xml new file mode 100644 index 000000000..e9ea7d021 --- /dev/null +++ b/dynawaltz/src/test/resources/disconnect_quadripole_dyd.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/dynawaltz/src/test/resources/disconnect_quadripole_par.xml b/dynawaltz/src/test/resources/disconnect_quadripole_par.xml new file mode 100644 index 000000000..d5337d437 --- /dev/null +++ b/dynawaltz/src/test/resources/disconnect_quadripole_par.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/dynawaltz/src/test/resources/events.xml b/dynawaltz/src/test/resources/events.xml index 79546ec5a..ceddeffef 100644 --- a/dynawaltz/src/test/resources/events.xml +++ b/dynawaltz/src/test/resources/events.xml @@ -4,9 +4,9 @@ - - - + + + @@ -22,7 +22,7 @@ - + @@ -33,7 +33,7 @@ - - - + + + diff --git a/dynawaltz/src/test/resources/omega_ref.xml b/dynawaltz/src/test/resources/omega_ref.xml index aa1c0edd2..6da9787d5 100644 --- a/dynawaltz/src/test/resources/omega_ref.xml +++ b/dynawaltz/src/test/resources/omega_ref.xml @@ -10,17 +10,17 @@ - + - + - + diff --git a/dynawo-integration-tests/src/test/resources/ieee14/disconnectline/eventModels.groovy b/dynawo-integration-tests/src/test/resources/ieee14/disconnectline/eventModels.groovy index 2b595aa94..585e7a483 100644 --- a/dynawo-integration-tests/src/test/resources/ieee14/disconnectline/eventModels.groovy +++ b/dynawo-integration-tests/src/test/resources/ieee14/disconnectline/eventModels.groovy @@ -5,17 +5,10 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import com.powsybl.iidm.network.Line +import com.powsybl.iidm.network.Branch - -for (Line line : network.lines) { - if (line.id == "_BUS____1-BUS____5-1_AC") { - EventQuadripoleDisconnection { - staticId line.id - eventModelId "DISCONNECT_LINE" - startTime 1 - disconnectOrigin false - disconnectExtremity true - } - } +Disconnect { + staticId "_BUS____1-BUS____5-1_AC" + startTime 1 + disconnectOnly Branch.Side.TWO } diff --git a/dynawo-integration-tests/src/test/resources/ieee14/disconnectline/models.par b/dynawo-integration-tests/src/test/resources/ieee14/disconnectline/models.par index 8a87f17f3..e9a9e654b 100644 --- a/dynawo-integration-tests/src/test/resources/ieee14/disconnectline/models.par +++ b/dynawo-integration-tests/src/test/resources/ieee14/disconnectline/models.par @@ -264,7 +264,7 @@ - +