FictitiousSwitchFactory.java

/**
 * Copyright (c) 2017, 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.iidm.network.test;

import com.powsybl.iidm.network.*;
import java.time.ZonedDateTime;

import java.util.Objects;

/**
 * @author Mathieu Bague {@literal <mathieu.bague at rte-france.com>}
 */
public final class FictitiousSwitchFactory {

    private FictitiousSwitchFactory() {
    }

    public static Network create() {
        return create(NetworkFactory.findDefault());
    }

    public static Network create(NetworkFactory networkFactory) {
        Objects.requireNonNull(networkFactory);

        Network network = networkFactory.createNetwork("fictitious", "test");
        network.setCaseDate(ZonedDateTime.parse("2017-06-25T17:43:00.000+01:00"));
        network.setForecastDistance(0);

        Substation s = network.newSubstation()
                .setId("A")
                .setCountry(Country.FR)
                .add();
        VoltageLevel vlC = s.newVoltageLevel()
                .setId("C")
                .setNominalV(225.0)
                .setLowVoltageLimit(0.0)
                .setTopologyKind(TopologyKind.NODE_BREAKER)
                .add();
        BusbarSection busbarSectionD = vlC.getNodeBreakerView().newBusbarSection()
                .setId("D")
                .setName("E")
                .setNode(0)
                .add();
        createSwitch(vlC, "F", "G", SwitchKind.DISCONNECTOR, false, false, true, 0, 1);
        createSwitch(vlC, "H", "I", SwitchKind.DISCONNECTOR, false, false, true, 0, 3);
        createSwitch(vlC, "J", "K", SwitchKind.BREAKER, true, false, true, 1, 2);
        createSwitch(vlC, "L", "M", SwitchKind.BREAKER, true, false, true, 3, 4);

        VoltageLevel vlN = s.newVoltageLevel()
                .setId("N")
                .setNominalV(225.0)
                .setLowVoltageLimit(220.0)
                .setHighVoltageLimit(245.00002)
                .setTopologyKind(TopologyKind.NODE_BREAKER)
                .add();
        BusbarSection busbarSectionO = vlN.getNodeBreakerView().newBusbarSection()
                .setId("O")
                .setName("E")
                .setNode(0)
                .add();
        BusbarSection busbarSectionP = vlN.getNodeBreakerView().newBusbarSection()
                .setId("P")
                .setName("Q")
                .setNode(1)
                .add();
        createSwitch(vlN, "R", "S", SwitchKind.DISCONNECTOR, false, true, false, 0, 19);
        createSwitch(vlN, "T", "U", SwitchKind.DISCONNECTOR, false, true, false, 0, 17);
        createSwitch(vlN, "V", "W", SwitchKind.DISCONNECTOR, false, true, false, 0, 21);
        createSwitch(vlN, "X", "Y", SwitchKind.DISCONNECTOR, false, true, false, 0, 11);
        createSwitch(vlN, "Z", "AA", SwitchKind.DISCONNECTOR, false, true, false, 0, 13);
        createSwitch(vlN, "AB", "AC", SwitchKind.DISCONNECTOR, false, false, false, 0, 15);
        createSwitch(vlN, "AD", "AE", SwitchKind.DISCONNECTOR, false, true, false, 0, 8);
        createSwitch(vlN, "AF", "AG", SwitchKind.DISCONNECTOR, false, true, true, 0, 2);
        createSwitch(vlN, "AH", "AI", SwitchKind.DISCONNECTOR, false, false, false, 7, 0);
        createSwitch(vlN, "AJ", "AK", SwitchKind.DISCONNECTOR, false, false, false, 1, 6);
        createSwitch(vlN, "AL", "AM", SwitchKind.DISCONNECTOR, false, false, false, 1, 19);
        createSwitch(vlN, "AN", "AO", SwitchKind.DISCONNECTOR, false, false, false, 1, 17);
        createSwitch(vlN, "AP", "AQ", SwitchKind.DISCONNECTOR, false, false, false, 1, 21);
        createSwitch(vlN, "AR", "AS", SwitchKind.DISCONNECTOR, false, true, false, 1, 11);
        createSwitch(vlN, "AT", "AU", SwitchKind.DISCONNECTOR, false, true, false, 1, 13);
        createSwitch(vlN, "AV", "AW", SwitchKind.DISCONNECTOR, false, true, false, 1, 15);
        createSwitch(vlN, "AX", "AY", SwitchKind.DISCONNECTOR, false, false, false, 1, 8);
        createSwitch(vlN, "AZ", "BA", SwitchKind.DISCONNECTOR, false, true, true, 1, 2);
        createSwitch(vlN, "BB", "BC", SwitchKind.BREAKER, true, true, true, 2, 3);
        createSwitch(vlN, "BD", "BE", SwitchKind.BREAKER, true, false, false, 3, 4);
        createSwitch(vlN, "BF", "BG", SwitchKind.DISCONNECTOR, false, false, false, 3, 5);
        createSwitch(vlN, "BH", "BI", SwitchKind.DISCONNECTOR, false, true, false, 9, 3);
        createSwitch(vlN, "BJ", "BK", SwitchKind.BREAKER, true, false, false, 6, 7);
        createSwitch(vlN, "BL", "BM", SwitchKind.BREAKER, true, false, false, 8, 9);
        createSwitch(vlN, "BN", "BO", SwitchKind.DISCONNECTOR, false, false, false, 9, 10);
        createSwitch(vlN, "BP", "BQ", SwitchKind.BREAKER, true, true, false, 11, 12);
        createSwitch(vlN, "BR", "BS", SwitchKind.BREAKER, true, true, false, 13, 14);
        createSwitch(vlN, "BT", "BU", SwitchKind.BREAKER, true, false, false, 15, 16);
        createSwitch(vlN, "BV", "BW", SwitchKind.BREAKER, true, false, false, 17, 18);
        createSwitch(vlN, "BX", "BY", SwitchKind.BREAKER, true, false, false, 19, 20);
        createSwitch(vlN, "BZ", "CA", SwitchKind.BREAKER, true, false, false, 21, 22);

        Generator generatorCB = vlN.newGenerator()
                .setId("CB")
                .setEnergySource(EnergySource.HYDRO)
                .setMinP(0.0)
                .setMaxP(70.0)
                .setVoltageRegulatorOn(false)
                .setTargetP(0.0)
                .setTargetV(0.0)
                .setTargetQ(0.0)
                .setNode(12)
                .add();
        generatorCB.newReactiveCapabilityCurve()
                .beginPoint()
                    .setP(0.0)
                    .setMinQ(-59.3)
                    .setMaxQ(60.0)
                .endPoint()
                .beginPoint()
                    .setP(70.0)
                    .setMinQ(-54.55)
                    .setMaxQ(46.25)
                .endPoint()
                .add();

        Generator generatorCC = vlN.newGenerator()
                .setId("CC")
                .setEnergySource(EnergySource.HYDRO)
                .setMinP(0.0)
                .setMaxP(80.0)
                .setVoltageRegulatorOn(false)
                .setTargetP(0.0)
                .setTargetV(0.0)
                .setTargetQ(0.0)
                .setNode(14)
                .add();
        generatorCC.newReactiveCapabilityCurve()
                .beginPoint()
                    .setP(0.0)
                    .setMinQ(-56.8)
                    .setMaxQ(57.4)
                .endPoint()
                .beginPoint()
                    .setP(80.0)
                    .setMinQ(-53.514)
                    .setMaxQ(36.4)
                .endPoint()
                .add();

        Generator generatorCD = vlN.newGenerator()
                .setId("CD")
                .setEnergySource(EnergySource.HYDRO)
                .setMinP(0.0)
                .setMaxP(35.0)
                .setVoltageRegulatorOn(true)
                .setTargetP(21.789589)
                .setTargetV(236.44736)
                .setTargetQ(-20.701546)
                .setNode(16)
                .add();
        generatorCD.getTerminal()
                .setP(-21.789589)
                .setQ(20.693394);
        generatorCD.newReactiveCapabilityCurve()
                .beginPoint()
                    .setP(0.0)
                    .setMinQ(-20.6)
                    .setMaxQ(18.1)
                .endPoint()
                .beginPoint()
                    .setP(35.0)
                    .setMinQ(-21.725)
                    .setMaxQ(6.3500004)
                .endPoint()
                .add();

        Load loadCE = vlN.newLoad()
                .setId("CE")
                .setLoadType(LoadType.UNDEFINED)
                .setP0(-72.18689)
                .setQ0(50.168945)
                .setNode(4)
                .add();
        loadCE.getTerminal()
                .setP(-72.18689)
                .setQ(50.168945);

        Load loadCF = vlN.newLoad()
                .setId("CF")
                .setLoadType(LoadType.UNDEFINED)
                .setP0(8.455854)
                .setQ0(-23.695925)
                .setNode(18)
                .add();
        loadCF.getTerminal()
                .setP(8.455854)
                .setQ(-23.695925);

        Load loadCG = vlN.newLoad()
                .setId("CG")
                .setLoadType(LoadType.UNDEFINED)
                .setP0(90.39911)
                .setQ0(-51.96869)
                .setNode(20)
                .add();
        loadCG.getTerminal()
                .setP(90.39911)
                .setQ(-51.96869);

        Load loadCH = vlN.newLoad()
                .setId("CH")
                .setLoadType(LoadType.UNDEFINED)
                .setP0(-5.102249)
                .setQ0(4.9081216)
                .setNode(22)
                .add();
        loadCH.getTerminal()
                .setP(-5.102249)
                .setQ(4.9081216);

        TwoWindingsTransformer twtCI = s.newTwoWindingsTransformer()
                .setId("CI")
                .setR(2.0)
                .setX(14.745)
                .setG(0.0)
                .setB(3.2E-5)
                .setRatedU1(225.0)
                .setRatedU2(225.0)
                .setNode1(2)
                .setVoltageLevel1("C")
                .setNode2(10)
                .setVoltageLevel2("N")
                .add();
        twtCI.newCurrentLimits1()
                .setPermanentLimit(931.0)
                .add();
        twtCI.newCurrentLimits2()
                .setPermanentLimit(931.0)
                .add();
        twtCI.newPhaseTapChanger()
                .setLowTapPosition(0)
                .setTapPosition(22)
                .setRegulationMode(PhaseTapChanger.RegulationMode.CURRENT_LIMITER)
                .setRegulationValue(930.6667)
                .setRegulating(false)
                .setRegulationTerminal(twtCI.getTerminal(TwoSides.ONE))
                .beginStep().setR(39.78473).setX(39.784725).setG(0.0).setB(0.0).setRho(1.0).setAlpha(-42.8).endStep()
                .beginStep().setR(31.720245).setX(31.720242).setG(0.0).setB(0.0).setRho(1.0).setAlpha(-40.18).endStep()
                .beginStep().setR(23.655737).setX(23.655735).setG(0.0).setB(0.0).setRho(1.0).setAlpha(-37.54).endStep()
                .beginStep().setR(16.263271).setX(16.263268).setG(0.0).setB(0.0).setRho(1.0).setAlpha(-34.9).endStep()
                .beginStep().setR(9.542847).setX(9.542842).setG(0.0).setB(0.0).setRho(1.0).setAlpha(-32.26).endStep()
                .beginStep().setR(3.4944773).setX(3.4944773).setG(0.0).setB(0.0).setRho(1.0).setAlpha(-29.6).endStep()
                .beginStep().setR(-1.8818557).setX(-1.8818527).setG(0.0).setB(0.0).setRho(1.0).setAlpha(-26.94).endStep()
                .beginStep().setR(-7.258195).setX(-7.2581954).setG(0.0).setB(0.0).setRho(1.0).setAlpha(-24.26).endStep()
                .beginStep().setR(-11.962485).setX(-11.962484).setG(0.0).setB(0.0).setRho(1.0).setAlpha(-21.58).endStep()
                .beginStep().setR(-15.994745).setX(-15.994745).setG(0.0).setB(0.0).setRho(1.0).setAlpha(-18.9).endStep()
                .beginStep().setR(-19.354952).setX(-19.354952).setG(0.0).setB(0.0).setRho(1.0).setAlpha(-16.22).endStep()
                .beginStep().setR(-22.043127).setX(-22.043129).setG(0.0).setB(0.0).setRho(1.0).setAlpha(-13.52).endStep()
                .beginStep().setR(-24.73129).setX(-24.731287).setG(0.0).setB(0.0).setRho(1.0).setAlpha(-10.82).endStep()
                .beginStep().setR(-26.747417).setX(-26.747417).setG(0.0).setB(0.0).setRho(1.0).setAlpha(-8.12).endStep()
                .beginStep().setR(-28.091503).setX(-28.091503).setG(0.0).setB(0.0).setRho(1.0).setAlpha(-5.42).endStep()
                .beginStep().setR(-28.763538).setX(-28.763536).setG(0.0).setB(0.0).setRho(1.0).setAlpha(-2.7).endStep()
                .beginStep().setR(-28.763538).setX(-28.763536).setG(0.0).setB(0.0).setRho(1.0).setAlpha(0.0).endStep()
                .beginStep().setR(-28.763538).setX(-28.763536).setG(0.0).setB(0.0).setRho(1.0).setAlpha(2.7).endStep()
                .beginStep().setR(-28.091503).setX(-28.091503).setG(0.0).setB(0.0).setRho(1.0).setAlpha(5.42).endStep()
                .beginStep().setR(-26.747417).setX(-26.747417).setG(0.0).setB(0.0).setRho(1.0).setAlpha(8.12).endStep()
                .beginStep().setR(-24.73129).setX(-24.731287).setG(0.0).setB(0.0).setRho(1.0).setAlpha(10.82).endStep()
                .beginStep().setR(-22.043127).setX(-22.043129).setG(0.0).setB(0.0).setRho(1.0).setAlpha(13.52).endStep()
                .beginStep().setR(-19.354952).setX(-19.354952).setG(0.0).setB(0.0).setRho(1.0).setAlpha(16.22).endStep()
                .beginStep().setR(-15.994745).setX(-15.994745).setG(0.0).setB(0.0).setRho(1.0).setAlpha(18.9).endStep()
                .beginStep().setR(-11.962485).setX(-11.962484).setG(0.0).setB(0.0).setRho(1.0).setAlpha(21.58).endStep()
                .beginStep().setR(-7.258195).setX(-7.2581954).setG(0.0).setB(0.0).setRho(1.0).setAlpha(24.26).endStep()
                .beginStep().setR(-1.8818557).setX(-1.8818527).setG(0.0).setB(0.0).setRho(1.0).setAlpha(26.94).endStep()
                .beginStep().setR(3.4944773).setX(3.4944773).setG(0.0).setB(0.0).setRho(1.0).setAlpha(29.6).endStep()
                .beginStep().setR(9.542847).setX(9.542842).setG(0.0).setB(0.0).setRho(1.0).setAlpha(32.26).endStep()
                .beginStep().setR(16.263271).setX(16.263268).setG(0.0).setB(0.0).setRho(1.0).setAlpha(34.9).endStep()
                .beginStep().setR(23.655737).setX(23.655735).setG(0.0).setB(0.0).setRho(1.0).setAlpha(37.54).endStep()
                .beginStep().setR(31.720245).setX(31.720242).setG(0.0).setB(0.0).setRho(1.0).setAlpha(40.18).endStep()
                .beginStep().setR(39.78473).setX(39.784725).setG(0.0).setB(0.0).setRho(1.0).setAlpha(42.8).endStep()
                .add();

        Line lineCJ = network.newLine()
                .setId("CJ")
                .setR(0.009999999)
                .setX(0.100000024)
                .setG1(0.0)
                .setB1(0.0)
                .setG2(0.0)
                .setB2(0.0)
                .setNode1(4)
                .setVoltageLevel1("C")
                .setNode2(5)
                .setVoltageLevel2("N")
                .add();
        lineCJ.newCurrentLimits1()
                .setPermanentLimit(931.0)
                .add();
        lineCJ.newCurrentLimits2()
                .setPermanentLimit(931.0)
                .beginTemporaryLimit()
                    .setName("IST")
                    .setValue(1640.0)
                    .setFictitious(true)
                    .setAcceptableDuration(Integer.MAX_VALUE)
                .endTemporaryLimit()
                .beginTemporaryLimit()
                    .setName("IT1")
                    .setValue(Double.MAX_VALUE)
                    .setAcceptableDuration(60)
                .endTemporaryLimit()
                .add();

        busbarSectionD.getTerminal().getBusView().getBus()
                .setV(234.40912)
                .setAngle(0.0);
        busbarSectionO.getTerminal().getBusView().getBus()
                .setV(236.44736)
                .setAngle(15250391);
        busbarSectionP.getTerminal().getBusView().getBus()
                .setV(236.44736)
                .setAngle(15.250391);

        return network;
    }

    private static void createSwitch(VoltageLevel vl, String id, String name, SwitchKind kind, boolean retained, boolean open, boolean fictitious, int node1, int node2) {
        vl.getNodeBreakerView().newSwitch()
                .setId(id)
                .setName(name)
                .setKind(kind)
                .setRetained(retained)
                .setOpen(open)
                .setFictitious(fictitious)
                .setNode1(node1)
                .setNode2(node2)
                .add();
    }

}