diff --git a/commons/src/main/java/com/powsybl/dynawo/commons/AbstractCsvParser.java b/commons/src/main/java/com/powsybl/dynawo/commons/AbstractCsvParser.java new file mode 100644 index 000000000..2ccfed9eb --- /dev/null +++ b/commons/src/main/java/com/powsybl/dynawo/commons/AbstractCsvParser.java @@ -0,0 +1,80 @@ +/** + * 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.dynawo.commons; + +import com.powsybl.commons.PowsyblException; +import com.univocity.parsers.common.ParsingContext; +import com.univocity.parsers.common.ResultIterator; +import com.univocity.parsers.csv.CsvParser; +import com.univocity.parsers.csv.CsvParserSettings; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.UncheckedIOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.*; + +/** + * @author Laurent Issertial {@literal } + */ +public abstract class AbstractCsvParser { + + protected static final char DEFAULT_SEPARATOR = '|'; + + private final char separator; + + protected AbstractCsvParser(char separator) { + this.separator = separator; + } + + public List parse(Path file) { + if (!Files.exists(file)) { + return Collections.emptyList(); + } + + try (BufferedReader reader = Files.newBufferedReader(file, StandardCharsets.UTF_8)) { + return parse(reader); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + + private List parse(BufferedReader reader) { + Objects.requireNonNull(reader); + CsvParserSettings settings = new CsvParserSettings(); + settings.getFormat().setDelimiter(separator); + settings.getFormat().setQuoteEscape('"'); + settings.getFormat().setLineSeparator(System.lineSeparator()); + settings.setMaxColumns(getNbColumns()); + CsvParser csvParser = new CsvParser(settings); + ResultIterator iterator = csvParser.iterate(reader).iterator(); + return read(iterator); + } + + protected List read(ResultIterator iterator) { + List logs = new ArrayList<>(); + int iLine = 0; + while (iterator.hasNext()) { + iLine++; + String[] tokens = iterator.next(); + if (!hasCorrectNbColumns(tokens.length)) { + throw new PowsyblException("Columns of line " + iLine + " are inconsistent"); + } + createEntry(tokens).ifPresent(logs::add); + } + return logs; + } + + protected abstract Optional createEntry(String[] tokens); + + protected abstract boolean hasCorrectNbColumns(int tokensSize); + + protected abstract int getNbColumns(); +} diff --git a/commons/src/main/java/com/powsybl/dynawo/commons/CommonReports.java b/commons/src/main/java/com/powsybl/dynawo/commons/CommonReports.java new file mode 100644 index 000000000..a5ede19af --- /dev/null +++ b/commons/src/main/java/com/powsybl/dynawo/commons/CommonReports.java @@ -0,0 +1,51 @@ +/** + * 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.dynawo.commons; + +import com.powsybl.commons.reporter.Report; +import com.powsybl.commons.reporter.Reporter; +import com.powsybl.commons.reporter.TypedValue; +import com.powsybl.dynawo.commons.dynawologs.LogEntry; +import com.powsybl.dynawo.commons.timeline.TimelineEntry; + +/** + * @author Laurent Issertial {@literal } + */ +public final class CommonReports { + + private static final String TIME_MS = "timeMsTypedValue"; + private static final String ID = "idTypedValue"; + + private CommonReports() { + } + + public static Reporter createDynawoLogReporter(Reporter reporter) { + return reporter.createSubReporter("dynawoLog", + "Dynawo Log"); + } + + public static void reportTimelineEvent(Reporter reporter, TimelineEntry timelineEntry) { + reporter.report(Report.builder() + .withKey("DynawoTimelineEvent") + .withDefaultMessage("[t=${time}] ${message} on equipment '${identifiableId}'") + .withTypedValue("time", timelineEntry.time(), TIME_MS) + .withTypedValue("identifiableId", timelineEntry.modelName(), ID) + .withValue("message", timelineEntry.message()) + .withSeverity(TypedValue.TRACE_SEVERITY) + .build()); + } + + public static void reportLogEvent(Reporter reporter, LogEntry logEntry) { + reporter.report(Report.builder() + .withKey("DynawoTimelineEvent") + .withDefaultMessage("${message}") + .withValue("message", logEntry.message()) + .withSeverity(logEntry.severity()) + .build()); + } +} diff --git a/commons/src/main/java/com/powsybl/dynawo/commons/DynawoConstants.java b/commons/src/main/java/com/powsybl/dynawo/commons/DynawoConstants.java index 9e1eebdd9..83d077995 100644 --- a/commons/src/main/java/com/powsybl/dynawo/commons/DynawoConstants.java +++ b/commons/src/main/java/com/powsybl/dynawo/commons/DynawoConstants.java @@ -26,6 +26,8 @@ private DynawoConstants() { public static final String DYNAWO_CMD_NAME = "dynawo"; + public static final String DYNAWO_TIMELINE_FOLDER = "timeLine"; + public static final DynawoVersion VERSION_MIN = new DynawoVersion(1, 5, 0); public static final List IIDM_EXTENSIONS = List.of( diff --git a/commons/src/main/java/com/powsybl/dynawo/commons/dynawologs/CsvLogParser.java b/commons/src/main/java/com/powsybl/dynawo/commons/dynawologs/CsvLogParser.java new file mode 100644 index 000000000..43a429139 --- /dev/null +++ b/commons/src/main/java/com/powsybl/dynawo/commons/dynawologs/CsvLogParser.java @@ -0,0 +1,44 @@ +/** + * 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.dynawo.commons.dynawologs; + +import com.powsybl.dynawo.commons.AbstractCsvParser; + +import java.util.Optional; + +/** + * @author Laurent Issertial {@literal } + */ +public final class CsvLogParser extends AbstractCsvParser { + + private static final int NB_COLUMNS = 4; + + public CsvLogParser() { + this(DEFAULT_SEPARATOR); + } + + public CsvLogParser(char separator) { + super(separator); + } + + @Override + protected Optional createEntry(String[] tokens) { + return tokens.length == NB_COLUMNS ? LogUtils.createLog(tokens[1], tokens[2] + " " + tokens[3]) + : LogUtils.createLog(tokens[1], tokens[2]); + } + + @Override + protected boolean hasCorrectNbColumns(int tokensSize) { + return tokensSize == NB_COLUMNS - 1 || tokensSize == NB_COLUMNS; + } + + @Override + protected int getNbColumns() { + return NB_COLUMNS; + } +} diff --git a/commons/src/main/java/com/powsybl/dynawo/commons/dynawologs/LogEntry.java b/commons/src/main/java/com/powsybl/dynawo/commons/dynawologs/LogEntry.java new file mode 100644 index 000000000..928221c4f --- /dev/null +++ b/commons/src/main/java/com/powsybl/dynawo/commons/dynawologs/LogEntry.java @@ -0,0 +1,17 @@ +/** + * 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.dynawo.commons.dynawologs; + +import com.powsybl.commons.reporter.TypedValue; + +/** + * @author Laurent Issertial {@literal } + */ +public record LogEntry(TypedValue severity, String message) { + +} diff --git a/commons/src/main/java/com/powsybl/dynawo/commons/dynawologs/LogUtils.java b/commons/src/main/java/com/powsybl/dynawo/commons/dynawologs/LogUtils.java new file mode 100644 index 000000000..760c431de --- /dev/null +++ b/commons/src/main/java/com/powsybl/dynawo/commons/dynawologs/LogUtils.java @@ -0,0 +1,57 @@ +/** + * 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.dynawo.commons.dynawologs; + +import com.powsybl.commons.reporter.TypedValue; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Optional; + +/** + * @author Laurent Issertial {@literal } + */ +public final class LogUtils { + + private static final Logger LOGGER = LoggerFactory.getLogger(LogUtils.class); + private static final String EMPTY_START = "======"; + private static final String EMPTY_BREAKER = "------"; + + private LogUtils() { + } + + public static Optional createLog(String severity, String message) { + if (severity == null) { + LOGGER.warn("Inconsistent log entry (modelName: '{}', message: '{}')", severity, message); + } else { + if (emptyMessage(message)) { + LOGGER.debug("Empty message, the entry will be skipped : {}", message); + } else { + return convertDynawoLog(severity).map(severityTypedValue -> new LogEntry(severityTypedValue, message)); + } + } + return Optional.empty(); + } + + private static Optional convertDynawoLog(String severity) { + return switch (severity) { + case "DEBUG" -> Optional.of(TypedValue.DEBUG_SEVERITY); + case "INFO" -> Optional.of(TypedValue.INFO_SEVERITY); + case "WARN" -> Optional.of(TypedValue.WARN_SEVERITY); + case "ERROR" -> Optional.of(TypedValue.ERROR_SEVERITY); + default -> { + LOGGER.warn("Inconsistent severity entry '{}'", severity); + yield Optional.empty(); + } + }; + } + + private static boolean emptyMessage(String message) { + return message == null || message.startsWith(EMPTY_BREAKER) || message.startsWith(EMPTY_START); + } +} diff --git a/commons/src/main/java/com/powsybl/dynawo/commons/timeline/CsvTimeLineParser.java b/commons/src/main/java/com/powsybl/dynawo/commons/timeline/CsvTimeLineParser.java index 473fff818..70b3e4a52 100644 --- a/commons/src/main/java/com/powsybl/dynawo/commons/timeline/CsvTimeLineParser.java +++ b/commons/src/main/java/com/powsybl/dynawo/commons/timeline/CsvTimeLineParser.java @@ -7,80 +7,37 @@ */ package com.powsybl.dynawo.commons.timeline; -import com.powsybl.commons.PowsyblException; -import com.univocity.parsers.common.ParsingContext; -import com.univocity.parsers.common.ResultIterator; -import com.univocity.parsers.csv.CsvParser; -import com.univocity.parsers.csv.CsvParserSettings; +import com.powsybl.dynawo.commons.AbstractCsvParser; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.UncheckedIOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Objects; +import java.util.Optional; /** * @author Laurent Issertial {@literal } */ -public final class CsvTimeLineParser implements TimeLineParser { +public final class CsvTimeLineParser extends AbstractCsvParser implements TimeLineParser { private static final int NB_COLUMNS = 3; - private final char separator; public CsvTimeLineParser() { - this('|'); + this(DEFAULT_SEPARATOR); } public CsvTimeLineParser(char separator) { - this.separator = separator; + super(separator); } - public List parse(Path file) { - return parse(file, separator); + @Override + protected Optional createEntry(String[] tokens) { + return TimeLineUtil.createEvent(tokens[0], tokens[1], tokens[2]); } - public static List parse(Path file, char separator) { - if (!Files.exists(file)) { - return Collections.emptyList(); - } - - try (BufferedReader reader = Files.newBufferedReader(file, StandardCharsets.UTF_8)) { - return parse(reader, separator); - } catch (IOException e) { - throw new UncheckedIOException(e); - } - } - - static List parse(BufferedReader reader, char separator) { - Objects.requireNonNull(reader); - CsvParserSettings settings = new CsvParserSettings(); - settings.getFormat().setDelimiter(separator); - settings.getFormat().setQuoteEscape('"'); - settings.getFormat().setLineSeparator(System.lineSeparator()); - settings.setMaxColumns(NB_COLUMNS); - CsvParser csvParser = new CsvParser(settings); - ResultIterator iterator = csvParser.iterate(reader).iterator(); - return read(iterator); + @Override + protected boolean hasCorrectNbColumns(int tokensSize) { + return NB_COLUMNS == tokensSize; } - static List read(ResultIterator iterator) { - List timeline = new ArrayList<>(); - int iLine = 0; - while (iterator.hasNext()) { - iLine++; - String[] tokens = iterator.next(); - if (tokens.length != NB_COLUMNS) { - throw new PowsyblException("Columns of line " + iLine + " are inconsistent"); - } - TimeLineUtil.createEvent(tokens[0], tokens[1], tokens[2]) - .ifPresent(timeline::add); - } - return timeline; + @Override + protected int getNbColumns() { + return NB_COLUMNS; } - } diff --git a/commons/src/test/java/com/powsybl/dynawo/commons/dynawologs/CsvLogParserTest.java b/commons/src/test/java/com/powsybl/dynawo/commons/dynawologs/CsvLogParserTest.java new file mode 100644 index 000000000..f9fc16b28 --- /dev/null +++ b/commons/src/test/java/com/powsybl/dynawo/commons/dynawologs/CsvLogParserTest.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.dynawo.commons.dynawologs; + +import com.powsybl.commons.reporter.TypedValue; +import org.junit.jupiter.api.Test; + +import java.net.URISyntaxException; +import java.nio.file.Path; +import java.util.List; +import java.util.Objects; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * @author Laurent Issertial {@literal } + */ +class CsvLogParserTest { + + @Test + void testLog() throws URISyntaxException { + + Path path = Path.of(Objects.requireNonNull(getClass().getResource("/dynawo.log")).toURI()); + List logs = new CsvLogParser().parse(path); + + assertEquals(6, logs.size()); + assertEquals("DYNAWO VERSION : 1.4.1", logs.get(0).message()); + assertEquals(TypedValue.INFO_SEVERITY, logs.get(0).severity()); + assertEquals("time iter num order (k) time step (h)", logs.get(1).message()); + assertEquals(TypedValue.INFO_SEVERITY, logs.get(1).severity()); + assertEquals("0.000 0 0 0.010", logs.get(2).message()); + assertEquals(TypedValue.INFO_SEVERITY, logs.get(2).severity()); + assertEquals("call of SolverReInit i.e. a new symbolic and numerical factorization will be performed", logs.get(3).message()); + assertEquals(TypedValue.DEBUG_SEVERITY, logs.get(3).severity()); + assertEquals("five consecutive steps have been taken that satisfy a scaled step length test", logs.get(4).message()); + assertEquals(TypedValue.WARN_SEVERITY, logs.get(4).severity()); + assertEquals("KINSOL fails to solve the problem ( DYNSolverKINAlgRestoration.cpp:394 )", logs.get(5).message()); + assertEquals(TypedValue.ERROR_SEVERITY, logs.get(5).severity()); + } +} diff --git a/commons/src/test/java/com/powsybl/dynawo/commons/timeline/CsvTimeLineParserTest.java b/commons/src/test/java/com/powsybl/dynawo/commons/timeline/CsvTimeLineParserTest.java index 91df30869..2b82a1d6a 100644 --- a/commons/src/test/java/com/powsybl/dynawo/commons/timeline/CsvTimeLineParserTest.java +++ b/commons/src/test/java/com/powsybl/dynawo/commons/timeline/CsvTimeLineParserTest.java @@ -50,8 +50,9 @@ void testTimeline(String fileName) throws URISyntaxException { @Test void testInconsistentFile() throws URISyntaxException { + CsvTimeLineParser parser = new CsvTimeLineParser('|'); Path path = Path.of(Objects.requireNonNull(getClass().getResource("/wrongTimeline.log")).toURI()); - Exception e = assertThrows(PowsyblException.class, () -> CsvTimeLineParser.parse(path, '|')); + Exception e = assertThrows(PowsyblException.class, () -> parser.parse(path)); assertEquals("Columns of line 2 are inconsistent", e.getMessage()); } } diff --git a/commons/src/test/resources/dynawo.log b/commons/src/test/resources/dynawo.log new file mode 100644 index 000000000..c6e2e7c0b --- /dev/null +++ b/commons/src/test/resources/dynawo.log @@ -0,0 +1,12 @@ +2023-11-09 11:36:53 | INFO | ============================================================ +2023-11-09 11:36:53 | INFO | DYNAWO VERSION : 1.4.1 +2023-11-09 11:36:53 | INFO | ============================================================ +2023-11-09 11:36:53 | INFO | +2023-11-13 11:36:53 | INFO | time | iter num order (k) time step (h) +2023-11-13 11:36:53 | INFO | ----------------------------------------------------------------------- +2023-11-13 11:36:53 | INFO | 0.000 | 0 0 0.010 +2023-11-09 11:36:58 | TRACE | Algebraic mode change for model CONST.TG6 at t = 0 +2023-11-09 11:36:58 | | Algebraic mode change for model CONST.TG7 at t = 0 +2023-11-09 11:36:58 | DEBUG | call of SolverReInit i.e. a new symbolic and numerical factorization will be performed +2023-11-09 11:36:59 | WARN | five consecutive steps have been taken that satisfy a scaled step length test +2023-11-09 11:36:59 | ERROR | KINSOL fails to solve the problem ( DYNSolverKINAlgRestoration.cpp:394 ) diff --git a/dynaflow/src/main/java/com/powsybl/dynaflow/DynaFlowConstants.java b/dynaflow/src/main/java/com/powsybl/dynaflow/DynaFlowConstants.java index c20c23d41..79f7287a6 100644 --- a/dynaflow/src/main/java/com/powsybl/dynaflow/DynaFlowConstants.java +++ b/dynaflow/src/main/java/com/powsybl/dynaflow/DynaFlowConstants.java @@ -21,7 +21,6 @@ public final class DynaFlowConstants { public static final String OUTPUT_IIDM_FILENAME = "outputIIDM.xml"; public static final String OUTPUT_RESULTS_FILENAME = "results.json"; static final String DYNAFLOW_OUTPUTS_FOLDER = "outputs"; - static final String DYNAWO_TIMELINE_FOLDER = "timeLine"; static final String DYNAFLOW_TIMELINE_FILE = "timeline.xml"; diff --git a/dynaflow/src/main/java/com/powsybl/dynaflow/DynaFlowParameters.java b/dynaflow/src/main/java/com/powsybl/dynaflow/DynaFlowParameters.java index 7405ebfc5..3d71517a5 100644 --- a/dynaflow/src/main/java/com/powsybl/dynaflow/DynaFlowParameters.java +++ b/dynaflow/src/main/java/com/powsybl/dynaflow/DynaFlowParameters.java @@ -37,7 +37,7 @@ public class DynaFlowParameters extends AbstractExtension { */ public static class Sa { private static final String SECURITY_ANALYSIS = "sa"; //Security analysis - private static final String TIME_OF_EVENT = "timeOfEvent"; + protected static final String TIME_OF_EVENT = "timeOfEvent"; private Double timeOfEvent = null; @@ -70,20 +70,20 @@ public boolean isSerializable() { } private static final String CHOSEN_OUTPUT_STRING_DELIMITER = ","; - private static final String SVC_REGULATION_ON = "svcRegulationOn"; - private static final String SHUNT_REGULATION_ON = "shuntRegulationOn"; - private static final String AUTOMATIC_SLACK_BUS_ON = "automaticSlackBusOn"; - private static final String DSO_VOLTAGE_LEVEL = "dsoVoltageLevel"; - private static final String ACTIVE_POWER_COMPENSATION = "activePowerCompensation"; - private static final String SETTING_PATH = "settingPath"; - private static final String ASSEMBLING_PATH = "assemblingPath"; - private static final String START_TIME = "startTime"; - private static final String STOP_TIME = "stopTime"; - private static final String PRECISION_NAME = "precision"; - private static final String CHOSEN_OUTPUTS = "chosenOutputs"; - private static final String TIME_STEP = "timeStep"; - private static final String STARTING_POINT_MODE = "startingPointMode"; - private static final String MERGE_LOADS = "mergeLoads"; + protected static final String SVC_REGULATION_ON = "svcRegulationOn"; + protected static final String SHUNT_REGULATION_ON = "shuntRegulationOn"; + protected static final String AUTOMATIC_SLACK_BUS_ON = "automaticSlackBusOn"; + protected static final String DSO_VOLTAGE_LEVEL = "dsoVoltageLevel"; + protected static final String ACTIVE_POWER_COMPENSATION = "activePowerCompensation"; + protected static final String SETTING_PATH = "settingPath"; + protected static final String ASSEMBLING_PATH = "assemblingPath"; + protected static final String START_TIME = "startTime"; + protected static final String STOP_TIME = "stopTime"; + protected static final String PRECISION_NAME = "precision"; + protected static final String CHOSEN_OUTPUTS = "chosenOutputs"; + protected static final String TIME_STEP = "timeStep"; + protected static final String STARTING_POINT_MODE = "startingPointMode"; + protected static final String MERGE_LOADS = "mergeLoads"; private static > List getEnumPossibleValues(Class enumClass) { return EnumSet.allOf(enumClass).stream().map(Enum::name).collect(Collectors.toList()); diff --git a/dynaflow/src/main/java/com/powsybl/dynaflow/DynaFlowProvider.java b/dynaflow/src/main/java/com/powsybl/dynaflow/DynaFlowProvider.java index 260795236..3af269043 100644 --- a/dynaflow/src/main/java/com/powsybl/dynaflow/DynaFlowProvider.java +++ b/dynaflow/src/main/java/com/powsybl/dynaflow/DynaFlowProvider.java @@ -17,6 +17,7 @@ import com.powsybl.computation.*; import com.powsybl.dynaflow.json.DynaFlowConfigSerializer; import com.powsybl.dynaflow.json.JsonDynaFlowParametersSerializer; +import com.powsybl.dynawo.commons.CommonReports; import com.powsybl.dynawo.commons.DynawoUtil; import com.powsybl.dynawo.commons.NetworkResultsUpdater; import com.powsybl.dynawo.commons.PowsyblDynawoVersion; @@ -38,6 +39,8 @@ import java.util.concurrent.CompletableFuture; import static com.powsybl.dynaflow.DynaFlowConstants.*; +import static com.powsybl.dynaflow.DynaFlowParameters.*; +import static com.powsybl.dynawo.commons.DynawoConstants.DYNAWO_TIMELINE_FOLDER; /** * @@ -120,6 +123,11 @@ public CompletableFuture run(Network network, ComputationManager return computationManager.execute(env, new DynaFlowHandler(network, workingStateId, dynaFlowParameters, loadFlowParameters, config, reporter)); } + @Override + public Optional>> getSpecificParametersClass() { + return Optional.of(DynaFlowParameters.class); + } + @Override public Optional> loadSpecificParameters(PlatformConfig platformConfig) { // if not specified, dynaflow parameters must be default here @@ -131,6 +139,26 @@ public Optional> loadSpecificParameters(Map createMapFromSpecificParameters(Extension extension) { + return Map.ofEntries( + Map.entry(SVC_REGULATION_ON, Boolean.toString(((DynaFlowParameters) extension).getSvcRegulationOn())), + Map.entry(SHUNT_REGULATION_ON, Boolean.toString(((DynaFlowParameters) extension).getShuntRegulationOn())), + Map.entry(AUTOMATIC_SLACK_BUS_ON, Boolean.toString(((DynaFlowParameters) extension).getAutomaticSlackBusOn())), + Map.entry(DSO_VOLTAGE_LEVEL, Double.toString(((DynaFlowParameters) extension).getDsoVoltageLevel())), + Map.entry(ACTIVE_POWER_COMPENSATION, ((DynaFlowParameters) extension).getActivePowerCompensation().name()), + Map.entry(SETTING_PATH, ((DynaFlowParameters) extension).getSettingPath()), + Map.entry(ASSEMBLING_PATH, ((DynaFlowParameters) extension).getAssemblingPath()), + Map.entry(START_TIME, Double.toString(((DynaFlowParameters) extension).getStartTime())), + Map.entry(STOP_TIME, Double.toString(((DynaFlowParameters) extension).getStopTime())), + Map.entry(PRECISION_NAME, Double.toString(((DynaFlowParameters) extension).getPrecision())), + Map.entry(Sa.TIME_OF_EVENT, Double.toString(((DynaFlowParameters) extension).getSa().getTimeOfEvent())), + Map.entry(CHOSEN_OUTPUTS, String.join(", ", ((DynaFlowParameters) extension).getChosenOutputs())), + Map.entry(TIME_STEP, Double.toString(((DynaFlowParameters) extension).getTimeStep())), + Map.entry(STARTING_POINT_MODE, ((DynaFlowParameters) extension).getStartingPointMode().name()), + Map.entry(MERGE_LOADS, Boolean.toString(((DynaFlowParameters) extension).isMergeLoads()))); + } + @Override public List getSpecificParameters() { return DynaFlowParameters.SPECIFIC_PARAMETERS; @@ -213,7 +241,7 @@ private void reportTimeLine(Path workingDir) { .resolve(DYNAWO_TIMELINE_FOLDER) .resolve(DYNAFLOW_TIMELINE_FILE); List tl = new XmlTimeLineParser().parse(timelineFile); - tl.forEach(e -> Reports.reportTimelineEvent(dfReporter, e)); + tl.forEach(e -> CommonReports.reportTimelineEvent(dfReporter, e)); } } } diff --git a/dynaflow/src/main/java/com/powsybl/dynaflow/DynaFlowSecurityAnalysis.java b/dynaflow/src/main/java/com/powsybl/dynaflow/DynaFlowSecurityAnalysis.java index efb09524f..431b03403 100644 --- a/dynaflow/src/main/java/com/powsybl/dynaflow/DynaFlowSecurityAnalysis.java +++ b/dynaflow/src/main/java/com/powsybl/dynaflow/DynaFlowSecurityAnalysis.java @@ -17,6 +17,7 @@ import com.powsybl.contingency.json.ContingencyJsonModule; import com.powsybl.dynaflow.json.DynaFlowConfigSerializer; import com.powsybl.dynaflow.xml.ConstraintsReader; +import com.powsybl.dynawo.commons.CommonReports; import com.powsybl.dynawo.commons.DynawoUtil; import com.powsybl.dynawo.commons.timeline.TimelineEntry; import com.powsybl.dynawo.commons.timeline.XmlTimeLineParser; @@ -40,6 +41,7 @@ import static com.powsybl.dynaflow.DynaFlowConstants.CONFIG_FILENAME; import static com.powsybl.dynaflow.DynaFlowConstants.IIDM_FILENAME; +import static com.powsybl.dynawo.commons.DynawoConstants.DYNAWO_TIMELINE_FOLDER; /** * @author Luma Zamarreno {@literal } @@ -170,10 +172,10 @@ public SecurityAnalysisReport after(Path workingDir, ExecutionReport report) thr .toList(); // Report the timeline events from the timeline files written by dynawo - Path timelineDir = workingDir.resolve(DynaFlowConstants.DYNAWO_TIMELINE_FOLDER); + Path timelineDir = workingDir.resolve(DYNAWO_TIMELINE_FOLDER); contingencies.forEach(c -> { Reporter contingencyReporter = Reports.createDynaFlowTimelineReporter(reporter, c.getId()); - getTimeline(timelineDir, c).forEach(e -> Reports.reportTimelineEvent(contingencyReporter, e)); + getTimeline(timelineDir, c).forEach(e -> CommonReports.reportTimelineEvent(contingencyReporter, e)); }); return new SecurityAnalysisReport( diff --git a/dynaflow/src/main/java/com/powsybl/dynaflow/Reports.java b/dynaflow/src/main/java/com/powsybl/dynaflow/Reports.java index f4819f55d..c88b08fb3 100644 --- a/dynaflow/src/main/java/com/powsybl/dynaflow/Reports.java +++ b/dynaflow/src/main/java/com/powsybl/dynaflow/Reports.java @@ -7,17 +7,12 @@ */ package com.powsybl.dynaflow; -import com.powsybl.commons.reporter.Report; import com.powsybl.commons.reporter.Reporter; -import com.powsybl.commons.reporter.TypedValue; -import com.powsybl.dynawo.commons.timeline.TimelineEntry; /** * @author Florian Dupuy {@literal } */ public final class Reports { - private static final String TIME_MS = "timeMsTypedValue"; - private static final String ID = "idTypedValue"; private Reports() { } @@ -39,15 +34,4 @@ public static Reporter createDynaFlowTimelineReporter(Reporter reporter, String "Contingency '${contingencyId}'", "contingencyId", contingencyId); } - - public static void reportTimelineEvent(Reporter reporter, TimelineEntry timelineEntry) { - reporter.report(Report.builder() - .withKey("DynawoTimelineEvent") - .withDefaultMessage("[t=${time}] ${message} on equipment '${identifiableId}'") - .withTypedValue("time", timelineEntry.time(), TIME_MS) - .withTypedValue("identifiableId", timelineEntry.modelName(), ID) - .withValue("message", timelineEntry.message()) - .withSeverity(TypedValue.TRACE_SEVERITY) - .build()); - } } diff --git a/dynaflow/src/main/java/com/powsybl/dynaflow/xml/ConstraintsReader.java b/dynaflow/src/main/java/com/powsybl/dynaflow/xml/ConstraintsReader.java index 9531b1c82..e666dde9c 100644 --- a/dynaflow/src/main/java/com/powsybl/dynaflow/xml/ConstraintsReader.java +++ b/dynaflow/src/main/java/com/powsybl/dynaflow/xml/ConstraintsReader.java @@ -84,10 +84,10 @@ public static List read(Network network, InputStream is) { reader.getAttributeValue(null, DESCRIPTION); // description: unused reader.getAttributeValue(null, TYPE); // type: unused String kind = reader.getAttributeValue(null, KIND); - double limit = readDouble(reader, LIMIT); - double value = readDouble(reader, VALUE); - Integer side = readInteger(reader, SIDE); - Integer acceptableDuration = readInteger(reader, ACCEPTABLE_DURATION, Integer.MAX_VALUE); + double limit = XmlUtil.readDoubleAttribute(reader, LIMIT, Double.NaN); + double value = XmlUtil.readDoubleAttribute(reader, VALUE, Double.NaN); + Integer side = XmlUtil.readIntegerAttribute(reader, SIDE); + int acceptableDuration = XmlUtil.readIntAttribute(reader, ACCEPTABLE_DURATION, Integer.MAX_VALUE); XmlUtil.readEndElementOrThrow(reader); getLimitViolation(network, name, kind, limit, 1f, value, side, acceptableDuration) @@ -103,21 +103,6 @@ public static List read(Network network, InputStream is) { } } - private static double readDouble(XMLStreamReader reader, String name) { - String doubleStr = reader.getAttributeValue(null, name); - return doubleStr != null ? Double.parseDouble(doubleStr) : Double.NaN; - } - - private static Integer readInteger(XMLStreamReader reader, String name) { - String intStr = reader.getAttributeValue(null, name); - return intStr != null ? Integer.valueOf(intStr) : null; - } - - private static int readInteger(XMLStreamReader reader, String name, int defaultValue) { - String intStr = reader.getAttributeValue(null, name); - return intStr != null ? Integer.parseInt(intStr) : defaultValue; - } - private static void addOrDismiss(LimitViolation lvRead, List limitViolations) { LimitViolationComparator comparator = new LimitViolationComparator(); limitViolations.stream().filter(lv -> comparator.compare(lvRead, lv) == 0).findFirst() diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/AbstractPureDynamicGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/AbstractPureDynamicGroovyExtension.groovy index b0658bf45..bef88de95 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/AbstractPureDynamicGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/AbstractPureDynamicGroovyExtension.groovy @@ -15,7 +15,7 @@ import com.powsybl.iidm.network.Network import java.util.function.Consumer /** - * Superclass for automaton & event groovy extensions + * Superclass for automaton and event groovy extensions * @author Laurent Issertial {@literal } */ abstract class AbstractPureDynamicGroovyExtension implements GroovyExtension { diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/Reporters.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/Reporters.groovy index 3ea04159f..b48921ab8 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/Reporters.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/Reporters.groovy @@ -13,7 +13,7 @@ import com.powsybl.commons.reporter.TypedValue import com.powsybl.iidm.network.IdentifiableType /** - * @author Laurent Issertial + * @author Laurent Issertial {@literal } */ final class Reporters { diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/CurrentLimitAutomatonGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/CurrentLimitAutomatonGroovyExtension.groovy index 00439dd46..ee1b82bf5 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/CurrentLimitAutomatonGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/CurrentLimitAutomatonGroovyExtension.groovy @@ -15,11 +15,8 @@ import com.powsybl.dynawaltz.dsl.AbstractPureDynamicGroovyExtension import com.powsybl.dynawaltz.dsl.DslEquipment import com.powsybl.dynawaltz.dsl.Reporters import com.powsybl.dynawaltz.dsl.builders.AbstractPureDynamicModelBuilder -import com.powsybl.dynawaltz.models.Side import com.powsybl.dynawaltz.models.automatons.CurrentLimitAutomaton -import com.powsybl.dynawaltz.models.utils.SideConverter import com.powsybl.iidm.network.Branch -import com.powsybl.iidm.network.IdentifiableType import com.powsybl.iidm.network.Network import com.powsybl.iidm.network.TwoSides @@ -47,7 +44,7 @@ class CurrentLimitAutomatonGroovyExtension extends AbstractPureDynamicGroovyExte static class CurrentLimitAutomatonBuilder extends AbstractPureDynamicModelBuilder { protected final DslEquipment iMeasurement - protected Side iMeasurementSide + protected TwoSides iMeasurementSide protected final DslEquipment controlledEquipment CurrentLimitAutomatonBuilder(Network network, String lib, Reporter reporter) { @@ -61,7 +58,7 @@ class CurrentLimitAutomatonGroovyExtension extends AbstractPureDynamicGroovyExte } void iMeasurementSide(TwoSides side) { - this.iMeasurementSide = SideConverter.convert(side) + this.iMeasurementSide = side } void controlledQuadripole(String staticId) { diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/CurrentLimitTwoLevelsAutomatonGroovyExtension.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/CurrentLimitTwoLevelsAutomatonGroovyExtension.groovy index 56aa888cc..aa510b6cb 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/CurrentLimitTwoLevelsAutomatonGroovyExtension.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/automatons/CurrentLimitTwoLevelsAutomatonGroovyExtension.groovy @@ -14,9 +14,7 @@ import com.powsybl.dynamicsimulation.groovy.DynamicModelGroovyExtension import com.powsybl.dynawaltz.dsl.AbstractPureDynamicGroovyExtension import com.powsybl.dynawaltz.dsl.DslEquipment import com.powsybl.dynawaltz.dsl.Reporters -import com.powsybl.dynawaltz.models.Side import com.powsybl.dynawaltz.models.automatons.CurrentLimitTwoLevelsAutomaton -import com.powsybl.dynawaltz.models.utils.SideConverter import com.powsybl.iidm.network.Branch import com.powsybl.iidm.network.Network import com.powsybl.iidm.network.TwoSides @@ -43,7 +41,7 @@ class CurrentLimitTwoLevelsAutomatonGroovyExtension extends AbstractPureDynamicG static class CurrentLimitAutomatonTwoLevelBuilder extends CurrentLimitAutomatonGroovyExtension.CurrentLimitAutomatonBuilder { protected final DslEquipment iMeasurement2 - protected Side iMeasurement2Side + protected TwoSides iMeasurement2Side CurrentLimitAutomatonTwoLevelBuilder(Network network, String lib, Reporter reporter) { super(network, lib, reporter) @@ -63,7 +61,7 @@ class CurrentLimitTwoLevelsAutomatonGroovyExtension extends AbstractPureDynamicG } void iMeasurement2Side(TwoSides side) { - this.iMeasurement2Side = SideConverter.convert(side) + this.iMeasurement2Side = side } @Override diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/builders/AbstractPureDynamicModelBuilder.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/builders/AbstractPureDynamicModelBuilder.groovy index 866f4e69a..80a489dff 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/builders/AbstractPureDynamicModelBuilder.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/builders/AbstractPureDynamicModelBuilder.groovy @@ -14,7 +14,7 @@ import com.powsybl.dynawaltz.dsl.Reporters import com.powsybl.iidm.network.Network /** - * Superclass for automaton & event model builders + * Superclass for automaton and event model builders * @author Laurent Issertial {@literal } */ abstract class AbstractPureDynamicModelBuilder extends AbstractDynamicModelBuilder implements ModelBuilder { diff --git a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/hvdc/AbstractHvdcBuilder.groovy b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/hvdc/AbstractHvdcBuilder.groovy index 1c3b7da02..e1de17971 100644 --- a/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/hvdc/AbstractHvdcBuilder.groovy +++ b/dynawaltz-dsl/src/main/groovy/com/powsybl/dynawaltz/dsl/models/hvdc/AbstractHvdcBuilder.groovy @@ -11,8 +11,6 @@ import com.powsybl.commons.reporter.Reporter import com.powsybl.dynawaltz.dsl.EquipmentConfig import com.powsybl.dynawaltz.dsl.Reporters import com.powsybl.dynawaltz.dsl.builders.AbstractEquipmentModelBuilder -import com.powsybl.dynawaltz.models.Side -import com.powsybl.dynawaltz.models.utils.SideConverter import com.powsybl.iidm.network.HvdcLine import com.powsybl.iidm.network.IdentifiableType import com.powsybl.iidm.network.Network @@ -23,14 +21,14 @@ import com.powsybl.iidm.network.TwoSides */ abstract class AbstractHvdcBuilder extends AbstractEquipmentModelBuilder { - protected Side danglingSide + protected TwoSides danglingSide AbstractHvdcBuilder(Network network, EquipmentConfig equipmentConfig, Reporter reporter) { super(network, equipmentConfig, IdentifiableType.HVDC_LINE, reporter) } void dangling(TwoSides danglingSide) { - this.danglingSide = SideConverter.convert(danglingSide) + this.danglingSide = danglingSide } @Override diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzContext.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzContext.java index bdf4ed3ab..3d90a8626 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzContext.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzContext.java @@ -26,6 +26,7 @@ import com.powsybl.dynawaltz.xml.MacroStaticReference; import com.powsybl.iidm.network.Identifiable; import com.powsybl.iidm.network.Network; +import com.powsybl.iidm.network.TwoSides; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -229,7 +230,7 @@ public String addMacroConnector(String name1, String name2, List return macroConnectorId; } - public String addMacroConnector(String name1, String name2, Side side, List varConnections) { + public String addMacroConnector(String name1, String name2, TwoSides side, List varConnections) { String macroConnectorId = MacroConnector.createMacroConnectorId(name1, name2, side); macroConnectorsMap.computeIfAbsent(macroConnectorId, k -> new MacroConnector(macroConnectorId, varConnections)); return macroConnectorId; diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzParameters.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzParameters.java index 0db50c223..82bf200f9 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzParameters.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzParameters.java @@ -139,7 +139,11 @@ public String getName() { } public ParametersSet getModelParameters(String parameterSetId) { - return modelsParameters.get(parameterSetId); + ParametersSet parametersSet = modelsParameters.get(parameterSetId); + if (parametersSet == null) { + throw new PowsyblException("Model parameter set " + parameterSetId + " not found"); + } + return parametersSet; } @JsonGetter("modelsParameters") diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzProvider.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzProvider.java index 2699ed989..03263f655 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzProvider.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynaWaltzProvider.java @@ -16,13 +16,14 @@ import com.powsybl.dynawaltz.xml.DydXml; import com.powsybl.dynawaltz.xml.JobsXml; import com.powsybl.dynawaltz.xml.ParametersXml; -import com.powsybl.dynawo.commons.DynawoConstants; -import com.powsybl.dynawo.commons.DynawoUtil; -import com.powsybl.dynawo.commons.NetworkResultsUpdater; +import com.powsybl.dynawo.commons.*; import com.powsybl.dynawo.commons.PowsyblDynawoVersion; +import com.powsybl.dynawo.commons.dynawologs.CsvLogParser; import com.powsybl.dynawo.commons.loadmerge.LoadsMerger; +import com.powsybl.dynawo.commons.timeline.CsvTimeLineParser; import com.powsybl.iidm.network.Network; import com.powsybl.iidm.serde.NetworkSerDe; +import com.powsybl.timeseries.DoubleTimeSeries; import com.powsybl.timeseries.TimeSeries; import com.powsybl.timeseries.TimeSeries.TimeFormat; import com.powsybl.timeseries.TimeSeriesConstants; @@ -36,9 +37,12 @@ import java.nio.file.StandardCopyOption; import java.util.*; import java.util.concurrent.CompletableFuture; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; import static com.powsybl.dynawaltz.xml.DynaWaltzConstants.*; +import static com.powsybl.dynawo.commons.DynawoConstants.DYNAWO_TIMELINE_FOLDER; /** * @author Marcos de Miguel {@literal } @@ -51,8 +55,13 @@ public class DynaWaltzProvider implements DynamicSimulationProvider { private static final String OUTPUTS_FOLDER = "outputs"; private static final String FINAL_STATE_FOLDER = "finalState"; + private static final String LOGS_FOLDER = "logs"; private static final String OUTPUT_IIDM_FILENAME = "outputIIDM.xml"; private static final String OUTPUT_DUMP_FILENAME = "outputState.dmp"; + private static final String TIMELINE_FILENAME = "timeline.log"; + private static final String LOGS_FILENAME = "dynawaltz.log"; + private static final String ERROR_FILENAME = "dyn_fs_0.err"; + private static final String DYNAWO_ERROR_PATTERN = "DYN Error: "; private static final Logger LOGGER = LoggerFactory.getLogger(DynaWaltzProvider.class); @@ -138,19 +147,26 @@ private CompletableFuture run(Network network, DynamicM .map(BlackBoxModel.class::cast) .collect(Collectors.toList()); DynaWaltzContext context = new DynaWaltzContext(network, workingVariantId, blackBoxModels, blackBoxEventModels, curvesSupplier.get(network, dsReporter), parameters, dynaWaltzParameters, reporter); - return computationManager.execute(execEnv, new DynaWaltzHandler(context)); + return computationManager.execute(execEnv, new DynaWaltzHandler(context, reporter)); } private final class DynaWaltzHandler extends AbstractExecutionHandler { private final DynaWaltzContext context; private final Network dynawoInput; + private final Reporter reporter; - public DynaWaltzHandler(DynaWaltzContext context) { + private final List timeline = new ArrayList<>(); + private final Map curves = new HashMap<>(); + private DynamicSimulationResult.Status status = DynamicSimulationResult.Status.SUCCESS; + private String statusText = ""; + + public DynaWaltzHandler(DynaWaltzContext context, Reporter reporter) { this.context = context; this.dynawoInput = context.getDynaWaltzParameters().isMergeLoads() ? LoadsMerger.mergeLoads(context.getNetwork()) : context.getNetwork(); + this.reporter = reporter; } @Override @@ -170,38 +186,95 @@ public List before(Path workingDir) throws IOException { @Override public DynamicSimulationResult after(Path workingDir, ExecutionReport report) throws IOException { - super.after(workingDir, report); + + Path outputsFolder = workingDir.resolve(OUTPUTS_FOLDER); context.getNetwork().getVariantManager().setWorkingVariant(context.getWorkingVariantId()); DynaWaltzParameters parameters = context.getDynaWaltzParameters(); DumpFileParameters dumpFileParameters = parameters.getDumpFileParameters(); - boolean status = true; - if (parameters.isWriteFinalState()) { - Path outputNetworkFile = workingDir.resolve(OUTPUTS_FOLDER).resolve(FINAL_STATE_FOLDER).resolve(OUTPUT_IIDM_FILENAME); - if (Files.exists(outputNetworkFile)) { - NetworkResultsUpdater.update(context.getNetwork(), NetworkSerDe.read(outputNetworkFile), context.getDynaWaltzParameters().isMergeLoads()); + + setDynawoLog(outputsFolder); + // Error file + Path errorFile = workingDir.resolve(ERROR_FILENAME); + if (Files.exists(errorFile)) { + Matcher errorMatcher = Pattern.compile(DYNAWO_ERROR_PATTERN + "(.*)") + .matcher(Files.readString(errorFile)); + if (!errorMatcher.find()) { + if (parameters.isWriteFinalState()) { + updateNetwork(outputsFolder); + } + if (dumpFileParameters.exportDumpFile()) { + setDumpFile(outputsFolder, dumpFileParameters.dumpFileFolder(), workingDir.getFileName()); + } + setTimeline(outputsFolder); + if (context.withCurves()) { + setCurves(workingDir); + } } else { - status = false; + status = DynamicSimulationResult.Status.FAILURE; + statusText = errorMatcher.group().substring(DYNAWO_ERROR_PATTERN.length()); } + } else { + LOGGER.warn("Error file not found"); + status = DynamicSimulationResult.Status.FAILURE; + statusText = "Dynawo error log file not found"; } - if (dumpFileParameters.exportDumpFile()) { - Path outputDumpFile = workingDir.resolve(OUTPUTS_FOLDER).resolve(FINAL_STATE_FOLDER).resolve(OUTPUT_DUMP_FILENAME); - if (Files.exists(outputDumpFile)) { - Files.copy(outputDumpFile, dumpFileParameters.dumpFileFolder().resolve(workingDir.getFileName() + "_" + OUTPUT_DUMP_FILENAME), StandardCopyOption.REPLACE_EXISTING); - } else { - LOGGER.warn("Dump file {} not found, export will be skipped", OUTPUT_DUMP_FILENAME); - } + + return new DynamicSimulationResultImpl(status, statusText, curves, timeline); + } + + private void setDynawoLog(Path outputsFolder) { + Path logFile = outputsFolder.resolve(LOGS_FOLDER).resolve(LOGS_FILENAME); + if (Files.exists(logFile)) { + Reporter logReporter = CommonReports.createDynawoLogReporter(reporter); + new CsvLogParser().parse(logFile).forEach(e -> CommonReports.reportLogEvent(logReporter, e)); + } else { + LOGGER.warn("Dynawo logs file not found"); + } + } + + private void updateNetwork(Path outputsFolder) { + Path outputNetworkFile = outputsFolder.resolve(FINAL_STATE_FOLDER).resolve(OUTPUT_IIDM_FILENAME); + if (Files.exists(outputNetworkFile)) { + NetworkResultsUpdater.update(context.getNetwork(), NetworkSerDe.read(outputNetworkFile), context.getDynaWaltzParameters().isMergeLoads()); + } else { + LOGGER.warn("Output IIDM file not found"); + status = DynamicSimulationResult.Status.FAILURE; + statusText = "Dynawo Output IIDM file not found"; } + } + + private void setDumpFile(Path outputsFolder, Path dumpFileFolder, Path fileName) throws IOException { + Path outputDumpFile = outputsFolder.resolve(FINAL_STATE_FOLDER).resolve(OUTPUT_DUMP_FILENAME); + if (Files.exists(outputDumpFile)) { + Files.copy(outputDumpFile, dumpFileFolder.resolve(fileName + "_" + OUTPUT_DUMP_FILENAME), StandardCopyOption.REPLACE_EXISTING); + } else { + LOGGER.warn("Dump file {} not found, export will be skipped", OUTPUT_DUMP_FILENAME); + } + } + + private void setTimeline(Path outputsFolder) { + Path timelineFile = outputsFolder.resolve(DYNAWO_TIMELINE_FOLDER).resolve(TIMELINE_FILENAME); + if (Files.exists(timelineFile)) { + Reporter timelineReporter = DynawaltzReports.createDynaWaltzTimelineReporter(reporter); + new CsvTimeLineParser().parse(timelineFile).forEach(e -> { + CommonReports.reportTimelineEvent(timelineReporter, e); + timeline.add(new TimelineEvent(e.time(), e.modelName(), e.message())); + }); + } else { + LOGGER.warn("Timeline file not found"); + } + } + + private void setCurves(Path workingDir) { Path curvesPath = workingDir.resolve(CURVES_OUTPUT_PATH).toAbsolutePath().resolve(CURVES_FILENAME); - Map curves = new HashMap<>(); if (Files.exists(curvesPath)) { - Map> curvesPerVersion = TimeSeries.parseCsv(curvesPath, new TimeSeriesCsvConfig(TimeSeriesConstants.DEFAULT_SEPARATOR, false, TimeFormat.FRACTIONS_OF_SECOND)); - curvesPerVersion.values().forEach(l -> l.forEach(curve -> curves.put(curve.getMetadata().getName(), curve))); + TimeSeries.parseCsv(curvesPath, new TimeSeriesCsvConfig(TimeSeriesConstants.DEFAULT_SEPARATOR, false, TimeFormat.FRACTIONS_OF_SECOND)) + .values().forEach(l -> l.forEach(curve -> curves.put(curve.getMetadata().getName(), (DoubleTimeSeries) curve))); } else { - if (context.withCurves()) { - status = false; - } + LOGGER.warn("Curves folder not found"); + status = DynamicSimulationResult.Status.FAILURE; + statusText = "Dynawo curves folder not found"; } - return new DynamicSimulationResultImpl(status, null, curves, DynamicSimulationResult.emptyTimeLine()); } private void writeInputFiles(Path workingDir) throws IOException { diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynawaltzReports.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynawaltzReports.java index 06ee86e81..bb2736d3a 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynawaltzReports.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/DynawaltzReports.java @@ -12,7 +12,7 @@ import com.powsybl.commons.reporter.TypedValue; /** - * @author Laurent Issertial + * @author Laurent Issertial {@literal } */ public final class DynawaltzReports { @@ -30,6 +30,11 @@ public static Reporter createDynaWaltzContextReporter(Reporter reporter) { "Dynawaltz models processing"); } + public static Reporter createDynaWaltzTimelineReporter(Reporter reporter) { + return reporter.createSubReporter("dynawaltzTimeline", + "Dynawaltz Timeline"); + } + public static void reportDuplicateStaticId(Reporter reporter, String duplicateId, String modelName, String dynamicId) { reporter.report(Report.builder() .withKey("duplicateStaticId") @@ -51,20 +56,24 @@ public static void reportDuplicateDynamicId(Reporter reporter, String duplicateI .build()); } - public static void reportEmptyTapChanger(Reporter reporter, String dynamicId) { + public static void reportEmptyAutomaton(Reporter reporter, String automatonName, String dynamicId, String expectedModels) { reporter.report(Report.builder() - .withKey("emptyTC") - .withDefaultMessage("TapChangerAutomaton ${dynamicId} load does not possess a transformer, the automaton will be skipped") + .withKey("emptyAutomaton") + .withDefaultMessage("${automatonName} ${dynamicId} equipment is not a ${expectedModels}, the automaton will be skipped") + .withValue("automatonName", automatonName) .withValue("dynamicId", dynamicId) + .withValue("expectedModels", expectedModels) .withSeverity(TypedValue.WARN_SEVERITY) .build()); } - public static void reportEmptyTapChangerBlockingAutomaton(Reporter reporter, String dynamicId) { + public static void reportEmptyListAutomaton(Reporter reporter, String automatonName, String dynamicId, String expectedModels) { reporter.report(Report.builder() - .withKey("emptyTCB") - .withDefaultMessage("None of TapChangerBlockingAutomaton {} equipments are TapChangerModel, the automaton will be skipped") + .withKey("emptyListAutomaton") + .withDefaultMessage("None of ${automatonName} ${dynamicId} equipments are ${expectedModels}, the automaton will be skipped") + .withValue("automatonName", automatonName) .withValue("dynamicId", dynamicId) + .withValue("expectedModels", expectedModels) .withSeverity(TypedValue.WARN_SEVERITY) .build()); } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/AbstractBlackBoxModel.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/AbstractBlackBoxModel.java index 2e4079c41..7fb758d9b 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/AbstractBlackBoxModel.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/AbstractBlackBoxModel.java @@ -8,13 +8,11 @@ import com.powsybl.dynawaltz.DynaWaltzContext; import com.powsybl.dynawaltz.DynaWaltzParameters; +import com.powsybl.dynawaltz.models.buses.EquipmentConnectionPoint; import com.powsybl.dynawaltz.models.macroconnections.MacroConnectAttribute; import com.powsybl.dynawaltz.models.macroconnections.MacroConnectionSuffix; -import com.powsybl.dynawaltz.parameters.ParametersSet; -import com.powsybl.iidm.network.Identifiable; -import com.powsybl.dynawaltz.models.buses.EquipmentConnectionPoint; import com.powsybl.dynawaltz.models.utils.BusUtils; -import com.powsybl.dynawaltz.models.utils.SideConverter; +import com.powsybl.dynawaltz.parameters.ParametersSet; import com.powsybl.iidm.network.*; import javax.xml.stream.XMLStreamException; @@ -142,13 +140,13 @@ protected boolean createMacroConnectionsOrSkip(Identifiable /** * Suffixes MacroConnector id with side name */ - protected final void createMacroConnections(String modelStaticId, Class modelClass, BiFunction> varConnectionsSupplier, DynaWaltzContext context, Side side) { + protected final void createMacroConnections(String modelStaticId, Class modelClass, BiFunction> varConnectionsSupplier, DynaWaltzContext context, TwoSides side) { T connectedModel = context.getDynamicModel(modelStaticId, modelClass); String macroConnectorId = context.addMacroConnector(getName(), connectedModel.getName(), side, varConnectionsSupplier.apply(connectedModel, side)); context.addMacroConnect(macroConnectorId, getMacroConnectFromAttributes(), connectedModel.getMacroConnectToAttributes()); } - protected final void createMacroConnections(Identifiable equipment, Class modelClass, BiFunction> varConnectionsSupplier, DynaWaltzContext context, Side side) { + protected final void createMacroConnections(Identifiable equipment, Class modelClass, BiFunction> varConnectionsSupplier, DynaWaltzContext context, TwoSides side) { T connectedModel = context.getDynamicModel(equipment, modelClass); String macroConnectorId = context.addMacroConnector(getName(), connectedModel.getName(), side, varConnectionsSupplier.apply(connectedModel, side)); context.addMacroConnect(macroConnectorId, getMacroConnectFromAttributes(), connectedModel.getMacroConnectToAttributes()); @@ -182,14 +180,14 @@ protected void createTerminalMacroConnections(Injection equipment, Function> varConnectionsSupplier, DynaWaltzContext context, Side side) { + protected final void createTerminalMacroConnections(Terminal terminal, BiFunction> varConnectionsSupplier, DynaWaltzContext context, TwoSides side) { EquipmentConnectionPoint connectedModel = context.getConnectionPointDynamicModel(BusUtils.getConnectableBusStaticId(terminal)); String macroConnectorId = context.addMacroConnector(getName(), connectedModel.getName(), side, varConnectionsSupplier.apply(connectedModel, side)); context.addMacroConnect(macroConnectorId, getMacroConnectFromAttributes(), connectedModel.getMacroConnectToAttributes()); } - protected final void createTerminalMacroConnections(HvdcLine hvdc, BiFunction> varConnectionsSupplier, DynaWaltzContext context, Side side) { - HvdcConverterStation station = hvdc.getConverterStation(SideConverter.convert(side)); + protected final void createTerminalMacroConnections(HvdcLine hvdc, BiFunction> varConnectionsSupplier, DynaWaltzContext context, TwoSides side) { + HvdcConverterStation station = hvdc.getConverterStation(side); createTerminalMacroConnections(station.getTerminal(), varConnectionsSupplier, context, side); } } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/AbstractPureDynamicBlackBoxModel.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/AbstractPureDynamicBlackBoxModel.java index ca626fee6..52f0f659c 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/AbstractPureDynamicBlackBoxModel.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/AbstractPureDynamicBlackBoxModel.java @@ -16,7 +16,7 @@ import static com.powsybl.dynawaltz.xml.DynaWaltzXmlConstants.DYN_URI; /** - * Superclass for automaton & event black box models (model without IIDM static id) + * Superclass for automaton and event black box models (model without IIDM static id) * @author Florian Dupuy {@literal } * @author Laurent Issertial {@literal } */ diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/Side.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/Side.java deleted file mode 100644 index 24183d522..000000000 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/Side.java +++ /dev/null @@ -1,35 +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/. - * SPDX-License-Identifier: MPL-2.0 - */ -package com.powsybl.dynawaltz.models; - -/** - * @author Laurent Issertial {@literal } - */ -public enum Side { - - ONE("Side1"), - TWO("Side2"); - - private final String sideSuffix; - - Side(String sideSuffix) { - this.sideSuffix = sideSuffix; - } - - public String getSideSuffix() { - return sideSuffix; - } - - public int getSideNumber() { - return ordinal() + 1; - } - - public Side getOppositeSide() { - return this == ONE ? TWO : ONE; - } -} diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/automatons/CurrentLimitAutomaton.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/automatons/CurrentLimitAutomaton.java index d743b08ec..e454863cd 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/automatons/CurrentLimitAutomaton.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/automatons/CurrentLimitAutomaton.java @@ -8,9 +8,10 @@ import com.powsybl.dynawaltz.DynaWaltzContext; import com.powsybl.dynawaltz.models.AbstractPureDynamicBlackBoxModel; -import com.powsybl.dynawaltz.models.Side; import com.powsybl.dynawaltz.models.VarConnection; +import com.powsybl.dynawaltz.models.utils.SideUtils; import com.powsybl.iidm.network.Branch; +import com.powsybl.iidm.network.TwoSides; import java.util.Arrays; import java.util.List; @@ -26,11 +27,11 @@ public class CurrentLimitAutomaton extends AbstractPureDynamicBlackBoxModel { protected static final String CONTROL_SUFFIX = "Control"; protected final Branch measuredQuadripole; - protected final Side measuredSide; + protected final TwoSides measuredSide; protected final Branch controlledQuadripole; protected final String lib; - public CurrentLimitAutomaton(String dynamicModelId, String parameterSetId, Branch measuredQuadripole, Side measuredSide, Branch controlledQuadripole, String lib) { + public CurrentLimitAutomaton(String dynamicModelId, String parameterSetId, Branch measuredQuadripole, TwoSides measuredSide, Branch controlledQuadripole, String lib) { super(dynamicModelId, parameterSetId); this.measuredQuadripole = Objects.requireNonNull(measuredQuadripole); this.measuredSide = Objects.requireNonNull(measuredSide); @@ -38,7 +39,7 @@ public CurrentLimitAutomaton(String dynamicModelId, String parameterSetId, Branc this.lib = lib; } - public CurrentLimitAutomaton(String dynamicModelId, String parameterSetId, Branch measuredQuadripole, Side measuredSide, String lib) { + public CurrentLimitAutomaton(String dynamicModelId, String parameterSetId, Branch measuredQuadripole, TwoSides measuredSide, String lib) { this(dynamicModelId, parameterSetId, measuredQuadripole, measuredSide, measuredQuadripole, lib); } @@ -49,7 +50,7 @@ public String getLib() { @Override public void createMacroConnections(DynaWaltzContext context) { - createMacroConnections(measuredQuadripole, QuadripoleModel.class, this::getVarConnectionsWithMeasuredQuadripole, context, MEASURE_SUFFIX + measuredSide.getSideSuffix()); + createMacroConnections(measuredQuadripole, QuadripoleModel.class, this::getVarConnectionsWithMeasuredQuadripole, context, MEASURE_SUFFIX + SideUtils.getSideSuffix(measuredSide)); createMacroConnections(controlledQuadripole, QuadripoleModel.class, this::getVarConnectionsWithControlledQuadripole, context, CONTROL_SUFFIX); } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/automatons/CurrentLimitTwoLevelsAutomaton.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/automatons/CurrentLimitTwoLevelsAutomaton.java index 8aa8bfc49..645480229 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/automatons/CurrentLimitTwoLevelsAutomaton.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/automatons/CurrentLimitTwoLevelsAutomaton.java @@ -8,9 +8,10 @@ package com.powsybl.dynawaltz.models.automatons; import com.powsybl.dynawaltz.DynaWaltzContext; -import com.powsybl.dynawaltz.models.Side; import com.powsybl.dynawaltz.models.VarConnection; +import com.powsybl.dynawaltz.models.utils.SideUtils; import com.powsybl.iidm.network.Branch; +import com.powsybl.iidm.network.TwoSides; import java.util.Arrays; import java.util.List; @@ -25,9 +26,9 @@ public class CurrentLimitTwoLevelsAutomaton extends CurrentLimitAutomaton { protected static final String SECOND_MEASURE_SUFFIX = MEASURE_SUFFIX + "2"; private final Branch secondMeasuredQuadripole; - private final Side secondMeasuredSide; + private final TwoSides secondMeasuredSide; - public CurrentLimitTwoLevelsAutomaton(String dynamicModelId, String parameterSetId, Branch measuredQuadripole, Side measuredSide, Branch secondMeasuredQuadripole, Side secondMeasuredSide, Branch controlledQuadripole, String lib) { + public CurrentLimitTwoLevelsAutomaton(String dynamicModelId, String parameterSetId, Branch measuredQuadripole, TwoSides measuredSide, Branch secondMeasuredQuadripole, TwoSides secondMeasuredSide, Branch controlledQuadripole, String lib) { super(dynamicModelId, parameterSetId, measuredQuadripole, measuredSide, controlledQuadripole, lib); this.secondMeasuredQuadripole = Objects.requireNonNull(secondMeasuredQuadripole); this.secondMeasuredSide = Objects.requireNonNull(secondMeasuredSide); @@ -35,8 +36,8 @@ public CurrentLimitTwoLevelsAutomaton(String dynamicModelId, String parameterSet @Override public void createMacroConnections(DynaWaltzContext context) { - createMacroConnections(measuredQuadripole, QuadripoleModel.class, this::getVarConnectionsWithMeasuredQuadripole, context, FIRST_MEASURE_SUFFIX + measuredSide.getSideSuffix()); - createMacroConnections(secondMeasuredQuadripole, QuadripoleModel.class, this::getVarConnectionsWithSecondMeasuredQuadripole, context, SECOND_MEASURE_SUFFIX + secondMeasuredSide.getSideSuffix()); + createMacroConnections(measuredQuadripole, QuadripoleModel.class, this::getVarConnectionsWithMeasuredQuadripole, context, FIRST_MEASURE_SUFFIX + SideUtils.getSideSuffix(measuredSide)); + createMacroConnections(secondMeasuredQuadripole, QuadripoleModel.class, this::getVarConnectionsWithSecondMeasuredQuadripole, context, SECOND_MEASURE_SUFFIX + SideUtils.getSideSuffix(secondMeasuredSide)); createMacroConnections(controlledQuadripole, QuadripoleModel.class, this::getVarConnectionsWithControlledQuadripole, context, CONTROL_SUFFIX); } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/automatons/QuadripoleModel.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/automatons/QuadripoleModel.java index f68af7969..bafd17e32 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/automatons/QuadripoleModel.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/automatons/QuadripoleModel.java @@ -8,14 +8,14 @@ package com.powsybl.dynawaltz.models.automatons; import com.powsybl.dynawaltz.models.Model; -import com.powsybl.dynawaltz.models.Side; +import com.powsybl.iidm.network.TwoSides; /** * @author Laurent Issertial {@literal } */ public interface QuadripoleModel extends Model { - String getIVarName(Side side); + String getIVarName(TwoSides side); String getStateVarName(); diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/automatons/TapChangerAutomaton.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/automatons/TapChangerAutomaton.java index a1e8780fe..a57feea69 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/automatons/TapChangerAutomaton.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/automatons/TapChangerAutomaton.java @@ -63,7 +63,7 @@ public void createMacroConnections(DynaWaltzContext context) { boolean isSkipped = createMacroConnectionsOrSkip(load, LoadWithTransformers.class, this::getVarConnectionsWith, context); if (isSkipped) { connection = ConnectionState.NOT_CONNECTED; - DynawaltzReports.reportEmptyTapChanger(context.getReporter(), getDynamicModelId()); + DynawaltzReports.reportEmptyAutomaton(context.getReporter(), this.getName(), getDynamicModelId(), LoadWithTransformers.class.getSimpleName()); } else { connection = ConnectionState.CONNECTED; } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/automatons/TapChangerBlockingAutomaton.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/automatons/TapChangerBlockingAutomaton.java index 7ed93890c..a56defedd 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/automatons/TapChangerBlockingAutomaton.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/automatons/TapChangerBlockingAutomaton.java @@ -102,7 +102,7 @@ public void createMacroConnections(DynaWaltzContext context) { } } else { isConnected = false; - DynawaltzReports.reportEmptyTapChangerBlockingAutomaton(context.getReporter(), getDynamicModelId()); + DynawaltzReports.reportEmptyListAutomaton(context.getReporter(), this.getName(), getDynamicModelId(), TapChangerModel.class.getSimpleName()); } } @@ -111,6 +111,7 @@ private List getVarConnectionsWith(TapChangerModel connected) { } private List getVarConnectionsWith(ActionConnectionPoint connected, String suffix) { + return connected.getUImpinVarName() .map(uImpinVarName -> List.of(new VarConnection("tapChangerBlocking_UMonitored" + suffix, uImpinVarName))) .orElse(Collections.emptyList()); diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/buses/DefaultEquipmentConnectionPoint.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/buses/DefaultEquipmentConnectionPoint.java index 2e073767e..7d61ec881 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/buses/DefaultEquipmentConnectionPoint.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/buses/DefaultEquipmentConnectionPoint.java @@ -7,9 +7,9 @@ */ package com.powsybl.dynawaltz.models.buses; -import com.powsybl.dynawaltz.models.Side; import com.powsybl.dynawaltz.models.macroconnections.MacroConnectAttribute; import com.powsybl.dynawaltz.xml.DynaWaltzXmlConstants; +import com.powsybl.iidm.network.TwoSides; import java.util.List; import java.util.Optional; @@ -42,8 +42,8 @@ public String getTerminalVarName() { } @Override - public String getTerminalVarName(Side side) { - return "@STATIC_ID@@NODE" + side.getSideNumber() + "@_ACPIN"; + public String getTerminalVarName(TwoSides side) { + return "@STATIC_ID@@NODE" + side.getNum() + "@_ACPIN"; } @Override @@ -52,8 +52,8 @@ public Optional getSwitchOffSignalVarName() { } @Override - public Optional getSwitchOffSignalVarName(Side side) { - return Optional.of("@STATIC_ID@@NODE" + side.getSideNumber() + "@_switchOff"); + public Optional getSwitchOffSignalVarName(TwoSides side) { + return Optional.of("@STATIC_ID@@NODE" + side.getNum() + "@_switchOff"); } @Override diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/buses/EquipmentConnectionPoint.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/buses/EquipmentConnectionPoint.java index 3b48d3509..03f2d30ec 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/buses/EquipmentConnectionPoint.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/buses/EquipmentConnectionPoint.java @@ -8,7 +8,7 @@ package com.powsybl.dynawaltz.models.buses; import com.powsybl.dynawaltz.models.Model; -import com.powsybl.dynawaltz.models.Side; +import com.powsybl.iidm.network.TwoSides; import java.util.Optional; @@ -20,13 +20,13 @@ public interface EquipmentConnectionPoint extends Model { String getTerminalVarName(); - default String getTerminalVarName(Side side) { + default String getTerminalVarName(TwoSides side) { return getTerminalVarName(); } Optional getSwitchOffSignalVarName(); - default Optional getSwitchOffSignalVarName(Side side) { + default Optional getSwitchOffSignalVarName(TwoSides side) { return getSwitchOffSignalVarName(); } } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/events/EventHvdcDisconnection.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/events/EventHvdcDisconnection.java index b9c07cccb..9eb25ca59 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/events/EventHvdcDisconnection.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/events/EventHvdcDisconnection.java @@ -8,10 +8,10 @@ package com.powsybl.dynawaltz.models.events; import com.powsybl.dynawaltz.DynaWaltzContext; -import com.powsybl.dynawaltz.models.Side; import com.powsybl.dynawaltz.models.VarConnection; import com.powsybl.dynawaltz.models.hvdc.HvdcModel; import com.powsybl.iidm.network.HvdcLine; +import com.powsybl.iidm.network.TwoSides; import java.util.List; @@ -34,11 +34,11 @@ public EventHvdcDisconnection(HvdcLine equipment, double startTime) { } private List getVarConnectionsWithHvdcModel(HvdcModel connected) { - return List.of(new VarConnection(DISCONNECTION_VAR_CONNECT, connected.getSwitchOffSignalEventVarName(Side.ONE)), - new VarConnection(DISCONNECTION_VAR_CONNECT, connected.getSwitchOffSignalEventVarName(Side.TWO))); + return List.of(new VarConnection(DISCONNECTION_VAR_CONNECT, connected.getSwitchOffSignalEventVarName(TwoSides.ONE)), + new VarConnection(DISCONNECTION_VAR_CONNECT, connected.getSwitchOffSignalEventVarName(TwoSides.TWO))); } - private List getVarConnectionsWithHvdcModelSide(HvdcModel connected, Side side) { + private List getVarConnectionsWithHvdcModelSide(HvdcModel connected, TwoSides side) { return List.of(new VarConnection(DISCONNECTION_VAR_CONNECT, connected.getSwitchOffSignalEventVarName(side))); } @@ -47,9 +47,9 @@ public void createMacroConnections(DynaWaltzContext context) { if (disconnectOrigin && disconnectExtremity) { createMacroConnections(getEquipment(), HvdcModel.class, this::getVarConnectionsWithHvdcModel, context); } else if (disconnectOrigin) { - createMacroConnections(getEquipment(), HvdcModel.class, this::getVarConnectionsWithHvdcModelSide, context, Side.ONE); + createMacroConnections(getEquipment(), HvdcModel.class, this::getVarConnectionsWithHvdcModelSide, context, TwoSides.ONE); } else if (disconnectExtremity) { - createMacroConnections(getEquipment(), HvdcModel.class, this::getVarConnectionsWithHvdcModelSide, context, Side.TWO); + createMacroConnections(getEquipment(), HvdcModel.class, this::getVarConnectionsWithHvdcModelSide, context, TwoSides.TWO); } } } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/hvdc/AbstractHvdc.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/hvdc/AbstractHvdc.java index 2c79c41e6..d442f4d30 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/hvdc/AbstractHvdc.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/hvdc/AbstractHvdc.java @@ -9,11 +9,12 @@ import com.powsybl.dynawaltz.DynaWaltzContext; import com.powsybl.dynawaltz.models.AbstractEquipmentBlackBoxModel; -import com.powsybl.dynawaltz.models.Side; import com.powsybl.dynawaltz.models.VarConnection; import com.powsybl.dynawaltz.models.VarMapping; import com.powsybl.dynawaltz.models.buses.EquipmentConnectionPoint; +import com.powsybl.dynawaltz.models.utils.SideUtils; import com.powsybl.iidm.network.HvdcLine; +import com.powsybl.iidm.network.TwoSides; import java.util.ArrayList; import java.util.Arrays; @@ -40,8 +41,8 @@ protected AbstractHvdc(String dynamicModelId, HvdcLine hvdc, String parameterSet @Override public void createMacroConnections(DynaWaltzContext context) { - createTerminalMacroConnections(equipment, this::getVarConnectionsWith, context, Side.ONE); - createTerminalMacroConnections(equipment, this::getVarConnectionsWith, context, Side.TWO); + createTerminalMacroConnections(equipment, this::getVarConnectionsWith, context, TwoSides.ONE); + createTerminalMacroConnections(equipment, this::getVarConnectionsWith, context, TwoSides.TWO); } @Override @@ -49,16 +50,16 @@ public List getVarsMapping() { return VAR_MAPPING; } - protected List getVarConnectionsWith(EquipmentConnectionPoint connected, Side side) { + protected List getVarConnectionsWith(EquipmentConnectionPoint connected, TwoSides side) { List varConnections = new ArrayList<>(2); varConnections.add(getSimpleVarConnectionWithBus(connected, side)); connected.getSwitchOffSignalVarName(side) - .map(switchOff -> new VarConnection("hvdc_switchOffSignal1" + side.getSideSuffix(), switchOff)) + .map(switchOff -> new VarConnection("hvdc_switchOffSignal1" + SideUtils.getSideSuffix(side), switchOff)) .ifPresent(varConnections::add); return varConnections; } - protected final VarConnection getSimpleVarConnectionWithBus(EquipmentConnectionPoint connected, Side side) { - return new VarConnection(TERMINAL_PREFIX + side.getSideNumber(), connected.getTerminalVarName(side)); + protected final VarConnection getSimpleVarConnectionWithBus(EquipmentConnectionPoint connected, TwoSides side) { + return new VarConnection(TERMINAL_PREFIX + side.getNum(), connected.getTerminalVarName(side)); } } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/hvdc/DanglingSide.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/hvdc/DanglingSide.java index 86d93f717..c4a7e1e48 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/hvdc/DanglingSide.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/hvdc/DanglingSide.java @@ -1,8 +1,9 @@ package com.powsybl.dynawaltz.models.hvdc; -import com.powsybl.dynawaltz.models.Side; import com.powsybl.dynawaltz.models.VarConnection; import com.powsybl.dynawaltz.models.buses.EquipmentConnectionPoint; +import com.powsybl.dynawaltz.models.utils.SideUtils; +import com.powsybl.iidm.network.TwoSides; import java.util.List; import java.util.Objects; @@ -12,28 +13,28 @@ public final class DanglingSide { private final String prefix; - private final Side side; + private final TwoSides side; - public DanglingSide(String prefix, Side side) { + public DanglingSide(String prefix, TwoSides side) { this.prefix = Objects.requireNonNull(prefix); this.side = Objects.requireNonNull(side); } - boolean isDangling(Side side) { + boolean isDangling(TwoSides side) { return this.side == side; } public int getSideNumber() { - return side.getSideNumber(); + return side.getNum(); } - public void createMacroConnections(BiFunction> basicVarConnectionsSupplier, - BiConsumer>, Side> connectionCreator) { + public void createMacroConnections(BiFunction> basicVarConnectionsSupplier, + BiConsumer>, TwoSides> connectionCreator) { connectionCreator.accept(this::getVarConnectionsWith, side); - connectionCreator.accept(basicVarConnectionsSupplier, side.getOppositeSide()); + connectionCreator.accept(basicVarConnectionsSupplier, SideUtils.getOppositeSide(side)); } - private List getVarConnectionsWith(EquipmentConnectionPoint connected, Side side) { - return List.of(new VarConnection(prefix + side.getSideNumber(), connected.getTerminalVarName(side))); + private List getVarConnectionsWith(EquipmentConnectionPoint connected, TwoSides side) { + return List.of(new VarConnection(prefix + side.getNum(), connected.getTerminalVarName(side))); } } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/hvdc/DefaultHvdc.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/hvdc/DefaultHvdc.java index 9bc165212..6e2b4a339 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/hvdc/DefaultHvdc.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/hvdc/DefaultHvdc.java @@ -8,7 +8,7 @@ package com.powsybl.dynawaltz.models.hvdc; import com.powsybl.dynawaltz.models.defaultmodels.AbstractDefaultModel; -import com.powsybl.dynawaltz.models.Side; +import com.powsybl.iidm.network.TwoSides; /** * @author Laurent Issertial {@literal } @@ -25,7 +25,7 @@ public String getName() { } @Override - public String getSwitchOffSignalEventVarName(Side side) { - return "@NAME@_state" + side.getSideNumber() + "_value"; + public String getSwitchOffSignalEventVarName(TwoSides side) { + return "@NAME@_state" + side.getNum() + "_value"; } } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/hvdc/HvdcModel.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/hvdc/HvdcModel.java index 782d1af78..82104b67e 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/hvdc/HvdcModel.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/hvdc/HvdcModel.java @@ -8,12 +8,12 @@ package com.powsybl.dynawaltz.models.hvdc; import com.powsybl.dynawaltz.models.Model; -import com.powsybl.dynawaltz.models.Side; +import com.powsybl.iidm.network.TwoSides; /** * @author Laurent Issertial {@literal } */ public interface HvdcModel extends Model { - String getSwitchOffSignalEventVarName(Side side); + String getSwitchOffSignalEventVarName(TwoSides side); } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/hvdc/HvdcP.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/hvdc/HvdcP.java index 0baf4ed3d..22733d2a2 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/hvdc/HvdcP.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/hvdc/HvdcP.java @@ -7,8 +7,9 @@ */ package com.powsybl.dynawaltz.models.hvdc; -import com.powsybl.dynawaltz.models.Side; +import com.powsybl.dynawaltz.models.utils.SideUtils; import com.powsybl.iidm.network.HvdcLine; +import com.powsybl.iidm.network.TwoSides; /** * @author Laurent Issertial {@literal } @@ -20,7 +21,7 @@ public HvdcP(String dynamicModelId, HvdcLine hvdc, String parameterSetId, String } @Override - public String getSwitchOffSignalEventVarName(Side side) { - return "hvdc_switchOffSignal2" + side.getSideSuffix(); + public String getSwitchOffSignalEventVarName(TwoSides side) { + return "hvdc_switchOffSignal2" + SideUtils.getSideSuffix(side); } } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/hvdc/HvdcPDangling.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/hvdc/HvdcPDangling.java index 39dea79a3..8c9042a8d 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/hvdc/HvdcPDangling.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/hvdc/HvdcPDangling.java @@ -9,9 +9,8 @@ import com.powsybl.commons.PowsyblException; import com.powsybl.dynawaltz.DynaWaltzContext; -import com.powsybl.dynawaltz.models.Side; -import com.powsybl.dynawaltz.models.utils.SideConverter; import com.powsybl.iidm.network.HvdcLine; +import com.powsybl.iidm.network.TwoSides; /** * @author Laurent Issertial {@literal } @@ -20,7 +19,7 @@ public class HvdcPDangling extends HvdcP { private final DanglingSide danglingSide; - public HvdcPDangling(String dynamicModelId, HvdcLine hvdc, String parameterSetId, String hvdcLib, Side danglingSide) { + public HvdcPDangling(String dynamicModelId, HvdcLine hvdc, String parameterSetId, String hvdcLib, TwoSides danglingSide) { super(dynamicModelId, hvdc, parameterSetId, hvdcLib); this.danglingSide = new DanglingSide(TERMINAL_PREFIX, danglingSide); } @@ -29,12 +28,12 @@ public HvdcPDangling(String dynamicModelId, HvdcLine hvdc, String parameterSetId public void createMacroConnections(DynaWaltzContext context) { danglingSide.createMacroConnections( this::getVarConnectionsWith, - (varCoSupplier, side) -> createTerminalMacroConnections(equipment.getConverterStation(SideConverter.convert(side)).getTerminal(), varCoSupplier, context, side) + (varCoSupplier, side) -> createTerminalMacroConnections(equipment.getConverterStation(side).getTerminal(), varCoSupplier, context, side) ); } @Override - public String getSwitchOffSignalEventVarName(Side side) { + public String getSwitchOffSignalEventVarName(TwoSides side) { if (danglingSide.isDangling(side)) { throw new PowsyblException(String.format("Equipment %s side %s is dangling and can't be disconnected with an event", getLib(), danglingSide.getSideNumber())); } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/hvdc/HvdcVsc.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/hvdc/HvdcVsc.java index 3102a17ee..515525cbc 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/hvdc/HvdcVsc.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/hvdc/HvdcVsc.java @@ -7,8 +7,8 @@ */ package com.powsybl.dynawaltz.models.hvdc; -import com.powsybl.dynawaltz.models.Side; import com.powsybl.iidm.network.HvdcLine; +import com.powsybl.iidm.network.TwoSides; /** * @author Laurent Issertial {@literal } @@ -20,7 +20,7 @@ public HvdcVsc(String dynamicModelId, HvdcLine hvdc, String parameterSetId, Stri } @Override - public String getSwitchOffSignalEventVarName(Side side) { - return "hvdc_Conv" + side.getSideNumber() + "_switchOffSignal2"; + public String getSwitchOffSignalEventVarName(TwoSides side) { + return "hvdc_Conv" + side.getNum() + "_switchOffSignal2"; } } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/hvdc/HvdcVscDangling.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/hvdc/HvdcVscDangling.java index 2eb39236e..f6773b32f 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/hvdc/HvdcVscDangling.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/hvdc/HvdcVscDangling.java @@ -9,8 +9,8 @@ import com.powsybl.commons.PowsyblException; import com.powsybl.dynawaltz.DynaWaltzContext; -import com.powsybl.dynawaltz.models.Side; import com.powsybl.iidm.network.HvdcLine; +import com.powsybl.iidm.network.TwoSides; /** * @author Laurent Issertial {@literal } @@ -19,7 +19,7 @@ public class HvdcVscDangling extends HvdcVsc { private final DanglingSide danglingSide; - public HvdcVscDangling(String dynamicModelId, HvdcLine hvdc, String parameterSetId, String hvdcLib, Side danglingSide) { + public HvdcVscDangling(String dynamicModelId, HvdcLine hvdc, String parameterSetId, String hvdcLib, TwoSides danglingSide) { super(dynamicModelId, hvdc, parameterSetId, hvdcLib); this.danglingSide = new DanglingSide(TERMINAL_PREFIX, danglingSide); } @@ -33,7 +33,7 @@ public void createMacroConnections(DynaWaltzContext context) { } @Override - public String getSwitchOffSignalEventVarName(Side side) { + public String getSwitchOffSignalEventVarName(TwoSides side) { if (danglingSide.isDangling(side)) { throw new PowsyblException(String.format("Equipment %s side %s is dangling and can't be disconnected with an event", getLib(), danglingSide.getSideNumber())); } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/lines/DefaultLine.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/lines/DefaultLine.java index 4fd1caf6a..bd42d9628 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/lines/DefaultLine.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/lines/DefaultLine.java @@ -7,7 +7,8 @@ package com.powsybl.dynawaltz.models.lines; import com.powsybl.dynawaltz.models.defaultmodels.AbstractDefaultModel; -import com.powsybl.dynawaltz.models.Side; +import com.powsybl.dynawaltz.models.utils.SideUtils; +import com.powsybl.iidm.network.TwoSides; /** * @author Florian Dupuy {@literal } @@ -24,8 +25,8 @@ public String getName() { } @Override - public String getIVarName(Side side) { - return "@NAME@_i" + side.getSideSuffix(); + public String getIVarName(TwoSides side) { + return "@NAME@_i" + SideUtils.getSideSuffix(side); } @Override diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/lines/StandardLine.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/lines/StandardLine.java index 58ffcba6b..7747930f5 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/lines/StandardLine.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/lines/StandardLine.java @@ -9,11 +9,10 @@ import com.powsybl.dynawaltz.DynaWaltzContext; import com.powsybl.dynawaltz.models.AbstractEquipmentBlackBoxModel; -import com.powsybl.dynawaltz.models.Side; import com.powsybl.dynawaltz.models.VarConnection; import com.powsybl.dynawaltz.models.buses.EquipmentConnectionPoint; -import com.powsybl.dynawaltz.models.utils.SideConverter; import com.powsybl.iidm.network.Line; +import com.powsybl.iidm.network.TwoSides; import java.util.List; @@ -26,17 +25,17 @@ public StandardLine(String dynamicModelId, Line line, String parameterSetId) { super(dynamicModelId, parameterSetId, line, "Line"); } - private List getVarConnectionsWith(EquipmentConnectionPoint connected, Side side) { + private List getVarConnectionsWith(EquipmentConnectionPoint connected, TwoSides side) { return List.of(new VarConnection(getTerminalVarName(side), connected.getTerminalVarName())); } - private String getTerminalVarName(Side side) { - return "line_terminal" + side.getSideNumber(); + private String getTerminalVarName(TwoSides side) { + return "line_terminal" + side.getNum(); } @Override public void createMacroConnections(DynaWaltzContext context) { - equipment.getTerminals().forEach(t -> createTerminalMacroConnections(t, this::getVarConnectionsWith, context, SideConverter.convert(equipment.getSide(t)))); + equipment.getTerminals().forEach(t -> createTerminalMacroConnections(t, this::getVarConnectionsWith, context, equipment.getSide(t))); } @Override @@ -55,7 +54,7 @@ public String getStateValueVarName() { } @Override - public String getIVarName(Side side) { + public String getIVarName(TwoSides side) { throw new UnsupportedOperationException("i variable not implemented in StandardLine dynawo's model"); } diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/macroconnections/MacroConnector.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/macroconnections/MacroConnector.java index 626549eae..44b7b3255 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/macroconnections/MacroConnector.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/macroconnections/MacroConnector.java @@ -6,8 +6,9 @@ */ package com.powsybl.dynawaltz.models.macroconnections; -import com.powsybl.dynawaltz.models.Side; import com.powsybl.dynawaltz.models.VarConnection; +import com.powsybl.dynawaltz.models.utils.SideUtils; +import com.powsybl.iidm.network.TwoSides; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; @@ -38,8 +39,8 @@ public static String createMacroConnectorId(String name1, String name2) { return MACRO_CONNECTOR_PREFIX + name1 + "-" + name2; } - public static String createMacroConnectorId(String name1, String name2, Side side) { - return MACRO_CONNECTOR_PREFIX + name1 + side.getSideSuffix() + "-" + name2; + public static String createMacroConnectorId(String name1, String name2, TwoSides side) { + return MACRO_CONNECTOR_PREFIX + name1 + SideUtils.getSideSuffix(side) + "-" + name2; } public static String createMacroConnectorId(String name1, String name2, String name1Suffix) { diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/transformers/DefaultTransformer.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/transformers/DefaultTransformer.java index 41a15eef2..d55b89f49 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/transformers/DefaultTransformer.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/transformers/DefaultTransformer.java @@ -8,8 +8,9 @@ package com.powsybl.dynawaltz.models.transformers; import com.powsybl.dynawaltz.models.defaultmodels.AbstractDefaultModel; -import com.powsybl.dynawaltz.models.Side; import com.powsybl.dynawaltz.models.VarConnection; +import com.powsybl.dynawaltz.models.utils.SideUtils; +import com.powsybl.iidm.network.TwoSides; import java.util.List; @@ -60,8 +61,8 @@ public List getTapChangerBlockerVarConnections() { } @Override - public String getIVarName(Side side) { - return "@NAME@_i" + side.getSideSuffix(); + public String getIVarName(TwoSides side) { + return "@NAME@_i" + SideUtils.getSideSuffix(side); } @Override diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/transformers/TransformerFixedRatio.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/transformers/TransformerFixedRatio.java index 7055409ab..679d8a0f1 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/transformers/TransformerFixedRatio.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/transformers/TransformerFixedRatio.java @@ -9,10 +9,10 @@ import com.powsybl.dynawaltz.DynaWaltzContext; import com.powsybl.dynawaltz.models.AbstractEquipmentBlackBoxModel; -import com.powsybl.dynawaltz.models.Side; import com.powsybl.dynawaltz.models.VarConnection; import com.powsybl.dynawaltz.models.buses.EquipmentConnectionPoint; -import com.powsybl.dynawaltz.models.utils.SideConverter; +import com.powsybl.dynawaltz.models.utils.SideUtils; +import com.powsybl.iidm.network.TwoSides; import com.powsybl.iidm.network.TwoWindingsTransformer; import java.util.List; @@ -28,17 +28,17 @@ public TransformerFixedRatio(String dynamicModelId, TwoWindingsTransformer trans super(dynamicModelId, parameterSetId, transformer, lib); } - private List getVarConnectionsWith(EquipmentConnectionPoint connected, Side side) { + private List getVarConnectionsWith(EquipmentConnectionPoint connected, TwoSides side) { return List.of(new VarConnection(getTerminalVarName(side), connected.getTerminalVarName())); } - private String getTerminalVarName(Side side) { - return "transformer_terminal" + side.getSideNumber(); + private String getTerminalVarName(TwoSides side) { + return "transformer_terminal" + side.getNum(); } @Override public void createMacroConnections(DynaWaltzContext context) { - equipment.getTerminals().forEach(t -> createTerminalMacroConnections(t, this::getVarConnectionsWith, context, SideConverter.convert(equipment.getSide(t)))); + equipment.getTerminals().forEach(t -> createTerminalMacroConnections(t, this::getVarConnectionsWith, context, equipment.getSide(t))); } @Override @@ -72,8 +72,8 @@ public List getTapChangerBlockerVarConnections() { } @Override - public String getIVarName(Side side) { - return "transformer_i" + side.getSideSuffix(); + public String getIVarName(TwoSides side) { + return "transformer_i" + SideUtils.getSideSuffix(side); } @Override diff --git a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/utils/SideConverter.java b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/utils/SideUtils.java similarity index 62% rename from dynawaltz/src/main/java/com/powsybl/dynawaltz/models/utils/SideConverter.java rename to dynawaltz/src/main/java/com/powsybl/dynawaltz/models/utils/SideUtils.java index b98214c53..671d700b7 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/utils/SideConverter.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/models/utils/SideUtils.java @@ -7,28 +7,28 @@ */ package com.powsybl.dynawaltz.models.utils; -import com.powsybl.dynawaltz.models.Side; import com.powsybl.iidm.network.TwoSides; /** * @author Laurent Issertial {@literal } */ -public final class SideConverter { +public final class SideUtils { - private SideConverter() { + private SideUtils() { } - public static Side convert(TwoSides side) { + public static String getSideSuffix(TwoSides side) { return switch (side) { - case ONE -> Side.ONE; - case TWO -> Side.TWO; + case ONE -> "Side1"; + case TWO -> "Side2"; }; } - public static TwoSides convert(Side side) { + public static TwoSides getOppositeSide(TwoSides side) { return switch (side) { - case ONE -> TwoSides.ONE; - case TWO -> TwoSides.TWO; + case ONE -> TwoSides.TWO; + case TWO -> TwoSides.ONE; }; } + } 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 5b0039a06..9263cad20 100644 --- a/dynawaltz/src/main/java/com/powsybl/dynawaltz/xml/ParametersXml.java +++ b/dynawaltz/src/main/java/com/powsybl/dynawaltz/xml/ParametersXml.java @@ -119,7 +119,7 @@ private static ParametersSet readOneSetAndClose(XMLStreamReader xmlReader, Strin if (idSetRead.equals(parameterSetId)) { parametersSet.set(createParametersSet(xmlReader, parameterSetId)); } else { - XmlUtil.readSubElements(xmlReader); + XmlUtil.skipSubElements(xmlReader); } }); xmlReader.close(); diff --git a/dynawaltz/src/test/java/com/powsybl/dynawaltz/DynaWaltzProviderTest.java b/dynawaltz/src/test/java/com/powsybl/dynawaltz/DynaWaltzProviderTest.java index c6dbbe031..a2d7fd841 100644 --- a/dynawaltz/src/test/java/com/powsybl/dynawaltz/DynaWaltzProviderTest.java +++ b/dynawaltz/src/test/java/com/powsybl/dynawaltz/DynaWaltzProviderTest.java @@ -107,7 +107,7 @@ void testWithoutMergeLoads() throws Exception { assertEquals(DynaWaltzProvider.NAME, dynawoSimulation.getName()); DynamicSimulationResult result = dynawoSimulation.run(network, (n, r) -> Collections.emptyList(), EventModelsSupplier.empty(), CurvesSupplier.empty(), network.getVariantManager().getWorkingVariantId(), - computationManager, dynamicSimulationParameters); + computationManager, dynamicSimulationParameters, NO_OP); assertNotNull(result); } diff --git a/dynawaltz/src/test/java/com/powsybl/dynawaltz/models/lines/StandardLineTest.java b/dynawaltz/src/test/java/com/powsybl/dynawaltz/models/lines/StandardLineTest.java index 9ec9353b2..7ba3f1ab7 100644 --- a/dynawaltz/src/test/java/com/powsybl/dynawaltz/models/lines/StandardLineTest.java +++ b/dynawaltz/src/test/java/com/powsybl/dynawaltz/models/lines/StandardLineTest.java @@ -12,7 +12,6 @@ import com.powsybl.dynawaltz.DynaWaltzContext; import com.powsybl.dynawaltz.DynaWaltzParameters; import com.powsybl.dynawaltz.models.BlackBoxModel; -import com.powsybl.dynawaltz.models.Side; import com.powsybl.dynawaltz.models.automatons.CurrentLimitAutomaton; import com.powsybl.iidm.network.*; import org.junit.jupiter.api.Test; @@ -42,7 +41,7 @@ void connectionToCurrentLimitAutomatonException() { List dynamicModels = new ArrayList<>(); dynamicModels.add(new StandardLine("BBM_l", l, "SL")); - dynamicModels.add(new CurrentLimitAutomaton("BBM_CLA", "CLA", l, Side.ONE, "CurrentLimitAutomaton")); + dynamicModels.add(new CurrentLimitAutomaton("BBM_CLA", "CLA", l, TwoSides.ONE, "CurrentLimitAutomaton")); DynamicSimulationParameters parameters = DynamicSimulationParameters.load(); DynaWaltzParameters dynawoParameters = DynaWaltzParameters.load(); String workingVariantId = network.getVariantManager().getWorkingVariantId(); diff --git a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/AbstractDynamicModelXmlTest.java b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/AbstractDynamicModelXmlTest.java index 74a4f73a5..035a4385e 100644 --- a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/AbstractDynamicModelXmlTest.java +++ b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/AbstractDynamicModelXmlTest.java @@ -7,7 +7,9 @@ */ package com.powsybl.dynawaltz.xml; +import com.powsybl.commons.reporter.ReporterModel; import com.powsybl.commons.test.AbstractSerDeTest; +import com.powsybl.commons.test.TestUtil; import com.powsybl.dynamicsimulation.Curve; import com.powsybl.dynamicsimulation.DynamicSimulationParameters; import com.powsybl.dynawaltz.DynaWaltzContext; @@ -26,6 +28,7 @@ import javax.xml.validation.Validator; import java.io.IOException; import java.io.InputStream; +import java.io.StringWriter; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; @@ -33,6 +36,7 @@ import java.util.Objects; import static com.powsybl.commons.test.ComparisonUtils.compareTxt; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * @author Laurent Issertial {@literal } @@ -44,6 +48,7 @@ public abstract class AbstractDynamicModelXmlTest extends AbstractSerDeTest { protected List eventModels = new ArrayList<>(); protected List curves = new ArrayList<>(); protected DynaWaltzContext context; + protected ReporterModel reporter = new ReporterModel("testDyd", "Test DYD"); @BeforeEach void setup() { @@ -74,10 +79,16 @@ public void validate(String schemaDefinition, String expectedResourceName, Path void setupDynawaltzContext() { DynamicSimulationParameters parameters = DynamicSimulationParameters.load(); DynaWaltzParameters dynawoParameters = DynaWaltzParameters.load(); - context = new DynaWaltzContext(network, network.getVariantManager().getWorkingVariantId(), dynamicModels, eventModels, curves, parameters, dynawoParameters); + context = new DynaWaltzContext(network, network.getVariantManager().getWorkingVariantId(), dynamicModels, eventModels, curves, parameters, dynawoParameters, reporter); } protected abstract void setupNetwork(); protected abstract void addDynamicModels(); + + protected void checkReporter(String report) { + StringWriter sw = new StringWriter(); + reporter.export(sw); + assertEquals(report, TestUtil.normalizeLineSeparator(sw.toString())); + } } diff --git a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/CurrentLimitModelXmlTest.java b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/CurrentLimitModelXmlTest.java index 3d8970272..041a8c232 100644 --- a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/CurrentLimitModelXmlTest.java +++ b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/CurrentLimitModelXmlTest.java @@ -7,9 +7,9 @@ */ package com.powsybl.dynawaltz.xml; -import com.powsybl.dynawaltz.models.Side; import com.powsybl.dynawaltz.models.automatons.CurrentLimitAutomaton; import com.powsybl.dynawaltz.models.transformers.TransformerFixedRatio; +import com.powsybl.iidm.network.TwoSides; import com.powsybl.iidm.network.test.EurostagTutorialExample1Factory; import org.junit.jupiter.api.Test; import org.xml.sax.SAXException; @@ -29,10 +29,10 @@ protected void setupNetwork() { @Override protected void addDynamicModels() { - dynamicModels.add(new CurrentLimitAutomaton("BBM_CLA_LINE", "cla", network.getLine("NHV1_NHV2_1"), Side.ONE, "CurrentLimitAutomaton")); - dynamicModels.add(new CurrentLimitAutomaton("BBM_CLA_TRANSFORMER", "cla", network.getTwoWindingsTransformer("NGEN_NHV1"), Side.TWO, "CurrentLimitAutomaton")); + dynamicModels.add(new CurrentLimitAutomaton("BBM_CLA_LINE", "cla", network.getLine("NHV1_NHV2_1"), TwoSides.ONE, "CurrentLimitAutomaton")); + dynamicModels.add(new CurrentLimitAutomaton("BBM_CLA_TRANSFORMER", "cla", network.getTwoWindingsTransformer("NGEN_NHV1"), TwoSides.TWO, "CurrentLimitAutomaton")); dynamicModels.add(new TransformerFixedRatio("BBM_TRANSFORMER", network.getTwoWindingsTransformer("NHV2_NLOAD"), "tf", "TransformerFixedRatio")); - dynamicModels.add(new CurrentLimitAutomaton("BBM_CLA_TRANSFORMER2", "cla", network.getTwoWindingsTransformer("NHV2_NLOAD"), Side.TWO, network.getLine("NHV1_NHV2_1"), "CurrentLimitAutomaton")); + dynamicModels.add(new CurrentLimitAutomaton("BBM_CLA_TRANSFORMER2", "cla", network.getTwoWindingsTransformer("NHV2_NLOAD"), TwoSides.TWO, network.getLine("NHV1_NHV2_1"), "CurrentLimitAutomaton")); } @Test diff --git a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/CurrentLimitTwoLevelsModelXmlTest.java b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/CurrentLimitTwoLevelsModelXmlTest.java index 813835f8b..9afffaa5d 100644 --- a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/CurrentLimitTwoLevelsModelXmlTest.java +++ b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/CurrentLimitTwoLevelsModelXmlTest.java @@ -7,8 +7,8 @@ */ package com.powsybl.dynawaltz.xml; -import com.powsybl.dynawaltz.models.Side; import com.powsybl.dynawaltz.models.automatons.CurrentLimitTwoLevelsAutomaton; +import com.powsybl.iidm.network.TwoSides; import com.powsybl.iidm.network.test.EurostagTutorialExample1Factory; import org.junit.jupiter.api.Test; import org.xml.sax.SAXException; @@ -28,7 +28,7 @@ protected void setupNetwork() { @Override protected void addDynamicModels() { - dynamicModels.add(new CurrentLimitTwoLevelsAutomaton("BBM_CLA_TWO_LEVELS", "cla", network.getLine("NHV1_NHV2_1"), Side.TWO, network.getLine("NHV1_NHV2_2"), Side.ONE, network.getTwoWindingsTransformer("NGEN_NHV1"), "CurrentLimitAutomatonTwoLevels")); + dynamicModels.add(new CurrentLimitTwoLevelsAutomaton("BBM_CLA_TWO_LEVELS", "cla", network.getLine("NHV1_NHV2_1"), TwoSides.TWO, network.getLine("NHV1_NHV2_2"), TwoSides.ONE, network.getTwoWindingsTransformer("NGEN_NHV1"), "CurrentLimitAutomatonTwoLevels")); } @Test diff --git a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/DisconnectHvdcEventXmlTest.java b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/DisconnectHvdcEventXmlTest.java index c51021bc5..8cd7d3d02 100644 --- a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/DisconnectHvdcEventXmlTest.java +++ b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/DisconnectHvdcEventXmlTest.java @@ -8,13 +8,13 @@ package com.powsybl.dynawaltz.xml; import com.powsybl.dynawaltz.models.BlackBoxModel; -import com.powsybl.dynawaltz.models.Side; import com.powsybl.dynawaltz.models.events.EventHvdcDisconnection; import com.powsybl.dynawaltz.models.hvdc.HvdcP; import com.powsybl.dynawaltz.models.hvdc.HvdcPDangling; import com.powsybl.dynawaltz.models.hvdc.HvdcVsc; import com.powsybl.dynawaltz.models.hvdc.HvdcVscDangling; import com.powsybl.iidm.network.Network; +import com.powsybl.iidm.network.TwoSides; import com.powsybl.iidm.network.test.HvdcTestNetwork; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.extension.ExtendWith; @@ -77,10 +77,10 @@ private static Stream provideModels() { (Function) n -> new HvdcVsc(DYN_HVDC_NAME, n.getHvdcLine(HVDC_NAME), "hvdc", "HvdcVsc"), (Function) n -> new EventHvdcDisconnection(n.getHvdcLine(HVDC_NAME), 1, false, true)), Arguments.of("disconnect_hvdc_pv_dangling_dyd.xml", - (Function) n -> new HvdcPDangling(DYN_HVDC_NAME, n.getHvdcLine(HVDC_NAME), "hvdc", "HvdcPVDangling", Side.TWO), + (Function) n -> new HvdcPDangling(DYN_HVDC_NAME, n.getHvdcLine(HVDC_NAME), "hvdc", "HvdcPVDangling", TwoSides.TWO), (Function) n -> new EventHvdcDisconnection(n.getHvdcLine(HVDC_NAME), 1, true, false)), Arguments.of("disconnect_hvdc_vsc_dangling_dyd.xml", - (Function) n -> new HvdcVscDangling(DYN_HVDC_NAME, n.getHvdcLine(HVDC_NAME), "hvdc", "HvdcVSCDanglingUdc", Side.ONE), + (Function) n -> new HvdcVscDangling(DYN_HVDC_NAME, n.getHvdcLine(HVDC_NAME), "hvdc", "HvdcVSCDanglingUdc", TwoSides.ONE), (Function) n -> new EventHvdcDisconnection(n.getHvdcLine(HVDC_NAME), 1, false, true)) ); } diff --git a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/DisconnectionExceptionXmlTest.java b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/DisconnectionExceptionXmlTest.java index 1e7b3cc0e..d90a149d7 100644 --- a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/DisconnectionExceptionXmlTest.java +++ b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/DisconnectionExceptionXmlTest.java @@ -9,11 +9,11 @@ import com.powsybl.commons.PowsyblException; import com.powsybl.dynawaltz.models.BlackBoxModel; -import com.powsybl.dynawaltz.models.Side; import com.powsybl.dynawaltz.models.events.EventHvdcDisconnection; 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.TwoSides; import com.powsybl.iidm.network.test.HvdcTestNetwork; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.extension.ExtendWith; @@ -34,7 +34,7 @@ class DisconnectionExceptionXmlTest extends AbstractParametrizedDynamicModelXmlTest { @BeforeEach - void setup(String exception, Side side, BiFunction constructor) { + void setup(String exception, TwoSides side, BiFunction constructor) { setupNetwork(); addDynamicModels(side, constructor); } @@ -43,16 +43,16 @@ protected void setupNetwork() { network = HvdcTestNetwork.createVsc(); } - protected void addDynamicModels(Side side, BiFunction constructor) { + protected void addDynamicModels(TwoSides side, BiFunction constructor) { HvdcLine hvdc = network.getHvdcLine("L"); dynamicModels.add(constructor.apply(hvdc, side)); - boolean disconnectOrigin = Side.ONE == side; + boolean disconnectOrigin = TwoSides.ONE == side; eventModels.add(new EventHvdcDisconnection(hvdc, 1, disconnectOrigin, !disconnectOrigin)); } @ParameterizedTest(name = "{0}") @MethodSource("provideModels") - void disconnectionOnDanglingSide(String exception, Side side, BiFunction constructor) { + void disconnectionOnDanglingSide(String exception, TwoSides side, BiFunction constructor) { Exception e = assertThrows(PowsyblException.class, this::setupDynawaltzContext); assertEquals(exception, e.getMessage()); } @@ -60,11 +60,11 @@ void disconnectionOnDanglingSide(String exception, Side side, BiFunction provideModels() { return Stream.of( Arguments.of("Equipment HvdcPVDangling side 1 is dangling and can't be disconnected with an event", - Side.ONE, - (BiFunction) (hvdc, side) -> new HvdcPDangling("BBM_L", hvdc, "hvdc", "HvdcPVDangling", side)), + TwoSides.ONE, + (BiFunction) (hvdc, side) -> new HvdcPDangling("BBM_L", hvdc, "hvdc", "HvdcPVDangling", side)), Arguments.of("Equipment HvdcVSCDanglingUdc side 2 is dangling and can't be disconnected with an event", - Side.TWO, - (BiFunction) (hvdc, side) -> new HvdcVscDangling("BBM_L", hvdc, "hvdc", "HvdcVSCDanglingUdc", side)) + TwoSides.TWO, + (BiFunction) (hvdc, side) -> new HvdcVscDangling("BBM_L", hvdc, "hvdc", "HvdcVSCDanglingUdc", side)) ); } } diff --git a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/DynaWaltzTestUtil.java b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/DynaWaltzTestUtil.java index cc1f12c23..69cebbc11 100644 --- a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/DynaWaltzTestUtil.java +++ b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/DynaWaltzTestUtil.java @@ -10,13 +10,12 @@ import com.powsybl.dynamicsimulation.Curve; import com.powsybl.dynawaltz.DynaWaltzCurve; import com.powsybl.dynawaltz.models.BlackBoxModel; -import com.powsybl.dynawaltz.models.Side; import com.powsybl.dynawaltz.models.automatons.CurrentLimitAutomaton; import com.powsybl.dynawaltz.models.events.EventInjectionDisconnection; import com.powsybl.dynawaltz.models.events.EventQuadripoleDisconnection; import com.powsybl.dynawaltz.models.generators.GeneratorFictitious; -import com.powsybl.dynawaltz.models.generators.SynchronousGenerator; import com.powsybl.dynawaltz.models.generators.SynchronizedGenerator; +import com.powsybl.dynawaltz.models.generators.SynchronousGenerator; import com.powsybl.dynawaltz.models.lines.StandardLine; import com.powsybl.dynawaltz.models.loads.BaseLoad; import com.powsybl.dynawaltz.models.loads.LoadOneTransformer; @@ -107,7 +106,7 @@ void setup() { // Automatons network.getLineStream().filter(line -> line != standardLine) - .forEach(l -> dynamicModels.add(new CurrentLimitAutomaton("BBM_" + l.getId(), "CLA", l, Side.ONE, "CurrentLimitAutomaton"))); + .forEach(l -> dynamicModels.add(new CurrentLimitAutomaton("BBM_" + l.getId(), "CLA", l, TwoSides.ONE, "CurrentLimitAutomaton"))); } public void validate(String schemaDefinition, String expectedResourceName, Path xmlFile) throws SAXException, IOException { diff --git a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/EmptyTapChangerAutomatonXmlTest.java b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/EmptyTapChangerAutomatonXmlTest.java index 8f83f9185..b22874c0a 100644 --- a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/EmptyTapChangerAutomatonXmlTest.java +++ b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/EmptyTapChangerAutomatonXmlTest.java @@ -37,5 +37,10 @@ void writeModel() throws SAXException, IOException, XMLStreamException { DydXml.write(tmpDir, context); ParametersXml.write(tmpDir, context); validate("dyd.xsd", "tap_changer_empty_dyd.xml", tmpDir.resolve(DynaWaltzConstants.DYD_FILENAME)); + checkReporter(""" + + Test DYD + + Dynawaltz models processing + TapChangerAutomaton BBM_TC equipment is not a LoadWithTransformers, the automaton will be skipped + """); } } diff --git a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/EmptyTapChangerBlockingAutomatonXmlTest.java b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/EmptyTapChangerBlockingAutomatonXmlTest.java index 9b849db78..50c115fec 100644 --- a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/EmptyTapChangerBlockingAutomatonXmlTest.java +++ b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/EmptyTapChangerBlockingAutomatonXmlTest.java @@ -50,5 +50,11 @@ void writeModel() throws SAXException, IOException, XMLStreamException { DydXml.write(tmpDir, context); ParametersXml.write(tmpDir, context); validate("dyd.xsd", "tap_changer_blocking_empty_dyd.xml", tmpDir.resolve(DynaWaltzConstants.DYD_FILENAME)); + checkReporter(""" + + Test DYD + + Dynawaltz models processing + TapChangerAutomaton BBM_TC equipment is not a LoadWithTransformers, the automaton will be skipped + None of TapChangerBlockingAutomaton BBM_TapChangerBlocking equipments are TapChangerModel, the automaton will be skipped + """); } } diff --git a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/HvdcXmlTest.java b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/HvdcXmlTest.java index 1a017930a..8cf9a40c6 100644 --- a/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/HvdcXmlTest.java +++ b/dynawaltz/src/test/java/com/powsybl/dynawaltz/xml/HvdcXmlTest.java @@ -8,12 +8,12 @@ package com.powsybl.dynawaltz.xml; import com.powsybl.dynawaltz.models.BlackBoxModel; -import com.powsybl.dynawaltz.models.Side; import com.powsybl.dynawaltz.models.hvdc.HvdcP; import com.powsybl.dynawaltz.models.hvdc.HvdcPDangling; import com.powsybl.dynawaltz.models.hvdc.HvdcVsc; import com.powsybl.dynawaltz.models.hvdc.HvdcVscDangling; import com.powsybl.iidm.network.Network; +import com.powsybl.iidm.network.TwoSides; import com.powsybl.iidm.network.test.HvdcTestNetwork; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.extension.ExtendWith; @@ -62,8 +62,8 @@ private static Stream provideHvdc() { return Stream.of( Arguments.of("hvdc_p_dyd.xml", (Function) n -> new HvdcP(DYN_NAME, n.getHvdcLine(HVDC_NAME), "hv", "HvdcPV")), Arguments.of("hvdc_vsc_dyd.xml", (Function) n -> new HvdcVsc(DYN_NAME, n.getHvdcLine(HVDC_NAME), "hv", "HvdcVSC")), - Arguments.of("hvdc_p_dangling_dyd.xml", (Function) n -> new HvdcPDangling(DYN_NAME, n.getHvdcLine(HVDC_NAME), "hv", "HvdcPVDangling", Side.ONE)), - Arguments.of("hvdc_vsc_dangling_dyd.xml", (Function) n -> new HvdcVscDangling(DYN_NAME, n.getHvdcLine(HVDC_NAME), "hv", "HvdcVSCDanglingP", Side.TWO)) + Arguments.of("hvdc_p_dangling_dyd.xml", (Function) n -> new HvdcPDangling(DYN_NAME, n.getHvdcLine(HVDC_NAME), "hv", "HvdcPVDangling", TwoSides.ONE)), + Arguments.of("hvdc_vsc_dangling_dyd.xml", (Function) n -> new HvdcVscDangling(DYN_NAME, n.getHvdcLine(HVDC_NAME), "hv", "HvdcVSCDanglingP", TwoSides.TWO)) ); } } 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 index 4ce08ec28..f7cd5367c 100644 --- 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 @@ -111,7 +111,15 @@ void testSaBb() throws IOException { network.getVoltageLevelStream().forEach(vl -> vl.setLowVoltageLimit(vl.getNominalV() * 0.97)); // Launching a load flow before the security analysis is required - loadFlowProvider.run(network, computationManager, VariantManagerConstants.INITIAL_VARIANT_ID, loadFlowParameters).join(); + ReporterModel reporterLf = new ReporterModel("root", "Root message"); + loadFlowProvider.run(network, computationManager, VariantManagerConstants.INITIAL_VARIANT_ID, loadFlowParameters, reporterLf).join(); + + StringWriter swReporterLf = new StringWriter(); + reporterLf.export(swReporterLf); + InputStream refStreamLf = Objects.requireNonNull(getClass().getResourceAsStream("/ieee14/security-analysis/timeline_report_lf.txt")); + String refLogExportLf = TestUtil.normalizeLineSeparator(new String(ByteStreams.toByteArray(refStreamLf), StandardCharsets.UTF_8)); + String logExportLf = TestUtil.normalizeLineSeparator(swReporterLf.toString()); + assertEquals(refLogExportLf, logExportLf); List contingencies = network.getLineStream() .map(l -> Contingency.line(l.getId())) @@ -124,12 +132,12 @@ void testSaBb() throws IOException { .join() .getResult(); - StringWriter sw = new StringWriter(); - reporter.export(sw); - InputStream refStream = Objects.requireNonNull(getClass().getResourceAsStream("/ieee14/security-analysis/timeline_report.txt")); - String refLogExport = TestUtil.normalizeLineSeparator(new String(ByteStreams.toByteArray(refStream), StandardCharsets.UTF_8)); - String logExport = TestUtil.normalizeLineSeparator(sw.toString()); - assertEquals(refLogExport, logExport); + StringWriter swReporterAs = new StringWriter(); + reporter.export(swReporterAs); + InputStream refStreamReporterAs = Objects.requireNonNull(getClass().getResourceAsStream("/ieee14/security-analysis/timeline_report_as.txt")); + String refLogExportAs = TestUtil.normalizeLineSeparator(new String(ByteStreams.toByteArray(refStreamReporterAs), StandardCharsets.UTF_8)); + String logExportAs = TestUtil.normalizeLineSeparator(swReporterAs.toString()); + assertEquals(refLogExportAs, logExportAs); StringWriter serializedResult = new StringWriter(); SecurityAnalysisResultSerializer.write(result, serializedResult); 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 index 09fce25bf..e341a812f 100644 --- 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 @@ -8,7 +8,6 @@ import com.powsybl.commons.datasource.ResourceDataSource; import com.powsybl.commons.datasource.ResourceSet; -import com.powsybl.commons.reporter.Reporter; import com.powsybl.dynamicsimulation.*; import com.powsybl.dynamicsimulation.groovy.*; import com.powsybl.dynawaltz.DumpFileParameters; @@ -21,7 +20,6 @@ import com.powsybl.iidm.network.VariantManagerConstants; import com.powsybl.iidm.network.test.SvcTestCaseFactory; import com.powsybl.timeseries.DoubleTimeSeries; -import com.powsybl.timeseries.StringTimeSeries; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -31,6 +29,7 @@ import java.util.List; import java.util.stream.Stream; +import static com.powsybl.commons.reporter.Reporter.NO_OP; import static org.junit.jupiter.api.Assertions.*; /** @@ -50,7 +49,7 @@ void setUp() throws Exception { super.setUp(); provider = new DynaWaltzProvider(new DynaWaltzConfig(Path.of("/dynawo"), false)); parameters = new DynamicSimulationParameters() - .setStartTime(1) + .setStartTime(0) .setStopTime(100); dynaWaltzParameters = new DynaWaltzParameters(); parameters.addExtension(DynaWaltzParameters.class, dynaWaltzParameters); @@ -82,17 +81,18 @@ void testIeee14() { .setDefaultDumpFileParameters(); DynamicSimulationResult result = provider.run(network, dynamicModelsSupplier, eventModelsSupplier, curvesSupplier, - VariantManagerConstants.INITIAL_VARIANT_ID, computationManager, parameters, Reporter.NO_OP) + VariantManagerConstants.INITIAL_VARIANT_ID, computationManager, parameters, NO_OP) .join(); - assertTrue(result.isOk()); + assertEquals(DynamicSimulationResult.Status.SUCCESS, result.getStatus()); + assertTrue(result.getStatusText().isEmpty()); 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(587, ts1.toArray().length); - StringTimeSeries timeLine = result.getTimeLine(); - assertEquals(1, timeLine.toArray().length); - assertNull(timeLine.toArray()[0]); // FIXME + List timeLine = result.getTimeLine(); + assertEquals(23, timeLine.size()); + checkFirstTimeLineEvent(timeLine.get(0), 0, "_GEN____8_SM", "PMIN : activation"); } @Test @@ -126,9 +126,9 @@ void testIeee14WithDump() throws IOException { .setDumpFileParameters(dumpFileParameters); DynamicSimulationResult result = provider.run(network, dynamicModelsSupplier, eventModelsSupplier, curvesSupplier, - VariantManagerConstants.INITIAL_VARIANT_ID, computationManager, parameters, Reporter.NO_OP) + VariantManagerConstants.INITIAL_VARIANT_ID, computationManager, parameters, NO_OP) .join(); - assertTrue(result.isOk()); + assertEquals(DynamicSimulationResult.Status.SUCCESS, result.getStatus()); //Use exported dump as input parameters.setStartTime(30); @@ -141,11 +141,10 @@ void testIeee14WithDump() throws IOException { dynaWaltzParameters.setDumpFileParameters(DumpFileParameters.createImportDumpFileParameters(dumpDir, dumpFile)); result = provider.run(network, dynamicModelsSupplier, eventModelsSupplier, curvesSupplier, - VariantManagerConstants.INITIAL_VARIANT_ID, computationManager, parameters, Reporter.NO_OP) + VariantManagerConstants.INITIAL_VARIANT_ID, computationManager, parameters, NO_OP) .join(); - assertTrue(result.isOk()); - + assertEquals(DynamicSimulationResult.Status.SUCCESS, result.getStatus()); } @Test @@ -166,14 +165,15 @@ void testSvc() { .setDefaultDumpFileParameters(); DynamicSimulationResult result = provider.run(network, dynamicModelsSupplier, EventModelsSupplier.empty(), CurvesSupplier.empty(), - VariantManagerConstants.INITIAL_VARIANT_ID, computationManager, parameters, Reporter.NO_OP) + VariantManagerConstants.INITIAL_VARIANT_ID, computationManager, parameters, NO_OP) .join(); - assertTrue(result.isOk()); - assertEquals(0, result.getCurves().size()); - StringTimeSeries timeLine = result.getTimeLine(); - assertEquals(1, timeLine.toArray().length); - assertNull(timeLine.toArray()[0]); // FIXME + assertEquals(DynamicSimulationResult.Status.SUCCESS, result.getStatus()); + assertTrue(result.getStatusText().isEmpty()); + assertTrue(result.getCurves().isEmpty()); + List timeLine = result.getTimeLine(); + assertEquals(1, timeLine.size()); + checkFirstTimeLineEvent(timeLine.get(0), 0, "G1", "PMIN : activation"); } @Test @@ -194,14 +194,15 @@ void testHvdc() { .setDefaultDumpFileParameters(); DynamicSimulationResult result = provider.run(network, dynamicModelsSupplier, EventModelsSupplier.empty(), CurvesSupplier.empty(), - VariantManagerConstants.INITIAL_VARIANT_ID, computationManager, parameters, Reporter.NO_OP) + VariantManagerConstants.INITIAL_VARIANT_ID, computationManager, parameters, NO_OP) .join(); - assertTrue(result.isOk()); - assertEquals(0, result.getCurves().size()); - StringTimeSeries timeLine = result.getTimeLine(); - assertEquals(1, timeLine.toArray().length); - assertNull(timeLine.toArray()[0]); // FIXME + assertEquals(DynamicSimulationResult.Status.SUCCESS, result.getStatus()); + assertTrue(result.getStatusText().isEmpty()); + assertTrue(result.getCurves().isEmpty()); + List timeLine = result.getTimeLine(); + assertEquals(7, timeLine.size()); + checkFirstTimeLineEvent(timeLine.get(0), 30.0, "_BUS____5-BUS____6-1_PS", "Tap +1"); } @Test @@ -231,13 +232,48 @@ void testSmib() { .setDefaultDumpFileParameters(); DynamicSimulationResult result = provider.run(network, dynamicModelsSupplier, eventModelsSupplier, curvesSupplier, - VariantManagerConstants.INITIAL_VARIANT_ID, computationManager, parameters, Reporter.NO_OP) + VariantManagerConstants.INITIAL_VARIANT_ID, computationManager, parameters, NO_OP) .join(); - assertTrue(result.isOk()); + assertEquals(DynamicSimulationResult.Status.SUCCESS, result.getStatus()); + assertTrue(result.getStatusText().isEmpty()); assertEquals(35, result.getCurves().size()); - StringTimeSeries timeLine = result.getTimeLine(); - assertEquals(1, timeLine.toArray().length); - assertNull(timeLine.toArray()[0]); // FIXME + List timeLine = result.getTimeLine(); + assertTrue(timeLine.isEmpty()); + } + + @Test + void testSimulationError() { + Network network = Network.read(new ResourceDataSource("powsybl_dynawaltz", new ResourceSet("/error", "powsybl_dynawaltz.xiidm"))); + + GroovyDynamicModelsSupplier dynamicModelsSupplier = new GroovyDynamicModelsSupplier( + getResourceAsStream("/error/models.groovy"), + GroovyExtension.find(DynamicModelGroovyExtension.class, DynaWaltzProvider.NAME)); + + GroovyEventModelsSupplier eventModelsSupplier = new GroovyEventModelsSupplier( + getResourceAsStream("/error/eventModels.groovy"), + GroovyExtension.find(EventModelGroovyExtension.class, DynaWaltzProvider.NAME)); + + parameters.setStopTime(200); + dynaWaltzParameters.setModelsParameters(ParametersXml.load(getResourceAsStream("/error/models.par"))) + .setNetworkParameters(ParametersXml.load(getResourceAsStream("/error/network.par"), "NETWORK")) + .setSolverParameters(ParametersXml.load(getResourceAsStream("/error/solvers.par"), "3")) + .setSolverType(DynaWaltzParameters.SolverType.SIM) + .setDefaultDumpFileParameters(); + + DynamicSimulationResult result = provider.run(network, dynamicModelsSupplier, eventModelsSupplier, CurvesSupplier.empty(), + VariantManagerConstants.INITIAL_VARIANT_ID, computationManager, parameters, NO_OP) + .join(); + + assertEquals(DynamicSimulationResult.Status.FAILURE, result.getStatus()); + assertEquals("time step <= 0.1 s for more than 10 iterations ( DYNSolverCommonFixedTimeStep.cpp:419 )", result.getStatusText()); + assertTrue(result.getTimeLine().isEmpty()); + assertTrue(result.getCurves().isEmpty()); + } + + private void checkFirstTimeLineEvent(TimelineEvent event, double time, String modelName, String message) { + assertEquals(time, event.time()); + assertEquals(modelName, event.modelName()); + assertEquals(message, event.message()); } } diff --git a/dynawo-integration-tests/src/test/resources/error/eventModels.groovy b/dynawo-integration-tests/src/test/resources/error/eventModels.groovy new file mode 100644 index 000000000..97e19c954 --- /dev/null +++ b/dynawo-integration-tests/src/test/resources/error/eventModels.groovy @@ -0,0 +1,13 @@ +package error + +Disconnect { + staticId "L4032-4044" + startTime 1.1 +} +NodeFault { + staticId "4032_401" + startTime 1 + faultTime 0.1 + rPu 0.025 + xPu 0.025 +} diff --git a/dynawo-integration-tests/src/test/resources/error/models.groovy b/dynawo-integration-tests/src/test/resources/error/models.groovy new file mode 100644 index 000000000..27efab494 --- /dev/null +++ b/dynawo-integration-tests/src/test/resources/error/models.groovy @@ -0,0 +1,30 @@ +package error + +import com.powsybl.iidm.network.Generator +import com.powsybl.iidm.network.Load + +for (Generator equipment : network.generators) { + if (equipment.energySource.name() == "HYDRO") { + GeneratorSynchronousThreeWindingsGoverNordicVRNordic { + staticId equipment.id + parameterSetId "Nordic" + equipment.id + } + } else if (equipment.energySource.name() == "THERMAL") { + GeneratorSynchronousFourWindingsPmConstVRNordic { + staticId equipment.id + parameterSetId "Nordic" + equipment.id + } + } else if (equipment.energySource.name() == "OTHER") { + GeneratorSynchronousThreeWindingsPmConstVRNordic { + staticId equipment.id + parameterSetId "Nordic" + equipment.id + } + } +} + +for (Load equipment : network.loads) { + LoadAlphaBeta { + staticId equipment.id + parameterSetId "LAB" + } +} diff --git a/dynawo-integration-tests/src/test/resources/error/models.par b/dynawo-integration-tests/src/test/resources/error/models.par new file mode 100644 index 000000000..a786647fa --- /dev/null +++ b/dynawo-integration-tests/src/test/resources/error/models.par @@ -0,0 +1,1013 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dynawo-integration-tests/src/test/resources/error/network.par b/dynawo-integration-tests/src/test/resources/error/network.par new file mode 100644 index 000000000..f34881631 --- /dev/null +++ b/dynawo-integration-tests/src/test/resources/error/network.par @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dynawo-integration-tests/src/test/resources/error/powsybl_dynawaltz.xiidm b/dynawo-integration-tests/src/test/resources/error/powsybl_dynawaltz.xiidm new file mode 100644 index 000000000..4b2b7c1d1 --- /dev/null +++ b/dynawo-integration-tests/src/test/resources/error/powsybl_dynawaltz.xiidm @@ -0,0 +1,2195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dynawo-integration-tests/src/test/resources/error/solvers.par b/dynawo-integration-tests/src/test/resources/error/solvers.par new file mode 100644 index 000000000..71b76a308 --- /dev/null +++ b/dynawo-integration-tests/src/test/resources/error/solvers.par @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/dynawo-integration-tests/src/test/resources/ieee14/security-analysis/timeline_report.txt b/dynawo-integration-tests/src/test/resources/ieee14/security-analysis/timeline_report_as.txt similarity index 100% rename from dynawo-integration-tests/src/test/resources/ieee14/security-analysis/timeline_report.txt rename to dynawo-integration-tests/src/test/resources/ieee14/security-analysis/timeline_report_as.txt diff --git a/dynawo-integration-tests/src/test/resources/ieee14/security-analysis/timeline_report_lf.txt b/dynawo-integration-tests/src/test/resources/ieee14/security-analysis/timeline_report_lf.txt new file mode 100644 index 000000000..a39965d5c --- /dev/null +++ b/dynawo-integration-tests/src/test/resources/ieee14/security-analysis/timeline_report_lf.txt @@ -0,0 +1,2 @@ ++ Root message + + Dynaflow loadflow on network 'ieee14bus' diff --git a/pom.xml b/pom.xml index ec3734768..409cc97ca 100644 --- a/pom.xml +++ b/pom.xml @@ -56,7 +56,7 @@ 17 - 6.1.0-alpha-1 + 6.1.0 4.0.14 ../distribution/target/site/jacoco-aggregate/jacoco.xml, @@ -69,6 +69,9 @@ false + + dynawo-integration-tests +