AcLoadFlow3wtTest.java
/**
* Copyright (c) 2019, RTE (http://www.rte-france.com)
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
* SPDX-License-Identifier: MPL-2.0
*/
package com.powsybl.openloadflow.ac;
import com.powsybl.iidm.network.*;
import com.powsybl.loadflow.LoadFlow;
import com.powsybl.loadflow.LoadFlowParameters;
import com.powsybl.loadflow.LoadFlowResult;
import com.powsybl.math.matrix.DenseMatrixFactory;
import com.powsybl.openloadflow.OpenLoadFlowParameters;
import com.powsybl.openloadflow.OpenLoadFlowProvider;
import com.powsybl.openloadflow.network.SlackBusSelectionMode;
import com.powsybl.openloadflow.network.T3wtFactory;
import com.powsybl.openloadflow.util.LoadFlowAssert;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static com.powsybl.openloadflow.util.LoadFlowAssert.*;
import static org.junit.jupiter.api.Assertions.assertTrue;
class AcLoadFlow3wtTest {
private Network network;
private Substation s;
private Bus bus1;
private Bus bus2;
private Bus bus3;
private ThreeWindingsTransformer twt;
private LoadFlow.Runner loadFlowRunner;
private LoadFlowParameters parameters;
@BeforeEach
void setUp() {
network = T3wtFactory.create();
s = network.getSubstation("s");
bus1 = network.getBusBreakerView().getBus("b1");
bus2 = network.getBusBreakerView().getBus("b2");
bus3 = network.getBusBreakerView().getBus("b3");
twt = network.getThreeWindingsTransformer("3wt");
loadFlowRunner = new LoadFlow.Runner(new OpenLoadFlowProvider(new DenseMatrixFactory()));
parameters = new LoadFlowParameters().setUseReactiveLimits(false)
.setDistributedSlack(false);
OpenLoadFlowParameters.create(parameters)
.setSlackBusSelectionMode(SlackBusSelectionMode.MOST_MESHED);
}
@Test
void test() {
LoadFlowResult result = loadFlowRunner.run(network, parameters);
assertTrue(result.isFullyConverged());
assertVoltageEquals(405, bus1);
LoadFlowAssert.assertAngleEquals(0, bus1);
assertVoltageEquals(235.132, bus2);
LoadFlowAssert.assertAngleEquals(-2.259241, bus2);
assertVoltageEquals(20.834, bus3);
LoadFlowAssert.assertAngleEquals(-2.721885, bus3);
assertActivePowerEquals(161.095, twt.getLeg1().getTerminal());
assertReactivePowerEquals(81.884, twt.getLeg1().getTerminal());
assertActivePowerEquals(-161, twt.getLeg2().getTerminal());
assertReactivePowerEquals(-74, twt.getLeg2().getTerminal());
assertActivePowerEquals(0, twt.getLeg3().getTerminal());
assertReactivePowerEquals(0, twt.getLeg3().getTerminal());
}
@Test
void testWithRatioTapChangers() {
// create a ratio tap changer on leg 1 and check that voltages on leg 2 and 3 have changed compare to previous
// test
twt.getLeg1().newRatioTapChanger()
.setLoadTapChangingCapabilities(false)
.setTapPosition(0)
.beginStep()
.setR(5)
.setX(10)
.setRho(0.9)
.endStep()
.add();
LoadFlowResult result = loadFlowRunner.run(network, parameters);
assertTrue(result.isFullyConverged());
assertVoltageEquals(405, bus1);
assertVoltageEquals(209.886, bus2);
assertVoltageEquals(18.582, bus3);
}
@Test
void testWithPhaseTapChangers() {
// create a phase tap changer at leg 2 with a zero phase shifting
PhaseTapChanger ptc = twt.getLeg2().newPhaseTapChanger()
.setTapPosition(0)
.beginStep()
.setAlpha(0)
.endStep()
.add();
// create a transformer between bus 1 / bus2 in parallel of leg1 / leg2
TwoWindingsTransformer twtParallel = s.newTwoWindingsTransformer()
.setId("2wt")
.setBus1("b1")
.setConnectableBus1("b1")
.setBus2("b2")
.setConnectableBus2("b2")
.setRatedU1(390)
.setRatedU2(220)
.setR(4)
.setX(80)
.add();
LoadFlowResult result = loadFlowRunner.run(network, parameters);
assertTrue(result.isFullyConverged());
assertActivePowerEquals(21.97, twtParallel.getTerminal1());
assertActivePowerEquals(-139.088, twt.getLeg2().getTerminal());
// set the phase shifting to 10 degree and check active flow change
ptc.getStep(0).setAlpha(10);
result = loadFlowRunner.run(network, parameters);
assertTrue(result.isFullyConverged());
assertActivePowerEquals(121.691, twtParallel.getTerminal1());
assertActivePowerEquals(-40.451, twt.getLeg2().getTerminal());
}
@Test
void testSplitShuntAdmittance() {
parameters.setTwtSplitShuntAdmittance(false);
twt.getLeg1().setB(0.00004);
LoadFlowResult result = loadFlowRunner.run(network, parameters);
assertTrue(result.isFullyConverged());
assertVoltageEquals(405, bus1);
LoadFlowAssert.assertAngleEquals(0, bus1);
assertVoltageEquals(235.132, bus2);
LoadFlowAssert.assertAngleEquals(-2.259241, bus2);
assertVoltageEquals(20.834, bus3);
LoadFlowAssert.assertAngleEquals(-2.721885, bus3);
assertActivePowerEquals(161.095, twt.getLeg1().getTerminal());
assertReactivePowerEquals(75.323, twt.getLeg1().getTerminal());
assertActivePowerEquals(-161, twt.getLeg2().getTerminal());
assertReactivePowerEquals(-74, twt.getLeg2().getTerminal());
assertActivePowerEquals(0, twt.getLeg3().getTerminal());
assertReactivePowerEquals(0, twt.getLeg3().getTerminal());
parameters.setTwtSplitShuntAdmittance(true);
result = loadFlowRunner.run(network, parameters);
assertTrue(result.isFullyConverged());
assertVoltageEquals(405, bus1);
LoadFlowAssert.assertAngleEquals(0, bus1);
assertVoltageEquals(235.358, bus2);
LoadFlowAssert.assertAngleEquals(-2.257583, bus2);
assertVoltageEquals(20.854, bus3);
LoadFlowAssert.assertAngleEquals(-2.719334, bus3);
assertActivePowerEquals(161.095, twt.getLeg1().getTerminal());
assertReactivePowerEquals(75.314, twt.getLeg1().getTerminal());
assertActivePowerEquals(-161, twt.getLeg2().getTerminal());
assertReactivePowerEquals(-74, twt.getLeg2().getTerminal());
assertActivePowerEquals(0, twt.getLeg3().getTerminal());
assertReactivePowerEquals(0, twt.getLeg3().getTerminal());
}
}