Skip to content

Commit 556756a

Browse files
committed
Add specific reports for equipment builders
Fix rebase Signed-off-by: lisrte <[email protected]>
1 parent 501bcae commit 556756a

File tree

14 files changed

+99
-98
lines changed

14 files changed

+99
-98
lines changed

commons/src/main/resources/com/powsybl/dynawo/commons/reports.properties

+2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ dynawo.dynasim.emptyAutomationSystem = ${automationSystemName} ${dynamicId} equi
2323
dynawo.dynasim.emptyList = '${fieldName}' list is empty
2424
dynawo.dynasim.emptyListAutomationSystem = None of ${automationSystemName} ${dynamicId} equipments are ${expectedModels}, the automation system will be skipped
2525
dynawo.dynasim.failedDynamicModelHandling = ${modelName} ${dynamicId} cannot handle ${equipmentType} dynamic model, the model will be skipped
26+
dynawo.dynasim.fictitiousEquipment = '${fieldName}' field value '${staticId}' should not be fictitious
2627
dynawo.dynasim.fieldConflict = Both '${firstFieldName}' and '${secondFieldName}' are defined, '${firstFieldName}' will be used
2728
dynawo.dynasim.fieldNotSet = '${fieldName}' field is not set
2829
dynawo.dynasim.fieldOptionNotImplemented = '${fieldName}' field is set but this option is not implemented yet, default value ${defaultValue} will be used
@@ -37,6 +38,7 @@ dynawo.dynasim.notEnergized = '${fieldName}' field value '${staticId}' should be
3738
dynawo.dynasim.outputVariableInstantiationError = Output variable ${id} cannot be instantiated
3839
dynawo.dynasim.staticIdUnknown = '${fieldName}' field value '${staticId}' not found for equipment type(s) ${equipmentType}, id will be used as pure dynamic model id
3940
dynawo.dynasim.unknownIdToDynamic = '${fieldName}' field value '${staticId}' not found for equipment type(s) ${equipmentType}
41+
dynawo.dynasim.wrongHvdcType = '${fieldName}' field value '${staticId}' should be an HVDC ${type}
4042
dynawo.dynasim.wrongNetwork = '${fieldName}' field value ${equipmentType} ${staticId} does not belong to the builder network
4143
dynawo.margincalc.loadsVariationInstantiationError = LoadVariation cannot be instantiated
4244
dynawo.margincalc.marginCalculationTool = Margin Calculation Tool

dynawo-dsl/src/test/java/com/powsybl/dynawo/dsl/DynamicModelsSupplierTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ private static Stream<Arguments> provideWarningsModel() {
264264
+ DSL tests
265265
+ Groovy Dynamic Models Supplier
266266
+ Model HvdcVsc L instantiation failed
267-
'staticId' field value 'L' not found for equipment type(s) VSC HVDC_LINE
267+
'staticId' field value 'L' should be an HVDC VSC
268268
""")
269269
);
270270
}

dynawo-simulation/src/main/java/com/powsybl/dynawo/builders/AbstractEquipmentModelBuilder.java

+5-10
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
package com.powsybl.dynawo.builders;
99

1010
import com.powsybl.commons.report.ReportNode;
11-
import com.powsybl.iidm.network.*;
11+
import com.powsybl.iidm.network.Identifiable;
12+
import com.powsybl.iidm.network.IdentifiableType;
13+
import com.powsybl.iidm.network.Network;
1214

1315
import java.util.Objects;
1416

@@ -24,7 +26,7 @@ public abstract class AbstractEquipmentModelBuilder<T extends Identifiable<?>, R
2426
protected AbstractEquipmentModelBuilder(Network network, ModelConfig modelConfig, IdentifiableType equipmentType, ReportNode reportNode) {
2527
super(network, reportNode);
2628
this.modelConfig = Objects.requireNonNull(modelConfig);
27-
this.builderEquipment = new BuilderEquipment<>(equipmentType.toString());
29+
this.builderEquipment = new BuilderEquipment<>(equipmentType);
2830
}
2931

3032
protected AbstractEquipmentModelBuilder(Network network, ModelConfig modelConfig, String equipmentType, ReportNode reportNode) {
@@ -33,13 +35,6 @@ protected AbstractEquipmentModelBuilder(Network network, ModelConfig modelConfig
3335
this.builderEquipment = new BuilderEquipment<>(equipmentType);
3436
}
3537

36-
protected AbstractEquipmentModelBuilder(Network network, ModelConfig modelConfig, String equipmentType,
37-
BuilderEquipment.EquipmentPredicate<T> equipmentPredicate, ReportNode reportNode) {
38-
super(network, reportNode);
39-
this.modelConfig = modelConfig;
40-
this.builderEquipment = new BuilderEquipment<>(equipmentType, equipmentPredicate);
41-
}
42-
4338
@Override
4439
public R staticId(String staticId) {
4540
builderEquipment.addEquipment(staticId, this::findEquipment);
@@ -48,7 +43,7 @@ public R staticId(String staticId) {
4843

4944
@Override
5045
public R equipment(T equipment) {
51-
builderEquipment.addEquipment(equipment, network);
46+
builderEquipment.addEquipment(equipment, eq -> Objects.equals(network, eq.getNetwork()));
5247
return self();
5348
}
5449

dynawo-simulation/src/main/java/com/powsybl/dynawo/builders/BuilderEquipment.java

+17-25
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,9 @@
1010
import com.powsybl.commons.report.ReportNode;
1111
import com.powsybl.iidm.network.Identifiable;
1212
import com.powsybl.iidm.network.IdentifiableType;
13-
import com.powsybl.iidm.network.Network;
1413

15-
import java.util.Objects;
1614
import java.util.function.Function;
15+
import java.util.function.Predicate;
1716

1817
/**
1918
* Represents an equipment field identified by a static ID in a builder
@@ -23,57 +22,46 @@
2322
*/
2423
public class BuilderEquipment<T extends Identifiable<?>> {
2524

26-
@FunctionalInterface
27-
public interface EquipmentPredicate<T> {
28-
boolean test(T equipment, String fieldName, ReportNode reportNode);
29-
}
30-
3125
private static final String DEFAULT_FIELD_NAME = "staticId";
26+
3227
private static final String EQUIPMENT_FIELD_NAME = "equipment";
3328

3429
protected boolean fromStaticId;
3530
protected String staticId;
3631
protected T equipment;
3732
private final String equipmentType;
3833
private final String fieldName;
39-
private final EquipmentPredicate<T> equipmentPredicate;
4034

41-
public BuilderEquipment(String equipmentType, String fieldName, EquipmentPredicate<T> equipmentPredicate) {
35+
public BuilderEquipment(String equipmentType, String fieldName) {
4236
this.equipmentType = equipmentType;
4337
this.fieldName = fieldName;
44-
this.equipmentPredicate = equipmentPredicate;
4538
}
4639

47-
public BuilderEquipment(String equipmentType, EquipmentPredicate<T> equipmentPredicate) {
48-
this(equipmentType, DEFAULT_FIELD_NAME, equipmentPredicate);
40+
public BuilderEquipment(IdentifiableType identifiableType, String fieldName) {
41+
this.equipmentType = identifiableType.toString();
42+
this.fieldName = fieldName;
4943
}
5044

51-
public BuilderEquipment(String equipmentType, String fieldName) {
52-
this(equipmentType, fieldName, (eq, f, r) -> true);
45+
public BuilderEquipment(IdentifiableType identifiableType) {
46+
this(identifiableType, DEFAULT_FIELD_NAME);
5347
}
5448

5549
public BuilderEquipment(String equipmentType) {
5650
this(equipmentType, DEFAULT_FIELD_NAME);
5751
}
5852

59-
public BuilderEquipment(IdentifiableType identifiableType) {
60-
this(identifiableType.toString());
61-
}
62-
63-
public BuilderEquipment(IdentifiableType identifiableType, String fieldName) {
64-
this(identifiableType.toString(), fieldName);
65-
}
66-
6753
public void addEquipment(String equipmentId, Function<String, T> equipmentSupplier) {
6854
fromStaticId = true;
6955
staticId = equipmentId;
7056
equipment = equipmentSupplier.apply(staticId);
7157
}
7258

73-
public void addEquipment(T equipment, Network network) {
59+
public void addEquipment(T equipment, Predicate<T> equipmentChecker) {
7460
fromStaticId = false;
7561
staticId = equipment.getId();
76-
this.equipment = Objects.equals(network, equipment.getNetwork()) ? equipment : null;
62+
if (equipmentChecker.test(equipment)) {
63+
this.equipment = equipment;
64+
}
7765
}
7866

7967
public boolean checkEquipmentData(ReportNode reportNode) {
@@ -88,7 +76,7 @@ public boolean checkEquipmentData(ReportNode reportNode) {
8876
}
8977
return false;
9078
}
91-
return equipmentPredicate.test(equipment, fieldName, reportNode);
79+
return true;
9280
}
9381

9482
public String getStaticId() {
@@ -106,4 +94,8 @@ public T getEquipment() {
10694
public boolean hasEquipment() {
10795
return equipment != null;
10896
}
97+
98+
public String getFieldName() {
99+
return fieldName;
100+
}
109101
}

dynawo-simulation/src/main/java/com/powsybl/dynawo/builders/BuilderEquipmentsList.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public class BuilderEquipmentsList<T extends Identifiable<?>> {
2727
private final boolean missingIdsHasDynamicIds;
2828
protected List<String> missingEquipmentIds = new ArrayList<>();
2929
protected List<T> equipments = new ArrayList<>();
30-
private final BuilderEquipment.EquipmentPredicate<T> equipmentPredicate;
30+
private final BuildersUtil.EquipmentPredicate<T> equipmentPredicate;
3131

3232
public BuilderEquipmentsList(IdentifiableType identifiableType, String fieldName) {
3333
this(identifiableType.toString(), fieldName, false);
@@ -42,7 +42,7 @@ public BuilderEquipmentsList(String equipmentType, String fieldName, boolean mis
4242
}
4343

4444
public BuilderEquipmentsList(String equipmentType, String fieldName, boolean missingIdsHasDynamicIds,
45-
BuilderEquipment.EquipmentPredicate<T> equipmentPredicate) {
45+
BuildersUtil.EquipmentPredicate<T> equipmentPredicate) {
4646
this.equipmentType = equipmentType;
4747
this.fieldName = fieldName;
4848
this.missingIdsHasDynamicIds = missingIdsHasDynamicIds;

dynawo-simulation/src/main/java/com/powsybl/dynawo/builders/BuilderIdListEquipmentList.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
*/
1919
public class BuilderIdListEquipmentList<T extends Identifiable<?>> extends BuilderEquipmentsList<T> {
2020

21-
public BuilderIdListEquipmentList(String equipmentType, String fieldName, BuilderEquipment.EquipmentPredicate<T> equipmentPredicate) {
21+
public BuilderIdListEquipmentList(String equipmentType, String fieldName, BuildersUtil.EquipmentPredicate<T> equipmentPredicate) {
2222
super(equipmentType, fieldName, false, equipmentPredicate);
2323
}
2424

dynawo-simulation/src/main/java/com/powsybl/dynawo/builders/BuilderReports.java

+21
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import com.powsybl.commons.report.ReportNode;
1111
import com.powsybl.commons.report.TypedValue;
12+
import com.powsybl.iidm.network.HvdcConverterStation;
1213
import com.powsybl.iidm.network.IdentifiableType;
1314

1415
/**
@@ -151,6 +152,26 @@ public static void reportFieldConflict(ReportNode reportNode, String firstFieldN
151152
.add();
152153
}
153154

155+
public static void reportWrongHvdcType(ReportNode reportNode, String fieldName, String staticId,
156+
HvdcConverterStation.HvdcType hvdcType) {
157+
reportNode.newReportNode()
158+
.withMessageTemplate("dynawo.dynasim.wrongHvdcType")
159+
.withUntypedValue("type", hvdcType.toString())
160+
.withUntypedValue(FIELD_NAME, fieldName)
161+
.withUntypedValue(STATIC_ID, staticId)
162+
.withSeverity(TypedValue.WARN_SEVERITY)
163+
.add();
164+
}
165+
166+
public static void reportFictitiousEquipment(ReportNode reportNode, String fieldName, String staticId) {
167+
reportNode.newReportNode()
168+
.withMessageTemplate("dynawo.dynasim.fictitiousEquipment")
169+
.withUntypedValue(FIELD_NAME, fieldName)
170+
.withUntypedValue(STATIC_ID, staticId)
171+
.withSeverity(TypedValue.WARN_SEVERITY)
172+
.add();
173+
}
174+
154175
public static void reportNotEnergized(ReportNode reportNode, String fieldName, String staticId) {
155176
reportNode.newReportNode()
156177
.withMessageTemplate("dynawo.dynasim.notEnergized")

dynawo-simulation/src/main/java/com/powsybl/dynawo/builders/BuildersUtil.java

+21
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
*/
88
package com.powsybl.dynawo.builders;
99

10+
import com.powsybl.commons.report.ReportNode;
1011
import com.powsybl.iidm.network.*;
1112

1213
import static com.powsybl.dynawo.models.utils.EnergizedUtils.isEnergized;
@@ -18,6 +19,26 @@ public final class BuildersUtil {
1819

1920
public static final String MEASUREMENT_POINT_TYPE = IdentifiableType.BUS + "/" + IdentifiableType.BUSBAR_SECTION;
2021

22+
/**
23+
* Verifies the ActionConnectionPoint (bus or busbar section) is energized and in main connected component
24+
*/
25+
public static final EquipmentPredicate<Identifiable<?>> IS_ACTION_CONNECTION_POINT_ENERGIZED = (eq, f, r) -> {
26+
boolean isEnergized = switch (eq.getType()) {
27+
case BUS -> isEnergized((Bus) eq);
28+
case BUSBAR_SECTION -> isEnergized((BusbarSection) eq);
29+
default -> throw new UnsupportedOperationException("Only bus and bus bar section are supported");
30+
};
31+
if (!isEnergized) {
32+
BuilderReports.reportNotEnergized(r, f, eq.getId());
33+
}
34+
return isEnergized;
35+
};
36+
37+
@FunctionalInterface
38+
public interface EquipmentPredicate<T> {
39+
boolean test(T equipment, String fieldName, ReportNode reportNode);
40+
}
41+
2142
private BuildersUtil() {
2243
}
2344

dynawo-simulation/src/main/java/com/powsybl/dynawo/models/automationsystems/TapChangerBlockingAutomationSystemBuilder.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
import java.util.*;
1616

17-
import static com.powsybl.dynawo.builders.BuildersUtil.IS_ENERGIZED;
17+
import static com.powsybl.dynawo.builders.BuildersUtil.IS_ACTION_CONNECTION_POINT_ENERGIZED;
1818
import static com.powsybl.dynawo.builders.BuildersUtil.MEASUREMENT_POINT_TYPE;
1919

2020
/**
@@ -70,7 +70,7 @@ public static Collection<ModelInfo> getSupportedModelInfos(DynawoVersion dynawoV
7070
protected TapChangerBlockingAutomationSystemBuilder(Network network, ModelConfig modelConfig, ReportNode reportNode) {
7171
super(network, modelConfig, reportNode);
7272
tapChangerEquipments = new BuilderEquipmentsList<>(TAP_CHANGER_TYPE, TRANSFORMER_FIELD, true);
73-
uMeasurementPoints = new BuilderIdListEquipmentList<>(MEASUREMENT_POINT_TYPE, U_MEASUREMENTS_FIELD, IS_ENERGIZED);
73+
uMeasurementPoints = new BuilderIdListEquipmentList<>(MEASUREMENT_POINT_TYPE, U_MEASUREMENTS_FIELD, IS_ACTION_CONNECTION_POINT_ENERGIZED);
7474
}
7575

7676
public TapChangerBlockingAutomationSystemBuilder transformers(String staticId) {

dynawo-simulation/src/main/java/com/powsybl/dynawo/models/hvdc/AbstractHvdcBuilder.java

+5
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ public R dangling(TwoSides danglingSide) {
4040
return self();
4141
}
4242

43+
@Override
44+
protected HvdcLine findEquipment(String staticId) {
45+
return network.getHvdcLine(staticId);
46+
}
47+
4348
@Override
4449
protected void checkData() {
4550
super.checkData();

dynawo-simulation/src/main/java/com/powsybl/dynawo/models/hvdc/HvdcPBuilder.java

-6
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import com.powsybl.commons.report.ReportNode;
1111
import com.powsybl.dynawo.builders.*;
1212
import com.powsybl.dynawo.commons.DynawoVersion;
13-
import com.powsybl.iidm.network.HvdcLine;
1413
import com.powsybl.iidm.network.IdentifiableType;
1514
import com.powsybl.iidm.network.Network;
1615

@@ -65,11 +64,6 @@ protected HvdcPBuilder(Network network, ModelConfig modelConfig, ReportNode repo
6564
super(network, modelConfig, IdentifiableType.HVDC_LINE, reportNode, P_NAME_HANDLER);
6665
}
6766

68-
@Override
69-
protected HvdcLine findEquipment(String staticId) {
70-
return network.getHvdcLine(staticId);
71-
}
72-
7367
@Override
7468
protected HvdcPBuilder self() {
7569
return this;

dynawo-simulation/src/main/java/com/powsybl/dynawo/models/hvdc/HvdcVscBuilder.java

+8-6
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import com.powsybl.iidm.network.*;
1414

1515
import java.util.Collection;
16-
import java.util.function.Predicate;
1716

1817
/**
1918
* @author Laurent Issertial {@literal <laurent.issertial at rte-france.com>}
@@ -23,7 +22,6 @@ public class HvdcVscBuilder extends AbstractHvdcBuilder<HvdcVscBuilder> {
2322
public static final String CATEGORY = "HVDC_VSC";
2423
private static final ModelConfigs MODEL_CONFIGS = ModelConfigsHandler.getInstance().getModelConfigs(CATEGORY);
2524
private static final HvdcVarNameHandler VSC_NAME_HANDLER = new VscVarNameHandler();
26-
private static final Predicate<HvdcLine> IS_VSC = eq -> HvdcConverterStation.HvdcType.VSC == eq.getConverterStation1().getHvdcType();
2725

2826
public static HvdcVscBuilder of(Network network) {
2927
return of(network, ReportNode.NO_OP);
@@ -63,13 +61,17 @@ public static Collection<ModelInfo> getSupportedModelInfos(DynawoVersion dynawoV
6361

6462
protected HvdcVscBuilder(Network network, ModelConfig modelConfig, ReportNode reportNode) {
6563
super(network, modelConfig, "VSC " + IdentifiableType.HVDC_LINE, reportNode, VSC_NAME_HANDLER);
66-
addEquipmentPredicate(IS_VSC);
6764
}
6865

6966
@Override
70-
protected HvdcLine findEquipment(String staticId) {
71-
HvdcLine line = network.getHvdcLine(staticId);
72-
return line != null && IS_VSC.test(line) ? line : null;
67+
protected void checkData() {
68+
super.checkData();
69+
if (builderEquipment.hasEquipment() &&
70+
HvdcConverterStation.HvdcType.VSC != getEquipment().getConverterStation1().getHvdcType()) {
71+
BuilderReports.reportWrongHvdcType(reportNode, builderEquipment.getFieldName(), getModelId(),
72+
HvdcConverterStation.HvdcType.VSC);
73+
isInstantiable = false;
74+
}
7375
}
7476

7577
@Override

dynawo-simulation/src/main/java/com/powsybl/dynawo/models/loads/AbstractLoadModelBuilder.java

+10-10
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010
import com.powsybl.commons.report.ReportNode;
1111
import com.powsybl.dynawo.builders.AbstractEquipmentModelBuilder;
12-
import com.powsybl.dynawo.builders.BuilderEquipment;
1312
import com.powsybl.dynawo.builders.BuilderReports;
1413
import com.powsybl.dynawo.builders.ModelConfig;
1514
import com.powsybl.iidm.network.IdentifiableType;
@@ -21,20 +20,21 @@
2120
*/
2221
public abstract class AbstractLoadModelBuilder<R extends AbstractEquipmentModelBuilder<Load, R>> extends AbstractEquipmentModelBuilder<Load, R> {
2322

24-
private static final BuilderEquipment.EquipmentPredicate<Load> IS_NOT_FICTITIOUS = (eq, f, r) -> {
25-
if (eq.isFictitious()) {
26-
BuilderReports.reportFictitiousEquipment(r, f, eq.getId());
27-
return false;
28-
}
29-
return true;
30-
};
31-
3223
protected AbstractLoadModelBuilder(Network network, ModelConfig modelConfig, ReportNode reportNode) {
33-
super(network, modelConfig, IdentifiableType.LOAD.toString(), IS_NOT_FICTITIOUS, reportNode);
24+
super(network, modelConfig, IdentifiableType.LOAD, reportNode);
3425
}
3526

3627
@Override
3728
protected Load findEquipment(String staticId) {
3829
return network.getLoad(staticId);
3930
}
31+
32+
@Override
33+
protected void checkData() {
34+
super.checkData();
35+
if (builderEquipment.hasEquipment() && getEquipment().isFictitious()) {
36+
BuilderReports.reportFictitiousEquipment(reportNode, builderEquipment.getFieldName(), getModelId());
37+
isInstantiable = false;
38+
}
39+
}
4040
}

0 commit comments

Comments
 (0)