AbstractAmplNetworkUpdater.java

/**
 * Copyright (c) 2023, 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.ampl.converter;

import com.powsybl.commons.util.StringToIntMapper;
import com.powsybl.iidm.network.Bus;
import com.powsybl.iidm.network.Network;
import com.powsybl.iidm.network.Terminal;
import com.powsybl.iidm.network.ThreeWindingsTransformer;

/**
 * Provides some utility functions for implementations :
 * <ul>
 *     <li>{@link AbstractAmplNetworkUpdater#busConnection}</li>
 *     <li>{@link AbstractAmplNetworkUpdater#getThreeWindingsTransformerLeg}</li>
 *     <li>{@link AbstractAmplNetworkUpdater#getThreeWindingsTransformer}</li>
 * </ul>
 *
 * @author Nicolas Pierre {@literal <nicolas.pierre@artelys.com>}
 */
public abstract class AbstractAmplNetworkUpdater implements AmplNetworkUpdater {

    public void busConnection(Terminal t, int busNum, StringToIntMapper<AmplSubset> mapper) {
        if (busNum == -1) {
            t.disconnect();
        } else {
            String busId = mapper.getId(AmplSubset.BUS, busNum);
            Bus connectable = AmplUtil.getConnectableBus(t);
            if (connectable != null && connectable.getId().equals(busId)) {
                t.connect();
            }
        }
    }

    public ThreeWindingsTransformer.Leg getThreeWindingsTransformerLeg(ThreeWindingsTransformer twt, String legId) {
        if (legId.endsWith(AmplConstants.LEG1_SUFFIX)) {
            return twt.getLeg1();
        } else if (legId.endsWith(AmplConstants.LEG2_SUFFIX)) {
            return twt.getLeg2();
        } else if (legId.endsWith(AmplConstants.LEG3_SUFFIX)) {
            return twt.getLeg3();
        }

        throw new IllegalArgumentException("Unexpected suffix: " + legId.substring(legId.length() - 5));
    }

    /**
     * Return a 3 windings transformer from one its leg ID
     *
     * @param legId   The ID of a 3WT leg
     * @param network The IIDM network to update
     * @return A three windings transformer or null if not found
     */
    public ThreeWindingsTransformer getThreeWindingsTransformer(Network network, String legId) {
        String twtId = legId.substring(0, legId.length() - 5);
        ThreeWindingsTransformer twt = network.getThreeWindingsTransformer(twtId);
        if (twt == null) {
            throw new AmplException("Unable to find transformer '" + twtId + "'");
        }
        return twt;
    }

}