GlskPointScalableConverterTest.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.api.util.converters;
import com.powsybl.glsk.api.GlskPoint;
import com.powsybl.glsk.cim.CimGlskDocument;
import com.powsybl.iidm.modification.scalable.Scalable;
import com.powsybl.iidm.network.Network;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.io.InputStream;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
/**
* @author Pengbo Wang {@literal <pengbo.wang@rte-international.com>}
* @author Peter Mitri {@literal <peter.mitri@rte-france.com>}
*/
class GlskPointScalableConverterTest {
private static final double DOUBLE_TOLERANCE = 1e-3;
private static final double FUZZY_TOLERANCE = 0.5;
private Network testNetwork;
private InputStream getResourceAsStream(String resource) {
return getClass().getResourceAsStream(resource);
}
@BeforeEach
void setUp() {
testNetwork = Network.read("testCase.xiidm", getClass().getResourceAsStream("/testCase.xiidm"));
}
/**
* test for Scalable
*/
@Test
void testConvertGlskPointToScalableB45MeritOrder() {
GlskPoint glsk = CimGlskDocument.importGlsk(getResourceAsStream("/GlskB45test.xml")).getGlskPoints().get(0);
Scalable scalable = GlskPointScalableConverter.convert(testNetwork, glsk);
assertNotNull(scalable);
assertEquals(2000., testNetwork.getGenerator("FFR1AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(2000., testNetwork.getGenerator("FFR2AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(3000., testNetwork.getGenerator("FFR3AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(1000., testNetwork.getLoad("FFR1AA1 _load").getP0(), DOUBLE_TOLERANCE);
assertEquals(3500., testNetwork.getLoad("FFR2AA1 _load").getP0(), DOUBLE_TOLERANCE);
assertEquals(1500., testNetwork.getLoad("FFR3AA1 _load").getP0(), DOUBLE_TOLERANCE);
double done = scalable.scale(testNetwork, 100.);
assertEquals(6., done, DOUBLE_TOLERANCE);
assertEquals(2001., testNetwork.getGenerator("FFR1AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(2002., testNetwork.getGenerator("FFR2AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(3003., testNetwork.getGenerator("FFR3AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(1000., testNetwork.getLoad("FFR1AA1 _load").getP0(), DOUBLE_TOLERANCE); // untouched
assertEquals(3500., testNetwork.getLoad("FFR2AA1 _load").getP0(), DOUBLE_TOLERANCE); // untouched
assertEquals(1500., testNetwork.getLoad("FFR3AA1 _load").getP0(), DOUBLE_TOLERANCE); // untouched
done = scalable.scale(testNetwork, -3000.0);
assertEquals(-3000., done, DOUBLE_TOLERANCE);
assertEquals(0., testNetwork.getGenerator("FFR1AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(1003., testNetwork.getGenerator("FFR2AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(3003., testNetwork.getGenerator("FFR3AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(1000., testNetwork.getLoad("FFR1AA1 _load").getP0(), DOUBLE_TOLERANCE); // untouched
assertEquals(3500., testNetwork.getLoad("FFR2AA1 _load").getP0(), DOUBLE_TOLERANCE); // untouched
assertEquals(1500., testNetwork.getLoad("FFR3AA1 _load").getP0(), DOUBLE_TOLERANCE); // untouched
}
@Test
void testConvertGlskPointToScalableB42Country() {
GlskPoint glsk = CimGlskDocument.importGlsk(getResourceAsStream("/GlskB42CountryIIDM.xml")).getGlskPoints().get(0);
Scalable scalable = GlskPointScalableConverter.convert(testNetwork, glsk);
assertNotNull(scalable);
assertEquals(2000., testNetwork.getGenerator("FFR1AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(2000., testNetwork.getGenerator("FFR2AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(3000., testNetwork.getGenerator("FFR3AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(1000., testNetwork.getLoad("FFR1AA1 _load").getP0(), DOUBLE_TOLERANCE);
assertEquals(3500., testNetwork.getLoad("FFR2AA1 _load").getP0(), DOUBLE_TOLERANCE);
assertEquals(1500., testNetwork.getLoad("FFR3AA1 _load").getP0(), DOUBLE_TOLERANCE);
double done = scalable.scale(testNetwork, 700.);
assertEquals(700., done, DOUBLE_TOLERANCE);
assertEquals(2200., testNetwork.getGenerator("FFR1AA1 _generator").getTargetP(), DOUBLE_TOLERANCE); // 2000/7000 * 700 = +200
assertEquals(2200., testNetwork.getGenerator("FFR2AA1 _generator").getTargetP(), DOUBLE_TOLERANCE); // 2000/7000 * 700 = +200
assertEquals(3300., testNetwork.getGenerator("FFR3AA1 _generator").getTargetP(), DOUBLE_TOLERANCE); // 3000/7000 * 700 = +300
assertEquals(1000., testNetwork.getLoad("FFR1AA1 _load").getP0(), DOUBLE_TOLERANCE); // untouched
assertEquals(3500., testNetwork.getLoad("FFR2AA1 _load").getP0(), DOUBLE_TOLERANCE); // untouched
assertEquals(1500., testNetwork.getLoad("FFR3AA1 _load").getP0(), DOUBLE_TOLERANCE); // untouched
}
@Test
void testConvertGlskPointToScalableB42CountryGskLsk() {
GlskPoint glsk = CimGlskDocument.importGlsk(getResourceAsStream("/GlskB42CountryGskLsk.xml")).getGlskPoints().get(0);
Scalable scalable = GlskPointScalableConverter.convert(testNetwork, glsk);
assertNotNull(scalable);
assertEquals(2000., testNetwork.getGenerator("FFR1AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(2000., testNetwork.getGenerator("FFR2AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(3000., testNetwork.getGenerator("FFR3AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(1000., testNetwork.getLoad("FFR1AA1 _load").getP0(), DOUBLE_TOLERANCE);
assertEquals(3500., testNetwork.getLoad("FFR2AA1 _load").getP0(), DOUBLE_TOLERANCE);
assertEquals(1500., testNetwork.getLoad("FFR3AA1 _load").getP0(), DOUBLE_TOLERANCE);
double done = scalable.scale(testNetwork, -1000.);
assertEquals(-1000., done, DOUBLE_TOLERANCE);
assertEquals(1829., testNetwork.getGenerator("FFR1AA1 _generator").getTargetP(), FUZZY_TOLERANCE); // 2000/7000 * 0.6 = 17.1 %
assertEquals(1829., testNetwork.getGenerator("FFR2AA1 _generator").getTargetP(), FUZZY_TOLERANCE); // 2000/7000 * 0.6 = 17.1 %
assertEquals(2743., testNetwork.getGenerator("FFR3AA1 _generator").getTargetP(), FUZZY_TOLERANCE); // 3000/7000 * 0.6 = 25.7 %
assertEquals(1067., testNetwork.getLoad("FFR1AA1 _load").getP0(), FUZZY_TOLERANCE); // 1000/6000 * 0.4 = 6.7 %
assertEquals(3733., testNetwork.getLoad("FFR2AA1 _load").getP0(), FUZZY_TOLERANCE); // 3500/6000 * 0.4 = 23.3 %
assertEquals(1600., testNetwork.getLoad("FFR3AA1 _load").getP0(), FUZZY_TOLERANCE); // 1500/6000 * 0.4 = 10 %
}
@Test
void testConvertGlskPointToScalableB42ExplicitGskLsk() {
GlskPoint glsk = CimGlskDocument.importGlsk(getResourceAsStream("/GlskB42ExplicitGskLsk.xml")).getGlskPoints().get(0);
Scalable scalable = GlskPointScalableConverter.convert(testNetwork, glsk);
assertNotNull(scalable);
assertEquals(2000., testNetwork.getGenerator("FFR1AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(2000., testNetwork.getGenerator("FFR2AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(3000., testNetwork.getGenerator("FFR3AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(1000., testNetwork.getLoad("FFR1AA1 _load").getP0(), DOUBLE_TOLERANCE);
assertEquals(3500., testNetwork.getLoad("FFR2AA1 _load").getP0(), DOUBLE_TOLERANCE);
assertEquals(1500., testNetwork.getLoad("FFR3AA1 _load").getP0(), DOUBLE_TOLERANCE);
double done = scalable.scale(testNetwork, 1000.);
assertEquals(1000., done, DOUBLE_TOLERANCE);
assertEquals(2300., testNetwork.getGenerator("FFR1AA1 _generator").getTargetP(), DOUBLE_TOLERANCE); // 2000/4000 * 0.6 = 30 %
assertEquals(2300., testNetwork.getGenerator("FFR2AA1 _generator").getTargetP(), DOUBLE_TOLERANCE); // 2000/4000 * 0.6 = 30 %
assertEquals(3000., testNetwork.getGenerator("FFR3AA1 _generator").getTargetP(), DOUBLE_TOLERANCE); // excluded
assertEquals(1000., testNetwork.getLoad("FFR1AA1 _load").getP0(), DOUBLE_TOLERANCE); // excluded
assertEquals(3220., testNetwork.getLoad("FFR2AA1 _load").getP0(), DOUBLE_TOLERANCE); // 3500/5000 * 0.4 = 28 %
assertEquals(1380., testNetwork.getLoad("FFR3AA1 _load").getP0(), DOUBLE_TOLERANCE); // 1500/5000 * 0.4 = 12 %
}
@Test
void testConvertGlskPointToScalableB43GskLsk() {
GlskPoint glsk = CimGlskDocument.importGlsk(getResourceAsStream("/GlskB43ParticipationFactorGskLsk.xml")).getGlskPoints().get(0);
Scalable scalable = GlskPointScalableConverter.convert(testNetwork, glsk);
assertNotNull(scalable);
assertEquals(2000., testNetwork.getGenerator("FFR1AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(2000., testNetwork.getGenerator("FFR2AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(3000., testNetwork.getGenerator("FFR3AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(1000., testNetwork.getLoad("FFR1AA1 _load").getP0(), DOUBLE_TOLERANCE);
assertEquals(3500., testNetwork.getLoad("FFR2AA1 _load").getP0(), DOUBLE_TOLERANCE);
assertEquals(1500., testNetwork.getLoad("FFR3AA1 _load").getP0(), DOUBLE_TOLERANCE);
double done = scalable.scale(testNetwork, 500.);
assertEquals(500., done, DOUBLE_TOLERANCE);
assertEquals(2210., testNetwork.getGenerator("FFR1AA1 _generator").getTargetP(), DOUBLE_TOLERANCE); // 0.7 * 0.6 = 42 %
assertEquals(2090., testNetwork.getGenerator("FFR2AA1 _generator").getTargetP(), DOUBLE_TOLERANCE); // 0.3 * 0.6 = 18 %
assertEquals(3000., testNetwork.getGenerator("FFR3AA1 _generator").getTargetP(), DOUBLE_TOLERANCE); // untouched
assertEquals(960., testNetwork.getLoad("FFR1AA1 _load").getP0(), DOUBLE_TOLERANCE); // 0.2 * 0.4 = 8 %
assertEquals(3340., testNetwork.getLoad("FFR2AA1 _load").getP0(), DOUBLE_TOLERANCE); // 0.8 * 0.4 = 32 %
assertEquals(1500., testNetwork.getLoad("FFR3AA1 _load").getP0(), DOUBLE_TOLERANCE); // untouched
}
@Test
void testConvertGlskPointToScalableB42Explicit() {
GlskPoint glsk = CimGlskDocument.importGlsk(getResourceAsStream("/GlskB42ExplicitIIDM.xml")).getGlskPoints().get(0);
Scalable scalable = GlskPointScalableConverter.convert(testNetwork, glsk);
assertNotNull(scalable);
assertEquals(2000., testNetwork.getGenerator("FFR1AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(2000., testNetwork.getGenerator("FFR2AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(3000., testNetwork.getGenerator("FFR3AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(1000., testNetwork.getLoad("FFR1AA1 _load").getP0(), DOUBLE_TOLERANCE);
assertEquals(3500., testNetwork.getLoad("FFR2AA1 _load").getP0(), DOUBLE_TOLERANCE);
assertEquals(1500., testNetwork.getLoad("FFR3AA1 _load").getP0(), DOUBLE_TOLERANCE);
double done = scalable.scale(testNetwork, -500.);
assertEquals(-500., done, DOUBLE_TOLERANCE);
assertEquals(1800., testNetwork.getGenerator("FFR1AA1 _generator").getTargetP(), DOUBLE_TOLERANCE); // 2000/5000 * 500 = -200
assertEquals(2000., testNetwork.getGenerator("FFR2AA1 _generator").getTargetP(), DOUBLE_TOLERANCE); // untouched
assertEquals(2700., testNetwork.getGenerator("FFR3AA1 _generator").getTargetP(), DOUBLE_TOLERANCE); // 3000/5000 * 500 = -300
assertEquals(1000., testNetwork.getLoad("FFR1AA1 _load").getP0(), DOUBLE_TOLERANCE); // untouched
assertEquals(3500., testNetwork.getLoad("FFR2AA1 _load").getP0(), DOUBLE_TOLERANCE); // untouched
assertEquals(1500., testNetwork.getLoad("FFR3AA1 _load").getP0(), DOUBLE_TOLERANCE); // untouched
}
@Test
void testConvertGlskPointToScalableB43() {
GlskPoint glsk = CimGlskDocument.importGlsk(getResourceAsStream("/GlskB43ParticipationFactorIIDM.xml")).getGlskPoints().get(0);
Scalable scalable = GlskPointScalableConverter.convert(testNetwork, glsk);
assertNotNull(scalable);
assertEquals(2000., testNetwork.getGenerator("FFR1AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(2000., testNetwork.getGenerator("FFR2AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(3000., testNetwork.getGenerator("FFR3AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(1000., testNetwork.getLoad("FFR1AA1 _load").getP0(), DOUBLE_TOLERANCE);
assertEquals(3500., testNetwork.getLoad("FFR2AA1 _load").getP0(), DOUBLE_TOLERANCE);
assertEquals(1500., testNetwork.getLoad("FFR3AA1 _load").getP0(), DOUBLE_TOLERANCE);
double done = scalable.scale(testNetwork, 1000.);
assertEquals(1000., done, DOUBLE_TOLERANCE);
assertEquals(2382., testNetwork.getGenerator("FFR1AA1 _generator").getTargetP(), FUZZY_TOLERANCE); // 0.618/(0.618+0.618+0.382) = 38.2 %
assertEquals(2382., testNetwork.getGenerator("FFR2AA1 _generator").getTargetP(), FUZZY_TOLERANCE); // 0.618/(0.618+0.618+0.382) = 38.2 %
assertEquals(3236., testNetwork.getGenerator("FFR3AA1 _generator").getTargetP(), FUZZY_TOLERANCE); // 0.382/(0.618+0.618+0.382) = 23.6 %
assertEquals(1000., testNetwork.getLoad("FFR1AA1 _load").getP0(), DOUBLE_TOLERANCE); // untouched
assertEquals(3500., testNetwork.getLoad("FFR2AA1 _load").getP0(), DOUBLE_TOLERANCE); // untouched
assertEquals(1500., testNetwork.getLoad("FFR3AA1 _load").getP0(), DOUBLE_TOLERANCE); // untouched
}
@Test
void testConvertGlskPointToScalableB42ExplicitGskLskWithDanglingLines() {
testNetwork = Network.read("testCaseWithDanglingLines.xiidm", getClass().getResourceAsStream("/testCaseWithDanglingLines.xiidm"));
GlskPoint glsk = CimGlskDocument.importGlsk(getResourceAsStream("/GlskB42ExplicitWithDanglingLines.xml")).getGlskPoints().get(0);
Scalable scalable = GlskPointScalableConverter.convert(testNetwork, glsk);
assertNotNull(scalable);
assertEquals(2000., testNetwork.getGenerator("FFR1AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(2000., testNetwork.getGenerator("FFR2AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(3000., testNetwork.getGenerator("FFR3AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(-1000., testNetwork.getDanglingLine("DDE3AA1 XNODE_1A 1").getP0(), DOUBLE_TOLERANCE);
assertEquals(1000., testNetwork.getLoad("FFR1AA1 _load").getP0(), DOUBLE_TOLERANCE);
assertEquals(3500., testNetwork.getLoad("FFR2AA1 _load").getP0(), DOUBLE_TOLERANCE);
assertEquals(1500., testNetwork.getLoad("FFR3AA1 _load").getP0(), DOUBLE_TOLERANCE);
assertEquals(1000., testNetwork.getDanglingLine("BBE2AA1 XNODE_1B 1").getP0(), DOUBLE_TOLERANCE);
double done = scalable.scale(testNetwork, -1000.);
assertEquals(-1000., done, DOUBLE_TOLERANCE);
assertEquals(1850., testNetwork.getGenerator("FFR1AA1 _generator").getTargetP(), FUZZY_TOLERANCE); // 2/8 * 0.6 = 15 %
assertEquals(1850., testNetwork.getGenerator("FFR2AA1 _generator").getTargetP(), FUZZY_TOLERANCE); // 2/8 * 0.6 = 15 %
assertEquals(2775., testNetwork.getGenerator("FFR3AA1 _generator").getTargetP(), FUZZY_TOLERANCE); // 3/8 * 0.6 = 22.5 %
assertEquals(-925., testNetwork.getDanglingLine("DDE3AA1 XNODE_1A 1").getP0(), FUZZY_TOLERANCE); // 1/8 * 0.6 = 7.5 %
assertEquals(1057., testNetwork.getLoad("FFR1AA1 _load").getP0(), FUZZY_TOLERANCE); // 1/7 * 0.4 = 5.7 %
assertEquals(3700., testNetwork.getLoad("FFR2AA1 _load").getP0(), FUZZY_TOLERANCE); // 3.5/7 * 0.4 = 20 %
assertEquals(1586., testNetwork.getLoad("FFR3AA1 _load").getP0(), FUZZY_TOLERANCE); // 1.5/7 * 0.4 = 8.6 %
assertEquals(1057., testNetwork.getDanglingLine("BBE2AA1 XNODE_1B 1").getP0(), FUZZY_TOLERANCE); // 1/7 * 0.4 = 5.7 %
}
@Test
void testConvertGlskPointToScalableB43GskLskWithDanglingLines() {
testNetwork = Network.read("testCaseWithDanglingLines.xiidm", getClass().getResourceAsStream("/testCaseWithDanglingLines.xiidm"));
GlskPoint glsk = CimGlskDocument.importGlsk(getResourceAsStream("/GlskB43ParticipationFactorGskLskWithDanglingLines.xml")).getGlskPoints().get(0);
Scalable scalable = GlskPointScalableConverter.convert(testNetwork, glsk);
assertNotNull(scalable);
assertEquals(2000., testNetwork.getGenerator("FFR1AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(-1000., testNetwork.getDanglingLine("DDE3AA1 XNODE_1A 1").getP0(), DOUBLE_TOLERANCE);
assertEquals(1000., testNetwork.getLoad("FFR1AA1 _load").getP0(), DOUBLE_TOLERANCE);
assertEquals(1000., testNetwork.getDanglingLine("BBE2AA1 XNODE_1B 1").getP0(), DOUBLE_TOLERANCE);
double done = scalable.scale(testNetwork, 1000.);
assertEquals(1000., done, DOUBLE_TOLERANCE);
assertEquals(2420., testNetwork.getGenerator("FFR1AA1 _generator").getTargetP(), DOUBLE_TOLERANCE); // 0.6 * 0.7 = 42 %
assertEquals(-1180., testNetwork.getDanglingLine("DDE3AA1 XNODE_1A 1").getP0(), DOUBLE_TOLERANCE); // 0.6 * 0.3 = 18 %
assertEquals(840., testNetwork.getLoad("FFR1AA1 _load").getP0(), DOUBLE_TOLERANCE); // 0.4 * 0.4 = 16 %
assertEquals(760., testNetwork.getDanglingLine("BBE2AA1 XNODE_1B 1").getP0(), DOUBLE_TOLERANCE); // 0.4 * 0.6 = 24 %
}
@Test
void testNullPercentageSum() {
GlskPoint glsk = CimGlskDocument.importGlsk(getResourceAsStream("/GlskB43ParticipationFactorGskLskZeroSum.xml")).getGlskPoints().get(0);
Scalable scalable = GlskPointScalableConverter.convert(testNetwork, glsk);
assertNotNull(scalable);
assertEquals(2000., testNetwork.getGenerator("FFR1AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(2000., testNetwork.getGenerator("FFR2AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(3000., testNetwork.getGenerator("FFR3AA1 _generator").getTargetP(), DOUBLE_TOLERANCE);
assertEquals(1000., testNetwork.getLoad("FFR1AA1 _load").getP0(), DOUBLE_TOLERANCE);
assertEquals(3500., testNetwork.getLoad("FFR2AA1 _load").getP0(), DOUBLE_TOLERANCE);
assertEquals(1500., testNetwork.getLoad("FFR3AA1 _load").getP0(), DOUBLE_TOLERANCE);
double done = scalable.scale(testNetwork, 500.);
assertEquals(500., done, DOUBLE_TOLERANCE);
assertEquals(2350., testNetwork.getGenerator("FFR1AA1 _generator").getTargetP(), DOUBLE_TOLERANCE); // 0.7 * 1.0 = 70 %
assertEquals(2150., testNetwork.getGenerator("FFR2AA1 _generator").getTargetP(), DOUBLE_TOLERANCE); // 0.3 * 1.0 = 30 %
assertEquals(3000., testNetwork.getGenerator("FFR3AA1 _generator").getTargetP(), DOUBLE_TOLERANCE); // untouched
assertEquals(1000., testNetwork.getLoad("FFR1AA1 _load").getP0(), DOUBLE_TOLERANCE); // 0.0 * 0.0 = 0 %
assertEquals(3500., testNetwork.getLoad("FFR2AA1 _load").getP0(), DOUBLE_TOLERANCE); // 0.0 * 0.0 = 0 %
assertEquals(1500., testNetwork.getLoad("FFR3AA1 _load").getP0(), DOUBLE_TOLERANCE); // untouched
}
}