Skip to content

Commit 16a946d

Browse files
Add support of network cache for DC
Signed-off-by: Sylvestre Prabakaran <sylvestre.prabakaran@rte-france.com>
1 parent 654b0db commit 16a946d

8 files changed

Lines changed: 368 additions & 159 deletions

File tree

src/main/java/com/powsybl/openloadflow/OpenLoadFlowProvider.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@
3131
import com.powsybl.openloadflow.ac.AcloadFlowEngine;
3232
import com.powsybl.openloadflow.dc.DcLoadFlowEngine;
3333
import com.powsybl.openloadflow.dc.DcLoadFlowResult;
34+
import com.powsybl.openloadflow.fastrestart.AcLoadFlowFromCache;
35+
import com.powsybl.openloadflow.fastrestart.DcLoadFlowFromCache;
36+
import com.powsybl.openloadflow.fastrestart.NetworkCache;
3437
import com.powsybl.openloadflow.graph.EvenShiloachGraphDecrementalConnectivityFactory;
3538
import com.powsybl.openloadflow.graph.GraphConnectivityFactory;
3639
import com.powsybl.openloadflow.lf.AbstractLoadFlowResult;
@@ -95,7 +98,7 @@ public String getVersion() {
9598
private void updateAcState(Network network, LoadFlowParameters parameters, OpenLoadFlowParameters parametersExt,
9699
AcLoadFlowResult result, AcLoadFlowParameters acParameters, boolean atLeastOneComponentHasToBeUpdated) {
97100
if (parametersExt.isNetworkCacheEnabled()) {
98-
NetworkCache.INSTANCE.findEntry(network).orElseThrow().setPause(true);
101+
NetworkCache.INSTANCE.findEntryAc(network).orElseThrow().setPause(true);
99102
}
100103
try {
101104
// update network state
@@ -120,7 +123,7 @@ private void updateAcState(Network network, LoadFlowParameters parameters, OpenL
120123
}
121124
} finally {
122125
if (parametersExt.isNetworkCacheEnabled()) {
123-
NetworkCache.INSTANCE.findEntry(network).orElseThrow().setPause(false);
126+
NetworkCache.INSTANCE.findEntryAc(network).orElseThrow().setPause(false);
124127
}
125128
}
126129
}
@@ -210,7 +213,13 @@ private LoadFlowResult runDc(Network network, LoadFlowParameters parameters, Ope
210213
dcParameters.getNetworkParameters()
211214
.setCacheEnabled(false); // force not caching as not supported in DC LF
212215

213-
List<DcLoadFlowResult> results = DcLoadFlowEngine.run(network, new LfNetworkLoaderImpl(), dcParameters, reportNode);
216+
List<DcLoadFlowResult> results;
217+
if (parametersExt.isNetworkCacheEnabled()) {
218+
results = new DcLoadFlowFromCache(network, parameters, parametersExt, dcParameters, reportNode)
219+
.run();
220+
} else {
221+
results = DcLoadFlowEngine.run(network, new LfNetworkLoaderImpl(), dcParameters, reportNode);
222+
}
214223

215224
Networks.resetState(network);
216225

src/main/java/com/powsybl/openloadflow/ac/AcLoadFlowContext.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@ public class AcLoadFlowContext extends AbstractLoadFlowContext<AcVariableType, A
3030

3131
private AcLoadFlowResult result;
3232

33-
private boolean networkUpdated = true;
34-
3533
public AcLoadFlowContext(LfNetwork network, AcLoadFlowParameters parameters) {
3634
super(network, parameters);
3735
}
@@ -82,14 +80,6 @@ public void setResult(AcLoadFlowResult result) {
8280
this.result = result;
8381
}
8482

85-
public boolean isNetworkUpdated() {
86-
return networkUpdated;
87-
}
88-
89-
public void setNetworkUpdated(boolean networkUpdated) {
90-
this.networkUpdated = networkUpdated;
91-
}
92-
9383
@Override
9484
public void close() {
9585
super.close();

src/main/java/com/powsybl/openloadflow/AcLoadFlowFromCache.java renamed to src/main/java/com/powsybl/openloadflow/fastrestart/AcLoadFlowFromCache.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@
55
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
66
* SPDX-License-Identifier: MPL-2.0
77
*/
8-
package com.powsybl.openloadflow;
8+
package com.powsybl.openloadflow.fastrestart;
99

1010
import com.powsybl.commons.report.ReportNode;
1111
import com.powsybl.iidm.network.*;
1212
import com.powsybl.loadflow.LoadFlowParameters;
13+
import com.powsybl.openloadflow.OpenLoadFlowParameters;
1314
import com.powsybl.openloadflow.ac.AcLoadFlowContext;
1415
import com.powsybl.openloadflow.ac.AcLoadFlowParameters;
1516
import com.powsybl.openloadflow.ac.AcLoadFlowResult;
@@ -88,7 +89,7 @@ private void configureTopoConfig(LfTopoConfig topoConfig) {
8889
}
8990
}
9091

91-
private List<AcLoadFlowContext> initContexts(NetworkCache.Entry entry) {
92+
private List<AcLoadFlowContext> initContexts(NetworkCache.Entry<AcLoadFlowContext> entry) {
9293
List<AcLoadFlowContext> contexts;
9394
LfTopoConfig topoConfig = new LfTopoConfig();
9495
configureTopoConfig(topoConfig);
@@ -114,17 +115,17 @@ private static AcLoadFlowResult run(AcLoadFlowContext context) {
114115
if (context.getNetwork().getValidity() != LfNetwork.Validity.VALID) {
115116
return AcLoadFlowResult.createNoCalculationResult(context.getNetwork());
116117
}
117-
if (context.isNetworkUpdated()) {
118+
if (context.getNetwork().isNetworkUpdated()) {
118119
AcLoadFlowResult result = new AcloadFlowEngine(context)
119120
.run();
120-
context.setNetworkUpdated(false);
121+
context.getNetwork().setNetworkUpdated(false);
121122
return result;
122123
}
123124
return new AcLoadFlowResult(context.getNetwork(), 0, 0, AcSolverStatus.CONVERGED, OuterLoopResult.stable(), 0d, 0d);
124125
}
125126

126127
public List<AcLoadFlowResult> run() {
127-
NetworkCache.Entry entry = NetworkCache.INSTANCE.get(network, parameters);
128+
NetworkCache.Entry<AcLoadFlowContext> entry = NetworkCache.INSTANCE.getAc(network, parameters);
128129
List<AcLoadFlowContext> contexts = entry.getContexts();
129130
if (contexts == null) {
130131
contexts = initContexts(entry);
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
/**
2+
* Copyright (c) 2022, RTE (http://www.rte-france.com)
3+
* This Source Code Form is subject to the terms of the Mozilla Public
4+
* License, v. 2.0. If a copy of the MPL was not distributed with this
5+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
6+
* SPDX-License-Identifier: MPL-2.0
7+
*/
8+
package com.powsybl.openloadflow.fastrestart;
9+
10+
import com.powsybl.commons.report.ReportNode;
11+
import com.powsybl.iidm.network.*;
12+
import com.powsybl.loadflow.LoadFlowParameters;
13+
import com.powsybl.openloadflow.OpenLoadFlowParameters;
14+
import com.powsybl.openloadflow.dc.DcLoadFlowContext;
15+
import com.powsybl.openloadflow.dc.DcLoadFlowEngine;
16+
import com.powsybl.openloadflow.dc.DcLoadFlowParameters;
17+
import com.powsybl.openloadflow.dc.DcLoadFlowResult;
18+
import com.powsybl.openloadflow.lf.outerloop.OuterLoopResult;
19+
import com.powsybl.openloadflow.network.LfNetwork;
20+
import com.powsybl.openloadflow.network.LfTopoConfig;
21+
import com.powsybl.openloadflow.network.impl.LfLegBranch;
22+
import com.powsybl.openloadflow.network.impl.LfNetworkList;
23+
import com.powsybl.openloadflow.network.impl.Networks;
24+
import org.slf4j.Logger;
25+
import org.slf4j.LoggerFactory;
26+
27+
import java.util.List;
28+
import java.util.Objects;
29+
import java.util.stream.Collectors;
30+
31+
/**
32+
* @author Geoffroy Jamgotchian {@literal <geoffroy.jamgotchian at rte-france.com>}
33+
*/
34+
public class DcLoadFlowFromCache {
35+
36+
private static final Logger LOGGER = LoggerFactory.getLogger(DcLoadFlowFromCache.class);
37+
38+
private final Network network;
39+
40+
private final LoadFlowParameters parameters;
41+
42+
private final OpenLoadFlowParameters parametersExt;
43+
44+
private final DcLoadFlowParameters dcParameters;
45+
46+
private final ReportNode reportNode;
47+
48+
public DcLoadFlowFromCache(Network network, LoadFlowParameters parameters, OpenLoadFlowParameters parametersExt,
49+
DcLoadFlowParameters dcParameters, ReportNode reportNode) {
50+
this.network = Objects.requireNonNull(network);
51+
this.parameters = Objects.requireNonNull(parameters);
52+
this.parametersExt = Objects.requireNonNull(parametersExt);
53+
this.dcParameters = Objects.requireNonNull(dcParameters);
54+
this.reportNode = Objects.requireNonNull(reportNode);
55+
}
56+
57+
private void configureTopoConfig(LfTopoConfig topoConfig) {
58+
for (String switchId : parametersExt.getActionableSwitchesIds()) {
59+
Switch sw = network.getSwitch(switchId);
60+
if (sw != null) {
61+
if (sw.isOpen()) {
62+
topoConfig.getSwitchesToClose().add(sw);
63+
} else {
64+
topoConfig.getSwitchesToOpen().add(sw);
65+
}
66+
} else {
67+
LOGGER.warn("Actionable switch '{}' does not exist", switchId);
68+
}
69+
}
70+
for (String transformerId : parametersExt.getActionableTransformersIds()) {
71+
Branch<?> branch = network.getBranch(transformerId);
72+
if (branch != null) {
73+
topoConfig.addBranchIdWithRtcToRetain(transformerId);
74+
topoConfig.addBranchIdWithPtcToRetain(transformerId);
75+
} else {
76+
ThreeWindingsTransformer tw3 = network.getThreeWindingsTransformer(transformerId);
77+
if (tw3 != null) {
78+
for (ThreeSides side : ThreeSides.values()) {
79+
topoConfig.addBranchIdWithRtcToRetain(LfLegBranch.getId(side, transformerId));
80+
topoConfig.addBranchIdWithPtcToRetain(LfLegBranch.getId(side, transformerId));
81+
}
82+
}
83+
LOGGER.warn("Actionable transformer '{}' does not exist", transformerId);
84+
}
85+
}
86+
if (topoConfig.isBreaker()) {
87+
dcParameters.getNetworkParameters().setBreakers(true);
88+
}
89+
}
90+
91+
private List<DcLoadFlowContext> initContexts(NetworkCache.Entry<DcLoadFlowContext> entry) {
92+
List<DcLoadFlowContext> contexts;
93+
LfTopoConfig topoConfig = new LfTopoConfig();
94+
configureTopoConfig(topoConfig);
95+
96+
// Because of caching, we only need to switch back to working variant but not to remove the variant, thus
97+
// WorkingVariantReverter is used instead of DefaultVariantCleaner
98+
try (LfNetworkList lfNetworkList = Networks.loadWithReconnectableElements(network, topoConfig, dcParameters.getNetworkParameters(),
99+
LfNetworkList.WorkingVariantReverter::new, reportNode)) {
100+
contexts = lfNetworkList.getList()
101+
.stream()
102+
.map(n -> new DcLoadFlowContext(n, dcParameters))
103+
.collect(Collectors.toList());
104+
entry.setContexts(contexts);
105+
LfNetworkList.VariantCleaner variantCleaner = lfNetworkList.getVariantCleaner();
106+
if (variantCleaner != null) {
107+
entry.setTmpVariantId(variantCleaner.getTmpVariantId());
108+
}
109+
}
110+
return contexts;
111+
}
112+
113+
private static DcLoadFlowResult run(DcLoadFlowContext context) {
114+
if (context.getNetwork().getValidity() != LfNetwork.Validity.VALID) {
115+
return DcLoadFlowResult.createNoCalculationResult(context.getNetwork());
116+
}
117+
if (context.getNetwork().isNetworkUpdated()) {
118+
DcLoadFlowResult result = new DcLoadFlowEngine(context)
119+
.run();
120+
context.getNetwork().setNetworkUpdated(false);
121+
return result;
122+
}
123+
return new DcLoadFlowResult(context.getNetwork(), 0, true, OuterLoopResult.stable(), 0d, 0d);
124+
}
125+
126+
public List<DcLoadFlowResult> run() {
127+
NetworkCache.Entry<DcLoadFlowContext> entry = NetworkCache.INSTANCE.getDc(network, parameters);
128+
List<DcLoadFlowContext> contexts = entry.getContexts();
129+
if (contexts == null) {
130+
contexts = initContexts(entry);
131+
}
132+
return contexts.stream()
133+
.map(DcLoadFlowFromCache::run)
134+
.collect(Collectors.toList());
135+
}
136+
}

0 commit comments

Comments
 (0)