ConnectedComponentNetworkFactory.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.Bus;
import com.powsybl.iidm.network.HvdcLine;
import com.powsybl.iidm.network.Network;
import com.powsybl.iidm.network.TwoWindingsTransformer;

/**
 * @author Gael Macherel {@literal <gael.macherel at artelys.com>}
 */
public class ConnectedComponentNetworkFactory extends AbstractLoadFlowNetworkFactory {

    /**
     * <pre>
     * b1 ----------+
     * |            |
     * b2 -------- b3
     *              |
     * b5 -------- b4
     * |            |
     * b6 ----------+
     * </pre>
     *
     * @return network
     */
    public static Network createTwoCcLinkedByASingleLine() {
        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");
        Bus b5 = createBus(network, "b5");
        Bus b6 = createBus(network, "b6");
        createLine(network, b1, b2, "l12", 0.1f);
        createLine(network, b1, b3, "l13", 0.1f);
        createLine(network, b2, b3, "l23", 0.1f);
        createLine(network, b3, b4, "l34", 0.1f);
        createLine(network, b4, b5, "l45", 0.1f);
        createLine(network, b4, b6, "l46", 0.1f);
        createLine(network, b5, b6, "l56", 0.1f);
        return network;
    }

    /**
     * <pre>
     * b1 (d1) ----------+
     * |                 |
     * b2 (g2) -------- b3 (d3)
     * |                 |
     * b4 (d4) -------- b5 (d5)
     * |                 |
     * b6 (g6) ----------+
     * </pre>
     *
     * @return network
     */
    public static Network createTwoCcLinkedByTwoLines() {
        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");
        Bus b5 = createBus(network, "b5");
        Bus b6 = createBus(network, "b6");
        createLine(network, b1, b2, "l12", 0.1f);
        createLine(network, b1, b3, "l13", 0.1f);
        createLine(network, b2, b3, "l23", 0.1f);
        createLine(network, b3, b5, "l35", 0.1f);
        createLine(network, b2, b4, "l24", 0.1f);
        createLine(network, b4, b5, "l45", 0.1f);
        createLine(network, b4, b6, "l46", 0.1f);
        createLine(network, b5, b6, "l56", 0.1f);

        createGenerator(b2, "g2", 3);
        createGenerator(b6, "g6", 2);
        createLoad(b1, "d1", 1);
        createLoad(b3, "d3", 1);
        createLoad(b4, "d4", 1);
        createLoad(b5, "d5", 2);
        return network;
    }

    /**
     * <pre>
     * b1 (d1) ----------+
     * |                 |
     * b2 (g2) -------- b3 (d3)
     * |                 |
     * b4 (d4) -------- b5 (d5)
     * |                 |
     * b6 (g6) ----------+
     * </pre>
     *
     * @return network
     */
    public static Network createTwoCcLinkedByTwoLinesWithAdditionnalGens() {
        Network network = createTwoCcLinkedByTwoLines();
        Bus b3 = network.getBusBreakerView().getBus("b3");
        createGenerator(b3, "g3", 2);
        createLoad(b3, "d3_bis", 2);
        return network;
    }

    /**
     * <pre>
     * b1 (d1) ----------+
     * |                 |
     * b2 (g2) -------- b3 (d3)
     *                   |
     * b5 (d5) -------- b4 (d4)
     * |                 |
     * PTC               |
     * |                 |
     * b6 (g6) ----------+
     * </pre>
     *
     * @return network
     */
    public static Network createTwoCcWithATransformerLinkedByASingleLine() {
        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");
        Bus b5 = createBus(network, "test_s", "b5");
        Bus b6 = createBus(network, "test_s", "b6");
        createLine(network, b1, b2, "l12", 0.1f);
        createLine(network, b1, b3, "l13", 0.1f);
        createLine(network, b2, b3, "l23", 0.1f);
        createLine(network, b3, b4, "l34", 0.1f);
        createLine(network, b4, b5, "l45", 0.1f);
        createLine(network, b4, b6, "l46", 0.1f);
        TwoWindingsTransformer twt = createTransformer(network, "test_s", b5, b6, "l56", 0.1f, 1d);
        twt.newPhaseTapChanger().setTapPosition(0)
           .beginStep()
           .setX(0.1f)
           .setAlpha(1)
           .endStep()
           .add();
        createGenerator(b2, "g2", 3);
        createGenerator(b6, "g6", 2);
        createLoad(b1, "d1", 1);
        createLoad(b3, "d3", 1);
        createLoad(b4, "d4", 1);
        createLoad(b5, "d5", 2);
        return network;
    }

    /**
     * <pre>
     * b1 (d1) ----------+
     * |                 |
     * b2 (g2) -------- b3 (d3)
     *                   |
     *                   PTC
     *                   |
     * b5 (d5) -------- b4 (d4)
     * |                 |
     * b6 (g6) ----------+
     * </pre>
     *
     * @return network
     */
    public static Network createTwoCcLinkedByATransformer() {
        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");
        Bus b5 = createBus(network, "b5");
        Bus b6 = createBus(network, "b6");
        createLine(network, b1, b2, "l12", 0.1f);
        createLine(network, b1, b3, "l13", 0.1f);
        createLine(network, b2, b3, "l23", 0.1f);
        createLine(network, b4, b5, "l45", 0.1f);
        createLine(network, b4, b6, "l46", 0.1f);
        createLine(network, b5, b6, "l56", 0.1f);
        TwoWindingsTransformer twt = createTransformer(network, "test_s", b3, b4, "l34", 0.1f, 1d);
        twt.newPhaseTapChanger().setTapPosition(0)
            .beginStep()
            .setX(0.1f)
            .setAlpha(1)
            .endStep()
            .add();
        createGenerator(b2, "g2", 3);
        createGenerator(b6, "g6", 2);
        createLoad(b1, "d1", 1);
        createLoad(b3, "d3", 1);
        createLoad(b4, "d4", 1);
        createLoad(b5, "d5", 2);
        return network;
    }

    /**
     * <pre>
     * b1 (d1) ----------+
     * |                 |
     * b2 (g2) -------- b3 (g3)
     *                   |
     * b5 (d5) -------- b4
     * |                 |
     * b6 (d6) ----------+
     * </pre>
     *
     * @return network
     */
    public static Network createTwoComponentWithGeneratorOnOneSide() {
        Network network = createTwoCcLinkedByASingleLine();
        Bus b2 = network.getBusBreakerView().getBus("b2");
        Bus b6 = network.getBusBreakerView().getBus("b6");
        Bus b1 = network.getBusBreakerView().getBus("b1");
        Bus b5 = network.getBusBreakerView().getBus("b5");
        Bus b3 = network.getBusBreakerView().getBus("b3");
        Bus b4 = network.getBusBreakerView().getBus("b4");
        createGenerator(b2, "g2", 3);
        createGenerator(b3, "g3", 2);
        createLoad(b1, "d1", 2);
        createLoad(b5, "d5", 2);
        createLoad(b6, "d6", 1);
        return network;
    }

    /**
     * <pre>
     * b1 (d1) ----------+
     * |                 |
     * b2 (g2) -------- b3 (d3)
     *                   |
     * b5 (d5) -------- b4 (d4)
     * |                 |
     * b6 (g6) ----------+
     * </pre>
     *
     * @return network
     */
    public static Network createTwoComponentWithGeneratorAndLoad() {
        Network network = createTwoCcLinkedByASingleLine();
        Bus b2 = network.getBusBreakerView().getBus("b2");
        Bus b6 = network.getBusBreakerView().getBus("b6");
        Bus b1 = network.getBusBreakerView().getBus("b1");
        Bus b5 = network.getBusBreakerView().getBus("b5");
        Bus b3 = network.getBusBreakerView().getBus("b3");
        Bus b4 = network.getBusBreakerView().getBus("b4");
        createGenerator(b2, "g2", 3);
        createGenerator(b6, "g6", 2);
        createLoad(b1, "d1", 1);
        createLoad(b3, "d3", 1);
        createLoad(b4, "d4", 1);
        createLoad(b5, "d5", 2);
        return network;
    }

    /**
     * <pre>
     * b1 (d1) ----------+                               b6 (g6) ----------+
     * |                 |                                |                |
     * b2 (g2) -------- b3 (d3) -------- b4 (d4) -------- b5 (d5) -------- b7 (d7)
     *                                    |
     *                                   b8 (d8) --------- b9 (d9)
     *                                    |                 |
     *                                   b10 (g10) ---------+
     * </pre>
     *
     * @return network
     */
    public static Network createThreeCcLinkedByASingleBus() {
        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");
        Bus b5 = createBus(network, "b5");
        Bus b6 = createBus(network, "b6");
        Bus b7 = createBus(network, "b7");
        Bus b8 = createBus(network, "b8");
        Bus b9 = createBus(network, "b9");
        Bus b10 = createBus(network, "b10");
        createLine(network, b1, b2, "l12", 0.1f);
        createLine(network, b1, b3, "l13", 0.1f);
        createLine(network, b2, b3, "l23", 0.1f);
        createLine(network, b3, b4, "l34", 0.1f);
        createLine(network, b4, b5, "l45", 0.1f);
        createLine(network, b5, b6, "l56", 0.1f);
        createLine(network, b5, b7, "l57", 0.1f);
        createLine(network, b6, b7, "l67", 0.1f);
        createLine(network, b4, b8, "l48", 0.1f);
        createLine(network, b8, b9, "l89", 0.1f);
        createLine(network, b8, b10, "l810", 0.1f);
        createLine(network, b9, b10, "l910", 0.1f);

        createGenerator(b2, "g2", 3);
        createGenerator(b6, "g6", 2);
        createGenerator(b10, "g10", 4);
        createLoad(b1, "d1", 1);
        createLoad(b3, "d3", 1);
        createLoad(b4, "d4", 1);
        createLoad(b5, "d5", 2);
        createLoad(b7, "d7", 2);
        createLoad(b8, "d8", 1);
        createLoad(b9, "d9", 1);

        return network;
    }

    public static Network createThreeCcLinkedByASingleBusWithInconsistentVoltages() {
        Network network = createThreeCcLinkedByASingleBus();
        Bus b2 = network.getBusBreakerView().getBus("b2");
        createGenerator(b2, "g2_bis", 0, 2);
        Bus b3 = network.getBusBreakerView().getBus("b3");
        Bus b3Bis = createBus(network, "b3_s", "b3_bis", 1);

        var t2wt = createTransformer(network, "b3_s", b3, b3Bis, "l35", 0.1f, 1d);
        t2wt.newRatioTapChanger()
            .beginStep()
                .setRho(1)
            .endStep()
            .setTapPosition(0)
            .setLoadTapChangingCapabilities(true)
            .setRegulating(true)
            .setTargetV(2)
            .setTargetDeadband(0)
            .setRegulationTerminal(t2wt.getTerminal1())
            .add();
        return network;
    }

    /**
     * <pre>
     * b1 (d1) ----------+                               b6 (g6) ---PTC----+
     * |                 |                                |                |
     * b2 (g2) -------- b3 (d3) -------- b4 (d4) -------- b5 (d5) -------- b7 (d7)
     *                                    |
     *                                   b8 (d8) --------- b9 (d9)
     *                                    |                 |
     *                                   b10 (g10) ---------+
     * </pre>
     *
     * @return network
     */
    public static Network createThreeCcLinkedByASingleBusWithTransformer() {
        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");
        Bus b5 = createBus(network, "b5");
        Bus b6 = createBus(network, "test_s", "b6");
        Bus b7 = createBus(network, "test_s", "b7");
        Bus b8 = createBus(network, "b8");
        Bus b9 = createBus(network, "b9");
        Bus b10 = createBus(network, "b10");
        createLine(network, b1, b2, "l12", 0.1f);
        createLine(network, b1, b3, "l13", 0.1f);
        createLine(network, b2, b3, "l23", 0.1f);
        createLine(network, b3, b4, "l34", 0.1f);
        createLine(network, b4, b5, "l45", 0.1f);
        createLine(network, b5, b6, "l56", 0.1f);
        createLine(network, b5, b7, "l57", 0.1f);
        TwoWindingsTransformer twt = createTransformer(network, "test_s", b6, b7, "l67", 0.1f, 1d);
        twt.newPhaseTapChanger().setTapPosition(0)
            .beginStep()
            .setX(0.1f)
            .setAlpha(1)
            .endStep()
            .add();
        createLine(network, b4, b8, "l48", 0.1f);
        createLine(network, b8, b9, "l89", 0.1f);
        createLine(network, b8, b10, "l810", 0.1f);
        createLine(network, b9, b10, "l910", 0.1f);

        createGenerator(b2, "g2", 3);
        createGenerator(b6, "g6", 4);
        createGenerator(b10, "g10", 2);
        createLoad(b1, "d1", 1);
        createLoad(b3, "d3", 1);
        createLoad(b4, "d4", 1);
        createLoad(b5, "d5", 2);
        createLoad(b7, "d7", 2);
        createLoad(b8, "d8", 1);
        createLoad(b9, "d9", 1);

        return network;
    }

    /**
     * <pre>
     * b1 (d1) ----------+
     * |                 |
     * b2 (g2) -------- b3 (d3)
     *                   |
     *                  b4 (d4)
     *                   |
     * b6 (g6) ------   b5 (d5)
     * |                 |
     * b7 (d7) ------ ---+
     * </pre>
     *
     * @return network
     */
    public static Network createTwoConnectedComponentsLinkedByASerieOfTwoBranches() {
        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");
        Bus b5 = createBus(network, "b5");
        Bus b6 = createBus(network, "b6");
        Bus b7 = createBus(network, "b7");
        createLine(network, b1, b2, "l12", 0.1f);
        createLine(network, b1, b3, "l13", 0.1f);
        createLine(network, b2, b3, "l23", 0.1f);
        createLine(network, b3, b4, "l34", 0.1f);
        createLine(network, b4, b5, "l45", 0.1f);
        createLine(network, b5, b6, "l56", 0.1f);
        createLine(network, b5, b7, "l57", 0.1f);
        createLine(network, b6, b7, "l67", 0.1f);

        createGenerator(b2, "g2", 3);
        createGenerator(b6, "g6", 3);
        createLoad(b1, "d1", 1);
        createLoad(b3, "d3", 1);
        createLoad(b4, "d4", 1);
        createLoad(b5, "d5", 2);
        createLoad(b7, "d7", 1);

        return network;
    }

    /**
     * <pre>
     * b1 (d1) ----------+                +-------------- b6 (g6)
     * |                 |                |                |
     * b2 (g2) -------- b3 (d3) -------- b4 (d4) -------- b5 (d5)
     *                                    |
     *                                   b7 (d7) --------- b9 (g9)
     *                                    |                 |
     *                                   b8 (d8) -----------+
     * </pre>
     *
     * @return network
     */
    public static Network createThreeCc() {
        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");
        Bus b5 = createBus(network, "b5");
        Bus b6 = createBus(network, "b6");
        Bus b7 = createBus(network, "b7");
        Bus b8 = createBus(network, "b8");
        Bus b9 = createBus(network, "b9");
        createLine(network, b1, b2, "l12", 0.1f);
        createLine(network, b1, b3, "l13", 0.1f);
        createLine(network, b2, b3, "l23", 0.1f);
        createLine(network, b3, b4, "l34", 0.1f);
        createLine(network, b4, b5, "l45", 0.1f);
        createLine(network, b4, b6, "l46", 0.1f);
        createLine(network, b4, b7, "l47", 0.1f);
        createLine(network, b5, b6, "l56", 0.1f);
        createLine(network, b7, b8, "l78", 0.1f);
        createLine(network, b7, b9, "l79", 0.1f);
        createLine(network, b8, b9, "l89", 0.1f);

        createGenerator(b2, "g2", 3);
        createGenerator(b6, "g6", 2);
        createGenerator(b9, "g9", 2);
        createLoad(b1, "d1", 1);
        createLoad(b3, "d3", 1);
        createLoad(b4, "d4", 2);
        createLoad(b5, "d5", 2);
        createLoad(b7, "d7", 1);
        createLoad(b8, "d8", 2);

        return network;
    }

    /**
     * <pre>
     * b1 (d1) ----------+                 +-------------- b6 (g6)
     * |                 |                 |                |
     * b2 (g2) -------- b3 (d3) --------  b4 (d4) -------- b5 (d5)
     * |                                                    |
     * +--------------------------------- b7 (d7) -------- b8 (d8)
     *                                     |                 |
     *                                    b9 (g9) -----------+
     * </pre>
     * @return network
     */
    public static Network createThreeCircularCc() {
        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");
        Bus b5 = createBus(network, "b5");
        Bus b6 = createBus(network, "b6");
        Bus b7 = createBus(network, "b7");
        Bus b8 = createBus(network, "b8");
        Bus b9 = createBus(network, "b9");
        createLine(network, b1, b2, "l12", 0.1f);
        createLine(network, b1, b3, "l13", 0.1f);
        createLine(network, b2, b3, "l23", 0.1f);
        createLine(network, b2, b7, "l27", 0.1f);
        createLine(network, b3, b4, "l34", 0.1f);
        createLine(network, b4, b5, "l45", 0.1f);
        createLine(network, b4, b6, "l46", 0.1f);
        createLine(network, b5, b6, "l56", 0.1f);
        createLine(network, b5, b8, "l58", 0.1f);
        createLine(network, b7, b8, "l78", 0.1f);
        createLine(network, b7, b9, "l79", 0.1f);
        createLine(network, b8, b9, "l89", 0.1f);

        createGenerator(b2, "g2", 3);
        createGenerator(b6, "g6", 2);
        createGenerator(b9, "g9", 2);
        createLoad(b1, "d1", 1);
        createLoad(b3, "d3", 1);
        createLoad(b4, "d4", 2);
        createLoad(b5, "d5", 2);
        createLoad(b7, "d7", 1);
        createLoad(b8, "d8", 2);

        return network;
    }

    /**
     * <pre>
     * b6 (g6) ----------+                +-------------- b2 (g2) -------- b7 (d7) ----------+
     * |                 |                |                |                |                |
     * b5 (d5) -------- b4 (d4) -------- b1 (d1) -------- b3 (d3) -------- b9 (g9) -------- b8 (d8)
     *                                    |                                                  |
     *                                    +--------------------------------------------------+
     * </pre>
     * @return network
     */
    public static Network createAsymetricNetwork() {
        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");
        Bus b5 = createBus(network, "b5");
        Bus b6 = createBus(network, "b6");
        Bus b7 = createBus(network, "b7");
        Bus b8 = createBus(network, "b8");
        Bus b9 = createBus(network, "b9");
        createLine(network, b1, b2, "l12", 0.1f);
        createLine(network, b1, b3, "l13", 0.1f);
        createLine(network, b1, b4, "l14", 0.1f);
        createLine(network, b1, b8, "l18", 0.1f);
        createLine(network, b2, b3, "l23", 0.1f);
        createLine(network, b2, b7, "l27", 0.1f);
        createLine(network, b3, b9, "l39", 0.1f);
        createLine(network, b4, b5, "l45", 0.1f);
        createLine(network, b4, b6, "l46", 0.1f);
        createLine(network, b5, b6, "l56", 0.1f);
        createLine(network, b7, b8, "l78", 0.1f);
        createLine(network, b7, b9, "l79", 0.1f);
        createLine(network, b8, b9, "l89", 0.1f);

        createGenerator(b2, "g2", 3);
        createGenerator(b6, "g6", 2);
        createGenerator(b9, "g9", 2);
        createLoad(b1, "d1", 1);
        createLoad(b3, "d3", 1);
        createLoad(b4, "d4", 2);
        createLoad(b5, "d5", 2);
        createLoad(b7, "d7", 1);
        createLoad(b8, "d8", 2);

        return network;
    }

    /**
     * <pre>
     *                              b3 (g3) -------- b5 (d5)
     *                              /  | \             | \
     *                       -------   |   \           |  -------
     *                     /           |     \         |         \
     * b1 (g1+d1) ------ b2 (g2+d2)    |       \       |        b7 (g7) -------- b8 (d8)
     *                     \           |         \     |         /
     *                       -------   |           \   |  -------
     *                              \  |             \ | /
     *                              b4 (d4) -------- b6 (d6)
     * </pre>
     * @return network
     */
    public static Network createHighlyConnectedNetwork() {
        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");
        Bus b5 = createBus(network, "b5");
        Bus b6 = createBus(network, "b6");
        Bus b7 = createBus(network, "b7");
        Bus b8 = createBus(network, "b8");

        createLine(network, b1, b2, "l12", 0.1f);
        createLine(network, b2, b3, "l23", 0.1f);
        createLine(network, b2, b4, "l24", 0.1f);
        createLine(network, b3, b4, "l34", 0.1f);
        createLine(network, b3, b5, "l35", 0.1f);
        createLine(network, b3, b6, "l36", 0.1f);
        createLine(network, b4, b6, "l46", 0.1f);
        createLine(network, b5, b6, "l56", 0.1f);
        createLine(network, b5, b7, "l57", 0.1f);
        createLine(network, b6, b7, "l67", 0.1f);
        createLine(network, b7, b8, "l78", 0.1f);

        createGenerator(b1, "g1", 3);
        createGenerator(b2, "g2", 1);
        createGenerator(b3, "g3", 1);
        createGenerator(b7, "g7", 5);

        createLoad(b1, "d1", 1);
        createLoad(b2, "d2", 4);
        createLoad(b4, "d4", 1);
        createLoad(b5, "d5", 2);
        createLoad(b6, "d6", 1);
        createLoad(b8, "d8", 1);

        return network;
    }

    public static Network createHighlyConnectedSingleComponent() {
        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");
        Bus b5 = createBus(network, "b5");

        createLine(network, b1, b2, "l12", 0.1f);
        createLine(network, b1, b3, "l13", 0.1f);
        createLine(network, b2, b4, "l24", 0.1f);
        createLine(network, b3, b5, "l35", 0.1f);
        createLine(network, b4, b5, "l45", 0.1f);

        createGenerator(b1, "g1", 3);
        createGenerator(b2, "g2", 1);
        createGenerator(b3, "g3", 1);

        createLoad(b1, "d1", 1);
        createLoad(b2, "d2", 4);
        createLoad(b4, "d4", 1);
        createLoad(b5, "d5", 2);

        return network;
    }

    /**
     * <pre>
     * b1 ----------+
     * |            |
     * b2 -------- b3
     *
     * b5 -------- b4
     * |            |
     * b6 ----------+
     * </pre>
     *
     * @return network
     */
    public static Network createTwoUnconnectedCC() {
        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");
        Bus b5 = createBus(network, "b5");
        Bus b6 = createBus(network, "b6");
        createLine(network, b1, b2, "l12", 0.1f);
        createLine(network, b1, b3, "l13", 0.1f);
        createLine(network, b2, b3, "l23", 0.1f);
        createLine(network, b4, b5, "l45", 0.1f);
        createLine(network, b4, b6, "l46", 0.1f);
        createLine(network, b5, b6, "l56", 0.1f);

        createGenerator(b2, "g2", 3);
        createGenerator(b6, "g6", 2);
        createLoad(b1, "d1", 1);
        createLoad(b3, "d3", 1);
        createLoad(b4, "d4", 1);
        createLoad(b5, "d5", 2);

        return network;
    }

    public static Network createSubComp() {
        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");
        Bus b5 = createBus(network, "b5");

        createLine(network, b1, b2, "l12", 0.1f);
        createLine(network, b2, b3, "l13", 0.1f);
        createLine(network, b2, b4, "l24", 0.1f);
        createLine(network, b3, b5, "l35", 0.1f);
        createLine(network, b4, b5, "l45", 0.1f);

        createGenerator(b1, "g1", 3);
        createGenerator(b2, "g2", 1);
        createGenerator(b3, "g3", 1);

        createLoad(b1, "d1", 1);
        createLoad(b2, "d2", 4);
        createLoad(b4, "d4", 1);
        createLoad(b5, "d5", 2);

        return network;
    }

    /**
     * <pre>
     * b1 ----------+
     * |            |
     * b2 -------- b3
     *              |
     * b5 -------- b4
     * |            |
     * b6 ----------+
     * </pre>
     *
     * @return network
     */
    public static Network createTwoCcLinkedBySwitches() {
        Network network = Network.create("test", "code");
        Bus b1 = createBus(network, "b1");
        Bus b2 = createBus(network, "b2");
        Bus b3 = createBus(network, "b3");
        Bus b4 = createOtherBus(network, "b4", "b3_vl");
        Bus b5 = createOtherBus(network, "b5", "b2_vl");
        Bus b6 = createBus(network, "b6");
        createLine(network, b1, b2, "l12", 0.1f);
        createLine(network, b1, b3, "l13", 0.1f);
        createLine(network, b2, b3, "l23", 0.1f);
        createSwitch(network, b3, b4, "s34");
        createLine(network, b4, b5, "l45", 0.1f);
        createLine(network, b4, b6, "l46", 0.1f);
        createLine(network, b5, b6, "l56", 0.1f);
        createSwitch(network, b2, b5, "s25");
        createGenerator(b1, "g1", 3);
        createGenerator(b5, "g3", 1);
        createLoad(b4, "d4", 3);
        createLoad(b2, "d2", 1);
        return network;
    }

    public static Network createNoCc0Sc0() {
        // b01 -- b02 -- b03 -- b04 connected by DC lines
        // b11 -- b12 connected by AC line
        Network network = Network.create("test", "code");
        Bus b01 = createBus(network, "b01");
        Bus b02 = createBus(network, "b02");
        Bus b03 = createBus(network, "b03");
        Bus b04 = createBus(network, "b04");
        Bus b11 = createBus(network, "b11");
        Bus b12 = createBus(network, "b12");

        b01.getVoltageLevel()
                .newVscConverterStation()
                .setId("cs1-12")
                .setConnectableBus(b01.getId())
                .setBus(b01.getId())
                .setVoltageRegulatorOn(true)
                .setVoltageSetpoint(1.0)
                .setReactivePowerSetpoint(0.0)
                .setLossFactor(0.0f)
                .add();
        b02.getVoltageLevel()
                .newVscConverterStation()
                .setId("cs2-12")
                .setConnectableBus(b02.getId())
                .setBus(b02.getId())
                .setVoltageRegulatorOn(true)
                .setVoltageSetpoint(1.0)
                .setReactivePowerSetpoint(0.0)
                .setLossFactor(0.0f)
                .add();
        network.newHvdcLine()
                .setId("hvdc12")
                .setConverterStationId1("cs1-12")
                .setConverterStationId2("cs2-12")
                .setNominalV(1.)
                .setR(0.0)
                .setActivePowerSetpoint(1.)
                .setConvertersMode(HvdcLine.ConvertersMode.SIDE_1_RECTIFIER_SIDE_2_INVERTER)
                .setMaxP(5)
                .add();

        b02.getVoltageLevel()
                .newVscConverterStation()
                .setId("cs1-23")
                .setConnectableBus(b02.getId())
                .setBus(b02.getId())
                .setVoltageRegulatorOn(true)
                .setVoltageSetpoint(1.0)
                .setReactivePowerSetpoint(0.0)
                .setLossFactor(0.0f)
                .add();
        b03.getVoltageLevel()
                .newVscConverterStation()
                .setId("cs2-23")
                .setConnectableBus(b03.getId())
                .setBus(b03.getId())
                .setVoltageRegulatorOn(true)
                .setVoltageSetpoint(1.0)
                .setReactivePowerSetpoint(0.0)
                .setLossFactor(0.0f)
                .add();
        network.newHvdcLine()
                .setId("hvdc23")
                .setConverterStationId1("cs1-23")
                .setConverterStationId2("cs2-23")
                .setNominalV(1.)
                .setR(0.0)
                .setActivePowerSetpoint(2.)
                .setConvertersMode(HvdcLine.ConvertersMode.SIDE_1_RECTIFIER_SIDE_2_INVERTER)
                .setMaxP(5)
                .add();

        b03.getVoltageLevel()
                .newVscConverterStation()
                .setId("cs1-34")
                .setConnectableBus(b03.getId())
                .setBus(b03.getId())
                .setVoltageRegulatorOn(true)
                .setVoltageSetpoint(1.0)
                .setReactivePowerSetpoint(0.0)
                .setLossFactor(0.0f)
                .add();
        b04.getVoltageLevel()
                .newVscConverterStation()
                .setId("cs2-34")
                .setConnectableBus(b04.getId())
                .setBus(b04.getId())
                .setVoltageRegulatorOn(true)
                .setVoltageSetpoint(1.0)
                .setReactivePowerSetpoint(0.0)
                .setLossFactor(0.0f)
                .add();
        network.newHvdcLine()
                .setId("hvdc34")
                .setConverterStationId1("cs1-34")
                .setConverterStationId2("cs2-34")
                .setNominalV(1.)
                .setR(0.0)
                .setActivePowerSetpoint(3.)
                .setConvertersMode(HvdcLine.ConvertersMode.SIDE_1_RECTIFIER_SIDE_2_INVERTER)
                .setMaxP(5)
                .add();

        createGenerator(b01, "g01", 1);
        createGenerator(b02, "g02", 1);
        createGenerator(b03, "g03", 1);
        createGenerator(b04, "g04", 1);
        createLoad(b04, "l04", 4);
        createGenerator(b11, "g11", 2);
        createLoad(b12, "l11", 2);
        createLine(network, b11, b12, "l11-12", 0.1f);
        return network;
    }
}