com.powsybl.flow_decomposition.DecomposedFlow Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of powsybl-flow-decomposition Show documentation
Show all versions of powsybl-flow-decomposition Show documentation
Implementation of ACER methodology for flow decomposition
The newest version!
/*
* 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.flow_decomposition;
import com.powsybl.iidm.network.Country;
import java.util.*;
/**
* @author Sebastien Murgey {@literal }
* @author Hugo Schindler {@literal }
* @author Caio Luke {@literal }
*/
public class DecomposedFlow {
private final String branchId;
private final String contingencyId;
private final Country country1;
private final Country country2;
private final double acTerminal1ReferenceFlow;
private final double acTerminal2ReferenceFlow;
private final double dcReferenceFlow;
private final double allocatedFlow;
private final double xNodeFlow;
private final double pstFlow;
private final double internalFlow;
private final double acTerminal1Current;
private final double acTerminal2Current;
private final Map loopFlowsMap = new TreeMap<>();
static final double NO_FLOW = 0.;
static final String AC_REFERENCE_FLOW_1_COLUMN_NAME = "Reference AC Flow 1";
static final String AC_REFERENCE_FLOW_2_COLUMN_NAME = "Reference AC Flow 2";
static final String DC_REFERENCE_FLOW_COLUMN_NAME = "Reference DC Flow";
static final String ALLOCATED_COLUMN_NAME = "Allocated Flow";
static final String XNODE_COLUMN_NAME = "Xnode Flow";
static final String PST_COLUMN_NAME = "PST Flow";
static final String INTERNAL_COLUMN_NAME = "Internal Flow";
protected DecomposedFlow(DecomposedFlowBuilder builder) {
this.branchId = Objects.requireNonNull(builder.branchId);
this.contingencyId = Objects.requireNonNull(builder.contingencyId);
this.country1 = Objects.requireNonNull(builder.country1);
this.country2 = Objects.requireNonNull(builder.country2);
this.acTerminal1ReferenceFlow = builder.acTerminal1ReferenceFlow;
this.acTerminal2ReferenceFlow = builder.acTerminal2ReferenceFlow;
this.dcReferenceFlow = builder.dcReferenceFlow;
this.allocatedFlow = builder.allocatedFlow;
this.xNodeFlow = builder.xNodeFlow;
this.pstFlow = builder.pstFlow;
this.internalFlow = builder.internalFlow;
this.loopFlowsMap.putAll(Objects.requireNonNull(builder.loopFlowsMap));
this.acTerminal1Current = builder.acCurrentTerminal1;
this.acTerminal2Current = builder.acCurrentTerminal2;
}
public String getBranchId() {
return branchId;
}
public String getContingencyId() {
return contingencyId;
}
public String getId() {
return getXnecId(contingencyId, branchId);
}
public Country getCountry1() {
return country1;
}
public Country getCountry2() {
return country2;
}
public double getAcTerminal1ReferenceFlow() {
return acTerminal1ReferenceFlow;
}
public double getAcTerminal2ReferenceFlow() {
return acTerminal2ReferenceFlow;
}
public double getDcReferenceFlow() {
return dcReferenceFlow;
}
public double getAllocatedFlow() {
return allocatedFlow;
}
public double getXNodeFlow() {
return xNodeFlow;
}
public double getPstFlow() {
return pstFlow;
}
public double getInternalFlow() {
return internalFlow;
}
public double getLoopFlow(Country country) {
return getLoopFlow(NetworkUtil.getLoopFlowIdFromCountry(country));
}
public double getLoopFlow(String country) {
return loopFlowsMap.getOrDefault(country, NO_FLOW);
}
public Map getLoopFlows() {
return Collections.unmodifiableMap(loopFlowsMap);
}
private double getTotalLoopFlow() {
return loopFlowsMap.values().stream().reduce(0., Double::sum);
}
public double getTotalFlow() {
return getAllocatedFlow() + getXNodeFlow() + getPstFlow() + getInternalFlow() + getTotalLoopFlow();
}
public double getMaxAbsAcFlow() {
return Math.max(Math.abs(acTerminal1ReferenceFlow), Math.abs(acTerminal2ReferenceFlow));
}
public double getAcTerminal1Current() {
return acTerminal1Current;
}
public double getAcTerminal2Current() {
return acTerminal2Current;
}
@Override
public String toString() {
return String.format("branchId: %s, contingencyId: %s, decomposition: %s", branchId, contingencyId, getAllKeyMap());
}
private TreeMap getAllKeyMap() {
TreeMap localDecomposedFlowMap = new TreeMap<>();
localDecomposedFlowMap.put(AC_REFERENCE_FLOW_1_COLUMN_NAME, getAcTerminal1ReferenceFlow());
localDecomposedFlowMap.put(AC_REFERENCE_FLOW_2_COLUMN_NAME, getAcTerminal2ReferenceFlow());
localDecomposedFlowMap.put(DC_REFERENCE_FLOW_COLUMN_NAME, getDcReferenceFlow());
localDecomposedFlowMap.put(ALLOCATED_COLUMN_NAME, getAllocatedFlow());
localDecomposedFlowMap.put(XNODE_COLUMN_NAME, getXNodeFlow());
localDecomposedFlowMap.put(PST_COLUMN_NAME, getPstFlow());
localDecomposedFlowMap.put(INTERNAL_COLUMN_NAME, getInternalFlow());
localDecomposedFlowMap.putAll(loopFlowsMap);
return localDecomposedFlowMap;
}
public static String getXnecId(String contingencyId, String branchId) {
return contingencyId.isEmpty() ? branchId : String.format("%s_%s", branchId, contingencyId);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy