diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index b0fad6cb3..52d4dc1e8 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -26,7 +26,7 @@ jobs: - name: Build with Maven if: matrix.os == 'ubuntu-latest' - run: mvn --batch-mode -Pjacoco install + run: mvn --batch-mode -Pintegration-tests,jacoco install - name: Build with Maven if: matrix.os != 'ubuntu-latest' diff --git a/README.md b/README.md index a9b712f30..82748703b 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ To use DynaWaltz as your time domain engine, add the `com.powsybl:powsybl-dynawo In `powsybl-dynawo`, the inputs can be configured using Groovy scripts. The simulation parameters can be configured either in the `config.yml` file or using a Json file. ```java -Network network = Importers.loadNetwork("/path/to/the/casefile.xiidm"); +Network network = Network.read("/path/to/the/casefile.xiidm"); // Load the dynamic models mapping GroovyDynamicModelsSupplier dynamicModelsSupplier = new GroovyDynamicModelsSupplier( diff --git a/commons/pom.xml b/commons/pom.xml index 3b3816202..15f269e86 100644 --- a/commons/pom.xml +++ b/commons/pom.xml @@ -31,13 +31,6 @@ powsybl-iidm-api - - - ch.qos.logback - logback-classic - runtime - - com.google.jimfs @@ -54,6 +47,11 @@ assertj-core test + + org.slf4j + slf4j-simple + test + org.xmlunit xmlunit-core diff --git a/dynaflow/pom.xml b/dynaflow/pom.xml index ba11135f4..0848a2082 100644 --- a/dynaflow/pom.xml +++ b/dynaflow/pom.xml @@ -43,13 +43,6 @@ powsybl-dynawo-commons - - - ch.qos.logback - logback-classic - runtime - - com.google.jimfs @@ -76,6 +69,11 @@ mockito-core test + + org.slf4j + slf4j-simple + test + com.powsybl powsybl-commons-test diff --git a/dynaflow/src/main/java/com/powsybl/dynaflow/DynaFlowSecurityAnalysis.java b/dynaflow/src/main/java/com/powsybl/dynaflow/DynaFlowSecurityAnalysis.java index 048a96e52..86304fbe6 100644 --- a/dynaflow/src/main/java/com/powsybl/dynaflow/DynaFlowSecurityAnalysis.java +++ b/dynaflow/src/main/java/com/powsybl/dynaflow/DynaFlowSecurityAnalysis.java @@ -64,7 +64,8 @@ public class DynaFlowSecurityAnalysis { private final List interceptors; public DynaFlowSecurityAnalysis(Network network, LimitViolationDetector detector, - LimitViolationFilter filter, ComputationManager computationManager) { + LimitViolationFilter filter, ComputationManager computationManager, + Supplier configSupplier) { this.network = Objects.requireNonNull(network); this.violationDetector = Objects.requireNonNull(detector); this.violationFilter = Objects.requireNonNull(filter); @@ -72,8 +73,7 @@ public DynaFlowSecurityAnalysis(Network network, LimitViolationDetector detector this.computationManager = Objects.requireNonNull(computationManager); interceptors.add(new CurrentLimitViolationInterceptor()); - // TODO(Luma) Allow additional sources for configuration? - this.configSupplier = DynaFlowConfig::fromPropertyFile; + this.configSupplier = Objects.requireNonNull(configSupplier); } private static DynaFlowParameters getParametersExt(LoadFlowParameters parameters) { diff --git a/dynaflow/src/main/java/com/powsybl/dynaflow/DynaFlowSecurityAnalysisProvider.java b/dynaflow/src/main/java/com/powsybl/dynaflow/DynaFlowSecurityAnalysisProvider.java index 0dda0920f..c543ebcac 100644 --- a/dynaflow/src/main/java/com/powsybl/dynaflow/DynaFlowSecurityAnalysisProvider.java +++ b/dynaflow/src/main/java/com/powsybl/dynaflow/DynaFlowSecurityAnalysisProvider.java @@ -20,7 +20,9 @@ import org.slf4j.LoggerFactory; import java.util.List; +import java.util.Objects; import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; import static com.powsybl.dynaflow.DynaFlowConstants.*; @@ -32,6 +34,16 @@ public class DynaFlowSecurityAnalysisProvider implements SecurityAnalysisProvide private static final Logger LOG = LoggerFactory.getLogger(DynaFlowSecurityAnalysisProvider.class); + private final Supplier configSupplier; + + public DynaFlowSecurityAnalysisProvider() { + this(DynaFlowConfig::fromPropertyFile); + } + + public DynaFlowSecurityAnalysisProvider(Supplier configSupplier) { + this.configSupplier = Objects.requireNonNull(configSupplier); + } + @Override public CompletableFuture run(Network network, String workingVariantId, @@ -57,7 +69,7 @@ public CompletableFuture run(Network network, if (actions != null && !actions.isEmpty()) { LOG.error("Actions are not implemented in Dynaflow"); } - DynaFlowSecurityAnalysis securityAnalysis = new DynaFlowSecurityAnalysis(network, detector, filter, computationManager); + DynaFlowSecurityAnalysis securityAnalysis = new DynaFlowSecurityAnalysis(network, detector, filter, computationManager, configSupplier); interceptors.forEach(securityAnalysis::addInterceptor); return securityAnalysis.run(workingVariantId, parameters, contingenciesProvider); } diff --git a/dynaflow/src/test/java/com/powsybl/dynaflow/DynaFlowParametersTest.java b/dynaflow/src/test/java/com/powsybl/dynaflow/DynaFlowParametersTest.java index 59097b5e6..b152fae43 100644 --- a/dynaflow/src/test/java/com/powsybl/dynaflow/DynaFlowParametersTest.java +++ b/dynaflow/src/test/java/com/powsybl/dynaflow/DynaFlowParametersTest.java @@ -8,13 +8,13 @@ import com.google.common.jimfs.Configuration; import com.google.common.jimfs.Jimfs; -import com.powsybl.commons.test.AbstractConverterTest; import com.powsybl.commons.config.InMemoryPlatformConfig; import com.powsybl.commons.config.MapModuleConfig; -import com.powsybl.dynaflow.json.DynaFlowConfigSerializer; -import com.powsybl.dynaflow.DynaFlowConstants.OutputTypes; +import com.powsybl.commons.test.AbstractConverterTest; import com.powsybl.dynaflow.DynaFlowConstants.ActivePowerCompensation; +import com.powsybl.dynaflow.DynaFlowConstants.OutputTypes; import com.powsybl.dynaflow.DynaFlowConstants.StartingPointMode; +import com.powsybl.dynaflow.json.DynaFlowConfigSerializer; import com.powsybl.loadflow.LoadFlowParameters; import org.junit.After; import org.junit.Before; @@ -24,20 +24,11 @@ import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import static com.powsybl.commons.test.ComparisonUtils.compareTxt; import static com.powsybl.dynaflow.DynaFlowProvider.MODULE_SPECIFIC_PARAMETERS; -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; /** * diff --git a/dynawaltz-dsl/pom.xml b/dynawaltz-dsl/pom.xml index fb1d8d08c..9a67b8ac1 100644 --- a/dynawaltz-dsl/pom.xml +++ b/dynawaltz-dsl/pom.xml @@ -68,6 +68,11 @@ assertj-core test + + org.slf4j + slf4j-simple + test + org.xmlunit xmlunit-core diff --git a/dynawaltz/pom.xml b/dynawaltz/pom.xml index d8492646e..eda8095a6 100644 --- a/dynawaltz/pom.xml +++ b/dynawaltz/pom.xml @@ -66,13 +66,6 @@ powsybl-dynawo-commons - - - ch.qos.logback - logback-classic - runtime - - com.google.jimfs @@ -89,6 +82,11 @@ assertj-core test + + org.slf4j + slf4j-simple + test + org.xmlunit xmlunit-core diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzContext.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzContext.java index b566b817f..019ed49f1 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzContext.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzContext.java @@ -45,9 +45,16 @@ public class DynaWaltzContext { private final NetworkModel networkModel = new NetworkModel(); private final OmegaRef omegaRef; + private final PlatformConfig platformConfig; public DynaWaltzContext(Network network, String workingVariantId, List dynamicModels, List eventModels, List curves, DynamicSimulationParameters parameters, DynaWaltzParameters dynaWaltzParameters) { + this(network, workingVariantId, dynamicModels, eventModels, curves, parameters, dynaWaltzParameters, PlatformConfig.defaultConfig()); + } + + public DynaWaltzContext(Network network, String workingVariantId, List dynamicModels, List eventModels, + List curves, DynamicSimulationParameters parameters, DynaWaltzParameters dynaWaltzParameters, + PlatformConfig platformConfig) { this.network = Objects.requireNonNull(network); this.workingVariantId = Objects.requireNonNull(workingVariantId); this.dynamicModels = Objects.requireNonNull(dynamicModels); @@ -55,8 +62,8 @@ public DynaWaltzContext(Network network, String workingVariantId, List synchronousGenerators = dynamicModels.stream() .filter(GeneratorSynchronousModel.class::isInstance) .map(GeneratorSynchronousModel.class::cast) @@ -185,10 +192,14 @@ public boolean withCurves() { return !curves.isEmpty(); } - private static DynaWaltzParametersDatabase loadDatabase(String filename) { - FileSystem fs = PlatformConfig.defaultConfig().getConfigDir() + private static FileSystem getFileSystem(PlatformConfig platformConfig) { + return platformConfig.getConfigDir() .map(Path::getFileSystem) .orElseThrow(() -> new PowsyblException("A configuration directory should be defined")); + } + + private static DynaWaltzParametersDatabase loadDatabase(String filename, PlatformConfig platformConfig) { + FileSystem fs = getFileSystem(platformConfig); return DynaWaltzParametersDatabase.load(fs.getPath(filename)); } @@ -203,4 +214,8 @@ public String getParFile() { public String getSimulationParFile() { return getNetwork().getId() + ".par"; } + + public PlatformConfig getPlatformConfig() { + return platformConfig; + } } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzParameters.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzParameters.java index db17eabf4..e556cbf98 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzParameters.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzParameters.java @@ -45,16 +45,18 @@ public String getParametersFile() { return parametersFile; } - public void setParametersFile(String parametersFile) { + public Network setParametersFile(String parametersFile) { this.parametersFile = Objects.requireNonNull(parametersFile); + return this; } public String getParametersId() { return parametersId; } - public void setParametersId(String parametersId) { + public Network setParametersId(String parametersId) { this.parametersId = Objects.requireNonNull(parametersId); + return this; } private String parametersFile; @@ -76,24 +78,27 @@ public SolverType getType() { return type; } - public void setType(SolverType type) { + public Solver setType(SolverType type) { this.type = Objects.requireNonNull(type); + return this; } public String getParametersFile() { return parametersFile; } - public void setParametersFile(String parametersFile) { + public Solver setParametersFile(String parametersFile) { this.parametersFile = Objects.requireNonNull(parametersFile); + return this; } public String getParametersId() { return parametersId; } - public void setParametersId(String parametersId) { + public Solver setParametersId(String parametersId) { this.parametersId = Objects.requireNonNull(parametersId); + return this; } private SolverType type; @@ -156,24 +161,27 @@ public String getParametersFile() { return parametersFile; } - public void setParametersFile(String parametersFile) { + public DynaWaltzParameters setParametersFile(String parametersFile) { this.parametersFile = Objects.requireNonNull(parametersFile); + return this; } public Network getNetwork() { return network; } - public void setNetwork(Network network) { + public DynaWaltzParameters setNetwork(Network network) { this.network = Objects.requireNonNull(network); + return this; } public Solver getSolver() { return solver; } - public void setSolver(Solver solver) { + public DynaWaltzParameters setSolver(Solver solver) { this.solver = Objects.requireNonNull(solver); + return this; } private String parametersFile; diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzProvider.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzProvider.java index f42a619e8..4bef20084 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzProvider.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzProvider.java @@ -7,6 +7,7 @@ package com.powsybl.dynawaltz; import com.google.auto.service.AutoService; +import com.powsybl.commons.config.PlatformConfig; import com.powsybl.commons.exceptions.UncheckedXmlStreamException; import com.powsybl.computation.*; import com.powsybl.dynamicsimulation.*; @@ -50,13 +51,20 @@ public class DynaWaltzProvider implements DynamicSimulationProvider { private static final String OUTPUT_IIDM_FILENAME = "outputIIDM.xml"; private static final String IIDM_VERSION = IidmXmlVersion.V_1_4.toString("."); + private final PlatformConfig platformConfig; + private final DynaWaltzConfig dynaWaltzConfig; public DynaWaltzProvider() { - this(DynaWaltzConfig.load()); + this(PlatformConfig.defaultConfig()); + } + + public DynaWaltzProvider(PlatformConfig platformConfig) { + this(platformConfig, DynaWaltzConfig.load(platformConfig)); } - public DynaWaltzProvider(DynaWaltzConfig dynawoConfig) { + public DynaWaltzProvider(PlatformConfig platformConfig, DynaWaltzConfig dynawoConfig) { + this.platformConfig = Objects.requireNonNull(platformConfig); this.dynaWaltzConfig = Objects.requireNonNull(dynawoConfig); } @@ -105,7 +113,7 @@ private CompletableFuture run(Network network, DynamicM .filter(BlackBoxModel.class::isInstance) .map(BlackBoxModel.class::cast) .collect(Collectors.toList()); - DynaWaltzContext context = new DynaWaltzContext(network, workingVariantId, blackBoxModels, blackBoxEventModels, curvesSupplier.get(network), parameters, dynaWaltzParameters); + DynaWaltzContext context = new DynaWaltzContext(network, workingVariantId, blackBoxModels, blackBoxEventModels, curvesSupplier.get(network), parameters, dynaWaltzParameters, platformConfig); return computationManager.execute(execEnv, new DynaWaltzHandler(context)); } @@ -128,7 +136,7 @@ public List before(Path workingDir) throws IOException { Files.delete(curvesPath); } writeInputFiles(workingDir); - Command cmd = createCommand(workingDir.resolve(JOBS_FILENAME)); + Command cmd = createCommand(); return Collections.singletonList(new CommandExecution(cmd, 1)); } @@ -176,12 +184,12 @@ private void writeInputFiles(Path workingDir) { } } - private Command createCommand(Path dynawoJobsFile) { + private Command createCommand() { return new GroupCommandBuilder() .id("dyn_fs") .subCommand() .program(getProgram()) - .args("jobs", dynawoJobsFile.toString()) + .args("jobs", JOBS_FILENAME) .add() .build(); } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/xml/ParametersXml.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/xml/ParametersXml.java index ad6c5d879..a9f35df4b 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/xml/ParametersXml.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/xml/ParametersXml.java @@ -38,17 +38,17 @@ public static void write(Path workingDir, DynaWaltzContext context) throws IOExc Objects.requireNonNull(workingDir); DynaWaltzParameters parameters = context.getDynaWaltzParameters(); - copy(parameters.getParametersFile(), workingDir); - copy(parameters.getNetwork().getParametersFile(), workingDir); - copy(parameters.getSolver().getParametersFile(), workingDir); + copy(parameters.getParametersFile(), workingDir, context.getPlatformConfig()); + copy(parameters.getNetwork().getParametersFile(), workingDir, context.getPlatformConfig()); + copy(parameters.getSolver().getParametersFile(), workingDir, context.getPlatformConfig()); // Write parameterSet that needs to be generated (OmegaRef...) Path file = workingDir.resolve(context.getSimulationParFile()); XmlUtil.write(file, context, "parametersSet", ParametersXml::write); } - private static void copy(String filename, Path workingDir) throws IOException { - FileSystem fs = PlatformConfig.defaultConfig().getConfigDir() + private static void copy(String filename, Path workingDir, PlatformConfig platformConfig) throws IOException { + FileSystem fs = platformConfig.getConfigDir() .map(Path::getFileSystem) .orElseThrow(() -> new PowsyblException("A configuration directory should be defined")); Path source = fs.getPath(filename); diff --git a/dynawo-integration-tests/pom.xml b/dynawo-integration-tests/pom.xml new file mode 100644 index 000000000..af178426b --- /dev/null +++ b/dynawo-integration-tests/pom.xml @@ -0,0 +1,68 @@ + + + + 4.0.0 + + + com.powsybl + powsybl-dynawo + 1.12.0-SNAPSHOT + + + powsybl-dynawo-integration-tests + Dynawo integration tests + Dynawo integration tests really running Dynawo + + + + + com.powsybl + powsybl-computation-local-test + + + com.powsybl + powsybl-dynaflow + + + com.powsybl + powsybl-dynawaltz + + + com.powsybl + powsybl-dynawaltz-dsl + + + com.powsybl + powsybl-ieee-cdf-converter + + + + + junit + junit + test + + + org.slf4j + slf4j-simple + test + + + com.powsybl + powsybl-config-classic + test + + + com.powsybl + powsybl-iidm-impl + test + + + diff --git a/dynawo-integration-tests/src/test/java/com/powsybl/dynawo/it/AbstractDynawoTest.java b/dynawo-integration-tests/src/test/java/com/powsybl/dynawo/it/AbstractDynawoTest.java new file mode 100644 index 000000000..16741b138 --- /dev/null +++ b/dynawo-integration-tests/src/test/java/com/powsybl/dynawo/it/AbstractDynawoTest.java @@ -0,0 +1,54 @@ +/** + * Copyright (c) 2022, 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.dynawo.it; + +import com.powsybl.computation.ComputationManager; +import com.powsybl.computation.local.test.ComputationDockerConfig; +import com.powsybl.computation.local.test.DockerLocalComputationManager; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.rules.TemporaryFolder; + +import java.io.InputStream; +import java.nio.file.Path; +import java.util.Objects; + +/** + * @author Geoffroy Jamgotchian + */ +public abstract class AbstractDynawoTest { + + private static final String DYNAWO_VERSION = "1.3.1"; + + private static final String DOCKER_IMAGE_ID = "powsybl/java-dynawo:" + DYNAWO_VERSION; + + @Rule + public final TemporaryFolder tempFolder = new TemporaryFolder(); + + protected Path localDir; + + protected ComputationManager computationManager; + + @Before + public void setUp() throws Exception { + localDir = tempFolder.getRoot().toPath(); + Path dockerDir = Path.of("/home/powsybl"); + ComputationDockerConfig config = new ComputationDockerConfig() + .setDockerImageId(DOCKER_IMAGE_ID); + computationManager = new DockerLocalComputationManager(localDir, dockerDir, config); + } + + @After + public void tearDown() { + computationManager.close(); + } + + protected static InputStream getResourceAsStream(String name) { + return Objects.requireNonNull(AbstractDynawoTest.class.getResourceAsStream(name)); + } +} diff --git a/dynawo-integration-tests/src/test/java/com/powsybl/dynawo/it/DynaFlowTest.java b/dynawo-integration-tests/src/test/java/com/powsybl/dynawo/it/DynaFlowTest.java new file mode 100644 index 000000000..4e32fa9a0 --- /dev/null +++ b/dynawo-integration-tests/src/test/java/com/powsybl/dynawo/it/DynaFlowTest.java @@ -0,0 +1,87 @@ +/** + * Copyright (c) 2022, 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.dynawo.it; + +import com.powsybl.commons.reporter.Reporter; +import com.powsybl.contingency.Contingency; +import com.powsybl.dynaflow.DynaFlowConfig; +import com.powsybl.dynaflow.DynaFlowParameters; +import com.powsybl.dynaflow.DynaFlowProvider; +import com.powsybl.dynaflow.DynaFlowSecurityAnalysisProvider; +import com.powsybl.ieeecdf.converter.IeeeCdfNetworkFactory; +import com.powsybl.iidm.network.Network; +import com.powsybl.iidm.network.VariantManagerConstants; +import com.powsybl.loadflow.LoadFlowParameters; +import com.powsybl.loadflow.LoadFlowResult; +import com.powsybl.security.LimitViolationFilter; +import com.powsybl.security.SecurityAnalysisParameters; +import com.powsybl.security.SecurityAnalysisResult; +import com.powsybl.security.detectors.DefaultLimitViolationDetector; +import org.junit.Before; +import org.junit.Test; + +import java.nio.file.Path; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; + +/** + * @author Geoffroy Jamgotchian + */ +public class DynaFlowTest extends AbstractDynawoTest { + + private DynaFlowProvider loadFlowProvider; + + private DynaFlowSecurityAnalysisProvider securityAnalysisProvider; + + private LoadFlowParameters loadFlowParameters; + + private DynaFlowParameters dynaFlowLoadFlowParameters; + + private SecurityAnalysisParameters securityAnalysisParameters; + + @Override + @Before + public void setUp() throws Exception { + super.setUp(); + DynaFlowConfig config = new DynaFlowConfig(Path.of("/dynaflow-launcher"), false); + loadFlowProvider = new DynaFlowProvider(() -> config); + loadFlowParameters = new LoadFlowParameters(); + dynaFlowLoadFlowParameters = new DynaFlowParameters(); + securityAnalysisProvider = new DynaFlowSecurityAnalysisProvider(() -> config); + securityAnalysisParameters = new SecurityAnalysisParameters(); + loadFlowParameters.addExtension(DynaFlowParameters.class, dynaFlowLoadFlowParameters); + } + + @Test + public void testLf() { + Network network = IeeeCdfNetworkFactory.create14(); + LoadFlowResult result = loadFlowProvider.run(network, computationManager, VariantManagerConstants.INITIAL_VARIANT_ID, loadFlowParameters) + .join(); + assertFalse(result.isOk()); // FIXME + assertEquals(1, result.getComponentResults().size()); + LoadFlowResult.ComponentResult componentResult = result.getComponentResults().get(0); + assertEquals(LoadFlowResult.ComponentResult.Status.FAILED, componentResult.getStatus()); // FIXME + } + + @Test + public void testSa() { + Network network = IeeeCdfNetworkFactory.create14(); + List contingencies = network.getLineStream() + .map(l -> Contingency.line(l.getId())) + .collect(Collectors.toList()); + SecurityAnalysisResult result = securityAnalysisProvider.run(network, VariantManagerConstants.INITIAL_VARIANT_ID, new DefaultLimitViolationDetector(), + new LimitViolationFilter(), computationManager, securityAnalysisParameters, n -> contingencies, Collections.emptyList(), + Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), Reporter.NO_OP) + .join() + .getResult(); + assertEquals(LoadFlowResult.ComponentResult.Status.FAILED, result.getPreContingencyResult().getStatus()); // FIXME + } +} diff --git a/dynawo-integration-tests/src/test/java/com/powsybl/dynawo/it/DynaWaltzTest.java b/dynawo-integration-tests/src/test/java/com/powsybl/dynawo/it/DynaWaltzTest.java new file mode 100644 index 000000000..2bf6e463d --- /dev/null +++ b/dynawo-integration-tests/src/test/java/com/powsybl/dynawo/it/DynaWaltzTest.java @@ -0,0 +1,99 @@ +/** + * Copyright (c) 2022, 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.dynawo.it; + +import com.powsybl.commons.config.PlatformConfig; +import com.powsybl.commons.datasource.ResourceDataSource; +import com.powsybl.commons.datasource.ResourceSet; +import com.powsybl.dynamicsimulation.DynamicSimulationParameters; +import com.powsybl.dynamicsimulation.DynamicSimulationProvider; +import com.powsybl.dynamicsimulation.DynamicSimulationResult; +import com.powsybl.dynamicsimulation.groovy.*; +import com.powsybl.dynawaltz.DynaWaltzConfig; +import com.powsybl.dynawaltz.DynaWaltzParameters; +import com.powsybl.dynawaltz.DynaWaltzProvider; +import com.powsybl.iidm.network.Network; +import com.powsybl.iidm.network.VariantManagerConstants; +import com.powsybl.timeseries.DoubleTimeSeries; +import com.powsybl.timeseries.StringTimeSeries; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.nio.file.Files; +import java.util.List; + +import static org.junit.Assert.*; + +/** + * @author Geoffroy Jamgotchian + */ +public class DynaWaltzTest extends AbstractDynawoTest { + + private DynamicSimulationProvider provider; + + private DynamicSimulationParameters parameters; + + private DynaWaltzParameters dynaWaltzParameters; + + @Override + @Before + public void setUp() throws Exception { + super.setUp(); + provider = new DynaWaltzProvider(PlatformConfig.defaultConfig(), new DynaWaltzConfig("/dynawo", false)); + parameters = new DynamicSimulationParameters() + .setStartTime(1) + .setStopTime(100); + dynaWaltzParameters = new DynaWaltzParameters(); + parameters.addExtension(DynaWaltzParameters.class, dynaWaltzParameters); + } + + @Test + public void test() throws IOException { + Network network = Network.read(new ResourceDataSource("IEEE14", new ResourceSet("/ieee14-disconnectline", "IEEE14.iidm"))); + + GroovyDynamicModelsSupplier dynamicModelsSupplier = new GroovyDynamicModelsSupplier( + getResourceAsStream("/ieee14-disconnectline/dynamicModels.groovy"), + GroovyExtension.find(DynamicModelGroovyExtension.class, DynaWaltzProvider.NAME)); + + GroovyEventModelsSupplier eventModelsSupplier = new GroovyEventModelsSupplier( + getResourceAsStream("/ieee14-disconnectline/eventModels.groovy"), + GroovyExtension.find(EventModelGroovyExtension.class, DynaWaltzProvider.NAME)); + + GroovyCurvesSupplier curvesSupplier = new GroovyCurvesSupplier( + getResourceAsStream("/ieee14-disconnectline/curves.groovy"), + GroovyExtension.find(CurveGroovyExtension.class, DynaWaltzProvider.NAME)); + + // FIXME waiting for being able to pass parameters as an input stream + for (String parFileName : List.of("models.par", "network.par", "solvers.par")) { + Files.copy(getResourceAsStream("/ieee14-disconnectline/" + parFileName), localDir.resolve(parFileName)); + } + + // FIXME this should not be dependent of the run, all par file should be provider through an input stream + dynaWaltzParameters.setParametersFile(localDir.resolve("models.par").toString()) + .setNetwork(new DynaWaltzParameters.Network() + .setParametersId("8") + .setParametersFile(localDir.resolve("network.par").toString())) + .setSolver(new DynaWaltzParameters.Solver() + .setType(DynaWaltzParameters.SolverType.IDA) + .setParametersId("2") + .setParametersFile(localDir.resolve("solvers.par").toString())); + + DynamicSimulationResult result = provider.run(network, dynamicModelsSupplier, eventModelsSupplier, curvesSupplier, + VariantManagerConstants.INITIAL_VARIANT_ID, computationManager, parameters) + .join(); + + assertTrue(result.isOk()); + assertEquals(41, result.getCurves().size()); + DoubleTimeSeries ts1 = (DoubleTimeSeries) result.getCurve("_GEN____1_SM_generator_UStatorPu"); + assertEquals("_GEN____1_SM_generator_UStatorPu", ts1.getMetadata().getName()); + assertEquals(589, ts1.toArray().length); + StringTimeSeries timeLine = result.getTimeLine(); + assertEquals(1, timeLine.toArray().length); + assertNull(timeLine.toArray()[0]); // FIXME why null???? + } +} diff --git a/dynawo-integration-tests/src/test/resources/ieee14-disconnectline/IEEE14.iidm b/dynawo-integration-tests/src/test/resources/ieee14-disconnectline/IEEE14.iidm new file mode 100644 index 000000000..a38ece8f0 --- /dev/null +++ b/dynawo-integration-tests/src/test/resources/ieee14-disconnectline/IEEE14.iidm @@ -0,0 +1,226 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dynawo-integration-tests/src/test/resources/ieee14-disconnectline/curves.groovy b/dynawo-integration-tests/src/test/resources/ieee14-disconnectline/curves.groovy new file mode 100644 index 000000000..7bf0f8979 --- /dev/null +++ b/dynawo-integration-tests/src/test/resources/ieee14-disconnectline/curves.groovy @@ -0,0 +1,33 @@ +/** + * Copyright (c) 2020, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +import com.powsybl.iidm.network.Bus +import com.powsybl.iidm.network.Generator +import com.powsybl.iidm.network.Load + +for (Bus bus : network.busBreakerView.buses) { + curve { + staticId bus.id + variable "Upu_value" + } +} + +for (Generator gen : network.generators) { + curves { + dynamicModelId gen.id + variables "generator_omegaPu", "generator_PGen", "generator_QGen", "generator_UStatorPu", "voltageRegulator_EfdPu" + } +} + +for (Load load : network.loads) { + if (load.id == "_LOAD___2_EC") { + curve { + dynamicModelId load.id + variables "load_PPu", "load_QPu" + } + } +} \ No newline at end of file diff --git a/dynawo-integration-tests/src/test/resources/ieee14-disconnectline/dynamicModels.groovy b/dynawo-integration-tests/src/test/resources/ieee14-disconnectline/dynamicModels.groovy new file mode 100644 index 000000000..03c11d976 --- /dev/null +++ b/dynawo-integration-tests/src/test/resources/ieee14-disconnectline/dynamicModels.groovy @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2020, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +import com.powsybl.iidm.network.Load +import com.powsybl.iidm.network.Generator + +for (Load load : network.loads) { + if (load.id != "_LOAD___8_EC") { + LoadAlphaBeta { + staticId load.id + parameterSetId "LAB" + } + } +} + +for (Generator gen : network.generators) { + if (gen.id != "_GEN____6_SM" && gen.id != "_GEN____8_SM") { + GeneratorSynchronousFourWindingsProportionalRegulations { + staticId gen.id + parameterSetId "GSFWPR" + gen.id + } + } else { + GeneratorSynchronousThreeWindingsProportionalRegulations { + staticId gen.id + parameterSetId "GSTWPR" + gen.id + } + } +} \ No newline at end of file diff --git a/dynawo-integration-tests/src/test/resources/ieee14-disconnectline/eventModels.groovy b/dynawo-integration-tests/src/test/resources/ieee14-disconnectline/eventModels.groovy new file mode 100644 index 000000000..2b595aa94 --- /dev/null +++ b/dynawo-integration-tests/src/test/resources/ieee14-disconnectline/eventModels.groovy @@ -0,0 +1,21 @@ +/** + * Copyright (c) 2020, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +import com.powsybl.iidm.network.Line + + +for (Line line : network.lines) { + if (line.id == "_BUS____1-BUS____5-1_AC") { + EventQuadripoleDisconnection { + staticId line.id + eventModelId "DISCONNECT_LINE" + startTime 1 + disconnectOrigin false + disconnectExtremity true + } + } +} diff --git a/dynawo-integration-tests/src/test/resources/ieee14-disconnectline/models.par b/dynawo-integration-tests/src/test/resources/ieee14-disconnectline/models.par new file mode 100644 index 000000000..8a87f17f3 --- /dev/null +++ b/dynawo-integration-tests/src/test/resources/ieee14-disconnectline/models.par @@ -0,0 +1,272 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dynawo-integration-tests/src/test/resources/ieee14-disconnectline/network.par b/dynawo-integration-tests/src/test/resources/ieee14-disconnectline/network.par new file mode 100644 index 000000000..20df85e29 --- /dev/null +++ b/dynawo-integration-tests/src/test/resources/ieee14-disconnectline/network.par @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dynawo-integration-tests/src/test/resources/ieee14-disconnectline/solvers.par b/dynawo-integration-tests/src/test/resources/ieee14-disconnectline/solvers.par new file mode 100644 index 000000000..c74be67d1 --- /dev/null +++ b/dynawo-integration-tests/src/test/resources/ieee14-disconnectline/solvers.par @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pom.xml b/pom.xml index cd55227c5..e25afbed3 100644 --- a/pom.xml +++ b/pom.xml @@ -80,6 +80,15 @@ + + integration-tests + + false + + + dynawo-integration-tests + +