protected static void addNextTerminals(TerminalExt otherTerminal, List<TerminalExt> nextTerminals) { Objects.requireNonNull(otherTerminal); Objects.requireNonNull(nextTerminals); Connectable otherConnectable = otherTerminal.getConnectable(); if (otherConnectable instanceof Branch) { Branch branch = (Branch) otherConnectable; if (branch.getTerminal1() == otherTerminal) { nextTerminals.add((TerminalExt) branch.getTerminal2()); } else if (branch.getTerminal2() == otherTerminal) { nextTerminals.add((TerminalExt) branch.getTerminal1()); } else { throw new AssertionError(); } } else if (otherConnectable instanceof ThreeWindingsTransformer) { ThreeWindingsTransformer ttc = (ThreeWindingsTransformer) otherConnectable; if (ttc.getLeg1().getTerminal() == otherTerminal) { nextTerminals.add((TerminalExt) ttc.getLeg2().getTerminal()); nextTerminals.add((TerminalExt) ttc.getLeg3().getTerminal()); } else if (ttc.getLeg2().getTerminal() == otherTerminal) { nextTerminals.add((TerminalExt) ttc.getLeg1().getTerminal()); nextTerminals.add((TerminalExt) ttc.getLeg3().getTerminal()); } else if (ttc.getLeg3().getTerminal() == otherTerminal) { nextTerminals.add((TerminalExt) ttc.getLeg1().getTerminal()); nextTerminals.add((TerminalExt) ttc.getLeg2().getTerminal()); } else { throw new AssertionError(); } } }
private boolean readThreeWindingsTransformerBranch(String id, double p, double q, int busNum) { if (id.endsWith(AmplConstants.LEG1_SUFFIX)) { ThreeWindingsTransformer tht = network.getThreeWindingsTransformer(id.substring(0, id.indexOf(AmplConstants.LEG1_SUFFIX))); if (tht != null) { tht.getLeg1().getTerminal().setP(p).setQ(q); busConnection(tht.getLeg1().getTerminal(), busNum); } else { throw new AmplException("Invalid branch (leg1) id '" + id + "'"); } } else if (id.endsWith(AmplConstants.LEG2_SUFFIX)) { ThreeWindingsTransformer tht = network.getThreeWindingsTransformer(id.substring(0, id.indexOf(AmplConstants.LEG2_SUFFIX))); if (tht != null) { tht.getLeg2().getTerminal().setP(p).setQ(q); busConnection(tht.getLeg1().getTerminal(), busNum); } else { throw new AmplException("Invalid branch (leg2) id '" + id + "'"); } } else if (id.endsWith(AmplConstants.LEG3_SUFFIX)) { ThreeWindingsTransformer tht = network.getThreeWindingsTransformer(id.substring(0, id.indexOf(AmplConstants.LEG3_SUFFIX))); if (tht != null) { tht.getLeg3().getTerminal().setP(p).setQ(q); busConnection(tht.getLeg1().getTerminal(), busNum); } else { throw new AmplException("Invalid branch (leg3) id '" + id + "'"); } } else { return false; } return true; }
@Override public void visitThreeWindingsTransformer(ThreeWindingsTransformer transformer, ThreeWindingsTransformer.Side side) { switch (side) { case ONE: visitTerminal(transformer.getLeg1().getTerminal()); break; case TWO: visitTerminal(transformer.getLeg2().getTerminal()); break; case THREE: visitTerminal(transformer.getLeg3().getTerminal()); break; default: throw new AssertionError(); } }
switch (side) { case ONE: t = twt.getLeg1().getTerminal(); break; case TWO:
/** * Return true if the given {@link ThreeWindingsTransformer} should be kept in the network, false otherwise */ protected boolean test(ThreeWindingsTransformer transformer) { Objects.requireNonNull(transformer); VoltageLevel vl1 = transformer.getLeg1().getTerminal().getVoltageLevel(); VoltageLevel vl2 = transformer.getLeg2().getTerminal().getVoltageLevel(); VoltageLevel vl3 = transformer.getLeg3().getTerminal().getVoltageLevel(); return test(vl1) && test(vl2) && test(vl3); }
@Override protected void reduce(ThreeWindingsTransformer transformer) { VoltageLevel vl1 = transformer.getLeg1().getTerminal().getVoltageLevel(); VoltageLevel vl2 = transformer.getLeg2().getTerminal().getVoltageLevel(); VoltageLevel vl3 = transformer.getLeg3().getTerminal().getVoltageLevel(); if (getPredicate().test(vl1) || getPredicate().test(vl2) || getPredicate().test(vl3)) { throw new UnsupportedOperationException("Reduction of three-windings transformers is not supported"); } else { transformer.remove(); } observers.forEach(o -> o.transformerRemoved(transformer)); }
@Override protected boolean hasSubElements(ThreeWindingsTransformer twt) { return twt.getLeg2().getRatioTapChanger() != null || twt.getLeg3().getRatioTapChanger() != null || twt.getLeg1().getCurrentLimits() != null || twt.getLeg2().getCurrentLimits() != null || twt.getLeg3().getCurrentLimits() != null; }
private void writeThreeWindingsTransformerCurrentLimits(TableFormatter formatter) throws IOException { for (ThreeWindingsTransformer twt : network.getThreeWindingsTransformers()) { if (twt.getLeg1().getCurrentLimits() != null) { String branchId = twt.getId() + AmplConstants.LEG1_SUFFIX; writeTemporaryCurrentLimits(twt.getLeg1().getCurrentLimits(), formatter, branchId, false, ""); } if (twt.getLeg2().getCurrentLimits() != null) { String branchId = twt.getId() + AmplConstants.LEG2_SUFFIX; writeTemporaryCurrentLimits(twt.getLeg2().getCurrentLimits(), formatter, branchId, true, ""); } if (twt.getLeg3().getCurrentLimits() != null) { String branchId = twt.getId() + AmplConstants.LEG3_SUFFIX; writeTemporaryCurrentLimits(twt.getLeg3().getCurrentLimits(), formatter, branchId, true, ""); } } }
private static void checkRemovability(Substation substation, ThreeWindingsTransformer twt) { Substation s1 = twt.getLeg1().getTerminal().getVoltageLevel().getSubstation(); Substation s2 = twt.getLeg2().getTerminal().getVoltageLevel().getSubstation(); Substation s3 = twt.getLeg3().getTerminal().getVoltageLevel().getSubstation(); if ((s1 != substation) || (s2 != substation) || (s3 != substation)) { throw createIsolationException(substation); } }
@Override protected void writeRootElementAttributes(ThreeWindingsTransformer twt, Substation s, NetworkXmlWriterContext context) throws XMLStreamException { XmlUtil.writeDouble("r1", twt.getLeg1().getR(), context.getWriter()); XmlUtil.writeDouble("x1", twt.getLeg1().getX(), context.getWriter()); XmlUtil.writeDouble("g1", twt.getLeg1().getG(), context.getWriter()); XmlUtil.writeDouble("b1", twt.getLeg1().getB(), context.getWriter()); XmlUtil.writeDouble("ratedU1", twt.getLeg1().getRatedU(), context.getWriter()); XmlUtil.writeDouble("r2", twt.getLeg2().getR(), context.getWriter()); XmlUtil.writeDouble("x2", twt.getLeg2().getX(), context.getWriter()); XmlUtil.writeDouble("ratedU2", twt.getLeg2().getRatedU(), context.getWriter()); XmlUtil.writeDouble("r3", twt.getLeg3().getR(), context.getWriter()); XmlUtil.writeDouble("x3", twt.getLeg3().getX(), context.getWriter()); XmlUtil.writeDouble("ratedU3", twt.getLeg3().getRatedU(), context.getWriter()); writeNodeOrBus(1, twt.getLeg1().getTerminal(), context); writeNodeOrBus(2, twt.getLeg2().getTerminal(), context); writeNodeOrBus(3, twt.getLeg3().getTerminal(), context); if (context.getOptions().isWithBranchSV()) { writePQ(1, twt.getLeg1().getTerminal(), context.getWriter()); writePQ(2, twt.getLeg2().getTerminal(), context.getWriter()); writePQ(3, twt.getLeg3().getTerminal(), context.getWriter()); } }
private static void extractTfo3WData(Network network, NetworkData networkData) { for (ThreeWindingsTransformer tfo : network.getThreeWindingsTransformers()) { networkData.addTfo3WData(new Tfo3WData(tfo.getId(), (tfo.getLeg1().getTerminal().getBusBreakerView().getBus() != null) ? tfo.getLeg1().getTerminal().getBusBreakerView().getBus().getId() : tfo.getLeg1().getTerminal().getBusBreakerView().getConnectableBus().getId(), (tfo.getLeg2().getTerminal().getBusBreakerView().getBus() != null) ? tfo.getLeg2().getTerminal().getBusBreakerView().getBus().getId() : tfo.getLeg2().getTerminal().getBusBreakerView().getConnectableBus().getId(), (tfo.getLeg3().getTerminal().getBusBreakerView().getBus() != null) ? tfo.getLeg3().getTerminal().getBusBreakerView().getBus().getId() : tfo.getLeg3().getTerminal().getBusBreakerView().getConnectableBus().getId(), apparentPower(tfo.getLeg1().getTerminal()), apparentPower(tfo.getLeg2().getTerminal()), apparentPower(tfo.getLeg3().getTerminal()), tfo.getLeg1().getTerminal().getVoltageLevel().getNominalV(), tfo.getLeg1().getTerminal().getVoltageLevel().getNominalV(), tfo.getLeg3().getTerminal().getVoltageLevel().getNominalV(), (tfo.getLeg1().getCurrentLimits() != null) ? tfo.getLeg1().getCurrentLimits().getPermanentLimit() : Float.NaN, (tfo.getLeg2().getCurrentLimits() != null) ? tfo.getLeg2().getCurrentLimits().getPermanentLimit() : Float.NaN, (tfo.getLeg3().getCurrentLimits() != null) ? tfo.getLeg3().getCurrentLimits().getPermanentLimit() : Float.NaN) ); } }
@Override protected void writeSubElements(ThreeWindingsTransformer twt, Substation s, NetworkXmlWriterContext context) throws XMLStreamException { RatioTapChanger rtc2 = twt.getLeg2().getRatioTapChanger(); if (rtc2 != null) { writeRatioTapChanger("ratioTapChanger2", rtc2, context); } RatioTapChanger rtc3 = twt.getLeg3().getRatioTapChanger(); if (rtc3 != null) { writeRatioTapChanger("ratioTapChanger3", rtc3, context); } if (twt.getLeg1().getCurrentLimits() != null) { writeCurrentLimits(1, twt.getLeg1().getCurrentLimits(), context.getWriter()); } if (twt.getLeg2().getCurrentLimits() != null) { writeCurrentLimits(2, twt.getLeg2().getCurrentLimits(), context.getWriter()); } if (twt.getLeg3().getCurrentLimits() != null) { writeCurrentLimits(3, twt.getLeg3().getCurrentLimits(), context.getWriter()); } }
private static int getThreeWindingsTransformerMiddleBusComponentNum(AmplExportContext context, ThreeWindingsTransformer twt) { Terminal t1 = twt.getLeg1().getTerminal(); Terminal t2 = twt.getLeg2().getTerminal(); Terminal t3 = twt.getLeg3().getTerminal(); Bus b1 = AmplUtil.getBus(t1); Bus b2 = AmplUtil.getBus(t2); Bus b3 = AmplUtil.getBus(t3); int middleCcNum; if (b1 != null) { middleCcNum = ConnectedComponents.getCcNum(b1); } else if (b2 != null) { middleCcNum = ConnectedComponents.getCcNum(b2); } else if (b3 != null) { middleCcNum = ConnectedComponents.getCcNum(b3); } else { middleCcNum = context.otherCcNum--; } return middleCcNum; }
public static Complex calcStarVoltage(ThreeWindingsTransformer twt, double ratedU0) { Objects.requireNonNull(twt); Complex v1 = ComplexUtils.polar2Complex(getV(twt.getLeg1()), getTheta(twt.getLeg1())); Complex v2 = ComplexUtils.polar2Complex(getV(twt.getLeg2()), getTheta(twt.getLeg2())); Complex v3 = ComplexUtils.polar2Complex(getV(twt.getLeg3()), getTheta(twt.getLeg3())); Complex ytr1 = new Complex(twt.getLeg1().getR(), twt.getLeg1().getX()).reciprocal(); Complex ytr2 = new Complex(adjustedR(twt.getLeg2()), adjustedX(twt.getLeg2())).reciprocal(); Complex ytr3 = new Complex(adjustedR(twt.getLeg3()), adjustedX(twt.getLeg3())).reciprocal(); Complex a01 = new Complex(1, 0); Complex a1 = new Complex(twt.getLeg1().getRatedU() / ratedU0, 0); Complex a02 = new Complex(1, 0); Complex a2 = new Complex(1 / rho(twt.getLeg2(), ratedU0), 0); Complex a03 = new Complex(1, 0); Complex a3 = new Complex(1 / rho(twt.getLeg3(), ratedU0), 0); // IIDM model includes admittance to ground at star bus side in Leg1 Complex ysh01 = new Complex(twt.getLeg1().getG(), twt.getLeg1().getB()); Complex ysh02 = new Complex(0, 0); Complex ysh03 = new Complex(0, 0); Complex y01 = ytr1.negate().divide(a01.conjugate().multiply(a1)); Complex y02 = ytr2.negate().divide(a02.conjugate().multiply(a2)); Complex y03 = ytr3.negate().divide(a03.conjugate().multiply(a3)); Complex y0101 = ytr1.add(ysh01).divide(a01.conjugate().multiply(a01)); Complex y0202 = ytr2.add(ysh02).divide(a02.conjugate().multiply(a02)); Complex y0303 = ytr3.add(ysh03).divide(a03.conjugate().multiply(a03)); return y01.multiply(v1).add(y02.multiply(v2)).add(y03.multiply(v3)).negate() .divide(y0101.add(y0202).add(y0303)); }
@Override public <T extends Connectable> T getConnectable(String id, Class<T> aClass) { // the fastest way to get the equipment is to look in the object store // and then check if it is connected to this substation T connectable = substation.getNetwork().getObjectStore().get(id, aClass); if (connectable == null) { return null; } else if (connectable instanceof Injection) { return ((Injection) connectable).getTerminal().getVoltageLevel() == this ? connectable : null; } else if (connectable instanceof Branch) { return ((Branch) connectable).getTerminal1().getVoltageLevel() == this || ((Branch) connectable).getTerminal2().getVoltageLevel() == this ? connectable : null; } else if (connectable instanceof ThreeWindingsTransformer) { return ((ThreeWindingsTransformer) connectable).getLeg1().getTerminal().getVoltageLevel() == this || ((ThreeWindingsTransformer) connectable).getLeg2().getTerminal().getVoltageLevel() == this || ((ThreeWindingsTransformer) connectable).getLeg3().getTerminal().getVoltageLevel() == this ? connectable : null; } else { throw new AssertionError(); } }
@Override protected void readSubElements(ThreeWindingsTransformer tx, NetworkXmlReaderContext context) throws XMLStreamException { readUntilEndRootElement(context.getReader(), () -> { switch (context.getReader().getLocalName()) { case "currentLimits1": readCurrentLimits(1, tx.getLeg1()::newCurrentLimits, context.getReader()); break; case "currentLimits2": readCurrentLimits(2, tx.getLeg2()::newCurrentLimits, context.getReader()); break; case "currentLimits3": readCurrentLimits(3, tx.getLeg3()::newCurrentLimits, context.getReader()); break; case "ratioTapChanger2": readRatioTapChanger(2, tx.getLeg2(), context); break; case "ratioTapChanger3": readRatioTapChanger(3, tx.getLeg3(), context); break; default: super.readSubElements(tx, context); } }); } }
private static void fillThreeWindingsTransformers(StringToIntMapper<AmplSubset> mapper, Network network) { for (ThreeWindingsTransformer twt : network.getThreeWindingsTransformers()) { mapper.newInt(AmplSubset.VOLTAGE_LEVEL, twt.getId()); mapper.newInt(AmplSubset.BUS, twt.getId()); mapper.newInt(AmplSubset.THREE_WINDINGS_TRANSFO, twt.getId()); mapper.newInt(AmplSubset.BRANCH, twt.getId() + AmplConstants.LEG1_SUFFIX); mapper.newInt(AmplSubset.BRANCH, twt.getId() + AmplConstants.LEG2_SUFFIX); mapper.newInt(AmplSubset.BRANCH, twt.getId() + AmplConstants.LEG3_SUFFIX); if (twt.getLeg2().getRatioTapChanger() != null) { mapper.newInt(AmplSubset.TAP_CHANGER_TABLE, twt.getId() + "_leg2_ratio_table"); mapper.newInt(AmplSubset.RATIO_TAP_CHANGER, twt.getId() + AmplConstants.LEG2_SUFFIX); } if (twt.getLeg3().getRatioTapChanger() != null) { mapper.newInt(AmplSubset.TAP_CHANGER_TABLE, twt.getId() + "_leg3_ratio_table"); mapper.newInt(AmplSubset.RATIO_TAP_CHANGER, twt.getId() + AmplConstants.LEG3_SUFFIX); } // limits if (twt.getLeg1().getCurrentLimits() != null) { createLimitsIds(mapper, twt.getLeg1().getCurrentLimits(), twt.getId() + AmplConstants.LEG1_SUFFIX, ""); } if (twt.getLeg2().getCurrentLimits() != null) { createLimitsIds(mapper, twt.getLeg2().getCurrentLimits(), twt.getId() + AmplConstants.LEG2_SUFFIX, ""); } if (twt.getLeg3().getCurrentLimits() != null) { createLimitsIds(mapper, twt.getLeg3().getCurrentLimits(), twt.getId() + AmplConstants.LEG3_SUFFIX, ""); } } }
twt.getLeg1().getTerminal().setP(Float.NaN).setQ(Float.NaN); twt.getLeg2().getTerminal().setP(Float.NaN).setQ(Float.NaN); twt.getLeg3().getTerminal().setP(Float.NaN).setQ(Float.NaN);
public static Network createWithCurrentLimits() { Network network = create(); network.getThreeWindingsTransformer("3WT").getLeg1().newCurrentLimits() .setPermanentLimit(1000.0) .beginTemporaryLimit()
@Override protected ThreeWindingsTransformer readRootElementAttributes(ThreeWindingsTransformerAdder adder, NetworkXmlReaderContext context) { double r1 = XmlUtil.readDoubleAttribute(context.getReader(), "r1"); double x1 = XmlUtil.readDoubleAttribute(context.getReader(), "x1"); double g1 = XmlUtil.readDoubleAttribute(context.getReader(), "g1"); double b1 = XmlUtil.readDoubleAttribute(context.getReader(), "b1"); double ratedU1 = XmlUtil.readDoubleAttribute(context.getReader(), "ratedU1"); double r2 = XmlUtil.readDoubleAttribute(context.getReader(), "r2"); double x2 = XmlUtil.readDoubleAttribute(context.getReader(), "x2"); double ratedU2 = XmlUtil.readDoubleAttribute(context.getReader(), "ratedU2"); double r3 = XmlUtil.readDoubleAttribute(context.getReader(), "r3"); double x3 = XmlUtil.readDoubleAttribute(context.getReader(), "x3"); double ratedU3 = XmlUtil.readDoubleAttribute(context.getReader(), "ratedU3"); LegAdder legAdder1 = adder.newLeg1().setR(r1).setX(x1).setG(g1).setB(b1).setRatedU(ratedU1); LegAdder legAdder2 = adder.newLeg2().setR(r2).setX(x2).setRatedU(ratedU2); LegAdder legAdder3 = adder.newLeg3().setR(r3).setX(x3).setRatedU(ratedU3); readNodeOrBus(1, legAdder1, context); readNodeOrBus(2, legAdder2, context); readNodeOrBus(3, legAdder3, context); legAdder1.add(); legAdder2.add(); legAdder3.add(); ThreeWindingsTransformer twt = adder.add(); readPQ(1, twt.getLeg1().getTerminal(), context.getReader()); readPQ(2, twt.getLeg2().getTerminal(), context.getReader()); readPQ(3, twt.getLeg3().getTerminal(), context.getReader()); return twt; }