TwoWindingsTransformerImpl.java

/**
 * Copyright (c) 2016, All partners of the iTesla project (http://www.itesla-project.eu/consortium)
 * 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.impl;

import java.util.HashSet;
import java.util.Optional;
import java.util.Set;

import com.powsybl.iidm.network.*;
import com.powsybl.commons.ref.Ref;

/**
 *
 * @author Geoffroy Jamgotchian {@literal <geoffroy.jamgotchian at rte-france.com>}
 */
class TwoWindingsTransformerImpl extends AbstractConnectableBranch<TwoWindingsTransformer>
    implements TwoWindingsTransformer, RatioTapChangerParent, PhaseTapChangerParent {

    private final SubstationImpl substation;

    private double r;

    private double x;

    private double g;

    private double b;

    private double ratedU1;

    private double ratedU2;

    private double ratedS;

    private RatioTapChangerImpl ratioTapChanger;

    private PhaseTapChangerImpl phaseTapChanger;

    TwoWindingsTransformerImpl(Ref<NetworkImpl> network, String id, String name, boolean fictitious,
                               SubstationImpl substation,
                               double r, double x, double g, double b, double ratedU1, double ratedU2, double ratedS) {
        super(network, id, name, fictitious);
        this.substation = substation;
        this.r = r;
        this.x = x;
        this.g = g;
        this.b = b;
        this.ratedU1 = ratedU1;
        this.ratedU2 = ratedU2;
        this.ratedS = ratedS;
    }

    @Override
    public Optional<Substation> getSubstation() {
        return Optional.ofNullable(substation);
    }

    @Override
    public Substation getNullableSubstation() {
        return substation;
    }

    @Override
    public double getR() {
        return r;
    }

    @Override
    public TwoWindingsTransformerImpl setR(double r) {
        ValidationUtil.checkR(this, r);
        double oldValue = this.r;
        this.r = r;
        notifyUpdate("r", oldValue, r);
        return this;
    }

    @Override
    public double getX() {
        return x;
    }

    @Override
    public TwoWindingsTransformerImpl setX(double x) {
        ValidationUtil.checkX(this, x);
        double oldValue = this.x;
        this.x = x;
        notifyUpdate("x", oldValue, x);
        return this;
    }

    @Override
    public double getG() {
        return g;
    }

    @Override
    public TwoWindingsTransformerImpl setG(double g) {
        ValidationUtil.checkG(this, g);
        double oldValue = this.g;
        this.g = g;
        notifyUpdate("g", oldValue, g);
        return this;
    }

    @Override
    public double getB() {
        return b;
    }

    @Override
    public TwoWindingsTransformerImpl setB(double b) {
        ValidationUtil.checkB(this, b);
        double oldValue = this.b;
        this.b = b;
        notifyUpdate("b", oldValue, b);
        return this;
    }

    @Override
    public double getRatedU1() {
        return ratedU1;
    }

    @Override
    public TwoWindingsTransformerImpl setRatedU1(double ratedU1) {
        ValidationUtil.checkRatedU1(this, ratedU1);
        double oldValue = this.ratedU1;
        this.ratedU1 = ratedU1;
        notifyUpdate("ratedU1", oldValue, ratedU1);
        return this;
    }

    @Override
    public double getRatedU2() {
        return ratedU2;
    }

    @Override
    public TwoWindingsTransformerImpl setRatedU2(double ratedU2) {
        ValidationUtil.checkRatedU2(this, ratedU2);
        double oldValue = this.ratedU2;
        this.ratedU2 = ratedU2;
        notifyUpdate("ratedU2", oldValue, ratedU2);
        return this;
    }

    @Override
    public double getRatedS() {
        return ratedS;
    }

    @Override
    public TwoWindingsTransformer setRatedS(double ratedS) {
        ValidationUtil.checkRatedS(this, ratedS);
        double oldValue = this.ratedS;
        this.ratedS = ratedS;
        notifyUpdate("ratedS", oldValue, ratedS);
        return this;
    }

    @Override
    public RatioTapChangerAdderImpl newRatioTapChanger() {
        return new RatioTapChangerAdderImpl(this);
    }

    @Override
    public RatioTapChangerImpl getRatioTapChanger() {
        return ratioTapChanger;
    }

    @Override
    public Optional<RatioTapChanger> getOptionalRatioTapChanger() {
        return Optional.ofNullable(ratioTapChanger);
    }

    @Override
    public PhaseTapChangerAdderImpl newPhaseTapChanger() {
        return new PhaseTapChangerAdderImpl(this);
    }

    @Override
    public PhaseTapChangerImpl getPhaseTapChanger() {
        return phaseTapChanger;
    }

    @Override
    public Optional<PhaseTapChanger> getOptionalPhaseTapChanger() {
        return Optional.ofNullable(phaseTapChanger);
    }

    @Override
    public Set<TapChanger<?, ?, ?, ?>> getAllTapChangers() {
        Set<TapChanger<?, ?, ?, ?>> tapChangers = new HashSet<>();
        if (ratioTapChanger != null) {
            tapChangers.add(ratioTapChanger);
        }
        if (phaseTapChanger != null) {
            tapChangers.add(phaseTapChanger);
        }
        return tapChangers;
    }

    @Override
    public boolean hasRatioTapChanger() {
        return ratioTapChanger != null;
    }

    @Override
    public boolean hasPhaseTapChanger() {
        return phaseTapChanger != null;
    }

    @Override
    public void setRatioTapChanger(RatioTapChangerImpl ratioTapChanger) {
        RatioTapChangerImpl oldValue = this.ratioTapChanger;
        this.ratioTapChanger = ratioTapChanger;
        notifyUpdate("ratioTapChanger", oldValue, ratioTapChanger);
    }

    public void setPhaseTapChanger(PhaseTapChangerImpl phaseTapChanger) {
        PhaseTapChangerImpl oldValue = this.phaseTapChanger;
        this.phaseTapChanger = phaseTapChanger;
        notifyUpdate("phaseTapChanger", oldValue, phaseTapChanger);
    }

    @Override
    public void extendVariantArraySize(int initVariantArraySize, int number, int sourceIndex) {
        super.extendVariantArraySize(initVariantArraySize, number, sourceIndex);
        if (ratioTapChanger != null) {
            ratioTapChanger.extendVariantArraySize(initVariantArraySize, number, sourceIndex);
        }
        if (phaseTapChanger != null) {
            phaseTapChanger.extendVariantArraySize(initVariantArraySize, number, sourceIndex);
        }
    }

    @Override
    public void reduceVariantArraySize(int number) {
        super.reduceVariantArraySize(number);
        if (ratioTapChanger != null) {
            ratioTapChanger.reduceVariantArraySize(number);
        }
        if (phaseTapChanger != null) {
            phaseTapChanger.reduceVariantArraySize(number);
        }
    }

    @Override
    public void deleteVariantArrayElement(int index) {
        super.deleteVariantArrayElement(index);
        if (ratioTapChanger != null) {
            ratioTapChanger.deleteVariantArrayElement(index);
        }
        if (phaseTapChanger != null) {
            phaseTapChanger.deleteVariantArrayElement(index);
        }
    }

    @Override
    public void allocateVariantArrayElement(int[] indexes, int sourceIndex) {
        super.allocateVariantArrayElement(indexes, sourceIndex);
        if (ratioTapChanger != null) {
            ratioTapChanger.allocateVariantArrayElement(indexes, sourceIndex);
        }
        if (phaseTapChanger != null) {
            phaseTapChanger.allocateVariantArrayElement(indexes, sourceIndex);
        }
    }

    public Identifiable getTransformer() {
        return this;
    }

    @Override
    public String getTapChangerAttribute() {
        return "TapChanger";
    }

    @Override
    protected String getTypeDescription() {
        return "2 windings transformer";
    }

    @Override
    public void remove() {
        if (ratioTapChanger != null) {
            ratioTapChanger.remove();
        }
        if (phaseTapChanger != null) {
            phaseTapChanger.remove();
        }
        super.remove();
    }
}