LinesWithDifferentNominalVoltagesTest.java

/**
 * Copyright (c) 2022, Coreso SA (https://www.coreso.eu/) and TSCNET Services GmbH (https://www.tscnet.eu/)
 * 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.LinesWithDifferentNominalVoltagesNetworkFactory;
import com.powsybl.openloadflow.network.SlackBusSelectionMode;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.util.List;

import static com.powsybl.openloadflow.util.LoadFlowAssert.*;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;

/**
 * @see LinesWithDifferentNominalVoltagesNetworkFactory
 *
 * @author Damien Jeandemange {@literal <damien.jeandemange at artelys.com>}
 */
class LinesWithDifferentNominalVoltagesTest {

    private Network network;
    private LoadFlow.Runner loadFlowRunner;
    private LoadFlowParameters parameters;

    private Bus b225g;
    private Bus b225l;
    private Bus b220A;
    private Bus b230A;
    private Bus b220B;
    private Bus b230B;
    private Line l225to225;
    private Line l225to230;
    private Line l225to220;
    private Line l230to225;
    private Line l220to225;

    @BeforeEach
    void setUp() {
        network = LinesWithDifferentNominalVoltagesNetworkFactory.create();

        b225g = network.getBusBreakerView().getBus("b225g");
        b225l = network.getBusBreakerView().getBus("b225l");
        b220A = network.getBusBreakerView().getBus("b220A");
        b230A = network.getBusBreakerView().getBus("b230A");
        b220B = network.getBusBreakerView().getBus("b220B");
        b230B = network.getBusBreakerView().getBus("b230B");
        l225to225 = network.getLine("l225-225");
        l225to230 = network.getLine("l225-230");
        l225to220 = network.getLine("l225-220");
        l230to225 = network.getLine("l230-225");
        l220to225 = network.getLine("l220-225");

        loadFlowRunner = new LoadFlow.Runner(new OpenLoadFlowProvider(new DenseMatrixFactory()));
        parameters = new LoadFlowParameters().setDistributedSlack(true);
        OpenLoadFlowParameters.create(parameters)
                .setSlackBusSelectionMode(SlackBusSelectionMode.LARGEST_GENERATOR);
    }

    @Test
    void test() {

        LoadFlowResult result = loadFlowRunner.run(network, parameters);
        assertTrue(result.isFullyConverged());
        assertEquals(1, result.getComponentResults().size());

        // slack bus
        assertVoltageEquals(225.0, b225g);
        assertAngleEquals(0.0, b225g);

        // load buses
        List.of(b225l, b220A, b230A, b220B, b230B).forEach(bus -> {
            assertVoltageEquals(218.294, bus);
            assertAngleEquals(-3.4606395, bus);
        });

        // line flows, load side
        List.of(
            l225to225.getTerminal(TwoSides.TWO),
            l225to220.getTerminal(TwoSides.TWO),
            l225to230.getTerminal(TwoSides.TWO),
            l220to225.getTerminal(TwoSides.ONE),
            l230to225.getTerminal(TwoSides.ONE)).forEach(terminal -> {
                assertActivePowerEquals(-100, terminal);
                assertReactivePowerEquals(-40, terminal);
            });

        // line flows, generator side
        List.of(
            l225to225.getTerminal(TwoSides.ONE),
            l225to220.getTerminal(TwoSides.ONE),
            l225to230.getTerminal(TwoSides.ONE),
            l220to225.getTerminal(TwoSides.TWO),
            l230to225.getTerminal(TwoSides.TWO)).forEach(terminal -> {
                assertActivePowerEquals(103.444104, terminal);
                assertReactivePowerEquals(45.4712006, terminal);
            });
    }

}