Skip to content

Commit

Permalink
Fix StaticVarCompensator and VscConverter used as reference generator (
Browse files Browse the repository at this point in the history
…#1078)

Signed-off-by: Damien Jeandemange <damien.jeandemange@artelys.com>
  • Loading branch information
jeandemanged authored Aug 29, 2024
1 parent 8fd8cc4 commit e4f0e49
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 14 deletions.
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()));
}
}

0 comments on commit e4f0e49

Please sign in to comment.