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
+
+