private RatioTapChangerAdder adder() { if (tx2 != null) { return tx2.newRatioTapChanger(); } else if (tx3 != null) { int side = context.tapChangerTransformers().whichSide(id); if (side == 1) { // No supported in IIDM model return null; } else if (side == 2) { return tx3.getLeg2().newRatioTapChanger(); } else if (side == 3) { return tx3.getLeg2().newRatioTapChanger(); } } return null; }
@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 readRatioTapChanger(String[] tokens) { int num = Integer.parseInt(tokens[1]); int tap = Integer.parseInt(tokens[2]); String id = mapper.getId(AmplSubset.RATIO_TAP_CHANGER, num); if (id.endsWith(AmplConstants.LEG2_SUFFIX) || id.endsWith(AmplConstants.LEG3_SUFFIX)) { ThreeWindingsTransformer twt = network.getThreeWindingsTransformer(id.substring(0, id.indexOf(AmplConstants.LEG2_SUFFIX))); if (twt == null) { throw new AmplException("Invalid three windings transformer id '" + id + "'"); } if (id.endsWith(AmplConstants.LEG2_SUFFIX)) { RatioTapChanger rtc2 = twt.getLeg2().getRatioTapChanger(); rtc2.setTapPosition(rtc2.getLowTapPosition() + tap - 1); } else if (id.endsWith(AmplConstants.LEG3_SUFFIX)) { RatioTapChanger rtc3 = twt.getLeg3().getRatioTapChanger(); rtc3.setTapPosition(rtc3.getLowTapPosition() + tap - 1); } else { throw new AssertionError(); } } else { TwoWindingsTransformer twt = network.getTwoWindingsTransformer(id); if (twt == null) { throw new AmplException("Invalid two windings transformer id '" + id + "'"); } RatioTapChanger rtc = twt.getRatioTapChanger(); rtc.setTapPosition(rtc.getLowTapPosition() + tap - 1); } return null; }
@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(); } }
private void writeThreeWindingsTransformerTapChangerTable(TableFormatter formatter) throws IOException { for (ThreeWindingsTransformer twt : network.getThreeWindingsTransformers()) { RatioTapChanger rtc2 = twt.getLeg2().getRatioTapChanger(); if (rtc2 != null) { String id = twt.getId() + "_leg2_ratio_table"; Terminal t2 = twt.getLeg2().getTerminal(); double vb2 = t2.getVoltageLevel().getNominalV(); double zb2 = vb2 * vb2 / AmplConstants.SB; writeRatioTapChanger(formatter, id, zb2, twt.getLeg2().getX(), rtc2); } RatioTapChanger rtc3 = twt.getLeg3().getRatioTapChanger(); if (rtc3 != null) { String id = twt.getId() + "_leg3_ratio_table"; Terminal t3 = twt.getLeg3().getTerminal(); double vb3 = t3.getVoltageLevel().getNominalV(); double zb3 = vb3 * vb3 / AmplConstants.SB; writeRatioTapChanger(formatter, id, zb3, twt.getLeg3().getX(), rtc3); } } }
/** * 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); }
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 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()); } }
@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)); }
private Terminal terminal() { int side = context.tapChangerTransformers().whichSide(id); if (tx2 != null) { if (side == 1) { return tx2.getTerminal1(); } else if (side == 2) { return tx2.getTerminal2(); } } else if (tx3 != null) { if (side == 1) { // invalid } else if (side == 2) { return tx3.getLeg2().getTerminal(); } else if (side == 3) { return tx3.getLeg3().getTerminal(); } } return null; }
@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 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); } }
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; }
@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 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) ); } }
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, ""); } } }
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 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; }