Skip to content

Commit

Permalink
Add node fault event (#203)
Browse files Browse the repository at this point in the history
Signed-off-by: lisrte <laurent.issertial@rte-france.com>
  • Loading branch information
Lisrte authored May 9, 2023
1 parent f7f7934 commit d9284bc
Show file tree
Hide file tree
Showing 11 changed files with 245 additions and 25 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
/**
* 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.NodeFaultEvent
import com.powsybl.iidm.network.Bus
import com.powsybl.iidm.network.Network

/**
* @author Laurent Issertial <laurent.issertial at rte-france.com>
*/
@AutoService(EventModelGroovyExtension.class)
class NodeFaultEventGroovyExtension extends AbstractPureDynamicGroovyExtension<EventModel> implements EventModelGroovyExtension {

NodeFaultEventGroovyExtension() {
modelTags = ["NodeFault"]
}

@Override
protected NodeFaultEventBuilder createBuilder(Network network) {
new NodeFaultEventBuilder(network)
}

static class NodeFaultEventBuilder extends AbstractEventModelBuilder {

Bus bus
double faultTime
double rPu
double xPu

NodeFaultEventBuilder(Network network) {
super(network)
}

void faultTime(double faultTime) {
this.faultTime = faultTime
}

void rPu(double rPu) {
this.rPu = rPu
}

void xPu(double xPu) {
this.xPu = xPu
}

void checkData() {
super.checkData()
this.bus = network.getBusBreakerView().getBus(staticId)
if (bus == null) {
throw new DslException("Bus static id unknown: " + staticId)
}
if (faultTime <= 0) {
throw new DslException("NodeFault ${bus.getId()} fault time should be strictly positive (${faultTime})")
}
if (rPu < 0) {
throw new DslException("NodeFault ${bus.getId()} rPu should be positive (${rPu})")
}
if (xPu < 0) {
throw new DslException("NodeFault ${bus.getId()} xPu should be positive (${xPu})")
}
}

@Override
AbstractEventModel build() {
checkData()
new NodeFaultEvent(bus, startTime, faultTime, rPu, xPu)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import com.powsybl.dynawaltz.models.events.AbstractEventModel;
import com.powsybl.dynawaltz.models.events.EventQuadripoleDisconnection;
import com.powsybl.dynawaltz.models.events.EventInjectionDisconnection;
import com.powsybl.dynawaltz.models.events.NodeFaultEvent;
import com.powsybl.iidm.network.Network;
import com.powsybl.iidm.network.test.EurostagTutorialExample1Factory;
import org.junit.jupiter.params.ParameterizedTest;
Expand Down Expand Up @@ -55,7 +56,8 @@ void assertEventModel(AbstractEventModel em, String dynamicId, String equipmentS
private static Stream<Arguments> provideEventModelData() {
return Stream.of(
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)
Arguments.of("equipmentDisconnection", EventInjectionDisconnection.class, EurostagTutorialExample1Factory.create(), "GEN", "Disconnect_GEN", null, 1),
Arguments.of("nodeFault", NodeFaultEvent.class, EurostagTutorialExample1Factory.create(), "NGEN", "Node_Fault_NGEN", "NodeFault", 1)
);
}

Expand Down
17 changes: 17 additions & 0 deletions dynawaltz-dsl/src/test/resources/eventModels/nodeFault.groovy
Original file line number Diff line number Diff line change
@@ -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 eventModels

NodeFault {
staticId "NGEN"
startTime 1
faultTime 0.1
rPu 0
xPu 0.01
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,11 @@
import com.powsybl.dynamicsimulation.EventModel;
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;

import static com.powsybl.dynawaltz.parameters.ParameterType.DOUBLE;
import static com.powsybl.dynawaltz.xml.DynaWaltzXmlConstants.DYN_URI;

/**
Expand All @@ -25,18 +23,17 @@
*/
public abstract class AbstractEventModel extends AbstractPureDynamicBlackBoxModel implements EventModel {

private static final String DISCONNECT_PREFIX = "Disconnect_";
private final Identifiable<?> equipment;
private final double startTime;

protected AbstractEventModel(Identifiable<?> equipment, double startTime) {
super(generateEventId(equipment.getId()));
protected AbstractEventModel(Identifiable<?> equipment, double startTime, String eventPrefix) {
super(generateEventId(equipment.getId(), eventPrefix));
this.equipment = equipment;
this.startTime = startTime;
}

protected static String generateEventId(String equipmentStaticId) {
return DISCONNECT_PREFIX + equipmentStaticId;
private static String generateEventId(String equipmentStaticId, String eventPrefix) {
return eventPrefix + equipmentStaticId;
}

public Identifiable<?> getEquipment() {
Expand All @@ -57,7 +54,6 @@ public String getParFile(DynaWaltzContext context) {
public void writeParameters(XMLStreamWriter writer, DynaWaltzContext context) throws XMLStreamException {
writer.writeStartElement(DYN_URI, "set");
writer.writeAttribute("id", getParameterSetId());
ParametersXml.writeParameter(writer, DOUBLE, "event_tEvent", Double.toString(getStartTime()));
writeEventSpecificParameters(writer, context);
writer.writeEndElement();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,14 @@
*/
public class EventInjectionDisconnection extends AbstractEventModel {

private static final String EVENT_PREFIX = "Disconnect_";
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);
super(equipment, startTime, EVENT_PREFIX);
this.disconnect = disconnect;
}

Expand All @@ -38,7 +39,7 @@ public EventInjectionDisconnection(Generator equipment, double startTime) {
}

public EventInjectionDisconnection(Load equipment, double startTime, boolean disconnect) {
super(equipment, startTime);
super(equipment, startTime, EVENT_PREFIX);
this.disconnect = disconnect;
}

Expand All @@ -62,6 +63,7 @@ public void createMacroConnections(DynaWaltzContext context) {

@Override
protected void writeEventSpecificParameters(XMLStreamWriter writer, DynaWaltzContext context) throws XMLStreamException {
ParametersXml.writeParameter(writer, ParameterType.DOUBLE, "event_tEvent", Double.toString(getStartTime()));
ParametersXml.writeParameter(writer, ParameterType.BOOL, "event_stateEvent1", Boolean.toString(disconnect));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,26 +8,26 @@

import com.powsybl.dynawaltz.DynaWaltzContext;
import com.powsybl.dynawaltz.models.VarConnection;
import com.powsybl.dynawaltz.parameters.ParameterType;
import com.powsybl.dynawaltz.xml.ParametersXml;
import com.powsybl.iidm.network.Branch;

import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import java.util.List;

import static com.powsybl.dynawaltz.parameters.ParameterType.BOOL;

/**
* @author Marcos de Miguel <demiguelm at aia.es>
* @author Laurent Issertial <laurent.issertial at rte-france.com>
*/
public class EventQuadripoleDisconnection extends AbstractEventModel {

private static final String EVENT_PREFIX = "Disconnect_";
private final boolean disconnectOrigin;
private final boolean disconnectExtremity;

public EventQuadripoleDisconnection(Branch<?> equipment, double startTime, boolean disconnectOrigin, boolean disconnectExtremity) {
super(equipment, startTime);
super(equipment, startTime, EVENT_PREFIX);
this.disconnectOrigin = disconnectOrigin;
this.disconnectExtremity = disconnectExtremity;
}
Expand All @@ -52,7 +52,8 @@ public void createMacroConnections(DynaWaltzContext context) {

@Override
protected void writeEventSpecificParameters(XMLStreamWriter writer, DynaWaltzContext context) throws XMLStreamException {
ParametersXml.writeParameter(writer, BOOL, "event_disconnectOrigin", Boolean.toString(disconnectOrigin));
ParametersXml.writeParameter(writer, BOOL, "event_disconnectExtremity", Boolean.toString(disconnectExtremity));
ParametersXml.writeParameter(writer, ParameterType.DOUBLE, "event_tEvent", Double.toString(getStartTime()));
ParametersXml.writeParameter(writer, ParameterType.BOOL, "event_disconnectOrigin", Boolean.toString(disconnectOrigin));
ParametersXml.writeParameter(writer, ParameterType.BOOL, "event_disconnectExtremity", Boolean.toString(disconnectExtremity));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/**
* 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.DynaWaltzContext;
import com.powsybl.dynawaltz.models.VarConnection;
import com.powsybl.dynawaltz.models.buses.BusModel;
import com.powsybl.dynawaltz.parameters.ParameterType;
import com.powsybl.dynawaltz.xml.ParametersXml;
import com.powsybl.iidm.network.Bus;

import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import java.util.List;

/**
* @author Laurent Issertial <laurent.issertial at rte-france.com>
*/
public class NodeFaultEvent extends AbstractEventModel {

private static final String EVENT_PREFIX = "Node_Fault_";

private final double faultTime;
private final double rPu;
private final double xPu;

public NodeFaultEvent(Bus equipment, double startTime, double faultTime, double rPu, double xPu) {
super(equipment, startTime, EVENT_PREFIX);
this.faultTime = faultTime;
this.rPu = rPu;
this.xPu = xPu;
}

@Override
public String getLib() {
return "NodeFault";
}

@Override
public void createMacroConnections(DynaWaltzContext context) {
createMacroConnections(getEquipment(), BusModel.class, this::getVarConnectionsWithBus, context);
}

private List<VarConnection> getVarConnectionsWithBus(BusModel connected) {
return List.of(new VarConnection("fault_terminal", connected.getTerminalVarName()));
}

@Override
protected void writeEventSpecificParameters(XMLStreamWriter writer, DynaWaltzContext context) throws XMLStreamException {
ParametersXml.writeParameter(writer, ParameterType.DOUBLE, "fault_RPu", Double.toString(rPu));
ParametersXml.writeParameter(writer, ParameterType.DOUBLE, "fault_XPu", Double.toString(xPu));
ParametersXml.writeParameter(writer, ParameterType.DOUBLE, "fault_tBegin", Double.toString(getStartTime()));
ParametersXml.writeParameter(writer, ParameterType.DOUBLE, "fault_tEnd", Double.toString(getStartTime() + faultTime));
}
}
Original file line number Diff line number Diff line change
@@ -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.xml;

import com.powsybl.dynawaltz.models.events.NodeFaultEvent;
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 <laurent.issertial at rte-france.com>
*/
class NodeFaultEventXmlTest extends AbstractDynamicModelXmlTest {

@Override
protected void setupNetwork() {
network = EurostagTutorialExample1Factory.create();
}

@Override
protected void addDynamicModels() {
eventModels.add(new NodeFaultEvent(network.getBusBreakerView().getBus("NGEN"), 10, 0.1, 0, 0.01));
}

@Test
void writeModel() throws SAXException, IOException, XMLStreamException {
DydXml.write(tmpDir, context);
ParametersXml.write(tmpDir, context);
validate("dyd.xsd", "node_fault_dyd.xml", tmpDir.resolve(DynaWaltzConstants.DYD_FILENAME));
validate("parameters.xsd", "node_fault_par.xml", tmpDir.resolve(context.getSimulationParFile()));
}
}
Loading

0 comments on commit d9284bc

Please sign in to comment.