Skip to content

Commit ff8bcda

Browse files
committed
Complete tieline implementation (#167)
Signed-off-by: Slimane AMAR <[email protected]>
1 parent d3f2cfd commit ff8bcda

File tree

8 files changed

+368
-76
lines changed

8 files changed

+368
-76
lines changed

network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/LineImpl.java

+22
Original file line numberDiff line numberDiff line change
@@ -144,8 +144,20 @@ public <E extends Extension<Line>> void addExtension(Class<? super E> type, E ex
144144
.xnodeP2(mergedXnode.getXnodeP2())
145145
.xnodeQ1(mergedXnode.getXnodeQ1())
146146
.xnodeQ2(mergedXnode.getXnodeQ2())
147+
.line1Id(mergedXnode.getLine1Name())
147148
.line1Name(mergedXnode.getLine1Name())
149+
.line1Fictitious(mergedXnode.isLine1Fictitious())
150+
.line1B1(mergedXnode.getLine1B1())
151+
.line1B2(mergedXnode.getLine1B2())
152+
.line1G1(mergedXnode.getLine1G1())
153+
.line1G2(mergedXnode.getLine1G2())
154+
.line2Id(mergedXnode.getLine2Name())
148155
.line2Name(mergedXnode.getLine2Name())
156+
.line2Fictitious(mergedXnode.isLine2Fictitious())
157+
.line2B1(mergedXnode.getLine2B1())
158+
.line2B2(mergedXnode.getLine2B2())
159+
.line2G1(mergedXnode.getLine2G1())
160+
.line2G2(mergedXnode.getLine2G2())
149161
.build());
150162
}
151163
super.addExtension(type, extension);
@@ -179,7 +191,17 @@ private MergedXnode createMergedXnode() {
179191
resource.getAttributes().getMergedXnode().getXnodeP2(),
180192
resource.getAttributes().getMergedXnode().getXnodeQ2(),
181193
resource.getAttributes().getMergedXnode().getLine1Name(),
194+
resource.getAttributes().getMergedXnode().isLine1Fictitious(),
195+
resource.getAttributes().getMergedXnode().getLine1B1(),
196+
resource.getAttributes().getMergedXnode().getLine1B2(),
197+
resource.getAttributes().getMergedXnode().getLine1G1(),
198+
resource.getAttributes().getMergedXnode().getLine1G2(),
182199
resource.getAttributes().getMergedXnode().getLine2Name(),
200+
resource.getAttributes().getMergedXnode().isLine2Fictitious(),
201+
resource.getAttributes().getMergedXnode().getLine2B1(),
202+
resource.getAttributes().getMergedXnode().getLine2B2(),
203+
resource.getAttributes().getMergedXnode().getLine2G1(),
204+
resource.getAttributes().getMergedXnode().getLine2G2(),
183205
resource.getAttributes().getMergedXnode().getCode());
184206
}
185207
return null;

network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/TieLineAdderImpl.java

+17-4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*/
77
package com.powsybl.network.store.iidm.impl;
88

9+
import com.google.common.base.Strings;
910
import com.powsybl.iidm.network.TieLine;
1011
import com.powsybl.iidm.network.TieLineAdder;
1112
import com.powsybl.iidm.network.ValidationException;
@@ -59,7 +60,7 @@ public HalfLineAdderImpl setId(String id) {
5960
}
6061

6162
public String getName() {
62-
return name;
63+
return name != null ? name : id;
6364
}
6465

6566
public HalfLineAdderImpl setName(String name) {
@@ -151,7 +152,7 @@ public HalfLineAdderImpl setXnodeQ(double xnodeQ) {
151152

152153
private void validate() {
153154
int num = one ? 1 : 2;
154-
if (id == null) {
155+
if (Strings.isNullOrEmpty(id)) {
155156
throw new ValidationException(TieLineAdderImpl.this, "id is not set for half line " + num);
156157
}
157158
if (Double.isNaN(r)) {
@@ -257,8 +258,20 @@ public TieLine add() {
257258
.xnodeP2(halfLine2Adder.getXnodeP())
258259
.xnodeQ1(halfLine1Adder.getXnodeQ())
259260
.xnodeQ2(halfLine2Adder.getXnodeQ())
260-
.line1Name(halfLine1Adder.getId())
261-
.line2Name(halfLine2Adder.getId())
261+
.line1Id(halfLine1Adder.getId())
262+
.line1Name(halfLine1Adder.getName())
263+
.line1Fictitious(halfLine1Adder.isFictitious())
264+
.line1G1(halfLine1Adder.getG1())
265+
.line1B1(halfLine1Adder.getB1())
266+
.line1G2(halfLine1Adder.getG2())
267+
.line1B2(halfLine1Adder.getB2())
268+
.line2Id(halfLine2Adder.getId())
269+
.line2Name(halfLine2Adder.getName())
270+
.line2Fictitious(halfLine2Adder.isFictitious())
271+
.line2G1(halfLine2Adder.getG1())
272+
.line2B1(halfLine2Adder.getB1())
273+
.line2B2(halfLine2Adder.getB2())
274+
.line2G2(halfLine2Adder.getG2())
262275
.code(ucteXnodeCode)
263276
.build())
264277
.build()).build();

network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/TieLineImpl.java

+161-18
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@
77
package com.powsybl.network.store.iidm.impl;
88

99
import com.powsybl.commons.PowsyblException;
10-
import com.powsybl.iidm.network.*;
10+
import com.powsybl.iidm.network.TieLine;
11+
import com.powsybl.iidm.network.Validable;
12+
import com.powsybl.iidm.network.ValidationException;
13+
import com.powsybl.iidm.network.ValidationUtil;
1114
import com.powsybl.network.store.model.LineAttributes;
1215
import com.powsybl.network.store.model.Resource;
1316

@@ -28,7 +31,7 @@ public TieLineImpl(NetworkObjectIndex index, Resource<LineAttributes> resource)
2831
}
2932
}
3033

31-
class HalfLineImpl implements HalfLine {
34+
class HalfLineImpl implements HalfLine, Validable {
3235

3336
private final boolean one;
3437

@@ -38,40 +41,59 @@ public HalfLineImpl(boolean one) {
3841

3942
@Override
4043
public String getId() {
41-
return one ? resource.getAttributes().getMergedXnode().getLine1Name()
42-
: resource.getAttributes().getMergedXnode().getLine2Name();
44+
return one ? resource.getAttributes().getMergedXnode().getLine1Id()
45+
: resource.getAttributes().getMergedXnode().getLine2Id();
4346
}
4447

4548
@Override
4649
public String getName() {
47-
return getId();
50+
String name = one ? resource.getAttributes().getMergedXnode().getLine1Name()
51+
: resource.getAttributes().getMergedXnode().getLine2Name();
52+
return name != null ? name : getId();
53+
}
54+
55+
@Override
56+
public boolean isFictitious() {
57+
return one ? resource.getAttributes().getMergedXnode().isLine1Fictitious()
58+
: resource.getAttributes().getMergedXnode().isLine2Fictitious();
4859
}
4960

5061
@Override
5162
public double getXnodeP() {
5263
return one ? resource.getAttributes().getMergedXnode().getXnodeP1()
53-
: resource.getAttributes().getMergedXnode().getXnodeP2();
64+
: resource.getAttributes().getMergedXnode().getXnodeP2();
5465
}
5566

5667
@Override
5768
public HalfLineImpl setXnodeP(double xnodeP) {
69+
checkValidationXnodeP(xnodeP);
70+
double oldValue = getXnodeP();
5871
if (one) {
5972
resource.getAttributes().getMergedXnode().setXnodeP1(xnodeP);
6073
} else {
6174
resource.getAttributes().getMergedXnode().setXnodeP2(xnodeP);
6275
}
76+
index.notifyUpdate(TieLineImpl.this, getHalfLineAttribute() + ".xnodeP", oldValue, xnodeP);
6377
return this;
6478
}
6579

6680
@Override
6781
public double getXnodeQ() {
6882
return one ? resource.getAttributes().getMergedXnode().getXnodeQ1()
69-
: resource.getAttributes().getMergedXnode().getXnodeQ2();
83+
: resource.getAttributes().getMergedXnode().getXnodeQ2();
7084
}
7185

7286
@Override
7387
public HalfLineImpl setXnodeQ(double xnodeQ) {
74-
throw new UnsupportedOperationException("TODO");
88+
checkValidationXnodeQ(xnodeQ);
89+
double oldValue = getXnodeQ();
90+
if (one) {
91+
resource.getAttributes().getMergedXnode().setXnodeQ1(xnodeQ);
92+
} else {
93+
resource.getAttributes().getMergedXnode().setXnodeQ2(xnodeQ);
94+
}
95+
index.notifyUpdate(TieLineImpl.this, getHalfLineAttribute() + ".xnodeQ", oldValue, xnodeQ);
96+
return this;
7597
}
7698

7799
@Override
@@ -81,7 +103,16 @@ public double getR() {
81103

82104
@Override
83105
public HalfLineImpl setR(double r) {
84-
throw new UnsupportedOperationException("TODO");
106+
ValidationUtil.checkR(this, r);
107+
double oldValue = getR();
108+
double newR1 = one ? r : TieLineImpl.this.getR() * (resource.getAttributes().getMergedXnode().getRdp());
109+
double newR2 = !one ? r : TieLineImpl.this.getR() * (1 - resource.getAttributes().getMergedXnode().getRdp());
110+
double newR = newR1 + newR2;
111+
double newRdp = newR == 0 ? 0.5 : newR1 / newR;
112+
resource.getAttributes().setR(newR);
113+
resource.getAttributes().getMergedXnode().setRdp((float) newRdp);
114+
index.notifyUpdate(TieLineImpl.this, getHalfLineAttribute() + ".r", oldValue, r);
115+
return this;
85116
}
86117

87118
@Override
@@ -91,50 +122,162 @@ public double getX() {
91122

92123
@Override
93124
public HalfLineImpl setX(double x) {
94-
throw new UnsupportedOperationException("TODO");
125+
ValidationUtil.checkX(this, x);
126+
double oldValue = getX();
127+
double newX1 = one ? x : TieLineImpl.this.getX() * (resource.getAttributes().getMergedXnode().getXdp());
128+
double newX2 = !one ? x : TieLineImpl.this.getX() * (1 - resource.getAttributes().getMergedXnode().getXdp());
129+
double newX = newX1 + newX2;
130+
double newXdp = newX == 0 ? 0.5 : newX1 / newX;
131+
resource.getAttributes().setX(newX);
132+
resource.getAttributes().getMergedXnode().setXdp((float) newXdp);
133+
index.notifyUpdate(TieLineImpl.this, getHalfLineAttribute() + ".x", oldValue, x);
134+
return this;
95135
}
96136

97137
@Override
98138
public double getG1() {
99-
return one ? TieLineImpl.this.getG1() / 2 : TieLineImpl.this.getG2() / 2;
139+
return one ? resource.getAttributes().getMergedXnode().getLine1G1() : resource.getAttributes().getMergedXnode().getLine2G1();
100140
}
101141

102142
@Override
103143
public HalfLineImpl setG1(double g1) {
104-
throw new UnsupportedOperationException("TODO");
144+
ValidationUtil.checkG1(this, g1);
145+
double oldValue = getG1();
146+
if (one) {
147+
double g2 = resource.getAttributes().getMergedXnode().getLine1G2();
148+
resource.getAttributes().getMergedXnode().setLine1G1(g1);
149+
resource.getAttributes().setG1(g1 + g2);
150+
} else {
151+
double g2 = resource.getAttributes().getMergedXnode().getLine2G2();
152+
resource.getAttributes().getMergedXnode().setLine2G1(g1);
153+
resource.getAttributes().setG2(g1 + g2);
154+
}
155+
index.notifyUpdate(TieLineImpl.this, getHalfLineAttribute() + ".g1", oldValue, g1);
156+
return this;
105157
}
106158

107159
@Override
108160
public double getG2() {
109-
return one ? TieLineImpl.this.getG1() / 2 : TieLineImpl.this.getG2() / 2;
161+
return one ? resource.getAttributes().getMergedXnode().getLine1G2() : resource.getAttributes().getMergedXnode().getLine2G2();
110162
}
111163

112164
@Override
113165
public HalfLineImpl setG2(double g2) {
114-
throw new UnsupportedOperationException("TODO");
166+
ValidationUtil.checkG2(this, g2);
167+
double oldValue = getG2();
168+
if (one) {
169+
double g1 = resource.getAttributes().getMergedXnode().getLine1G1();
170+
resource.getAttributes().getMergedXnode().setLine1G2(g2);
171+
resource.getAttributes().setG1(g1 + g2);
172+
} else {
173+
double g1 = resource.getAttributes().getMergedXnode().getLine2G1();
174+
resource.getAttributes().getMergedXnode().setLine2G2(g2);
175+
resource.getAttributes().setG2(g1 + g2);
176+
}
177+
index.notifyUpdate(TieLineImpl.this, getHalfLineAttribute() + ".g2", oldValue, g2);
178+
return this;
115179
}
116180

117181
@Override
118182
public double getB1() {
119-
return one ? TieLineImpl.this.getB1() / 2 : TieLineImpl.this.getB2() / 2;
183+
return one ? resource.getAttributes().getMergedXnode().getLine1B1() : resource.getAttributes().getMergedXnode().getLine2B1();
120184
}
121185

122186
@Override
123187
public HalfLineImpl setB1(double b1) {
124-
throw new UnsupportedOperationException("TODO");
188+
ValidationUtil.checkB1(this, b1);
189+
double oldValue = getB1();
190+
if (one) {
191+
double b2 = resource.getAttributes().getMergedXnode().getLine1B2();
192+
resource.getAttributes().getMergedXnode().setLine1B1(b1);
193+
resource.getAttributes().setB1(b1 + b2);
194+
} else {
195+
double b2 = resource.getAttributes().getMergedXnode().getLine2B2();
196+
resource.getAttributes().getMergedXnode().setLine2B1(b1);
197+
resource.getAttributes().setB2(b1 + b2);
198+
}
199+
index.notifyUpdate(TieLineImpl.this, getHalfLineAttribute() + ".b1", oldValue, b1);
200+
return this;
125201
}
126202

127203
@Override
128204
public double getB2() {
129-
return one ? TieLineImpl.this.getB1() / 2 : TieLineImpl.this.getB2() / 2;
205+
return one ? resource.getAttributes().getMergedXnode().getLine1B2() : resource.getAttributes().getMergedXnode().getLine2B2();
130206
}
131207

132208
@Override
133209
public HalfLineImpl setB2(double b2) {
134-
throw new UnsupportedOperationException("TODO");
210+
ValidationUtil.checkB2(this, b2);
211+
double oldValue = getB2();
212+
if (one) {
213+
double b1 = resource.getAttributes().getMergedXnode().getLine1B1();
214+
resource.getAttributes().getMergedXnode().setLine1B2(b2);
215+
resource.getAttributes().setB1(b1 + b2);
216+
} else {
217+
double b1 = resource.getAttributes().getMergedXnode().getLine2B1();
218+
resource.getAttributes().getMergedXnode().setLine2B2(b2);
219+
resource.getAttributes().setB2(b1 + b2);
220+
}
221+
index.notifyUpdate(TieLineImpl.this, getHalfLineAttribute() + ".b2", oldValue, b2);
222+
return this;
223+
}
224+
225+
private String getHalfLineAttribute() {
226+
return "half" + (one ? "1" : "2");
227+
}
228+
229+
@Override
230+
public String getMessageHeader() {
231+
return String.format("Tie line side %s '%s':", one ? "1" : "2", TieLineImpl.this.getId());
232+
}
233+
234+
private void checkValidationXnodeP(double xnodeP) {
235+
if (Double.isNaN(xnodeP)) {
236+
throw new ValidationException(TieLineImpl.this, "xnodeP is invalid");
237+
}
238+
}
239+
240+
private void checkValidationXnodeQ(double xnodeQ) {
241+
if (Double.isNaN(xnodeQ)) {
242+
throw new ValidationException(TieLineImpl.this, "xnodeQ is invalid");
243+
}
135244
}
136245
}
137246

247+
private ValidationException createNotSupportedForTieLines() {
248+
return new ValidationException(this, "direct modification of characteristics not supported for tie lines");
249+
}
250+
251+
@Override
252+
public TieLineImpl setR(double r) {
253+
throw createNotSupportedForTieLines();
254+
}
255+
256+
@Override
257+
public TieLineImpl setX(double x) {
258+
throw createNotSupportedForTieLines();
259+
}
260+
261+
@Override
262+
public TieLineImpl setG1(double g1) {
263+
throw createNotSupportedForTieLines();
264+
}
265+
266+
@Override
267+
public TieLineImpl setB1(double b1) {
268+
throw createNotSupportedForTieLines();
269+
}
270+
271+
@Override
272+
public TieLineImpl setG2(double g2) {
273+
throw createNotSupportedForTieLines();
274+
}
275+
276+
@Override
277+
public TieLineImpl setB2(double b2) {
278+
throw createNotSupportedForTieLines();
279+
}
280+
138281
@Override
139282
public String getUcteXnodeCode() {
140283
return resource.getAttributes().getMergedXnode().getCode();

0 commit comments

Comments
 (0)