IidmUtils.java

/**
 * Copyright (c) 2022, 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/.
 */
package com.powsybl.nad.utils.iidm;

import com.powsybl.iidm.network.*;
import com.powsybl.nad.model.BranchEdge;
import com.powsybl.nad.model.Edge;
import com.powsybl.nad.model.ThreeWtEdge;

import java.util.Objects;

/**
 *
 * @author Florian Dupuy {@literal <florian.dupuy at rte-france.com>}
 * @author Luma Zamarre��o {@literal <zamarrenolm at aia.es>}
 */

public final class IidmUtils {

    private IidmUtils() {
    }

    public static boolean isDisconnected(Network network, BranchEdge edge, BranchEdge.Side side) {
        if (edge.getType().equals(BranchEdge.DANGLING_LINE_EDGE) && side.equals(BranchEdge.Side.TWO)) {
            return isDisconnected(network, edge, BranchEdge.Side.ONE);
        }
        Terminal terminal = IidmUtils.getTerminalFromEdge(network, edge, side);
        return terminal == null || !terminal.isConnected();
    }

    public static Terminal getTerminalFromEdge(Network network, BranchEdge edge, BranchEdge.Side side) {
        if (edge.getType().equals(BranchEdge.HVDC_LINE_EDGE)) {
            HvdcLine line = network.getHvdcLine(edge.getEquipmentId());
            return line.getConverterStation(IidmUtils.getIidmHvdcSideFromBranchEdgeSide(side)).getTerminal();
        } else if (edge.getType().equals(BranchEdge.DANGLING_LINE_EDGE)) {
            if (side.equals(BranchEdge.Side.ONE)) {
                return network.getDanglingLine(edge.getEquipmentId()).getTerminal();
            }
            return null;
        } else {
            Branch<?> branch = network.getBranch(edge.getEquipmentId());
            return branch.getTerminal(IidmUtils.getIidmSideFromBranchEdgeSide(side));
        }
    }

    public static ThreeWindingsTransformer.Leg get3wtLeg(ThreeWindingsTransformer twt, ThreeSides side) {
        if (side == ThreeSides.ONE) {
            return twt.getLeg1();
        } else if (side == ThreeSides.TWO) {
            return twt.getLeg2();
        } else {
            return twt.getLeg3();
        }
    }

    public static TwoSides getOpposite(TwoSides side) {
        return side == TwoSides.ONE ? TwoSides.TWO : TwoSides.ONE;
    }

    public static TwoSides getIidmSideFromBranchEdgeSide(BranchEdge.Side side) {
        return Objects.requireNonNull(side) == BranchEdge.Side.ONE ? TwoSides.ONE : TwoSides.TWO;
    }

    public static TwoSides getIidmHvdcSideFromBranchEdgeSide(BranchEdge.Side side) {
        return Objects.requireNonNull(side) == BranchEdge.Side.ONE ? TwoSides.ONE : TwoSides.TWO;
    }

    public static ThreeSides getIidmSideFromThreeWtEdgeSide(ThreeWtEdge.Side side) {
        switch (Objects.requireNonNull(side)) {
            case ONE:
                return ThreeSides.ONE;
            case TWO:
                return ThreeSides.TWO;
            case THREE:
                return ThreeSides.THREE;
        }
        return null;
    }

    public static ThreeWtEdge.Side getThreeWtEdgeSideFromIidmSide(ThreeSides side) {
        switch (Objects.requireNonNull(side)) {
            case ONE:
                return ThreeWtEdge.Side.ONE;
            case TWO:
                return ThreeWtEdge.Side.TWO;
            case THREE:
                return ThreeWtEdge.Side.THREE;
        }
        return null;
    }

    public static boolean isIidmBranch(Edge edge) {
        if (edge instanceof BranchEdge) {
            String edgeType = edge.getType();
            return !edgeType.equals(BranchEdge.HVDC_LINE_EDGE) &&
                    !edgeType.equals(BranchEdge.DANGLING_LINE_EDGE);
        }
        return false;
    }
}