diff --git a/open-reac/src/test/java/com/powsybl/openreac/OpenReacResultsTest.java b/open-reac/src/test/java/com/powsybl/openreac/OpenReacResultsTest.java index 3f736fdc..d63a89f9 100644 --- a/open-reac/src/test/java/com/powsybl/openreac/OpenReacResultsTest.java +++ b/open-reac/src/test/java/com/powsybl/openreac/OpenReacResultsTest.java @@ -77,7 +77,7 @@ void testTransformerTargetVUpdateWithoutRegulationBus() throws IOException { @Test void testShuntTargetVUpdateWithoutVoltageResult() throws IOException { - Network network = ShuntNetworkFactory.create(); + Network network = ShuntNetworkFactory.createWithNonLinearModel(); ShuntCompensator shunt = network.getShuntCompensator("SHUNT"); String regulatedBusId = shunt.getRegulatingTerminal().getBusView().getBus().getId(); @@ -91,7 +91,7 @@ void testShuntTargetVUpdateWithoutVoltageResult() throws IOException { @Test void testShuntUpdateWithoutRegulationBus() throws IOException { - Network network = ShuntNetworkFactory.create(); + Network network = ShuntNetworkFactory.createWithNonLinearModel(); ShuntCompensator shunt = network.getShuntCompensator("SHUNT"); shunt.getRegulatingTerminal().disconnect(); diff --git a/open-reac/src/test/java/com/powsybl/openreac/OpenReacRunnerTest.java b/open-reac/src/test/java/com/powsybl/openreac/OpenReacRunnerTest.java deleted file mode 100644 index 4a0179f7..00000000 --- a/open-reac/src/test/java/com/powsybl/openreac/OpenReacRunnerTest.java +++ /dev/null @@ -1,520 +0,0 @@ -/** - * Copyright (c) 2023, 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.openreac; - -import com.google.common.jimfs.Configuration; -import com.google.common.jimfs.Jimfs; -import com.powsybl.commons.report.ReportNode; -import com.powsybl.commons.report.TypedValue; -import com.powsybl.commons.test.ComparisonUtils; -import com.powsybl.computation.ComputationManager; -import com.powsybl.computation.local.LocalCommandExecutor; -import com.powsybl.computation.local.LocalComputationConfig; -import com.powsybl.computation.local.LocalComputationManager; -import com.powsybl.ieeecdf.converter.IeeeCdfNetworkFactory; -import com.powsybl.iidm.network.*; -import com.powsybl.loadflow.LoadFlow; -import com.powsybl.loadflow.LoadFlowResult; -import com.powsybl.openreac.network.HvdcNetworkFactory; -import com.powsybl.openreac.network.VoltageControlNetworkFactory; -import com.powsybl.openreac.parameters.input.OpenReacParameters; -import com.powsybl.openreac.parameters.input.algo.OpenReacAmplLogLevel; -import com.powsybl.openreac.parameters.input.algo.ReactiveSlackBusesMode; -import com.powsybl.openreac.parameters.input.algo.OpenReacOptimisationObjective; -import com.powsybl.openreac.parameters.input.algo.OpenReacSolverLogLevel; -import com.powsybl.openreac.parameters.output.OpenReacResult; -import com.powsybl.openreac.parameters.output.OpenReacStatus; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.FileSystem; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ForkJoinPool; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static org.junit.jupiter.api.Assertions.*; - -/** - * @author Geoffroy Jamgotchian {@literal } - * @author Nicolas PIERRE {@literal } - */ -class OpenReacRunnerTest { - protected FileSystem fileSystem; - protected Path tmpDir; - - @BeforeEach - public void setUp() throws IOException { - fileSystem = Jimfs.newFileSystem(Configuration.unix()); - tmpDir = Files.createDirectory(fileSystem.getPath("tmp")); - } - - @AfterEach - void tearDown() throws IOException { - fileSystem.close(); - } - - private void assertEqualsToRef(Path p, String refFileName) throws IOException { - try (InputStream actual = Files.newInputStream(p)) { - ComparisonUtils.assertTxtEquals(Objects.requireNonNull(getClass().getResourceAsStream(refFileName)), actual); - } - } - - private Path getAmplExecPath() throws IOException { - Path execFolder; - try (Stream walk = Files.walk(tmpDir)) { - execFolder = walk.limit(2).collect(Collectors.toList()).get(1); - } - return execFolder; - } - - @Test - void testDefaultParamAlgoExport() throws IOException { - Network network = IeeeCdfNetworkFactory.create57(); - setDefaultVoltageLimits(network); // set default voltage limits to every voltage levels of the network - OpenReacParameters parameters = new OpenReacParameters(); - - LocalCommandExecutor localCommandExecutor = new TestLocalCommandExecutor( - List.of("empty_case/reactiveopf_results_indic.txt")); - try (ComputationManager computationManager = new LocalComputationManager(new LocalComputationConfig(tmpDir), - localCommandExecutor, ForkJoinPool.commonPool())) { - OpenReacRunner.run(network, network.getVariantManager().getWorkingVariantId(), parameters, - new OpenReacConfig(true), computationManager); - Path execFolder = getAmplExecPath(); - assertEqualsToRef(execFolder.resolve("param_algo.txt"), "/openreac-input-algo-parameters/default.txt"); - } - } - - @Test - void testModifiedParamAlgoExport() throws IOException { - Network network = IeeeCdfNetworkFactory.create57(); - setDefaultVoltageLimits(network); // set default voltage limits to every voltage levels of the network - OpenReacParameters parameters = new OpenReacParameters() - .setObjective(OpenReacOptimisationObjective.SPECIFIC_VOLTAGE_PROFILE) - .setObjectiveDistance(69) - .setLogLevelAmpl(OpenReacAmplLogLevel.WARNING) - .setLogLevelSolver(OpenReacSolverLogLevel.ONLY_RESULTS) - .setMinPlausibleLowVoltageLimit(0.7888) - .setMaxPlausibleHighVoltageLimit(1.3455) - .setReactiveSlackBusesMode(ReactiveSlackBusesMode.NO_GENERATION) - .setActivePowerVariationRate(0.88) - .setMinPlausibleActivePowerThreshold(0.45) - .setLowImpedanceThreshold(1e-5) - .setMinNominalVoltageIgnoredBus(2.) - .setMinNominalVoltageIgnoredVoltageBounds(0.75) - .setPQMax(3987.76) - .setLowActivePowerDefaultLimit(12.32) - .setHighActivePowerDefaultLimit(1452.66) - .setDefaultQmaxPmaxRatio(0.24) - .setDefaultMinimalQPRange(2.) - .setDefaultVariableScalingFactor(1.1222) - .setDefaultConstraintScalingFactor(0.7889) - .setReactiveSlackVariableScalingFactor(0.2) - .setTwoWindingTransformerRatioVariableScalingFactor(0.0045) - .setShuntVariableScalingFactor(0.101); - - LocalCommandExecutor localCommandExecutor = new TestLocalCommandExecutor( - List.of("empty_case/reactiveopf_results_indic.txt")); - try (ComputationManager computationManager = new LocalComputationManager(new LocalComputationConfig(tmpDir), - localCommandExecutor, ForkJoinPool.commonPool())) { - OpenReacRunner.run(network, network.getVariantManager().getWorkingVariantId(), parameters, - new OpenReacConfig(true), computationManager); - Path execFolder = getAmplExecPath(); - assertEqualsToRef(execFolder.resolve("param_algo.txt"), "/openreac-input-algo-parameters/modified_param_algo.txt"); - } - } - - @Test - void testInputFile() throws IOException { - Network network = IeeeCdfNetworkFactory.create57(); - setDefaultVoltageLimits(network); // set default voltage limits to every voltage levels of the network - - OpenReacParameters parameters = new OpenReacParameters().setObjective( - OpenReacOptimisationObjective.BETWEEN_HIGH_AND_LOW_VOLTAGE_LIMIT) - .setObjectiveDistance(70) - .setReactiveSlackBusesMode(ReactiveSlackBusesMode.CONFIGURED) - .addVariableTwoWindingsTransformers(network.getTwoWindingsTransformerStream() - .limit(1) - .map(TwoWindingsTransformer::getId) - .collect(Collectors.toList())) - .addConstantQGenerators( - network.getGeneratorStream().limit(1).map(Generator::getId).collect(Collectors.toList())) - .addVariableShuntCompensators( - network.getShuntCompensatorStream().limit(1).map(ShuntCompensator::getId).collect(Collectors.toList())) - .addConfiguredReactiveSlackBuses( - network.getBusView().getBusStream().limit(1).map(Bus::getId).collect(Collectors.toList())); - - LocalCommandExecutor localCommandExecutor = new TestLocalCommandExecutor( - List.of("empty_case/reactiveopf_results_indic.txt")); - try (ComputationManager computationManager = new LocalComputationManager(new LocalComputationConfig(tmpDir), - localCommandExecutor, ForkJoinPool.commonPool())) { - OpenReacRunner.run(network, network.getVariantManager().getWorkingVariantId(), parameters, - new OpenReacConfig(true), computationManager); - Path execFolder = getAmplExecPath(); - assertEqualsToRef(execFolder.resolve("param_algo.txt"), "/expected_inputs/param_algo.txt"); - assertEqualsToRef(execFolder.resolve("param_generators_reactive.txt"), "/expected_inputs/param_generators_reactive.txt"); - assertEqualsToRef(execFolder.resolve("param_shunts.txt"), "/expected_inputs/param_shunts.txt"); - assertEqualsToRef(execFolder.resolve("param_transformers.txt"), "/expected_inputs/param_transformers.txt"); - assertEqualsToRef(execFolder.resolve("param_buses_with_reactive_slack.txt"), "/expected_inputs/param_buses_with_reactive_slack.txt"); - } - } - - @Test - void testOutputFileParsing() throws IOException { - Network network = IeeeCdfNetworkFactory.create57(); - setDefaultVoltageLimits(network); // set default voltage limits to every voltage levels of the network - // To parse correctly data from output files, there must be an ID in the Ampl mapper - // For this we add dummy elements to the network, - // they will get exported, but the ampl mapper will have IDs for them. - // All the values are bad, and they are not used. - // RTC - network.getTwoWindingsTransformerStream() - .forEach(t -> t.newRatioTapChanger() - .setLowTapPosition(0) - .setTapPosition(0) - .beginStep() - .setR(0.01) - .setX(0.0001) - .setB(0) - .setG(0) - .setRho(1.1) - .endStep() - .add()); - // SVC - VoltageLevel vl = network.getVoltageLevelStream().iterator().next(); - vl.getBusBreakerView().newBus().setId("bus-1").add(); - vl.newStaticVarCompensator() - .setId("dummyStaticVarCompensator") - .setBus("bus-1") - .setBmin(1.1) - .setBmax(1.3) - .setRegulationMode(StaticVarCompensator.RegulationMode.OFF) - .add(); - // VSC - vl.newVscConverterStation() - .setId("dummyVscConverterStation") - .setConnectableBus("bus-1") - .setBus("bus-1") - .setLossFactor(1.1f) - .setVoltageSetpoint(405.0) - .setVoltageRegulatorOn(true) - .add(); - - LocalCommandExecutor localCommandExecutor = new TestLocalCommandExecutor( - List.of("mock_outputs/reactiveopf_results_generators.csv", - "mock_outputs/reactiveopf_results_indic.txt", - "mock_outputs/reactiveopf_results_rtc.csv", - "mock_outputs/reactiveopf_results_shunts.csv", - "mock_outputs/reactiveopf_results_static_var_compensators.csv", - "mock_outputs/reactiveopf_results_vsc_converter_stations.csv", - "mock_outputs/reactiveopf_results_voltages.csv")); - try (ComputationManager computationManager = new LocalComputationManager(new LocalComputationConfig(tmpDir), - localCommandExecutor, ForkJoinPool.commonPool())) { - OpenReacResult openReacResult = OpenReacRunner.run(network, - network.getVariantManager().getWorkingVariantId(), new OpenReacParameters(), new OpenReacConfig(true), - computationManager); - - assertEquals(OpenReacStatus.OK, openReacResult.getStatus()); - assertEquals(1, openReacResult.getShuntsModifications().size()); - assertEquals(2, openReacResult.getTapPositionModifications().size()); - assertEquals(1, openReacResult.getSvcModifications().size()); - assertEquals(1, openReacResult.getVscModifications().size()); - assertEquals(7, openReacResult.getGeneratorModifications().size()); - assertEquals(3, openReacResult.getVoltageProfile().size()); - assertEquals(87, openReacResult.getIndicators().size()); - assertTrue(openReacResult.getReactiveSlacks().isEmpty()); - } - } - - @Test - void testRunAsync() throws IOException { - Network network = IeeeCdfNetworkFactory.create14(); - String subFolder = "openreac-output-ieee14"; - OpenReacParameters parameters = new OpenReacParameters(); - setDefaultVoltageLimits(network); // set default voltage limits to every voltage levels of the network - LocalCommandExecutor localCommandExecutor = new TestLocalCommandExecutor( - List.of(subFolder + "/reactiveopf_results_generators.csv", - subFolder + "/reactiveopf_results_indic.txt", - subFolder + "/reactiveopf_results_rtc.csv", - subFolder + "/reactiveopf_results_shunts.csv", - subFolder + "/reactiveopf_results_static_var_compensators.csv", - subFolder + "/reactiveopf_results_vsc_converter_stations.csv", - subFolder + "/reactiveopf_results_voltages.csv")); - // To really run open reac, use the commented line below. Be sure that open-reac/src/test/resources/com/powsybl/config/test/config.yml contains your ampl path -// try (ComputationManager computationManager = new LocalComputationManager()) { - try (ComputationManager computationManager = new LocalComputationManager(new LocalComputationConfig(tmpDir), - localCommandExecutor, ForkJoinPool.commonPool())) { - CompletableFuture openReacResults = OpenReacRunner.runAsync(network, - network.getVariantManager().getWorkingVariantId(), parameters, new OpenReacConfig(true), - computationManager); - OpenReacResult openReacResult = openReacResults.join(); - assertEquals(OpenReacStatus.OK, openReacResult.getStatus()); - } - } - - private void testAllModifAndLoadFlow(Network network, String subFolder, OpenReacParameters parameters, ReportNode reportNode) throws IOException { - runAndApplyAllModifications(network, subFolder, parameters, true, reportNode); - LoadFlowResult loadFlowResult = LoadFlow.run(network); - assertTrue(loadFlowResult.isFullyConverged()); - } - - @Test - void testOnlyGenerator() throws IOException { - Network network = IeeeCdfNetworkFactory.create14(); - setDefaultVoltageLimits(network); // set default voltage limits to every voltage levels of the network - testAllModifAndLoadFlow(network, "openreac-output-ieee14", new OpenReacParameters(), ReportNode.NO_OP); - } - - @Test - void testHvdc() throws IOException { - Network network = HvdcNetworkFactory.createNetworkWithGenerators2(); - setDefaultVoltageLimits(network); // set default voltage limits to every voltage levels of the network - network.getVscConverterStation("cs3").getTerminal().setP(0.0); - network.getVscConverterStation("cs4").getTerminal().setP(0.0); - OpenReacParameters parameters = new OpenReacParameters(); - parameters.addConstantQGenerators(List.of("g1", "g2", "g5", "g6")); - testAllModifAndLoadFlow(network, "openreac-output-vsc", parameters, ReportNode.NO_OP); - } - - @Test - void testSvc() throws IOException { - Network network = VoltageControlNetworkFactory.createWithStaticVarCompensator(); - setDefaultVoltageLimits(network); // set default voltage limits to every voltage levels of the network - network.getVoltageLevelStream().forEach(vl -> vl.setLowVoltageLimit(380).setHighVoltageLimit(420)); - network.getStaticVarCompensator("svc1").setVoltageSetpoint(390).setRegulationMode(StaticVarCompensator.RegulationMode.VOLTAGE); - OpenReacParameters parameters = new OpenReacParameters(); - parameters.addConstantQGenerators(List.of("g1")); - testAllModifAndLoadFlow(network, "openreac-output-svc", parameters, ReportNode.NO_OP); - } - - @Test - void testShunt() throws IOException { - Network network = create(); - setDefaultVoltageLimits(network); // set default voltage limits to every voltage levels of the network - ShuntCompensator shunt = network.getShuntCompensator("SHUNT"); - assertFalse(shunt.getTerminal().isConnected()); - assertEquals(393, shunt.getTargetV()); - - OpenReacParameters parameters = new OpenReacParameters(); - parameters.addVariableShuntCompensators(List.of(shunt.getId())); - ReportNode reportNode = ReportNode.newRootReportNode().withMessageTemplate("openReac", "openReac").build(); - testAllModifAndLoadFlow(network, "openreac-output-shunt", parameters, reportNode); - - assertEquals(3, reportNode.getChildren().size()); - ReportNode reportShunts = reportNode.getChildren().get(2); - assertEquals(2, reportShunts.getChildren().size()); - assertEquals("shuntCompensatorDeltaOverThresholdCount", reportShunts.getChildren().get(0).getMessageKey()); - Map values = reportShunts.getChildren().get(0).getValues(); - assertEquals("1", values.get("shuntsCount").toString()); - assertEquals(TypedValue.INFO_SEVERITY.getValue(), values.get("reportSeverity").toString()); - - assertEquals("shuntCompensatorDeltaDiscretizedOptimizedOverThreshold", reportShunts.getChildren().get(1).getMessageKey()); - values = reportShunts.getChildren().get(1).getValues(); - assertEquals("SHUNT", values.get("shuntCompensatorId").toString()); - assertEquals("25", values.get("maxSectionCount").toString()); - assertEquals("160.0", values.get("discretizedValue").toString()); - assertEquals("123.4", values.get("optimalValue").toString()); - assertEquals(TypedValue.TRACE_SEVERITY.getValue(), values.get("reportSeverity").toString()); - - assertTrue(shunt.getTerminal().isConnected()); // shunt has been reconnected - assertEquals(420.8, shunt.getTargetV()); // targetV has been updated - } - - @Test - void testShuntWithDeltaBetweenDiscretizedAndOptimalReactiveValueUnderThreshold() throws IOException { - Network network = create(); - setDefaultVoltageLimits(network); // set default voltage limits to every voltage levels of the network - ShuntCompensator shunt = network.getShuntCompensator("SHUNT"); - assertFalse(shunt.getTerminal().isConnected()); - assertEquals(393, shunt.getTargetV()); - - OpenReacParameters parameters = new OpenReacParameters(); - parameters.setShuntCompensatorActivationAlertThreshold(100.); - parameters.addVariableShuntCompensators(List.of(shunt.getId())); - ReportNode reportNode = ReportNode.newRootReportNode().withMessageTemplate("openReac", "openReac").build(); - testAllModifAndLoadFlow(network, "openreac-output-shunt", parameters, reportNode); - - assertEquals(2, reportNode.getChildren().size()); - - assertTrue(shunt.getTerminal().isConnected()); // shunt has been reconnected - assertEquals(420.8, shunt.getTargetV()); // targetV has been updated - } - - @Test - void testTransformer() throws IOException { - Network network = VoltageControlNetworkFactory.createNetworkWithT2wt(); - setDefaultVoltageLimits(network); // set default voltage limits to every voltage levels of the network - RatioTapChanger rtc = network.getTwoWindingsTransformer("T2wT").getRatioTapChanger() - .setTapPosition(2) - .setTargetDeadband(0) - .setRegulating(true); - assertEquals(2, rtc.getTapPosition()); - assertEquals(33.0, rtc.getTargetV()); - - OpenReacParameters parameters = new OpenReacParameters(); - parameters.addConstantQGenerators(List.of("GEN_1")); - parameters.addVariableTwoWindingsTransformers(List.of("T2wT")); - testAllModifAndLoadFlow(network, "openreac-output-transfo", parameters, ReportNode.NO_OP); - assertEquals(0, rtc.getTapPosition()); - assertEquals(22.935, rtc.getTargetV()); - } - - @Test - void testRealNetwork() throws IOException { - Network network = IeeeCdfNetworkFactory.create57(); - setDefaultVoltageLimits(network); // set default voltage limits to every voltage levels of the network - OpenReacParameters parameters = new OpenReacParameters(); - testAllModifAndLoadFlow(network, "openreac-output-real-network", parameters, ReportNode.NO_OP); - } - - @Test - void testWarmStart() throws IOException { - Network network = VoltageControlNetworkFactory.createNetworkWithT2wt(); - setDefaultVoltageLimits(network); - String subFolder = "openreac-output-warm-start"; - OpenReacParameters parameters = new OpenReacParameters(); - - runAndApplyAllModifications(network, subFolder, parameters, false, ReportNode.NO_OP); // without warm start, no update - assertEquals(Double.NaN, network.getBusBreakerView().getBus("BUS_1").getV()); - assertEquals(Double.NaN, network.getBusBreakerView().getBus("BUS_1").getAngle()); - assertEquals(Double.NaN, network.getBusBreakerView().getBus("BUS_2").getV()); - assertEquals(Double.NaN, network.getBusBreakerView().getBus("BUS_2").getAngle()); - assertEquals(Double.NaN, network.getBusBreakerView().getBus("BUS_3").getV()); - assertEquals(Double.NaN, network.getBusBreakerView().getBus("BUS_3").getAngle()); - - runAndApplyAllModifications(network, subFolder, parameters, true, ReportNode.NO_OP); - assertEquals(119.592, network.getBusBreakerView().getBus("BUS_1").getV()); - assertEquals(0.802, network.getBusBreakerView().getBus("BUS_1").getAngle(), 0.001); - assertEquals(118.8, network.getBusBreakerView().getBus("BUS_2").getV()); - assertEquals(0, network.getBusBreakerView().getBus("BUS_2").getAngle()); - assertEquals(22.935, network.getBusBreakerView().getBus("BUS_3").getV()); - assertEquals(-4.698, network.getBusBreakerView().getBus("BUS_3").getAngle(), 0.001); - } - - private void runAndApplyAllModifications(Network network, String subFolder, OpenReacParameters parameters, - boolean updateNetworkWithVoltages, ReportNode reportNode) throws IOException { - LocalCommandExecutor localCommandExecutor = new TestLocalCommandExecutor( - List.of(subFolder + "/reactiveopf_results_generators.csv", - subFolder + "/reactiveopf_results_indic.txt", - subFolder + "/reactiveopf_results_rtc.csv", - subFolder + "/reactiveopf_results_shunts.csv", - subFolder + "/reactiveopf_results_static_var_compensators.csv", - subFolder + "/reactiveopf_results_vsc_converter_stations.csv", - subFolder + "/reactiveopf_results_voltages.csv")); - // To really run open reac, use the commentede line below. Be sure that open-reac/src/test/resources/com/powsybl/config/test/config.yml contains your ampl path -// try (ComputationManager computationManager = new LocalComputationManager()) { - try (ComputationManager computationManager = new LocalComputationManager(new LocalComputationConfig(tmpDir), - localCommandExecutor, ForkJoinPool.commonPool())) { - OpenReacResult openReacResult = OpenReacRunner.run(network, - network.getVariantManager().getWorkingVariantId(), parameters, - new OpenReacConfig(true), computationManager, reportNode, null); - assertEquals(OpenReacStatus.OK, openReacResult.getStatus()); - openReacResult.setUpdateNetworkWithVoltages(updateNetworkWithVoltages); - openReacResult.applyAllModifications(network); - } - } - - public static Network create() { - Network network = Network.create("svc", "test"); - Substation s1 = network.newSubstation() - .setId("S1") - .add(); - Substation s2 = network.newSubstation() - .setId("S2") - .add(); - VoltageLevel vl1 = s1.newVoltageLevel() - .setId("vl1") - .setNominalV(400) - .setHighVoltageLimit(420) - .setLowVoltageLimit(380) - .setTopologyKind(TopologyKind.BUS_BREAKER) - .add(); - vl1.getBusBreakerView().newBus() - .setId("b1") - .add(); - vl1.newGenerator() - .setId("g1") - .setConnectableBus("b1") - .setBus("b1") - .setTargetP(101.3664) - .setTargetV(390) - .setMinP(0) - .setMaxP(150) - .setVoltageRegulatorOn(true) - .add(); - VoltageLevel vl2 = s2.newVoltageLevel() - .setId("vl2") - .setNominalV(400) - .setTopologyKind(TopologyKind.BUS_BREAKER) - .add(); - vl2.getBusBreakerView().newBus() - .setId("b2") - .add(); - vl2.newLoad() - .setId("ld1") - .setConnectableBus("b2") - .setBus("b2") - .setP0(101) - .setQ0(150) - .add(); - VoltageLevel vl3 = s2.newVoltageLevel() - .setId("vl3") - .setNominalV(400) - .setTopologyKind(TopologyKind.BUS_BREAKER) - .add(); - vl3.getBusBreakerView().newBus() - .setId("b3") - .add(); - vl3.newShuntCompensator() - .setId("SHUNT") - // .setBus("b3") - .setConnectableBus("b3") - .setSectionCount(0) - .setVoltageRegulatorOn(true) - .setTargetV(393) - .setTargetDeadband(5.0) - .newLinearModel() - .setMaximumSectionCount(25) - .setBPerSection(1e-3) - .add() - .add(); - network.newLine() - .setId("l1") - .setBus1("b1") - .setBus2("b2") - .setR(1) - .setX(3) - .add(); - network.newLine() - .setId("l2") - .setBus1("b3") - .setBus2("b2") - .setR(1) - .setX(3) - .add(); - return network; - } - - void setDefaultVoltageLimits(Network network) { - for (VoltageLevel vl : network.getVoltageLevels()) { - if (vl.getLowVoltageLimit() <= 0 || Double.isNaN(vl.getLowVoltageLimit())) { - vl.setLowVoltageLimit(0.5 * vl.getNominalV()); - } - if (Double.isNaN(vl.getHighVoltageLimit())) { - vl.setHighVoltageLimit(1.5 * vl.getNominalV()); - } - } - } -} diff --git a/open-reac/src/test/java/com/powsybl/openreac/network/ShuntNetworkFactory.java b/open-reac/src/test/java/com/powsybl/openreac/network/ShuntNetworkFactory.java index ecb1ba36..bc508014 100644 --- a/open-reac/src/test/java/com/powsybl/openreac/network/ShuntNetworkFactory.java +++ b/open-reac/src/test/java/com/powsybl/openreac/network/ShuntNetworkFactory.java @@ -19,7 +19,88 @@ public final class ShuntNetworkFactory { private ShuntNetworkFactory() { } - public static Network create() { + public static Network createWithLinearModel() { + Network network = Network.create("svc", "test"); + Substation s1 = network.newSubstation() + .setId("S1") + .add(); + Substation s2 = network.newSubstation() + .setId("S2") + .add(); + VoltageLevel vl1 = s1.newVoltageLevel() + .setId("vl1") + .setNominalV(400) + .setHighVoltageLimit(420) + .setLowVoltageLimit(380) + .setTopologyKind(TopologyKind.BUS_BREAKER) + .add(); + vl1.getBusBreakerView().newBus() + .setId("b1") + .add(); + vl1.newGenerator() + .setId("g1") + .setConnectableBus("b1") + .setBus("b1") + .setTargetP(101.3664) + .setTargetV(390) + .setMinP(0) + .setMaxP(150) + .setVoltageRegulatorOn(true) + .add(); + VoltageLevel vl2 = s2.newVoltageLevel() + .setId("vl2") + .setNominalV(400) + .setTopologyKind(TopologyKind.BUS_BREAKER) + .add(); + vl2.getBusBreakerView().newBus() + .setId("b2") + .add(); + vl2.newLoad() + .setId("ld1") + .setConnectableBus("b2") + .setBus("b2") + .setP0(101) + .setQ0(150) + .add(); + VoltageLevel vl3 = s2.newVoltageLevel() + .setId("vl3") + .setNominalV(400) + .setTopologyKind(TopologyKind.BUS_BREAKER) + .add(); + vl3.getBusBreakerView().newBus() + .setId("b3") + .add(); + vl3.newShuntCompensator() + .setId("SHUNT") + // .setBus("b3") + .setConnectableBus("b3") + .setSectionCount(0) + .setVoltageRegulatorOn(true) + .setTargetV(393) + .setTargetDeadband(5.0) + .newLinearModel() + .setMaximumSectionCount(25) + .setBPerSection(1e-3) + .add() + .add(); + network.newLine() + .setId("l1") + .setBus1("b1") + .setBus2("b2") + .setR(1) + .setX(3) + .add(); + network.newLine() + .setId("l2") + .setBus1("b3") + .setBus2("b2") + .setR(1) + .setX(3) + .add(); + return network; + } + + public static Network createWithNonLinearModel() { Network network = Network.create("svc", "test"); Substation s1 = network.newSubstation() .setId("S1") @@ -105,7 +186,7 @@ public static Network create() { } public static Network createWithTwoShuntCompensators() { - Network network = create(); + Network network = createWithNonLinearModel(); VoltageLevel vl3 = network.getVoltageLevel("vl3"); vl3.newShuntCompensator() .setId("SHUNT2") diff --git a/open-reac/src/test/java/com/powsybl/openreac/optimization/AbstractOpenReacRunnerTest.java b/open-reac/src/test/java/com/powsybl/openreac/optimization/AbstractOpenReacRunnerTest.java new file mode 100644 index 00000000..fa2db175 --- /dev/null +++ b/open-reac/src/test/java/com/powsybl/openreac/optimization/AbstractOpenReacRunnerTest.java @@ -0,0 +1,125 @@ +/** + * Copyright (c) 2023, 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.openreac.optimization; + +import com.google.common.jimfs.Configuration; +import com.google.common.jimfs.Jimfs; +import com.powsybl.commons.report.ReportNode; +import com.powsybl.commons.test.ComparisonUtils; +import com.powsybl.computation.ComputationManager; +import com.powsybl.computation.local.LocalCommandExecutor; +import com.powsybl.computation.local.LocalComputationConfig; +import com.powsybl.computation.local.LocalComputationManager; +import com.powsybl.iidm.network.*; +import com.powsybl.loadflow.LoadFlow; +import com.powsybl.loadflow.LoadFlowResult; +import com.powsybl.openreac.OpenReacConfig; +import com.powsybl.openreac.OpenReacRunner; +import com.powsybl.openreac.parameters.input.OpenReacParameters; +import com.powsybl.openreac.parameters.output.OpenReacResult; +import com.powsybl.openreac.parameters.output.OpenReacStatus; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.FileSystem; +import java.nio.file.Path; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.ForkJoinPool; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static java.nio.file.Files.*; +import static org.junit.jupiter.api.Assertions.*; + +/** + * @author Geoffroy Jamgotchian {@literal } + * @author Nicolas PIERRE {@literal } + */ +abstract class AbstractOpenReacRunnerTest { + protected FileSystem fileSystem; + protected Path tmpDir; + + @BeforeEach + public void setUp() throws IOException { + fileSystem = Jimfs.newFileSystem(Configuration.unix()); + tmpDir = createDirectory(fileSystem.getPath("tmp")); + } + + @AfterEach + void tearDown() throws IOException { + fileSystem.close(); + } + + protected void assertEqualsToRef(Path p, String refFileName) throws IOException { + try (InputStream actual = newInputStream(p)) { + ComparisonUtils.assertTxtEquals(Objects.requireNonNull(getClass().getResourceAsStream(refFileName)), actual); + } + } + + protected Path getAmplExecPath() throws IOException { + Path execFolder; + try (Stream walk = walk(tmpDir)) { + execFolder = walk.limit(2).collect(Collectors.toList()).get(1); + } + return execFolder; + } + + /** + * Runs OpenReac, apply the results and verify that a load flow converges on these results. + */ + protected void testAllModifAndLoadFlow(Network network, String subFolder, OpenReacParameters parameters, ReportNode reportNode) throws IOException { + runAndApplyAllModifications(network, subFolder, parameters, true, reportNode); + LoadFlowResult loadFlowResult = LoadFlow.run(network); + assertTrue(loadFlowResult.isFullyConverged()); + } + + /** + * Runs OpenReac and apply the results on the network. + */ + protected void runAndApplyAllModifications(Network network, String subFolder, OpenReacParameters parameters, + boolean updateNetworkWithVoltages, ReportNode reportNode) throws IOException { + // set default voltage limits to every voltage levels of the network + setDefaultVoltageLimits(network); + LocalCommandExecutor localCommandExecutor = new TestLocalCommandExecutor( + List.of(subFolder + "/reactiveopf_results_generators.csv", + subFolder + "/reactiveopf_results_indic.txt", + subFolder + "/reactiveopf_results_rtc.csv", + subFolder + "/reactiveopf_results_shunts.csv", + subFolder + "/reactiveopf_results_static_var_compensators.csv", + subFolder + "/reactiveopf_results_vsc_converter_stations.csv", + subFolder + "/reactiveopf_results_voltages.csv")); + // To really run open reac, use the commentede line below. Be sure that open-reac/src/test/resources/com/powsybl/config/test/config.yml contains your ampl path +// try (ComputationManager computationManager = new LocalComputationManager()) { + try (ComputationManager computationManager = new LocalComputationManager(new LocalComputationConfig(tmpDir), + localCommandExecutor, ForkJoinPool.commonPool())) { + OpenReacResult openReacResult = OpenReacRunner.run(network, + network.getVariantManager().getWorkingVariantId(), parameters, + new OpenReacConfig(true), computationManager, reportNode, null); + assertEquals(OpenReacStatus.OK, openReacResult.getStatus()); + openReacResult.setUpdateNetworkWithVoltages(updateNetworkWithVoltages); + openReacResult.applyAllModifications(network); + } + } + + /** + * Add voltage limits to voltage levels with undefined limits. + * OpenReac needs voltage limits to run optimization. + */ + protected void setDefaultVoltageLimits(Network network) { + for (VoltageLevel vl : network.getVoltageLevels()) { + if (vl.getLowVoltageLimit() <= 0 || Double.isNaN(vl.getLowVoltageLimit())) { + vl.setLowVoltageLimit(0.5 * vl.getNominalV()); + } + if (Double.isNaN(vl.getHighVoltageLimit())) { + vl.setHighVoltageLimit(1.5 * vl.getNominalV()); + } + } + } +} diff --git a/open-reac/src/test/java/com/powsybl/openreac/optimization/OpenReacAmplIOTest.java b/open-reac/src/test/java/com/powsybl/openreac/optimization/OpenReacAmplIOTest.java new file mode 100644 index 00000000..20f6e00b --- /dev/null +++ b/open-reac/src/test/java/com/powsybl/openreac/optimization/OpenReacAmplIOTest.java @@ -0,0 +1,141 @@ +/** + * Copyright (c) 2023, 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.openreac.optimization; + +import com.powsybl.computation.ComputationManager; +import com.powsybl.computation.local.LocalCommandExecutor; +import com.powsybl.computation.local.LocalComputationConfig; +import com.powsybl.computation.local.LocalComputationManager; +import com.powsybl.ieeecdf.converter.IeeeCdfNetworkFactory; +import com.powsybl.iidm.network.*; +import com.powsybl.openreac.OpenReacConfig; +import com.powsybl.openreac.OpenReacRunner; +import com.powsybl.openreac.parameters.input.OpenReacParameters; +import com.powsybl.openreac.parameters.input.algo.OpenReacOptimisationObjective; +import com.powsybl.openreac.parameters.input.algo.ReactiveSlackBusesMode; +import com.powsybl.openreac.parameters.output.OpenReacResult; +import com.powsybl.openreac.parameters.output.OpenReacStatus; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.List; +import java.util.concurrent.ForkJoinPool; +import java.util.stream.Collectors; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * @author Geoffroy Jamgotchian {@literal } + * @author Nicolas PIERRE {@literal } + */ +class OpenReacAmplIOTest extends AbstractOpenReacRunnerTest { + + @Test + void testInputFile() throws IOException { + Network network = IeeeCdfNetworkFactory.create57(); + setDefaultVoltageLimits(network); // set default voltage limits to every voltage levels of the network + + OpenReacParameters parameters = new OpenReacParameters().setObjective( + OpenReacOptimisationObjective.BETWEEN_HIGH_AND_LOW_VOLTAGE_LIMIT) + .setObjectiveDistance(70) + .setReactiveSlackBusesMode(ReactiveSlackBusesMode.CONFIGURED) + .addVariableTwoWindingsTransformers(network.getTwoWindingsTransformerStream() + .limit(1) + .map(TwoWindingsTransformer::getId) + .collect(Collectors.toList())) + .addConstantQGenerators( + network.getGeneratorStream().limit(1).map(Generator::getId).collect(Collectors.toList())) + .addVariableShuntCompensators( + network.getShuntCompensatorStream().limit(1).map(ShuntCompensator::getId).collect(Collectors.toList())) + .addConfiguredReactiveSlackBuses( + network.getBusView().getBusStream().limit(1).map(Bus::getId).collect(Collectors.toList())); + + LocalCommandExecutor localCommandExecutor = new TestLocalCommandExecutor( + List.of("empty_case/reactiveopf_results_indic.txt")); + try (ComputationManager computationManager = new LocalComputationManager(new LocalComputationConfig(tmpDir), + localCommandExecutor, ForkJoinPool.commonPool())) { + OpenReacRunner.run(network, network.getVariantManager().getWorkingVariantId(), parameters, + new OpenReacConfig(true), computationManager); + Path execFolder = getAmplExecPath(); + assertEqualsToRef(execFolder.resolve("param_algo.txt"), "/expected_inputs/param_algo.txt"); + assertEqualsToRef(execFolder.resolve("param_generators_reactive.txt"), "/expected_inputs/param_generators_reactive.txt"); + assertEqualsToRef(execFolder.resolve("param_shunts.txt"), "/expected_inputs/param_shunts.txt"); + assertEqualsToRef(execFolder.resolve("param_transformers.txt"), "/expected_inputs/param_transformers.txt"); + assertEqualsToRef(execFolder.resolve("param_buses_with_reactive_slack.txt"), "/expected_inputs/param_buses_with_reactive_slack.txt"); + } + } + + @Test + void testOutputFileParsing() throws IOException { + Network network = IeeeCdfNetworkFactory.create57(); + setDefaultVoltageLimits(network); // set default voltage limits to every voltage levels of the network + // To parse correctly data from output files, there must be an ID in the Ampl mapper + // For this we add dummy elements to the network, + // they will get exported, but the ampl mapper will have IDs for them. + // All the values are bad, and they are not used. + // RTC + network.getTwoWindingsTransformerStream() + .forEach(t -> t.newRatioTapChanger() + .setLowTapPosition(0) + .setTapPosition(0) + .beginStep() + .setR(0.01) + .setX(0.0001) + .setB(0) + .setG(0) + .setRho(1.1) + .endStep() + .add()); + // SVC + VoltageLevel vl = network.getVoltageLevelStream().iterator().next(); + vl.getBusBreakerView().newBus().setId("bus-1").add(); + vl.newStaticVarCompensator() + .setId("dummyStaticVarCompensator") + .setBus("bus-1") + .setBmin(1.1) + .setBmax(1.3) + .setRegulationMode(StaticVarCompensator.RegulationMode.OFF) + .add(); + // VSC + vl.newVscConverterStation() + .setId("dummyVscConverterStation") + .setConnectableBus("bus-1") + .setBus("bus-1") + .setLossFactor(1.1f) + .setVoltageSetpoint(405.0) + .setVoltageRegulatorOn(true) + .add(); + + LocalCommandExecutor localCommandExecutor = new TestLocalCommandExecutor( + List.of("mock_outputs/reactiveopf_results_generators.csv", + "mock_outputs/reactiveopf_results_indic.txt", + "mock_outputs/reactiveopf_results_rtc.csv", + "mock_outputs/reactiveopf_results_shunts.csv", + "mock_outputs/reactiveopf_results_static_var_compensators.csv", + "mock_outputs/reactiveopf_results_vsc_converter_stations.csv", + "mock_outputs/reactiveopf_results_voltages.csv")); + try (ComputationManager computationManager = new LocalComputationManager(new LocalComputationConfig(tmpDir), + localCommandExecutor, ForkJoinPool.commonPool())) { + OpenReacResult openReacResult = OpenReacRunner.run(network, + network.getVariantManager().getWorkingVariantId(), new OpenReacParameters(), new OpenReacConfig(true), + computationManager); + + assertEquals(OpenReacStatus.OK, openReacResult.getStatus()); + assertEquals(1, openReacResult.getShuntsModifications().size()); + assertEquals(2, openReacResult.getTapPositionModifications().size()); + assertEquals(1, openReacResult.getSvcModifications().size()); + assertEquals(1, openReacResult.getVscModifications().size()); + assertEquals(7, openReacResult.getGeneratorModifications().size()); + assertEquals(3, openReacResult.getVoltageProfile().size()); + assertEquals(87, openReacResult.getIndicators().size()); + assertTrue(openReacResult.getReactiveSlacks().isEmpty()); + } + } + +} diff --git a/open-reac/src/test/java/com/powsybl/openreac/optimization/OpenReacOptimizationAndLoadFlowTest.java b/open-reac/src/test/java/com/powsybl/openreac/optimization/OpenReacOptimizationAndLoadFlowTest.java new file mode 100644 index 00000000..b7e5de6b --- /dev/null +++ b/open-reac/src/test/java/com/powsybl/openreac/optimization/OpenReacOptimizationAndLoadFlowTest.java @@ -0,0 +1,193 @@ +/** + * Copyright (c) 2023, 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.openreac.optimization; + +import com.powsybl.commons.report.ReportNode; +import com.powsybl.commons.report.TypedValue; +import com.powsybl.computation.ComputationManager; +import com.powsybl.computation.local.LocalCommandExecutor; +import com.powsybl.computation.local.LocalComputationConfig; +import com.powsybl.computation.local.LocalComputationManager; +import com.powsybl.ieeecdf.converter.IeeeCdfNetworkFactory; +import com.powsybl.iidm.network.*; +import com.powsybl.openreac.OpenReacConfig; +import com.powsybl.openreac.OpenReacRunner; +import com.powsybl.openreac.network.HvdcNetworkFactory; +import com.powsybl.openreac.network.VoltageControlNetworkFactory; +import com.powsybl.openreac.parameters.input.OpenReacParameters; +import com.powsybl.openreac.parameters.output.OpenReacResult; +import com.powsybl.openreac.parameters.output.OpenReacStatus; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ForkJoinPool; + +import static com.powsybl.openreac.network.ShuntNetworkFactory.createWithLinearModel; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * @author Geoffroy Jamgotchian {@literal } + * @author Nicolas PIERRE {@literal } + */ +class OpenReacOptimizationAndLoadFlowTest extends AbstractOpenReacRunnerTest { + + @Test + void testRunAsync() throws IOException { + Network network = IeeeCdfNetworkFactory.create14(); + String subFolder = "optimization/loadflow/openreac-output-ieee14"; + OpenReacParameters parameters = new OpenReacParameters(); + setDefaultVoltageLimits(network); // set default voltage limits to every voltage levels of the network + LocalCommandExecutor localCommandExecutor = new TestLocalCommandExecutor( + List.of(subFolder + "/reactiveopf_results_generators.csv", + subFolder + "/reactiveopf_results_indic.txt", + subFolder + "/reactiveopf_results_rtc.csv", + subFolder + "/reactiveopf_results_shunts.csv", + subFolder + "/reactiveopf_results_static_var_compensators.csv", + subFolder + "/reactiveopf_results_vsc_converter_stations.csv", + subFolder + "/reactiveopf_results_voltages.csv")); + // To really run open reac, use the commented line below. Be sure that open-reac/src/test/resources/com/powsybl/config/test/config.yml contains your ampl path +// try (ComputationManager computationManager = new LocalComputationManager()) { + try (ComputationManager computationManager = new LocalComputationManager(new LocalComputationConfig(tmpDir), + localCommandExecutor, ForkJoinPool.commonPool())) { + CompletableFuture openReacResults = OpenReacRunner.runAsync(network, + network.getVariantManager().getWorkingVariantId(), parameters, new OpenReacConfig(true), + computationManager); + OpenReacResult openReacResult = openReacResults.join(); + assertEquals(OpenReacStatus.OK, openReacResult.getStatus()); + } + } + + @Test + void testOnlyGenerator() throws IOException { + Network network = IeeeCdfNetworkFactory.create14(); + testAllModifAndLoadFlow(network, "optimization/loadflow/openreac-output-ieee14", new OpenReacParameters(), ReportNode.NO_OP); + } + + @Test + void testHvdc() throws IOException { + Network network = HvdcNetworkFactory.createNetworkWithGenerators2(); + network.getVscConverterStation("cs3").getTerminal().setP(0.0); + network.getVscConverterStation("cs4").getTerminal().setP(0.0); + OpenReacParameters parameters = new OpenReacParameters(); + parameters.addConstantQGenerators(List.of("g1", "g2", "g5", "g6")); + testAllModifAndLoadFlow(network, "optimization/loadflow/openreac-output-vsc", parameters, ReportNode.NO_OP); + } + + @Test + void testSvc() throws IOException { + Network network = VoltageControlNetworkFactory.createWithStaticVarCompensator(); + network.getVoltageLevelStream().forEach(vl -> vl.setLowVoltageLimit(380).setHighVoltageLimit(420)); + network.getStaticVarCompensator("svc1").setVoltageSetpoint(390).setRegulationMode(StaticVarCompensator.RegulationMode.VOLTAGE); + OpenReacParameters parameters = new OpenReacParameters(); + parameters.addConstantQGenerators(List.of("g1")); + testAllModifAndLoadFlow(network, "optimization/loadflow/openreac-output-svc", parameters, ReportNode.NO_OP); + } + + @Test + void testShunt() throws IOException { + Network network = createWithLinearModel(); + ShuntCompensator shunt = network.getShuntCompensator("SHUNT"); + assertFalse(shunt.getTerminal().isConnected()); + assertEquals(393, shunt.getTargetV()); + + OpenReacParameters parameters = new OpenReacParameters(); + parameters.addVariableShuntCompensators(List.of(shunt.getId())); + ReportNode reportNode = ReportNode.newRootReportNode().withMessageTemplate("openReac", "openReac").build(); + testAllModifAndLoadFlow(network, "optimization/loadflow/openreac-output-shunt", parameters, reportNode); + + assertEquals(3, reportNode.getChildren().size()); + ReportNode reportShunts = reportNode.getChildren().get(2); + assertEquals(2, reportShunts.getChildren().size()); + assertEquals("shuntCompensatorDeltaOverThresholdCount", reportShunts.getChildren().get(0).getMessageKey()); + Map values = reportShunts.getChildren().get(0).getValues(); + assertEquals("1", values.get("shuntsCount").toString()); + assertEquals(TypedValue.INFO_SEVERITY.getValue(), values.get("reportSeverity").toString()); + + assertEquals("shuntCompensatorDeltaDiscretizedOptimizedOverThreshold", reportShunts.getChildren().get(1).getMessageKey()); + values = reportShunts.getChildren().get(1).getValues(); + assertEquals("SHUNT", values.get("shuntCompensatorId").toString()); + assertEquals("25", values.get("maxSectionCount").toString()); + assertEquals("160.0", values.get("discretizedValue").toString()); + assertEquals("123.4", values.get("optimalValue").toString()); + assertEquals(TypedValue.TRACE_SEVERITY.getValue(), values.get("reportSeverity").toString()); + + assertTrue(shunt.getTerminal().isConnected()); // shunt has been reconnected + assertEquals(420.8, shunt.getTargetV()); // targetV has been updated + } + + @Test + void testShuntWithDeltaBetweenDiscretizedAndOptimalReactiveValueUnderThreshold() throws IOException { + Network network = createWithLinearModel(); + ShuntCompensator shunt = network.getShuntCompensator("SHUNT"); + assertFalse(shunt.getTerminal().isConnected()); + assertEquals(393, shunt.getTargetV()); + + OpenReacParameters parameters = new OpenReacParameters(); + parameters.setShuntCompensatorActivationAlertThreshold(100.); + parameters.addVariableShuntCompensators(List.of(shunt.getId())); + ReportNode reportNode = ReportNode.newRootReportNode().withMessageTemplate("openReac", "openReac").build(); + testAllModifAndLoadFlow(network, "optimization/loadflow/openreac-output-shunt", parameters, reportNode); + + assertEquals(2, reportNode.getChildren().size()); + + assertTrue(shunt.getTerminal().isConnected()); // shunt has been reconnected + assertEquals(420.8, shunt.getTargetV()); // targetV has been updated + } + + @Test + void testTransformer() throws IOException { + Network network = VoltageControlNetworkFactory.createNetworkWithT2wt(); + RatioTapChanger rtc = network.getTwoWindingsTransformer("T2wT").getRatioTapChanger() + .setTapPosition(2) + .setTargetDeadband(0) + .setRegulating(true); + assertEquals(2, rtc.getTapPosition()); + assertEquals(33.0, rtc.getTargetV()); + + OpenReacParameters parameters = new OpenReacParameters(); + parameters.addConstantQGenerators(List.of("GEN_1")); + parameters.addVariableTwoWindingsTransformers(List.of("T2wT")); + testAllModifAndLoadFlow(network, "optimization/loadflow/openreac-output-transfo", parameters, ReportNode.NO_OP); + assertEquals(0, rtc.getTapPosition()); + assertEquals(22.935, rtc.getTargetV()); + } + + @Test + void testRealNetwork() throws IOException { + Network network = IeeeCdfNetworkFactory.create57(); + OpenReacParameters parameters = new OpenReacParameters(); + testAllModifAndLoadFlow(network, "optimization/loadflow/openreac-output-real-network", parameters, ReportNode.NO_OP); + } + + @Test + void testWarmStart() throws IOException { + Network network = VoltageControlNetworkFactory.createNetworkWithT2wt(); + String subFolder = "optimization/loadflow/openreac-output-warm-start"; + OpenReacParameters parameters = new OpenReacParameters(); + + runAndApplyAllModifications(network, subFolder, parameters, false, ReportNode.NO_OP); // without warm start, no update + assertEquals(Double.NaN, network.getBusBreakerView().getBus("BUS_1").getV()); + assertEquals(Double.NaN, network.getBusBreakerView().getBus("BUS_1").getAngle()); + assertEquals(Double.NaN, network.getBusBreakerView().getBus("BUS_2").getV()); + assertEquals(Double.NaN, network.getBusBreakerView().getBus("BUS_2").getAngle()); + assertEquals(Double.NaN, network.getBusBreakerView().getBus("BUS_3").getV()); + assertEquals(Double.NaN, network.getBusBreakerView().getBus("BUS_3").getAngle()); + + runAndApplyAllModifications(network, subFolder, parameters, true, ReportNode.NO_OP); + assertEquals(119.592, network.getBusBreakerView().getBus("BUS_1").getV()); + assertEquals(0.802, network.getBusBreakerView().getBus("BUS_1").getAngle(), 0.001); + assertEquals(118.8, network.getBusBreakerView().getBus("BUS_2").getV()); + assertEquals(0, network.getBusBreakerView().getBus("BUS_2").getAngle()); + assertEquals(22.935, network.getBusBreakerView().getBus("BUS_3").getV()); + assertEquals(-4.698, network.getBusBreakerView().getBus("BUS_3").getAngle(), 0.001); + } + +} diff --git a/open-reac/src/test/java/com/powsybl/openreac/optimization/OpenReacParametrizationTest.java b/open-reac/src/test/java/com/powsybl/openreac/optimization/OpenReacParametrizationTest.java new file mode 100644 index 00000000..02809d2f --- /dev/null +++ b/open-reac/src/test/java/com/powsybl/openreac/optimization/OpenReacParametrizationTest.java @@ -0,0 +1,91 @@ +/** + * Copyright (c) 2023, 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.openreac.optimization; + +import com.powsybl.computation.ComputationManager; +import com.powsybl.computation.local.LocalCommandExecutor; +import com.powsybl.computation.local.LocalComputationConfig; +import com.powsybl.computation.local.LocalComputationManager; +import com.powsybl.ieeecdf.converter.IeeeCdfNetworkFactory; +import com.powsybl.iidm.network.Network; +import com.powsybl.openreac.OpenReacConfig; +import com.powsybl.openreac.OpenReacRunner; +import com.powsybl.openreac.parameters.input.OpenReacParameters; +import com.powsybl.openreac.parameters.input.algo.OpenReacAmplLogLevel; +import com.powsybl.openreac.parameters.input.algo.OpenReacOptimisationObjective; +import com.powsybl.openreac.parameters.input.algo.OpenReacSolverLogLevel; +import com.powsybl.openreac.parameters.input.algo.ReactiveSlackBusesMode; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.List; +import java.util.concurrent.ForkJoinPool; + +/** + * @author Geoffroy Jamgotchian {@literal } + * @author Nicolas PIERRE {@literal } + */ +class OpenReacParametrizationTest extends AbstractOpenReacRunnerTest { + + @Test + void testDefaultParamAlgoExport() throws IOException { + Network network = IeeeCdfNetworkFactory.create57(); + setDefaultVoltageLimits(network); // set default voltage limits to every voltage levels of the network + OpenReacParameters parameters = new OpenReacParameters(); + + LocalCommandExecutor localCommandExecutor = new TestLocalCommandExecutor( + List.of("empty_case/reactiveopf_results_indic.txt")); + try (ComputationManager computationManager = new LocalComputationManager(new LocalComputationConfig(tmpDir), + localCommandExecutor, ForkJoinPool.commonPool())) { + OpenReacRunner.run(network, network.getVariantManager().getWorkingVariantId(), parameters, + new OpenReacConfig(true), computationManager); + Path execFolder = getAmplExecPath(); + assertEqualsToRef(execFolder.resolve("param_algo.txt"), "/openreac-input-algo-parameters/default.txt"); + } + } + + @Test + void testModifiedParamAlgoExport() throws IOException { + Network network = IeeeCdfNetworkFactory.create57(); + setDefaultVoltageLimits(network); // set default voltage limits to every voltage levels of the network + OpenReacParameters parameters = new OpenReacParameters() + .setObjective(OpenReacOptimisationObjective.SPECIFIC_VOLTAGE_PROFILE) + .setObjectiveDistance(69) + .setLogLevelAmpl(OpenReacAmplLogLevel.WARNING) + .setLogLevelSolver(OpenReacSolverLogLevel.ONLY_RESULTS) + .setMinPlausibleLowVoltageLimit(0.7888) + .setMaxPlausibleHighVoltageLimit(1.3455) + .setReactiveSlackBusesMode(ReactiveSlackBusesMode.NO_GENERATION) + .setActivePowerVariationRate(0.88) + .setMinPlausibleActivePowerThreshold(0.45) + .setLowImpedanceThreshold(1e-5) + .setMinNominalVoltageIgnoredBus(2.) + .setMinNominalVoltageIgnoredVoltageBounds(0.75) + .setPQMax(3987.76) + .setLowActivePowerDefaultLimit(12.32) + .setHighActivePowerDefaultLimit(1452.66) + .setDefaultQmaxPmaxRatio(0.24) + .setDefaultMinimalQPRange(2.) + .setDefaultVariableScalingFactor(1.1222) + .setDefaultConstraintScalingFactor(0.7889) + .setReactiveSlackVariableScalingFactor(0.2) + .setTwoWindingTransformerRatioVariableScalingFactor(0.0045) + .setShuntVariableScalingFactor(0.101); + + LocalCommandExecutor localCommandExecutor = new TestLocalCommandExecutor( + List.of("empty_case/reactiveopf_results_indic.txt")); + try (ComputationManager computationManager = new LocalComputationManager(new LocalComputationConfig(tmpDir), + localCommandExecutor, ForkJoinPool.commonPool())) { + OpenReacRunner.run(network, network.getVariantManager().getWorkingVariantId(), parameters, + new OpenReacConfig(true), computationManager); + Path execFolder = getAmplExecPath(); + assertEqualsToRef(execFolder.resolve("param_algo.txt"), "/openreac-input-algo-parameters/modified_param_algo.txt"); + } + } + +} diff --git a/open-reac/src/test/java/com/powsybl/openreac/TestLocalCommandExecutor.java b/open-reac/src/test/java/com/powsybl/openreac/optimization/TestLocalCommandExecutor.java similarity index 97% rename from open-reac/src/test/java/com/powsybl/openreac/TestLocalCommandExecutor.java rename to open-reac/src/test/java/com/powsybl/openreac/optimization/TestLocalCommandExecutor.java index cffaba1f..fa55a0ae 100644 --- a/open-reac/src/test/java/com/powsybl/openreac/TestLocalCommandExecutor.java +++ b/open-reac/src/test/java/com/powsybl/openreac/optimization/TestLocalCommandExecutor.java @@ -4,7 +4,7 @@ * 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.openreac; +package com.powsybl.openreac.optimization; import com.powsybl.computation.local.LocalCommandExecutor; diff --git a/open-reac/src/test/java/com/powsybl/openreac/parameters/output/ShuntCompensatorNetworkOutputTest.java b/open-reac/src/test/java/com/powsybl/openreac/parameters/output/ShuntCompensatorNetworkOutputTest.java index fdc33f8b..1df695bf 100644 --- a/open-reac/src/test/java/com/powsybl/openreac/parameters/output/ShuntCompensatorNetworkOutputTest.java +++ b/open-reac/src/test/java/com/powsybl/openreac/parameters/output/ShuntCompensatorNetworkOutputTest.java @@ -18,7 +18,7 @@ import java.io.InputStream; import java.io.InputStreamReader; -import static com.powsybl.openreac.network.ShuntNetworkFactory.create; +import static com.powsybl.openreac.network.ShuntNetworkFactory.createWithNonLinearModel; import static org.junit.jupiter.api.Assertions.*; /** @@ -27,7 +27,7 @@ class ShuntCompensatorNetworkOutputTest { @Test void read() throws IOException { - Network network = create(); + Network network = createWithNonLinearModel(); ShuntCompensatorNetworkOutput output = new ShuntCompensatorNetworkOutput(network, 0); StringToIntMapper mapper = new StringToIntMapper<>(AmplSubset.class); mapper.newInt(AmplSubset.SHUNT, "SHUNT"); @@ -47,7 +47,7 @@ void read() throws IOException { @Test void readNullShuntCompensator() throws IOException { - Network network = create(); + Network network = createWithNonLinearModel(); ShuntCompensatorNetworkOutput output = new ShuntCompensatorNetworkOutput(network, 0); StringToIntMapper mapper = new StringToIntMapper<>(AmplSubset.class); mapper.newInt(AmplSubset.SHUNT, "wrongId"); @@ -64,7 +64,7 @@ void readNullShuntCompensator() throws IOException { @Test void noShuntNumberInMapper() throws IOException { - Network network = create(); + Network network = createWithNonLinearModel(); ShuntCompensatorNetworkOutput output = new ShuntCompensatorNetworkOutput(network, 0); StringToIntMapper mapper = new StringToIntMapper<>(AmplSubset.class); try (InputStream input = getClass().getResourceAsStream("/mock_outputs/reactiveopf_results_shunts.csv"); @@ -76,7 +76,7 @@ void noShuntNumberInMapper() throws IOException { @Test void noBusNumberInMapper() throws IOException { - Network network = create(); + Network network = createWithNonLinearModel(); ShuntCompensatorNetworkOutput output = new ShuntCompensatorNetworkOutput(network, 0); StringToIntMapper mapper = new StringToIntMapper<>(AmplSubset.class); mapper.newInt(AmplSubset.SHUNT, "SHUNT"); diff --git a/open-reac/src/test/resources/openreac-output-ieee14/reactiveopf_results_generators.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-ieee14/reactiveopf_results_generators.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-ieee14/reactiveopf_results_generators.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-ieee14/reactiveopf_results_generators.csv diff --git a/open-reac/src/test/resources/openreac-output-ieee14/reactiveopf_results_indic.txt b/open-reac/src/test/resources/optimization/loadflow/openreac-output-ieee14/reactiveopf_results_indic.txt similarity index 100% rename from open-reac/src/test/resources/openreac-output-ieee14/reactiveopf_results_indic.txt rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-ieee14/reactiveopf_results_indic.txt diff --git a/open-reac/src/test/resources/openreac-output-ieee14/reactiveopf_results_rtc.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-ieee14/reactiveopf_results_rtc.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-ieee14/reactiveopf_results_rtc.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-ieee14/reactiveopf_results_rtc.csv diff --git a/open-reac/src/test/resources/openreac-output-ieee14/reactiveopf_results_shunts.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-ieee14/reactiveopf_results_shunts.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-ieee14/reactiveopf_results_shunts.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-ieee14/reactiveopf_results_shunts.csv diff --git a/open-reac/src/test/resources/openreac-output-ieee14/reactiveopf_results_static_var_compensators.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-ieee14/reactiveopf_results_static_var_compensators.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-ieee14/reactiveopf_results_static_var_compensators.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-ieee14/reactiveopf_results_static_var_compensators.csv diff --git a/open-reac/src/test/resources/openreac-output-ieee14/reactiveopf_results_voltages.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-ieee14/reactiveopf_results_voltages.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-ieee14/reactiveopf_results_voltages.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-ieee14/reactiveopf_results_voltages.csv diff --git a/open-reac/src/test/resources/openreac-output-ieee14/reactiveopf_results_vsc_converter_stations.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-ieee14/reactiveopf_results_vsc_converter_stations.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-ieee14/reactiveopf_results_vsc_converter_stations.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-ieee14/reactiveopf_results_vsc_converter_stations.csv diff --git a/open-reac/src/test/resources/openreac-output-real-network/reactiveopf_results_generators.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-real-network/reactiveopf_results_generators.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-real-network/reactiveopf_results_generators.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-real-network/reactiveopf_results_generators.csv diff --git a/open-reac/src/test/resources/openreac-output-real-network/reactiveopf_results_indic.txt b/open-reac/src/test/resources/optimization/loadflow/openreac-output-real-network/reactiveopf_results_indic.txt similarity index 100% rename from open-reac/src/test/resources/openreac-output-real-network/reactiveopf_results_indic.txt rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-real-network/reactiveopf_results_indic.txt diff --git a/open-reac/src/test/resources/openreac-output-real-network/reactiveopf_results_rtc.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-real-network/reactiveopf_results_rtc.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-real-network/reactiveopf_results_rtc.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-real-network/reactiveopf_results_rtc.csv diff --git a/open-reac/src/test/resources/openreac-output-real-network/reactiveopf_results_shunts.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-real-network/reactiveopf_results_shunts.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-real-network/reactiveopf_results_shunts.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-real-network/reactiveopf_results_shunts.csv diff --git a/open-reac/src/test/resources/openreac-output-real-network/reactiveopf_results_static_var_compensators.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-real-network/reactiveopf_results_static_var_compensators.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-real-network/reactiveopf_results_static_var_compensators.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-real-network/reactiveopf_results_static_var_compensators.csv diff --git a/open-reac/src/test/resources/openreac-output-real-network/reactiveopf_results_voltages.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-real-network/reactiveopf_results_voltages.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-real-network/reactiveopf_results_voltages.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-real-network/reactiveopf_results_voltages.csv diff --git a/open-reac/src/test/resources/openreac-output-real-network/reactiveopf_results_vsc_converter_stations.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-real-network/reactiveopf_results_vsc_converter_stations.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-real-network/reactiveopf_results_vsc_converter_stations.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-real-network/reactiveopf_results_vsc_converter_stations.csv diff --git a/open-reac/src/test/resources/openreac-output-shunt/reactiveopf_results_generators.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-shunt/reactiveopf_results_generators.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-shunt/reactiveopf_results_generators.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-shunt/reactiveopf_results_generators.csv diff --git a/open-reac/src/test/resources/openreac-output-shunt/reactiveopf_results_indic.txt b/open-reac/src/test/resources/optimization/loadflow/openreac-output-shunt/reactiveopf_results_indic.txt similarity index 100% rename from open-reac/src/test/resources/openreac-output-shunt/reactiveopf_results_indic.txt rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-shunt/reactiveopf_results_indic.txt diff --git a/open-reac/src/test/resources/openreac-output-shunt/reactiveopf_results_rtc.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-shunt/reactiveopf_results_rtc.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-shunt/reactiveopf_results_rtc.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-shunt/reactiveopf_results_rtc.csv diff --git a/open-reac/src/test/resources/openreac-output-shunt/reactiveopf_results_shunts.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-shunt/reactiveopf_results_shunts.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-shunt/reactiveopf_results_shunts.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-shunt/reactiveopf_results_shunts.csv diff --git a/open-reac/src/test/resources/openreac-output-shunt/reactiveopf_results_static_var_compensators.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-shunt/reactiveopf_results_static_var_compensators.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-shunt/reactiveopf_results_static_var_compensators.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-shunt/reactiveopf_results_static_var_compensators.csv diff --git a/open-reac/src/test/resources/openreac-output-shunt/reactiveopf_results_voltages.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-shunt/reactiveopf_results_voltages.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-shunt/reactiveopf_results_voltages.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-shunt/reactiveopf_results_voltages.csv diff --git a/open-reac/src/test/resources/openreac-output-shunt/reactiveopf_results_vsc_converter_stations.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-shunt/reactiveopf_results_vsc_converter_stations.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-shunt/reactiveopf_results_vsc_converter_stations.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-shunt/reactiveopf_results_vsc_converter_stations.csv diff --git a/open-reac/src/test/resources/openreac-output-svc/reactiveopf_results_generators.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-svc/reactiveopf_results_generators.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-svc/reactiveopf_results_generators.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-svc/reactiveopf_results_generators.csv diff --git a/open-reac/src/test/resources/openreac-output-svc/reactiveopf_results_indic.txt b/open-reac/src/test/resources/optimization/loadflow/openreac-output-svc/reactiveopf_results_indic.txt similarity index 100% rename from open-reac/src/test/resources/openreac-output-svc/reactiveopf_results_indic.txt rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-svc/reactiveopf_results_indic.txt diff --git a/open-reac/src/test/resources/openreac-output-svc/reactiveopf_results_rtc.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-svc/reactiveopf_results_rtc.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-svc/reactiveopf_results_rtc.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-svc/reactiveopf_results_rtc.csv diff --git a/open-reac/src/test/resources/openreac-output-svc/reactiveopf_results_shunts.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-svc/reactiveopf_results_shunts.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-svc/reactiveopf_results_shunts.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-svc/reactiveopf_results_shunts.csv diff --git a/open-reac/src/test/resources/openreac-output-svc/reactiveopf_results_static_var_compensators.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-svc/reactiveopf_results_static_var_compensators.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-svc/reactiveopf_results_static_var_compensators.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-svc/reactiveopf_results_static_var_compensators.csv diff --git a/open-reac/src/test/resources/openreac-output-svc/reactiveopf_results_voltages.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-svc/reactiveopf_results_voltages.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-svc/reactiveopf_results_voltages.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-svc/reactiveopf_results_voltages.csv diff --git a/open-reac/src/test/resources/openreac-output-svc/reactiveopf_results_vsc_converter_stations.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-svc/reactiveopf_results_vsc_converter_stations.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-svc/reactiveopf_results_vsc_converter_stations.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-svc/reactiveopf_results_vsc_converter_stations.csv diff --git a/open-reac/src/test/resources/openreac-output-transfo/reactiveopf_results_generators.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-transfo/reactiveopf_results_generators.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-transfo/reactiveopf_results_generators.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-transfo/reactiveopf_results_generators.csv diff --git a/open-reac/src/test/resources/openreac-output-transfo/reactiveopf_results_indic.txt b/open-reac/src/test/resources/optimization/loadflow/openreac-output-transfo/reactiveopf_results_indic.txt similarity index 100% rename from open-reac/src/test/resources/openreac-output-transfo/reactiveopf_results_indic.txt rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-transfo/reactiveopf_results_indic.txt diff --git a/open-reac/src/test/resources/openreac-output-transfo/reactiveopf_results_rtc.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-transfo/reactiveopf_results_rtc.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-transfo/reactiveopf_results_rtc.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-transfo/reactiveopf_results_rtc.csv diff --git a/open-reac/src/test/resources/openreac-output-transfo/reactiveopf_results_shunts.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-transfo/reactiveopf_results_shunts.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-transfo/reactiveopf_results_shunts.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-transfo/reactiveopf_results_shunts.csv diff --git a/open-reac/src/test/resources/openreac-output-transfo/reactiveopf_results_static_var_compensators.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-transfo/reactiveopf_results_static_var_compensators.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-transfo/reactiveopf_results_static_var_compensators.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-transfo/reactiveopf_results_static_var_compensators.csv diff --git a/open-reac/src/test/resources/openreac-output-transfo/reactiveopf_results_voltages.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-transfo/reactiveopf_results_voltages.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-transfo/reactiveopf_results_voltages.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-transfo/reactiveopf_results_voltages.csv diff --git a/open-reac/src/test/resources/openreac-output-transfo/reactiveopf_results_vsc_converter_stations.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-transfo/reactiveopf_results_vsc_converter_stations.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-transfo/reactiveopf_results_vsc_converter_stations.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-transfo/reactiveopf_results_vsc_converter_stations.csv diff --git a/open-reac/src/test/resources/openreac-output-vsc/reactiveopf_results_generators.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-vsc/reactiveopf_results_generators.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-vsc/reactiveopf_results_generators.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-vsc/reactiveopf_results_generators.csv diff --git a/open-reac/src/test/resources/openreac-output-vsc/reactiveopf_results_indic.txt b/open-reac/src/test/resources/optimization/loadflow/openreac-output-vsc/reactiveopf_results_indic.txt similarity index 100% rename from open-reac/src/test/resources/openreac-output-vsc/reactiveopf_results_indic.txt rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-vsc/reactiveopf_results_indic.txt diff --git a/open-reac/src/test/resources/openreac-output-vsc/reactiveopf_results_rtc.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-vsc/reactiveopf_results_rtc.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-vsc/reactiveopf_results_rtc.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-vsc/reactiveopf_results_rtc.csv diff --git a/open-reac/src/test/resources/openreac-output-vsc/reactiveopf_results_shunts.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-vsc/reactiveopf_results_shunts.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-vsc/reactiveopf_results_shunts.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-vsc/reactiveopf_results_shunts.csv diff --git a/open-reac/src/test/resources/openreac-output-vsc/reactiveopf_results_static_var_compensators.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-vsc/reactiveopf_results_static_var_compensators.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-vsc/reactiveopf_results_static_var_compensators.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-vsc/reactiveopf_results_static_var_compensators.csv diff --git a/open-reac/src/test/resources/openreac-output-vsc/reactiveopf_results_voltages.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-vsc/reactiveopf_results_voltages.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-vsc/reactiveopf_results_voltages.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-vsc/reactiveopf_results_voltages.csv diff --git a/open-reac/src/test/resources/openreac-output-vsc/reactiveopf_results_vsc_converter_stations.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-vsc/reactiveopf_results_vsc_converter_stations.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-vsc/reactiveopf_results_vsc_converter_stations.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-vsc/reactiveopf_results_vsc_converter_stations.csv diff --git a/open-reac/src/test/resources/openreac-output-warm-start/reactiveopf_results_generators.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-warm-start/reactiveopf_results_generators.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-warm-start/reactiveopf_results_generators.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-warm-start/reactiveopf_results_generators.csv diff --git a/open-reac/src/test/resources/openreac-output-warm-start/reactiveopf_results_indic.txt b/open-reac/src/test/resources/optimization/loadflow/openreac-output-warm-start/reactiveopf_results_indic.txt similarity index 100% rename from open-reac/src/test/resources/openreac-output-warm-start/reactiveopf_results_indic.txt rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-warm-start/reactiveopf_results_indic.txt diff --git a/open-reac/src/test/resources/openreac-output-warm-start/reactiveopf_results_rtc.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-warm-start/reactiveopf_results_rtc.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-warm-start/reactiveopf_results_rtc.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-warm-start/reactiveopf_results_rtc.csv diff --git a/open-reac/src/test/resources/openreac-output-warm-start/reactiveopf_results_shunts.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-warm-start/reactiveopf_results_shunts.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-warm-start/reactiveopf_results_shunts.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-warm-start/reactiveopf_results_shunts.csv diff --git a/open-reac/src/test/resources/openreac-output-warm-start/reactiveopf_results_static_var_compensators.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-warm-start/reactiveopf_results_static_var_compensators.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-warm-start/reactiveopf_results_static_var_compensators.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-warm-start/reactiveopf_results_static_var_compensators.csv diff --git a/open-reac/src/test/resources/openreac-output-warm-start/reactiveopf_results_voltages.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-warm-start/reactiveopf_results_voltages.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-warm-start/reactiveopf_results_voltages.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-warm-start/reactiveopf_results_voltages.csv diff --git a/open-reac/src/test/resources/openreac-output-warm-start/reactiveopf_results_vsc_converter_stations.csv b/open-reac/src/test/resources/optimization/loadflow/openreac-output-warm-start/reactiveopf_results_vsc_converter_stations.csv similarity index 100% rename from open-reac/src/test/resources/openreac-output-warm-start/reactiveopf_results_vsc_converter_stations.csv rename to open-reac/src/test/resources/optimization/loadflow/openreac-output-warm-start/reactiveopf_results_vsc_converter_stations.csv