FourBusNetworkFactory.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.network;

import com.powsybl.iidm.network.*;
import com.powsybl.iidm.network.extensions.RemoteReactivePowerControlAdder;

/**
 * <p>4 bus test network:</p>
 *<pre>
 *      2pu                 2pu - 1pu
 *   1 =======           2 =======
 *      | | |               |   |
 *      | | +---------------+   |
 *      | |                     |
 *      | +-------------------+ |
 *      |                     | |
 *      |   +---------------+ | |
 *      |   |               | | |
 *   4 =======           3 =======
 *      1pu                 -4pu
 *</pre>
 *
 * @author Geoffroy Jamgotchian {@literal <geoffroy.jamgotchian at rte-france.com>}
 */
public class FourBusNetworkFactory extends AbstractLoadFlowNetworkFactory {

    public static Network createBaseNetwork() {
        Network network = Network.create("test", "code");
        Bus b1 = createBus(network, "b1");
        Bus b2 = createBus(network, "b2");
        Bus b3 = createBus(network, "b3");
        Bus b4 = createBus(network, "b4");
        createGenerator(b1, "g1", 2);
        createGenerator(b4, "g4", 1);
        createLoad(b2, "d2", 1);
        createLoad(b3, "d3", 4);
        createLine(network, b1, b4, "l14", 0.1f);
        createLine(network, b1, b2, "l12", 0.1f);
        createLine(network, b2, b3, "l23", 0.1f);
        createLine(network, b3, b4, "l34", 0.1f);
        createLine(network, b1, b3, "l13", 0.1f);
        return network;
    }

    public static Network create() {
        Network network = createBaseNetwork();
        Bus b2 = network.getBusBreakerView().getBus("b2");
        createGenerator(b2, "g2", 2);
        return network;
    }

    public static Network createWithPhaseTapChanger() {
        Network network = Network.create("test", "code");
        Bus b1 = createBus(network, "b1");
        Bus b2 = createBus(network, "test_s", "b2");
        Bus b3 = createBus(network, "test_s", "b3");
        Bus b4 = createBus(network, "b4");
        createGenerator(b1, "g1", 2);
        createGenerator(b4, "g4", 1);
        createLoad(b2, "d2", 1);
        createLoad(b3, "d3", 4);
        createLine(network, b1, b4, "l14", 0.1f);
        createLine(network, b1, b2, "l12", 0.1f);
        TwoWindingsTransformer twt = createTransformer(network, "test_s", b2, b3, "l23", 0.1f, 1d);
        twt.newPhaseTapChanger().setTapPosition(0)
           .beginStep()
           .setX(0.1f)
           .setAlpha(1)
           .endStep()
           .add();
        createLine(network, b3, b4, "l34", 0.1f);
        createLine(network, b1, b3, "l13", 0.1f);

        return network;
    }

    public static Network createWithPhaseTapChangerAndGeneratorAtBus2() {
        Network network = createWithPhaseTapChanger();
        Bus b2 = network.getBusBreakerView().getBus("b2");
        createGenerator(b2, "g2", 2);
        return network;
    }

    public static Network createWithTwoGeneratorsAtBus2() {
        Network network = create();
        Bus b2 = network.getBusBreakerView().getBus("b2");
        createGenerator(b2, "g5", 0.5);
        return network;
    }

    public static Network createWith2GeneratorsAtBus1() {
        Network network = create();
        Bus b1 = network.getBusBreakerView().getBus("b1");
        createGenerator(b1, "g1Bis", 2);
        network.getLoad("d3").setQ0(1);
        return network;
    }

    public static Network createWithReactiveControl() {
        Network network = create();
        network.getLoad("d3").setQ0(1);
        Line l34 = network.getLine("l34");
        double remoteTargetQ = 2.0;
        Generator g4 = network.getGenerator("g4");
        g4.setTargetQ(0).setVoltageRegulatorOn(false);
        Generator g1 = network.getGenerator("g1");
        g1.setTargetQ(0).setVoltageRegulatorOn(false);
        g1.newExtension(RemoteReactivePowerControlAdder.class)
                .withTargetQ(remoteTargetQ)
                .withRegulatingTerminal(l34.getTerminal(TwoSides.TWO))
                .withEnabled(true)
                .add();
        g4.newExtension(RemoteReactivePowerControlAdder.class)
                .withTargetQ(remoteTargetQ)
                .withRegulatingTerminal(l34.getTerminal(TwoSides.TWO))
                .withEnabled(true).add();
        return network;
    }

    public static Network createWithReactiveControl2GeneratorsOnSameBus() {
        Network network = create();
        network.getLoad("d3").setQ0(1);
        Line l34 = network.getLine("l34");
        double remoteTargetQ = 2.0;
        Bus b1 = network.getBusBreakerView().getBus("b1");
        Generator g1 = network.getGenerator("g1");
        g1.setTargetQ(0).setVoltageRegulatorOn(false);
        g1.newExtension(RemoteReactivePowerControlAdder.class)
                .withTargetQ(remoteTargetQ)
                .withRegulatingTerminal(l34.getTerminal(TwoSides.TWO))
                .withEnabled(true)
                .add();
        Generator g1Bis = createGenerator(b1, "g1Bis", 2);
        g1Bis.setTargetQ(0).setVoltageRegulatorOn(false);
        g1Bis.newExtension(RemoteReactivePowerControlAdder.class)
                .withTargetQ(remoteTargetQ)
                .withRegulatingTerminal(l34.getTerminal(TwoSides.TWO))
                .withEnabled(true)
                .add();
        return network;
    }

    public static Network createWithReactiveControl2GeneratorsOnSameBusAnd1Extra() {
        Network network = createWithReactiveControl2GeneratorsOnSameBus();
        Generator g4 = network.getGenerator("g4");
        g4.setTargetQ(0).setVoltageRegulatorOn(false);
        Line l34 = network.getLine("l34");
        double remoteTargetQ = 2.0;
        g4.newExtension(RemoteReactivePowerControlAdder.class)
                .withTargetQ(remoteTargetQ)
                .withRegulatingTerminal(l34.getTerminal(TwoSides.TWO))
                .withEnabled(true)
                .add();
        return network;
    }

    public static Network createWithAdditionalReactiveTerms() {
        Network network = Network.create("test", "code");
        Bus b1 = createBus(network, "b1");
        Bus b2 = createBus(network, "b2");
        Bus b3 = createBus(network, "b3");
        Bus b4 = createBus(network, "b4");
        createGenerator(b2, "g2", 2);
        createGenerator(b3, "g3", 2);
        createLoad(b1, "d1", 1);
        createLoad(b3, "d3", 3);
        createLine(network, b1, b2, "l12", 0.5f);
        createLine(network, b1, b3, "l13", 0.5f);
        createLine(network, b2, b4, "l24", 1f);
        createLine(network, b3, b4, "l34", 1f);
        Generator g2 = network.getGenerator("g2");
        g2.setRegulatingTerminal(network.getLine("l24").getTerminal2());
        Generator g3 = network.getGenerator("g3");
        g3.setRegulatingTerminal(network.getLine("l24").getTerminal2());
        return network;
    }

    public static Network createWithCondenser() {
        Network network = createBaseNetwork();
        network.getGenerator("g4")
                .setTargetP(0.0)
                .setMaxP(0.0)
                .setMinP(0.0);
        return network;
    }

    public static Network createWithTwoScs() {
        Network network = createBaseNetwork();
        Bus c1 = createBus(network, "c1");
        Bus c2 = createBus(network, "c2");
        createGenerator(c1, "gc1", 2);
        createLoad(c2, "dc2", 1);
        createLine(network, c1, c2, "lc12", 1f);
        createLine(network, c1, c2, "lc12Bis", 1f);
        return network;
    }

    /**
     *     b1 ------------------- b2 ----- t24 ------ b4 - d4
     *     |                      |
     *     |                      |
     *     |                      |
     *     b2 ------------------- b3 ----- t57 ------ b7 - d7
     *     | tr                   |--------t56 ------ b6 - d6
     *     b8 - g3
     **/
    public static Network createWithSeveralTransformerVoltageControls() {
        Network network = Network.create("testTransformerVoltageControls", "code");
        Bus b1 = createBus(network, "s", "b1", 225);
        Bus b2 = createBus(network, "s", "b2", 225);
        Bus b3 = createBus(network, "s", "b3", 225);
        Bus b4 = createBus(network, "s", "b4", 225);
        Bus b5 = createBus(network, "s", "b5", 225);
        Bus b6 = createBus(network, "s", "b6", 90);
        Bus b7 = createBus(network, "s", "b7", 90);
        Bus b8 = createBus(network, "s", "b8", 90);
        createGenerator(b1, "g1", 4, 230);
        createGenerator(b8, "g3", 3, 93);
        createLoad(b4, "d4", 2);
        createLoad(b6, "d6", 1);
        createLoad(b7, "d7", 4);
        createLine(network, b1, b2, "l12", 0.15);
        createLine(network, b1, b3, "l13", 0.1);
        createLine(network, b3, b5, "l35", 0.2);
        createLine(network, b2, b5, "l25", 0.16);
        createTransformer(network, "s", b3, b8, "t38", 0.15, 1d);
        TwoWindingsTransformer twt = createTransformer(network, "s", b2, b4, "t24", 1.0, 1d);
        twt.newRatioTapChanger()
                .setTapPosition(0)
                .setRegulationTerminal(twt.getTerminal2())
                .setTargetV(230)
                .setRegulating(true)
                .setTargetDeadband(0.1)
                .setLoadTapChangingCapabilities(true)
                .beginStep()
                    .setX(0.1f)
                    .setRho(1.2)
                .endStep()
                .beginStep()
                    .setX(0.1f)
                    .setRho(1.0)
                .endStep()
                .beginStep()
                    .setX(0.1f)
                    .setRho(0.8)
                .endStep()
                .add();
        TwoWindingsTransformer twt2 = createTransformer(network, "s", b5, b7, "t57", 0.2, 1d);
        twt2.newRatioTapChanger()
                .setTapPosition(0)
                .setRegulationTerminal(twt2.getTerminal2())
                .setTargetV(93)
                .setRegulating(true)
                .setTargetDeadband(0.1)
                .setLoadTapChangingCapabilities(true)
                .beginStep()
                    .setX(0.1f)
                    .setRho(1.2)
                .endStep()
                .beginStep()
                    .setX(0.1f)
                    .setRho(1.0)
                .endStep()
                .beginStep()
                    .setX(0.1f)
                    .setRho(0.8)
                .endStep()
                .add();
        TwoWindingsTransformer twt3 = createTransformer(network, "s", b5, b6, "t56", 0.2, 1d);
        twt3.newRatioTapChanger()
                .setTapPosition(0)
                .setRegulationTerminal(twt3.getTerminal2())
                .setTargetV(93)
                .setRegulating(true)
                .setTargetDeadband(0.1)
                .setLoadTapChangingCapabilities(true)
                .beginStep()
                    .setX(0.1f)
                    .setRho(1.2)
                .endStep()
                .beginStep()
                    .setX(0.1f)
                    .setRho(1.0)
                .endStep()
                .beginStep()
                    .setX(0.1f)
                    .setRho(0.8)
                .endStep()
                .add();
        return network;
    }
}