From 308cbc35d36d1530ef3fe3785924db5044177125 Mon Sep 17 00:00:00 2001 From: SCHWITZGUEBEL Marc Ext Date: Thu, 14 Dec 2023 14:35:11 +0100 Subject: [PATCH 1/7] first version --- .../app/services/CseExportRunner.java | 2 +- .../app/services/TtcRaoService.java | 11 +- .../app/services/TtcResultService.java | 8 +- .../cse/data/cnec/CracResultsHelper.java | 103 +++++++++++------- .../cse/data/cnec/CracResultsHelperTest.java | 3 +- .../farao/cse/data/ttc_rao/TtcRaoTest.java | 2 +- .../farao/cse/data/ttc_res/TtcResultTest.java | 2 +- 7 files changed, 74 insertions(+), 57 deletions(-) diff --git a/cse-cc-export-runner-app/src/main/java/com/farao_community/farao/cse/export_runner/app/services/CseExportRunner.java b/cse-cc-export-runner-app/src/main/java/com/farao_community/farao/cse/export_runner/app/services/CseExportRunner.java index 92b9319f..357de49a 100644 --- a/cse-cc-export-runner-app/src/main/java/com/farao_community/farao/cse/export_runner/app/services/CseExportRunner.java +++ b/cse-cc-export-runner-app/src/main/java/com/farao_community/farao/cse/export_runner/app/services/CseExportRunner.java @@ -103,7 +103,7 @@ public CseExportResponse run(CseExportRequest cseExportRequest) { // Save again on MinIO to proper process location and naming String networkWithPraUrl = saveNetworkWithPra(cseExportRequest, networkWithPra); RaoResult raoResult = fileImporter.importRaoResult(raoResponse.getRaoResultFileUrl(), cseCracCreationContext.getCrac()); - String ttcResultUrl = ttcRaoService.saveTtcRao(cseExportRequest, cseCracCreationContext, raoResult, preprocessedPsts); + String ttcResultUrl = ttcRaoService.saveTtcRao(cseExportRequest, cseCracCreationContext, raoResult, networkWithPra, preprocessedPsts); return new CseExportResponse(cseExportRequest.getId(), ttcResultUrl, networkWithPraUrl, logsFileUrl); } catch (CseInternalException e) { // Temporary return of an empty string for ttc logs file and cgm file diff --git a/cse-cc-export-runner-app/src/main/java/com/farao_community/farao/cse/export_runner/app/services/TtcRaoService.java b/cse-cc-export-runner-app/src/main/java/com/farao_community/farao/cse/export_runner/app/services/TtcRaoService.java index 3d0cc907..eda03d8c 100644 --- a/cse-cc-export-runner-app/src/main/java/com/farao_community/farao/cse/export_runner/app/services/TtcRaoService.java +++ b/cse-cc-export-runner-app/src/main/java/com/farao_community/farao/cse/export_runner/app/services/TtcRaoService.java @@ -8,13 +8,12 @@ import com.farao_community.farao.cse.data.cnec.CracResultsHelper; import com.farao_community.farao.cse.data.ttc_rao.TtcRao; -import com.farao_community.farao.cse.data.xnode.XNodeReader; import com.farao_community.farao.cse.data.xsd.ttc_rao.CseRaoResult; import com.farao_community.farao.cse.export_runner.app.FileUtil; -import com.farao_community.farao.cse.export_runner.app.configurations.XNodesConfiguration; import com.farao_community.farao.cse.runner.api.resource.CseExportRequest; import com.farao_community.farao.data.crac_creation.creator.cse.CseCracCreationContext; import com.farao_community.farao.data.rao_result_api.RaoResult; +import com.powsybl.iidm.network.Network; import org.springframework.stereotype.Service; import java.util.Map; @@ -26,18 +25,16 @@ public class TtcRaoService { private final FileExporter fileExporter; - private final XNodesConfiguration xNodesConfiguration; - public TtcRaoService(FileExporter fileExporter, XNodesConfiguration xNodesConfiguration) { + public TtcRaoService(FileExporter fileExporter) { this.fileExporter = fileExporter; - this.xNodesConfiguration = xNodesConfiguration; } - public String saveTtcRao(CseExportRequest request, CseCracCreationContext cracCreationContext, RaoResult raoResult, Map preprocessedPsts) { + public String saveTtcRao(CseExportRequest request, CseCracCreationContext cracCreationContext, RaoResult raoResult, Network network, Map preprocessedPsts) { CracResultsHelper cracResultsHelper = new CracResultsHelper( cracCreationContext, raoResult, - XNodeReader.getXNodes(xNodesConfiguration.getxNodesFilePath())); + network); CseRaoResult cseRaoResult = TtcRao.generate(request.getTargetProcessDateTime(), cracResultsHelper, preprocessedPsts); return fileExporter.saveTtcRao(cseRaoResult, request.getProcessType(), request.getTargetProcessDateTime(), FileUtil.getFilenameFromUrl(request.getCgmUrl())); } diff --git a/cse-cc-import-runner-app/src/main/java/com/farao_community/farao/cse/import_runner/app/services/TtcResultService.java b/cse-cc-import-runner-app/src/main/java/com/farao_community/farao/cse/import_runner/app/services/TtcResultService.java index 407ddaa8..4ceada8d 100644 --- a/cse-cc-import-runner-app/src/main/java/com/farao_community/farao/cse/import_runner/app/services/TtcResultService.java +++ b/cse-cc-import-runner-app/src/main/java/com/farao_community/farao/cse/import_runner/app/services/TtcResultService.java @@ -10,14 +10,12 @@ import com.farao_community.farao.cse.computation.BorderExchanges; import com.farao_community.farao.cse.data.cnec.CracResultsHelper; import com.farao_community.farao.cse.data.ttc_res.TtcResult; -import com.farao_community.farao.cse.data.xnode.XNodeReader; import com.farao_community.farao.cse.data.xsd.ttc_res.Timestamp; import com.farao_community.farao.cse.import_runner.app.dichotomy.DichotomyRaoResponse; import com.farao_community.farao.cse.import_runner.app.dichotomy.NetworkShifterUtil; import com.farao_community.farao.cse.import_runner.app.util.FileUtil; import com.farao_community.farao.cse.runner.api.resource.CseRequest; import com.farao_community.farao.cse.import_runner.app.CseData; -import com.farao_community.farao.cse.import_runner.app.configurations.XNodesConfiguration; import com.farao_community.farao.cse.runner.api.resource.ProcessType; import com.farao_community.farao.data.crac_creation.creator.cse.CseCracCreationContext; import com.farao_community.farao.data.rao_result_api.RaoResult; @@ -36,12 +34,10 @@ public class TtcResultService { private final FileExporter fileExporter; private final FileImporter fileImporter; - private final XNodesConfiguration xNodesConfiguration; - public TtcResultService(FileExporter fileExporter, FileImporter fileImporter, XNodesConfiguration xNodesConfiguration) { + public TtcResultService(FileExporter fileExporter, FileImporter fileImporter) { this.fileExporter = fileExporter; this.fileImporter = fileImporter; - this.xNodesConfiguration = xNodesConfiguration; } public String saveFailedTtcResult(CseRequest cseRequest, String firstShiftNetworkName, TtcResult.FailedProcessData.FailedProcessReason failedProcessReason) { @@ -76,7 +72,7 @@ public String saveTtcResult(CseRequest cseRequest, CseData cseData, CseCracCreat RaoResult raoResult = fileImporter.importRaoResult(highestSecureStepRaoResponse.getRaoResponse().getRaoResultFileUrl(), cseCracCreationContext.getCrac()); CracResultsHelper cracResultsHelper = new CracResultsHelper( - cseCracCreationContext, raoResult, XNodeReader.getXNodes(xNodesConfiguration.getxNodesFilePath())); + cseCracCreationContext, raoResult, networkWithPra); Timestamp timestamp = TtcResult.generate(ttcFiles, processData, cracResultsHelper, preprocessedPsts, preprocessedPisaLinks); return fileExporter.saveTtcResult(timestamp, cseRequest.getTargetProcessDateTime(), cseRequest.getProcessType(), cseRequest.isImportEcProcess()); } diff --git a/cse-lib/data/src/main/java/com/farao_community/farao/cse/data/cnec/CracResultsHelper.java b/cse-lib/data/src/main/java/com/farao_community/farao/cse/data/cnec/CracResultsHelper.java index 67e36108..6ebf3535 100644 --- a/cse-lib/data/src/main/java/com/farao_community/farao/cse/data/cnec/CracResultsHelper.java +++ b/cse-lib/data/src/main/java/com/farao_community/farao/cse/data/cnec/CracResultsHelper.java @@ -8,7 +8,6 @@ import com.farao_community.farao.commons.Unit; import com.farao_community.farao.cse.data.CseDataException; -import com.farao_community.farao.cse.data.xnode.XNode; import com.farao_community.farao.data.crac_api.*; import com.farao_community.farao.data.crac_api.cnec.FlowCnec; import com.farao_community.farao.data.crac_api.cnec.Side; @@ -21,7 +20,11 @@ import com.farao_community.farao.data.crac_creation.creator.cse.critical_branch.CseCriticalBranchCreationContext; import com.farao_community.farao.data.crac_creation.creator.cse.outage.CseOutageCreationContext; import com.farao_community.farao.data.rao_result_api.RaoResult; +import com.powsybl.iidm.network.Country; +import com.powsybl.iidm.network.Network; +import com.powsybl.iidm.network.Substation; import com.powsybl.ucte.network.UcteCountryCode; +import org.apache.commons.lang3.StringUtils; import java.util.*; import java.util.stream.Collectors; @@ -35,13 +38,13 @@ public class CracResultsHelper { private final CseCracCreationContext cseCracCreationContext; private final Crac crac; private final RaoResult raoResult; - private final List xNodeList; + private final Network network; - public CracResultsHelper(CseCracCreationContext cseCracCreationContext, RaoResult result, List xNodeList) { + public CracResultsHelper(CseCracCreationContext cseCracCreationContext, RaoResult result, Network network) { this.cseCracCreationContext = cseCracCreationContext; this.crac = cseCracCreationContext.getCrac(); this.raoResult = result; - this.xNodeList = xNodeList; + this.network = network; } public Crac getCrac() { @@ -131,7 +134,7 @@ public List getPreventiveCnecs() { // CNEC name is in the FlowCnec name FlowCnec flowCnecPrev = crac.getFlowCnec(branchCnecCreationContext.getCreatedCnecsIds().get(Instant.PREVENTIVE)); if (flowCnecPrev != null) { - CnecCommon cnecCommon = makeCnecCommon(flowCnecPrev.getName(), branchCnecCreationContext.getNativeBranch(), + CnecCommon cnecCommon = makeCnecCommon(flowCnecPrev, branchCnecCreationContext.getNativeBranch(), ((CseCriticalBranchCreationContext) branchCnecCreationContext).isSelected()); CnecPreventive cnecPrev = new CnecPreventive(); cnecPrev.setCnecCommon(cnecCommon); @@ -154,10 +157,9 @@ public Map getMergedCnecs(String contingencyId) { branchCnecCreationContexts.forEach(branchCnecCreationContext -> { MergedCnec mergedCnec = new MergedCnec(); mergedCnecs.put(branchCnecCreationContext.getNativeId(), mergedCnec); - String cnecName = "undefined"; + FlowCnec flowCnec = null; for (Map.Entry entry : branchCnecCreationContext.getCreatedCnecsIds().entrySet()) { - FlowCnec flowCnec = crac.getFlowCnec(entry.getValue()); - cnecName = flowCnec.getName(); + flowCnec = crac.getFlowCnec(entry.getValue()); FlowCnecResult flowCnecResult; switch (entry.getKey()) { case OUTAGE: @@ -182,19 +184,19 @@ public Map getMergedCnecs(String contingencyId) { throw new CseDataException("Couldn't find Cnec type in cnec Id : " + flowCnec.getId()); } } - CnecCommon cnecCommon = makeCnecCommon(cnecName, branchCnecCreationContext.getNativeBranch(), + CnecCommon cnecCommon = makeCnecCommon(flowCnec, branchCnecCreationContext.getNativeBranch(), ((CseCriticalBranchCreationContext) branchCnecCreationContext).isSelected()); mergedCnec.setCnecCommon(cnecCommon); }); return mergedCnecs; } - private CnecCommon makeCnecCommon(String nativeId, NativeBranch nativeBranch, boolean selected) { + private CnecCommon makeCnecCommon(FlowCnec cnec, NativeBranch nativeBranch, boolean selected) { CnecCommon cnecCommon = new CnecCommon(); - cnecCommon.setName(nativeId); + cnecCommon.setName(cnec.getName()); cnecCommon.setCode(makeCode(nativeBranch)); - cnecCommon.setAreaFrom(getAreaFrom(nativeBranch)); - cnecCommon.setAreaTo(getAreaTo(nativeBranch)); + cnecCommon.setAreaFrom(getAreaFrom(cnec.getNetworkElement())); + cnecCommon.setAreaTo(getAreaTo(cnec.getNetworkElement())); cnecCommon.setNodeFrom(nativeBranch.getFrom()); cnecCommon.setNodeTo(nativeBranch.getTo()); cnecCommon.setOrderCode(nativeBranch.getSuffix()); @@ -233,24 +235,12 @@ public FlowCnecResult getFlowCnecResultInAmpere(FlowCnec flowCnec, Instant optim return new FlowCnecResult(flow, iMax); } - public String getAreaFrom(NativeBranch nativeBranch) { - String countryFrom = UcteCountryCode.fromUcteCode(nativeBranch.getFrom().charAt(0)).toString(); - String countryTo = UcteCountryCode.fromUcteCode(nativeBranch.getTo().charAt(0)).toString(); - return getCountryOfNode(nativeBranch.getFrom(), countryFrom, countryTo); - } - public String getAreaFrom(NetworkElement networkElement) { String nodeFrom = getNodeFrom(networkElement); String nodeTo = getNodeTo(networkElement); String countryFrom = UcteCountryCode.fromUcteCode(nodeFrom.charAt(0)).toString(); String countryTo = UcteCountryCode.fromUcteCode(nodeTo.charAt(0)).toString(); - return getCountryOfNode(nodeFrom, countryFrom, countryTo); - } - - public String getAreaTo(NativeBranch nativeBranch) { - String countryFrom = UcteCountryCode.fromUcteCode(nativeBranch.getFrom().charAt(0)).toString(); - String countryTo = UcteCountryCode.fromUcteCode(nativeBranch.getTo().charAt(0)).toString(); - return getCountryOfNode(nativeBranch.getTo(), countryTo, countryFrom); + return getCountryOfNode(networkElement, countryFrom, countryTo); } public String getAreaTo(NetworkElement networkElement) { @@ -258,26 +248,61 @@ public String getAreaTo(NetworkElement networkElement) { String nodeTo = getNodeTo(networkElement); String countryFrom = UcteCountryCode.fromUcteCode(nodeFrom.charAt(0)).toString(); String countryTo = UcteCountryCode.fromUcteCode(nodeTo.charAt(0)).toString(); - return getCountryOfNode(nodeTo, countryTo, countryFrom); + return getCountryOfNode(networkElement, countryTo, countryFrom); } - private String getCountryOfNode(String nodeFrom, String countryFrom, String countryTo) { + private String getCountryOfNode(NetworkElement networkElement, String countryFrom, String countryTo) { if (!countryFrom.equals(UcteCountryCode.XX.toString())) { return countryFrom; } else { - Optional xNodeOpt = xNodeList.stream().filter(xNode -> xNode.getName().equals(nodeFrom)).findFirst(); - if (xNodeOpt.isPresent()) { - String area1 = xNodeOpt.get().getArea1(); - String area2 = xNodeOpt.get().getArea2(); - if (area1.equals(countryTo)) { - return area2; - } else { - return area1; - } + String area1 = getCountrySide1(networkElement); + String area2 = getCountrySide2(networkElement); + if (StringUtils.equals(area1, countryTo)) { + return area2; } else { - throw new CseDataException("XNode " + nodeFrom + " Not found in XNodes configuration file"); + return area1; + } + } + } + + private String getCountrySide1(NetworkElement networkElement) { + + Optional substationOpt = network.getBranch(networkElement.getId()).getTerminal1().getVoltageLevel().getSubstation(); + Optional country = getCountryOptionalFromSubstation(substationOpt); + if (country.isEmpty()) { + substationOpt = network.getTieLine(networkElement.getId()).getDanglingLine1().getTerminal().getVoltageLevel().getSubstation(); + country = getCountryOptionalFromSubstation(substationOpt); + } + if (country.isPresent()) { + return country.get().toString(); + } else { + throw new CseDataException("NetworkElement " + networkElement.getId() + " has no country on side 1"); + } + } + + private String getCountrySide2(NetworkElement networkElement) { + + Optional substationOpt = network.getBranch(networkElement.getId()).getTerminal2().getVoltageLevel().getSubstation(); + Optional country = getCountryOptionalFromSubstation(substationOpt); + if (country.isEmpty()) { + substationOpt = network.getTieLine(networkElement.getId()).getDanglingLine2().getTerminal().getVoltageLevel().getSubstation(); + country = getCountryOptionalFromSubstation(substationOpt); + } + if (country.isPresent()) { + return country.get().toString(); + } else { + throw new CseDataException("NetworkElement " + networkElement.getId() + " has no country on side 2"); + } + } + + Optional getCountryOptionalFromSubstation(Optional substation) { + if (substation.isPresent()) { + Optional countryOpt = substation.get().getCountry(); + if (countryOpt.isPresent()) { + return countryOpt; } } + return Optional.empty(); } public String getNodeFrom(NetworkElement networkElement) { @@ -306,7 +331,7 @@ public static Set getOutageElements(FlowCnec flowCnec) { if (contingencyOpt.isPresent()) { return contingencyOpt.get().getNetworkElements(); } else { - return Collections.EMPTY_SET; + return Collections.emptySet(); } } diff --git a/cse-lib/data/src/test/java/com/farao_community/farao/cse/data/cnec/CracResultsHelperTest.java b/cse-lib/data/src/test/java/com/farao_community/farao/cse/data/cnec/CracResultsHelperTest.java index 35d9587f..345c8586 100644 --- a/cse-lib/data/src/test/java/com/farao_community/farao/cse/data/cnec/CracResultsHelperTest.java +++ b/cse-lib/data/src/test/java/com/farao_community/farao/cse/data/cnec/CracResultsHelperTest.java @@ -20,7 +20,6 @@ import org.junit.jupiter.api.Test; import java.io.InputStream; -import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -121,6 +120,6 @@ private CracResultsHelper getCracResultsHelper(String cracXmlFileName, String ne InputStream raoResultInputStream = getClass().getResourceAsStream(raoResultFileName); RaoResult raoResult = new RaoResultImporter().importRaoResult(raoResultInputStream, cseCracCreationContext.getCrac()); - return new CracResultsHelper(cseCracCreationContext, raoResult, new ArrayList<>()); + return new CracResultsHelper(cseCracCreationContext, raoResult, network); } } diff --git a/cse-lib/data/src/test/java/com/farao_community/farao/cse/data/ttc_rao/TtcRaoTest.java b/cse-lib/data/src/test/java/com/farao_community/farao/cse/data/ttc_rao/TtcRaoTest.java index bbcb150b..b22c55d7 100644 --- a/cse-lib/data/src/test/java/com/farao_community/farao/cse/data/ttc_rao/TtcRaoTest.java +++ b/cse-lib/data/src/test/java/com/farao_community/farao/cse/data/ttc_rao/TtcRaoTest.java @@ -59,7 +59,7 @@ private CracResultsHelper getCracResultsHelper(String raoResultFileName) { CseCracCreationContext cseCracCreationContext = cseCracCreator.createCrac(cseCrac, network, null, new CracCreationParameters()); InputStream raoResultInputStream = getClass().getResourceAsStream(raoResultFileName); RaoResult raoResult = new RaoResultImporter().importRaoResult(raoResultInputStream, cseCracCreationContext.getCrac()); - return new CracResultsHelper(cseCracCreationContext, raoResult, new ArrayList<>()); + return new CracResultsHelper(cseCracCreationContext, raoResult, network); } @Test diff --git a/cse-lib/data/src/test/java/com/farao_community/farao/cse/data/ttc_res/TtcResultTest.java b/cse-lib/data/src/test/java/com/farao_community/farao/cse/data/ttc_res/TtcResultTest.java index 23b867c6..0245ec64 100644 --- a/cse-lib/data/src/test/java/com/farao_community/farao/cse/data/ttc_res/TtcResultTest.java +++ b/cse-lib/data/src/test/java/com/farao_community/farao/cse/data/ttc_res/TtcResultTest.java @@ -62,7 +62,7 @@ public void setUp() { CseCracCreationContext cseCracCreationContext = cseCracCreator.createCrac(cseCrac, network, null, new CracCreationParameters()); RaoResult raoResult = new RaoResultImporter().importRaoResult(getClass().getResourceAsStream("pst_and_topo/raoResult.json"), cseCracCreationContext.getCrac()); - cracResultsHelper = new CracResultsHelper(cseCracCreationContext, raoResult, new ArrayList<>()); + cracResultsHelper = new CracResultsHelper(cseCracCreationContext, raoResult, network); } private TtcResult.ProcessData initProcessData(LimitingCause limitingCause, double finalItalianImport, double mniiOffsetValue) { From 8dd506576f311b3edada18c3c83e77294ab39785 Mon Sep 17 00:00:00 2001 From: SCHWITZGUEBEL Marc Ext Date: Thu, 14 Dec 2023 15:24:03 +0100 Subject: [PATCH 2/7] first version --- .../configurations/XNodesConfiguration.java | 24 ------- .../configurations/XNodesConfiguration.java | 24 ------- .../XNodesConfigurationTest.java | 29 -------- .../farao/cse/data/xnode/XNode.java | 67 ------------------- .../farao/cse/data/xnode/XNodeReader.java | 46 ------------- .../farao/cse/data/xnode/XNodeReaderTest.java | 35 ---------- 6 files changed, 225 deletions(-) delete mode 100644 cse-cc-export-runner-app/src/main/java/com/farao_community/farao/cse/export_runner/app/configurations/XNodesConfiguration.java delete mode 100644 cse-cc-import-runner-app/src/main/java/com/farao_community/farao/cse/import_runner/app/configurations/XNodesConfiguration.java delete mode 100644 cse-cc-import-runner-app/src/test/java/com/farao_community/farao/cse/import_runner/app/configurations/XNodesConfigurationTest.java delete mode 100644 cse-lib/data/src/main/java/com/farao_community/farao/cse/data/xnode/XNode.java delete mode 100644 cse-lib/data/src/main/java/com/farao_community/farao/cse/data/xnode/XNodeReader.java delete mode 100644 cse-lib/data/src/test/java/com/farao_community/farao/cse/data/xnode/XNodeReaderTest.java diff --git a/cse-cc-export-runner-app/src/main/java/com/farao_community/farao/cse/export_runner/app/configurations/XNodesConfiguration.java b/cse-cc-export-runner-app/src/main/java/com/farao_community/farao/cse/export_runner/app/configurations/XNodesConfiguration.java deleted file mode 100644 index ae885c8b..00000000 --- a/cse-cc-export-runner-app/src/main/java/com/farao_community/farao/cse/export_runner/app/configurations/XNodesConfiguration.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2022, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -package com.farao_community.farao.cse.export_runner.app.configurations; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; - -/** - * @author Joris Mancini {@literal } - */ -@Configuration -public class XNodesConfiguration { - - @Value("${cse-cc-runner.xnodes.file-path}") - private String xNodesFilePath; - - public String getxNodesFilePath() { - return xNodesFilePath; - } -} diff --git a/cse-cc-import-runner-app/src/main/java/com/farao_community/farao/cse/import_runner/app/configurations/XNodesConfiguration.java b/cse-cc-import-runner-app/src/main/java/com/farao_community/farao/cse/import_runner/app/configurations/XNodesConfiguration.java deleted file mode 100644 index 656d9922..00000000 --- a/cse-cc-import-runner-app/src/main/java/com/farao_community/farao/cse/import_runner/app/configurations/XNodesConfiguration.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2022, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -package com.farao_community.farao.cse.import_runner.app.configurations; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; - -/** - * @author Joris Mancini {@literal } - */ -@Configuration -public class XNodesConfiguration { - - @Value("${cse-cc-runner.xnodes.file-path}") - private String xNodesFilePath; - - public String getxNodesFilePath() { - return xNodesFilePath; - } -} diff --git a/cse-cc-import-runner-app/src/test/java/com/farao_community/farao/cse/import_runner/app/configurations/XNodesConfigurationTest.java b/cse-cc-import-runner-app/src/test/java/com/farao_community/farao/cse/import_runner/app/configurations/XNodesConfigurationTest.java deleted file mode 100644 index 824bacf6..00000000 --- a/cse-cc-import-runner-app/src/test/java/com/farao_community/farao/cse/import_runner/app/configurations/XNodesConfigurationTest.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2022, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ - -package com.farao_community.farao.cse.import_runner.app.configurations; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import static org.junit.jupiter.api.Assertions.*; - -/** - * @author Joris Mancini {@literal } - */ -@SpringBootTest -class XNodesConfigurationTest { - - @Autowired - private XNodesConfiguration xNodesConfiguration; - - @Test - void testXNodesLoading() { - assertEquals("xnodes/cvg_xnodes_20200714.xml", xNodesConfiguration.getxNodesFilePath()); - } -} diff --git a/cse-lib/data/src/main/java/com/farao_community/farao/cse/data/xnode/XNode.java b/cse-lib/data/src/main/java/com/farao_community/farao/cse/data/xnode/XNode.java deleted file mode 100644 index d4cdeded..00000000 --- a/cse-lib/data/src/main/java/com/farao_community/farao/cse/data/xnode/XNode.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2021, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -package com.farao_community.farao.cse.data.xnode; - -/** - * @author Mohamed BenRejeb {@literal } - */ -public class XNode { - - private String name; - private String area1; - private String area2; - private String subarea1; - private String subarea2; - - public XNode(String name, String area1, String subarea1, String area2, String subarea2) { - this.name = name; - this.area1 = area1; - this.area2 = area2; - this.subarea1 = subarea1; - this.subarea2 = subarea2; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getArea1() { - return area1; - } - - public void setArea1(String area1) { - this.area1 = area1; - } - - public String getArea2() { - return area2; - } - - public void setArea2(String area2) { - this.area2 = area2; - } - - public String getSubarea1() { - return subarea1; - } - - public void setSubarea1(String subarea1) { - this.subarea1 = subarea1; - } - - public String getSubarea2() { - return subarea2; - } - - public void setSubarea2(String subarea2) { - this.subarea2 = subarea2; - } -} diff --git a/cse-lib/data/src/main/java/com/farao_community/farao/cse/data/xnode/XNodeReader.java b/cse-lib/data/src/main/java/com/farao_community/farao/cse/data/xnode/XNodeReader.java deleted file mode 100644 index e1e72d7b..00000000 --- a/cse-lib/data/src/main/java/com/farao_community/farao/cse/data/xnode/XNodeReader.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2021, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -package com.farao_community.farao.cse.data.xnode; - -import com.farao_community.farao.cse.data.CseDataException; -import com.farao_community.farao.cse.data.DataUtil; -import com.farao_community.farao.cse.data.xsd.Xnodes; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.xml.bind.JAXBException; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.List; -import java.util.stream.Collectors; - -/** - * @author Joris Mancini {@literal } - */ -public final class XNodeReader { - private static final Logger LOGGER = LoggerFactory.getLogger(XNodeReader.class); - - private XNodeReader() { - // Should not be instantiated - } - - public static List getXNodes(String filePath) { - Xnodes xnodes; - try (InputStream is = new FileInputStream(filePath)) { - xnodes = DataUtil.unmarshalFromInputStream(is, Xnodes.class); - } catch (IOException e) { - String errorMessage = String.format("Unable to find xnodes configuration file at %s", filePath); - LOGGER.error(errorMessage); - throw new CseDataException(errorMessage, e); - } catch (JAXBException e) { - throw new CseDataException("Unable to unmarshal xnodes file.", e); - } - return xnodes.getXnode().stream().map(xnode -> - new XNode(xnode.getName(), xnode.getArea1(), xnode.getSubarea1(), xnode.getArea2(), xnode.getSubarea2())).collect(Collectors.toList()); - } -} diff --git a/cse-lib/data/src/test/java/com/farao_community/farao/cse/data/xnode/XNodeReaderTest.java b/cse-lib/data/src/test/java/com/farao_community/farao/cse/data/xnode/XNodeReaderTest.java deleted file mode 100644 index 1f8e7a84..00000000 --- a/cse-lib/data/src/test/java/com/farao_community/farao/cse/data/xnode/XNodeReaderTest.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2021, RTE (http://www.rte-france.com) - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -package com.farao_community.farao.cse.data.xnode; - -import com.farao_community.farao.cse.data.CseDataException; -import org.junit.jupiter.api.Test; - -import java.util.Objects; - -import static org.junit.jupiter.api.Assertions.*; - -/** - * @author Joris Mancini {@literal } - */ -class XNodeReaderTest { - @Test - void testXNodesLoading() { - String path = Objects.requireNonNull(getClass().getResource("cvg_xnodes_20200714.xml")).getPath(); - assertEquals(413, XNodeReader.getXNodes(path).size()); - } - - @Test - void testXNodesLoadingFailsBecauseOfMissingFile() { - assertThrows(CseDataException.class, () -> XNodeReader.getXNodes("/fakePathToXNodes/xnodes.xml")); - } - - @Test - void testXNodesLoadingFailsBecauseOfIncorrectFile() { - assertThrows(CseDataException.class, () -> XNodeReader.getXNodes("fake_xnodes.xml")); - } -} From 0eaae1f6abc10e281b4a836ff5b06d48f77b0d99 Mon Sep 17 00:00:00 2001 From: SCHWITZGUEBEL Marc Ext Date: Fri, 15 Dec 2023 14:26:34 +0100 Subject: [PATCH 3/7] Remove xnodes config, ammended version --- .../export_runner/app/services/CseExportRunner.java | 2 +- .../farao/cse/data/cnec/CracResultsHelper.java | 10 ---------- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/cse-cc-export-runner-app/src/main/java/com/farao_community/farao/cse/export_runner/app/services/CseExportRunner.java b/cse-cc-export-runner-app/src/main/java/com/farao_community/farao/cse/export_runner/app/services/CseExportRunner.java index 357de49a..04e937b5 100644 --- a/cse-cc-export-runner-app/src/main/java/com/farao_community/farao/cse/export_runner/app/services/CseExportRunner.java +++ b/cse-cc-export-runner-app/src/main/java/com/farao_community/farao/cse/export_runner/app/services/CseExportRunner.java @@ -103,7 +103,7 @@ public CseExportResponse run(CseExportRequest cseExportRequest) { // Save again on MinIO to proper process location and naming String networkWithPraUrl = saveNetworkWithPra(cseExportRequest, networkWithPra); RaoResult raoResult = fileImporter.importRaoResult(raoResponse.getRaoResultFileUrl(), cseCracCreationContext.getCrac()); - String ttcResultUrl = ttcRaoService.saveTtcRao(cseExportRequest, cseCracCreationContext, raoResult, networkWithPra, preprocessedPsts); + String ttcResultUrl = ttcRaoService.saveTtcRao(cseExportRequest, cseCracCreationContext, raoResult, fileImporter.importNetwork(raoResponse.getNetworkWithPraFileUrl()), preprocessedPsts); return new CseExportResponse(cseExportRequest.getId(), ttcResultUrl, networkWithPraUrl, logsFileUrl); } catch (CseInternalException e) { // Temporary return of an empty string for ttc logs file and cgm file diff --git a/cse-lib/data/src/main/java/com/farao_community/farao/cse/data/cnec/CracResultsHelper.java b/cse-lib/data/src/main/java/com/farao_community/farao/cse/data/cnec/CracResultsHelper.java index 6ebf3535..931812a7 100644 --- a/cse-lib/data/src/main/java/com/farao_community/farao/cse/data/cnec/CracResultsHelper.java +++ b/cse-lib/data/src/main/java/com/farao_community/farao/cse/data/cnec/CracResultsHelper.java @@ -266,13 +266,8 @@ private String getCountryOfNode(NetworkElement networkElement, String countryFro } private String getCountrySide1(NetworkElement networkElement) { - Optional substationOpt = network.getBranch(networkElement.getId()).getTerminal1().getVoltageLevel().getSubstation(); Optional country = getCountryOptionalFromSubstation(substationOpt); - if (country.isEmpty()) { - substationOpt = network.getTieLine(networkElement.getId()).getDanglingLine1().getTerminal().getVoltageLevel().getSubstation(); - country = getCountryOptionalFromSubstation(substationOpt); - } if (country.isPresent()) { return country.get().toString(); } else { @@ -281,13 +276,8 @@ private String getCountrySide1(NetworkElement networkElement) { } private String getCountrySide2(NetworkElement networkElement) { - Optional substationOpt = network.getBranch(networkElement.getId()).getTerminal2().getVoltageLevel().getSubstation(); Optional country = getCountryOptionalFromSubstation(substationOpt); - if (country.isEmpty()) { - substationOpt = network.getTieLine(networkElement.getId()).getDanglingLine2().getTerminal().getVoltageLevel().getSubstation(); - country = getCountryOptionalFromSubstation(substationOpt); - } if (country.isPresent()) { return country.get().toString(); } else { From a9da0db341b0fc7e0db1c5c3d01cf33f34c5746d Mon Sep 17 00:00:00 2001 From: SCHWITZGUEBEL Marc Ext Date: Fri, 15 Dec 2023 16:33:33 +0100 Subject: [PATCH 4/7] using crac to get to and from country nodes --- .../cse/data/cnec/CracResultsHelper.java | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/cse-lib/data/src/main/java/com/farao_community/farao/cse/data/cnec/CracResultsHelper.java b/cse-lib/data/src/main/java/com/farao_community/farao/cse/data/cnec/CracResultsHelper.java index 931812a7..1e7fd22c 100644 --- a/cse-lib/data/src/main/java/com/farao_community/farao/cse/data/cnec/CracResultsHelper.java +++ b/cse-lib/data/src/main/java/com/farao_community/farao/cse/data/cnec/CracResultsHelper.java @@ -192,11 +192,12 @@ public Map getMergedCnecs(String contingencyId) { } private CnecCommon makeCnecCommon(FlowCnec cnec, NativeBranch nativeBranch, boolean selected) { + NetworkElement networkElement = cnec.getNetworkElement(); CnecCommon cnecCommon = new CnecCommon(); cnecCommon.setName(cnec.getName()); cnecCommon.setCode(makeCode(nativeBranch)); - cnecCommon.setAreaFrom(getAreaFrom(cnec.getNetworkElement())); - cnecCommon.setAreaTo(getAreaTo(cnec.getNetworkElement())); + cnecCommon.setAreaFrom(getAreaFrom(networkElement, nativeBranch)); + cnecCommon.setAreaTo(getAreaTo(networkElement, nativeBranch)); cnecCommon.setNodeFrom(nativeBranch.getFrom()); cnecCommon.setNodeTo(nativeBranch.getTo()); cnecCommon.setOrderCode(nativeBranch.getSuffix()); @@ -251,13 +252,25 @@ public String getAreaTo(NetworkElement networkElement) { return getCountryOfNode(networkElement, countryTo, countryFrom); } - private String getCountryOfNode(NetworkElement networkElement, String countryFrom, String countryTo) { - if (!countryFrom.equals(UcteCountryCode.XX.toString())) { - return countryFrom; + public String getAreaFrom(NetworkElement networkElement, NativeBranch nativeBranch) { + String countryFrom = UcteCountryCode.fromUcteCode(nativeBranch.getFrom().charAt(0)).toString(); + String countryTo = UcteCountryCode.fromUcteCode(nativeBranch.getTo().charAt(0)).toString(); + return getCountryOfNode(networkElement, countryFrom, countryTo); + } + + public String getAreaTo(NetworkElement networkElement, NativeBranch nativeBranch) { + String countryFrom = UcteCountryCode.fromUcteCode(nativeBranch.getFrom().charAt(0)).toString(); + String countryTo = UcteCountryCode.fromUcteCode(nativeBranch.getTo().charAt(0)).toString(); + return getCountryOfNode(networkElement, countryTo, countryFrom); + } + + private String getCountryOfNode(NetworkElement networkElement, String nodeCountry, String destinationNodeCountry) { + if (!nodeCountry.equals(UcteCountryCode.XX.toString())) { + return nodeCountry; } else { String area1 = getCountrySide1(networkElement); String area2 = getCountrySide2(networkElement); - if (StringUtils.equals(area1, countryTo)) { + if (StringUtils.equals(area1, destinationNodeCountry)) { return area2; } else { return area1; From fafbe42d245e18f8a1b447d4a67b7fb407e07e7d Mon Sep 17 00:00:00 2001 From: SCHWITZGUEBEL Marc Ext Date: Mon, 18 Dec 2023 09:29:04 +0100 Subject: [PATCH 5/7] using crac to get to and from country nodes, clean up --- .../farao/cse/data/cnec/CracResultsHelper.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cse-lib/data/src/main/java/com/farao_community/farao/cse/data/cnec/CracResultsHelper.java b/cse-lib/data/src/main/java/com/farao_community/farao/cse/data/cnec/CracResultsHelper.java index 1e7fd22c..31c36fa2 100644 --- a/cse-lib/data/src/main/java/com/farao_community/farao/cse/data/cnec/CracResultsHelper.java +++ b/cse-lib/data/src/main/java/com/farao_community/farao/cse/data/cnec/CracResultsHelper.java @@ -252,13 +252,13 @@ public String getAreaTo(NetworkElement networkElement) { return getCountryOfNode(networkElement, countryTo, countryFrom); } - public String getAreaFrom(NetworkElement networkElement, NativeBranch nativeBranch) { + private String getAreaFrom(NetworkElement networkElement, NativeBranch nativeBranch) { String countryFrom = UcteCountryCode.fromUcteCode(nativeBranch.getFrom().charAt(0)).toString(); String countryTo = UcteCountryCode.fromUcteCode(nativeBranch.getTo().charAt(0)).toString(); return getCountryOfNode(networkElement, countryFrom, countryTo); } - public String getAreaTo(NetworkElement networkElement, NativeBranch nativeBranch) { + private String getAreaTo(NetworkElement networkElement, NativeBranch nativeBranch) { String countryFrom = UcteCountryCode.fromUcteCode(nativeBranch.getFrom().charAt(0)).toString(); String countryTo = UcteCountryCode.fromUcteCode(nativeBranch.getTo().charAt(0)).toString(); return getCountryOfNode(networkElement, countryTo, countryFrom); From 0fec67fc965ba491e22f038e03fcd5716db0815a Mon Sep 17 00:00:00 2001 From: SCHWITZGUEBEL Marc Ext Date: Tue, 19 Dec 2023 13:43:32 +0100 Subject: [PATCH 6/7] adding unit test --- .../cse/data/cnec/CracResultsHelperTest.java | 19 +++++++ .../farao/cse/data/cnec/pst_and_topo/crac.xml | 55 +++++++++++++++++++ .../cse/data/cnec/pst_and_topo/network.uct | 3 + 3 files changed, 77 insertions(+) diff --git a/cse-lib/data/src/test/java/com/farao_community/farao/cse/data/cnec/CracResultsHelperTest.java b/cse-lib/data/src/test/java/com/farao_community/farao/cse/data/cnec/CracResultsHelperTest.java index 345c8586..b3af424c 100644 --- a/cse-lib/data/src/test/java/com/farao_community/farao/cse/data/cnec/CracResultsHelperTest.java +++ b/cse-lib/data/src/test/java/com/farao_community/farao/cse/data/cnec/CracResultsHelperTest.java @@ -107,6 +107,25 @@ void geMergedCnecsTest() { assertEquals(0, frFrMergedCnec.getiMaxAfterSps(), .1); } + @Test + void geMergedCnecsXnodeTest() { + CracResultsHelper cracResultsHelper = getCracResultsHelper("pst_and_topo/crac.xml", "pst_and_topo/network.uct", "pst_and_topo/raoResult.json"); + Map mergedCnecs = cracResultsHelper.getMergedCnecs("outage_4_xnode"); + assertEquals(1, mergedCnecs.size()); + + MergedCnec xnodeMergedCnec = mergedCnecs.get("Xnode - XAA_AA11 - NNL2AA1 - outage_4_xnode"); + assertEquals("Xnode", xnodeMergedCnec.getCnecCommon().getName()); + assertEquals("XAA_AA11 NNL2AA1 1", xnodeMergedCnec.getCnecCommon().getCode()); + assertEquals("FR", xnodeMergedCnec.getCnecCommon().getAreaFrom()); + assertEquals("NL", xnodeMergedCnec.getCnecCommon().getAreaTo()); + assertEquals(Double.NaN, xnodeMergedCnec.getiAfterOutage(), .1); + assertEquals(2940, xnodeMergedCnec.getiMaxAfterOutage(), .1); + assertEquals(Double.NaN, xnodeMergedCnec.getiAfterCra(), .1); + assertEquals(2450, xnodeMergedCnec.getiMaxAfterCra(), .1); + assertEquals(0, xnodeMergedCnec.getiAfterSps(), .1); + assertEquals(0, xnodeMergedCnec.getiMaxAfterSps(), .1); + } + private CracResultsHelper getCracResultsHelper(String cracXmlFileName, String networkFileName, String raoResultFileName) { InputStream cracInputStream = getClass().getResourceAsStream(cracXmlFileName); CseCracImporter importer = new CseCracImporter(); diff --git a/cse-lib/data/src/test/resources/com/farao_community/farao/cse/data/cnec/pst_and_topo/crac.xml b/cse-lib/data/src/test/resources/com/farao_community/farao/cse/data/cnec/pst_and_topo/crac.xml index 156decee..a9764400 100644 --- a/cse-lib/data/src/test/resources/com/farao_community/farao/cse/data/cnec/pst_and_topo/crac.xml +++ b/cse-lib/data/src/test/resources/com/farao_community/farao/cse/data/cnec/pst_and_topo/crac.xml @@ -42,6 +42,19 @@ + + + + + + + + + + + + + @@ -148,6 +161,29 @@ + + + + + + + + + + + + + + + + + + + + + + + @@ -204,6 +240,25 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cse-lib/data/src/test/resources/com/farao_community/farao/cse/data/cnec/pst_and_topo/network.uct b/cse-lib/data/src/test/resources/com/farao_community/farao/cse/data/cnec/pst_and_topo/network.uct index cc2778c9..4d7fe8a0 100644 --- a/cse-lib/data/src/test/resources/com/farao_community/farao/cse/data/cnec/pst_and_topo/network.uct +++ b/cse-lib/data/src/test/resources/com/farao_community/farao/cse/data/cnec/pst_and_topo/network.uct @@ -24,6 +24,7 @@ FFR3AA1 FR3 0 2 400.00 1500.00 0.00000 -3000.0 0.00000 9000.00 -9000.0 NNL1AA1 NL1 0 2 400.00 1000.00 0.00000 -1500.0 0.00000 9000.00 -9000.0 9000.00 -9000.0 F NNL2AA1 NL2 0 2 400.00 1000.00 0.00000 -500.00 0.00000 9000.00 -9000.0 9000.00 -9000.0 F NNL3AA1 NL3 0 2 400.00 2500.00 0.00000 -2000.0 0.00000 9000.00 -9000.0 9000.00 -9000.0 F +XAA_AA11 FF-BB1 0 2 400.00 2500.00 0.00000 -2000.0 0.00000 9000.00 -9000.0 9000.00 -9000.0 F ##L BBE1AA1W BBE1AA11 1 2 0.0000 0.0000 0.000000 5000 BBE1AA1W BBE1AA12 1 7 0.0000 0.0000 0.000000 5000 @@ -50,6 +51,8 @@ NNL1AA1 NNL2AA1 1 0 0.0000 10.000 0.000000 5000 NNL1AA1 NNL3AA1 1 0 0.0000 10.000 0.000000 5000 NNL2AA1 BBE3AA1 1 0 0.0000 10.000 0.000000 5000 NNL2AA1 NNL3AA1 1 0 0.0000 10.000 0.000000 5000 +FFR3AA1 XAA_AA11 1 0 0.0000 7.1450 0.000000 2688 DIV-AAA400 1 +XAA_AA11 NNL2AA1 1 0 0.0000 7.1115 0.000000 2450 RDPVAAA 1 ##T BBE2AA1 BBE3AA1 1 0 400.0 400.0 1000. 0.0000 10.000 0.000000 0.0000 5000 PST ##R From 517d7212a21369de4414754b7cee0796b106ec40 Mon Sep 17 00:00:00 2001 From: SCHWITZGUEBEL Marc Ext Date: Tue, 19 Dec 2023 16:21:39 +0100 Subject: [PATCH 7/7] take review into account --- .../farao/cse/export_runner/app/services/CseExportRunner.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cse-cc-export-runner-app/src/main/java/com/farao_community/farao/cse/export_runner/app/services/CseExportRunner.java b/cse-cc-export-runner-app/src/main/java/com/farao_community/farao/cse/export_runner/app/services/CseExportRunner.java index 04e937b5..d9f06821 100644 --- a/cse-cc-export-runner-app/src/main/java/com/farao_community/farao/cse/export_runner/app/services/CseExportRunner.java +++ b/cse-cc-export-runner-app/src/main/java/com/farao_community/farao/cse/export_runner/app/services/CseExportRunner.java @@ -103,7 +103,8 @@ public CseExportResponse run(CseExportRequest cseExportRequest) { // Save again on MinIO to proper process location and naming String networkWithPraUrl = saveNetworkWithPra(cseExportRequest, networkWithPra); RaoResult raoResult = fileImporter.importRaoResult(raoResponse.getRaoResultFileUrl(), cseCracCreationContext.getCrac()); - String ttcResultUrl = ttcRaoService.saveTtcRao(cseExportRequest, cseCracCreationContext, raoResult, fileImporter.importNetwork(raoResponse.getNetworkWithPraFileUrl()), preprocessedPsts); + Network networkForTtc = fileImporter.importNetwork(raoResponse.getNetworkWithPraFileUrl()); + String ttcResultUrl = ttcRaoService.saveTtcRao(cseExportRequest, cseCracCreationContext, raoResult, networkForTtc, preprocessedPsts); return new CseExportResponse(cseExportRequest.getId(), ttcResultUrl, networkWithPraUrl, logsFileUrl); } catch (CseInternalException e) { // Temporary return of an empty string for ttc logs file and cgm file