diff --git a/psse/psse-converter/src/main/java/com/powsybl/psse/converter/PsseImporter.java b/psse/psse-converter/src/main/java/com/powsybl/psse/converter/PsseImporter.java index 7576336d99f..4cc2ef302e9 100644 --- a/psse/psse-converter/src/main/java/com/powsybl/psse/converter/PsseImporter.java +++ b/psse/psse-converter/src/main/java/com/powsybl/psse/converter/PsseImporter.java @@ -248,6 +248,22 @@ private ContainersMapping defineContainersMapping(PssePowerFlowModel psseModel, List 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 busNumToPsseBus, List edges) { psseModel.getTransformers().forEach(t -> { if (t.getK() == 0) { // twoWindingsTransformers with zero impedance are not allowed if (busNumToPsseBus.containsKey(t.getI()) && busNumToPsseBus.containsKey(t.getJ())) { @@ -260,7 +276,9 @@ private ContainersMapping defineContainersMapping(PssePowerFlowModel psseModel, } } }); - // buses inside a psse substation are connected in the same way as transformers + } + + private void defineEdgesForBusesInsideSubstation(NodeBreakerValidation nodeBreakerValidation, List edges) { nodeBreakerValidation.getValidSubstations().forEach(psseSubstation -> { List busesInside = nodeBreakerValidation.getBuses(psseSubstation); if (busesInside.size() >= 2) { @@ -270,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 substationBusNumbers) { diff --git a/psse/psse-model/src/main/java/com/powsybl/psse/model/pf/PsseFixes.java b/psse/psse-model/src/main/java/com/powsybl/psse/model/pf/PsseFixes.java index 3b4f308544a..9ace94314af 100644 --- a/psse/psse-model/src/main/java/com/powsybl/psse/model/pf/PsseFixes.java +++ b/psse/psse-model/src/main/java/com/powsybl/psse/model/pf/PsseFixes.java @@ -23,6 +23,8 @@ */ public class PsseFixes { + private static final String WINDING_1 = "Winding1"; + private static final Logger LOGGER = LoggerFactory.getLogger(PsseFixes.class); private final PssePowerFlowModel model; private final PsseVersion version; @@ -53,9 +55,9 @@ private void fixDuplicatedIds() { private void fixTransformersWindingCod() { model.getTransformers().forEach(psseTransformer -> { if (psseTransformer.getK() == 0) { // TwoWindingsTransformers - fixTransformerWindingCod(psseTransformer, psseTransformer.getWinding1(), "Winding1"); + fixTransformerWindingCod(psseTransformer, psseTransformer.getWinding1(), WINDING_1); } else { - fixTransformerWindingCod(psseTransformer, psseTransformer.getWinding1(), "Winding1"); + fixTransformerWindingCod(psseTransformer, psseTransformer.getWinding1(), WINDING_1); fixTransformerWindingCod(psseTransformer, psseTransformer.getWinding2(), "Winding2"); fixTransformerWindingCod(psseTransformer, psseTransformer.getWinding3(), "Winding3"); } @@ -185,9 +187,9 @@ private void fixGeneratorsControlledBus(Set buses) { private void fixTransformersControlledBus(Set buses) { model.getTransformers().forEach(psseTransformer -> { if (psseTransformer.getK() == 0) { // TwoWindingsTransformers - fixTransformerWindingControlledBus(buses, psseTransformer, psseTransformer.getWinding1(), "Winding1"); + fixTransformerWindingControlledBus(buses, psseTransformer, psseTransformer.getWinding1(), WINDING_1); } else { - fixTransformerWindingControlledBus(buses, psseTransformer, psseTransformer.getWinding1(), "Winding1"); + fixTransformerWindingControlledBus(buses, psseTransformer, psseTransformer.getWinding1(), WINDING_1); fixTransformerWindingControlledBus(buses, psseTransformer, psseTransformer.getWinding2(), "Winding2"); fixTransformerWindingControlledBus(buses, psseTransformer, psseTransformer.getWinding3(), "Winding3"); } diff --git a/psse/psse-model/src/main/java/com/powsybl/psse/model/pf/PsseValidation.java b/psse/psse-model/src/main/java/com/powsybl/psse/model/pf/PsseValidation.java index d94cb1904be..3e0dd0302dd 100644 --- a/psse/psse-model/src/main/java/com/powsybl/psse/model/pf/PsseValidation.java +++ b/psse/psse-model/src/main/java/com/powsybl/psse/model/pf/PsseValidation.java @@ -196,12 +196,7 @@ private void validateNonTransformerBranches(List nonTr Map> busesNonTransformerBranches = new HashMap<>(); for (PsseNonTransformerBranch nonTransformerBranch : nonTransformerBranches) { - if (!buses.containsKey(nonTransformerBranch.getI())) { - validationWarnings.add(String.format("NonTransformerBranch: bus not found I: %d, NonTransformerBranch record %d, %d, %s, ... will be ignored", nonTransformerBranch.getI(), nonTransformerBranch.getI(), nonTransformerBranch.getJ(), nonTransformerBranch.getCkt())); - continue; - } - if (!buses.containsKey(nonTransformerBranch.getJ())) { - validationWarnings.add(String.format("NonTransformerBranch: bus not found J: %d, NonTransformerBranch record %d, %d, %s, ... will be ignored", nonTransformerBranch.getJ(), nonTransformerBranch.getI(), nonTransformerBranch.getJ(), nonTransformerBranch.getCkt())); + if (isBaldyConnectedNonTransformedBranch(nonTransformerBranch, buses)) { continue; } if (nonTransformerBranch.getX() == 0.0) { @@ -214,6 +209,18 @@ private void validateNonTransformerBranches(List nonTr checkDuplicatesLinks("NonTransformerBranch", "branches", getDuplicates(busesNonTransformerBranches)); } + private boolean isBaldyConnectedNonTransformedBranch(PsseNonTransformerBranch nonTransformerBranch, Map> buses) { + if (!buses.containsKey(nonTransformerBranch.getI())) { + validationWarnings.add(String.format("NonTransformerBranch: bus not found I: %d, NonTransformerBranch record %d, %d, %s, ... will be ignored", nonTransformerBranch.getI(), nonTransformerBranch.getI(), nonTransformerBranch.getJ(), nonTransformerBranch.getCkt())); + return true; + } + if (!buses.containsKey(nonTransformerBranch.getJ())) { + validationWarnings.add(String.format("NonTransformerBranch: bus not found J: %d, NonTransformerBranch record %d, %d, %s, ... will be ignored", nonTransformerBranch.getJ(), nonTransformerBranch.getI(), nonTransformerBranch.getJ(), nonTransformerBranch.getCkt())); + return true; + } + return false; + } + private void validateTransformers(List transformers, Map> buses) { List twoWindingsTransformers = transformers.parallelStream() .filter(transformer -> transformer.getK() == 0).toList(); @@ -228,12 +235,7 @@ private void validateTwoWindingsTransformers(List transformers, Map> busesTransformers = new HashMap<>(); for (PsseTransformer transformer : transformers) { - if (!buses.containsKey(transformer.getI())) { - validationWarnings.add(String.format("Transformer: bus not found I: %d, Transformer record %d, %d, %s, ... will be ignored", transformer.getI(), transformer.getI(), transformer.getJ(), transformer.getCkt())); - continue; - } - if (!buses.containsKey(transformer.getJ())) { - validationWarnings.add(String.format("Transformer: bus not found J: %d, Transformer record %d, %d, %s, ... will be ignored", transformer.getJ(), transformer.getI(), transformer.getJ(), transformer.getCkt())); + if (isBaldyConnectedT2wTransformer(transformer, buses)) { continue; } @@ -251,20 +253,23 @@ private void validateTwoWindingsTransformers(List transformers, checkDuplicatesLinks("Transformer", "branches", getDuplicates(busesTransformers)); } + private boolean isBaldyConnectedT2wTransformer(PsseTransformer transformer, Map> buses) { + if (!buses.containsKey(transformer.getI())) { + validationWarnings.add(String.format("Transformer: bus not found I: %d, Transformer record %d, %d, %s, ... will be ignored", transformer.getI(), transformer.getI(), transformer.getJ(), transformer.getCkt())); + return true; + } + if (!buses.containsKey(transformer.getJ())) { + validationWarnings.add(String.format("Transformer: bus not found J: %d, Transformer record %d, %d, %s, ... will be ignored", transformer.getJ(), transformer.getI(), transformer.getJ(), transformer.getCkt())); + return true; + } + return false; + } + private void validateThreeWindingsTransformers(List transformers, Map> buses) { Map> busesTransformers = new HashMap<>(); for (PsseTransformer transformer : transformers) { - if (!buses.containsKey(transformer.getI())) { - validationWarnings.add(String.format("Transformer: bus not found I: %d, Transformer record %d, %d, %d, %s, ... will be ignored", transformer.getI(), transformer.getI(), transformer.getJ(), transformer.getK(), transformer.getCkt())); - continue; - } - if (!buses.containsKey(transformer.getJ())) { - validationWarnings.add(String.format("Transformer: bus not found J: %d, Transformer record %d, %d, %d, %s, ... will be ignored", transformer.getJ(), transformer.getI(), transformer.getJ(), transformer.getK(), transformer.getCkt())); - continue; - } - if (!buses.containsKey(transformer.getK())) { - validationWarnings.add(String.format("Transformer: bus not found K: %d, Transformer record %d, %d, %d, %s, ... will be ignored", transformer.getK(), transformer.getI(), transformer.getJ(), transformer.getK(), transformer.getCkt())); + if (isBaldyConnectedT3wTransformer(transformer, buses)) { continue; } @@ -306,6 +311,22 @@ private void validateThreeWindingsTransformers(List transformer } } + private boolean isBaldyConnectedT3wTransformer(PsseTransformer transformer, Map> buses) { + if (!buses.containsKey(transformer.getI())) { + validationWarnings.add(String.format("Transformer: bus not found I: %d, Transformer record %d, %d, %d, %s, ... will be ignored", transformer.getI(), transformer.getI(), transformer.getJ(), transformer.getK(), transformer.getCkt())); + return true; + } + if (!buses.containsKey(transformer.getJ())) { + validationWarnings.add(String.format("Transformer: bus not found J: %d, Transformer record %d, %d, %d, %s, ... will be ignored", transformer.getJ(), transformer.getI(), transformer.getJ(), transformer.getK(), transformer.getCkt())); + return true; + } + if (!buses.containsKey(transformer.getK())) { + validationWarnings.add(String.format("Transformer: bus not found K: %d, Transformer record %d, %d, %d, %s, ... will be ignored", transformer.getK(), transformer.getI(), transformer.getJ(), transformer.getK(), transformer.getCkt())); + return true; + } + return false; + } + private void validateTransformerX(String id, double x, String xTag) { if (x == 0.0) { validationErrors.add(getErrorTransformer1Parameter(id, xTag, x)); @@ -359,12 +380,7 @@ private void validateTransformerWindingCont(Map> buses, S private void validateTwoTerminalDcTransmissionLines(List twoTerminalDcTransmissionLines, Map> buses) { Map twoTerminalDcNames = new HashMap<>(); for (PsseTwoTerminalDcTransmissionLine twoTerminalDc : twoTerminalDcTransmissionLines) { - if (!buses.containsKey(twoTerminalDc.getRectifier().getIp())) { - validationWarnings.add(String.format("TwoTerminalDcTransmissionLine: %s rectifier bus not found Ip: %d, TwoTerminalDcTransmissionLine record %s, ... will be ignored", twoTerminalDc.getName(), twoTerminalDc.getRectifier().getIp(), twoTerminalDc.getName())); - continue; - } - if (!buses.containsKey(twoTerminalDc.getInverter().getIp())) { - validationWarnings.add(String.format("TwoTerminalDcTransmissionLine: %s inverter bus not found Ip: %d, TwoTerminalDcTransmissionLine record %s, ... will be ignored", twoTerminalDc.getName(), twoTerminalDc.getInverter().getIp(), twoTerminalDc.getName())); + if (isBaldyConnectedTwoTerminalDcTransmissionLine(twoTerminalDc, buses)) { continue; } twoTerminalDcNames.put(twoTerminalDc.getName(), twoTerminalDcNames.getOrDefault(twoTerminalDc.getName(), 0) + 1); @@ -376,6 +392,18 @@ private void validateTwoTerminalDcTransmissionLines(List> buses) { + if (!buses.containsKey(twoTerminalDc.getRectifier().getIp())) { + validationWarnings.add(String.format("TwoTerminalDcTransmissionLine: %s rectifier bus not found Ip: %d, TwoTerminalDcTransmissionLine record %s, ... will be ignored", twoTerminalDc.getName(), twoTerminalDc.getRectifier().getIp(), twoTerminalDc.getName())); + return true; + } + if (!buses.containsKey(twoTerminalDc.getInverter().getIp())) { + validationWarnings.add(String.format("TwoTerminalDcTransmissionLine: %s inverter bus not found Ip: %d, TwoTerminalDcTransmissionLine record %s, ... will be ignored", twoTerminalDc.getName(), twoTerminalDc.getInverter().getIp(), twoTerminalDc.getName())); + return true; + } + return false; + } + private void validateSwitchedShunts(List switchedShunts, Map> buses, PsseVersion psseVersion) { Map> busesSwitchedShunts = new HashMap<>();