From 67346d74e09251d7623dc11aec73e2147bb2837c Mon Sep 17 00:00:00 2001 From: PRABAKARAN Sylvestre Date: Wed, 10 Jul 2024 10:14:22 +0200 Subject: [PATCH 01/22] Added HVDC line loss in AC emulation Signed-off-by: PRABAKARAN Sylvestre --- ...AbstractHvdcAcEmulationFlowEquationTerm.java | 17 +++++++++++++++++ ...cAcEmulationSide1ActiveFlowEquationTerm.java | 5 ++--- ...cAcEmulationSide2ActiveFlowEquationTerm.java | 7 +++---- .../powsybl/openloadflow/network/LfHvdc.java | 2 ++ .../openloadflow/network/impl/LfHvdcImpl.java | 8 ++++++++ 5 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java b/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java index 466e293869..7147c1bab7 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java @@ -30,6 +30,8 @@ public abstract class AbstractHvdcAcEmulationFlowEquationTerm extends AbstractEl protected final double p0; + protected final double r; + protected final double lossFactor1; protected final double lossFactor2; @@ -45,6 +47,7 @@ protected AbstractHvdcAcEmulationFlowEquationTerm(LfHvdc hvdc, LfBus bus1, LfBus variables = List.of(ph1Var, ph2Var); k = hvdc.getDroop() * 180 / Math.PI; p0 = hvdc.getP0(); + r = hvdc.getR(); lossFactor1 = hvdc.getConverterStation1().getLossFactor() / 100; lossFactor2 = hvdc.getConverterStation2().getLossFactor() / 100; pMaxFromCS1toCS2 = hvdc.getPMaxFromCS1toCS2(); @@ -55,6 +58,20 @@ protected double rawP(double p0, double k, double ph1, double ph2) { return p0 + k * (ph1 - ph2); } + protected double rawPWithLoss(double rawP, double loss1, double loss2, double v, double r) { + // Computing P with rectifier loss but without cable loss yet + double p = Math.abs((1 - loss1) * rawP); + // Computing cable loss + // v1*v1 - v2*v1 - r*p = 0 with v1 being the voltage at the rectifier output + // v2 being the voltage at the inverter input (which is the nominal voltage v) + // p being the power at the rectifier output (after rectifier converter loss) + // v1 is the positive solution of the 2nd degree equation : v1 = v + sqrt(v*v + 4*r*p) + // jouleLoss = (v1 - v2) * (v1 - v2) / r + double jouleLoss = r == 0 ? 0 : Math.pow(Math.sqrt(v * v + 4 * r * p) - v, 2) / (4 * r); + // Adding inverter loss to the output + return (1 - loss2) * (p - jouleLoss) * (rawP > 0 ? 1 : -1); + } + protected double boundedP(double rawP) { // If there is a maximal active power // it is applied at the entry of the controller VSC station diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java b/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java index 0b58fc63e0..63c7a0d471 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java @@ -24,9 +24,8 @@ public HvdcAcEmulationSide1ActiveFlowEquationTerm(LfHvdc hvdc, LfBus bus1, LfBus } private double p1(double ph1, double ph2) { - double rawP = rawP(p0, k, ph1, ph2); - double boundedP = boundedP(rawP); - return (isController(rawP) ? 1 : getVscLossMultiplier()) * boundedP; + double rawP = boundedP(rawP(p0, k, ph1, ph2)); + return isController(rawP) ? rawP : rawPWithLoss(rawP, lossFactor1, lossFactor2, 1, r); } private static boolean isController(double rawP) { diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide2ActiveFlowEquationTerm.java b/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide2ActiveFlowEquationTerm.java index 501f7eca1d..0376d02239 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide2ActiveFlowEquationTerm.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide2ActiveFlowEquationTerm.java @@ -24,9 +24,8 @@ public HvdcAcEmulationSide2ActiveFlowEquationTerm(LfHvdc hvdc, LfBus bus1, LfBus } private double p2(double ph1, double ph2) { - double rawP = rawP(p0, k, ph1, ph2); - double boundedP = boundedP(rawP); - return -(isController(rawP) ? 1 : getVscLossMultiplier()) * boundedP; + double rawP = boundedP(rawP(p0, k, ph1, ph2)); + return isController(rawP) ? -rawP : -rawPWithLoss(rawP, lossFactor2, lossFactor1, 1, r); } private boolean isController(double rawP) { @@ -40,7 +39,7 @@ private boolean isInOperatingRange(double rawP) { private double dp2dph1(double ph1, double ph2) { double rawP = rawP(p0, k, ph1, ph2); if (isInOperatingRange(rawP)) { - return -(isController(rawP) ? 1 : getVscLossMultiplier()) * k; + return -(isController(rawP) ? 1 : getVscLossMultiplier()) * k; // derivative of cable loss is neglected } else { return 0; } diff --git a/src/main/java/com/powsybl/openloadflow/network/LfHvdc.java b/src/main/java/com/powsybl/openloadflow/network/LfHvdc.java index 4b07bafd52..988303b2e2 100644 --- a/src/main/java/com/powsybl/openloadflow/network/LfHvdc.java +++ b/src/main/java/com/powsybl/openloadflow/network/LfHvdc.java @@ -30,6 +30,8 @@ public interface LfHvdc extends LfElement { double getDroop(); + double getR(); + double getP0(); boolean isAcEmulation(); diff --git a/src/main/java/com/powsybl/openloadflow/network/impl/LfHvdcImpl.java b/src/main/java/com/powsybl/openloadflow/network/impl/LfHvdcImpl.java index ffbe307e63..424fada05f 100644 --- a/src/main/java/com/powsybl/openloadflow/network/impl/LfHvdcImpl.java +++ b/src/main/java/com/powsybl/openloadflow/network/impl/LfHvdcImpl.java @@ -37,6 +37,8 @@ public class LfHvdcImpl extends AbstractElement implements LfHvdc { private double p0 = Double.NaN; + private double r = Double.NaN; + private LfVscConverterStation converterStation1; private LfVscConverterStation converterStation2; @@ -52,6 +54,7 @@ public LfHvdcImpl(String id, LfBus bus1, LfBus bus2, LfNetwork network, HvdcLine this.id = Objects.requireNonNull(id); this.bus1 = bus1; this.bus2 = bus2; + this.r = hvdcLine.getR() / PerUnit.zb(hvdcLine.getNominalV()); // Storing R directly in per unit HvdcAngleDroopActivePowerControl droopControl = hvdcLine.getExtension(HvdcAngleDroopActivePowerControl.class); this.acEmulation = acEmulation && droopControl != null && droopControl.isEnabled(); if (this.acEmulation) { @@ -128,6 +131,11 @@ public double getDroop() { return droop / PerUnit.SB; } + @Override + public double getR() { + return r; // r is in per unit + } + @Override public double getP0() { return p0 / PerUnit.SB; From 7b60f087dc6cbb66e2ebfe29bb316a9f2e02c487 Mon Sep 17 00:00:00 2001 From: PRABAKARAN Sylvestre Date: Wed, 10 Jul 2024 10:47:27 +0200 Subject: [PATCH 02/22] Added newline for checkstyle Signed-off-by: PRABAKARAN Sylvestre --- src/main/java/com/powsybl/openloadflow/network/LfHvdc.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/powsybl/openloadflow/network/LfHvdc.java b/src/main/java/com/powsybl/openloadflow/network/LfHvdc.java index 988303b2e2..542d20872b 100644 --- a/src/main/java/com/powsybl/openloadflow/network/LfHvdc.java +++ b/src/main/java/com/powsybl/openloadflow/network/LfHvdc.java @@ -30,7 +30,7 @@ public interface LfHvdc extends LfElement { double getDroop(); - double getR(); + double get(); double getP0(); From a15c4e7db28946cfd268c3739e1b070dee1614d4 Mon Sep 17 00:00:00 2001 From: PRABAKARAN Sylvestre Date: Wed, 10 Jul 2024 10:47:35 +0200 Subject: [PATCH 03/22] Added newline for checkstyle Signed-off-by: PRABAKARAN Sylvestre --- src/main/java/com/powsybl/openloadflow/network/LfHvdc.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/powsybl/openloadflow/network/LfHvdc.java b/src/main/java/com/powsybl/openloadflow/network/LfHvdc.java index 542d20872b..988303b2e2 100644 --- a/src/main/java/com/powsybl/openloadflow/network/LfHvdc.java +++ b/src/main/java/com/powsybl/openloadflow/network/LfHvdc.java @@ -30,7 +30,7 @@ public interface LfHvdc extends LfElement { double getDroop(); - double get(); + double getR(); double getP0(); From f6c740b9dd824c6a73f2d0f68190ed56f216214f Mon Sep 17 00:00:00 2001 From: PRABAKARAN Sylvestre Date: Wed, 10 Jul 2024 10:48:26 +0200 Subject: [PATCH 04/22] Modified tests to keep same behaviour with HVDC line resistance in AC Emulation Signed-off-by: PRABAKARAN Sylvestre --- .../com/powsybl/openloadflow/EquationsTest.java | 1 + .../openloadflow/ac/AcLoadFlowVscTest.java | 16 ++++++++++++++++ .../sa/OpenSecurityAnalysisWithActionsTest.java | 3 +++ 3 files changed, 20 insertions(+) diff --git a/src/test/java/com/powsybl/openloadflow/EquationsTest.java b/src/test/java/com/powsybl/openloadflow/EquationsTest.java index c0b9d10bec..6cc9e27816 100644 --- a/src/test/java/com/powsybl/openloadflow/EquationsTest.java +++ b/src/test/java/com/powsybl/openloadflow/EquationsTest.java @@ -257,6 +257,7 @@ void hvdcTest() { Mockito.doReturn(false).when(hvdc).isDisabled(); Mockito.doReturn(DROOP).when(hvdc).getDroop(); Mockito.doReturn(P_0).when(hvdc).getP0(); + Mockito.doReturn(0d).when(hvdc).getR(); Mockito.doReturn(Double.MAX_VALUE).when(hvdc).getPMaxFromCS1toCS2(); Mockito.doReturn(Double.MAX_VALUE).when(hvdc).getPMaxFromCS2toCS1(); LfVscConverterStationImpl station1 = Mockito.mock(LfVscConverterStationImpl.class, new RuntimeExceptionAnswer()); diff --git a/src/test/java/com/powsybl/openloadflow/ac/AcLoadFlowVscTest.java b/src/test/java/com/powsybl/openloadflow/ac/AcLoadFlowVscTest.java index 2620a9b960..c3917c643a 100644 --- a/src/test/java/com/powsybl/openloadflow/ac/AcLoadFlowVscTest.java +++ b/src/test/java/com/powsybl/openloadflow/ac/AcLoadFlowVscTest.java @@ -267,6 +267,20 @@ void testHvdcPowerAcEmulation() { LoadFlow.Runner loadFlowRunner = new LoadFlow.Runner(new OpenLoadFlowProvider(new DenseMatrixFactory())); LoadFlowResult result = loadFlowRunner.run(network, new LoadFlowParameters()); assertTrue(result.isFullyConverged()); + // AC Emulation takes into account cable loss + assertActivePowerEquals(198.158, network.getHvdcConverterStation("cs2").getTerminal()); + assertActivePowerEquals(-193.799, network.getHvdcConverterStation("cs3").getTerminal()); + assertActivePowerEquals(-304.359, network.getGenerator("g1").getTerminal()); + assertActivePowerEquals(300.0, network.getLoad("l4").getTerminal()); + } + + @Test + void testHvdcPowerAcEmulationWithoutR() { + Network network = HvdcNetworkFactory.createHvdcLinkedByTwoLinesAndSwitch(); + network.getHvdcLine("hvdc23").setR(0d); //Removing resistance to ignore cable loss + LoadFlow.Runner loadFlowRunner = new LoadFlow.Runner(new OpenLoadFlowProvider(new DenseMatrixFactory())); + LoadFlowResult result = loadFlowRunner.run(network, new LoadFlowParameters()); + assertTrue(result.isFullyConverged()); assertActivePowerEquals(198.158, network.getHvdcConverterStation("cs2").getTerminal()); assertActivePowerEquals(-193.822, network.getHvdcConverterStation("cs3").getTerminal()); assertActivePowerEquals(-304.335, network.getGenerator("g1").getTerminal()); @@ -450,6 +464,7 @@ void testAcEmuWithOperationalLimits() { Network network = HvdcNetworkFactory.createHvdcLinkedByTwoLinesAndSwitch(HvdcConverterStation.HvdcType.VSC); // without limit p=195 network.getHvdcLine("hvdc23") + .setR(0d) //Removing resistance to ignore cable loss .newExtension(HvdcOperatorActivePowerRangeAdder.class) .withOprFromCS2toCS1(180) .withOprFromCS1toCS2(170) @@ -482,6 +497,7 @@ void testAcEmuAndPMax() { Network network = HvdcNetworkFactory.createHvdcLinkedByTwoLinesAndSwitch(HvdcConverterStation.HvdcType.VSC); // without limit p=195 network.getHvdcLine("hvdc23") + .setR(0d) //Removing resistance to ignore cable loss .setMaxP(170); LoadFlow.Runner loadFlowRunner = new LoadFlow.Runner(new OpenLoadFlowProvider(new DenseMatrixFactory())); diff --git a/src/test/java/com/powsybl/openloadflow/sa/OpenSecurityAnalysisWithActionsTest.java b/src/test/java/com/powsybl/openloadflow/sa/OpenSecurityAnalysisWithActionsTest.java index e61b270e67..24da892705 100644 --- a/src/test/java/com/powsybl/openloadflow/sa/OpenSecurityAnalysisWithActionsTest.java +++ b/src/test/java/com/powsybl/openloadflow/sa/OpenSecurityAnalysisWithActionsTest.java @@ -1284,6 +1284,7 @@ void testVSCLossAcEmulation() { // but other converter station keeps its voltage control capability. // remedial action re-enables the ac emulation of the hvdc line. Network network = HvdcNetworkFactory.createHvdcLinkedByTwoLinesAndSwitch(HvdcConverterStation.HvdcType.VSC); + network.getHvdcLine("hvdc23").setR(0d); //Removing resistance to ignore cable loss List contingencies = List.of(new Contingency("contingency", new LineContingency("l12"))); List actions = List.of(new SwitchAction("action", "s2", false)); List operatorStrategies = List.of(new OperatorStrategy("strategy", @@ -1330,6 +1331,7 @@ void testHvdcDisconnectedThenConnectedByStrategy() { List monitors = createNetworkMonitors(network); // with AC emulation first + network.getHvdcLine("hvdc23").setR(0d); //Removing resistance to ignore cable loss in AC emulation SecurityAnalysisResult result = runSecurityAnalysis(network, contingencies, monitors, new SecurityAnalysisParameters(), operatorStrategies, actions, ReportNode.NO_OP); @@ -1349,6 +1351,7 @@ void testHvdcDisconnectedThenConnectedByStrategy() { // without AC emulation SecurityAnalysisParameters parameters = new SecurityAnalysisParameters(); parameters.getLoadFlowParameters().setHvdcAcEmulation(false); + network.getHvdcLine("hvdc23").setR(0.1d); //Putting back resistance of the cable to keep same old behaviour SecurityAnalysisResult result2 = runSecurityAnalysis(network, contingencies, monitors, parameters, operatorStrategies, actions, ReportNode.NO_OP); From cf2eb5fc9efe0a21712b50bfc595603fe562b6c5 Mon Sep 17 00:00:00 2001 From: PRABAKARAN Sylvestre Date: Wed, 10 Jul 2024 14:39:35 +0200 Subject: [PATCH 05/22] Keeps r in ohms and its getter returns value in per unit Signed-off-by: PRABAKARAN Sylvestre --- .../com/powsybl/openloadflow/network/impl/LfHvdcImpl.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/powsybl/openloadflow/network/impl/LfHvdcImpl.java b/src/main/java/com/powsybl/openloadflow/network/impl/LfHvdcImpl.java index 424fada05f..acc0d19a29 100644 --- a/src/main/java/com/powsybl/openloadflow/network/impl/LfHvdcImpl.java +++ b/src/main/java/com/powsybl/openloadflow/network/impl/LfHvdcImpl.java @@ -39,6 +39,8 @@ public class LfHvdcImpl extends AbstractElement implements LfHvdc { private double r = Double.NaN; + private double nominalV = Double.NaN; + private LfVscConverterStation converterStation1; private LfVscConverterStation converterStation2; @@ -54,7 +56,8 @@ public LfHvdcImpl(String id, LfBus bus1, LfBus bus2, LfNetwork network, HvdcLine this.id = Objects.requireNonNull(id); this.bus1 = bus1; this.bus2 = bus2; - this.r = hvdcLine.getR() / PerUnit.zb(hvdcLine.getNominalV()); // Storing R directly in per unit + this.nominalV = hvdcLine.getNominalV(); + this.r = hvdcLine.getR(); HvdcAngleDroopActivePowerControl droopControl = hvdcLine.getExtension(HvdcAngleDroopActivePowerControl.class); this.acEmulation = acEmulation && droopControl != null && droopControl.isEnabled(); if (this.acEmulation) { @@ -133,7 +136,7 @@ public double getDroop() { @Override public double getR() { - return r; // r is in per unit + return r / PerUnit.zb(nominalV); } @Override From fba1fc4bc497c5424b7a00e9198aceb6b9dae6c0 Mon Sep 17 00:00:00 2001 From: PRABAKARAN Sylvestre Date: Wed, 10 Jul 2024 15:13:43 +0200 Subject: [PATCH 06/22] Modified implementation of line losses with the method getHvdcLineLosses Signed-off-by: PRABAKARAN Sylvestre --- ...stractHvdcAcEmulationFlowEquationTerm.java | 24 ++++++++----------- ...cEmulationSide1ActiveFlowEquationTerm.java | 7 +++++- ...cEmulationSide2ActiveFlowEquationTerm.java | 7 +++++- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java b/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java index 7147c1bab7..9314a9b439 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java @@ -58,20 +58,6 @@ protected double rawP(double p0, double k, double ph1, double ph2) { return p0 + k * (ph1 - ph2); } - protected double rawPWithLoss(double rawP, double loss1, double loss2, double v, double r) { - // Computing P with rectifier loss but without cable loss yet - double p = Math.abs((1 - loss1) * rawP); - // Computing cable loss - // v1*v1 - v2*v1 - r*p = 0 with v1 being the voltage at the rectifier output - // v2 being the voltage at the inverter input (which is the nominal voltage v) - // p being the power at the rectifier output (after rectifier converter loss) - // v1 is the positive solution of the 2nd degree equation : v1 = v + sqrt(v*v + 4*r*p) - // jouleLoss = (v1 - v2) * (v1 - v2) / r - double jouleLoss = r == 0 ? 0 : Math.pow(Math.sqrt(v * v + 4 * r * p) - v, 2) / (4 * r); - // Adding inverter loss to the output - return (1 - loss2) * (p - jouleLoss) * (rawP > 0 ? 1 : -1); - } - protected double boundedP(double rawP) { // If there is a maximal active power // it is applied at the entry of the controller VSC station @@ -95,6 +81,16 @@ protected double getVscLossMultiplier() { return (1 - lossFactor1) * (1 - lossFactor2); } + protected static double getHvdcLineLosses(double rectifierPDc, double nominalV, double r) { + // This method computes the losses due to the HVDC line. + // The active power value on rectifier DC side is known as the HVDC active power set point minus the losses related + // to AC/DC conversion (rectifier conversion), the voltage is approximated to the nominal voltage as attribute of the HVDC line. + // In an HVDC, as a branch with two sides, the difference between pDc1 and pDc2 can be computed with the assumptions: + // I = (V1 - V2) / R and pDc1 = I * V1 and pDc2 = I * V2 and V1 = nominalV + // we simply obtain that the absolute value of the difference is equal to R * pDc1 * pDc1 / (V1 * V1) if side 1 is rectifier side. + return r * rectifierPDc * rectifierPDc / (nominalV * nominalV); + } + @Override public List> getVariables() { return variables; diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java b/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java index 63c7a0d471..354f139a84 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java @@ -25,7 +25,12 @@ public HvdcAcEmulationSide1ActiveFlowEquationTerm(LfHvdc hvdc, LfBus bus1, LfBus private double p1(double ph1, double ph2) { double rawP = boundedP(rawP(p0, k, ph1, ph2)); - return isController(rawP) ? rawP : rawPWithLoss(rawP, lossFactor1, lossFactor2, 1, r); + if (isController(rawP)) { + return rawP; + } else { + double rectifierPDc = (1 - lossFactor1) * rawP; + return (1 - lossFactor2) * (rectifierPDc - getHvdcLineLosses(rectifierPDc, 1, r)); + } } private static boolean isController(double rawP) { diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide2ActiveFlowEquationTerm.java b/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide2ActiveFlowEquationTerm.java index 0376d02239..a715033ee0 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide2ActiveFlowEquationTerm.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide2ActiveFlowEquationTerm.java @@ -25,7 +25,12 @@ public HvdcAcEmulationSide2ActiveFlowEquationTerm(LfHvdc hvdc, LfBus bus1, LfBus private double p2(double ph1, double ph2) { double rawP = boundedP(rawP(p0, k, ph1, ph2)); - return isController(rawP) ? -rawP : -rawPWithLoss(rawP, lossFactor2, lossFactor1, 1, r); + if (isController(rawP)) { + return -rawP; + } else { + double rectifierPDc = -(1 - lossFactor2) * rawP; + return (1 - lossFactor1) * (rectifierPDc + getHvdcLineLosses(rectifierPDc, 1, r)); + } } private boolean isController(double rawP) { From ba215753662a9ab934758c6e25755edb34eea229 Mon Sep 17 00:00:00 2001 From: PRABAKARAN Sylvestre Date: Wed, 10 Jul 2024 15:24:38 +0200 Subject: [PATCH 07/22] Added FIXME comment to use HvdcUtils.getHvdcLineLosses() from powsybl-core Signed-off-by: PRABAKARAN Sylvestre --- .../ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java b/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java index 9314a9b439..b6750a1d72 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java @@ -81,6 +81,7 @@ protected double getVscLossMultiplier() { return (1 - lossFactor1) * (1 - lossFactor2); } + // FIXME: This method is a copy of HvdcUtils.getHvdcLineLosses() from powsybl-core but it cannot be used yet because this static method is private protected static double getHvdcLineLosses(double rectifierPDc, double nominalV, double r) { // This method computes the losses due to the HVDC line. // The active power value on rectifier DC side is known as the HVDC active power set point minus the losses related From 86189c4377d81c09868c9f243e05b7836a47429f Mon Sep 17 00:00:00 2001 From: PRABAKARAN Sylvestre Date: Wed, 10 Jul 2024 17:25:35 +0200 Subject: [PATCH 08/22] Modified one test to check the correct sign of the influence of R in the losses Signed-off-by: PRABAKARAN Sylvestre --- .../openloadflow/ac/AcLoadFlowVscTest.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/test/java/com/powsybl/openloadflow/ac/AcLoadFlowVscTest.java b/src/test/java/com/powsybl/openloadflow/ac/AcLoadFlowVscTest.java index c3917c643a..f5c3189ff7 100644 --- a/src/test/java/com/powsybl/openloadflow/ac/AcLoadFlowVscTest.java +++ b/src/test/java/com/powsybl/openloadflow/ac/AcLoadFlowVscTest.java @@ -307,7 +307,18 @@ void testHvdcDirectionChangeAcEmulation() { assertTrue(pcs2 < 0, "Power delivered by cs2"); assertTrue(Math.abs(pcs1) > Math.abs(pcs2), "Loss at HVDC output"); + // Test if removing line resistance increases the power transit + network.getHvdcLine("hvdc12").setR(0d) ; + result = loadFlowRunner.run(network, new LoadFlowParameters()); + assertTrue(result.isFullyConverged()); + double pcs1_r0 = network.getVscConverterStation("cs1").getTerminal().getP(); + double pcs2_r0 = network.getVscConverterStation("cs2").getTerminal().getP(); + assertTrue(pcs1_r0 < pcs1); + assertTrue(pcs2_r0 < pcs2); + assertTrue(pcs1_r0-pcs2_r0 < pcs1-pcs2); + // Reverse power flow direction + network.getHvdcLine("hvdc12").setR(0.1d) ; network.getGenerator("g2").setTargetP(5); network.getGenerator("g1").setTargetP(0); result = loadFlowRunner.run(network, new LoadFlowParameters()); @@ -326,6 +337,16 @@ void testHvdcDirectionChangeAcEmulation() { assertTrue(pcs2 > 0, "Power enters at cs2"); assertTrue(pcs1 < 0, "Power delivered by cs1"); assertTrue(Math.abs(pcs2) > Math.abs(pcs1), "Loss at HVDC output"); + + // Test if removing line resistance increases the power transit in symetric network + network.getHvdcLine("hvdc12").setR(0d) ; + result = loadFlowRunner.run(network, new LoadFlowParameters()); + assertTrue(result.isFullyConverged()); + pcs1_r0 = network.getVscConverterStation("cs1").getTerminal().getP(); + pcs2_r0 = network.getVscConverterStation("cs2").getTerminal().getP(); + assertTrue(pcs1_r0 > pcs1); + assertTrue(pcs2_r0 > pcs2); + assertTrue(pcs2_r0-pcs1_r0 < pcs2-pcs1); } @Test From a7e9dac914474d6963f1cb9e2e2ff7f678250abe Mon Sep 17 00:00:00 2001 From: PRABAKARAN Sylvestre Date: Wed, 10 Jul 2024 17:32:59 +0200 Subject: [PATCH 09/22] Checkstyle corrections Signed-off-by: PRABAKARAN Sylvestre --- .../openloadflow/ac/AcLoadFlowVscTest.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/test/java/com/powsybl/openloadflow/ac/AcLoadFlowVscTest.java b/src/test/java/com/powsybl/openloadflow/ac/AcLoadFlowVscTest.java index f5c3189ff7..179d6fd55c 100644 --- a/src/test/java/com/powsybl/openloadflow/ac/AcLoadFlowVscTest.java +++ b/src/test/java/com/powsybl/openloadflow/ac/AcLoadFlowVscTest.java @@ -308,17 +308,17 @@ void testHvdcDirectionChangeAcEmulation() { assertTrue(Math.abs(pcs1) > Math.abs(pcs2), "Loss at HVDC output"); // Test if removing line resistance increases the power transit - network.getHvdcLine("hvdc12").setR(0d) ; + network.getHvdcLine("hvdc12").setR(0d); result = loadFlowRunner.run(network, new LoadFlowParameters()); assertTrue(result.isFullyConverged()); - double pcs1_r0 = network.getVscConverterStation("cs1").getTerminal().getP(); - double pcs2_r0 = network.getVscConverterStation("cs2").getTerminal().getP(); - assertTrue(pcs1_r0 < pcs1); - assertTrue(pcs2_r0 < pcs2); - assertTrue(pcs1_r0-pcs2_r0 < pcs1-pcs2); + double pcs1r0 = network.getVscConverterStation("cs1").getTerminal().getP(); + double pcs2r0 = network.getVscConverterStation("cs2").getTerminal().getP(); + assertTrue(pcs1r0 < pcs1); + assertTrue(pcs2r0 < pcs2); + assertTrue(pcs1r0 - pcs2r0 < pcs1 - pcs2); // Reverse power flow direction - network.getHvdcLine("hvdc12").setR(0.1d) ; + network.getHvdcLine("hvdc12").setR(0.1d); network.getGenerator("g2").setTargetP(5); network.getGenerator("g1").setTargetP(0); result = loadFlowRunner.run(network, new LoadFlowParameters()); @@ -339,14 +339,14 @@ void testHvdcDirectionChangeAcEmulation() { assertTrue(Math.abs(pcs2) > Math.abs(pcs1), "Loss at HVDC output"); // Test if removing line resistance increases the power transit in symetric network - network.getHvdcLine("hvdc12").setR(0d) ; + network.getHvdcLine("hvdc12").setR(0d); result = loadFlowRunner.run(network, new LoadFlowParameters()); assertTrue(result.isFullyConverged()); - pcs1_r0 = network.getVscConverterStation("cs1").getTerminal().getP(); - pcs2_r0 = network.getVscConverterStation("cs2").getTerminal().getP(); - assertTrue(pcs1_r0 > pcs1); - assertTrue(pcs2_r0 > pcs2); - assertTrue(pcs2_r0-pcs1_r0 < pcs2-pcs1); + pcs1r0 = network.getVscConverterStation("cs1").getTerminal().getP(); + pcs2r0 = network.getVscConverterStation("cs2").getTerminal().getP(); + assertTrue(pcs1r0 > pcs1); + assertTrue(pcs2r0 > pcs2); + assertTrue(pcs2r0 - pcs1r0 < pcs2 - pcs1); } @Test From b6707f5c7f7f27380c28236b5f5ca1d857eef83d Mon Sep 17 00:00:00 2001 From: PRABAKARAN Sylvestre Date: Wed, 10 Jul 2024 18:32:33 +0200 Subject: [PATCH 10/22] Added comments to explain test of difference between R=0 and R!=0 Signed-off-by: PRABAKARAN Sylvestre --- .../com/powsybl/openloadflow/ac/AcLoadFlowVscTest.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/test/java/com/powsybl/openloadflow/ac/AcLoadFlowVscTest.java b/src/test/java/com/powsybl/openloadflow/ac/AcLoadFlowVscTest.java index 179d6fd55c..bc3988cb09 100644 --- a/src/test/java/com/powsybl/openloadflow/ac/AcLoadFlowVscTest.java +++ b/src/test/java/com/powsybl/openloadflow/ac/AcLoadFlowVscTest.java @@ -313,9 +313,7 @@ void testHvdcDirectionChangeAcEmulation() { assertTrue(result.isFullyConverged()); double pcs1r0 = network.getVscConverterStation("cs1").getTerminal().getP(); double pcs2r0 = network.getVscConverterStation("cs2").getTerminal().getP(); - assertTrue(pcs1r0 < pcs1); - assertTrue(pcs2r0 < pcs2); - assertTrue(pcs1r0 - pcs2r0 < pcs1 - pcs2); + assertTrue(pcs1r0 - pcs2r0 < pcs1 - pcs2); // Check that loss with R=0 is lower than loss with R!=0 // Reverse power flow direction network.getHvdcLine("hvdc12").setR(0.1d); @@ -344,9 +342,7 @@ void testHvdcDirectionChangeAcEmulation() { assertTrue(result.isFullyConverged()); pcs1r0 = network.getVscConverterStation("cs1").getTerminal().getP(); pcs2r0 = network.getVscConverterStation("cs2").getTerminal().getP(); - assertTrue(pcs1r0 > pcs1); - assertTrue(pcs2r0 > pcs2); - assertTrue(pcs2r0 - pcs1r0 < pcs2 - pcs1); + assertTrue(pcs2r0 - pcs1r0 < pcs2 - pcs1); // Check that loss with R=0 is lower than loss with R!=0 } @Test From 65069d7533bf61734ff9e2b574db5c90dd204985 Mon Sep 17 00:00:00 2001 From: PRABAKARAN Sylvestre Date: Fri, 12 Jul 2024 13:46:11 +0200 Subject: [PATCH 11/22] Use of HvdcUtils.getHvdcLineLosses with new release of powsybl-core Signed-off-by: PRABAKARAN Sylvestre --- pom.xml | 2 +- .../AbstractHvdcAcEmulationFlowEquationTerm.java | 13 ++++--------- .../HvdcAcEmulationSide1ActiveFlowEquationTerm.java | 2 +- .../HvdcAcEmulationSide2ActiveFlowEquationTerm.java | 2 +- 4 files changed, 7 insertions(+), 12 deletions(-) diff --git a/pom.xml b/pom.xml index 49675fbd74..03ac9ecac6 100644 --- a/pom.xml +++ b/pom.xml @@ -54,7 +54,7 @@ 1.6.3 0.3.2 - 6.4.0 + 6.4.1 diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java b/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java index b6750a1d72..693249abfb 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java @@ -13,6 +13,8 @@ import com.powsybl.openloadflow.network.LfBus; import com.powsybl.openloadflow.network.LfHvdc; +import com.powsybl.iidm.network.util.HvdcUtils ; + import java.util.List; /** @@ -81,15 +83,8 @@ protected double getVscLossMultiplier() { return (1 - lossFactor1) * (1 - lossFactor2); } - // FIXME: This method is a copy of HvdcUtils.getHvdcLineLosses() from powsybl-core but it cannot be used yet because this static method is private - protected static double getHvdcLineLosses(double rectifierPDc, double nominalV, double r) { - // This method computes the losses due to the HVDC line. - // The active power value on rectifier DC side is known as the HVDC active power set point minus the losses related - // to AC/DC conversion (rectifier conversion), the voltage is approximated to the nominal voltage as attribute of the HVDC line. - // In an HVDC, as a branch with two sides, the difference between pDc1 and pDc2 can be computed with the assumptions: - // I = (V1 - V2) / R and pDc1 = I * V1 and pDc2 = I * V2 and V1 = nominalV - // we simply obtain that the absolute value of the difference is equal to R * pDc1 * pDc1 / (V1 * V1) if side 1 is rectifier side. - return r * rectifierPDc * rectifierPDc / (nominalV * nominalV); + protected static double getHvdcLineLosses(double rectifierPDc, double r) { + return HvdcUtils.getHvdcLineLosses(rectifierPDc,1,r) ; } @Override diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java b/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java index 354f139a84..db7af91c5f 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java @@ -29,7 +29,7 @@ private double p1(double ph1, double ph2) { return rawP; } else { double rectifierPDc = (1 - lossFactor1) * rawP; - return (1 - lossFactor2) * (rectifierPDc - getHvdcLineLosses(rectifierPDc, 1, r)); + return (1 - lossFactor2) * (rectifierPDc - getHvdcLineLosses(rectifierPDc, r)); } } diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide2ActiveFlowEquationTerm.java b/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide2ActiveFlowEquationTerm.java index a715033ee0..7dc599ff13 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide2ActiveFlowEquationTerm.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide2ActiveFlowEquationTerm.java @@ -29,7 +29,7 @@ private double p2(double ph1, double ph2) { return -rawP; } else { double rectifierPDc = -(1 - lossFactor2) * rawP; - return (1 - lossFactor1) * (rectifierPDc + getHvdcLineLosses(rectifierPDc, 1, r)); + return (1 - lossFactor1) * (rectifierPDc + getHvdcLineLosses(rectifierPDc, r)); } } From 90809f6ccb7694488a873d58d87e9a00f49077c6 Mon Sep 17 00:00:00 2001 From: PRABAKARAN Sylvestre Date: Fri, 12 Jul 2024 13:50:15 +0200 Subject: [PATCH 12/22] Fixed for checkstyle Signed-off-by: PRABAKARAN Sylvestre --- .../ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java b/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java index 693249abfb..3463f37016 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java @@ -13,7 +13,7 @@ import com.powsybl.openloadflow.network.LfBus; import com.powsybl.openloadflow.network.LfHvdc; -import com.powsybl.iidm.network.util.HvdcUtils ; +import com.powsybl.iidm.network.util.HvdcUtils; import java.util.List; @@ -84,7 +84,7 @@ protected double getVscLossMultiplier() { } protected static double getHvdcLineLosses(double rectifierPDc, double r) { - return HvdcUtils.getHvdcLineLosses(rectifierPDc,1,r) ; + return HvdcUtils.getHvdcLineLosses(rectifierPDc, 1, r); } @Override From 860ee5051a1686e11c05d366cf1b607ddcf3d2f4 Mon Sep 17 00:00:00 2001 From: PRABAKARAN Sylvestre Date: Mon, 15 Jul 2024 11:45:36 +0200 Subject: [PATCH 13/22] Modified to have more common code in AbstractHvdcAcEmulationFlowEquationTerm.java Signed-off-by: PRABAKARAN Sylvestre --- .../AbstractHvdcAcEmulationFlowEquationTerm.java | 12 +++++++++++- .../HvdcAcEmulationSide1ActiveFlowEquationTerm.java | 11 +++-------- .../HvdcAcEmulationSide2ActiveFlowEquationTerm.java | 11 +++-------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java b/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java index 3463f37016..a755177b4f 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java @@ -56,7 +56,7 @@ protected AbstractHvdcAcEmulationFlowEquationTerm(LfHvdc hvdc, LfBus bus1, LfBus pMaxFromCS2toCS1 = hvdc.getPMaxFromCS2toCS1(); } - protected double rawP(double p0, double k, double ph1, double ph2) { + protected double rawP(double ph1, double ph2) { return p0 + k * (ph1 - ph2); } @@ -83,6 +83,16 @@ protected double getVscLossMultiplier() { return (1 - lossFactor1) * (1 - lossFactor2); } + protected double getActivePowerWithLosses(double boundedP) { + if (boundedP < 0) { // converterStation1 is the rectifier and converterStation2 is the inverter + double rectifierPDc = (1 - lossFactor1) * boundedP; + return (1 - lossFactor2) * (rectifierPDc - getHvdcLineLosses(rectifierPDc, r)); + } else { // converterStation2 is the rectifier and converterStation1 is the inverter + double rectifierPDc = -(1 - lossFactor2) * boundedP; + return (1 - lossFactor1) * (rectifierPDc + getHvdcLineLosses(rectifierPDc, r)); + } + } + protected static double getHvdcLineLosses(double rectifierPDc, double r) { return HvdcUtils.getHvdcLineLosses(rectifierPDc, 1, r); } diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java b/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java index db7af91c5f..4e963b609a 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java @@ -24,13 +24,8 @@ public HvdcAcEmulationSide1ActiveFlowEquationTerm(LfHvdc hvdc, LfBus bus1, LfBus } private double p1(double ph1, double ph2) { - double rawP = boundedP(rawP(p0, k, ph1, ph2)); - if (isController(rawP)) { - return rawP; - } else { - double rectifierPDc = (1 - lossFactor1) * rawP; - return (1 - lossFactor2) * (rectifierPDc - getHvdcLineLosses(rectifierPDc, r)); - } + double boundedP = boundedP(rawP(ph1, ph2)); + return isController(boundedP) ? boundedP : getActivePowerWithLosses(boundedP); } private static boolean isController(double rawP) { @@ -42,7 +37,7 @@ private boolean isInOperatingRange(double rawP) { } protected double dp1dph1(double ph1, double ph2) { - double rawP = rawP(p0, k, ph1, ph2); + double rawP = rawP(ph1, ph2); if (isInOperatingRange(rawP)) { return (isController(rawP) ? 1 : getVscLossMultiplier()) * k; } else { diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide2ActiveFlowEquationTerm.java b/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide2ActiveFlowEquationTerm.java index 7dc599ff13..845c88cbd8 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide2ActiveFlowEquationTerm.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide2ActiveFlowEquationTerm.java @@ -24,13 +24,8 @@ public HvdcAcEmulationSide2ActiveFlowEquationTerm(LfHvdc hvdc, LfBus bus1, LfBus } private double p2(double ph1, double ph2) { - double rawP = boundedP(rawP(p0, k, ph1, ph2)); - if (isController(rawP)) { - return -rawP; - } else { - double rectifierPDc = -(1 - lossFactor2) * rawP; - return (1 - lossFactor1) * (rectifierPDc + getHvdcLineLosses(rectifierPDc, r)); - } + double boundedP = boundedP(rawP(ph1, ph2)); + return isController(boundedP) ? -boundedP : getActivePowerWithLosses(boundedP); } private boolean isController(double rawP) { @@ -42,7 +37,7 @@ private boolean isInOperatingRange(double rawP) { } private double dp2dph1(double ph1, double ph2) { - double rawP = rawP(p0, k, ph1, ph2); + double rawP = rawP(ph1, ph2); if (isInOperatingRange(rawP)) { return -(isController(rawP) ? 1 : getVscLossMultiplier()) * k; // derivative of cable loss is neglected } else { From e9cb33944810e6cc0fcd522578bca83ec54eeee0 Mon Sep 17 00:00:00 2001 From: PRABAKARAN Sylvestre Date: Mon, 15 Jul 2024 13:25:17 +0200 Subject: [PATCH 14/22] Fixed tests to take cable loss into account Signed-off-by: PRABAKARAN Sylvestre --- .../powsybl/openloadflow/ac/AcLoadFlowVscTest.java | 10 ++++------ .../sa/OpenSecurityAnalysisWithActionsTest.java | 12 +++++------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/test/java/com/powsybl/openloadflow/ac/AcLoadFlowVscTest.java b/src/test/java/com/powsybl/openloadflow/ac/AcLoadFlowVscTest.java index bc3988cb09..53763e8470 100644 --- a/src/test/java/com/powsybl/openloadflow/ac/AcLoadFlowVscTest.java +++ b/src/test/java/com/powsybl/openloadflow/ac/AcLoadFlowVscTest.java @@ -481,7 +481,6 @@ void testAcEmuWithOperationalLimits() { Network network = HvdcNetworkFactory.createHvdcLinkedByTwoLinesAndSwitch(HvdcConverterStation.HvdcType.VSC); // without limit p=195 network.getHvdcLine("hvdc23") - .setR(0d) //Removing resistance to ignore cable loss .newExtension(HvdcOperatorActivePowerRangeAdder.class) .withOprFromCS2toCS1(180) .withOprFromCS1toCS2(170) @@ -496,7 +495,7 @@ void testAcEmuWithOperationalLimits() { // Active flow capped at limit. Output has losses (due to VSC stations) assertEquals(170, network.getHvdcConverterStation("cs2").getTerminal().getP(), DELTA_POWER); - assertEquals(-166.280, network.getHvdcConverterStation("cs3").getTerminal().getP(), DELTA_POWER); + assertEquals(-166.263, network.getHvdcConverterStation("cs3").getTerminal().getP(), DELTA_POWER); // now invert power direction HvdcAngleDroopActivePowerControl activePowerControl = network.getHvdcLine("hvdc23").getExtension(HvdcAngleDroopActivePowerControl.class); @@ -505,7 +504,7 @@ void testAcEmuWithOperationalLimits() { assertTrue(result.isFullyConverged()); // Active flow capped at other direction's limit. Output has losses (due to VSC stations) - assertEquals(-176.062, network.getHvdcConverterStation("cs2").getTerminal().getP(), DELTA_POWER); + assertEquals(-176.081, network.getHvdcConverterStation("cs2").getTerminal().getP(), DELTA_POWER); assertEquals(180, network.getHvdcConverterStation("cs3").getTerminal().getP(), DELTA_POWER); } @@ -514,7 +513,6 @@ void testAcEmuAndPMax() { Network network = HvdcNetworkFactory.createHvdcLinkedByTwoLinesAndSwitch(HvdcConverterStation.HvdcType.VSC); // without limit p=195 network.getHvdcLine("hvdc23") - .setR(0d) //Removing resistance to ignore cable loss .setMaxP(170); LoadFlow.Runner loadFlowRunner = new LoadFlow.Runner(new OpenLoadFlowProvider(new DenseMatrixFactory())); @@ -526,7 +524,7 @@ void testAcEmuAndPMax() { // Active flow capped at limit. Output has losses (due to VSC stations) assertActivePowerEquals(170, network.getHvdcConverterStation("cs2").getTerminal()); - assertActivePowerEquals(-166.280, network.getHvdcConverterStation("cs3").getTerminal()); + assertActivePowerEquals(-166.263, network.getHvdcConverterStation("cs3").getTerminal()); // now invert power direction HvdcAngleDroopActivePowerControl activePowerControl = network.getHvdcLine("hvdc23").getExtension(HvdcAngleDroopActivePowerControl.class); @@ -534,7 +532,7 @@ void testAcEmuAndPMax() { result = loadFlowRunner.run(network, p); assertTrue(result.isFullyConverged()); - assertActivePowerEquals(-166.280, network.getHvdcConverterStation("cs2").getTerminal()); + assertActivePowerEquals(-166.298, network.getHvdcConverterStation("cs2").getTerminal()); assertActivePowerEquals(170, network.getHvdcConverterStation("cs3").getTerminal()); } diff --git a/src/test/java/com/powsybl/openloadflow/sa/OpenSecurityAnalysisWithActionsTest.java b/src/test/java/com/powsybl/openloadflow/sa/OpenSecurityAnalysisWithActionsTest.java index 24da892705..cb01f867c2 100644 --- a/src/test/java/com/powsybl/openloadflow/sa/OpenSecurityAnalysisWithActionsTest.java +++ b/src/test/java/com/powsybl/openloadflow/sa/OpenSecurityAnalysisWithActionsTest.java @@ -1284,7 +1284,7 @@ void testVSCLossAcEmulation() { // but other converter station keeps its voltage control capability. // remedial action re-enables the ac emulation of the hvdc line. Network network = HvdcNetworkFactory.createHvdcLinkedByTwoLinesAndSwitch(HvdcConverterStation.HvdcType.VSC); - network.getHvdcLine("hvdc23").setR(0d); //Removing resistance to ignore cable loss + network.getHvdcLine("hvdc23"); List contingencies = List.of(new Contingency("contingency", new LineContingency("l12"))); List actions = List.of(new SwitchAction("action", "s2", false)); List operatorStrategies = List.of(new OperatorStrategy("strategy", @@ -1294,9 +1294,9 @@ void testVSCLossAcEmulation() { List monitors = createNetworkMonitors(network); SecurityAnalysisResult result = runSecurityAnalysis(network, contingencies, monitors, new SecurityAnalysisParameters(), operatorStrategies, actions, ReportNode.NO_OP); - assertEquals(193.822, result.getPreContingencyResult().getNetworkResult().getBranchResult("l34").getP1(), LoadFlowAssert.DELTA_POWER); + assertEquals(193.799, result.getPreContingencyResult().getNetworkResult().getBranchResult("l34").getP1(), LoadFlowAssert.DELTA_POWER); assertEquals(0.0, getPostContingencyResult(result, "contingency").getNetworkResult().getBranchResult("l34").getP1(), LoadFlowAssert.DELTA_POWER); - assertEquals(193.822, getOperatorStrategyResult(result, "strategy").getNetworkResult().getBranchResult("l34").getP1(), LoadFlowAssert.DELTA_POWER); + assertEquals(193.799, getOperatorStrategyResult(result, "strategy").getNetworkResult().getBranchResult("l34").getP1(), LoadFlowAssert.DELTA_POWER); } @Test @@ -1331,7 +1331,6 @@ void testHvdcDisconnectedThenConnectedByStrategy() { List monitors = createNetworkMonitors(network); // with AC emulation first - network.getHvdcLine("hvdc23").setR(0d); //Removing resistance to ignore cable loss in AC emulation SecurityAnalysisResult result = runSecurityAnalysis(network, contingencies, monitors, new SecurityAnalysisParameters(), operatorStrategies, actions, ReportNode.NO_OP); @@ -1345,13 +1344,12 @@ void testHvdcDisconnectedThenConnectedByStrategy() { OperatorStrategyResult operatorStrategyResult = getOperatorStrategyResult(result, "strategyL1"); assertEquals(198.158, operatorStrategyResult.getNetworkResult().getBranchResult("l12Bis").getP1(), DELTA_POWER); - assertEquals(193.822, operatorStrategyResult.getNetworkResult().getBranchResult("l34").getP1(), DELTA_POWER); - assertEquals(106.177, operatorStrategyResult.getNetworkResult().getBranchResult("l14").getP1(), DELTA_POWER); + assertEquals(193.799, operatorStrategyResult.getNetworkResult().getBranchResult("l34").getP1(), DELTA_POWER); + assertEquals(106.201, operatorStrategyResult.getNetworkResult().getBranchResult("l14").getP1(), DELTA_POWER); // without AC emulation SecurityAnalysisParameters parameters = new SecurityAnalysisParameters(); parameters.getLoadFlowParameters().setHvdcAcEmulation(false); - network.getHvdcLine("hvdc23").setR(0.1d); //Putting back resistance of the cable to keep same old behaviour SecurityAnalysisResult result2 = runSecurityAnalysis(network, contingencies, monitors, parameters, operatorStrategies, actions, ReportNode.NO_OP); From a2fb18c4ae9d07aa574a51890a4710b653cc7551 Mon Sep 17 00:00:00 2001 From: PRABAKARAN Sylvestre Date: Mon, 15 Jul 2024 14:57:22 +0200 Subject: [PATCH 15/22] Changed signs to avoid confusion Signed-off-by: PRABAKARAN Sylvestre --- .../equations/AbstractHvdcAcEmulationFlowEquationTerm.java | 6 +++--- .../HvdcAcEmulationSide1ActiveFlowEquationTerm.java | 2 +- .../HvdcAcEmulationSide2ActiveFlowEquationTerm.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java b/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java index a755177b4f..96954036a7 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java @@ -86,10 +86,10 @@ protected double getVscLossMultiplier() { protected double getActivePowerWithLosses(double boundedP) { if (boundedP < 0) { // converterStation1 is the rectifier and converterStation2 is the inverter double rectifierPDc = (1 - lossFactor1) * boundedP; - return (1 - lossFactor2) * (rectifierPDc - getHvdcLineLosses(rectifierPDc, r)); + return -(1 - lossFactor2) * (rectifierPDc - getHvdcLineLosses(rectifierPDc, r)); } else { // converterStation2 is the rectifier and converterStation1 is the inverter - double rectifierPDc = -(1 - lossFactor2) * boundedP; - return (1 - lossFactor1) * (rectifierPDc + getHvdcLineLosses(rectifierPDc, r)); + double rectifierPDc = (1 - lossFactor2) * boundedP; + return (1 - lossFactor1) * (rectifierPDc - getHvdcLineLosses(rectifierPDc, r)); } } diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java b/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java index 4e963b609a..850295bcb5 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java @@ -25,7 +25,7 @@ public HvdcAcEmulationSide1ActiveFlowEquationTerm(LfHvdc hvdc, LfBus bus1, LfBus private double p1(double ph1, double ph2) { double boundedP = boundedP(rawP(ph1, ph2)); - return isController(boundedP) ? boundedP : getActivePowerWithLosses(boundedP); + return isController(boundedP) ? boundedP : -getActivePowerWithLosses(boundedP); } private static boolean isController(double rawP) { diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide2ActiveFlowEquationTerm.java b/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide2ActiveFlowEquationTerm.java index 845c88cbd8..53665db381 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide2ActiveFlowEquationTerm.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide2ActiveFlowEquationTerm.java @@ -25,7 +25,7 @@ public HvdcAcEmulationSide2ActiveFlowEquationTerm(LfHvdc hvdc, LfBus bus1, LfBus private double p2(double ph1, double ph2) { double boundedP = boundedP(rawP(ph1, ph2)); - return isController(boundedP) ? -boundedP : getActivePowerWithLosses(boundedP); + return isController(boundedP) ? -boundedP : -getActivePowerWithLosses(boundedP); } private boolean isController(double rawP) { From 74dface3586264442ef7a5838ce820b2df31c94c Mon Sep 17 00:00:00 2001 From: PRABAKARAN Sylvestre Date: Mon, 15 Jul 2024 14:57:56 +0200 Subject: [PATCH 16/22] Added assert to check sign of powers Signed-off-by: PRABAKARAN Sylvestre --- .../java/com/powsybl/openloadflow/ac/AcLoadFlowVscTest.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/test/java/com/powsybl/openloadflow/ac/AcLoadFlowVscTest.java b/src/test/java/com/powsybl/openloadflow/ac/AcLoadFlowVscTest.java index 53763e8470..d5c14acb8d 100644 --- a/src/test/java/com/powsybl/openloadflow/ac/AcLoadFlowVscTest.java +++ b/src/test/java/com/powsybl/openloadflow/ac/AcLoadFlowVscTest.java @@ -313,6 +313,8 @@ void testHvdcDirectionChangeAcEmulation() { assertTrue(result.isFullyConverged()); double pcs1r0 = network.getVscConverterStation("cs1").getTerminal().getP(); double pcs2r0 = network.getVscConverterStation("cs2").getTerminal().getP(); + assertTrue(pcs1r0 > 0, "Power enters at cs1"); + assertTrue(pcs2r0 < 0, "Power delivered by cs2"); assertTrue(pcs1r0 - pcs2r0 < pcs1 - pcs2); // Check that loss with R=0 is lower than loss with R!=0 // Reverse power flow direction @@ -342,6 +344,8 @@ void testHvdcDirectionChangeAcEmulation() { assertTrue(result.isFullyConverged()); pcs1r0 = network.getVscConverterStation("cs1").getTerminal().getP(); pcs2r0 = network.getVscConverterStation("cs2").getTerminal().getP(); + assertTrue(pcs2r0 > 0, "Power enters at cs2"); + assertTrue(pcs1r0 < 0, "Power delivered by cs1"); assertTrue(pcs2r0 - pcs1r0 < pcs2 - pcs1); // Check that loss with R=0 is lower than loss with R!=0 } From 50ecc4deb74a2d1681653c0d5cd5a085829bb02d Mon Sep 17 00:00:00 2001 From: PRABAKARAN Sylvestre Date: Mon, 15 Jul 2024 17:05:53 +0200 Subject: [PATCH 17/22] Rename methods and added comments Signed-off-by: PRABAKARAN Sylvestre --- .../AbstractHvdcAcEmulationFlowEquationTerm.java | 11 +++-------- .../HvdcAcEmulationSide1ActiveFlowEquationTerm.java | 3 ++- .../HvdcAcEmulationSide2ActiveFlowEquationTerm.java | 3 ++- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java b/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java index 96954036a7..e7f91b2a9c 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java @@ -83,14 +83,9 @@ protected double getVscLossMultiplier() { return (1 - lossFactor1) * (1 - lossFactor2); } - protected double getActivePowerWithLosses(double boundedP) { - if (boundedP < 0) { // converterStation1 is the rectifier and converterStation2 is the inverter - double rectifierPDc = (1 - lossFactor1) * boundedP; - return -(1 - lossFactor2) * (rectifierPDc - getHvdcLineLosses(rectifierPDc, r)); - } else { // converterStation2 is the rectifier and converterStation1 is the inverter - double rectifierPDc = (1 - lossFactor2) * boundedP; - return (1 - lossFactor1) * (rectifierPDc - getHvdcLineLosses(rectifierPDc, r)); - } + protected double getAbsActivePowerWithLosses(double boundedP, double lossRectifier, double lossInverter) { + double rectifierPDc = (1 - lossRectifier) * Math.abs(boundedP); + return (1 - lossInverter) * (rectifierPDc - getHvdcLineLosses(rectifierPDc, r)); } protected static double getHvdcLineLosses(double rectifierPDc, double r) { diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java b/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java index 850295bcb5..d047801c47 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java @@ -25,7 +25,8 @@ public HvdcAcEmulationSide1ActiveFlowEquationTerm(LfHvdc hvdc, LfBus bus1, LfBus private double p1(double ph1, double ph2) { double boundedP = boundedP(rawP(ph1, ph2)); - return isController(boundedP) ? boundedP : -getActivePowerWithLosses(boundedP); + // if converterStation1 is controller, then p1 is positive, otherwise it is negative + return isController(boundedP) ? boundedP : -getAbsActivePowerWithLosses(boundedP, lossFactor1, lossFactor2); } private static boolean isController(double rawP) { diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide2ActiveFlowEquationTerm.java b/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide2ActiveFlowEquationTerm.java index 53665db381..1c5e2d3bbd 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide2ActiveFlowEquationTerm.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide2ActiveFlowEquationTerm.java @@ -25,7 +25,8 @@ public HvdcAcEmulationSide2ActiveFlowEquationTerm(LfHvdc hvdc, LfBus bus1, LfBus private double p2(double ph1, double ph2) { double boundedP = boundedP(rawP(ph1, ph2)); - return isController(boundedP) ? -boundedP : -getActivePowerWithLosses(boundedP); + // if converterStation2 is controller, then p2 is positive, otherwise it is negative + return isController(boundedP) ? -boundedP : -getAbsActivePowerWithLosses(boundedP, lossFactor2, lossFactor1); } private boolean isController(double rawP) { From 8c2af3fc60030a8e55efd1bdffaf1ed5c487a900 Mon Sep 17 00:00:00 2001 From: PRABAKARAN Sylvestre Date: Mon, 15 Jul 2024 17:06:31 +0200 Subject: [PATCH 18/22] Fixed error in checking sign of losses Signed-off-by: PRABAKARAN Sylvestre --- .../openloadflow/ac/AcLoadFlowVscTest.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/test/java/com/powsybl/openloadflow/ac/AcLoadFlowVscTest.java b/src/test/java/com/powsybl/openloadflow/ac/AcLoadFlowVscTest.java index d5c14acb8d..4620072c26 100644 --- a/src/test/java/com/powsybl/openloadflow/ac/AcLoadFlowVscTest.java +++ b/src/test/java/com/powsybl/openloadflow/ac/AcLoadFlowVscTest.java @@ -290,8 +290,10 @@ void testHvdcPowerAcEmulationWithoutR() { @Test void testHvdcDirectionChangeAcEmulation() { Network network = HvdcNetworkFactory.createHvdcInAcEmulationInSymetricNetwork(); + network.getHvdcLine("hvdc12").setR(0.1d); LoadFlow.Runner loadFlowRunner = new LoadFlow.Runner(new OpenLoadFlowProvider(new DenseMatrixFactory())); - LoadFlowResult result = loadFlowRunner.run(network, new LoadFlowParameters()); + LoadFlowParameters parameters = new LoadFlowParameters().setHvdcAcEmulation(true); + LoadFlowResult result = loadFlowRunner.run(network, parameters); assertTrue(result.isFullyConverged()); double pg2 = network.getGenerator("g2").getTerminal().getP(); @@ -309,19 +311,19 @@ void testHvdcDirectionChangeAcEmulation() { // Test if removing line resistance increases the power transit network.getHvdcLine("hvdc12").setR(0d); - result = loadFlowRunner.run(network, new LoadFlowParameters()); + result = loadFlowRunner.run(network, parameters); assertTrue(result.isFullyConverged()); double pcs1r0 = network.getVscConverterStation("cs1").getTerminal().getP(); double pcs2r0 = network.getVscConverterStation("cs2").getTerminal().getP(); assertTrue(pcs1r0 > 0, "Power enters at cs1"); assertTrue(pcs2r0 < 0, "Power delivered by cs2"); - assertTrue(pcs1r0 - pcs2r0 < pcs1 - pcs2); // Check that loss with R=0 is lower than loss with R!=0 + assertTrue(Math.abs(pcs2r0 + pcs1r0) < Math.abs(pcs2 - pcs1)); // Check that loss with R=0 is lower than loss with R!=0 // Reverse power flow direction network.getHvdcLine("hvdc12").setR(0.1d); network.getGenerator("g2").setTargetP(5); network.getGenerator("g1").setTargetP(0); - result = loadFlowRunner.run(network, new LoadFlowParameters()); + result = loadFlowRunner.run(network, parameters); assertTrue(result.isFullyConverged()); pg2 = network.getGenerator("g2").getTerminal().getP(); @@ -340,13 +342,13 @@ void testHvdcDirectionChangeAcEmulation() { // Test if removing line resistance increases the power transit in symetric network network.getHvdcLine("hvdc12").setR(0d); - result = loadFlowRunner.run(network, new LoadFlowParameters()); + result = loadFlowRunner.run(network, parameters); assertTrue(result.isFullyConverged()); pcs1r0 = network.getVscConverterStation("cs1").getTerminal().getP(); pcs2r0 = network.getVscConverterStation("cs2").getTerminal().getP(); assertTrue(pcs2r0 > 0, "Power enters at cs2"); assertTrue(pcs1r0 < 0, "Power delivered by cs1"); - assertTrue(pcs2r0 - pcs1r0 < pcs2 - pcs1); // Check that loss with R=0 is lower than loss with R!=0 + assertTrue(Math.abs(pcs2r0 + pcs1r0) < Math.abs(pcs2 - pcs1)); // Check that loss with R=0 is lower than loss with R!=0 } @Test @@ -508,7 +510,7 @@ void testAcEmuWithOperationalLimits() { assertTrue(result.isFullyConverged()); // Active flow capped at other direction's limit. Output has losses (due to VSC stations) - assertEquals(-176.081, network.getHvdcConverterStation("cs2").getTerminal().getP(), DELTA_POWER); + assertEquals(-176.042, network.getHvdcConverterStation("cs2").getTerminal().getP(), DELTA_POWER); assertEquals(180, network.getHvdcConverterStation("cs3").getTerminal().getP(), DELTA_POWER); } @@ -536,7 +538,7 @@ void testAcEmuAndPMax() { result = loadFlowRunner.run(network, p); assertTrue(result.isFullyConverged()); - assertActivePowerEquals(-166.298, network.getHvdcConverterStation("cs2").getTerminal()); + assertActivePowerEquals(-166.263, network.getHvdcConverterStation("cs2").getTerminal()); assertActivePowerEquals(170, network.getHvdcConverterStation("cs3").getTerminal()); } From b8dc6ddecb85ea764a5d6e1941031eadd2e7cfad Mon Sep 17 00:00:00 2001 From: PRABAKARAN Sylvestre Date: Tue, 16 Jul 2024 13:42:05 +0200 Subject: [PATCH 19/22] Removed unused line Signed-off-by: PRABAKARAN Sylvestre --- .../openloadflow/sa/OpenSecurityAnalysisWithActionsTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/com/powsybl/openloadflow/sa/OpenSecurityAnalysisWithActionsTest.java b/src/test/java/com/powsybl/openloadflow/sa/OpenSecurityAnalysisWithActionsTest.java index cb01f867c2..722f1758e8 100644 --- a/src/test/java/com/powsybl/openloadflow/sa/OpenSecurityAnalysisWithActionsTest.java +++ b/src/test/java/com/powsybl/openloadflow/sa/OpenSecurityAnalysisWithActionsTest.java @@ -1284,7 +1284,6 @@ void testVSCLossAcEmulation() { // but other converter station keeps its voltage control capability. // remedial action re-enables the ac emulation of the hvdc line. Network network = HvdcNetworkFactory.createHvdcLinkedByTwoLinesAndSwitch(HvdcConverterStation.HvdcType.VSC); - network.getHvdcLine("hvdc23"); List contingencies = List.of(new Contingency("contingency", new LineContingency("l12"))); List actions = List.of(new SwitchAction("action", "s2", false)); List operatorStrategies = List.of(new OperatorStrategy("strategy", From 6fc2c5a7c15670cf13396d0fbaa455e1c9b0a3e9 Mon Sep 17 00:00:00 2001 From: PRABAKARAN Sylvestre Date: Tue, 16 Jul 2024 13:42:25 +0200 Subject: [PATCH 20/22] Renamed variables Signed-off-by: PRABAKARAN Sylvestre --- .../AbstractHvdcAcEmulationFlowEquationTerm.java | 10 +++++----- .../HvdcAcEmulationSide1ActiveFlowEquationTerm.java | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java b/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java index e7f91b2a9c..3f618aaf4d 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java @@ -83,13 +83,13 @@ protected double getVscLossMultiplier() { return (1 - lossFactor1) * (1 - lossFactor2); } - protected double getAbsActivePowerWithLosses(double boundedP, double lossRectifier, double lossInverter) { - double rectifierPDc = (1 - lossRectifier) * Math.abs(boundedP); - return (1 - lossInverter) * (rectifierPDc - getHvdcLineLosses(rectifierPDc, r)); + protected double getAbsActivePowerWithLosses(double boundedP, double lossController, double lossControlled) { + double lineInputPower = (1 - lossController) * Math.abs(boundedP); + return (1 - lossControlled) * (lineInputPower - getHvdcLineLosses(lineInputPower, r)); } - protected static double getHvdcLineLosses(double rectifierPDc, double r) { - return HvdcUtils.getHvdcLineLosses(rectifierPDc, 1, r); + protected static double getHvdcLineLosses(double lineInputPower, double r) { + return HvdcUtils.getHvdcLineLosses(lineInputPower, 1, r); } @Override diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java b/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java index d047801c47..34000d0e1c 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java @@ -40,7 +40,7 @@ private boolean isInOperatingRange(double rawP) { protected double dp1dph1(double ph1, double ph2) { double rawP = rawP(ph1, ph2); if (isInOperatingRange(rawP)) { - return (isController(rawP) ? 1 : getVscLossMultiplier()) * k; + return (isController(rawP) ? 1 : getVscLossMultiplier()) * k; // derivative of cable loss is neglected } else { return 0; } From 47a137e8468e8d0b2a0012a449db696e4a213667 Mon Sep 17 00:00:00 2001 From: PRABAKARAN Sylvestre Date: Tue, 16 Jul 2024 14:45:05 +0200 Subject: [PATCH 21/22] Renamed variable for better comprehension Signed-off-by: PRABAKARAN Sylvestre --- .../ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java b/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java index 3f618aaf4d..6b70d078c5 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/AbstractHvdcAcEmulationFlowEquationTerm.java @@ -83,9 +83,9 @@ protected double getVscLossMultiplier() { return (1 - lossFactor1) * (1 - lossFactor2); } - protected double getAbsActivePowerWithLosses(double boundedP, double lossController, double lossControlled) { + protected double getAbsActivePowerWithLosses(double boundedP, double lossController, double lossNonController) { double lineInputPower = (1 - lossController) * Math.abs(boundedP); - return (1 - lossControlled) * (lineInputPower - getHvdcLineLosses(lineInputPower, r)); + return (1 - lossNonController) * (lineInputPower - getHvdcLineLosses(lineInputPower, r)); } protected static double getHvdcLineLosses(double lineInputPower, double r) { From e8fd904c191917ce0f464d1067942aa4d9054b76 Mon Sep 17 00:00:00 2001 From: PRABAKARAN Sylvestre Date: Tue, 16 Jul 2024 16:14:16 +0200 Subject: [PATCH 22/22] Changed boundedP to rawP in checking controller station Signed-off-by: PRABAKARAN Sylvestre --- .../equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java | 4 ++-- .../equations/HvdcAcEmulationSide2ActiveFlowEquationTerm.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java b/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java index 34000d0e1c..5a586ee5f1 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide1ActiveFlowEquationTerm.java @@ -24,9 +24,9 @@ public HvdcAcEmulationSide1ActiveFlowEquationTerm(LfHvdc hvdc, LfBus bus1, LfBus } private double p1(double ph1, double ph2) { - double boundedP = boundedP(rawP(ph1, ph2)); + double rawP = rawP(ph1, ph2); // if converterStation1 is controller, then p1 is positive, otherwise it is negative - return isController(boundedP) ? boundedP : -getAbsActivePowerWithLosses(boundedP, lossFactor1, lossFactor2); + return isController(rawP) ? boundedP(rawP) : -getAbsActivePowerWithLosses(boundedP(rawP), lossFactor1, lossFactor2); } private static boolean isController(double rawP) { diff --git a/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide2ActiveFlowEquationTerm.java b/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide2ActiveFlowEquationTerm.java index 1c5e2d3bbd..f254770b79 100644 --- a/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide2ActiveFlowEquationTerm.java +++ b/src/main/java/com/powsybl/openloadflow/ac/equations/HvdcAcEmulationSide2ActiveFlowEquationTerm.java @@ -24,9 +24,9 @@ public HvdcAcEmulationSide2ActiveFlowEquationTerm(LfHvdc hvdc, LfBus bus1, LfBus } private double p2(double ph1, double ph2) { - double boundedP = boundedP(rawP(ph1, ph2)); + double rawP = rawP(ph1, ph2); // if converterStation2 is controller, then p2 is positive, otherwise it is negative - return isController(boundedP) ? -boundedP : -getAbsActivePowerWithLosses(boundedP, lossFactor2, lossFactor1); + return isController(rawP) ? -boundedP(rawP) : -getAbsActivePowerWithLosses(boundedP(rawP), lossFactor2, lossFactor1); } private boolean isController(double rawP) {