Skip to content

Commit

Permalink
Get tapChangers by transfomerId instead of all in a Map
Browse files Browse the repository at this point in the history
Signed-off-by: Romain Courtier <[email protected]>
  • Loading branch information
rcourtier committed Dec 2, 2024
1 parent 678c468 commit 03a52bd
Show file tree
Hide file tree
Showing 12 changed files with 112 additions and 104 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -437,7 +437,7 @@ public static InMemoryCgmesModel expectedMicroGridBaseCaseBE() {
.ratioTapChangers("83cc66dd-8d93-4a2c-8103-f1f5a9cf7e2e",
"955d9cd0-4a10-4031-b008-60c0dc340a07",
"fe25f43a-7341-446e-a71a-8ab7119ba806")
.phaseTapChangers("6ebbef67-3061-4236-a6fd-6ccc4595f6c3")
.phaseTapChangers(new String[]{"6ebbef67-3061-4236-a6fd-6ccc4595f6c3"})
.energyConsumers("1c6beed6-1acf-42e7-ba55-0cc9f04bddd8",
"b1480a00-b427-4001-a26c-51954d2bb7e9",
"cb459405-cc14-4215-a45c-416789205904")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,11 @@
import com.powsybl.cgmes.conversion.elements.hvdc.DcMapping;
import com.powsybl.cgmes.conversion.naming.NamingStrategy;
import com.powsybl.cgmes.model.CgmesModel;
import com.powsybl.cgmes.model.CgmesNames;
import com.powsybl.cgmes.model.PowerFlow;
import com.powsybl.commons.report.ReportNode;
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;
Expand Down Expand Up @@ -62,8 +60,6 @@ public Context(CgmesModel cgmes, Config config, Network network, ReportNode repo
ratioTapChangerTables = new HashMap<>();
phaseTapChangerTables = new HashMap<>();
reactiveCapabilityCurveData = new HashMap<>();
powerTransformerRatioTapChangers = new HashMap<>();
powerTransformerPhaseTapChangers = new HashMap<>();
}

public CgmesModel cgmes() {
Expand Down Expand Up @@ -153,28 +149,6 @@ public PropertyBags reactiveCapabilityCurveData(String curveId) {
return reactiveCapabilityCurveData.get(curveId);
}

public void loadRatioTapChangers() {
cgmes.ratioTapChangers().forEach(ratio -> {
String id = ratio.getId(CgmesNames.RATIO_TAP_CHANGER);
powerTransformerRatioTapChangers.put(id, ratio);
});
}

public PropertyBag ratioTapChanger(String id) {
return powerTransformerRatioTapChangers.get(id);
}

public void loadPhaseTapChangers() {
cgmes.phaseTapChangers().forEach(phase -> {
String id = phase.getId(CgmesNames.PHASE_TAP_CHANGER);
powerTransformerPhaseTapChangers.put(id, phase);
});
}

public PropertyBag phaseTapChanger(String id) {
return powerTransformerPhaseTapChangers.get(id);
}

public void loadRatioTapChangerTables() {
PropertyBags rtcpoints = cgmes.ratioTapChangerTablesPoints();
if (rtcpoints == null) {
Expand Down Expand Up @@ -316,8 +290,6 @@ private static void logIssue(ConversionIssueCategory category, String what, Supp
private final Map<String, PropertyBags> ratioTapChangerTables;
private final Map<String, PropertyBags> phaseTapChangerTables;
private final Map<String, PropertyBags> reactiveCapabilityCurveData;
private final Map<String, PropertyBag> powerTransformerRatioTapChangers;
private final Map<String, PropertyBag> powerTransformerPhaseTapChangers;

private static final Logger LOG = LoggerFactory.getLogger(Context.class);
}
Original file line number Diff line number Diff line change
Expand Up @@ -472,8 +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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 <zamarrenolm at aia.es>}
Expand Down Expand Up @@ -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<String> 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.cgmes().ratioTapChangers(identifiable.getId())) {
alias = rtc.getId("RatioTapChanger");
aliasType = CGMES_PREFIX_ALIAS_PROPERTIES + RATIO_TAP_CHANGER + WindingType.endNumber(rtc);
identifiable.addAlias(alias, aliasType);
}
List<String> 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.cgmes().phaseTapChangers(identifiable.getId())) {
alias = ptc.getId("PhaseTapChanger");
aliasType = CGMES_PREFIX_ALIAS_PROPERTIES + PHASE_TAP_CHANGER + WindingType.endNumber(ptc);
identifiable.addAlias(alias, aliasType);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.cgmes()
.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.cgmes()
.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;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,9 @@

import com.powsybl.cgmes.model.CgmesModel;
import com.powsybl.cgmes.model.InMemoryCgmesModel;
import com.powsybl.triplestore.api.PropertyBags;
import org.junit.jupiter.api.Test;

import java.util.Collections;

import static org.junit.jupiter.api.Assertions.assertEquals;

/**
Expand All @@ -22,7 +21,7 @@ class FakeTapChangerConversionTest {
@Test
void fakeTapChangersEmpty() {
CgmesModel cgmes = new InMemoryCgmesModel();
assertEquals(Collections.emptyList(), cgmes.ratioTapChangerListForPowerTransformer("anyTransformer"));
assertEquals(Collections.emptyList(), cgmes.phaseTapChangerListForPowerTransformer("anyTransformer"));
assertEquals(new PropertyBags(), cgmes.ratioTapChangers("Fake transformer Id"));
assertEquals(new PropertyBags(), cgmes.phaseTapChangers("Fake transformer Id"));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ private static CgmesModel expectedM7Buses() {
"_FVALDI11-FTDPRA11-2_AC")
.transformers("_FP.AND11-FTDPRA11-1_PT")
.transformerEnds("_FP.AND11-FTDPRA11-1_TW_EX", "_FP.AND11-FTDPRA11-1_TW_OR")
.phaseTapChangers("_FP.AND11-FTDPRA11-1_PTC_OR")
.phaseTapChangers(new String[] {"_FP.AND11-FTDPRA11-1_PTC_OR"})
.energyConsumers("_FP.ANC12_EC", "_FS.BIC11_EC", "_FTDPRC11_EC", "_FTILLC51_EC")
.synchronousMachinesGenerators("_FSSV.T11_SM", "_FVALDT11_SM", "_FVERGT11_SM");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,22 @@ public PropertyBags transformerEnds(String transformerId) {
return cachedGroupedTransformerEnds.getOrDefault(transformerId, new PropertyBags());
}

@Override
public PropertyBags ratioTapChangers(String transformerId) {
if (cachedGroupedRatioTapChangers == null) {
cachedGroupedRatioTapChangers = computeGroupedRatioTapChangers();
}
return cachedGroupedRatioTapChangers.getOrDefault(transformerId, new PropertyBags());
}

@Override
public PropertyBags phaseTapChangers(String transformerId) {
if (cachedGroupedPhaseTapChangers == null) {
cachedGroupedPhaseTapChangers = computeGroupedPhaseTapChangers();
}
return cachedGroupedPhaseTapChangers.getOrDefault(transformerId, new PropertyBags());
}

@Override
public Collection<CgmesTerminal> computedTerminals() {
if (cachedTerminals == null) {
Expand All @@ -75,16 +91,6 @@ public CgmesDcTerminal dcTerminal(String dcTerminalId) {
return cachedDcTerminals.get(dcTerminalId);
}

@Override
public List<String> ratioTapChangerListForPowerTransformer(String powerTransformerId) {
return powerTransformerRatioTapChanger.get(powerTransformerId) == null ? null : Arrays.asList(powerTransformerRatioTapChanger.get(powerTransformerId));
}

@Override
public List<String> 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);
Expand Down Expand Up @@ -180,30 +186,38 @@ private Map<String, PropertyBags> computeGroupedShuntCompensatorPoints() {
}

private Map<String, PropertyBags> computeGroupedTransformerEnds() {
// Alternative implementation:
// instead of sorting after building each list,
// use a sorted collection when inserting
String endNumber = "endNumber";
Map<String, PropertyBags> groupedTransformerEnds = new HashMap<>();
powerTransformerRatioTapChanger = new HashMap<>();
powerTransformerPhaseTapChanger = new HashMap<>();
transformerEnds()
.forEach(end -> {
String transformerId = end.getId("PowerTransformer");
String transformerId = end.getId(CgmesNames.POWER_TRANSFORMER);
groupedTransformerEnds.computeIfAbsent(transformerId, x -> new PropertyBags())
.add(end);
if (end.getId("PhaseTapChanger") != null) {
powerTransformerPhaseTapChanger.computeIfAbsent(transformerId, s -> new String[3]);
powerTransformerPhaseTapChanger.get(transformerId)[end.asInt(endNumber, 1) - 1] = end.getId("PhaseTapChanger");
}
if (end.getId("RatioTapChanger") != null) {
powerTransformerRatioTapChanger.computeIfAbsent(transformerId, s -> new String[3]);
powerTransformerRatioTapChanger.get(transformerId)[end.asInt(endNumber, 1) - 1] = end.getId("RatioTapChanger");
}
});
return groupedTransformerEnds;
}

private Map<String, PropertyBags> computeGroupedRatioTapChangers() {
Map<String, PropertyBags> groupedRatioTapChangers = new HashMap<>();
ratioTapChangers()
.forEach(rtc -> {
String transformerId = rtc.getId(CgmesNames.POWER_TRANSFORMER);
groupedRatioTapChangers.computeIfAbsent(transformerId, bag -> new PropertyBags())
.add(rtc);
});
return groupedRatioTapChangers;
}

private Map<String, PropertyBags> computeGroupedPhaseTapChangers() {
Map<String, PropertyBags> groupedPhaseTapChangers = new HashMap<>();
phaseTapChangers()
.forEach(ptc -> {
String transformerId = ptc.getId(CgmesNames.POWER_TRANSFORMER);
groupedPhaseTapChangers.computeIfAbsent(transformerId, bag -> new PropertyBags())
.add(ptc);
});
return groupedPhaseTapChangers;
}

protected void cacheNodes() {
if (!cachedNodes) {
cachedConnectivityNodes = connectivityNodes();
Expand Down Expand Up @@ -301,8 +315,8 @@ public void read(ReadOnlyDataSource ds, ReportNode reportNode) {
protected void invalidateCaches() {
cachedGroupedShuntCompensatorPoints = null;
cachedGroupedTransformerEnds = null;
powerTransformerRatioTapChanger = null;
powerTransformerPhaseTapChanger = null;
cachedGroupedRatioTapChangers = null;
cachedGroupedPhaseTapChangers = null;
cachedTerminals = null;
cachedContainers = null;
cachedBaseVoltages = null;
Expand All @@ -319,6 +333,8 @@ protected void invalidateCaches() {
// Caches
private Map<String, PropertyBags> cachedGroupedShuntCompensatorPoints;
private Map<String, PropertyBags> cachedGroupedTransformerEnds;
private Map<String, PropertyBags> cachedGroupedRatioTapChangers;
private Map<String, PropertyBags> cachedGroupedPhaseTapChangers;
private Map<String, CgmesTerminal> cachedTerminals;
private Map<String, CgmesContainer> cachedContainers;
private Map<String, Double> cachedBaseVoltages;
Expand All @@ -327,8 +343,6 @@ protected void invalidateCaches() {
protected PropertyBags cachedTopologicalNodes;
private Map<String, PropertyBag> cachedNodesById;
// equipmentId, sequenceNumber, terminalId
private Map<String, String[]> powerTransformerRatioTapChanger;
private Map<String, String[]> powerTransformerPhaseTapChanger;
private Map<String, CgmesDcTerminal> cachedDcTerminals;

private static final Logger LOG = LoggerFactory.getLogger(AbstractCgmesModel.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,8 +96,12 @@ default PropertyBags fullModels() {

PropertyBags ratioTapChangers();

PropertyBags ratioTapChangers(String transformerId);

PropertyBags phaseTapChangers();

PropertyBags phaseTapChangers(String transformerId);

PropertyBags regulatingControls();

PropertyBags energyConsumers();
Expand Down Expand Up @@ -224,10 +228,6 @@ default void write(DataSource ds, CgmesSubset subset) {

// Helper mappings

List<String> ratioTapChangerListForPowerTransformer(String powerTransformerId);

List<String> phaseTapChangerListForPowerTransformer(String powerTransformerId);

/**
* Obtain the substation of a given terminal.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -412,11 +412,21 @@ public PropertyBags ratioTapChangers() {
return ratioTapChangers;
}

@Override
public PropertyBags ratioTapChangers(String transformerId) {
return new PropertyBags();
}

@Override
public PropertyBags phaseTapChangers() {
return phaseTapChangers;
}

@Override
public PropertyBags phaseTapChangers(String transformerId) {
return new PropertyBags();
}

@Override
public PropertyBags regulatingControls() {
return regulatingControls;
Expand Down Expand Up @@ -518,16 +528,6 @@ public PropertyBags phaseTapChangerTable(String tableId) {
return new PropertyBags();
}

@Override
public List<String> ratioTapChangerListForPowerTransformer(String powerTransformerId) {
return Collections.emptyList();
}

@Override
public List<String> phaseTapChangerListForPowerTransformer(String powerTransformerId) {
return Collections.emptyList();
}

@Override
public PropertyBags acDcConverters() {
return acDcConverters;
Expand Down
Loading

0 comments on commit 03a52bd

Please sign in to comment.