Skip to content

Commit 133de0f

Browse files
committed
wip
Signed-off-by: Damien Jeandemange <[email protected]>
1 parent c0d333f commit 133de0f

File tree

3 files changed

+115
-19
lines changed

3 files changed

+115
-19
lines changed

metrix-integration/src/main/java/com/powsybl/metrix/integration/MetrixNetwork.java

+53-8
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ public class MetrixNetwork {
3737
private static final Logger LOGGER = LoggerFactory.getLogger(MetrixNetwork.class);
3838
private static final String PAYS_CVG_PROPERTY = "paysCvg";
3939
private static final String PAYS_CVG_UNDEFINED = "Undefined";
40+
private static final String METRIX_T3WT_STAR_BUS_SUFFIX = "_metrixT3wtStarBus";
41+
private static final String METRIX_T3WT_LEG_SUFFIX = "_metrixT3wtLeg";
4042
private static final String METRIX_DANGLING_LINE_BUS_SUFFIX = "_metrixDanglingLineBus";
4143
private static final String METRIX_DANGLING_LINE_LOAD_SUFFIX = "_metrixDanglingLineLoad";
4244

@@ -54,6 +56,7 @@ public class MetrixNetwork {
5456
private final Set<Line> lineList = new LinkedHashSet<>();
5557
private final Set<TwoWindingsTransformer> twoWindingsTransformerList = new LinkedHashSet<>();
5658
private final Set<ThreeWindingsTransformer> threeWindingsTransformerList = new LinkedHashSet<>();
59+
private final Set<ThreeWindingsTransformer.Leg> threeWindingsTransformerLegsList = new LinkedHashSet<>();
5760
private final Set<Switch> switchList = new LinkedHashSet<>();
5861
private final Set<DanglingLine> unpairedDanglingLineList = new LinkedHashSet<>();
5962
private final Set<TieLine> tieLineList = new LinkedHashSet<>();
@@ -71,7 +74,6 @@ public class MetrixNetwork {
7174
private final Map<String, String> mappedSwitchMap = new HashMap<>();
7275

7376
protected MetrixNetwork(Network network) {
74-
// TODO: switch T3T for 3xTWT in the network using a network modification
7577
this.network = Objects.requireNonNull(network);
7678
}
7779

@@ -107,6 +109,10 @@ public List<ThreeWindingsTransformer> getThreeWindingsTransformerList() {
107109
return List.copyOf(threeWindingsTransformerList);
108110
}
109111

112+
public List<ThreeWindingsTransformer.Leg> getThreeWindingsTransformerLegsList() {
113+
return List.copyOf(threeWindingsTransformerLegsList);
114+
}
115+
110116
public List<DanglingLine> getUnpairedDanglingLineList() {
111117
return List.copyOf(unpairedDanglingLineList);
112118
}
@@ -144,6 +150,20 @@ public int getIndex(Identifiable<?> identifiable) {
144150
return mapper.getInt(subset, identifiable.getId());
145151
}
146152

153+
public int getThreeWindingsTransformerLegIndex(ThreeWindingsTransformer.Leg leg) {
154+
Objects.requireNonNull(leg);
155+
return mapper.getInt(MetrixSubset.QUAD, getThreeWindingsTransformerLegId(leg));
156+
}
157+
158+
public static String getThreeWindingsTransformerLegId(ThreeWindingsTransformer.Leg leg) {
159+
return leg.getTransformer().getId() + METRIX_T3WT_LEG_SUFFIX + leg.getSide().getNum();
160+
}
161+
162+
public int getThreeWindingsTransformerStarBusIndex(ThreeWindingsTransformer t3wt) {
163+
Objects.requireNonNull(t3wt);
164+
return mapper.getInt(MetrixSubset.NOEUD, t3wt.getId() + METRIX_T3WT_STAR_BUS_SUFFIX);
165+
}
166+
147167
public int getUnpairedDanglingLineBusIndex(DanglingLine danglingLine) {
148168
Objects.requireNonNull(danglingLine);
149169
if (danglingLine.isPaired()) {
@@ -239,7 +259,13 @@ private void addTwoWindingsTransformer(TwoWindingsTransformer twt) {
239259

240260
private void addThreeWindingsTransformer(ThreeWindingsTransformer twt) {
241261
if (threeWindingsTransformerList.add(twt)) {
242-
mapper.newInt(MetrixSubset.QUAD, twt.getId());
262+
mapper.newInt(MetrixSubset.NOEUD, twt.getId() + METRIX_T3WT_STAR_BUS_SUFFIX);
263+
}
264+
}
265+
266+
private void addThreeWindingsTransformerLeg(ThreeWindingsTransformer.Leg leg) {
267+
if (threeWindingsTransformerLegsList.add(leg)) {
268+
mapper.newInt(MetrixSubset.QUAD, getThreeWindingsTransformerLegId(leg));
243269
}
244270
}
245271

@@ -275,6 +301,12 @@ private void addPhaseTapChanger(TwoWindingsTransformer twt) {
275301
}
276302
}
277303

304+
private void addPhaseTapChanger(ThreeWindingsTransformer.Leg leg) {
305+
if (phaseTapChangerList.add(leg.getPhaseTapChanger())) {
306+
mapper.newInt(MetrixSubset.DEPHA, getThreeWindingsTransformerLegId(leg));
307+
}
308+
}
309+
278310
private void addBus(Bus bus) {
279311
if (busList.add(bus)) {
280312
mapper.newInt(MetrixSubset.NOEUD, bus.getId());
@@ -409,12 +441,25 @@ private void createThreeWindingsTransformersList() {
409441
Bus b1 = t1.getBusBreakerView().getBus();
410442
Bus b2 = t2.getBusBreakerView().getBus();
411443
Bus b3 = t3.getBusBreakerView().getBus();
412-
if (b1 != null && b2 != null && b3 != null) {
413-
if (busList.contains(b1) && busList.contains(b2) && busList.contains(b3)) {
414-
addThreeWindingsTransformer(twt);
415-
} else {
416-
nbNok++;
417-
}
444+
List<ThreeWindingsTransformer.Leg> connectedLegs = new ArrayList<>();
445+
if (b1 != null && busList.contains(b1)) {
446+
connectedLegs.add(leg1);
447+
}
448+
if (b2 != null && busList.contains(b2)) {
449+
connectedLegs.add(leg2);
450+
}
451+
if (b3 != null && busList.contains(b3)) {
452+
connectedLegs.add(leg3);
453+
}
454+
if (connectedLegs.size() >= 2) {
455+
// need at least two legs for a flow to happen
456+
addThreeWindingsTransformer(twt);
457+
connectedLegs.forEach(leg -> {
458+
addThreeWindingsTransformerLeg(leg);
459+
if (leg.hasPhaseTapChanger()) {
460+
addPhaseTapChanger(leg);
461+
}
462+
});
418463
} else {
419464
nbNok++;
420465
}

metrix-integration/src/main/java/com/powsybl/metrix/integration/dataGenerator/MetrixInputData.java

+61-7
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ private void createMetrixInputs() {
187187
// Quadripoles are lines, transformers and switches
188188
cqnbquad = metrixNetwork.getLineList().size()
189189
+ metrixNetwork.getTwoWindingsTransformerList().size()
190-
+ 3 * metrixNetwork.getThreeWindingsTransformerList().size()
190+
+ metrixNetwork.getThreeWindingsTransformerLegsList().size()
191191
+ metrixNetwork.getSwitchList().size()
192192
+ metrixNetwork.getUnpairedDanglingLineList().size()
193193
+ metrixNetwork.getTieLineList().size();
@@ -198,7 +198,9 @@ private void createMetrixInputs() {
198198

199199
dcnblies = metrixNetwork.getHvdcLineList().size();
200200

201-
tnnbntot = metrixNetwork.getBusList().size() + metrixNetwork.getUnpairedDanglingLineList().size();
201+
tnnbntot = metrixNetwork.getBusList().size()
202+
+ metrixNetwork.getUnpairedDanglingLineList().size() // boundary bus
203+
+ metrixNetwork.getThreeWindingsTransformerList().size(); // star bus
202204

203205
if (dslData != null) {
204206
sectnbse = dslData.getSectionList().size();
@@ -396,10 +398,9 @@ private void writeBranches(boolean constantLossFactor, MetrixDie die) {
396398
metrixNetwork.getTwoWindingsTransformerList().forEach(twoWindingsTransformer ->
397399
writeTwoWindingsTransformer(twoWindingsTransformer, metrixInputBranch, metrixInputPhaseTapChanger, constantLossFactor, dtlowran, dtuppran, dttapdep));
398400

399-
// Three Windings Transformers
400-
metrixNetwork.getThreeWindingsTransformerList().forEach(twt -> {
401-
throw new PowsyblException("Three Windings Transformers are not yet supported in metrix");
402-
});
401+
// Three Windings Transformers Legs
402+
metrixNetwork.getThreeWindingsTransformerLegsList().forEach(t3wtLeg ->
403+
writeThreeWindingsTransformerLeg(t3wtLeg, metrixInputBranch, metrixInputPhaseTapChanger, constantLossFactor, dtlowran, dtuppran, dttapdep));
403404

404405
// Switches
405406
metrixNetwork.getSwitchList().forEach(sw -> writeSwitch(sw, metrixInputBranch));
@@ -502,7 +503,7 @@ private void writeTwoWindingsTransformer(TwoWindingsTransformer twt,
502503
ptc.getLowTapPosition()));
503504
}
504505

505-
//Per-unitage
506+
// Per-uniting
506507
double admittance = toAdmittance(twt.getId(), x, nominalVoltage2, parameters.getNominalU());
507508
r = (r * Math.pow(parameters.getNominalU(), 2)) / Math.pow(nominalVoltage2, 2);
508509

@@ -513,6 +514,59 @@ private void writeTwoWindingsTransformer(TwoWindingsTransformer twt,
513514
new BranchValues(twt.getId(), admittance, r, getMonitoringTypeBasecase(twt.getId()), getMonitoringTypeOnContingency(twt.getId()), bus1Index, bus2Index));
514515
}
515516

517+
private void writeThreeWindingsTransformerLeg(ThreeWindingsTransformer.Leg leg,
518+
MetrixInputBranch metrixInputBranch,
519+
MetrixInputPhaseTapChanger metrixInputPhaseTapChanger,
520+
boolean constantLossFactor,
521+
List<Integer> dtlowran,
522+
List<Integer> dtuppran,
523+
List<Float> dttapdep) {
524+
double nominalVoltage2 = leg.getTerminal().getVoltageLevel().getNominalV();
525+
double x = leg.getX();
526+
double r = leg.getR();
527+
String t3wtLegId = MetrixNetwork.getThreeWindingsTransformerLegId(leg);
528+
int index = metrixNetwork.getThreeWindingsTransformerLegIndex(leg);
529+
530+
if (leg.hasPhaseTapChanger()) {
531+
PhaseTapChanger ptc = leg.getPhaseTapChanger();
532+
int position = ptc.getTapPosition();
533+
x = x * (1 + ptc.getStep(position).getX() / 100);
534+
r = r * (1 + ptc.getStep(position).getR() / 100);
535+
if (constantLossFactor) {
536+
float val = (float) (Math.pow(x, 2) + Math.pow(r, 2) - Math.pow(leg.getR(), 2));
537+
if (val >= 0) {
538+
x = (float) Math.sqrt(val);
539+
}
540+
LOGGER.debug("constantLossFactor -> t3wt <{} leg {}> x = <{}>", leg.getTransformer().getId(), leg.getSide(), x);
541+
}
542+
543+
MetrixPtcControlType mode = MetrixPtcControlType.FIXED_ANGLE_CONTROL; // FIXME-TODO = getMetrixPtcControlType(leg, index, dtlowran, dtuppran);
544+
545+
for (int pos = ptc.getLowTapPosition(); pos < ptc.getLowTapPosition() + ptc.getStepCount(); pos++) {
546+
dttapdep.add((float) ptc.getStep(pos).getAlpha());
547+
}
548+
549+
writePhaseTapChanger(metrixInputPhaseTapChanger,
550+
metrixNetwork.getIndex(MetrixSubset.DEPHA, t3wtLegId),
551+
new PhaseTapChangerValues(index, mode.getType(),
552+
(float) ptc.getStep(ptc.getLowTapPosition()).getAlpha(),
553+
(float) ptc.getStep(ptc.getHighTapPosition()).getAlpha(),
554+
(float) ptc.getStep(ptc.getTapPosition()).getAlpha(),
555+
ptc.getStepCount(),
556+
ptc.getLowTapPosition()));
557+
}
558+
559+
// Per-uniting
560+
double admittance = toAdmittance(t3wtLegId, x, nominalVoltage2, parameters.getNominalU());
561+
r = (r * Math.pow(parameters.getNominalU(), 2)) / Math.pow(nominalVoltage2, 2);
562+
563+
int bus1Index = metrixNetwork.getThreeWindingsTransformerStarBusIndex(leg.getTransformer());
564+
int bus2Index = metrixNetwork.getIndex(leg.getTerminal().getBusBreakerView().getBus());
565+
writeBranch(metrixInputBranch,
566+
index,
567+
new BranchValues(t3wtLegId, admittance, r, getMonitoringTypeBasecase(t3wtLegId), getMonitoringTypeOnContingency(t3wtLegId), bus1Index, bus2Index));
568+
}
569+
516570
private MetrixPtcControlType getMetrixPtcControlType(TwoWindingsTransformer twt,
517571
int index,
518572
List<Integer> dtlowran,

metrix-integration/src/test/java/com/powsybl/metrix/integration/MetrixInputTest.java

+1-4
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import com.google.common.collect.Range;
1515
import com.google.common.jimfs.Configuration;
1616
import com.google.common.jimfs.Jimfs;
17-
import com.powsybl.commons.PowsyblException;
1817
import com.powsybl.contingency.*;
1918
import com.powsybl.iidm.network.*;
2019
import com.powsybl.iidm.network.test.DanglingLineNetworkFactory;
@@ -165,9 +164,7 @@ void metrixInputDataWithT3TTest() throws IOException {
165164
Network n = ThreeWindingsTransformerNetworkFactory.create();
166165
MetrixInputData metrixInputData = new MetrixInputData(MetrixNetwork.create(n), null, new MetrixParameters());
167166
try (StringWriter writer = new StringWriter()) {
168-
assertThrows(PowsyblException.class,
169-
() -> metrixInputData.writeJson(writer),
170-
"Three Windings Transformers are not yet supported in metrix");
167+
assertDoesNotThrow(() -> metrixInputData.writeJson(writer)); // TODO test this better ^^
171168
}
172169
}
173170

0 commit comments

Comments
 (0)