AbstractLoadFlowNetworkFactory.java

/**
 * Copyright (c) 2019, 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.StaticVarCompensator.RegulationMode;

/**
 * @author Geoffroy Jamgotchian {@literal <geoffroy.jamgotchian at rte-france.com>}
 */
public abstract class AbstractLoadFlowNetworkFactory {

    protected static Bus createBus(Network network, String id) {
        return createBus(network, id, 1d);
    }

    protected static Bus createBus(Network network, String id, double nominalV) {
        return createBus(network, id + "_s", id, nominalV);
    }

    protected static Bus createBus(Network network, String substationId, String id) {
        return createBus(network, substationId, id, 1);
    }

    protected static Bus createBus(Network network, String substationId, String id, double nominalV) {
        Substation s = network.getSubstation(substationId);
        if (s == null) {
            s = network.newSubstation()
                    .setId(substationId)
                    .setCountry(Country.FR)
                    .add();
        }
        VoltageLevel vl = s.newVoltageLevel()
                .setId(id + "_vl")
                .setNominalV(nominalV)
                .setTopologyKind(TopologyKind.BUS_BREAKER)
                .add();
        return vl.getBusBreakerView().newBus()
                .setId(id)
                .add();
    }

    protected static Bus createOtherBus(Network network, String id, String voltageLevelId) {
        VoltageLevel vl = network.getVoltageLevel(voltageLevelId);
        return vl.getBusBreakerView().newBus()
                .setId(id)
                .add();
    }

    protected static Generator createGenerator(Bus b, String id, double p) {
        return createGenerator(b, id, p, 1);
    }

    protected static Generator createGenerator(Bus b, String id, double p, double v) {
        Generator g = b.getVoltageLevel()
                .newGenerator()
                .setId(id)
                .setBus(b.getId())
                .setConnectableBus(b.getId())
                .setEnergySource(EnergySource.OTHER)
                .setMinP(0)
                .setMaxP(2 * p)
                .setTargetP(p)
                .setTargetV(v)
                .setVoltageRegulatorOn(true)
                .add();
        g.getTerminal().setP(-p).setQ(0);
        return g;
    }

    protected static Generator createGenerator2(Bus b, String id, double p, double v) {
        Generator g = b.getVoltageLevel()
                .newGenerator()
                .setId(id)
                .setBus(b.getId())
                .setConnectableBus(b.getId())
                .setEnergySource(EnergySource.OTHER)
                .setMinP(0)
                .setMaxP(2 * p)
                .add();
        return g;
    }

    protected static Load createLoad(Bus b, String id, double p) {
        return createLoad(b, id, p, 0);
    }

    protected static Load createLoad(Bus b, String id, double p, double q) {
        Load l = b.getVoltageLevel().newLoad()
                .setId(id)
                .setBus(b.getId())
                .setConnectableBus(b.getId())
                .setP0(p)
                .setQ0(q)
                .add();
        l.getTerminal().setP(p).setQ(q);
        return l;
    }

    protected static Line createLine(Network network, Bus b1, Bus b2, String id, double x) {
        return createLine(network, b1, b2, id, 0, x);
    }

    protected static Line createLine(Network network, Bus b1, Bus b2, String id, double r, double x) {
        return network.newLine()
                .setId(id)
                .setBus1(b1.getId())
                .setConnectableBus1(b1.getId())
                .setBus2(b2.getId())
                .setConnectableBus2(b2.getId())
                .setR(r)
                .setX(x)
                .add();
    }

    protected static Switch createSwitch(Network network, Bus b1, Bus b2, String id) {
        return network.getVoltageLevel(b1.getVoltageLevel().getId()).getBusBreakerView().newSwitch()
                .setId(id)
                .setBus1(b1.getId())
                .setBus2(b2.getId())
                .setOpen(false)
                .add();
    }

    protected static TwoWindingsTransformer createTransformer(Network network, String substationId, Bus b1, Bus b2, String id, double x, double rho) {
        return createTransformer(network, substationId, b1, b2, id, 0, x, rho);
    }

    protected static TwoWindingsTransformer createTransformer(Network network, String substationId, Bus b1, Bus b2, String id, double r, double x, double rho) {
        return network.getSubstation(substationId).newTwoWindingsTransformer()
                .setId(id)
                .setBus1(b1.getId())
                .setConnectableBus1(b1.getId())
                .setBus2(b2.getId())
                .setConnectableBus2(b2.getId())
                .setRatedU1(b1.getVoltageLevel().getNominalV())
                .setRatedU2(b2.getVoltageLevel().getNominalV() * rho)
                .setR(r)
                .setX(x)
                .add();
    }

    protected static ThreeWindingsTransformer createThreeWindingsTransformer(Network network, String substationId,
        Bus b1, Bus b2, Bus b3, String id, double x1, double rho1, double x2, double rho2, double x3, double rho3) {
        return network.getSubstation(substationId).newThreeWindingsTransformer()
            .setId(id)
            .setRatedU0(1)
            .newLeg1()
            .setBus(b1.getId())
            .setConnectableBus(b1.getId())
            .setRatedU(rho1)
            .setR(0)
            .setX(x1)
            .add()
            .newLeg2()
            .setBus(b2.getId())
            .setConnectableBus(b2.getId())
            .setRatedU(rho2)
            .setR(0)
            .setX(x2)
            .add()
            .newLeg3()
            .setBus(b3.getId())
            .setConnectableBus(b3.getId())
            .setRatedU(rho3)
            .setR(0)
            .setX(x3)
            .add()
            .add();
    }

    protected static DanglingLine createDanglingLine(Bus b, String id, double x, double p0, double q0) {
        return b.getVoltageLevel().newDanglingLine()
            .setId(id)
            .setBus(b.getId())
            .setConnectableBus(b.getId())
            .setR(0)
            .setX(x)
            .setP0(p0)
            .setQ0(q0)
            .add();
    }

    protected static LccConverterStation createLcc(Bus b, String id) {
        return b.getVoltageLevel().newLccConverterStation()
            .setId(id)
            .setConnectableBus(b.getId())
            .setBus(b.getId())
            .setPowerFactor(0.8f)
            .setLossFactor(1.1f)
            .add();
    }

    protected static VscConverterStation createVsc(Bus b, String id, double voltageSetpoint, double reactivePowerSetpoint) {
        return b.getVoltageLevel().newVscConverterStation()
            .setId(id)
            .setConnectableBus(b.getId())
            .setBus(b.getId())
            .setVoltageRegulatorOn(true)
            .setVoltageSetpoint(voltageSetpoint)
            .setReactivePowerSetpoint(reactivePowerSetpoint)
            .setLossFactor(1.1f)
            .add();
    }

    protected static HvdcLine createHvdcLine(Network network, String id, HvdcConverterStation station1, HvdcConverterStation station2,
                                             double nominalV, double r, double activePowerSetpoint) {
        return network.newHvdcLine()
            .setId(id)
            .setConverterStationId1(station1.getId())
            .setConverterStationId2(station2.getId())
            .setNominalV(nominalV)
            .setR(r)
            .setActivePowerSetpoint(activePowerSetpoint)
            .setConvertersMode(HvdcLine.ConvertersMode.SIDE_1_INVERTER_SIDE_2_RECTIFIER)
            .setMaxP(2 * activePowerSetpoint)
            .add();
    }

    protected static ShuntCompensator createFixedShuntCompensator(Bus bus, String id, double gPerSection, double bPersection) {
        ShuntCompensator sh = bus.getVoltageLevel()
            .newShuntCompensator()
            .setId(id)
            .setBus(bus.getId())
            .setConnectableBus(bus.getId())
            .setSectionCount(1)
            .newLinearModel()
            .setGPerSection(gPerSection)
            .setBPerSection(bPersection)
            .setMaximumSectionCount(1)
            .add()
            .add();
        return sh;
    }

    protected static ShuntCompensator createShuntCompensator(Bus bus, String id, double g, double b, double v,
        boolean voltageControl) {
        ShuntCompensator sh = bus.getVoltageLevel()
            .newShuntCompensator()
            .setId(id)
            .setBus(bus.getId())
            .setConnectableBus(bus.getId())
            .setSectionCount(1)
            .newNonLinearModel()
            .beginSection()
            .setB(b)
            .setG(g)
            .endSection()
            .add()
            .add();
        sh.setTargetV(v)
            .setRegulatingTerminal(sh.getTerminal())
            .setTargetDeadband(0.0)
            .setVoltageRegulatorOn(voltageControl);
        return sh;
    }

    protected static StaticVarCompensator createStaticVarCompensator(Bus bus, String id, double qSetpoint,
        double vSetpoint, RegulationMode regulationMode) {
        StaticVarCompensator svc = bus.getVoltageLevel()
            .newStaticVarCompensator()
            .setId(id)
            .setBus(bus.getId())
            .setConnectableBus(bus.getId())
            .setBmin(-1.0)
            .setBmax(1.0)
            .setRegulationMode(RegulationMode.OFF)
            .add();
        svc.setRegulatingTerminal(svc.getTerminal())
            .setVoltageSetpoint(vSetpoint)
            .setReactivePowerSetpoint(qSetpoint)
            .setRegulationMode(regulationMode);

        return svc;
    }
}