UcteGlskValueProviderTest.java
/*
* Copyright (c) 2020, 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.glsk.ucte;
import com.powsybl.glsk.api.GlskPoint;
import com.powsybl.glsk.api.util.converters.GlskPointScalableConverter;
import com.powsybl.glsk.commons.ZonalData;
import com.powsybl.iidm.modification.scalable.Scalable;
import com.powsybl.iidm.network.Generator;
import com.powsybl.iidm.network.Network;
import com.powsybl.sensitivity.SensitivityVariableSet;
import org.junit.jupiter.api.Test;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
/**
* FlowBased Glsk Values Provider Test for Ucte format
*
* @author Baptiste Seguinot {@literal <baptiste.seguinot at rte-france.com>}
* @author Peter Mitri {@literal <peter.mitri@rte-france.com>}
*/
class UcteGlskValueProviderTest {
private static final double EPSILON = 0.0001;
@Test
void testProvideOkUcteGlsk() {
Network network = Network.read("testCase.xiidm", getClass().getResourceAsStream("/testCase.xiidm"));
Instant instant = Instant.parse("2016-07-29T10:00:00Z");
ZonalData<SensitivityVariableSet> ucteGlskProvider = UcteGlskDocument.importGlsk(getClass().getResourceAsStream("/20170322_1844_SN3_FR2_GLSK_test.xml"))
.getZonalGlsks(network, instant);
assertEquals(3, ucteGlskProvider.getData("10YFR-RTE------C").getVariables().size());
assertEquals(0.3, ucteGlskProvider.getData("10YFR-RTE------C").getVariable("FFR1AA1 _generator").getWeight(), EPSILON);
}
@Test
void testProvideUcteGlskEmptyInstant() {
Network network = Network.read("testCase.xiidm", getClass().getResourceAsStream("/testCase.xiidm"));
Instant instant = Instant.parse("2020-07-29T10:00:00Z");
ZonalData<SensitivityVariableSet> ucteGlskProvider = UcteGlskDocument.importGlsk(getClass().getResourceAsStream("/20170322_1844_SN3_FR2_GLSK_test.xml"))
.getZonalGlsks(network, instant);
assertTrue(ucteGlskProvider.getDataPerZone().isEmpty());
}
@Test
void testProvideUcteGlskUnknownCountry() {
Network network = Network.read("testCase.xiidm", getClass().getResourceAsStream("/testCase.xiidm"));
Instant instant = Instant.parse("2016-07-29T10:00:00Z");
ZonalData<SensitivityVariableSet> ucteGlskProvider = UcteGlskDocument.importGlsk(getClass().getResourceAsStream("/20170322_1844_SN3_FR2_GLSK_test.xml"))
.getZonalGlsks(network, instant);
assertNull(ucteGlskProvider.getData("unknowncountry"));
}
@Test
void testProvideUcteGlskWithWrongFormat() {
Network network = Network.read("testCase.xiidm", getClass().getResourceAsStream("/testCase.xiidm"));
Instant instant = Instant.parse("2016-07-29T10:00:00Z");
ZonalData<SensitivityVariableSet> ucteGlskProvider = UcteGlskDocument.importGlsk(getClass().getResourceAsStream("/GlskCountry.xml"))
.getZonalGlsks(network, instant);
assertTrue(ucteGlskProvider.getDataPerZone().isEmpty());
}
@Test
void testMultiGskSeries() {
Network network = Network.read("testCase.xiidm", getClass().getResourceAsStream("/testCase.xiidm"));
Instant instant = Instant.parse("2016-07-29T10:00:00Z");
UcteGlskDocument ucteGlskDocument = UcteGlskDocument.importGlsk(getClass().getResourceAsStream("/TestMultiGskSeries.xml"));
ZonalData<Scalable> ucteScalableProvider = ucteGlskDocument.getZonalScalable(network, instant);
assertEquals(2, ucteScalableProvider.getData("10YFR-RTE------C").filterInjections(network).size());
assertTrue(ucteScalableProvider.getData("10YFR-RTE------C").filterInjections(network).contains(network.getGenerator("FFR1AA1 _generator")));
assertTrue(ucteScalableProvider.getData("10YFR-RTE------C").filterInjections(network).contains(network.getGenerator("FFR2AA1 _generator")));
ZonalData<SensitivityVariableSet> ucteGlskProvider = ucteGlskDocument.getZonalGlsks(network, instant);
assertEquals(2, ucteGlskProvider.getData("10YFR-RTE------C").getVariables().size());
assertEquals(0.5, ucteGlskProvider.getData("10YFR-RTE------C").getVariable("FFR1AA1 _generator").getWeight(), EPSILON);
assertEquals(0.5, ucteGlskProvider.getData("10YFR-RTE------C").getVariable("FFR2AA1 _generator").getWeight(), EPSILON);
}
@Test
void checkConversionOfMultiGskSeriesToScalable() {
Network network = Network.read("testCase.xiidm", getClass().getResourceAsStream("/testCase.xiidm"));
GlskPoint multiGlskSeries = UcteGlskDocument.importGlsk(getClass().getResourceAsStream("/ThreeGskSeries.xml")).getGlskPoints("10YFR-RTE------C").get(0);
Scalable scalable = GlskPointScalableConverter.convert(network, multiGlskSeries);
double generationBeforeScale = network.getGeneratorStream().mapToDouble(Generator::getTargetP).sum();
assertEquals(24500.0, generationBeforeScale, 0.1);
assertEquals(2000.0, network.getGenerator("FFR1AA1 _generator").getTargetP(), 0.1);
assertEquals(2000.0, network.getGenerator("FFR2AA1 _generator").getTargetP(), 0.1);
scalable.scale(network, 1000.0);
double generationAfterScale = network.getGeneratorStream().mapToDouble(Generator::getTargetP).sum();
assertEquals(25500.0, generationAfterScale, 0.1);
assertEquals(2700.0, network.getGenerator("FFR1AA1 _generator").getTargetP(), 0.1);
assertEquals(2300.0, network.getGenerator("FFR2AA1 _generator").getTargetP(), 0.1);
}
@Test
void testMultiShare() {
Network network = Network.read("testCase.xiidm", getClass().getResourceAsStream("/testCase.xiidm"));
UcteGlskDocument ucteGlskDocument = UcteGlskDocument.importGlsk(getClass().getResourceAsStream("/TestMultiShare2.xml"));
List<Instant> instants = new ArrayList<>();
instants.add(Instant.parse("2016-07-28T22:00:00Z"));
instants.add(Instant.parse("2016-07-29T10:00:00Z"));
instants.add(Instant.parse("2016-07-29T11:59:59Z"));
for (Instant i : instants) {
ZonalData<SensitivityVariableSet> ucteGlskProvidert = ucteGlskDocument.getZonalGlsks(network, i);
assertEquals(3, ucteGlskProvidert.getData("10YFR-RTE------C").getVariables().size());
assertEquals(0.3 * 1.0, ucteGlskProvidert.getData("10YFR-RTE------C").getVariable("FFR1AA1 _generator").getWeight(), EPSILON);
assertEquals(0.7 * 0.2, ucteGlskProvidert.getData("10YFR-RTE------C").getVariable("FFR1AA1 _load").getWeight(), EPSILON);
assertEquals(0.7 * 0.8, ucteGlskProvidert.getData("10YFR-RTE------C").getVariable("FFR2AA1 _load").getWeight(), EPSILON);
}
List<Instant> instants2 = new ArrayList<>();
instants2.add(Instant.parse("2016-07-29T12:00:00Z"));
instants2.add(Instant.parse("2016-07-29T16:00:00Z"));
instants2.add(Instant.parse("2016-07-29T18:59:59Z"));
for (Instant i : instants2) {
ZonalData<SensitivityVariableSet> ucteGlskProvidert = ucteGlskDocument.getZonalGlsks(network, i);
assertEquals(3, ucteGlskProvidert.getData("10YFR-RTE------C").getVariables().size());
assertEquals(0.5 * 1.0, ucteGlskProvidert.getData("10YFR-RTE------C").getVariable("FFR1AA1 _generator").getWeight(), EPSILON);
assertEquals(0.5 * 0.6, ucteGlskProvidert.getData("10YFR-RTE------C").getVariable("FFR1AA1 _load").getWeight(), EPSILON);
assertEquals(0.5 * 0.4, ucteGlskProvidert.getData("10YFR-RTE------C").getVariable("FFR2AA1 _load").getWeight(), EPSILON);
}
List<Instant> instants3 = new ArrayList<>();
instants3.add(Instant.parse("2016-07-29T19:00:00Z"));
instants3.add(Instant.parse("2016-07-29T21:00:00Z"));
instants3.add(Instant.parse("2016-07-29T21:59:59Z"));
for (Instant i : instants3) {
ZonalData<SensitivityVariableSet> ucteGlskProvidert = ucteGlskDocument.getZonalGlsks(network, i);
assertEquals(3, ucteGlskProvidert.getData("10YFR-RTE------C").getVariables().size());
assertEquals(0.3 * 1.0, ucteGlskProvidert.getData("10YFR-RTE------C").getVariable("FFR1AA1 _generator").getWeight(), EPSILON);
assertEquals(0.7 * 0.3, ucteGlskProvidert.getData("10YFR-RTE------C").getVariable("FFR1AA1 _load").getWeight(), EPSILON);
assertEquals(0.7 * 0.7, ucteGlskProvidert.getData("10YFR-RTE------C").getVariable("FFR2AA1 _load").getWeight(), EPSILON);
}
}
@Test
void testZeroGsk() {
Network network = Network.read("testCase.xiidm", getClass().getResourceAsStream("/testCase.xiidm"));
Instant instant = Instant.parse("2016-07-29T10:00:00Z");
UcteGlskDocument ucteGlskDocument = UcteGlskDocument.importGlsk(getClass().getResourceAsStream("/TestZeroGsk.xml"));
ZonalData<SensitivityVariableSet> ucteGlskProvider = ucteGlskDocument.getZonalGlsks(network, instant);
assertNull(ucteGlskProvider.getData("10YFR-RTE------C"));
}
@Test
void testZeroLsk() {
Network network = Network.read("testCase.xiidm", getClass().getResourceAsStream("/testCase.xiidm"));
Instant instant = Instant.parse("2016-07-29T10:00:00Z");
UcteGlskDocument ucteGlskDocument = UcteGlskDocument.importGlsk(getClass().getResourceAsStream("/TestZeroLsk.xml"));
ZonalData<SensitivityVariableSet> ucteGlskProvider = ucteGlskDocument.getZonalGlsks(network, instant);
assertNull(ucteGlskProvider.getData("10YFR-RTE------C"));
}
@Test
void testWithDanglingLines() {
Network network = Network.read("testCaseWithDanglingLines.xiidm", getClass().getResourceAsStream("/testCaseWithDanglingLines.xiidm"));
Instant instant = Instant.parse("2016-07-29T10:00:00Z");
UcteGlskDocument ucteGlskDocument = UcteGlskDocument.importGlsk(getClass().getResourceAsStream("/GlskWithDanglingLines.xml"));
ZonalData<SensitivityVariableSet> ucteGlskProvider = ucteGlskDocument.getZonalGlsks(network, instant);
SensitivityVariableSet linearGlsk = ucteGlskProvider.getData("10YFR-RTE------C");
assertNotNull(linearGlsk);
assertEquals(5, linearGlsk.getVariables().size());
assertEquals(0.2, linearGlsk.getVariable("FFR1AA1 _generator").getWeight(), EPSILON); // 2000/3000 * 0.3 = 0.2
assertEquals(0.1, linearGlsk.getVariable("DDE3AA1 XNODE_1A 1").getWeight(), EPSILON); // 1000/3000 * 0.3 = 0.1
assertEquals(0.1272, linearGlsk.getVariable("FFR1AA1 _load").getWeight(), EPSILON); // 1000/5500 * 0.7 = 0.1272
assertEquals(0.4454, linearGlsk.getVariable("FFR2AA1 _load").getWeight(), EPSILON); // 3500/5500 * 0.7 = 0.4454
assertEquals(0.1272, linearGlsk.getVariable("BBE2AA1 XNODE_1B 1").getWeight(), EPSILON); // 1000/5500 * 0.7 = 0.1272
}
}