Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix StaticVarCompensator and VscConverter used as reference generator #1078

Merged
merged 2 commits into from
Aug 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ public class ReferenceBusGeneratorPrioritySelector implements ReferenceBusSelect
private static final Logger LOGGER = LoggerFactory.getLogger(ReferenceBusGeneratorPrioritySelector.class);
private static final String METHOD_NAME = "Generator Reference Priority";

private static final ReferenceBusSelector FALLBACK_SELECTOR = new ReferenceBusFirstSlackSelector();

@Override
public SelectedReferenceBus select(LfNetwork lfNetwork) {
Objects.requireNonNull(lfNetwork);
Expand All @@ -44,8 +46,15 @@ public SelectedReferenceBus select(LfNetwork lfNetwork) {
LfGenerator referenceGenerator = lfGenerators.stream()
.filter(g -> g.getReferencePriority() == priority)
.min(Comparator.comparingDouble(LfGenerator::getMaxTargetP).reversed().thenComparing(LfGenerator::getId)
).orElseThrow(() -> new IllegalStateException("No reference Generator for network " + lfNetwork));
LfBus referenceBus = referenceGenerator.getBus();
return new SelectedGeneratorReferenceBus(referenceBus, METHOD_NAME, referenceGenerator);
).orElse(null);
if (referenceGenerator != null) {
LfBus referenceBus = referenceGenerator.getBus();
return new SelectedGeneratorReferenceBus(referenceBus, METHOD_NAME, referenceGenerator);
} else {
// E.g. an island with only Vsc Hvdc Converter and/or only Static Var Compensator.
// In this case the island doesn't have any reference generator, only a reference bus.
// Note that SlackDistributionFailureBehavior.DISTRIBUTE_ON_REFERENCE_GENERATOR will fail on such islands.
return FALLBACK_SELECTOR.select(lfNetwork);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -200,4 +200,10 @@ public Optional<LfShunt> getStandByAutomatonShunt() {
public void setStandByAutomatonShunt(LfShunt standByAutomatonShunt) {
this.standByAutomatonShunt = standByAutomatonShunt;
}

@Override
public int getReferencePriority() {
// never selected
return -1;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -124,4 +124,10 @@ public void updateState(LfNetworkStateUpdateParameters parameters) {
station.getTerminal().setP(-getTargetP() * PerUnit.SB);
}
}

@Override
public int getReferencePriority() {
// never selected
return -1;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,7 @@
import com.powsybl.math.matrix.DenseMatrixFactory;
import com.powsybl.openloadflow.OpenLoadFlowParameters;
import com.powsybl.openloadflow.OpenLoadFlowProvider;
import com.powsybl.openloadflow.network.ConnectedComponentNetworkFactory;
import com.powsybl.openloadflow.network.DistributedSlackNetworkFactory;
import com.powsybl.openloadflow.network.ReferenceBusSelectionMode;
import com.powsybl.openloadflow.network.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

Expand All @@ -40,7 +38,6 @@ class ReferenceBusPrioritiesTest {
private Generator g1;
private Generator g2;
private Generator g3;
private Generator g4;

private LoadFlow.Runner loadFlowRunner;

Expand All @@ -54,7 +51,6 @@ void setUp() {
g1 = network.getGenerator("g1");
g2 = network.getGenerator("g2");
g3 = network.getGenerator("g3");
g4 = network.getGenerator("g4");
loadFlowRunner = new LoadFlow.Runner(new OpenLoadFlowProvider(new DenseMatrixFactory()));
parameters = new LoadFlowParameters()
.setReadSlackBus(true)
Expand Down Expand Up @@ -97,9 +93,9 @@ void referencePriorityDifferentFromSlackTest() {

@Test
void testMultipleComponents() {
Network network = ConnectedComponentNetworkFactory.createThreeCcLinkedByASingleBusWithTransformer();
network = ConnectedComponentNetworkFactory.createThreeCcLinkedByASingleBusWithTransformer();
// open everything at bus b4 to create 3 components
network.getBusBreakerView().getBus("b4").getConnectedTerminalStream().forEach(t -> t.disconnect());
network.getBusBreakerView().getBus("b4").getConnectedTerminalStream().forEach(Terminal::disconnect);
ReferencePriorities.delete(network);
SlackTerminal.reset(network);
LoadFlowResult result = loadFlowRunner.run(network, parameters);
Expand All @@ -115,9 +111,9 @@ void testMultipleComponents() {

@Test
void testNotWritingReferenceTerminals() {
Network network = ConnectedComponentNetworkFactory.createThreeCcLinkedByASingleBusWithTransformer();
network = ConnectedComponentNetworkFactory.createThreeCcLinkedByASingleBusWithTransformer();
// open everything at bus b4 to create 3 components
network.getBusBreakerView().getBus("b4").getConnectedTerminalStream().forEach(t -> t.disconnect());
network.getBusBreakerView().getBus("b4").getConnectedTerminalStream().forEach(Terminal::disconnect);
ReferencePriorities.delete(network);
ReferenceTerminals.reset(network);
SlackTerminal.reset(network);
Expand All @@ -132,9 +128,9 @@ void testNotWritingReferenceTerminals() {

@Test
void testNotWritingReferenceTerminals2() {
Network network = ConnectedComponentNetworkFactory.createThreeCcLinkedByASingleBusWithTransformer();
network = ConnectedComponentNetworkFactory.createThreeCcLinkedByASingleBusWithTransformer();
// open everything at bus b4 to create 3 components
network.getBusBreakerView().getBus("b4").getConnectedTerminalStream().forEach(t -> t.disconnect());
network.getBusBreakerView().getBus("b4").getConnectedTerminalStream().forEach(Terminal::disconnect);
ReferencePriorities.delete(network);
ReferenceTerminals.reset(network);
SlackTerminal.reset(network);
Expand All @@ -148,4 +144,31 @@ void testNotWritingReferenceTerminals2() {
assertTrue(referenceTerminals.contains(network.getLine("l810").getTerminal2()));
assertFalse(referenceTerminals.contains(network.getLine("l910").getTerminal2()));
}

@Test
void shouldNotSelectStaticVarCompensatorTest() {
network = VoltageControlNetworkFactory.createWithStaticVarCompensator();
ReferencePriorities.delete(network);
LoadFlowResult result = loadFlowRunner.run(network, parameters);
assertTrue(result.isFullyConverged());
LoadFlowResult.ComponentResult componentResult = result.getComponentResults().get(0);
assertEquals("vl1_0", componentResult.getReferenceBusId());
assertTrue(ReferenceTerminals.getTerminals(network).contains(network.getGenerator("g1").getTerminal()));
}

@Test
void shouldNotSelectVscHvdcConverterTest() {
network = HvdcNetworkFactory.createVsc();
parametersExt.setSlackBusPMaxMismatch(0.1);
ReferencePriorities.delete(network);
LoadFlowResult result = loadFlowRunner.run(network, parameters);
assertTrue(result.isFullyConverged());
LoadFlowResult.ComponentResult componentResultSc0 = result.getComponentResults().get(0);
assertEquals("vl1_0", componentResultSc0.getReferenceBusId());
LoadFlowResult.ComponentResult componentResultSc1 = result.getComponentResults().get(1);
assertEquals("vl3_0", componentResultSc1.getReferenceBusId());
// note that no reference terminal is reported for {CC0 SC1} which does not contain real generator (only a VSC converter)
assertEquals(1, ReferenceTerminals.getTerminals(network).size());
assertTrue(ReferenceTerminals.getTerminals(network).contains(network.getGenerator("g1").getTerminal()));
}
}