Skip to content

Commit

Permalink
Psse: discard badly connected equipment and fix badly defined control…
Browse files Browse the repository at this point in the history
…led buses (#3345)

Signed-off-by: marquesja1 <[email protected]>
  • Loading branch information
marqueslanauja authored Mar 6, 2025
1 parent 081f94b commit fc57370
Show file tree
Hide file tree
Showing 19 changed files with 839 additions and 128 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@ public Set<Integer> getBusesSet(String voltageLevelId) {
return voltageLevelIdToBusNums.computeIfAbsent(voltageLevelId, k -> new HashSet<>());
}

public boolean isBusDefined(int num) {
return busNumToVoltageLevelId.containsKey(num);
}

public String getVoltageLevelId(int num) {
String voltageLevelId = busNumToVoltageLevelId.get(num);
if (voltageLevelId == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ class FixedShuntCompensatorConverter extends AbstractConverter {
}

void create() {
if (!getContainersMapping().isBusDefined(psseFixedShunt.getI())) {
return;
}
if (psseFixedShunt.getGl() == 0 && psseFixedShunt.getBl() == 0.0) {
LOGGER.warn("Shunt ({}) has Gl and Bl = 0, not imported ", psseFixedShunt.getI());
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@ class GeneratorConverter extends AbstractConverter {
}

void create() {
if (!getContainersMapping().isBusDefined(psseGenerator.getI())) {
return;
}
VoltageLevel voltageLevel = getNetwork().getVoltageLevel(getContainersMapping().getVoltageLevelId(psseGenerator.getI()));
GeneratorAdder adder = voltageLevel.newGenerator()
.setId(getGeneratorId(psseGenerator.getI(), psseGenerator.getId()))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ class LineConverter extends AbstractConverter {
}

void create() {
if (!getContainersMapping().isBusDefined(psseLine.getI()) || !getContainersMapping().isBusDefined(psseLine.getJ())) {
return;
}
String id = getLineId(psseLine.getI(), psseLine.getJ(), psseLine.getCkt());

String voltageLevel1Id = getContainersMapping().getVoltageLevelId(psseLine.getI());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@ class LoadConverter extends AbstractConverter {
}

void create() {

if (!getContainersMapping().isBusDefined(psseLoad.getI())) {
return;
}
VoltageLevel voltageLevel = getNetwork()
.getVoltageLevel(getContainersMapping().getVoltageLevelId(psseLoad.getI()));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -248,15 +248,37 @@ private ContainersMapping defineContainersMapping(PssePowerFlowModel psseModel,
List<Edge> edges = new ArrayList<>();
// only zeroImpedance Lines are necessary and as they are not allowed, nothing to do

defineEdgesForTransformers(psseModel, busNumToPsseBus, edges);
// buses inside a psse substation are connected in the same way as transformers
defineEdgesForBusesInsideSubstation(nodeBreakerValidation, edges);

return ContainersMapping.create(psseModel.getBuses(), edges,
PsseBus::getI,
Edge::bus1,
Edge::bus2,
Edge::zeroImpedance,
Edge::transformer,
busNumber -> getNominalVFromBusNumber(busNumToPsseBus, busNumber, perUnitContext),
AbstractConverter::getVoltageLevelId,
substationNums -> getSubstationId(nodeBreakerValidation, substationNums));
}

private void defineEdgesForTransformers(PssePowerFlowModel psseModel, Map<Integer, PsseBus> busNumToPsseBus, List<Edge> edges) {
psseModel.getTransformers().forEach(t -> {
if (t.getK() == 0) { // twoWindingsTransformers with zero impedance are not allowed
edges.add(new Edge(t.getI(), t.getJ(), true, false));
if (busNumToPsseBus.containsKey(t.getI()) && busNumToPsseBus.containsKey(t.getJ())) {
edges.add(new Edge(t.getI(), t.getJ(), true, false));
}
} else { // threeWindingsTransformers with zero impedance are not allowed
edges.add(new Edge(t.getI(), t.getJ(), true, false));
edges.add(new Edge(t.getI(), t.getK(), true, false));
if (busNumToPsseBus.containsKey(t.getI()) && busNumToPsseBus.containsKey(t.getJ()) && busNumToPsseBus.containsKey(t.getK())) {
edges.add(new Edge(t.getI(), t.getJ(), true, false));
edges.add(new Edge(t.getI(), t.getK(), true, false));
}
}
});
// buses inside a psse substation are connected in the same way as transformers
}

private void defineEdgesForBusesInsideSubstation(NodeBreakerValidation nodeBreakerValidation, List<Edge> edges) {
nodeBreakerValidation.getValidSubstations().forEach(psseSubstation -> {
List<Integer> busesInside = nodeBreakerValidation.getBuses(psseSubstation);
if (busesInside.size() >= 2) {
Expand All @@ -266,16 +288,6 @@ private ContainersMapping defineContainersMapping(PssePowerFlowModel psseModel,
}
}
});

return ContainersMapping.create(psseModel.getBuses(), edges,
PsseBus::getI,
Edge::bus1,
Edge::bus2,
Edge::zeroImpedance,
Edge::transformer,
busNumber -> getNominalVFromBusNumber(busNumToPsseBus, busNumber, perUnitContext),
AbstractConverter::getVoltageLevelId,
substationNums -> getSubstationId(nodeBreakerValidation, substationNums));
}

private static String getSubstationId(NodeBreakerValidation nodeBreakerValidation, Set<Integer> substationBusNumbers) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ class SwitchedShuntCompensatorConverter extends AbstractConverter {
}

void create() {
if (!getContainersMapping().isBusDefined(psseSwitchedShunt.getI())) {
return;
}
List<ShuntBlock> shuntBlocks = defineShuntBlocks(psseSwitchedShunt, version);
if (shuntBlocks.isEmpty()) {
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,9 @@ void create() {
}

private void createTwoWindingsTransformer() {

if (!getContainersMapping().isBusDefined(psseTransformer.getI()) || !getContainersMapping().isBusDefined(psseTransformer.getJ())) {
return;
}
String id = getTransformerId(psseTransformer.getI(), psseTransformer.getJ(), psseTransformer.getCkt());

String voltageLevel1Id = getContainersMapping().getVoltageLevelId(psseTransformer.getI());
Expand Down Expand Up @@ -137,6 +139,9 @@ private void createTwoWindingsTransformer() {
}

private void createThreeWindingsTransformer() {
if (!getContainersMapping().isBusDefined(psseTransformer.getI()) || !getContainersMapping().isBusDefined(psseTransformer.getJ()) || !getContainersMapping().isBusDefined(psseTransformer.getK())) {
return;
}
String id = getTransformerId(psseTransformer.getI(), psseTransformer.getJ(), psseTransformer.getK(), psseTransformer.getCkt());

String bus1Id = getBusId(psseTransformer.getI());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,9 @@ class TwoTerminalDcConverter extends AbstractConverter {
}

void create() {

if (!getContainersMapping().isBusDefined(psseTwoTerminalDc.getRectifier().getIp()) || !getContainersMapping().isBusDefined(psseTwoTerminalDc.getInverter().getIp())) {
return;
}
double lossFactor = 0.0;
String busIdR = getBusId(psseTwoTerminalDc.getRectifier().getIp());
VoltageLevel voltageLevelR = getNetwork().getVoltageLevel(getContainersMapping().getVoltageLevelId(psseTwoTerminalDc.getRectifier().getIp()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,39 @@ void importTest14BusesDuplicateIdsV35() throws IOException {
assertNotNull(n.getTwoWindingsTransformer("T-4-7-10"));
}

@Test
void importTest14BadlyConnectedEquipment() throws IOException {
Network n = importTest("IEEE_14_buses_badly_connected_equipment", "IEEE_14_buses_badly_connected_equipment.raw", false);

// Ensure that the equipment is not imported
assertNull(n.getLoad("B200-L1 "));
assertNull(n.getShuntCompensator("B200-SH 1"));
assertNull(n.getGenerator("B200-G1 "));
assertNull(n.getLine("L-200-13-1 "));
assertNull(n.getLine("L-13-200-2 "));
assertNull(n.getTwoWindingsTransformer("T-7-200-2 "));
assertNull(n.getTwoWindingsTransformer("T-200-7-3 "));
assertNull(n.getThreeWindingsTransformer("T-200-2-7-1 "));
assertNull(n.getThreeWindingsTransformer("T-4-200-7-2 "));
assertNull(n.getThreeWindingsTransformer("T-4-2-200-3 "));
assertNull(n.getHvdcLine("TwoTerminalDc-EATL P1 "));
assertNull(n.getHvdcLine("TwoTerminalDc-EATL P2 "));
assertNull(n.getShuntCompensator("B200-SwSH1"));
}

@Test
void importTest14BadlyDefinedControlledBuses() throws IOException {
Network n = importTest("IEEE_14_buses_badly_defined_controlled_buses", "IEEE_14_buses_badly_defined_controlled_buses.raw", false);

// Ensure that the equipment is imported
assertNotNull(n.getGenerator("B8-G1 "));
assertNotNull(n.getTwoWindingsTransformer("T-4-7-1 "));
assertNotNull(n.getThreeWindingsTransformer("T-4-7-9-1 "));
assertNotNull(n.getThreeWindingsTransformer("T-4-7-9-1 "));
assertNotNull(n.getThreeWindingsTransformer("T-4-7-9-1 "));
assertNotNull(n.getShuntCompensator("B2-SwSH1"));
}

@Test
void testRates() throws IOException {
Context context = new Context();
Expand Down
Loading

0 comments on commit fc57370

Please sign in to comment.