HvdcNetworkFactory.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.HvdcAngleDroopActivePowerControlAdder;

/**
 * @author Ga��l Macherel {@literal <gael.macherel@artelys.com>}
 */
public class HvdcNetworkFactory extends AbstractLoadFlowNetworkFactory {

    /**
     * VSC test case.
     * <pre>
     * g1       ld2               ld3
     * |         |                 |
     * b1 ------- b2-cs2--------cs3-b3
     * l12          hvdc23
     * </pre>
     *
 * @author Geoffroy Jamgotchian {@literal <geoffroy.jamgotchian at rte-france.com>}
     */
    public static Network createVsc() {
        Network network = Network.create("vsc", "test");

        Substation s1 = network.newSubstation()
                               .setId("S1")
                               .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(102.56)
           .setTargetV(390)
           .setMinP(0)
           .setMaxP(500)
           .setVoltageRegulatorOn(true)
            .add();

        Substation s2 = network.newSubstation()
                               .setId("S2")
                               .add();
        VoltageLevel vl2 = s2.newVoltageLevel()
                             .setId("vl2")
                             .setNominalV(400)
                             .setTopologyKind(TopologyKind.BUS_BREAKER)
                             .add();
        vl2.getBusBreakerView().newBus()
           .setId("b2")
           .add();
        vl2.newLoad()
           .setId("ld2")
           .setConnectableBus("b2")
           .setBus("b2")
           .setP0(50)
           .setQ0(10)
            .add();
        vl2.newVscConverterStation()
           .setId("cs2")
           .setConnectableBus("b2")
           .setBus("b2")
           .setVoltageRegulatorOn(true)
           .setVoltageSetpoint(385)
           .setReactivePowerSetpoint(100)
           .setLossFactor(1.1f)
            .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();
        vl3.newLoad()
           .setId("ld3")
           .setConnectableBus("b3")
           .setBus("b3")
           .setP0(50)
           .setQ0(10)
            .add();
        vl3.newVscConverterStation()
           .setId("cs3")
           .setConnectableBus("b3")
           .setBus("b3")
           .setVoltageRegulatorOn(true)
           .setVoltageSetpoint(383)
           .setReactivePowerSetpoint(100)
           .setLossFactor(0.2f)
            .add();

        network.newLine()
               .setId("l12")
               .setBus1("b1")
               .setBus2("b2")
               .setR(1)
               .setX(3)
               .add();

        network.newHvdcLine()
               .setId("hvdc23")
               .setConverterStationId1("cs2")
               .setConverterStationId2("cs3")
               .setNominalV(400)
               .setR(0.1)
               .setActivePowerSetpoint(50)
               .setConvertersMode(HvdcLine.ConvertersMode.SIDE_1_RECTIFIER_SIDE_2_INVERTER)
               .setMaxP(500)
               .add();

        return network;
    }

    /**
     * LCC test case.
     * <pre>
     *  g1       ld2               ld3
     *  |         |                 |
     * b1 ------- b2-cs2--------cs3-b3
     *      l12          hvdc23     |
     *                              g3
     * </pre>
     *
 * @author Anne Tilloy {@literal <anne.tilloy at rte-france.com>}
     */
    public static Network createLcc() {
        Network network = Network.create("lcc", "test");

        Substation s1 = network.newSubstation()
                               .setId("S1")
                               .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(102.56)
           .setTargetV(390)
           .setMinP(0)
           .setMaxP(500)
           .setVoltageRegulatorOn(true)
            .add();

        Substation s2 = network.newSubstation()
                               .setId("S2")
                               .add();
        VoltageLevel vl2 = s2.newVoltageLevel()
                             .setId("vl2")
                             .setNominalV(400)
                             .setTopologyKind(TopologyKind.BUS_BREAKER)
                             .add();
        vl2.getBusBreakerView().newBus()
           .setId("b2")
           .add();
        vl2.newLoad()
           .setId("ld2")
           .setConnectableBus("b2")
           .setBus("b2")
           .setP0(50)
           .setQ0(10)
            .add();
        vl2.newLccConverterStation()
           .setId("cs2")
           .setConnectableBus("b2")
           .setBus("b2")
           .setPowerFactor(0.8f)
           .setLossFactor(0.1f)
            .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();
        vl3.newLoad()
           .setId("ld3")
           .setConnectableBus("b3")
           .setBus("b3")
           .setP0(50)
           .setQ0(10)
            .add();
        vl3.newLccConverterStation()
           .setId("cs3")
           .setConnectableBus("b3")
           .setBus("b3")
           .setPowerFactor(0.8f)
           .setLossFactor(1.1f)
            .add();
        vl3.newGenerator()
           .setId("g3")
           .setConnectableBus("b3")
           .setBus("b3")
           .setTargetP(102.56)
           .setTargetV(380)
           .setMinP(0)
           .setMaxP(500)
           .setVoltageRegulatorOn(true)
            .add();

        network.newLine()
               .setId("l12")
               .setBus1("b1")
               .setBus2("b2")
               .setR(1)
               .setX(3)
               .add();

        network.newHvdcLine()
               .setId("hvdc23")
               .setConverterStationId1("cs2")
               .setConverterStationId2("cs3")
               .setNominalV(400)
               .setR(0.1)
               .setActivePowerSetpoint(50)
               .setConvertersMode(HvdcLine.ConvertersMode.SIDE_1_RECTIFIER_SIDE_2_INVERTER)
               .setMaxP(500)
               .add();

        return network;
    }

    /**
     * LCC test case with bigger components
     * <pre>
     *                       g1       ld2               ld3
     *                       |         |                 |
     * lots of buses ------ b1 ------- b2-cs2--------cs3-b3 ----- b4 ----- b5 ------ b6
     *                           l12          hvdc23     |         (transfo)
     *                                                  g3
     * </pre>
     *
 * @author Gael Macherel {@literal <gael.macherel at artelys.com>}
     */
    public static Network createLccWithBiggerComponents() {
        Network network = createLcc();
        Bus b1 = network.getBusBreakerView().getBus("b1");
        Bus b3 = network.getBusBreakerView().getBus("b3");
        Bus b4 = createBus(network, "test_s", "b4", 400);
        Bus b5 = createBus(network, "test_s", "b5", 400);
        Bus b6 = createBus(network, "test_s", "b6", 400);
        createLine(network, b3, b4, "l34", 0.1f);
        createLine(network, b5, b6, "l56", 0.1f);
        TwoWindingsTransformer twt = createTransformer(network, "test_s", b4, b5, "l45", 0.1f, 1d);
        twt.newPhaseTapChanger().setTapPosition(0)
            .beginStep()
            .setX(0.1f)
            .setAlpha(1)
            .endStep()
            .add();

        createGenerator(b6, "g6", 1);

        for (int i = 0; i < 10; i++) {
            Bus b = createBus(network, "test_s", "additionnalbus_" + i, 400);
            createLine(network, b1, b, "additionnalline_" + i, 0.1f);
        }

        return network;
    }

    public static Network createLccWithBiggerComponentsAndAdditionalLine() {
        Network network = createLccWithBiggerComponents();

        createLine(network, network.getBusBreakerView().getBus("additionnalbus_0"), network.getBusBreakerView().getBus("additionnalbus_1"), "additionnalline_01", 0.1f);
        return network;
    }

    public static Network createLccWithBiggerComponentsAndAdditionalLine2() {
        Network network = createLccWithBiggerComponents();

        createBus(network, "test_s", "additionnalbus_10", 400);
        createLine(network, network.getBusBreakerView().getBus("additionnalbus_0"), network.getBusBreakerView().getBus("additionnalbus_10"), "additionnalline_10", 0.1f);
        return network;
    }

    /**
     * <pre>
     * b1 ----------+
     * |            |
     * b2 -------- b3 - cs3
     *              hvdc34
     * b5 -------- b4 - cs4
     * |            |
     * b6 ----------+
     * </pre>
     *
     * @return network
     */
    public static Network createTwoCcLinkedByAHvdc() {
        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);

        HvdcConverterStation cs3 = createLcc(b3, "cs3");
        HvdcConverterStation cs4 = createLcc(b4, "cs4");
        createHvdcLine(network, "hvdc34", cs3, cs4, 400, 0.1, 2);

        createLine(network, b4, b5, "l45", 0.1f);
        createLine(network, b4, b6, "l46", 0.1f);
        createLine(network, b5, b6, "l56", 0.1f);
        return network;
    }

    /**
     * <pre>
     *      Gen - b1 -- l12 -- b2 -- HVDC23-- b3 -- l34 -- b4 - Load
     *            |            |                           |
     *            |          s2 (open)                     |
     *            |            |                           |
     *            |---l12Bis --                            |
     *            |                                        |
     *            ---------------------l14------------------
     * </pre>
     * @return
     */
    public static Network createHvdcLinkedByTwoLinesAndSwitch() {
        Network network = Network.create("test", "code");
        Bus b1 = createBus(network, "b1", 400);
        Bus b2 = createBus(network, "b2", 400);
        Bus b2Bis = b2.getVoltageLevel().getBusBreakerView().newBus().setId("b2Bis").add();
        Bus b3 = createBus(network, "b3", 400);
        Bus b4 = createBus(network, "b4", 400);
        createGenerator(b1, "g1", 400, 400);
        createLine(network, b1, b2, "l12", 0.1f);
        createLine(network, b1, b2Bis, "l12Bis", 0.1f);
        createSwitch(network, b2, b2Bis, "s2").setOpen(true);
        VscConverterStation cs2 = createVsc(b2, "cs2", 400, 0);
        VscConverterStation cs3 = createVsc(b3, "cs3", 400, 0);
        createHvdcLine(network, "hvdc23", cs2, cs3, 400, 0.1, 200)
                .setConvertersMode(HvdcLine.ConvertersMode.SIDE_1_RECTIFIER_SIDE_2_INVERTER)
                .newExtension(HvdcAngleDroopActivePowerControlAdder.class)
                .withDroop(180)
                .withP0(200)
                .withEnabled(true)
                .add();
        createLine(network, b3, b4, "l34", 0.1f);
        createLine(network, b1, b4, "l14", 0.1f);
        createLoad(b4, "l4", 300, 0);
        return network;
    }

    /**
     * <pre>
     * b1 ----------+
     * |            |
     * b2 -------- b3 - cs3
     *              hvdc34
     * b5 -------- b4 - cs4
     * |            |
     * b6 ----------+
     * </pre>
     *
     * @return network
     */
    public static Network createTwoCcLinkedByAHvdcVsc() {
        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);

        HvdcConverterStation cs3 = createVsc(b3, "cs3", 1.2d, 0d);
        HvdcConverterStation cs4 = createVsc(b4, "cs4", 1.2d, 0d);
        createHvdcLine(network, "hvdc34", cs3, cs4, 400, 0.1, 2);

        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 -----------
     * |            |
     * b2 ---twt-- b3 - cs3
     *              hvdc34
     * b5 -------- b4 - cs4
     * |            |
     * b6 ----------+
     * </pre>
     *
     * @return network
     */
    public static Network createTwoCcLinkedByAHvdcWithATransformer() {
        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");
        Bus b5 = createBus(network, "b5");
        Bus b6 = createBus(network, "b6");
        createLine(network, b1, b2, "l12", 0.1f);
        createLine(network, b1, b3, "l13", 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();
        HvdcConverterStation cs3 = createLcc(b3, "cs3");
        HvdcConverterStation cs4 = createLcc(b4, "cs4");
        createHvdcLine(network, "hvdc34", cs3, cs4, 400, 0.1, 2);

        createLine(network, b4, b5, "l45", 0.1f);
        createLine(network, b4, b6, "l46", 0.1f);
        createLine(network, b5, b6, "l56", 0.1f);
        return network;
    }

    public static Network createTwoCcLinkedByAHvdcVscWithGenerators() {
        Network network = createTwoCcLinkedByAHvdcVsc();
        Bus b1 = network.getBusBreakerView().getBus("b1");
        Bus b2 = network.getBusBreakerView().getBus("b2");
        Bus b6 = network.getBusBreakerView().getBus("b6");
        createGenerator(b1, "g1", 1);
        createGenerator(b2, "g2", 1);
        createLoad(b2, "d2", 4);
        createGenerator(b6, "g6", 1);
        return network;
    }

    public static Network createTwoCcLinkedByAHvdcWithGenerators() {
        Network network = createTwoCcLinkedByAHvdc();
        Bus b1 = network.getBusBreakerView().getBus("b1");
        Bus b2 = network.getBusBreakerView().getBus("b2");
        Bus b6 = network.getBusBreakerView().getBus("b6");
        createGenerator(b1, "g1", 1);
        createGenerator(b2, "g2", 1);
        createLoad(b2, "d2", 4);
        createGenerator(b6, "g6", 1);
        return network;
    }

    /**
     * <pre>
     * b1 ----------+
     * |            |
     * b2 -------- b3 - cs3
     * |           hvdc34
     * b5 -------- b4 - cs4
     * |            |
     * b6 ----------+
     * </pre>
     *
     * @return network
     */
    public static Network createNetworkWithGenerators() {
        Network network = createTwoCcLinkedByAHvdcWithGenerators();
        Bus b2 = network.getBusBreakerView().getBus("b2");
        Bus b5 = network.getBusBreakerView().getBus("b5");
        createLine(network, b2, b5, "l25", 0.1f);
        createGenerator(b5, "g5", 1);
        return network;
    }

    public static Network createNetworkWithGenerators2() {
        Network network = createTwoCcLinkedByAHvdcVscWithGenerators();
        Bus b2 = network.getBusBreakerView().getBus("b2");
        Bus b5 = network.getBusBreakerView().getBus("b5");
        createLine(network, b2, b5, "l25", 0.1f);
        createGenerator(b5, "g5", 1);
        return network;
    }

    public static Network createNetworkWithTransformer() {
        Network network = createTwoCcLinkedByAHvdcWithATransformer();
        Bus b1 = network.getBusBreakerView().getBus("b1");
        Bus b2 = network.getBusBreakerView().getBus("b2");
        Bus b6 = network.getBusBreakerView().getBus("b6");
        createGenerator(b1, "g1", 1);
        createGenerator(b2, "g2", 1);
        createLoad(b2, "d2", 4);
        createGenerator(b6, "g6", 1);
        return network;
    }

    public static Network createLinkedNetworkWithTransformer() {
        Network network = createNetworkWithTransformer();
        Bus b2 = network.getBusBreakerView().getBus("b2");
        Bus b5 = network.getBusBreakerView().getBus("b5");
        createLine(network, b2, b5, "l25", 0.1f);
        createGenerator(b5, "g5", 1);
        return network;
    }

    /**
     * <pre>
     * b1 ----------+
     * |            |
     * b2 -------- b3 - cs3
     *              hvdc34
     * b5 -------- b4 - cs4
     * |            |
     * b6 ----------+
     * </pre>
     *
     * @return network
     */
    public static Network createWithHvdcInAcEmulation() {
        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, b2, b5, "l25", 0.05f);

        HvdcConverterStation cs3 = createVsc(b3, "cs3", 1.2d, 0d);
        HvdcConverterStation cs4 = createVsc(b4, "cs4", 1.2d, 0d);
        createHvdcLine(network, "hvdc34", cs3, cs4, 400, 0.1, 2);

        createLine(network, b4, b5, "l45", 0.1f);
        createLine(network, b4, b6, "l46", 0.1f);
        createLine(network, b5, b6, "l56", 0.1f);

        createGenerator(b1, "g1", 1);
        createGenerator(b5, "g5", 1);
        network.getGenerator("g1").setMaxP(5);
        network.getGenerator("g5").setMaxP(5);

        createLoad(b2, "d2", 4);
        return network;
    }

    /**
     *       ------------l12--------------
     *      |                            |
     * g1--b1-----vsc1--hvdc12--vsc2----b2--g2
     *     |                             |
     *     l1                            l2
     *
     *     Initially, g1 is on. g2 is off.
     * @return
     */
    public static Network createHvdcInAcEmulationInSymetricNetwork() {
        Network network = Network.create("test", "code");
        Bus b1 = createBus(network, "b1");
        Bus b2 = createBus(network, "b2");
        createGenerator(b1, "g1", 5).setMaxP(10);
        createGenerator(b2, "g2", 0).setMaxP(10);
        createLoad(b1, "l1", 3);
        createLoad(b2, "l2", 3);
        createLine(network, b1, b2, "l12", 0.1f);

        HvdcConverterStation cs1 = createVsc(b1, "cs1", 1.2d, 0d);
        HvdcConverterStation cs2 = createVsc(b2, "cs2", 1.2d, 0d);
        createHvdcLine(network, "hvdc12", cs1, cs2, 400, 0.1, 2)
                .newExtension(HvdcAngleDroopActivePowerControlAdder.class)
                .withDroop(1)
                .withP0(0)
                .withEnabled(true)
                .add();
        return network;
    }

    /**
     * <pre>
     *     g1 - b1 -- l12 -- b2 -- hvdc23 -- b3 -- l34 -- b4 - l4
     *          |            |                            |
     *          |           s2 (open)                     |
     *          |            |                            |
     *          |---l12Bis --                             |
     *          |                                         |
     *          ---------------------l14-------------------
     * </pre>
     * @return
     */
    public static Network createHvdcLinkedByTwoLinesAndSwitch(HvdcConverterStation.HvdcType type) {
        Network network = Network.create("test", "code");
        Bus b1 = createBus(network, "b1", 400);
        Bus b2 = createBus(network, "b2", 400);
        Bus b2Bis = b2.getVoltageLevel().getBusBreakerView().newBus().setId("b2Bis").add();
        Bus b3 = createBus(network, "b3", 400);
        Bus b4 = createBus(network, "b4", 400);
        createGenerator(b1, "g1", 400, 400);
        createLine(network, b1, b2, "l12", 0.1f);
        createLine(network, b1, b2Bis, "l12Bis", 0.1f);
        createSwitch(network, b2, b2Bis, "s2").setOpen(true);
        HvdcConverterStation cs2 = switch (type) {
            case LCC -> createLcc(b2, "cs2");
            case VSC -> createVsc(b2, "cs2", 400, 0);
        };
        HvdcConverterStation cs3 = switch (type) {
            case LCC -> createLcc(b3, "cs3");
            case VSC -> createVsc(b3, "cs3", 400, 0);
        };
        createHvdcLine(network, "hvdc23", cs2, cs3, 400, 0.1, 200)
                .newExtension(HvdcAngleDroopActivePowerControlAdder.class)
                .withDroop(180)
                .withP0(200)
                .withEnabled(true)
                .add();
        createLine(network, b3, b4, "l34", 0.1f);
        createLine(network, b1, b4, "l14", 0.1f);
        createLoad(b4, "l4", 300, 0);
        return network;
    }

    /**
     * <pre>
     *     g1 - b1           b2 -- hvdc23 -- b3 -- l34 -- b4 - l4
     *          |            |               |             |
     *          |           s2 (closed)      s3 (closed)   l45
     *          |            |               |            |
     *          C|---l12------                b7--l7       b5---l56-b6-g6
     *
     * </pre>
     * @return
     */
    public static Network createHvdcAndSwitch(HvdcConverterStation.HvdcType type) {
        Network network = Network.create("test", "code");
        Bus b1 = createBus(network, "b1", 400);
        Bus b2 = createBus(network, "b2", 400);
        Bus b2Bis = b2.getVoltageLevel().getBusBreakerView().newBus().setId("b2Bis").add();
        Bus b3 = createBus(network, "b3", 400);
        Bus b4 = createBus(network, "b4", 400);
        Bus b5 = createBus(network, "b5", 400);
        Bus b6 = createBus(network, "b6", 400);
        Bus b7 = b3.getVoltageLevel().getBusBreakerView().newBus().setId("b7").add();

        createGenerator(b1, "g1", 400, 400);
        createLine(network, b1, b2, "l12", 0.1f);
        createLine(network, b1, b2Bis, "l12Bis", 0.1f);
        createSwitch(network, b2, b2Bis, "s2").setOpen(false);
        createSwitch(network, b3, b7, "s3").setOpen(false);
        HvdcConverterStation cs2 = switch (type) {
            case LCC -> createLcc(b2, "cs2");
            case VSC -> createVsc(b2, "cs2", 400, 0);
        };
        HvdcConverterStation cs3 = switch (type) {
            case LCC -> createLcc(b3, "cs3");
            case VSC -> createVsc(b3, "cs3", 400, 0);
        };
        createHvdcLine(network, "hvdc23", cs2, cs3, 400, 0.1, 200)
                .newExtension(HvdcAngleDroopActivePowerControlAdder.class)
                .withDroop(180)
                .withP0(200)
                .withEnabled(true)
                .add();
        createLine(network, b3, b4, "l34", 0.1f);
        createLine(network, b4, b5, "l45", 0.1f);
        createLine(network, b5, b6, "l56", 0.1f);
        createLoad(b4, "l4", 300, 0);
        createLoad(b7, "l7", 50, 0);
        createGenerator(b6, "g6", 400, 400);
        return network;
    }

    /**
     * <pre>
     * b1 ----------+
     * |            |
     * b2 -------- b3 - cs3
     *              hvdc34
     *             b4 - g4
     * </pre>
     *
     * @return network
     */
    public static Network createWithHvdcAndGenerator() {
        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");
        createLine(network, b1, b2, "l12", 0.1f);
        createLine(network, b1, b3, "l13", 0.1f);
        createLine(network, b2, b3, "l23", 0.1f);
        HvdcConverterStation cs3 = createVsc(b3, "cs3", 1.2d, 0d);
        HvdcConverterStation cs4 = createVsc(b4, "cs4", 1.2d, 0d);
        createHvdcLine(network, "hvdc34", cs3, cs4, 400, 0.1, 2);
        createGenerator(b1, "g1", 1);
        createGenerator(b4, "g4", 2);
        network.getGenerator("g1").setMaxP(5);
        network.getGenerator("g4").setMaxP(5);
        createLoad(b2, "d2", 4);
        return network;
    }
}