BoundaryFactory.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.*;

/**
 * @author Anne Tilloy {@literal <anne.tilloy at rte-france.com>}
 */
public class BoundaryFactory extends AbstractLoadFlowNetworkFactory {

    /**
     *  g1     dl1
     *  |       |
     *  b1 ---- b2
     *      l1
     */
    public static Network create() {
        Network network = Network.create("dl", "test");
        Substation s1 = network.newSubstation()
                .setId("S1")
                .add();
        Substation s2 = network.newSubstation()
                .setId("S2")
                .add();
        VoltageLevel vl1 = s1.newVoltageLevel()
                .setId("vl1")
                .setNominalV(400)
                .setTopologyKind(TopologyKind.BUS_BREAKER)
                .add();
        vl1.getBusBreakerView().newBus()
                .setId("b1")
                .add();
        vl1.newGenerator()
                .setId("g1")
                .setConnectableBus("b1")
                .setBus("b1")
                .setTargetP(101.3664)
                .setTargetV(390)
                .setMinP(0)
                .setMaxP(150)
                .setVoltageRegulatorOn(true)
                .add();
        VoltageLevel vl2 = s2.newVoltageLevel()
                .setId("vl2")
                .setNominalV(400)
                .setTopologyKind(TopologyKind.BUS_BREAKER)
                .add();
        vl2.getBusBreakerView().newBus()
                .setId("b2")
                .add();
        vl2.newDanglingLine()
                .setId("dl1")
                .setConnectableBus("b2")
                .setBus("b2")
                .setR(0.7)
                .setX(1)
                .setG(Math.pow(10, -6))
                .setB(3 * Math.pow(10, -6))
                .setP0(101)
                .setQ0(150)
                .newGeneration()
                .setTargetP(0)
                .setTargetQ(0)
                .setTargetV(390)
                .setVoltageRegulationOn(false)
                .add()
                .add();
        network.newLine()
                .setId("l1")
                .setBus1("b1")
                .setBus2("b2")
                .setR(1)
                .setX(3)
                .add();
        return network;
    }

    /**
     *  g1     dl1      load3
     *  |       |        |
     *  b1 ---- b2 ----- b3
     *      l1       l13
     */
    public static Network createWithLoad() {

        Network network = create();

        Substation s3 = network.newSubstation()
                .setId("S3")
                .add();
        VoltageLevel vl3 = s3.newVoltageLevel()
                .setId("vl3")
                .setNominalV(400)
                .setTopologyKind(TopologyKind.BUS_BREAKER)
                .add();
        vl3.getBusBreakerView().newBus()
                .setId("b3")
                .add();
        vl3.newLoad()
                .setId("load3")
                .setBus("b3")
                .setP0(10.0)
                .setQ0(5.0)
                .add();

        network.newLine()
                .setId("l13")
                .setBus1("b1")
                .setBus2("b3")
                .setR(10)
                .setX(3)
                .add();
        network.newLine()
                .setId("l32")
                .setBus1("b3")
                .setBus2("b2")
                .setR(10)
                .setX(10)
                .add();

        network.getDanglingLine("dl1").setP0(91);

        return network;
    }

    /**
     * g1 + load1                 g4 + load4
     *  |                          |
     *  b1 ----- b2 ----- b3 ----- b4
     *     l12      l23     l34
     */
    public static Network createWithXnode() {

        Network network = Network.create("xnode-network", "test");

        Substation s1 = network.newSubstation()
                .setId("S1")
                .add();
        VoltageLevel vl1 = s1.newVoltageLevel()
                .setId("vl1")
                .setNominalV(380)
                .setTopologyKind(TopologyKind.BUS_BREAKER)
                .add();
        vl1.getBusBreakerView().newBus()
                .setId("b1")
                .add();
        vl1.newLoad()
                .setId("load1")
                .setBus("b1")
                .setP0(50.0)
                .setQ0(50.0)
                .add();
        vl1.newGenerator()
                .setId("g1")
                .setConnectableBus("b1")
                .setBus("b1")
                .setTargetP(100)
                .setTargetV(400)
                .setMinP(0)
                .setMaxP(150)
                .setVoltageRegulatorOn(true)
                .add();

        Substation s2 = network.newSubstation()
                .setId("S2")
                .add();
        VoltageLevel vl2 = s2.newVoltageLevel()
                .setId("vl2")
                .setNominalV(380)
                .setTopologyKind(TopologyKind.BUS_BREAKER)
                .add();
        vl2.getBusBreakerView().newBus()
                .setId("xnode")
                .add();

        Substation s3 = network.newSubstation()
                .setId("S3")
                .add();
        VoltageLevel vl3 = s3.newVoltageLevel()
                .setId("vl3")
                .setNominalV(400)
                .setTopologyKind(TopologyKind.BUS_BREAKER)
                .add();
        vl3.getBusBreakerView().newBus()
                .setId("b3")
                .add();

        Substation s4 = network.newSubstation()
                .setId("S4")
                .add();
        VoltageLevel vl4 = s4.newVoltageLevel()
                .setId("vl4")
                .setNominalV(400)
                .setTopologyKind(TopologyKind.BUS_BREAKER)
                .add();
        vl4.getBusBreakerView().newBus()
                .setId("b4")
                .add();
        vl4.newLoad()
                .setId("load4")
                .setBus("b4")
                .setP0(40.0)
                .setQ0(40.0)
                .add();
        vl4.newGenerator()
                .setId("g4")
                .setConnectableBus("b4")
                .setBus("b4")
                .setTargetP(20)
                .setTargetV(400)
                .setMinP(0)
                .setMaxP(150)
                .setVoltageRegulatorOn(true)
                .add();

        network.newLine()
                .setId("l12")
                .setBus1("b1")
                .setBus2("xnode")
                .setR(0.0)
                .setX(0.1)
                .add();
        network.newLine()
                .setId("l23")
                .setBus1("xnode")
                .setBus2("b3")
                .setR(0)
                .setX(0.08)
                .add();
        network.newLine()
                .setId("l34")
                .setBus1("b3")
                .setBus2("b4")
                .setR(0)
                .setX(1.0)
                .add();

        return network;
    }

    /**
     * g1 + load1                    g4 + load4
     *  |                               |
     *  b1 ----- (xnode) ----- b3 ----- b4
     *           t13               l34
     */
    public static Network createWithTieLine() {

        Network network = Network.create("xnode-network", "test");

        Substation s1 = network.newSubstation()
                .setId("S1")
                .add();
        VoltageLevel vl1 = s1.newVoltageLevel()
                .setId("vl1")
                .setNominalV(380)
                .setTopologyKind(TopologyKind.BUS_BREAKER)
                .add();
        vl1.getBusBreakerView().newBus()
                .setId("b1")
                .add();
        vl1.newLoad()
                .setId("load1")
                .setBus("b1")
                .setP0(50.0)
                .setQ0(50.0)
                .add();
        vl1.newGenerator()
                .setId("g1")
                .setConnectableBus("b1")
                .setBus("b1")
                .setTargetP(100)
                .setTargetV(400)
                .setMinP(0)
                .setMaxP(150)
                .setVoltageRegulatorOn(true)
                .add();

        Substation s3 = network.newSubstation()
                .setId("S3")
                .add();
        VoltageLevel vl3 = s3.newVoltageLevel()
                .setId("vl3")
                .setNominalV(400)
                .setTopologyKind(TopologyKind.BUS_BREAKER)
                .add();
        vl3.getBusBreakerView().newBus()
                .setId("b3")
                .add();

        Substation s4 = network.newSubstation()
                .setId("S4")
                .add();
        VoltageLevel vl4 = s4.newVoltageLevel()
                .setId("vl4")
                .setNominalV(400)
                .setTopologyKind(TopologyKind.BUS_BREAKER)
                .add();
        vl4.getBusBreakerView().newBus()
                .setId("b4")
                .add();
        vl4.newLoad()
                .setId("load4")
                .setBus("b4")
                .setP0(40.0)
                .setQ0(40.0)
                .add();
        vl4.newGenerator()
                .setId("g4")
                .setConnectableBus("b4")
                .setBus("b4")
                .setTargetP(20)
                .setTargetV(400)
                .setMinP(0)
                .setMaxP(150)
                .setVoltageRegulatorOn(true)
                .add();

        DanglingLine dl1 = vl1.newDanglingLine()
                .setBus("b1")
                .setId("h1")
                .setR(0.0)
                .setX(0.1)
                .setPairingKey("xnode")
                .setP0(0.0)
                .setQ0(0.0)
                .add();
        DanglingLine dl3 = vl3.newDanglingLine()
                .setBus("b3")
                .setId("h2")
                .setR(0.0)
                .setX(0.08)
                .setPairingKey("xnode")
                .setP0(0.0)
                .setQ0(0.0)
                .add();

        network.newTieLine()
                .setId("t12")
                .setDanglingLine1(dl1.getId())
                .setDanglingLine2(dl3.getId())
                .add();

        network.newLine()
                .setId("l34")
                .setBus1("b3")
                .setBus2("b4")
                .setR(0)
                .setX(1.0)
                .add();

        return network;
    }

    public static Network createWithTwoTieLines() {

        Network network = createWithTieLine();

        DanglingLine dl1 = network.getVoltageLevel("vl1").newDanglingLine()
                .setBus("b1")
                .setId("h1bis")
                .setR(0.0)
                .setX(0.1)
                .setPairingKey("xnode2")
                .setP0(0.0)
                .setQ0(0.0)
                .add();
        DanglingLine dl3 = network.getVoltageLevel("vl3").newDanglingLine()
                .setBus("b3")
                .setId("h2bis")
                .setR(0.0)
                .setX(0.08)
                .setPairingKey("xnode2")
                .setP0(0.0)
                .setQ0(0.0)
                .add();

        network.newTieLine()
                .setId("t12bis")
                .setDanglingLine1(dl1.getId())
                .setDanglingLine2(dl3.getId())
                .add();

        return network;
    }

    /**
     *   b1 --- b2
     *   |
     *   g1
     */
    public static Network createWithoutLoads() {
        Network network = Network.create("dl", "test");
        Substation s1 = network.newSubstation()
                .setId("S1")
                .add();
        Substation s2 = network.newSubstation()
                .setId("S2")
                .add();

        VoltageLevel vl1 = s1.newVoltageLevel()
                .setId("vl1")
                .setNominalV(225)
                .setTopologyKind(TopologyKind.BUS_BREAKER)
                .add();
        vl1.getBusBreakerView().newBus()
                .setId("b1")
                .add();
        var g1 = vl1.newGenerator()
                .setId("g1")
                .setConnectableBus("b1")
                .setBus("b1")
                .setTargetP(1E-6)
                .setTargetV(224.18)
                .setMinP(0)
                .setMaxP(245)
                .setVoltageRegulatorOn(true)
                .add();
        g1.newMinMaxReactiveLimits().setMinQ(-80).setMaxQ(86).add();

        VoltageLevel vl2 = s2.newVoltageLevel()
                .setId("vl2")
                .setNominalV(225)
                .setTopologyKind(TopologyKind.BUS_BREAKER)
                .add();
        vl2.getBusBreakerView().newBus()
                .setId("b2")
                .add();
        network.newLine()
                .setId("l1")
                .setBus1("b1")
                .setBus2("b2")
                .setR(1.316)
                .setX(6.865)
                .setB1(0.0017)
                .setB2(0.0017)
                .add();

        return network;
    }
}