Skip to content

Commit 69645cc

Browse files
committed
Merge remote-tracking branch 'origin/add-control-on-active-limits-fields' into add-control-on-active-limits-fields
2 parents e692913 + 0ae1441 commit 69645cc

File tree

11 files changed

+461
-8
lines changed

11 files changed

+461
-8
lines changed

src/main/java/org/gridsuite/modification/server/dto/LineCreationInfos.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,6 @@ public AbstractModification toModification() {
5858

5959
@Override
6060
public Reporter createSubReporter(ReporterModel reporter) {
61-
return reporter.createSubReporter(getType().name(), "Creation of line " + getEquipmentId());
61+
return reporter.createSubReporter(getType().name(), "Creation of line ${lineId}", "lineId", getEquipmentId());
6262
}
6363
}

src/main/java/org/gridsuite/modification/server/dto/elasticsearch/BasicEquipmentInfos.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import lombok.*;
1010
import lombok.experimental.SuperBuilder;
11+
import org.springframework.data.annotation.AccessType;
1112
import org.springframework.data.annotation.Id;
1213
import org.springframework.data.elasticsearch.annotations.Field;
1314
import org.springframework.data.elasticsearch.annotations.FieldType;
@@ -27,7 +28,16 @@
2728
@EqualsAndHashCode
2829
public class BasicEquipmentInfos {
2930
@Id
30-
private String uniqueId;
31+
@AccessType(AccessType.Type.PROPERTY)
32+
@SuppressWarnings("unused")
33+
public String getUniqueId() {
34+
return networkUuid + "_" + variantId + "_" + id;
35+
}
36+
37+
@SuppressWarnings("unused")
38+
public void setUniqueId(String uniqueId) {
39+
// No setter because it a composite value
40+
}
3141

3242
@MultiField(
3343
mainField = @Field(name = "equipmentId", type = FieldType.Text),

src/main/java/org/gridsuite/modification/server/dto/formula/ReferenceFieldOrValue.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
import com.powsybl.iidm.network.Generator;
1212
import com.powsybl.iidm.network.Identifiable;
1313
import com.powsybl.iidm.network.IdentifiableType;
14+
import com.powsybl.iidm.network.Load;
1415
import com.powsybl.iidm.network.ShuntCompensator;
16+
import com.powsybl.iidm.network.VoltageLevel;
1517
import lombok.AllArgsConstructor;
1618
import lombok.Builder;
1719
import lombok.Getter;
@@ -20,7 +22,10 @@
2022
import org.gridsuite.modification.server.NetworkModificationException;
2123
import org.gridsuite.modification.server.dto.formula.equipmentfield.BatteryField;
2224
import org.gridsuite.modification.server.dto.formula.equipmentfield.GeneratorField;
25+
import org.gridsuite.modification.server.dto.formula.equipmentfield.LoadField;
2326
import org.gridsuite.modification.server.dto.formula.equipmentfield.ShuntCompensatorField;
27+
import org.gridsuite.modification.server.dto.formula.equipmentfield.VoltageLevelField;
28+
2429

2530
/**
2631
* @author Seddik Yengui <Seddik.yengui at rte-france.com>
@@ -51,6 +56,8 @@ public Double getRefOrValue(Identifiable<?> identifiable) {
5156
case GENERATOR -> GeneratorField.getReferenceValue((Generator) identifiable, equipmentField);
5257
case BATTERY -> BatteryField.getReferenceValue((Battery) identifiable, equipmentField);
5358
case SHUNT_COMPENSATOR -> ShuntCompensatorField.getReferenceValue((ShuntCompensator) identifiable, equipmentField);
59+
case VOLTAGE_LEVEL -> VoltageLevelField.getReferenceValue((VoltageLevel) identifiable, equipmentField);
60+
case LOAD -> LoadField.getReferenceValue((Load) identifiable, equipmentField);
5461
default -> throw new NetworkModificationException(NetworkModificationException.Type.BY_FORMULA_MODIFICATION_ERROR,
5562
String.format("Unsupported equipment type : %s", identifiableType.name()));
5663
};
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/**
2+
* Copyright (c) 2023, RTE (http://www.rte-france.com)
3+
* This Source Code Form is subject to the terms of the Mozilla Public
4+
* License, v. 2.0. If a copy of the MPL was not distributed with this
5+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
6+
*/
7+
8+
package org.gridsuite.modification.server.dto.formula.equipmentfield;
9+
10+
import com.powsybl.iidm.network.Load;
11+
12+
/**
13+
* @author Seddik Yengui <Seddik.yengui at rte-france.com>
14+
*/
15+
16+
public enum LoadField {
17+
ACTIVE_POWER,
18+
REACTIVE_POWER;
19+
20+
public static Double getReferenceValue(Load load, String loadField) {
21+
LoadField field = LoadField.valueOf(loadField);
22+
return switch (field) {
23+
case ACTIVE_POWER -> load.getP0();
24+
case REACTIVE_POWER -> load.getQ0();
25+
};
26+
}
27+
28+
public static void setNewValue(Load load, String loadField, Double newValue) {
29+
LoadField field = LoadField.valueOf(loadField);
30+
switch (field) {
31+
case ACTIVE_POWER -> load.setP0(newValue);
32+
case REACTIVE_POWER -> load.setQ0(newValue);
33+
}
34+
}
35+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/**
2+
* Copyright (c) 2023, RTE (http://www.rte-france.com)
3+
* This Source Code Form is subject to the terms of the Mozilla Public
4+
* License, v. 2.0. If a copy of the MPL was not distributed with this
5+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
6+
*/
7+
8+
package org.gridsuite.modification.server.dto.formula.equipmentfield;
9+
10+
import com.powsybl.iidm.network.VoltageLevel;
11+
import com.powsybl.iidm.network.extensions.IdentifiableShortCircuit;
12+
import com.powsybl.iidm.network.extensions.IdentifiableShortCircuitAdder;
13+
14+
/**
15+
* @author Seddik Yengui <Seddik.yengui at rte-france.com>
16+
*/
17+
18+
public enum VoltageLevelField {
19+
NOMINAL_VOLTAGE,
20+
LOW_VOLTAGE_LIMIT,
21+
HIGH_VOLTAGE_LIMIT,
22+
LOW_SHORT_CIRCUIT_CURRENT_LIMIT,
23+
HIGH_SHORT_CIRCUIT_CURRENT_LIMIT;
24+
25+
public static Double getReferenceValue(VoltageLevel voltageLevel, String voltageLevelField) {
26+
IdentifiableShortCircuit<VoltageLevel> identifiableShortCircuit = voltageLevel.getExtension(IdentifiableShortCircuit.class);
27+
VoltageLevelField field = VoltageLevelField.valueOf(voltageLevelField);
28+
return switch (field) {
29+
case NOMINAL_VOLTAGE -> voltageLevel.getNominalV();
30+
case LOW_VOLTAGE_LIMIT -> voltageLevel.getLowVoltageLimit();
31+
case HIGH_VOLTAGE_LIMIT -> voltageLevel.getHighVoltageLimit();
32+
case LOW_SHORT_CIRCUIT_CURRENT_LIMIT -> identifiableShortCircuit == null ? null : identifiableShortCircuit.getIpMin();
33+
case HIGH_SHORT_CIRCUIT_CURRENT_LIMIT -> identifiableShortCircuit == null ? null : identifiableShortCircuit.getIpMax();
34+
};
35+
}
36+
37+
public static void setNewValue(VoltageLevel voltageLevel, String voltageLevelField, Double newValue) {
38+
IdentifiableShortCircuit<VoltageLevel> identifiableShortCircuit = voltageLevel.getExtension(IdentifiableShortCircuit.class);
39+
VoltageLevelField field = VoltageLevelField.valueOf(voltageLevelField);
40+
switch (field) {
41+
case NOMINAL_VOLTAGE -> voltageLevel.setNominalV(newValue);
42+
case LOW_VOLTAGE_LIMIT -> voltageLevel.setLowVoltageLimit(newValue);
43+
case HIGH_VOLTAGE_LIMIT -> voltageLevel.setHighVoltageLimit(newValue);
44+
case LOW_SHORT_CIRCUIT_CURRENT_LIMIT -> {
45+
IdentifiableShortCircuitAdder<VoltageLevel> adder = voltageLevel.newExtension(IdentifiableShortCircuitAdder.class).withIpMin(newValue);
46+
if (identifiableShortCircuit != null) {
47+
adder.withIpMax(identifiableShortCircuit.getIpMax());
48+
}
49+
adder.add();
50+
}
51+
case HIGH_SHORT_CIRCUIT_CURRENT_LIMIT -> {
52+
IdentifiableShortCircuitAdder<VoltageLevel> adder = voltageLevel.newExtension(IdentifiableShortCircuitAdder.class).withIpMax(newValue);
53+
if (identifiableShortCircuit != null) {
54+
adder.withIpMin(identifiableShortCircuit.getIpMin());
55+
}
56+
adder.add();
57+
}
58+
}
59+
}
60+
}

src/main/java/org/gridsuite/modification/server/elasticsearch/EquipmentInfosService.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ public void cloneVariantModifications(@NonNull UUID networkUuid, @NonNull String
6565
addAllEquipmentInfos(
6666
equipmentInfosRepository.findAllByNetworkUuidAndVariantId(networkUuid, variantToCloneId).stream()
6767
.map(equipmentInfos -> {
68-
equipmentInfos.setUniqueId(null);
6968
equipmentInfos.setVariantId(variantId);
7069
return equipmentInfos;
7170
})
@@ -74,7 +73,6 @@ public void cloneVariantModifications(@NonNull UUID networkUuid, @NonNull String
7473
addAllTombstonedEquipmentInfos(
7574
tombstonedEquipmentInfosRepository.findAllByNetworkUuidAndVariantId(networkUuid, variantToCloneId).stream()
7675
.map(tombstonedEquipmentInfos -> {
77-
tombstonedEquipmentInfos.setUniqueId(null);
7876
tombstonedEquipmentInfos.setVariantId(variantId);
7977
return tombstonedEquipmentInfos;
8078
})

src/main/java/org/gridsuite/modification/server/modifications/ByFormulaModification.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@
1313
import com.powsybl.iidm.network.Battery;
1414
import com.powsybl.iidm.network.Generator;
1515
import com.powsybl.iidm.network.Identifiable;
16+
import com.powsybl.iidm.network.Load;
1617
import com.powsybl.iidm.network.Network;
1718
import com.powsybl.iidm.network.ShuntCompensator;
19+
import com.powsybl.iidm.network.VoltageLevel;
1820
import org.gridsuite.modification.server.NetworkModificationException;
1921
import org.gridsuite.modification.server.dto.ByFormulaModificationInfos;
2022
import org.gridsuite.modification.server.dto.FilterEquipments;
@@ -23,7 +25,9 @@
2325
import org.gridsuite.modification.server.dto.formula.Operator;
2426
import org.gridsuite.modification.server.dto.formula.equipmentfield.BatteryField;
2527
import org.gridsuite.modification.server.dto.formula.equipmentfield.GeneratorField;
28+
import org.gridsuite.modification.server.dto.formula.equipmentfield.LoadField;
2629
import org.gridsuite.modification.server.dto.formula.equipmentfield.ShuntCompensatorField;
30+
import org.gridsuite.modification.server.dto.formula.equipmentfield.VoltageLevelField;
2731
import org.gridsuite.modification.server.service.FilterService;
2832
import org.jetbrains.annotations.Nullable;
2933
import org.springframework.util.CollectionUtils;
@@ -155,6 +159,8 @@ private void applyFormula(Network network,
155159
case GENERATOR -> GeneratorField.setNewValue((Generator) identifiable, formulaInfos.getEditedField(), newValue);
156160
case BATTERY -> BatteryField.setNewValue((Battery) identifiable, formulaInfos.getEditedField(), newValue);
157161
case SHUNT_COMPENSATOR -> ShuntCompensatorField.setNewValue((ShuntCompensator) identifiable, formulaInfos.getEditedField(), newValue);
162+
case VOLTAGE_LEVEL -> VoltageLevelField.setNewValue((VoltageLevel) identifiable, formulaInfos.getEditedField(), newValue);
163+
case LOAD -> LoadField.setNewValue((Load) identifiable, formulaInfos.getEditedField(), newValue);
158164
default -> throw new NetworkModificationException(NetworkModificationException.Type.BY_FORMULA_MODIFICATION_ERROR, "Unsupported equipment");
159165
}
160166

src/test/java/org/gridsuite/modification/server/modifications/AbstractByFormulaModificationTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ protected void checkCreateWithError(List<FormulaInfos> formulaInfos) throws Exce
110110
@Override
111111
public void testCreate() throws Exception {
112112
List<FilterEquipments> filters = getTestFilters();
113-
UUID stubId = wireMockServer.stubFor(WireMock.get(WireMock.urlMatching(getPath(getNetworkUuid(), true) + "(.+,){4}.*"))
113+
UUID stubId = wireMockServer.stubFor(WireMock.get(WireMock.urlMatching(getPath(getNetworkUuid(), true) + ".{2,}"))
114114
.willReturn(WireMock.ok()
115115
.withBody(mapper.writeValueAsString(filters))
116116
.withHeader("Content-Type", "application/json"))).getId();
@@ -125,7 +125,7 @@ public void testCreate() throws Exception {
125125
public void testCopy() throws Exception {
126126

127127
List<FilterEquipments> filters = getTestFilters();
128-
UUID stubId = wireMockServer.stubFor(WireMock.get(WireMock.urlMatching(getPath(getNetworkUuid(), true) + "(.+,){4}.*"))
128+
UUID stubId = wireMockServer.stubFor(WireMock.get(WireMock.urlMatching(getPath(getNetworkUuid(), true) + ".{2,}"))
129129
.willReturn(WireMock.ok()
130130
.withBody(mapper.writeValueAsString(filters))
131131
.withHeader("Content-Type", "application/json"))).getId();
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
/**
2+
* Copyright (c) 2023, RTE (http://www.rte-france.com)
3+
* This Source Code Form is subject to the terms of the Mozilla Public
4+
* License, v. 2.0. If a copy of the MPL was not distributed with this
5+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
6+
*/
7+
8+
package org.gridsuite.modification.server.modifications;
9+
10+
import com.powsybl.iidm.network.IdentifiableType;
11+
import org.gridsuite.modification.server.dto.FilterEquipments;
12+
import org.gridsuite.modification.server.dto.IdentifiableAttributes;
13+
import org.gridsuite.modification.server.dto.formula.FormulaInfos;
14+
import org.gridsuite.modification.server.dto.formula.Operator;
15+
import org.gridsuite.modification.server.dto.formula.ReferenceFieldOrValue;
16+
import org.gridsuite.modification.server.dto.formula.equipmentfield.LoadField;
17+
18+
import java.util.List;
19+
20+
import static org.gridsuite.modification.server.utils.NetworkUtil.createLoad;
21+
import static org.junit.Assert.assertEquals;
22+
23+
/**
24+
* @author Seddik Yengui <Seddik.yengui at rte-france.com>
25+
*/
26+
27+
public class LoadByFormulaModificationTest extends AbstractByFormulaModificationTest {
28+
private static final String LOAD_ID_1 = "load1";
29+
private static final String LOAD_ID_2 = "load2";
30+
private static final String LOAD_ID_3 = "load3";
31+
private static final String LOAD_ID_4 = "load4";
32+
33+
@Override
34+
protected void createEquipments() {
35+
createLoad(getNetwork().getVoltageLevel("v1"), LOAD_ID_1, "load1", 100, 100, 120, null, 5, null);
36+
createLoad(getNetwork().getVoltageLevel("v2"), LOAD_ID_2, "load2", 200, 80, 90, null, 5, null);
37+
createLoad(getNetwork().getVoltageLevel("v3"), LOAD_ID_3, "load3", 300, 100, 70, null, 5, null);
38+
createLoad(getNetwork().getVoltageLevel("v4"), LOAD_ID_4, "load4", 400, 50, 150, null, 5, null);
39+
}
40+
41+
@Override
42+
protected List<FilterEquipments> getTestFilters() {
43+
IdentifiableAttributes load1 = getIdentifiableAttributes(LOAD_ID_1, 1.0);
44+
IdentifiableAttributes load2 = getIdentifiableAttributes(LOAD_ID_2, 2.0);
45+
IdentifiableAttributes load3 = getIdentifiableAttributes(LOAD_ID_3, 2.0);
46+
IdentifiableAttributes load4 = getIdentifiableAttributes(LOAD_ID_4, 5.0);
47+
48+
FilterEquipments filter1 = getFilterEquipments(FILTER_ID_1, "filter1", List.of(load1, load2), List.of());
49+
FilterEquipments filter2 = getFilterEquipments(FILTER_ID_2, "filter2", List.of(load3, load4), List.of());
50+
51+
return List.of(filter1, filter2);
52+
}
53+
54+
@Override
55+
protected List<FormulaInfos> getFormulaInfos() {
56+
FormulaInfos formulaInfos1 = getFormulaInfo(LoadField.ACTIVE_POWER.name(),
57+
List.of(filter1),
58+
Operator.ADDITION,
59+
ReferenceFieldOrValue.builder().equipmentField(LoadField.ACTIVE_POWER.name()).build(),
60+
ReferenceFieldOrValue.builder().value(25.).build()
61+
);
62+
63+
FormulaInfos formulaInfos2 = getFormulaInfo(LoadField.REACTIVE_POWER.name(),
64+
List.of(filter2),
65+
Operator.MULTIPLICATION,
66+
ReferenceFieldOrValue.builder().equipmentField(LoadField.REACTIVE_POWER.name()).build(),
67+
ReferenceFieldOrValue.builder().value(2.5).build()
68+
);
69+
return List.of(formulaInfos1, formulaInfos2);
70+
}
71+
72+
@Override
73+
protected List<FormulaInfos> getUpdatedFormulaInfos() {
74+
FormulaInfos formulaInfos1 = getFormulaInfo(LoadField.ACTIVE_POWER.name(),
75+
List.of(filter1),
76+
Operator.PERCENTAGE,
77+
ReferenceFieldOrValue.builder().value(200.).build(),
78+
ReferenceFieldOrValue.builder().equipmentField(LoadField.ACTIVE_POWER.name()).build()
79+
);
80+
81+
return List.of(formulaInfos1);
82+
}
83+
84+
@Override
85+
protected IdentifiableType getIdentifiableType() {
86+
return IdentifiableType.LOAD;
87+
}
88+
89+
@Override
90+
protected void assertAfterNetworkModificationCreation() {
91+
assertEquals(125, getNetwork().getLoad(LOAD_ID_1).getP0(), 0);
92+
assertEquals(105, getNetwork().getLoad(LOAD_ID_2).getP0(), 0);
93+
assertEquals(175, getNetwork().getLoad(LOAD_ID_3).getQ0(), 0);
94+
assertEquals(375, getNetwork().getLoad(LOAD_ID_4).getQ0(), 0);
95+
}
96+
97+
@Override
98+
protected void assertAfterNetworkModificationDeletion() {
99+
assertEquals(100, getNetwork().getLoad(LOAD_ID_1).getP0(), 0);
100+
assertEquals(80, getNetwork().getLoad(LOAD_ID_2).getP0(), 0);
101+
assertEquals(70, getNetwork().getLoad(LOAD_ID_3).getQ0(), 0);
102+
assertEquals(150, getNetwork().getLoad(LOAD_ID_4).getQ0(), 0);
103+
}
104+
}

0 commit comments

Comments
 (0)