diff --git a/cgmes/cgmes-conformity/src/main/resources/conformity-modified/cas-1.1.3-data-4.0.3/MicroGrid/BaseCase/BC_BE_v2_transformer_at_boundary/MicroGridTestConfiguration_BC_BE_EQ_V2.xml b/cgmes/cgmes-conformity/src/main/resources/conformity-modified/cas-1.1.3-data-4.0.3/MicroGrid/BaseCase/BC_BE_v2_transformer_at_boundary/MicroGridTestConfiguration_BC_BE_EQ_V2.xml index 7590882ad0c..eabb8e938eb 100644 --- a/cgmes/cgmes-conformity/src/main/resources/conformity-modified/cas-1.1.3-data-4.0.3/MicroGrid/BaseCase/BC_BE_v2_transformer_at_boundary/MicroGridTestConfiguration_BC_BE_EQ_V2.xml +++ b/cgmes/cgmes-conformity/src/main/resources/conformity-modified/cas-1.1.3-data-4.0.3/MicroGrid/BaseCase/BC_BE_v2_transformer_at_boundary/MicroGridTestConfiguration_BC_BE_EQ_V2.xml @@ -1427,7 +1427,7 @@ - + BE-TR2_1 BE-T_1 400.000000 diff --git a/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/Context.java b/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/Context.java index fec6eca4fd2..b571319afe5 100644 --- a/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/Context.java +++ b/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/Context.java @@ -18,7 +18,6 @@ import com.powsybl.iidm.network.IdentifiableType; import com.powsybl.iidm.network.Network; import com.powsybl.iidm.network.Terminal; -import com.powsybl.triplestore.api.PropertyBag; import com.powsybl.triplestore.api.PropertyBags; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -59,11 +58,15 @@ public Context(CgmesModel cgmes, Config config, Network network, ReportNode repo regulatingControlMapping = new RegulatingControlMapping(this); nodeMapping = new NodeMapping(this); - ratioTapChangerTables = new HashMap<>(); - phaseTapChangerTables = new HashMap<>(); - reactiveCapabilityCurveData = new HashMap<>(); - powerTransformerRatioTapChangers = new HashMap<>(); - powerTransformerPhaseTapChangers = new HashMap<>(); + cachedGroupedTransformerEnds = new HashMap<>(); + cachedGroupedRatioTapChangers = new HashMap<>(); + cachedGroupedRatioTapChangerTablePoints = new HashMap<>(); + cachedGroupedPhaseTapChangers = new HashMap<>(); + cachedGroupedPhaseTapChangerTablePoints = new HashMap<>(); + cachedGroupedShuntCompensatorPoints = new HashMap<>(); + cachedGroupedReactiveCapabilityCurveData = new HashMap<>(); + + buildCaches(); } public CgmesModel cgmes() { @@ -138,71 +141,49 @@ public static String boundarySubstationId(String nodeId) { return nodeId + "_S"; } - public void loadReactiveCapabilityCurveData() { - PropertyBags rccdata = cgmes.reactiveCapabilityCurveData(); - if (rccdata == null) { - return; - } - rccdata.forEach(p -> { - String curveId = p.getId("ReactiveCapabilityCurve"); - reactiveCapabilityCurveData.computeIfAbsent(curveId, cid -> new PropertyBags()).add(p); - }); - } - - public PropertyBags reactiveCapabilityCurveData(String curveId) { - return reactiveCapabilityCurveData.get(curveId); + private void buildCaches() { + buildCache(cachedGroupedTransformerEnds, cgmes().transformerEnds(), CgmesNames.POWER_TRANSFORMER); + buildCache(cachedGroupedRatioTapChangers, cgmes().ratioTapChangers(), CgmesNames.POWER_TRANSFORMER); + buildCache(cachedGroupedRatioTapChangerTablePoints, cgmes().ratioTapChangerTablePoints(), CgmesNames.RATIO_TAP_CHANGER_TABLE); + buildCache(cachedGroupedPhaseTapChangers, cgmes().phaseTapChangers(), CgmesNames.POWER_TRANSFORMER); + buildCache(cachedGroupedPhaseTapChangerTablePoints, cgmes().phaseTapChangerTablePoints(), CgmesNames.PHASE_TAP_CHANGER_TABLE); + buildCache(cachedGroupedShuntCompensatorPoints, cgmes().nonlinearShuntCompensatorPoints(), "Shunt"); + buildCache(cachedGroupedReactiveCapabilityCurveData, cgmes().reactiveCapabilityCurveData(), "ReactiveCapabilityCurve"); } - public void loadRatioTapChangers() { - cgmes.ratioTapChangers().forEach(ratio -> { - String id = ratio.getId(CgmesNames.RATIO_TAP_CHANGER); - powerTransformerRatioTapChangers.put(id, ratio); + private void buildCache(Map cache, PropertyBags ps, String groupName) { + ps.forEach(p -> { + String groupId = p.getId(groupName); + cache.computeIfAbsent(groupId, b -> new PropertyBags()).add(p); }); } - public PropertyBag ratioTapChanger(String id) { - return powerTransformerRatioTapChangers.get(id); + public PropertyBags transformerEnds(String transformerId) { + return cachedGroupedTransformerEnds.getOrDefault(transformerId, new PropertyBags()); } - public void loadPhaseTapChangers() { - cgmes.phaseTapChangers().forEach(phase -> { - String id = phase.getId(CgmesNames.PHASE_TAP_CHANGER); - powerTransformerPhaseTapChangers.put(id, phase); - }); + public PropertyBags ratioTapChangers(String transformerId) { + return cachedGroupedRatioTapChangers.getOrDefault(transformerId, new PropertyBags()); } - public PropertyBag phaseTapChanger(String id) { - return powerTransformerPhaseTapChangers.get(id); + public PropertyBags ratioTapChangerTablePoints(String tableId) { + return cachedGroupedRatioTapChangerTablePoints.getOrDefault(tableId, new PropertyBags()); } - public void loadRatioTapChangerTables() { - PropertyBags rtcpoints = cgmes.ratioTapChangerTablesPoints(); - if (rtcpoints == null) { - return; - } - rtcpoints.forEach(p -> { - String tableId = p.getId("RatioTapChangerTable"); - ratioTapChangerTables.computeIfAbsent(tableId, tid -> new PropertyBags()).add(p); - }); + public PropertyBags phaseTapChangers(String transformerId) { + return cachedGroupedPhaseTapChangers.getOrDefault(transformerId, new PropertyBags()); } - public void loadPhaseTapChangerTables() { - PropertyBags ptcpoints = cgmes.phaseTapChangerTablesPoints(); - if (ptcpoints == null) { - return; - } - ptcpoints.forEach(p -> { - String tableId = p.getId("PhaseTapChangerTable"); - phaseTapChangerTables.computeIfAbsent(tableId, tid -> new PropertyBags()).add(p); - }); + public PropertyBags phaseTapChangerTablePoints(String tableId) { + return cachedGroupedPhaseTapChangerTablePoints.getOrDefault(tableId, new PropertyBags()); } - public PropertyBags ratioTapChangerTable(String tableId) { - return ratioTapChangerTables.get(tableId); + public PropertyBags nonlinearShuntCompensatorPoints(String shuntId) { + return cachedGroupedShuntCompensatorPoints.getOrDefault(shuntId, new PropertyBags()); } - public PropertyBags phaseTapChangerTable(String tableId) { - return phaseTapChangerTables.get(tableId); + public PropertyBags reactiveCapabilityCurveData(String curveId) { + return cachedGroupedReactiveCapabilityCurveData.getOrDefault(curveId, new PropertyBags()); } // Handling issues found during conversion @@ -313,11 +294,13 @@ private static void logIssue(ConversionIssueCategory category, String what, Supp private final LoadingLimitsMapping loadingLimitsMapping; private final RegulatingControlMapping regulatingControlMapping; - private final Map ratioTapChangerTables; - private final Map phaseTapChangerTables; - private final Map reactiveCapabilityCurveData; - private final Map powerTransformerRatioTapChangers; - private final Map powerTransformerPhaseTapChangers; + private final Map cachedGroupedTransformerEnds; + private final Map cachedGroupedRatioTapChangers; + private final Map cachedGroupedRatioTapChangerTablePoints; + private final Map cachedGroupedPhaseTapChangers; + private final Map cachedGroupedPhaseTapChangerTablePoints; + private final Map cachedGroupedShuntCompensatorPoints; + private final Map cachedGroupedReactiveCapabilityCurveData; private static final Logger LOG = LoggerFactory.getLogger(Context.class); } diff --git a/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/Conversion.java b/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/Conversion.java index 4ef9192b6c5..751a89d519c 100644 --- a/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/Conversion.java +++ b/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/Conversion.java @@ -472,11 +472,6 @@ private Network createNetwork() { private Context createContext(Network network, ReportNode reportNode) { Context context = new Context(cgmes, config, network, reportNode); context.dc().initialize(); - context.loadRatioTapChangers(); - context.loadPhaseTapChangers(); - context.loadRatioTapChangerTables(); - context.loadPhaseTapChangerTables(); - context.loadReactiveCapabilityCurveData(); return context; } @@ -688,21 +683,24 @@ private void convertEquivalentBranchesToLines(Context context, Set delay private void convertTransformers(Context context, Set delayedBoundaryNodes) { context.pushReportNode(CgmesReports.convertingElementTypeReport(context.getReportNode(), CgmesNames.POWER_TRANSFORMER)); - cgmes.groupedTransformerEnds().forEach((t, ends) -> { - if (LOG.isTraceEnabled()) { - LOG.trace("Transformer {}, {}-winding", t, ends.size()); - ends.forEach(e -> LOG.trace(e.tabulateLocals("TransformerEnd"))); - } - if (ends.size() == 2) { - convertTwoWindingsTransformers(context, ends, delayedBoundaryNodes); - } else if (ends.size() == 3) { - convertThreeWindingsTransformers(context, ends); - } else { - String what = "PowerTransformer " + t; - Supplier reason = () -> String.format("Has %d ends. Only 2 or 3 ends are supported", ends.size()); - context.invalid(what, reason); - } - }); + cgmes.transformers().stream() + .map(t -> context.transformerEnds(t.getId("PowerTransformer"))) + .forEach(ends -> { + String transformerId = ends.get(0).getId("PowerTransformer"); + if (LOG.isTraceEnabled()) { + LOG.trace("Transformer {}, {}-winding", transformerId, ends.size()); + ends.forEach(e -> LOG.trace(e.tabulateLocals("TransformerEnd"))); + } + if (ends.size() == 2) { + convertTwoWindingsTransformers(context, ends, delayedBoundaryNodes); + } else if (ends.size() == 3) { + convertThreeWindingsTransformers(context, ends); + } else { + String what = "PowerTransformer " + transformerId; + Supplier reason = () -> String.format("Has %d ends. Only 2 or 3 ends are supported", ends.size()); + context.invalid(what, reason); + } + }); context.popReportNode(); } diff --git a/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/NodeContainerMapping.java b/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/NodeContainerMapping.java index 4ddeaf4200f..9b41dc7c335 100644 --- a/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/NodeContainerMapping.java +++ b/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/NodeContainerMapping.java @@ -155,7 +155,9 @@ private void buildAdjacency(Map> voltageLevelAdjacency, Map< boolean fictitiousVoltageLevelForEveryNode = context.config().getCreateFictitiousVoltageLevelsForEveryNode(); context.cgmes().switches().forEach(sw -> addAdjacencyThroughSwitch(voltageLevelAdjacency, substationAdjacency, sw, fictitiousVoltageLevelForEveryNode)); - context.cgmes().groupedTransformerEnds().forEach((t, tends) -> addAdjacencyThroughTransformerEnds(substationAdjacency, tends)); + context.cgmes().transformers().stream() + .map(t -> context.transformerEnds(t.getId("PowerTransformer"))) + .forEach(tends -> addAdjacencyThroughTransformerEnds(substationAdjacency, tends)); context.cgmes().acLineSegments().forEach(ac -> addAdjacencyThroughBranch(fictitiousVoltageLevelAdjacency, ac, fictitiousVoltageLevelForEveryNode)); context.cgmes().seriesCompensators().forEach(sc -> addAdjacencyThroughBranch(fictitiousVoltageLevelAdjacency, sc, fictitiousVoltageLevelForEveryNode)); diff --git a/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/PhaseAngleClock.java b/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/PhaseAngleClock.java index bdafeaf8d0f..70f98edfa31 100644 --- a/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/PhaseAngleClock.java +++ b/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/PhaseAngleClock.java @@ -24,6 +24,9 @@ import com.powsybl.triplestore.api.PropertyBags; import com.powsybl.triplestore.api.TripleStore; +import java.util.HashMap; +import java.util.Map; + /** * @author Luma Zamarreño {@literal } * @author José Antonio Marqués {@literal } @@ -48,16 +51,21 @@ public void process(Network network, TripleStore tripleStore) { LOG.warn("PhaseAngleClock-PostProcessor: Unexpected null cgmesModel pointer"); return; } - - cgmes.groupedTransformerEnds().forEach((t, ends) -> { - if (ends.size() == 2) { - phaseAngleClockTwoWindingTransformer(ends, network); - } else if (ends.size() == 3) { - phaseAngleClockThreeWindingTransformer(ends, network); - } else { - throw new PowsyblException(String.format("Unexpected TransformerEnds: ends %d", ends.size())); - } - }); + Map groupedTransformerEnds = new HashMap<>(); + cgmes.transformerEnds() + .forEach(p -> groupedTransformerEnds + .computeIfAbsent(p.getId("PowerTransformer"), b -> new PropertyBags()) + .add(p)); + groupedTransformerEnds.values() + .forEach(ends -> { + if (ends.size() == 2) { + phaseAngleClockTwoWindingTransformer(ends, network); + } else if (ends.size() == 3) { + phaseAngleClockThreeWindingTransformer(ends, network); + } else { + throw new PowsyblException(String.format("Unexpected TransformerEnds: ends %d", ends.size())); + } + }); } private void phaseAngleClockTwoWindingTransformer(PropertyBags ends, Network network) { diff --git a/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/ShuntConversion.java b/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/ShuntConversion.java index 826bfcdbdf0..39b14cebdb1 100644 --- a/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/ShuntConversion.java +++ b/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/ShuntConversion.java @@ -61,7 +61,7 @@ public void convert() { .add(); } else if ("NonlinearShuntCompensator".equals(shuntType)) { ShuntCompensatorNonLinearModelAdder modelAdder = adder.newNonLinearModel(); - PropertyBags ss = context.cgmes().nonlinearShuntCompensatorPoints(id); + PropertyBags ss = context.nonlinearShuntCompensatorPoints(id); ss.stream() .filter(s -> s.asInt(SECTION_NUMBER) > 0) .sorted(Comparator.comparing(s -> s.asInt(SECTION_NUMBER))) diff --git a/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/hvdc/Adjacency.java b/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/hvdc/Adjacency.java index d7d60448a7b..4a58d8a67c1 100644 --- a/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/hvdc/Adjacency.java +++ b/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/hvdc/Adjacency.java @@ -15,6 +15,7 @@ import java.util.Map; import java.util.Objects; +import com.powsybl.cgmes.conversion.Context; import com.powsybl.cgmes.model.CgmesDcTerminal; import com.powsybl.cgmes.model.CgmesModel; import com.powsybl.cgmes.model.CgmesNames; @@ -36,7 +37,7 @@ enum AdjacentType { private final Map> adjacency; - Adjacency(CgmesModel cgmesModel, AcDcConverterNodes acDcConverterNodes) { + Adjacency(CgmesModel cgmesModel, Context context, AcDcConverterNodes acDcConverterNodes) { adjacency = new HashMap<>(); cgmesModel.dcLineSegments().forEach(dcls -> computeDcLineSegmentAdjacency(cgmesModel, dcls)); @@ -44,15 +45,17 @@ enum AdjacentType { .forEach((key, value) -> computeAcDcConverterAdjacency(value.acNode, value.dcNode)); - cgmesModel.groupedTransformerEnds().forEach((t, ends) -> { - if (ends.size() == 2) { - computeTwoWindingsTransformerAdjacency(cgmesModel, ends); - } else if (ends.size() == 3) { - computeThreeWindingsTransformerAdjacency(cgmesModel, ends); - } else { - throw new PowsyblException(String.format("Unexpected TransformerEnds: ends %d", ends.size())); - } - }); + cgmesModel.transformers().stream() + .map(t -> context.transformerEnds(t.getId("PowerTransformer"))) + .forEach(ends -> { + if (ends.size() == 2) { + computeTwoWindingsTransformerAdjacency(cgmesModel, ends); + } else if (ends.size() == 3) { + computeThreeWindingsTransformerAdjacency(cgmesModel, ends); + } else { + throw new PowsyblException(String.format("Unexpected TransformerEnds: ends %d", ends.size())); + } + }); } private void computeDcLineSegmentAdjacency(CgmesModel cgmesModel, PropertyBag equipment) { diff --git a/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/hvdc/CgmesDcConversion.java b/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/hvdc/CgmesDcConversion.java index db01fc7178c..5bb52f24a05 100644 --- a/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/hvdc/CgmesDcConversion.java +++ b/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/hvdc/CgmesDcConversion.java @@ -51,11 +51,11 @@ public void convert() { // Get hvdc configurations AcDcConverterNodes acDcConverterNodes = new AcDcConverterNodes(cgmesModel); - Adjacency adjacency = new Adjacency(cgmesModel, acDcConverterNodes); + Adjacency adjacency = new Adjacency(cgmesModel, context, acDcConverterNodes); if (adjacency.isEmpty()) { return; } - NodeEquipment nodeEquipment = new NodeEquipment(cgmesModel, acDcConverterNodes, adjacency); + NodeEquipment nodeEquipment = new NodeEquipment(cgmesModel, context, acDcConverterNodes, adjacency); Islands islands = new Islands(adjacency); IslandsEnds islandsEnds = new IslandsEnds(); diff --git a/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/hvdc/NodeEquipment.java b/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/hvdc/NodeEquipment.java index c0db811141b..4cea45b77d3 100644 --- a/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/hvdc/NodeEquipment.java +++ b/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/hvdc/NodeEquipment.java @@ -11,6 +11,7 @@ import java.util.*; import java.util.stream.Collectors; +import com.powsybl.cgmes.conversion.Context; import com.powsybl.cgmes.model.CgmesDcTerminal; import com.powsybl.cgmes.model.CgmesModel; import com.powsybl.cgmes.model.CgmesNames; @@ -31,7 +32,7 @@ enum EquipmentType { private final Map> nodeEquipment; - NodeEquipment(CgmesModel cgmesModel, AcDcConverterNodes acDcConverterNodes, Adjacency adjacency) { + NodeEquipment(CgmesModel cgmesModel, Context context, AcDcConverterNodes acDcConverterNodes, Adjacency adjacency) { nodeEquipment = new HashMap<>(); cgmesModel.dcLineSegments().forEach(dcls -> computeDcLineSegment(cgmesModel, adjacency, dcls)); @@ -40,13 +41,15 @@ enum EquipmentType { .forEach(value -> addEquipment(adjacency, value.id, value.acNode, value.dcNode, EquipmentType.AC_DC_CONVERTER)); - cgmesModel.groupedTransformerEnds().forEach((t, ends) -> { - if (ends.size() == 2) { - computeTwoWindingsTransformer(cgmesModel, adjacency, ends); - } else if (ends.size() == 3) { - computeThreeWindingsTransformer(cgmesModel, adjacency, ends); - } - }); + cgmesModel.transformers().stream() + .map(t -> context.transformerEnds(t.getId("PowerTransformer"))) + .forEach(ends -> { + if (ends.size() == 2) { + computeTwoWindingsTransformer(cgmesModel, adjacency, ends); + } else if (ends.size() == 3) { + computeThreeWindingsTransformer(cgmesModel, adjacency, ends); + } + }); } private void computeDcLineSegment(CgmesModel cgmesModel, Adjacency adjacency, PropertyBag equipment) { diff --git a/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/transformers/AbstractTransformerConversion.java b/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/transformers/AbstractTransformerConversion.java index 2f6a272dba5..6826bf753c7 100644 --- a/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/transformers/AbstractTransformerConversion.java +++ b/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/transformers/AbstractTransformerConversion.java @@ -9,20 +9,18 @@ package com.powsybl.cgmes.conversion.elements.transformers; import com.powsybl.cgmes.conversion.Context; -import com.powsybl.cgmes.conversion.Conversion; import com.powsybl.cgmes.conversion.RegulatingControlMappingForTransformers.CgmesRegulatingControlPhase; import com.powsybl.cgmes.conversion.RegulatingControlMappingForTransformers.CgmesRegulatingControlRatio; import com.powsybl.cgmes.conversion.elements.AbstractConductingEquipmentConversion; import com.powsybl.cgmes.extensions.CgmesTapChangers; import com.powsybl.cgmes.extensions.CgmesTapChangersAdder; -import com.powsybl.cgmes.model.CgmesNames; import com.powsybl.cgmes.model.WindingType; import com.powsybl.iidm.network.*; import com.powsybl.triplestore.api.PropertyBag; import com.powsybl.triplestore.api.PropertyBags; -import java.util.List; -import java.util.Optional; +import static com.powsybl.cgmes.conversion.Conversion.CGMES_PREFIX_ALIAS_PROPERTIES; +import static com.powsybl.cgmes.model.CgmesNames.*; /** * @author Luma Zamarreño {@literal } @@ -111,23 +109,30 @@ protected CgmesRegulatingControlPhase setContextRegulatingDataPhase(TapChanger t @Override protected void addAliasesAndProperties(Identifiable identifiable) { + // Add PowerTransformer aliases super.addAliasesAndProperties(identifiable); - for (PropertyBag p : ps) { - identifiable.addAlias(p.getId("TransformerEnd"), Conversion.CGMES_PREFIX_ALIAS_PROPERTIES + CgmesNames.TRANSFORMER_END + WindingType.endNumber(p)); + + // Add PowerTransformerEnds aliases + String alias; + String aliasType; + for (PropertyBag end : ps) { + alias = end.getId("TransformerEnd"); + aliasType = CGMES_PREFIX_ALIAS_PROPERTIES + TRANSFORMER_END + WindingType.endNumber(end); + identifiable.addAlias(alias, aliasType); } - List ptcs = context.cgmes().phaseTapChangerListForPowerTransformer(identifiable.getId()); - if (ptcs != null) { - for (int i = 0; i < ptcs.size(); i++) { - int index = i + 1; - Optional.ofNullable(ptcs.get(i)).ifPresent(ptc -> identifiable.addAlias(ptc, Conversion.CGMES_PREFIX_ALIAS_PROPERTIES + CgmesNames.PHASE_TAP_CHANGER + index, context.config().isEnsureIdAliasUnicity())); - } + + // Add RatioTapChangers aliases + for (PropertyBag rtc : context.ratioTapChangers(identifiable.getId())) { + alias = rtc.getId("RatioTapChanger"); + aliasType = CGMES_PREFIX_ALIAS_PROPERTIES + RATIO_TAP_CHANGER + WindingType.endNumber(rtc); + identifiable.addAlias(alias, aliasType, context.config().isEnsureIdAliasUnicity()); } - List rtcs = context.cgmes().ratioTapChangerListForPowerTransformer(identifiable.getId()); - if (rtcs != null) { - for (int i = 0; i < rtcs.size(); i++) { - int index = i + 1; - Optional.ofNullable(rtcs.get(i)).ifPresent(rtc -> identifiable.addAlias(rtc, Conversion.CGMES_PREFIX_ALIAS_PROPERTIES + CgmesNames.RATIO_TAP_CHANGER + index, context.config().isEnsureIdAliasUnicity())); - } + + // Add PhaseTapChangers aliases + for (PropertyBag ptc : context.phaseTapChangers(identifiable.getId())) { + alias = ptc.getId("PhaseTapChanger"); + aliasType = CGMES_PREFIX_ALIAS_PROPERTIES + PHASE_TAP_CHANGER + WindingType.endNumber(ptc); + identifiable.addAlias(alias, aliasType, context.config().isEnsureIdAliasUnicity()); } } diff --git a/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/transformers/CgmesPhaseTapChangerBuilder.java b/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/transformers/CgmesPhaseTapChangerBuilder.java index f016da66ba3..0ea1111ee49 100644 --- a/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/transformers/CgmesPhaseTapChangerBuilder.java +++ b/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/transformers/CgmesPhaseTapChangerBuilder.java @@ -70,13 +70,13 @@ protected void addSteps() { if (isLinear()) { addStepsLinear(); } else if (isTabular()) { - PropertyBags table = context.phaseTapChangerTable(tableId); - if (table == null) { + PropertyBags tablePoints = context.phaseTapChangerTablePoints(tableId); + if (tablePoints.isEmpty()) { addStepsLinear(); return; } - if (isTableValid(tableId, table)) { - addStepsFromTable(table); + if (isTableValid(tableId, tablePoints)) { + addStepsFromTable(tablePoints); } else { addStepsLinear(); } diff --git a/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/transformers/CgmesRatioTapChangerBuilder.java b/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/transformers/CgmesRatioTapChangerBuilder.java index 459ee8b82c0..84d588e82f8 100644 --- a/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/transformers/CgmesRatioTapChangerBuilder.java +++ b/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/transformers/CgmesRatioTapChangerBuilder.java @@ -40,13 +40,13 @@ protected void addRegulationData() { protected void addSteps() { String tableId = p.getId(CgmesNames.RATIO_TAP_CHANGER_TABLE); if (tableId != null) { - PropertyBags table = context.ratioTapChangerTable(tableId); - if (table == null) { + PropertyBags tablePoints = context.ratioTapChangerTablePoints(tableId); + if (tablePoints.isEmpty()) { addStepsFromLowHighIncrement(); return; } - if (isTableValid(tableId, table)) { - addStepsFromTable(table, tableId); + if (isTableValid(tableId, tablePoints)) { + addStepsFromTable(tablePoints, tableId); } else { addStepsFromLowHighIncrement(); } diff --git a/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/transformers/TapChanger.java b/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/transformers/TapChanger.java index c5bddf02320..ac52fb7ced9 100644 --- a/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/transformers/TapChanger.java +++ b/cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/elements/transformers/TapChanger.java @@ -25,14 +25,24 @@ public class TapChanger { public static TapChanger ratioTapChangerFromEnd(PropertyBag end, Context context) { Objects.requireNonNull(end); Objects.requireNonNull(context); - PropertyBag rtc = context.ratioTapChanger(end.getId(CgmesNames.RATIO_TAP_CHANGER)); + PropertyBag rtc = context + .ratioTapChangers(end.getId("PowerTransformer")) + .stream() + .filter(tc -> end.getId(CgmesNames.TRANSFORMER_END).equals(tc.getId(CgmesNames.TRANSFORMER_END))) + .findFirst() + .orElse(null); return rtc != null ? AbstractCgmesTapChangerBuilder.newRatioTapChanger(rtc, context).build() : null; } public static TapChanger phaseTapChangerFromEnd(PropertyBag end, double x, Context context) { Objects.requireNonNull(end); Objects.requireNonNull(context); - PropertyBag ptc = context.phaseTapChanger(end.getId(CgmesNames.PHASE_TAP_CHANGER)); + PropertyBag ptc = context + .phaseTapChangers(end.getId("PowerTransformer")) + .stream() + .filter(tc -> end.getId(CgmesNames.TRANSFORMER_END).equals(tc.getId(CgmesNames.TRANSFORMER_END))) + .findFirst() + .orElse(null); return ptc != null ? AbstractCgmesTapChangerBuilder.newPhaseTapChanger(ptc, x, context).build() : null; } diff --git a/cgmes/cgmes-conversion/src/test/java/com/powsybl/cgmes/conversion/test/FakeTapChangerConversionTest.java b/cgmes/cgmes-conversion/src/test/java/com/powsybl/cgmes/conversion/test/FakeTapChangerConversionTest.java deleted file mode 100644 index c8b0838fbc2..00000000000 --- a/cgmes/cgmes-conversion/src/test/java/com/powsybl/cgmes/conversion/test/FakeTapChangerConversionTest.java +++ /dev/null @@ -1,28 +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.cgmes.conversion.test; - -import com.powsybl.cgmes.model.CgmesModel; -import com.powsybl.cgmes.model.InMemoryCgmesModel; -import org.junit.jupiter.api.Test; - -import java.util.Collections; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -/** - * @author Luma Zamarreño {@literal } - */ -class FakeTapChangerConversionTest { - @Test - void fakeTapChangersEmpty() { - CgmesModel cgmes = new InMemoryCgmesModel(); - assertEquals(Collections.emptyList(), cgmes.ratioTapChangerListForPowerTransformer("anyTransformer")); - assertEquals(Collections.emptyList(), cgmes.phaseTapChangerListForPowerTransformer("anyTransformer")); - } -} diff --git a/cgmes/cgmes-conversion/src/test/resources/functional-logs/microGridBaseCaseBE-target-deadband.txt b/cgmes/cgmes-conversion/src/test/resources/functional-logs/microGridBaseCaseBE-target-deadband.txt index d81410a9eda..cbe6753dbf4 100644 --- a/cgmes/cgmes-conversion/src/test/resources/functional-logs/microGridBaseCaseBE-target-deadband.txt +++ b/cgmes/cgmes-conversion/src/test/resources/functional-logs/microGridBaseCaseBE-target-deadband.txt @@ -33,9 +33,9 @@ Converting SvInjection. Converting ControlArea. + Converting RegulatingControl. + Equipment 6ebbef67-3061-4236-a6fd-6ccc4595f6c3 has a regulating control with bad target deadband: -35.0. Equipment 955d9cd0-4a10-4031-b008-60c0dc340a07 has a regulating control with bad target value for voltage: 0.0. Equipment 955d9cd0-4a10-4031-b008-60c0dc340a07 has a regulating control with bad target deadband: -0.5. - Equipment 6ebbef67-3061-4236-a6fd-6ccc4595f6c3 has a regulating control with bad target deadband: -35.0. Equipment fe25f43a-7341-446e-a71a-8ab7119ba806 has a regulating control with bad target value for voltage: 0.0. Fixing issues with dangling lines. Setting voltages and angles. diff --git a/cgmes/cgmes-model/src/main/java/com/powsybl/cgmes/model/AbstractCgmesModel.java b/cgmes/cgmes-model/src/main/java/com/powsybl/cgmes/model/AbstractCgmesModel.java index bc0063c1ddf..a7a00605fe6 100644 --- a/cgmes/cgmes-model/src/main/java/com/powsybl/cgmes/model/AbstractCgmesModel.java +++ b/cgmes/cgmes-model/src/main/java/com/powsybl/cgmes/model/AbstractCgmesModel.java @@ -35,22 +35,6 @@ public Properties getProperties() { return this.properties; } - @Override - public PropertyBags nonlinearShuntCompensatorPoints(String shuntId) { - if (cachedGroupedShuntCompensatorPoints == null) { - cachedGroupedShuntCompensatorPoints = computeGroupedShuntCompensatorPoints(); - } - return cachedGroupedShuntCompensatorPoints.getOrDefault(shuntId, new PropertyBags()); - } - - @Override - public Map groupedTransformerEnds() { - if (cachedGroupedTransformerEnds == null) { - cachedGroupedTransformerEnds = computeGroupedTransformerEnds(); - } - return cachedGroupedTransformerEnds; - } - @Override public Collection computedTerminals() { if (cachedTerminals == null) { @@ -75,16 +59,6 @@ public CgmesDcTerminal dcTerminal(String dcTerminalId) { return cachedDcTerminals.get(dcTerminalId); } - @Override - public List ratioTapChangerListForPowerTransformer(String powerTransformerId) { - return powerTransformerRatioTapChanger.get(powerTransformerId) == null ? null : Arrays.asList(powerTransformerRatioTapChanger.get(powerTransformerId)); - } - - @Override - public List phaseTapChangerListForPowerTransformer(String powerTransformerId) { - return powerTransformerPhaseTapChanger.get(powerTransformerId) == null ? null : Arrays.asList(powerTransformerPhaseTapChanger.get(powerTransformerId)); - } - @Override public String substation(CgmesTerminal t, boolean nodeBreaker) { CgmesContainer c = container(t, nodeBreaker); @@ -168,43 +142,6 @@ private CgmesContainer container(CgmesTerminal t, boolean nodeBreaker) { return (containerId == null) ? null : container(containerId); } - private Map computeGroupedShuntCompensatorPoints() { - Map groupedShuntCompensatorPoints = new HashMap<>(); - nonlinearShuntCompensatorPoints() - .forEach(point -> { - String shuntCompensator = point.getId("Shunt"); - groupedShuntCompensatorPoints.computeIfAbsent(shuntCompensator, bag -> new PropertyBags()) - .add(point); - }); - return groupedShuntCompensatorPoints; - } - - private Map computeGroupedTransformerEnds() { - // Alternative implementation: - // instead of sorting after building each list, - // use a sorted collection when inserting - String endNumber = "endNumber"; - Map gends = new HashMap<>(); - powerTransformerRatioTapChanger = new HashMap<>(); - powerTransformerPhaseTapChanger = new HashMap<>(); - transformerEnds() - .forEach(end -> { - String id = end.getId("PowerTransformer"); - PropertyBags ends = gends.computeIfAbsent(id, x -> new PropertyBags()); - ends.add(end); - if (end.getId("PhaseTapChanger") != null) { - powerTransformerPhaseTapChanger.computeIfAbsent(id, s -> new String[3]); - powerTransformerPhaseTapChanger.get(id)[end.asInt(endNumber, 1) - 1] = end.getId("PhaseTapChanger"); - } - if (end.getId("RatioTapChanger") != null) { - powerTransformerRatioTapChanger.computeIfAbsent(id, s -> new String[3]); - powerTransformerRatioTapChanger.get(id)[end.asInt(endNumber, 1) - 1] = end.getId("RatioTapChanger"); - } - }); - gends.values().forEach(tends -> tends.sort(Comparator.comparing(WindingType::endNumber))); - return gends; - } - protected void cacheNodes() { if (!cachedNodes) { cachedConnectivityNodes = connectivityNodes(); @@ -300,10 +237,6 @@ public void read(ReadOnlyDataSource ds, ReportNode reportNode) { } protected void invalidateCaches() { - cachedGroupedShuntCompensatorPoints = null; - cachedGroupedTransformerEnds = null; - powerTransformerRatioTapChanger = null; - powerTransformerPhaseTapChanger = null; cachedTerminals = null; cachedContainers = null; cachedBaseVoltages = null; @@ -318,8 +251,6 @@ protected void invalidateCaches() { private String baseName; // Caches - private Map cachedGroupedShuntCompensatorPoints; - private Map cachedGroupedTransformerEnds; private Map cachedTerminals; private Map cachedContainers; private Map cachedBaseVoltages; @@ -328,8 +259,6 @@ protected void invalidateCaches() { protected PropertyBags cachedTopologicalNodes; private Map cachedNodesById; // equipmentId, sequenceNumber, terminalId - private Map powerTransformerRatioTapChanger; - private Map powerTransformerPhaseTapChanger; private Map cachedDcTerminals; private static final Logger LOG = LoggerFactory.getLogger(AbstractCgmesModel.class); diff --git a/cgmes/cgmes-model/src/main/java/com/powsybl/cgmes/model/CgmesModel.java b/cgmes/cgmes-model/src/main/java/com/powsybl/cgmes/model/CgmesModel.java index 0f1bb6928b4..c3f38d2e44b 100644 --- a/cgmes/cgmes-model/src/main/java/com/powsybl/cgmes/model/CgmesModel.java +++ b/cgmes/cgmes-model/src/main/java/com/powsybl/cgmes/model/CgmesModel.java @@ -92,13 +92,14 @@ default PropertyBags fullModels() { PropertyBags transformerEnds(); - // Transformer ends grouped by transformer - Map groupedTransformerEnds(); - PropertyBags ratioTapChangers(); + PropertyBags ratioTapChangerTablePoints(); + PropertyBags phaseTapChangers(); + PropertyBags phaseTapChangerTablePoints(); + PropertyBags regulatingControls(); PropertyBags energyConsumers(); @@ -111,17 +112,11 @@ default PropertyBags fullModels() { /** * Query all NonlinearShuntCompensatorPoint in the CgmesModel. + * * @return A {@link PropertyBags} with the shunt compensators points properties. */ PropertyBags nonlinearShuntCompensatorPoints(); - /** - * Query the NonlinearShuntCompensatorPoint associated to the given NonlinearShuntCompensator. - * @param shuntId The id of the NonlinearShuntCompensator. - * @return A {@link PropertyBags} with the given shunt compensator's points properties. - */ - PropertyBags nonlinearShuntCompensatorPoints(String shuntId); - PropertyBags staticVarCompensators(); /** @@ -157,14 +152,6 @@ default PropertyBags synchronousMachinesAll() { PropertyBags reactiveCapabilityCurveData(); - PropertyBags ratioTapChangerTablesPoints(); - - PropertyBags phaseTapChangerTablesPoints(); - - PropertyBags ratioTapChangerTable(String tableId); - - PropertyBags phaseTapChangerTable(String tableId); - PropertyBags controlAreas(); PropertyBags acDcConverters(); @@ -225,10 +212,6 @@ default void write(DataSource ds, CgmesSubset subset) { // Helper mappings - List ratioTapChangerListForPowerTransformer(String powerTransformerId); - - List phaseTapChangerListForPowerTransformer(String powerTransformerId); - /** * Obtain the substation of a given terminal. * diff --git a/cgmes/cgmes-model/src/main/java/com/powsybl/cgmes/model/CgmesModelFactory.java b/cgmes/cgmes-model/src/main/java/com/powsybl/cgmes/model/CgmesModelFactory.java index 245aed96f37..f4c8f2bbd2d 100644 --- a/cgmes/cgmes-model/src/main/java/com/powsybl/cgmes/model/CgmesModelFactory.java +++ b/cgmes/cgmes-model/src/main/java/com/powsybl/cgmes/model/CgmesModelFactory.java @@ -100,15 +100,13 @@ public static CgmesModel copy(CgmesModel cgmes) { private static void buildCaches(CgmesModel cgmes) { // TODO This is rebuilding only some caches boolean isNodeBreaker = cgmes.isNodeBreaker(); - for (PropertyBags tends : cgmes.groupedTransformerEnds().values()) { - for (PropertyBag end : tends) { - CgmesTerminal t = cgmes.terminal(end.getId(CgmesNames.TERMINAL)); - cgmes.substation(t, isNodeBreaker); - if (isNodeBreaker) { - t.connectivityNode(); - } else { - t.topologicalNode(); - } + for (PropertyBag end : cgmes.transformerEnds()) { + CgmesTerminal t = cgmes.terminal(end.getId(CgmesNames.TERMINAL)); + cgmes.substation(t, isNodeBreaker); + if (isNodeBreaker) { + t.connectivityNode(); + } else { + t.topologicalNode(); } } } diff --git a/cgmes/cgmes-model/src/main/java/com/powsybl/cgmes/model/InMemoryCgmesModel.java b/cgmes/cgmes-model/src/main/java/com/powsybl/cgmes/model/InMemoryCgmesModel.java index 17f9d4844ec..fc2760ec879 100644 --- a/cgmes/cgmes-model/src/main/java/com/powsybl/cgmes/model/InMemoryCgmesModel.java +++ b/cgmes/cgmes-model/src/main/java/com/powsybl/cgmes/model/InMemoryCgmesModel.java @@ -402,14 +402,14 @@ public PropertyBags transformerEnds() { } @Override - public Map groupedTransformerEnds() { - // FakeCgmesModeldoes not provide grouped transformer ends - return Collections.emptyMap(); + public PropertyBags ratioTapChangers() { + return ratioTapChangers; } @Override - public PropertyBags ratioTapChangers() { - return ratioTapChangers; + public PropertyBags ratioTapChangerTablePoints() { + // FakeCgmesModel does not implement ratio tap changer tables + return new PropertyBags(); } @Override @@ -417,6 +417,12 @@ public PropertyBags phaseTapChangers() { return phaseTapChangers; } + @Override + public PropertyBags phaseTapChangerTablePoints() { + // FakeCgmesModel does not implement phase tap changer tables + return new PropertyBags(); + } + @Override public PropertyBags regulatingControls() { return regulatingControls; @@ -442,12 +448,6 @@ public PropertyBags nonlinearShuntCompensatorPoints() { return shuntCompensatorPoints; } - @Override - public PropertyBags nonlinearShuntCompensatorPoints(String shuntId) { - // FakeCgmesModel does not provide grouped shunt compensator points - return new PropertyBags(); - } - @Override public PropertyBags equivalentShunts() { return equivalentShunts; @@ -494,40 +494,6 @@ public PropertyBags reactiveCapabilityCurveData() { return new PropertyBags(); } - @Override - public PropertyBags ratioTapChangerTablesPoints() { - // FakeCgmesModel does not implement ratio tap changer tables - return new PropertyBags(); - } - - @Override - public PropertyBags phaseTapChangerTablesPoints() { - // FakeCgmesModel does not implement phase tap changer tables - return new PropertyBags(); - } - - @Override - public PropertyBags ratioTapChangerTable(String tableId) { - // FakeCgmesModel does not implement ratio tap changer tables - return new PropertyBags(); - } - - @Override - public PropertyBags phaseTapChangerTable(String tableId) { - // FakeCgmesModel does not implement phase tap changer tables - return new PropertyBags(); - } - - @Override - public List ratioTapChangerListForPowerTransformer(String powerTransformerId) { - return Collections.emptyList(); - } - - @Override - public List phaseTapChangerListForPowerTransformer(String powerTransformerId) { - return Collections.emptyList(); - } - @Override public PropertyBags acDcConverters() { return acDcConverters; diff --git a/cgmes/cgmes-model/src/main/java/com/powsybl/cgmes/model/triplestore/CgmesModelTripleStore.java b/cgmes/cgmes-model/src/main/java/com/powsybl/cgmes/model/triplestore/CgmesModelTripleStore.java index 7915a17dfe8..6691196d6e4 100644 --- a/cgmes/cgmes-model/src/main/java/com/powsybl/cgmes/model/triplestore/CgmesModelTripleStore.java +++ b/cgmes/cgmes-model/src/main/java/com/powsybl/cgmes/model/triplestore/CgmesModelTripleStore.java @@ -467,11 +467,21 @@ public PropertyBags ratioTapChangers() { return namedQuery("ratioTapChangers"); } + @Override + public PropertyBags ratioTapChangerTablePoints() { + return namedQuery("ratioTapChangerTablePoints"); + } + @Override public PropertyBags phaseTapChangers() { return namedQuery("phaseTapChangers"); } + @Override + public PropertyBags phaseTapChangerTablePoints() { + return namedQuery("phaseTapChangerTablePoints"); + } + @Override public PropertyBags regulatingControls() { return namedQuery("regulatingControls"); @@ -542,28 +552,6 @@ public PropertyBags reactiveCapabilityCurveData() { return namedQuery("reactiveCapabilityCurveData"); } - @Override - public PropertyBags ratioTapChangerTablesPoints() { - return namedQuery("ratioTapChangerTablesPoints"); - } - - @Override - public PropertyBags phaseTapChangerTablesPoints() { - return namedQuery("phaseTapChangerTablesPoints"); - } - - @Override - public PropertyBags ratioTapChangerTable(String tableId) { - Objects.requireNonNull(tableId); - return namedQuery("ratioTapChangerTable", tableId); - } - - @Override - public PropertyBags phaseTapChangerTable(String tableId) { - Objects.requireNonNull(tableId); - return namedQuery("phaseTapChangerTable", tableId); - } - @Override public PropertyBags controlAreas() { return namedQuery("controlAreas"); diff --git a/cgmes/cgmes-model/src/main/resources/CIM14.sparql b/cgmes/cgmes-model/src/main/resources/CIM14.sparql index 44ee184a271..6a215a9a9d6 100644 --- a/cgmes/cgmes-model/src/main/resources/CIM14.sparql +++ b/cgmes/cgmes-model/src/main/resources/CIM14.sparql @@ -226,11 +226,9 @@ WHERE { cim:TransformerWinding.x ?x ; cim:TransformerWinding.ratedU ?ratedU . ?Terminal cim:Terminal.ConductingEquipment ?TransformerWinding . - OPTIONAL { ?RatioTapChanger cim:RatioTapChanger.TransformerWinding ?TransformerWinding } - OPTIONAL { ?PhaseTapChanger cim:PhaseTapChanger.TransformerWinding ?TransformerWinding } }} BIND ( ?TransformerWinding AS ?TransformerEnd ) -} +} ORDER BY ?PowerTransformer ?windingType # query: ratioTapChangers SELECT * @@ -244,6 +242,10 @@ WHERE { cim:TapChanger.neutralU ?neutralU ; cim:TapChanger.stepVoltageIncrement ?stepVoltageIncrement ; cim:RatioTapChanger.TransformerWinding ?TransformerWinding . + ?TransformerWinding + a cim:TransformerWinding ; + cim:TransformerWinding.windingType ?windingType ; + cim:TransformerWinding.MemberOf_PowerTransformer ?PowerTransformer . ?Terminal cim:Terminal.ConductingEquipment ?TransformerWinding . OPTIONAL { ?RatioTapChanger cim:TapChanger.RegulatingControl ?TapChangerControl } }} @@ -268,7 +270,11 @@ WHERE { cim:TapChanger.neutralU ?neutralU ; cim:PhaseTapChanger.phaseTapChangerType ?phaseTapChangerType ; cim:PhaseTapChanger.TransformerWinding ?TransformerWinding . - ?TransformerWinding cim:TransformerWinding.ratedU ?transformerWindingRatedU . + ?TransformerWinding + a cim:TransformerWinding ; + cim:TransformerWinding.ratedU ?transformerWindingRatedU ; + cim:TransformerWinding.windingType ?windingType ; + cim:TransformerWinding.MemberOf_PowerTransformer ?PowerTransformer . ?Terminal cim:Terminal.ConductingEquipment ?TransformerWinding . OPTIONAL { ?PhaseTapChanger cim:PhaseTapChanger.voltageStepIncrementOutOfPhase ?voltageStepIncrementOutOfPhase } OPTIONAL { ?PhaseTapChanger cim:TapChanger.stepVoltageIncrement ?voltageStepIncrement } diff --git a/cgmes/cgmes-model/src/main/resources/CIM16.sparql b/cgmes/cgmes-model/src/main/resources/CIM16.sparql index c137be21da9..ac370cc162a 100644 --- a/cgmes/cgmes-model/src/main/resources/CIM16.sparql +++ b/cgmes/cgmes-model/src/main/resources/CIM16.sparql @@ -559,10 +559,8 @@ WHERE { OPTIONAL { ?TransformerEnd cim:PowerTransformerEnd.phaseAngleClock ?phaseAngleClock } OPTIONAL { ?TransformerEnd cim:PowerTransformerEnd.g ?g } OPTIONAL { ?TransformerEnd cim:PowerTransformerEnd.ratedS ?ratedS } - OPTIONAL { ?RatioTapChanger cim:RatioTapChanger.TransformerEnd ?TransformerEnd } - OPTIONAL { ?PhaseTapChanger cim:PhaseTapChanger.TransformerEnd ?TransformerEnd } }} -} +} ORDER BY ?PowerTransformer ?endNumber # query: ratioTapChangers SELECT * @@ -579,6 +577,10 @@ WHERE { cim:RatioTapChanger.stepVoltageIncrement ?stepVoltageIncrement ; cim:TapChanger.ltcFlag ?ltcFlag ; cim:RatioTapChanger.TransformerEnd ?TransformerEnd . + ?TransformerEnd + a cim:PowerTransformerEnd ; + cim:TransformerEnd.endNumber ?endNumber ; + cim:PowerTransformerEnd.PowerTransformer ?PowerTransformer . OPTIONAL { ?RatioTapChanger cim:TapChanger.TapChangerControl ?TapChangerControl . OPTIONAL { @@ -602,22 +604,7 @@ OPTIONAL { GRAPH ?graphSV { }} } -# query: ratioTapChangerTable -SELECT * -WHERE { - ?RatioTapChangerTablePoint - a cim:RatioTapChangerTablePoint ; - cim:RatioTapChangerTablePoint.RatioTapChangerTable ?Table ; - cim:TapChangerTablePoint.step ?step . - FILTER regex(str(?Table), "{0}") - OPTIONAL { ?RatioTapChangerTablePoint cim:TapChangerTablePoint.ratio ?ratio } - OPTIONAL { ?RatioTapChangerTablePoint cim:TapChangerTablePoint.r ?r } - OPTIONAL { ?RatioTapChangerTablePoint cim:TapChangerTablePoint.x ?x } - OPTIONAL { ?RatioTapChangerTablePoint cim:TapChangerTablePoint.g ?g } - OPTIONAL { ?RatioTapChangerTablePoint cim:TapChangerTablePoint.b ?b } -} - -# query: ratioTapChangerTablesPoints +# query: ratioTapChangerTablePoints SELECT * WHERE { ?RatioTapChangerTablePoint @@ -647,6 +634,8 @@ WHERE { cim:PhaseTapChanger.TransformerEnd ?TransformerEnd . ?TransformerEnd a cim:PowerTransformerEnd ; + cim:TransformerEnd.endNumber ?endNumber ; + cim:PowerTransformerEnd.PowerTransformer ?PowerTransformer ; cim:PowerTransformerEnd.ratedU ?transformerWindingRatedU . OPTIONAL { ?PhaseTapChanger @@ -686,23 +675,7 @@ OPTIONAL { GRAPH ?graphSV { }} } -# query: phaseTapChangerTable -SELECT * -WHERE { - ?PhaseTapChangerTablePoint - a cim:PhaseTapChangerTablePoint ; - cim:PhaseTapChangerTablePoint.PhaseTapChangerTable ?Table ; - cim:PhaseTapChangerTablePoint.angle ?angle ; - cim:TapChangerTablePoint.step ?step . - FILTER regex(str(?Table), "{0}") - OPTIONAL { ?PhaseTapChangerTablePoint cim:TapChangerTablePoint.ratio ?ratio } - OPTIONAL { ?PhaseTapChangerTablePoint cim:TapChangerTablePoint.r ?r } - OPTIONAL { ?PhaseTapChangerTablePoint cim:TapChangerTablePoint.x ?x } - OPTIONAL { ?PhaseTapChangerTablePoint cim:TapChangerTablePoint.g ?g } - OPTIONAL { ?PhaseTapChangerTablePoint cim:TapChangerTablePoint.b ?b } -} - -# query: phaseTapChangerTablesPoints +# query: phaseTapChangerTablePoints SELECT * WHERE { ?PhaseTapChangerTablePoint diff --git a/matpower/matpower-converter/src/test/resources/be.json b/matpower/matpower-converter/src/test/resources/be.json index 48277fefbe3..5c12e76539b 100644 --- a/matpower/matpower-converter/src/test/resources/be.json +++ b/matpower/matpower-converter/src/test/resources/be.json @@ -257,15 +257,15 @@ "angMin" : 0.0, "angMax" : 0.0 }, { - "from" : 2, - "to" : 1, - "r" : 8.192122993395951E-4, - "x" : 0.04571631170550064, - "b" : -0.010613320515218202, - "rateA" : 143.891, + "from" : 6, + "to" : 2, + "r" : 0.0016923075000000005, + "x" : 0.009074315000000001, + "b" : 0.0, + "rateA" : 356.516, "rateB" : 0.0, - "rateC" : 154.891, - "ratio" : 1.0277920081967213, + "rateC" : 364.116, + "ratio" : 1.0526315789473684, "phaseShiftAngle" : 0.0, "status" : 1, "angMin" : 0.0, @@ -285,15 +285,15 @@ "angMin" : 0.0, "angMax" : 0.0 }, { - "from" : 6, - "to" : 2, - "r" : 0.0016923075000000005, - "x" : 0.009074315000000001, - "b" : 0.0, - "rateA" : 356.516, + "from" : 2, + "to" : 1, + "r" : 8.192122993395951E-4, + "x" : 0.04571631170550064, + "b" : -0.010613320515218202, + "rateA" : 143.891, "rateB" : 0.0, - "rateC" : 364.116, - "ratio" : 1.0526315789473684, + "rateC" : 154.891, + "ratio" : 1.0277920081967213, "phaseShiftAngle" : 0.0, "status" : 1, "angMin" : 0.0,