diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzContext.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzContext.java index 3ea5af76e..b80179a54 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzContext.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzContext.java @@ -67,7 +67,7 @@ public DynaWaltzContext(Network network, String workingVariantId, List dataOptimizers = dynaWaltzParameters.isUseModelOptimizers() ? ServiceLoader.load(DataOptimizer.class).iterator() : Collections.emptyIterator(); + Iterator dataOptimizers = dynaWaltzParameters.isUseModelOptimizers() ? ServiceLoader.load(ModelOptimizer.class).iterator() : Collections.emptyIterator(); this.dynamicModels = runOptimizers(dataOptimizers, Objects.requireNonNull(dynamicModels) .stream() @@ -106,7 +106,7 @@ private FrequencySynchronizerModel setupFrequencySynchronizer(Function runOptimizers(Iterator dataOptimizers, Stream inputData, Reporter reporter) { + private Stream runOptimizers(Iterator dataOptimizers, Stream inputData, Reporter reporter) { return dataOptimizers.hasNext() ? runOptimizers(dataOptimizers, dataOptimizers.next().optimizeModels(inputData, dynaWaltzParameters, reporter), reporter) : inputData; } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzParameters.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzParameters.java index 0434589cc..ee180eafd 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzParameters.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzParameters.java @@ -37,7 +37,7 @@ public class DynaWaltzParameters extends AbstractExtension */ -public interface DataOptimizer { +public interface ModelOptimizer { Stream optimizeModels(Stream models, DynaWaltzParameters dynaWaltzParameters, Reporter reporter); - - default Stream optimizeModels(Stream models, DynaWaltzParameters dynaWaltzParameters) { - return optimizeModels(models, dynaWaltzParameters, Reporter.NO_OP); - } } diff --git a/dynawaltz/src/test/java/com/powsybl/dynawaltz/DynaWaltzParametersDatabaseTest.java b/dynawaltz/src/test/java/com/powsybl/dynawaltz/DynaWaltzParametersDatabaseTest.java index 9f7b9b24d..47d9958e8 100644 --- a/dynawaltz/src/test/java/com/powsybl/dynawaltz/DynaWaltzParametersDatabaseTest.java +++ b/dynawaltz/src/test/java/com/powsybl/dynawaltz/DynaWaltzParametersDatabaseTest.java @@ -74,4 +74,13 @@ void checkParametersNotFound() { UncheckedIOException e = assertThrows(UncheckedIOException.class, () -> ParametersXml.load(path)); assertEquals("java.nio.file.NoSuchFileException: /file.par", e.getMessage()); } + + @Test + void addParametersSet() { + DynaWaltzParameters dParameters = new DynaWaltzParameters(); + ParametersSet set = new ParametersSet("test"); + dParameters.addModelParameters(set); + assertEquals(1, dParameters.getModelParameters().size()); + assertEquals(set, dParameters.getModelParameters("test")); + } } diff --git a/dynawaltz/src/test/java/com/powsybl/dynawaltz/DynaWaltzParametersTest.java b/dynawaltz/src/test/java/com/powsybl/dynawaltz/DynaWaltzParametersTest.java index 0f086045f..209208d0b 100644 --- a/dynawaltz/src/test/java/com/powsybl/dynawaltz/DynaWaltzParametersTest.java +++ b/dynawaltz/src/test/java/com/powsybl/dynawaltz/DynaWaltzParametersTest.java @@ -57,7 +57,8 @@ void checkParameters() throws IOException { SolverType solverType = SolverType.IDA; String solverParametersId = "solverParametersId"; boolean mergeLoads = true; - initPlatformConfig(networkParametersId, solverType, solverParametersId, mergeLoads); + boolean useModelOptimizers = true; + initPlatformConfig(networkParametersId, solverType, solverParametersId, mergeLoads, useModelOptimizers); DynaWaltzParameters parameters = DynaWaltzParameters.load(platformConfig, fileSystem); @@ -87,6 +88,7 @@ void checkParameters() throws IOException { assertEquals(ParameterType.DOUBLE, absAccuracy.type()); assertEquals(mergeLoads, parameters.isMergeLoads()); + assertEquals(useModelOptimizers, parameters.isUseModelOptimizers()); } @Test @@ -95,7 +97,7 @@ void roundTripParametersSerializing() throws IOException { SolverType solverType = SolverType.IDA; String solverParametersId = "solverParametersId"; boolean mergeLoads = false; - initPlatformConfig(networkParametersId, solverType, solverParametersId, mergeLoads); + initPlatformConfig(networkParametersId, solverType, solverParametersId, mergeLoads, false); DynamicSimulationParameters dynamicSimulationParameters = new DynamicSimulationParameters() .setStartTime(0) @@ -106,7 +108,7 @@ void roundTripParametersSerializing() throws IOException { JsonDynamicSimulationParameters::read, "/DynaWaltzParameters.json"); } - private void initPlatformConfig(String networkParametersId, SolverType solverType, String solverParametersId, boolean mergeLoads) throws IOException { + private void initPlatformConfig(String networkParametersId, SolverType solverType, String solverParametersId, boolean mergeLoads, boolean useModelOptimizers) throws IOException { String parametersFile = USER_HOME + "parametersFile"; String networkParametersFile = USER_HOME + "networkParametersFile"; String solverParametersFile = USER_HOME + "solverParametersFile"; @@ -119,6 +121,7 @@ private void initPlatformConfig(String networkParametersId, SolverType solverTyp moduleConfig.setStringProperty("network.parametersId", networkParametersId); moduleConfig.setStringProperty("solver.type", solverType.toString()); moduleConfig.setStringProperty("solver.parametersId", solverParametersId); + moduleConfig.setStringProperty("useModelOptimizers", String.valueOf(useModelOptimizers)); Files.createDirectories(fileSystem.getPath(USER_HOME)); copyFile("/parametersSet/models.par", parametersFile); @@ -145,6 +148,7 @@ void checkDefaultParameters() throws IOException { assertEquals("1", parameters.getSolverParameters().getId()); assertEquals(DynaWaltzParameters.DEFAULT_MERGE_LOADS, parameters.isMergeLoads()); + assertEquals(DynaWaltzParameters.DEFAULT_USE_MODEL_OPTIMIZERS, parameters.isUseModelOptimizers()); } @Test diff --git a/dynawaltz/src/test/java/com/powsybl/dynawaltz/ModelOptimizerTest.java b/dynawaltz/src/test/java/com/powsybl/dynawaltz/ModelOptimizerTest.java new file mode 100644 index 000000000..58c9f8611 --- /dev/null +++ b/dynawaltz/src/test/java/com/powsybl/dynawaltz/ModelOptimizerTest.java @@ -0,0 +1,76 @@ +/** + * 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/. + * SPDX-License-Identifier: MPL-2.0 + */ +package com.powsybl.dynawaltz; + +import com.google.auto.service.AutoService; +import com.google.common.collect.Lists; +import com.powsybl.commons.reporter.Reporter; +import com.powsybl.dynamicsimulation.DynamicSimulationParameters; +import com.powsybl.dynawaltz.models.BlackBoxModel; +import com.powsybl.dynawaltz.models.generators.AbstractGenerator; +import com.powsybl.dynawaltz.models.generators.GeneratorFictitious; +import com.powsybl.dynawaltz.models.loads.BaseLoad; +import com.powsybl.dynawaltz.models.transformers.TransformerFixedRatio; +import com.powsybl.iidm.network.Network; +import com.powsybl.iidm.network.test.EurostagTutorialExample1Factory; +import org.junit.jupiter.api.Test; + +import java.util.Collections; +import java.util.List; +import java.util.ServiceLoader; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * @author Laurent Issertial {@literal } + */ +class ModelOptimizerTest { + + @Test + void loadOptimizer() { + List optimizers = Lists.newArrayList(ServiceLoader.load(ModelOptimizer.class)); + assertEquals(2, optimizers.size()); + } + + @Test + void optimizeModels() { + Network network = EurostagTutorialExample1Factory.create(); + DynamicSimulationParameters parameters = DynamicSimulationParameters.load(); + DynaWaltzParameters dynawoParameters = DynaWaltzParameters.load().setUseModelOptimizers(true); + List dynamicModels = List.of( + new GeneratorFictitious("BBM_GEN", network.getGenerator("GEN"), "GPV"), + new BaseLoad("BBM_LOAD", network.getLoad("LOAD"), "LOAD", "LoadAlphaBeta"), + new TransformerFixedRatio("BBM_TRA", network.getTwoWindingsTransformer("NGEN_NHV1"), "TR", "TransformerFixedRatio")); + DynaWaltzContext context = new DynaWaltzContext(network, network.getVariantManager().getWorkingVariantId(), dynamicModels, Collections.emptyList(), Collections.emptyList(), parameters, dynawoParameters); + assertEquals(2, context.getBlackBoxDynamicModels().size()); + assertFalse(context.getBlackBoxDynamicModelStream().anyMatch(bbm -> bbm.getDynamicModelId().equalsIgnoreCase("BBM_LOAD"))); + assertTrue(context.getBlackBoxDynamicModelStream().anyMatch(bbm -> bbm.getDynamicModelId().equalsIgnoreCase("newModel"))); + } + + @AutoService(ModelOptimizer.class) + public static class ModelOptimizerFilter implements ModelOptimizer { + @Override + public Stream optimizeModels(Stream models, DynaWaltzParameters dynaWaltzParameters, Reporter reporter) { + return models.filter(m -> !m.getDynamicModelId().equalsIgnoreCase("BBM_LOAD")); + } + } + + @AutoService(ModelOptimizer.class) + public static class ModelOptimizerSubstitution implements ModelOptimizer { + @Override + public Stream optimizeModels(Stream models, DynaWaltzParameters dynaWaltzParameters, Reporter reporter) { + return models.map(m -> { + if ("BBM_GEN".equalsIgnoreCase(m.getDynamicModelId()) && m instanceof AbstractGenerator gen) { + return new GeneratorFictitious("newModel", gen.getEquipment(), "G"); + } + return m; + }); + } + } +} diff --git a/dynawaltz/src/test/java/com/powsybl/dynawaltz/models/HvdcTest.java b/dynawaltz/src/test/java/com/powsybl/dynawaltz/models/HvdcTest.java new file mode 100644 index 000000000..b7c138a88 --- /dev/null +++ b/dynawaltz/src/test/java/com/powsybl/dynawaltz/models/HvdcTest.java @@ -0,0 +1,45 @@ +/** + * 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/. + * SPDX-License-Identifier: MPL-2.0 + */ +package com.powsybl.dynawaltz.models; + +import com.powsybl.dynawaltz.models.hvdc.HvdcP; +import com.powsybl.dynawaltz.models.hvdc.HvdcPDangling; +import com.powsybl.dynawaltz.models.hvdc.HvdcVscDangling; +import com.powsybl.iidm.network.HvdcLine; +import com.powsybl.iidm.network.Network; +import com.powsybl.iidm.network.test.HvdcTestNetwork; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * @author Laurent Issertial {@literal } + */ +class HvdcTest { + + @Test + void testConnectedStation() { + Network network = HvdcTestNetwork.createVsc(); + HvdcP hvdc = new HvdcP("hvdc", network.getHvdcLine("L"), "HVDC", "HvdcPV"); + assertEquals(2, hvdc.getConnectedStations().size()); + } + + @Test + void testDanglingConnectedStation() { + Network network = HvdcTestNetwork.createVsc(); + HvdcLine line = network.getHvdcLine("L"); + + HvdcPDangling hvdc = new HvdcPDangling("hvdc", line, "HVDC", "HvdcPVDangling", Side.ONE); + assertEquals(1, hvdc.getConnectedStations().size()); + assertEquals(line.getConverterStation2(), hvdc.getConnectedStations().get(0)); + + HvdcVscDangling hvdc2 = new HvdcVscDangling("hvdc", line, "HVDC", "HvdcVSCDanglingP", Side.TWO); + assertEquals(1, hvdc.getConnectedStations().size()); + assertEquals(line.getConverterStation1(), hvdc2.getConnectedStations().get(0)); + } +}