diff --git a/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/LineImpl.java b/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/LineImpl.java index 1f07ca74e..b2217e4be 100644 --- a/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/LineImpl.java +++ b/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/LineImpl.java @@ -144,12 +144,16 @@ public > void addExtension(Class type, E ex .code(mergedXnode.getCode()) .rdp(mergedXnode.getRdp()) .xdp(mergedXnode.getXdp()) - .xnodeP1(mergedXnode.getXnodeP1()) - .xnodeP2(mergedXnode.getXnodeP2()) - .xnodeQ1(mergedXnode.getXnodeQ1()) - .xnodeQ2(mergedXnode.getXnodeQ2()) + .line1Id(mergedXnode.getLine1Name()) .line1Name(mergedXnode.getLine1Name()) + .line1Fictitious(mergedXnode.isLine1Fictitious()) + .b1dp(mergedXnode.getB1dp()) + .g1dp(mergedXnode.getG1dp()) + .line2Id(mergedXnode.getLine2Name()) .line2Name(mergedXnode.getLine2Name()) + .line2Fictitious(mergedXnode.isLine2Fictitious()) + .b2dp(mergedXnode.getB2dp()) + .g2dp(mergedXnode.getG2dp()) .build()); updateResource(); } @@ -179,12 +183,18 @@ private MergedXnode createMergedXnode() { return new MergedXnodeImpl(this, resource.getAttributes().getMergedXnode().getRdp(), resource.getAttributes().getMergedXnode().getXdp(), - resource.getAttributes().getMergedXnode().getXnodeP1(), - resource.getAttributes().getMergedXnode().getXnodeQ1(), - resource.getAttributes().getMergedXnode().getXnodeP2(), - resource.getAttributes().getMergedXnode().getXnodeQ2(), resource.getAttributes().getMergedXnode().getLine1Name(), + resource.getAttributes().getMergedXnode().isLine1Fictitious(), + 0, + 0, + resource.getAttributes().getMergedXnode().getB1dp(), + resource.getAttributes().getMergedXnode().getG1dp(), resource.getAttributes().getMergedXnode().getLine2Name(), + resource.getAttributes().getMergedXnode().isLine2Fictitious(), + 0, + 0, + resource.getAttributes().getMergedXnode().getB2dp(), + resource.getAttributes().getMergedXnode().getG2dp(), resource.getAttributes().getMergedXnode().getCode()); } return null; diff --git a/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/TieLineAdderImpl.java b/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/TieLineAdderImpl.java index 8e7aadb3e..f588d9eb7 100644 --- a/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/TieLineAdderImpl.java +++ b/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/TieLineAdderImpl.java @@ -16,6 +16,7 @@ /** * @author Abdelsalem Hedhili + * @author Slimane Amar */ public class TieLineAdderImpl extends AbstractBranchAdder implements TieLineAdder { @@ -56,7 +57,7 @@ public HalfLineAdderImpl setId(String id) { } public String getName() { - return name; + return name != null ? name : id; } public HalfLineAdderImpl setName(String name) { @@ -200,11 +201,15 @@ public TieLine add() { double r = halfLine1Adder.getR() + halfLine2Adder.getR(); double x = halfLine1Adder.getX() + halfLine2Adder.getX(); double b1 = halfLine1Adder.getB1() + halfLine1Adder.getB2(); - double b2 = halfLine2Adder.getB1() + halfLine2Adder.getB2(); double g1 = halfLine1Adder.getG1() + halfLine1Adder.getG2(); + double b2 = halfLine2Adder.getB1() + halfLine2Adder.getB2(); double g2 = halfLine2Adder.getG1() + halfLine2Adder.getG2(); double rdp = r == 0 ? 0.5 : halfLine1Adder.getR() / r; double xdp = x == 0 ? 0.5 : halfLine1Adder.getX() / x; + double b1dp = b1 == 0 ? 0.5 : halfLine1Adder.getB1() / b1; + double g1dp = g1 == 0 ? 0.5 : halfLine1Adder.getG1() / g1; + double b2dp = b2 == 0 ? 0.5 : halfLine2Adder.getB1() / b2; + double g2dp = g2 == 0 ? 0.5 : halfLine2Adder.getG1() / g2; Resource resource = Resource.lineBuilder() .id(id) .attributes(LineAttributes.builder() @@ -228,13 +233,16 @@ public TieLine add() { MergedXnodeAttributes.builder() .rdp((float) rdp) .xdp((float) xdp) - //FIXME need to implement boundary to set the xnodeP and xnodeQ (https://github.com/powsybl/powsybl-core/wiki/IIDM-&-XIIDM-1.5-evolutions#changes-and-fixes) - .xnodeP1(Double.NaN) - .xnodeQ1(Double.NaN) - .xnodeP2(Double.NaN) - .xnodeQ2(Double.NaN) - .line1Name(halfLine1Adder.getId()) - .line2Name(halfLine2Adder.getId()) + .line1Id(halfLine1Adder.getId()) + .line1Name(halfLine1Adder.getName()) + .line1Fictitious(halfLine1Adder.isFictitious()) + .b1dp((float) b1dp) + .g1dp((float) g1dp) + .line2Id(halfLine2Adder.getId()) + .line2Name(halfLine2Adder.getName()) + .line2Fictitious(halfLine2Adder.isFictitious()) + .b2dp((float) b2dp) + .g2dp((float) g2dp) .code(ucteXnodeCode) .build()) .build()).build(); diff --git a/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/TieLineImpl.java b/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/TieLineImpl.java index bacbae4ec..b8149d255 100644 --- a/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/TieLineImpl.java +++ b/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/TieLineImpl.java @@ -14,6 +14,7 @@ /** * @author Abdelsalem Hedhili + * @author Slimane Amar */ public class TieLineImpl extends LineImpl implements TieLine { @@ -29,7 +30,25 @@ public TieLineImpl(NetworkObjectIndex index, Resource resource) } } - class HalfLineImpl implements HalfLine { + private final class PositionRatio { + private double sum; + private float ratio; + + private PositionRatio(double sum, float ratio) { + this.sum = sum; + this.ratio = ratio; + } + + private PositionRatio setSideValue(double sideValue, boolean sideOne) { + double newSide1Value = sideOne ? sideValue : sum * ratio; + double newSide2Value = !sideOne ? sideValue : sum * (1 - ratio); + sum = newSide1Value + newSide2Value; + ratio = (float) (sum == 0 ? 0.5 : newSide1Value / sum); + return this; + } + } + + class HalfLineImpl implements HalfLine, Validable { private final boolean one; @@ -91,13 +110,21 @@ public HalfLineImpl(boolean one) { @Override public String getId() { - return one ? resource.getAttributes().getMergedXnode().getLine1Name() - : resource.getAttributes().getMergedXnode().getLine2Name(); + return one ? resource.getAttributes().getMergedXnode().getLine1Id() + : resource.getAttributes().getMergedXnode().getLine2Id(); } @Override public String getName() { - return getId(); + String name = one ? resource.getAttributes().getMergedXnode().getLine1Name() + : resource.getAttributes().getMergedXnode().getLine2Name(); + return name != null ? name : getId(); + } + + @Override + public boolean isFictitious() { + return one ? resource.getAttributes().getMergedXnode().isLine1Fictitious() + : resource.getAttributes().getMergedXnode().isLine2Fictitious(); } @Override @@ -107,7 +134,13 @@ public double getR() { @Override public HalfLineImpl setR(double r) { - throw new UnsupportedOperationException("TODO"); + ValidationUtil.checkR(this, r); + double oldValue = getR(); + PositionRatio positionRatio = new PositionRatio(resource.getAttributes().getR(), resource.getAttributes().getMergedXnode().getRdp()).setSideValue(r, one); + resource.getAttributes().setR(positionRatio.sum); + resource.getAttributes().getMergedXnode().setRdp(positionRatio.ratio); + index.notifyUpdate(TieLineImpl.this, getHalfLineAttribute() + ".r", oldValue, r); + return this; } @Override @@ -117,53 +150,150 @@ public double getX() { @Override public HalfLineImpl setX(double x) { - throw new UnsupportedOperationException("TODO"); + ValidationUtil.checkX(this, x); + double oldValue = getX(); + PositionRatio positionRatio = new PositionRatio(resource.getAttributes().getX(), resource.getAttributes().getMergedXnode().getXdp()).setSideValue(x, one); + resource.getAttributes().setX(positionRatio.sum); + resource.getAttributes().getMergedXnode().setXdp(positionRatio.ratio); + index.notifyUpdate(TieLineImpl.this, getHalfLineAttribute() + ".x", oldValue, x); + return this; } @Override public double getG1() { - return one ? TieLineImpl.this.getG1() / 2 : TieLineImpl.this.getG2() / 2; + return one ? + TieLineImpl.this.getG1() * resource.getAttributes().getMergedXnode().getG1dp() : + TieLineImpl.this.getG2() * resource.getAttributes().getMergedXnode().getG2dp(); + } + + private void setSideG(double g, boolean halfLineSideOne) { + if (one) { + PositionRatio positionRatio = new PositionRatio(resource.getAttributes().getG1(), resource.getAttributes().getMergedXnode().getG1dp()).setSideValue(g, halfLineSideOne); + resource.getAttributes().setG1(positionRatio.sum); + resource.getAttributes().getMergedXnode().setG1dp(positionRatio.ratio); + } else { + PositionRatio positionRatio = new PositionRatio(resource.getAttributes().getG2(), resource.getAttributes().getMergedXnode().getG2dp()).setSideValue(g, halfLineSideOne); + resource.getAttributes().setG2(positionRatio.sum); + resource.getAttributes().getMergedXnode().setG2dp(positionRatio.ratio); + } } @Override public HalfLineImpl setG1(double g1) { - throw new UnsupportedOperationException("TODO"); + ValidationUtil.checkG1(this, g1); + double oldValue = getG1(); + setSideG(g1, true); + index.notifyUpdate(TieLineImpl.this, getHalfLineAttribute() + ".g1", oldValue, g1); + return this; } @Override public double getG2() { - return one ? TieLineImpl.this.getG1() / 2 : TieLineImpl.this.getG2() / 2; + return one ? + TieLineImpl.this.getG1() * (1 - resource.getAttributes().getMergedXnode().getG1dp()) : + TieLineImpl.this.getG2() * (1 - resource.getAttributes().getMergedXnode().getG2dp()); } @Override public HalfLineImpl setG2(double g2) { - throw new UnsupportedOperationException("TODO"); + ValidationUtil.checkG2(this, g2); + double oldValue = getG2(); + setSideG(g2, false); + index.notifyUpdate(TieLineImpl.this, getHalfLineAttribute() + ".g2", oldValue, g2); + return this; } @Override public double getB1() { - return one ? TieLineImpl.this.getB1() / 2 : TieLineImpl.this.getB2() / 2; + return one ? + TieLineImpl.this.getB1() * resource.getAttributes().getMergedXnode().getB1dp() : + TieLineImpl.this.getB2() * resource.getAttributes().getMergedXnode().getB2dp(); + } + + private void setSideB(double b, boolean halfLineSideOne) { + if (one) { + PositionRatio positionRatio = new PositionRatio(resource.getAttributes().getB1(), resource.getAttributes().getMergedXnode().getB1dp()).setSideValue(b, halfLineSideOne); + resource.getAttributes().setB1(positionRatio.sum); + resource.getAttributes().getMergedXnode().setB1dp(positionRatio.ratio); + } else { + PositionRatio positionRatio = new PositionRatio(resource.getAttributes().getB2(), resource.getAttributes().getMergedXnode().getB2dp()).setSideValue(b, halfLineSideOne); + resource.getAttributes().setB2(positionRatio.sum); + resource.getAttributes().getMergedXnode().setB2dp(positionRatio.ratio); + } } @Override public HalfLineImpl setB1(double b1) { - throw new UnsupportedOperationException("TODO"); + ValidationUtil.checkB1(this, b1); + double oldValue = getB1(); + setSideB(b1, true); + index.notifyUpdate(TieLineImpl.this, getHalfLineAttribute() + ".b1", oldValue, b1); + return this; } @Override public double getB2() { - return one ? TieLineImpl.this.getB1() / 2 : TieLineImpl.this.getB2() / 2; + return one ? + TieLineImpl.this.getB1() * (1 - resource.getAttributes().getMergedXnode().getB1dp()) : + TieLineImpl.this.getB2() * (1 - resource.getAttributes().getMergedXnode().getB2dp()); } @Override public HalfLineImpl setB2(double b2) { - throw new UnsupportedOperationException("TODO"); + ValidationUtil.checkB2(this, b2); + double oldValue = getB2(); + setSideB(b2, false); + index.notifyUpdate(TieLineImpl.this, getHalfLineAttribute() + ".b2", oldValue, b2); + return this; } @Override public Boundary getBoundary() { return boundary; } + + private String getHalfLineAttribute() { + return "half" + (one ? "1" : "2"); + } + + @Override + public String getMessageHeader() { + return String.format("Tie line side %s '%s':", one ? "1" : "2", TieLineImpl.this.getId()); + } + } + + private ValidationException notSupportedForTieLinesException() { + return new ValidationException(this, "direct modification of characteristics not supported for tie lines"); + } + + @Override + public TieLineImpl setR(double r) { + throw notSupportedForTieLinesException(); + } + + @Override + public TieLineImpl setX(double x) { + throw notSupportedForTieLinesException(); + } + + @Override + public TieLineImpl setG1(double g1) { + throw notSupportedForTieLinesException(); + } + + @Override + public TieLineImpl setB1(double b1) { + throw notSupportedForTieLinesException(); + } + + @Override + public TieLineImpl setG2(double g2) { + throw notSupportedForTieLinesException(); + } + + @Override + public TieLineImpl setB2(double b2) { + throw notSupportedForTieLinesException(); } @Override diff --git a/network-store-integration-test/src/test/java/com/powsybl/network/store/integration/NetworkStoreIT.java b/network-store-integration-test/src/test/java/com/powsybl/network/store/integration/NetworkStoreIT.java index 2ed3e488a..83f11bef9 100644 --- a/network-store-integration-test/src/test/java/com/powsybl/network/store/integration/NetworkStoreIT.java +++ b/network-store-integration-test/src/test/java/com/powsybl/network/store/integration/NetworkStoreIT.java @@ -2343,6 +2343,8 @@ public void testUcteNetwork() { .setNode2(2) .newHalfLine1() .setId("h1") + .setName("h1name") + .setFictitious(true) .setB1(1) .setB2(2) .setG1(3) @@ -2354,6 +2356,7 @@ public void testUcteNetwork() { .add() .newHalfLine2() .setId("h2") + .setFictitious(true) .setB1(1.5) .setB2(2.5) .setG1(3.5) @@ -2375,29 +2378,68 @@ public void testUcteNetwork() { assertEquals(3, tieLine2.getB1(), 0); assertEquals(4, tieLine2.getB2(), 0); assertEquals("h1", tieLine2.getHalf1().getId()); - assertEquals(1.5, tieLine2.getHalf1().getB1(), 0); - assertEquals(1.5, tieLine2.getHalf1().getB2(), 0); - assertEquals(3.5, tieLine2.getHalf1().getG1(), 0); - assertEquals(3.5, tieLine2.getHalf1().getG2(), 0); + assertEquals("h1name", tieLine2.getHalf1().getName()); + assertTrue(tieLine2.getHalf1().isFictitious()); + assertEquals(1, tieLine2.getHalf1().getB1(), ESP); + assertEquals(2, tieLine2.getHalf1().getB2(), ESP); + assertEquals(3, tieLine2.getHalf1().getG1(), ESP); + assertEquals(4, tieLine2.getHalf1().getG2(), ESP); assertEquals(5, tieLine2.getHalf1().getR(), ESP); assertEquals(6, tieLine2.getHalf1().getX(), ESP); assertEquals("h2", tieLine2.getHalf2().getId()); - assertEquals(2, tieLine2.getHalf2().getB1(), 0); - assertEquals(2, tieLine2.getHalf2().getB2(), 0); - assertEquals(4, tieLine2.getHalf2().getG1(), 0); - assertEquals(4, tieLine2.getHalf2().getG2(), 0); + assertTrue(tieLine2.getHalf2().isFictitious()); + assertEquals(1.5, tieLine2.getHalf2().getB1(), 0); + assertEquals(2.5, tieLine2.getHalf2().getB2(), 0); + assertEquals(3.5, tieLine2.getHalf2().getG1(), 0); + assertEquals(4.5, tieLine2.getHalf2().getG2(), 0); assertEquals(5.5, tieLine2.getHalf2().getR(), ESP); assertEquals(6.5, tieLine2.getHalf2().getX(), ESP); assertEquals("h1", tieLine2.getHalf(Branch.Side.ONE).getId()); assertEquals("h2", tieLine2.getHalf(Branch.Side.TWO).getId()); + tieLine2.getHalf1().setR(6); + assertEquals(6, tieLine2.getHalf1().getR(), ESP); + assertEquals(5.5, tieLine2.getHalf2().getR(), ESP); + + tieLine2.getHalf1().setX(7); + assertEquals(7, tieLine2.getHalf1().getX(), ESP); + assertEquals(6.5, tieLine2.getHalf2().getX(), ESP); + + tieLine2.getHalf1().setB1(1.5); + assertEquals(1.5, tieLine2.getHalf1().getB1(), ESP); + assertEquals(2, tieLine2.getHalf1().getB2(), ESP); + assertEquals(3.5, tieLine2.getB1(), ESP); + + tieLine2.getHalf1().setB2(2.5); + assertEquals(1.5, tieLine2.getHalf1().getB1(), ESP); + assertEquals(2.5, tieLine2.getHalf1().getB2(), ESP); + assertEquals(4, tieLine2.getB1(), ESP); + + tieLine2.getHalf1().setG1(3.5); + assertEquals(3.5, tieLine2.getHalf1().getG1(), ESP); + assertEquals(4, tieLine2.getHalf1().getG2(), ESP); + assertEquals(7.5, tieLine2.getG1(), ESP); + + tieLine2.getHalf1().setG2(4.5); + assertEquals(3.5, tieLine2.getHalf1().getG1(), ESP); + assertEquals(4.5, tieLine2.getHalf1().getG2(), ESP); + assertEquals(8, tieLine2.getG1(), ESP); + Line regularLine = readNetwork.getLine("F_SU1_12 F_SU2_11 2"); assertNull(regularLine.getExtension(MergedXnode.class)); regularLine.addExtension(MergedXnode.class, - new MergedXnodeImpl(regularLine, 1, 1, 1, 1, - 1, 1, "", "", "")); + new MergedXnodeImpl(regularLine, + 1, 1, + "", true, + 1, 1, + 1f / 3, 3f / 7, + "", true, + 1, 1, + 1.5f / 4, 3.5f / 8, + "")); assertNotNull(regularLine.getExtension(MergedXnode.class)); assertEquals(1, regularLine.getExtension(MergedXnode.class).getRdp(), .0001); + assertEquals("", regularLine.getExtension(MergedXnode.class).getLine1Name()); tieLine2.getTerminal1().setQ(200.); tieLine2.getTerminal2().setP(800.); diff --git a/network-store-integration-test/src/test/java/com/powsybl/network/store/integration/NetworkStoreValidationTest.java b/network-store-integration-test/src/test/java/com/powsybl/network/store/integration/NetworkStoreValidationTest.java index a6a73678e..da8ff3742 100644 --- a/network-store-integration-test/src/test/java/com/powsybl/network/store/integration/NetworkStoreValidationTest.java +++ b/network-store-integration-test/src/test/java/com/powsybl/network/store/integration/NetworkStoreValidationTest.java @@ -706,8 +706,12 @@ public void testTieLine() { .getMessage().contains("id is not set")); assertTrue(assertThrows(PowsyblException.class, () -> network.newTieLine().setId("TL").setVoltageLevel1("VL1").setVoltageLevel2("VL2").setNode1(1).setNode2(1).setUcteXnodeCode("1").newHalfLine2().add().newHalfLine1().setId("h1").add().add()) .getMessage().contains("r is not set")); + assertTrue(assertThrows(PowsyblException.class, () -> network.newTieLine().setId("TL").setVoltageLevel1("VL1").setVoltageLevel2("VL2").setNode1(1).setNode2(1).setUcteXnodeCode("1").newHalfLine2().add().newHalfLine1().setId("h1").setR(Double.NaN).add().add()) + .getMessage().contains("r is not set")); assertTrue(assertThrows(PowsyblException.class, () -> network.newTieLine().setId("TL").setVoltageLevel1("VL1").setVoltageLevel2("VL2").setNode1(1).setNode2(1).setUcteXnodeCode("1").newHalfLine2().add().newHalfLine1().setId("h1").setR(1).add().add()) .getMessage().contains("x is not set")); + assertTrue(assertThrows(PowsyblException.class, () -> network.newTieLine().setId("TL").setVoltageLevel1("VL1").setVoltageLevel2("VL2").setNode1(1).setNode2(1).setUcteXnodeCode("1").newHalfLine2().add().newHalfLine1().setId("h1").setR(1).setX(Double.NaN).add().add()) + .getMessage().contains("x is not set")); assertTrue(assertThrows(PowsyblException.class, () -> network.newTieLine().setId("TL").setVoltageLevel1("VL1").setVoltageLevel2("VL2").setNode1(1).setNode2(1).setUcteXnodeCode("1").newHalfLine2().add().newHalfLine1().setId("h1").setR(1).setX(1).add().add()) .getMessage().contains("g1 is not set")); assertTrue(assertThrows(PowsyblException.class, () -> network.newTieLine().setId("TL").setVoltageLevel1("VL1").setVoltageLevel2("VL2").setNode1(1).setNode2(1).setUcteXnodeCode("1").newHalfLine2().add().newHalfLine1().setId("h1").setR(1).setX(1).setG1(1).add().add()) @@ -717,7 +721,7 @@ public void testTieLine() { assertTrue(assertThrows(PowsyblException.class, () -> network.newTieLine().setId("TL").setVoltageLevel1("VL1").setVoltageLevel2("VL2").setNode1(1).setNode2(1).setUcteXnodeCode("1").newHalfLine2().add().newHalfLine1().setId("h1").setR(1).setX(1).setG1(1).setB1(1).setG2(1).add().add()) .getMessage().contains("b2 is not set")); - network.newTieLine() + TieLine tieLine = network.newTieLine() .setId("TL") .setVoltageLevel1("VL1") .setVoltageLevel2("VL2") @@ -743,6 +747,20 @@ public void testTieLine() { .setB2(1) .add() .add(); + + assertTrue(assertThrows(PowsyblException.class, () -> tieLine.setR(Double.NaN)).getMessage().contains("direct modification of characteristics not supported for tie lines")); + assertTrue(assertThrows(PowsyblException.class, () -> tieLine.setX(Double.NaN)).getMessage().contains("direct modification of characteristics not supported for tie lines")); + assertTrue(assertThrows(PowsyblException.class, () -> tieLine.setB1(Double.NaN)).getMessage().contains("direct modification of characteristics not supported for tie lines")); + assertTrue(assertThrows(PowsyblException.class, () -> tieLine.setB2(Double.NaN)).getMessage().contains("direct modification of characteristics not supported for tie lines")); + assertTrue(assertThrows(PowsyblException.class, () -> tieLine.setG1(Double.NaN)).getMessage().contains("direct modification of characteristics not supported for tie lines")); + assertTrue(assertThrows(PowsyblException.class, () -> tieLine.setG2(Double.NaN)).getMessage().contains("direct modification of characteristics not supported for tie lines")); + + assertTrue(assertThrows(PowsyblException.class, () -> tieLine.getHalf1().setR(Double.NaN)).getMessage().contains("r is invalid")); + assertTrue(assertThrows(PowsyblException.class, () -> tieLine.getHalf1().setX(Double.NaN)).getMessage().contains("x is invalid")); + assertTrue(assertThrows(PowsyblException.class, () -> tieLine.getHalf1().setB1(Double.NaN)).getMessage().contains("b1 is invalid")); + assertTrue(assertThrows(PowsyblException.class, () -> tieLine.getHalf1().setB2(Double.NaN)).getMessage().contains("b2 is invalid")); + assertTrue(assertThrows(PowsyblException.class, () -> tieLine.getHalf1().setG1(Double.NaN)).getMessage().contains("g1 is invalid")); + assertTrue(assertThrows(PowsyblException.class, () -> tieLine.getHalf1().setG2(Double.NaN)).getMessage().contains("g2 is invalid")); } @Test diff --git a/network-store-model/src/main/java/com/powsybl/network/store/model/MergedXnodeAttributes.java b/network-store-model/src/main/java/com/powsybl/network/store/model/MergedXnodeAttributes.java index 674d0aa82..80a02d3fd 100644 --- a/network-store-model/src/main/java/com/powsybl/network/store/model/MergedXnodeAttributes.java +++ b/network-store-model/src/main/java/com/powsybl/network/store/model/MergedXnodeAttributes.java @@ -26,29 +26,41 @@ public class MergedXnodeAttributes { @ApiModelProperty("r divider position 1 -> 2") - private Float rdp; + private float rdp; @ApiModelProperty("x divider position 1 -> 2") - private Float xdp; + private float xdp; - @ApiModelProperty("Xnode active power consumption in MW of side 1") - private Double xnodeP1; + @ApiModelProperty("line id of side 1") + private String line1Id; - @ApiModelProperty("Xnode reactive power consumption in MW of side 1") - private Double xnodeQ1; + @ApiModelProperty("line name of side 1") + private String line1Name; - @ApiModelProperty("Xnode active power consumption in MW of side 2") - private Double xnodeP2; + @ApiModelProperty("line 1 fictitious") + private boolean line1Fictitious; - @ApiModelProperty("Xnode reactive power consumption in MW of side 2") - private Double xnodeQ2; + @ApiModelProperty("b1 divider position 1 -> 2") + private float b1dp; - @ApiModelProperty("line name of side 1") - private String line1Name; + @ApiModelProperty("g1 divider position 1 -> 2") + private float g1dp; + + @ApiModelProperty("line id of side 2") + private String line2Id; @ApiModelProperty("line name of side 2") private String line2Name; + @ApiModelProperty("line 2 fictitious") + private boolean line2Fictitious; + + @ApiModelProperty("b2 divider position 1 -> 2") + private float b2dp; + + @ApiModelProperty("g2 divider position 1 -> 2") + private float g2dp; + @ApiModelProperty("UCTE Xnode code corresponding to this line") private String code; } diff --git a/network-store-server/src/main/java/com/powsybl/network/store/server/CassandraConfig.java b/network-store-server/src/main/java/com/powsybl/network/store/server/CassandraConfig.java index fb5edc1c1..97b0446c7 100644 --- a/network-store-server/src/main/java/com/powsybl/network/store/server/CassandraConfig.java +++ b/network-store-server/src/main/java/com/powsybl/network/store/server/CassandraConfig.java @@ -244,7 +244,7 @@ public CassandraClusterFactoryBean cluster(Environment env) { @Bean public CassandraMappingContext cassandraMapping(Environment env) { - CassandraMappingContext mappingContext = new CassandraMappingContext(); + CassandraMappingContext mappingContext = new CassandraMappingContext(); mappingContext.setUserTypeResolver(new SimpleUserTypeResolver(cluster(env).getObject(), getKeyspaceName())); return mappingContext; } @@ -286,7 +286,7 @@ protected TerminalRefAttributes toTerminalRef(UDTValue value) { } protected UDTValue toUDTValue(TerminalRefAttributes value) { - return value == null ? null : userType.newValue().setString("connectableId", value.getConnectableId()).setString("side", value.getSide()); + return value == null ? null : userType.newValue().setString("connectableId", value.getConnectableId()).setString("side", value.getSide()); } } @@ -314,7 +314,7 @@ public ConnectablePositionAttributes deserialize(ByteBuffer bytes, ProtocolVersi @Override public ConnectablePositionAttributes parse(String value) throws InvalidTypeException { - return value == null || value.isEmpty() ? null : toConnectablePosition(innerCodec.parse(value)); + return value == null || value.isEmpty() ? null : toConnectablePosition(innerCodec.parse(value)); } @Override @@ -327,7 +327,7 @@ protected ConnectablePositionAttributes toConnectablePosition(UDTValue value) { value.getString("label"), value.getInt("orderNum"), ConnectableDirection.valueOf(value.getString("direction")) - ); + ); } protected UDTValue toUDTValue(ConnectablePositionAttributes value) { @@ -885,12 +885,16 @@ protected MergedXnodeAttributes toMergedXnode(UDTValue value) { return value == null ? null : new MergedXnodeAttributes( value.getFloat("rdp"), value.getFloat("xdp"), - value.getDouble("xnodeP1"), - value.getDouble("xnodeQ1"), - value.getDouble("xnodeP2"), - value.getDouble("xnodeQ2"), + value.getString("line1Id"), value.getString("line1Name"), + value.getBool("line1Fictitious"), + value.getFloat("b1dp"), + value.getFloat("g1dp"), + value.getString("line2Id"), value.getString("line2Name"), + value.getBool("line2Fictitious"), + value.getFloat("b2dp"), + value.getFloat("g2dp"), value.getString("ucteXnodeCode")); } @@ -898,12 +902,16 @@ protected UDTValue toUDTValue(MergedXnodeAttributes value) { return value == null ? null : userType.newValue() .setFloat("rdp", value.getRdp()) .setFloat("xdp", value.getXdp()) - .setDouble("xnodeP1", value.getXnodeP1()) - .setDouble("xnodeQ1", value.getXnodeQ1()) - .setDouble("xnodeP2", value.getXnodeP2()) - .setDouble("xnodeQ2", value.getXnodeQ2()) + .setString("line1Id", value.getLine1Id()) .setString("line1Name", value.getLine1Name()) + .setBool("line1Fictitious", value.isLine1Fictitious()) + .setFloat("b1dp", value.getB1dp()) + .setFloat("g1dp", value.getG1dp()) + .setString("line2Id", value.getLine2Id()) .setString("line2Name", value.getLine2Name()) + .setBool("line2Fictitious", value.isLine2Fictitious()) + .setFloat("b2dp", value.getB2dp()) + .setFloat("g2dp", value.getG2dp()) .setString("ucteXnodeCode", value.getCode()); } } diff --git a/network-store-server/src/main/resources/iidm.cql b/network-store-server/src/main/resources/iidm.cql index 36273524d..00c545bb8 100644 --- a/network-store-server/src/main/resources/iidm.cql +++ b/network-store-server/src/main/resources/iidm.cql @@ -171,12 +171,16 @@ CREATE TYPE IF NOT EXISTS currentLimits ( CREATE TYPE IF NOT EXISTS mergedXnode ( rdp float, xdp float, - xnodeP1 double, - xnodeQ1 double, - xnodeP2 double, - xnodeQ2 double, + line1Id text, line1Name text, + line1Fictitious boolean, + b1dp float, + g1dp float, + line2Id text, line2Name text, + line2Fictitious boolean, + b2dp float, + g2dp float, ucteXnodeCode text, );