From 74796c723438a891613dadd5bbe109798f0d8b3c Mon Sep 17 00:00:00 2001 From: Antoine Bouhours <123802855+antoinebhs@users.noreply.github.com> Date: Mon, 8 Jan 2024 11:26:12 +0100 Subject: [PATCH] Add async run to OpenReac runner (#49) Signed-off-by: BOUHOURS Antoine --- .../com/powsybl/openreac/OpenReacRunner.java | 29 +++++++++++++++++++ .../powsybl/openreac/OpenReacRunnerTest.java | 26 +++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/open-reac/src/main/java/com/powsybl/openreac/OpenReacRunner.java b/open-reac/src/main/java/com/powsybl/openreac/OpenReacRunner.java index 7f52657c..3447afa6 100644 --- a/open-reac/src/main/java/com/powsybl/openreac/OpenReacRunner.java +++ b/open-reac/src/main/java/com/powsybl/openreac/OpenReacRunner.java @@ -17,6 +17,9 @@ import com.powsybl.openreac.parameters.output.OpenReacResult; import com.powsybl.openreac.parameters.output.OpenReacStatus; +import java.util.Objects; +import java.util.concurrent.CompletableFuture; + /** * @author Nicolas Pierre */ @@ -43,6 +46,11 @@ public static OpenReacResult run(Network network, String variantId, OpenReacPara * @return All information about the run and possible modifications to apply. */ public static OpenReacResult run(Network network, String variantId, OpenReacParameters parameters, OpenReacConfig config, ComputationManager manager) { + Objects.requireNonNull(network); + Objects.requireNonNull(variantId); + Objects.requireNonNull(parameters); + Objects.requireNonNull(config); + Objects.requireNonNull(manager); parameters.checkIntegrity(network); AmplModel reactiveOpf = OpenReacModel.buildModel(); OpenReacAmplIOFiles amplIoInterface = new OpenReacAmplIOFiles(parameters, network, config.isDebug()); @@ -50,4 +58,25 @@ public static OpenReacResult run(Network network, String variantId, OpenReacPara return new OpenReacResult(run.isSuccess() && amplIoInterface.checkErrors() ? OpenReacStatus.OK : OpenReacStatus.NOT_OK, amplIoInterface, run.getIndicators()); } + + /** + * Run OpenReac on the given network. It will NOT modify the network. + * @param variantId the network variant to use. It will set the variant on the network. + * @param parameters Parameters to customize the OpenReac run. + * @param config allows debugging + * @return All information about the run and possible modifications to apply. + */ + public static CompletableFuture runAsync(Network network, String variantId, OpenReacParameters parameters, OpenReacConfig config, ComputationManager manager) { + Objects.requireNonNull(network); + Objects.requireNonNull(variantId); + Objects.requireNonNull(parameters); + Objects.requireNonNull(config); + Objects.requireNonNull(manager); + parameters.checkIntegrity(network); + AmplModel reactiveOpf = OpenReacModel.buildModel(); + OpenReacAmplIOFiles amplIoInterface = new OpenReacAmplIOFiles(parameters, network, config.isDebug()); + CompletableFuture runAsync = AmplModelRunner.runAsync(network, variantId, reactiveOpf, manager, amplIoInterface); + return runAsync.thenApply(run -> new OpenReacResult(run.isSuccess() && amplIoInterface.checkErrors() ? OpenReacStatus.OK : OpenReacStatus.NOT_OK, + amplIoInterface, run.getIndicators())); + } } diff --git a/open-reac/src/test/java/com/powsybl/openreac/OpenReacRunnerTest.java b/open-reac/src/test/java/com/powsybl/openreac/OpenReacRunnerTest.java index b16d5993..cc081d71 100644 --- a/open-reac/src/test/java/com/powsybl/openreac/OpenReacRunnerTest.java +++ b/open-reac/src/test/java/com/powsybl/openreac/OpenReacRunnerTest.java @@ -36,6 +36,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.List; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.ForkJoinPool; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -217,6 +218,31 @@ public void testOutputFileParsing() throws IOException { } } + @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")); + // 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) throws IOException { LocalCommandExecutor localCommandExecutor = new TestLocalCommandExecutor( List.of(subFolder + "/reactiveopf_results_generators.csv",