Z0FlowFromBusBalance.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.loadflow.resultscompletion.z0flows;

import com.powsybl.iidm.network.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Objects;

/**
 * @author Luma Zamarre��o {@literal <zamarrenolm at aia.es>}
 */
public class Z0FlowFromBusBalance implements TopologyVisitor {

    public Z0FlowFromBusBalance(Bus bus, Line line) {
        this.bus = Objects.requireNonNull(bus);
        this.line = Objects.requireNonNull(line);

        this.netP = 0.0;
        this.netQ = 0.0;

        this.known = true;
    }

    public void complete() {
        if (LOG.isDebugEnabled()) {
            LOG.debug("Z0 flow for line {} from balance at bus {}", line, bus);
        }
        bus.visitConnectedEquipments(this);
        if (this.known) {
            completeZ0Flow();
        }
    }

    private void addFlow(Terminal t) {
        if (Double.isNaN(t.getP()) || Double.isNaN(t.getQ())) {
            known = false;
            LOG.warn("Z0 flow    unknown P, Q flow at {}", t.getConnectable());
        } else {
            netP += t.getP();
            netQ += t.getQ();
            if (LOG.isDebugEnabled()) {
                LOG.debug(String.format("Z0 flow    P,Q %10.4f %10.4f %s %s",
                        t.getP(), t.getQ(),
                        t.getConnectable().getNameOrId(),
                        t.getConnectable().getId()));
            }
        }
    }

    private void addFlowQ(Terminal t) {
        if (Double.isNaN(t.getQ())) {
            known = false;
            LOG.warn("Z0 flow    unknown Q flow at {}", t.getConnectable());
        } else {
            netQ += t.getQ();
            if (LOG.isDebugEnabled()) {
                LOG.debug(String.format("Z0 flow    Q   %10s %10.4f %s %s",
                        "-",
                        t.getQ(),
                        t.getConnectable().getNameOrId(),
                        t.getConnectable().getId()));
            }
        }
    }

    private void completeZ0Flow() {
        Terminal t = BranchTerminal.ofBus(line, bus);
        Objects.requireNonNull(t);
        t.setP(-netP);
        t.setQ(-netQ);
        Terminal other = BranchTerminal.ofOtherBus(line, bus);
        Objects.requireNonNull(other);
        other.setP(netP);
        other.setQ(netQ);
        if (LOG.isDebugEnabled()) {
            LOG.debug(String.format("Z0 flow    Z0  %10.4f %10.4f", t.getP(), t.getQ()));
        }
    }

    @Override
    public void visitBusbarSection(BusbarSection section) {
        // Nothing to do
    }

    @Override
    public void visitLine(Line line, TwoSides side) {
        if (line.equals(this.line)) {
            return;
        }
        if (!line.getTerminal1().isConnected() || !line.getTerminal2().isConnected()) {
            return;
        }
        addFlow(line.getTerminal(side));
    }

    @Override
    public void visitTwoWindingsTransformer(TwoWindingsTransformer transformer, TwoSides side) {
        addFlow(transformer.getTerminal(side));
    }

    @Override
    public void visitThreeWindingsTransformer(ThreeWindingsTransformer transformer,
            ThreeSides side) {
        addFlow(transformer.getTerminal(side));
    }

    @Override
    public void visitGenerator(Generator generator) {
        addFlow(generator.getTerminal());
    }

    @Override
    public void visitBattery(Battery battery) {
        addFlow(battery.getTerminal());
    }

    @Override
    public void visitLoad(Load load) {
        addFlow(load.getTerminal());
    }

    @Override
    public void visitShuntCompensator(ShuntCompensator sc) {
        addFlowQ(sc.getTerminal());
    }

    @Override
    public void visitDanglingLine(DanglingLine danglingLine) {
        addFlow(danglingLine.getTerminal());
    }

    @Override
    public void visitStaticVarCompensator(StaticVarCompensator staticVarCompensator) {
        addFlowQ(staticVarCompensator.getTerminal());
    }

    @Override
    public void visitGround(Ground ground) {
        addFlow(ground.getTerminal());
    }

    private final Bus bus;
    private final Line line;

    private boolean known;
    private double netP;
    private double netQ;

    private static final Logger LOG = LoggerFactory.getLogger(Z0FlowFromBusBalance.class);
}