Skip to content

Commit 60630f9

Browse files
committed
[Battery] Adding missing battery Method
Signed-off-by: Matthieu SAUR <matthieu.saur@rte-france.com>
1 parent 17f6365 commit 60630f9

File tree

6 files changed

+112
-34
lines changed

6 files changed

+112
-34
lines changed

metrix-integration/src/main/groovy/com/powsybl/metrix/integration/MetrixDslDataLoader.groovy

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import static LossesData.lossesData
4040
import static ParametersData.parametersData
4141
import static PhaseShifterData.phaseShifterData
4242
import static SectionMonitoringData.sectionMonitoringData
43+
import static com.powsybl.metrix.integration.BatteryData.batteryData
4344

4445
/**
4546
* @author Paul Bui-Quang {@literal <paul.buiquang at rte-france.com>}
@@ -158,6 +159,11 @@ class MetrixDslDataLoader {
158159
generatorData(closure, id, network, loader, data, logDslLoader)
159160
}
160161

162+
// battery costs
163+
binding.battery = { String id, Closure<Void> closure ->
164+
batteryData(closure, id, network, loader, data, logDslLoader)
165+
}
166+
161167
// load shedding costs
162168
binding.load = { String id, Closure<Void> closure ->
163169
loadData(closure, id, network, loader, data, logDslLoader)

metrix-integration/src/main/java/com/powsybl/metrix/integration/MetrixDslData.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,18 @@ public Map<String, List<String>> getGeneratorContingenciesMap() {
245245
return Collections.unmodifiableMap(generatorDslData.getGeneratorContingenciesMap());
246246
}
247247

248+
public Map<String, List<String>> getBatteryContingenciesMap() {
249+
return Collections.unmodifiableMap(batteryContingenciesMap);
250+
}
251+
252+
public Set<String> getBatteriesForAdequacy() {
253+
return Collections.unmodifiableSet(batteriesForAdequacy);
254+
}
255+
256+
public Set<String> getBatteriesForRedispatching() {
257+
return Collections.unmodifiableSet(batteriesForRedispatching);
258+
}
259+
248260
public Map<String, Integer> getLoadPreventivePercentageMap() {
249261
return Collections.unmodifiableMap(loadDslData.getLoadPreventivePercentageMap());
250262
}
@@ -265,6 +277,10 @@ public Map<String, MetrixGeneratorsBinding> getGeneratorsBindings() {
265277
return Collections.unmodifiableMap(boundVariablesDslData.getGeneratorsBindings());
266278
}
267279

280+
public Map<String, MetrixBatteriesBinding> getBatteriesBindings() {
281+
return Collections.unmodifiableMap(batteriesBindings);
282+
}
283+
268284
public Map<String, MetrixLoadsBinding> getLoadsBindings() {
269285
return Collections.unmodifiableMap(boundVariablesDslData.getLoadsBindings());
270286
}

metrix-integration/src/main/java/com/powsybl/metrix/integration/analysis/MetrixInputAnalysis.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ enum LogType {
6363

6464
private static final String HVDC_LINE_TYPE = "hvdcLine";
6565
private static final String GENERATOR_TYPE = "generator";
66+
private static final String BATTERY_TYPE = "battery";
6667
private static final String LOAD_TYPE = "load";
6768
private static final String PHASE_TAP_CHANGER_TYPE = "phaseTapChanger";
6869

@@ -107,6 +108,7 @@ private void runMetrixDslDataAnalysis(Set<String> contingencyIds) {
107108
}
108109
checkMetrixDslContingencies(contingencyIds, HVDC_LINE_TYPE, metrixDslData.getHvdcContingenciesMap());
109110
checkMetrixDslContingencies(contingencyIds, GENERATOR_TYPE, metrixDslData.getGeneratorContingenciesMap());
111+
checkMetrixDslContingencies(contingencyIds, BATTERY_TYPE, metrixDslData.getBatteryContingenciesMap());
110112
checkMetrixDslContingencies(contingencyIds, LOAD_TYPE, metrixDslData.getLoadContingenciesMap());
111113
checkMetrixDslContingencies(contingencyIds, PHASE_TAP_CHANGER_TYPE, metrixDslData.getPtcContingenciesMap());
112114
}

metrix-integration/src/main/java/com/powsybl/metrix/integration/dataGenerator/MetrixInputData.java

Lines changed: 48 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.powsybl.iidm.network.TieLine;
2626
import com.powsybl.iidm.network.TwoWindingsTransformer;
2727
import com.powsybl.iidm.network.extensions.HvdcAngleDroopActivePowerControl;
28+
import com.powsybl.metrix.integration.MetrixBatteriesBinding;
2829
import com.powsybl.metrix.integration.MetrixDslData;
2930
import com.powsybl.metrix.integration.MetrixSection;
3031
import com.powsybl.metrix.integration.MetrixSubset;
@@ -1352,17 +1353,51 @@ private void getGeneratorBindings(Collection<MetrixGeneratorsBinding> bindings,
13521353
}
13531354
}
13541355

1355-
private void writeGeneratorsBindings(MetrixDie die) {
1356-
if (dslData != null) {
1357-
Collection<MetrixGeneratorsBinding> bindings = dslData.getGeneratorsBindingsValues();
1356+
private void getBatteryBindings(Collection<MetrixBatteriesBinding> bindings,
1357+
List<String> gbindnom,
1358+
List<Integer> gbindref,
1359+
List<Integer> gbinddef) {
1360+
for (MetrixBatteriesBinding binding : bindings) {
1361+
List<Integer> idList = new ArrayList<>();
1362+
for (String generatorId : binding.getBatteriesIds()) {
1363+
try {
1364+
idList.add(metrixNetwork.getIndex(MetrixSubset.GROUPE, generatorId));
1365+
} catch (IllegalStateException ise) {
1366+
if (LOGGER.isWarnEnabled()) {
1367+
LOGGER.warn("battery group '{}' : battery '{}' not found", binding.getName(), generatorId);
1368+
}
1369+
}
1370+
}
13581371

1359-
if (!bindings.isEmpty()) {
1372+
if (idList.size() > 1) {
1373+
gbindnom.add(binding.getName());
1374+
gbindref.add(binding.getReference().getType());
1375+
gbinddef.add(idList.size());
1376+
gbinddef.addAll(idList);
1377+
} else if (LOGGER.isWarnEnabled()) {
1378+
LOGGER.warn("battery group '{}' ignored because it contains too few elements ({})", binding.getName(), idList.size());
1379+
}
1380+
1381+
}
1382+
}
13601383

1384+
private void writeGeneratorsAndBatteriesBindings(MetrixDie die) {
1385+
if (dslData != null) {
1386+
Collection<MetrixGeneratorsBinding> generatorBindings = dslData.getGeneratorsBindingsValues();
1387+
Collection<MetrixBatteriesBinding> batterybindings = dslData.getBatteriesBindingsValues();
1388+
1389+
if (!generatorBindings.isEmpty() || !batterybindings.isEmpty()) {
13611390
List<String> gbindnom = new ArrayList<>();
13621391
List<Integer> gbindref = new ArrayList<>();
13631392
List<Integer> gbinddef = new ArrayList<>();
13641393

1365-
getGeneratorBindings(bindings, gbindnom, gbindref, gbinddef);
1394+
if (!generatorBindings.isEmpty()) {
1395+
getGeneratorBindings(generatorBindings, gbindnom, gbindref, gbinddef);
1396+
}
1397+
1398+
if (!batterybindings.isEmpty()) {
1399+
getBatteryBindings(batterybindings, gbindnom, gbindref, gbinddef);
1400+
}
13661401

13671402
die.setInt("NBGBINDS", gbindnom.size());
13681403
die.setStringArray("GBINDNOM", gbindnom.toArray(new String[0]));
@@ -1433,7 +1468,7 @@ private void write(Path dir, boolean writeJson, BufferedWriter writer, boolean c
14331468
writeContingencyFlowResults(die);
14341469
writeDetailedMarginalVariations(die);
14351470
writeSections(die);
1436-
writeGeneratorsBindings(die);
1471+
writeGeneratorsAndBatteriesBindings(die);
14371472
writeLoadsBindings(die);
14381473

14391474
if (writeJson && dir != null) {
@@ -1485,10 +1520,16 @@ public int maxResultNumberEstimate() {
14851520
nbTimeSeries += dslData.getHvdcContingenciesList().stream().mapToInt(s -> dslData.getHvdcContingencies(s).size()).sum();
14861521
// Generator adequacy, preventive and curative results
14871522
if (parameters.isWithAdequacyResults().orElse(false)) {
1488-
nbTimeSeries += dslData.getGeneratorsForAdequacy().isEmpty() ? trnbgrou : dslData.getGeneratorsForAdequacy().size();
1523+
nbTimeSeries += dslData.getGeneratorsForAdequacy().isEmpty() ? metrixNetwork.getGeneratorList().size() : dslData.getGeneratorsForAdequacy().size();
14891524
}
14901525
nbTimeSeries += dslData.getGeneratorsForRedispatching().size();
14911526
nbTimeSeries += dslData.getGeneratorContingenciesList().stream().mapToInt(s -> dslData.getGeneratorContingencies(s).size()).sum();
1527+
// Battery adequacy, preventive and curative results
1528+
if (parameters.isWithAdequacyResults().orElse(false)) {
1529+
nbTimeSeries += dslData.getBatteriesForAdequacy().isEmpty() ? metrixNetwork.getBatteryList().size() : dslData.getBatteriesForAdequacy().size();
1530+
}
1531+
nbTimeSeries += dslData.getBatteriesForRedispatching().size();
1532+
nbTimeSeries += dslData.getBatteryContingenciesList().stream().mapToInt(s -> dslData.getBatteryContingencies(s).size()).sum();
14921533
// Load curative only results
14931534
nbTimeSeries += dslData.getCurativeLoadsList().stream().mapToInt(s -> dslData.getLoadContingencies(s).size()).sum();
14941535
//Marginal variation results

metrix-integration/src/test/java/com/powsybl/metrix/integration/MetrixDslDataLoaderTest.java

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ void setUp() throws Exception {
8787
fileSystem = Jimfs.newFileSystem(Configuration.unix());
8888
dslFile = fileSystem.getPath("/test.dsl");
8989
mappingFile = fileSystem.getPath("/mapping.dsl");
90-
network = NetworkSerDe.read(Objects.requireNonNull(getClass().getResourceAsStream("/simpleNetwork.xml")));
90+
network = NetworkSerDe.read(Objects.requireNonNull(getClass().getResourceAsStream("/simpleNetwork_with_battery.xml")));
9191

9292
// Create mapping file for use in all tests
9393
try (Writer writer = Files.newBufferedWriter(mappingFile, StandardCharsets.UTF_8)) {
@@ -151,6 +151,7 @@ void testWrongConfigurations() throws IOException {
151151
"ts4", Set.of(mk8)
152152
));
153153
expectedTsConfig.setUnmappedGenerators(Set.of("FSSV.O11_G", "FVALDI11_G", "FSSV.O12_G", "FVERGE11_G"));
154+
expectedTsConfig.setUnmappedBatteries(Set.of("FP.AND1_BATTERY"));
154155
expectedTsConfig.setUnmappedLoads(Set.of("FSSV.O11_L", "FVALDI11_L", "FVALDI11_L2"));
155156
expectedTsConfig.setUnmappedHvdcLines(Set.of("HVDC1", "HVDC2"));
156157
expectedTsConfig.setUnmappedPhaseTapChangers(Set.of("FP.AND1 FTDPRA1 1"));
@@ -252,6 +253,7 @@ void testAutomaticList() throws IOException {
252253
// Compare TimeSeriesMappingConfig
253254
TimeSeriesMappingConfig expectedTsConfig = new TimeSeriesMappingConfig();
254255
expectedTsConfig.setUnmappedGenerators(generatorSet);
256+
expectedTsConfig.setUnmappedBatteries(Set.of("FP.AND1_BATTERY"));
255257
expectedTsConfig.setUnmappedLoads(Set.of("FSSV.O11_L", "FVALDI11_L", "FVALDI11_L2"));
256258
expectedTsConfig.setUnmappedHvdcLines(hvdcSet);
257259
expectedTsConfig.setUnmappedPhaseTapChangers(Set.of("FP.AND1 FTDPRA1 1"));
@@ -320,29 +322,35 @@ void testAutomaticList() throws IOException {
320322
void testListAsParameter() throws IOException {
321323

322324
try (Writer writer = Files.newBufferedWriter(dslFile, StandardCharsets.UTF_8)) {
323-
writer.write(String.join(System.lineSeparator(),
324-
"def contingenciesList = network.branches.collect()",
325-
"branch('FP.AND1 FVERGE1 1') {",
326-
" contingencyFlowResults contingenciesList",
327-
"}",
328-
"generator('FSSV.O11_G') {",
329-
" redispatchingDownCosts (-10)",
330-
" redispatchingUpCosts 100",
331-
" onContingencies contingenciesList",
332-
"}",
333-
"hvdc('HVDC1') {",
334-
" controlType OPTIMIZED",
335-
" onContingencies contingenciesList",
336-
"}",
337-
"phaseShifter('FP.AND1 FTDPRA1 1') {",
338-
" controlType OPTIMIZED_ANGLE_CONTROL",
339-
" onContingencies contingenciesList",
340-
"}",
341-
"load('FVALDI11_L') {",
342-
" curativeSheddingPercentage 50",
343-
" curativeSheddingCost 12345",
344-
" onContingencies contingenciesList",
345-
"}"));
325+
writer.write("""
326+
def contingenciesList = network.branches.collect()
327+
branch('FP.AND1 FVERGE1 1') {
328+
contingencyFlowResults contingenciesList
329+
}
330+
generator('FSSV.O11_G') {
331+
redispatchingDownCosts (-10)
332+
redispatchingUpCosts 100
333+
onContingencies contingenciesList
334+
}
335+
battery('FP.AND1_BATTERY') {
336+
redispatchingDownCosts (-10)
337+
redispatchingUpCosts 100
338+
onContingencies contingenciesList
339+
}
340+
hvdc('HVDC1') {
341+
controlType OPTIMIZED
342+
onContingencies contingenciesList
343+
}
344+
phaseShifter('FP.AND1 FTDPRA1 1') {
345+
controlType OPTIMIZED_ANGLE_CONTROL
346+
onContingencies contingenciesList
347+
}
348+
load('FVALDI11_L') {
349+
curativeSheddingPercentage 50
350+
curativeSheddingCost 12345
351+
onContingencies contingenciesList
352+
}
353+
""");
346354
}
347355

348356
ReadOnlyTimeSeriesStore store = new ReadOnlyTimeSeriesStoreCache();
@@ -351,6 +359,7 @@ void testListAsParameter() throws IOException {
351359

352360
assertEquals(13, data.getContingencyFlowResult("FP.AND1 FVERGE1 1").size());
353361
assertEquals(13, data.getGeneratorContingencies("FSSV.O11_G").size());
362+
assertEquals(13, data.getBatteryContingencies("FP.AND1_BATTERY").size());
354363
assertEquals(13, data.getHvdcContingencies("HVDC1").size());
355364
assertEquals(13, data.getPtcContingencies("FP.AND1 FTDPRA1 1").size());
356365
assertEquals(13, data.getLoadContingencies("FVALDI11_L").size());

metrix-integration/src/test/java/com/powsybl/metrix/integration/network/MetrixInputTest.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -338,9 +338,13 @@ void metrixInputTest() throws IOException {
338338
metrixDslData.addGeneratorForAdequacy("FSSV.O11_G");
339339
metrixDslData.addGeneratorForAdequacy("FVERGE11_G");
340340

341+
metrixDslData.addBatteryForAdequacy("FP.AND1_BATTERY");
342+
341343
metrixDslData.addGeneratorForRedispatching("FSSV.O11_G", List.of(cty2.getId(), cty4.getId(), "cty9"));
342344
metrixDslData.addGeneratorForRedispatching("FVALDI11_G", List.of("cty9"));
343345

346+
metrixDslData.addBatteryForRedispatching("FP.AND1_BATTERY", List.of("cty1"));
347+
344348
metrixDslData.addPreventiveLoad("FVALDI11_L", 20);
345349
metrixDslData.addPreventiveLoadCost("FVALDI11_L", 20);
346350

@@ -356,7 +360,7 @@ void metrixInputTest() throws IOException {
356360
metrixDslData.addGeneratorsBinding("1 generator group", ImmutableSet.of("FSSV.O11_G", "TOTO"));
357361
metrixDslData.addGeneratorsBinding("2 generator group", ImmutableSet.of("FSSV.O11_G", "FSSV.O12_G"));
358362
metrixDslData.addGeneratorsBinding("3 generator group", ImmutableSet.of("FSSV.O12_G", "FVALDI11_G", "FVERGE11_G"), MetrixGeneratorsBinding.ReferenceVariable.POBJ);
359-
metrixDslData.addBatteriesBinding("MSA", ImmutableSet.of("FP.AND1_BATTERY", "MSA"));
363+
metrixDslData.addBatteriesBinding("1 battery group", ImmutableSet.of("FP.AND1_BATTERY"));
360364
metrixDslData.addLoadsBinding("1 load group", ImmutableSet.of("FVALDI11_L", "TOTO"));
361365
metrixDslData.addLoadsBinding("2 load group", ImmutableSet.of("FVALDI11_L", "FVALDI11_L2"));
362366
metrixDslData.addLoadsBinding("3 load group", ImmutableSet.of("FSSV.O11_L", "FVERGE11_L", "FVALDI11_L2"));
@@ -426,8 +430,8 @@ void metrixInputTest() throws IOException {
426430

427431
// 175 = 13 branches * 13 (N, 2*5 Nk, 2*Itam) + 5 detailed + 1 section
428432
assertEquals(175, inputData.minResultNumberEstimate());
429-
// 315 = 175 + (2adcy, 2prev, 4cur) gen + 2pst cur + (1prev, 5cur) hvdc + 4 load cur + (12*9 + 1section + 1hvdc + 2*5 detailed)marg.var.
430-
assertEquals(315, inputData.maxResultNumberEstimate());
433+
// 315 = 175 + (2adcy, 2prev, 4cur) gen + (1adcy, 1prev, 1cur) battery + 2pst cur + (1prev, 5cur) hvdc + 4 load cur + (12*9 + 1section + 1hvdc + 2*5 detailed)marg.var.
434+
assertEquals(318, inputData.maxResultNumberEstimate());
431435

432436
inputData.writeJson(writer);
433437
writer.close();

0 commit comments

Comments
 (0)