ReactivePowerControlNetworkFactory.java

/**
 * Copyright (c) 2021, 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;

/**
 * @author Caio Luke {@literal <caio.luke at artelys.com>}
 */
public class ReactivePowerControlNetworkFactory extends AbstractLoadFlowNetworkFactory {

    /**
     * <p>Based on 4 bus test network:</p>
     *<pre>
     *      2pu                 2pu - 1pu
     *   1 =======           2 =======
     *      | | |               |   |
     *      | | +---------------+   |
     *      | |                     |
     *      | +-------------------+ |
     *      |                     | |
     *      |   +---------------+ | |
     *      |   |               | | |
     *   4 =======           3 =======
     *      1pu                 -4pu
     *</pre>
     */
    public static Network createWithGeneratorRemoteControl() {
        Network network = FourBusNetworkFactory.createBaseNetwork();
        Generator g1 = network.getGenerator("g1");
        Generator g4 = network.getGenerator("g4");
        Line l34 = network.getLine("l34");
        g1.setMaxP(10);
        g4.setMaxP(10);
        // disable voltage control on g4
        g4.setTargetQ(0.0).setVoltageRegulatorOn(false);
        // generator g4 regulates reactive power on line 4->3 (on side of g4)
        g4.newExtension(RemoteReactivePowerControlAdder.class)
                .withTargetQ(4.0)
                .withRegulatingTerminal(l34.getTerminal(TwoSides.TWO))
                .withEnabled(true)
                .add();
        return network;
    }

    public static Network createWithGeneratorRemoteControl2() {
        Network network = FourBusNetworkFactory.createBaseNetwork();
        Generator g1 = network.getGenerator("g1");
        Generator g4 = network.getGenerator("g4");
        Line l12 = network.getLine("l12");
        g1.setMaxP(10);
        g4.setMaxP(10);
        // disable voltage control on g4
        g4.setTargetQ(0.0).setVoltageRegulatorOn(false);
        // generator g4 regulates reactive power on line 1->2 in 2
        g4.newExtension(RemoteReactivePowerControlAdder.class)
                .withTargetQ(1.0)
                .withRegulatingTerminal(l12.getTerminal(TwoSides.TWO))
                .withEnabled(true)
                .add();
        return network;
    }

    public static Network createWithGeneratorsRemoteControlShared() {
        Network network = FourBusNetworkFactory.createWithReactiveControl2GeneratorsOnSameBusAnd1Extra();
        Generator g1 = network.getGenerator("g1");
        Generator g1Bis = network.getGenerator("g1Bis");
        Generator g4 = network.getGenerator("g4");
        g1.setMaxP(10);
        g1Bis.setMaxP(10);
        g4.setMaxP(10);
        return network;
    }

    public static Network create4BusNetworkWithRatioTapChanger() {
        Network network = Network.create("test", "code");
        Bus b1 = createBus(network, "b1");
        Bus b2 = createBus(network, "b2");
        Bus b3 = createBus(network, "test_s", "b3");
        Bus b4 = createBus(network, "test_s", "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);
        TwoWindingsTransformer twt = createTransformer(network, "test_s", b3, b4, "l34", 0.1f, 1d);
        twt.newRatioTapChanger()
                .beginStep()
                .setRho(0.8)
                .setR(0.1089)
                .setX(0.01089)
                .setG(0.8264462809917356)
                .setB(0.08264462809917356)
                .endStep()
                .beginStep()
                .setRho(0.9)
                .setR(0.121)
                .setX(0.0121)
                .setG(0.8264462809917356)
                .setB(0.08264462809917356)
                .endStep()
                .beginStep()
                .setRho(1.)
                .setR(0.1331)
                .setX(0.01331)
                .setG(0.9090909090909092)
                .setB(0.09090909090909092)
                .endStep()
                .beginStep()
                .setRho(1.1)
                .setR(0.1331)
                .setX(0.01331)
                .setG(0.9090909090909092)
                .setB(0.09090909090909092)
                .endStep()
                .setTapPosition(1)
                .setRegulationValue(0.)
                .setRegulationMode(RatioTapChanger.RegulationMode.REACTIVE_POWER)
                .add();
        createLine(network, b1, b3, "l13", 0.1f);

        return network;
    }
}