From a614bc47679e4a0f732653119a274865c7538579 Mon Sep 17 00:00:00 2001 From: PRABAKARAN Sylvestre Date: Tue, 3 Feb 2026 15:17:39 +0100 Subject: [PATCH 01/10] Add hasFictitiousP0() and hasFictitiousQ0() Signed-off-by: PRABAKARAN Sylvestre --- .../com/powsybl/iidm/network/VoltageLevel.java | 8 ++++++++ .../network/impl/BusBreakerTopologyModel.java | 11 +++++++++++ .../iidm/network/impl/CalculatedBusImpl.java | 6 ++++++ .../network/impl/NodeBreakerTopologyModel.java | 15 +++++++++++++++ 4 files changed, 40 insertions(+) diff --git a/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/VoltageLevel.java b/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/VoltageLevel.java index b5561cc0d2b..028052594a1 100644 --- a/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/VoltageLevel.java +++ b/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/VoltageLevel.java @@ -400,6 +400,10 @@ public interface VoltageLevel extends Container { */ interface NodeBreakerView { + default boolean hasFictitiousP0() { + return false; + } + /** * Returns the fictitious active power injection to the node if set, or 0. The value is in MW and uses the load sign convention (a positive value has the same effect as a load connected to the node) * A fictitious injection is meant to be considered as a load by simulators or exporters. It is typically used to represent the remainder of a state estimator. @@ -421,6 +425,10 @@ default NodeBreakerView setFictitiousP0(int node, double p0) { return this; } + default boolean hasFictitiousQ0() { + return false; + } + /** * Returns the fictitious reactive power injection to the node if set, or 0. The value is in MVar and uses the load sign convention (a positive value has the same effect as a load connected to the node) * A fictitious injection is meant to be considered as a load by simulators or exporters. It is typically used to represent the remainder of a state estimator. diff --git a/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/BusBreakerTopologyModel.java b/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/BusBreakerTopologyModel.java index dabc6fafa03..85644bcd7f5 100644 --- a/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/BusBreakerTopologyModel.java +++ b/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/BusBreakerTopologyModel.java @@ -389,6 +389,12 @@ static PowsyblException createNotSupportedBusBreakerTopologyException() { } private final VoltageLevelExt.NodeBreakerViewExt nodeBreakerView = new VoltageLevelExt.NodeBreakerViewExt() { + + @Override + public boolean hasFictitiousP0() { + throw createNotSupportedBusBreakerTopologyException(); + } + @Override public double getFictitiousP0(int node) { throw createNotSupportedBusBreakerTopologyException(); @@ -399,6 +405,11 @@ public VoltageLevel.NodeBreakerView setFictitiousP0(int node, double p0) { throw createNotSupportedBusBreakerTopologyException(); } + @Override + public boolean hasFictitiousQ0() { + throw createNotSupportedBusBreakerTopologyException(); + } + @Override public double getFictitiousQ0(int node) { throw createNotSupportedBusBreakerTopologyException(); diff --git a/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/CalculatedBusImpl.java b/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/CalculatedBusImpl.java index 60907282a5b..9b72fb2daee 100644 --- a/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/CalculatedBusImpl.java +++ b/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/CalculatedBusImpl.java @@ -146,6 +146,9 @@ public double getQ() { @Override public double getFictitiousP0() { checkValidity(); + if (!voltageLevel.getNodeBreakerView().hasFictitiousP0()) { + return 0.0; + } return Networks.getNodes(id, voltageLevel, getBusFromTerminal) .mapToDouble(n -> voltageLevel.getNodeBreakerView().getFictitiousP0(n)) .reduce(0.0, Double::sum); @@ -165,6 +168,9 @@ public Bus setFictitiousP0(double p0) { @Override public double getFictitiousQ0() { checkValidity(); + if (!voltageLevel.getNodeBreakerView().hasFictitiousQ0()) { + return 0.0; + } return Networks.getNodes(id, voltageLevel, getBusFromTerminal) .mapToDouble(n -> voltageLevel.getNodeBreakerView().getFictitiousQ0(n)) .reduce(0.0, Double::sum); diff --git a/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/NodeBreakerTopologyModel.java b/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/NodeBreakerTopologyModel.java index ba1360ac5dd..1424e3c3cb8 100644 --- a/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/NodeBreakerTopologyModel.java +++ b/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/NodeBreakerTopologyModel.java @@ -28,6 +28,7 @@ import gnu.trove.set.TIntSet; import gnu.trove.set.hash.TIntHashSet; import org.anarres.graphviz.builder.*; +import org.apache.commons.lang3.mutable.MutableBoolean; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -642,9 +643,16 @@ void removeSwitchFromTopology(String switchId, boolean notify) { private final VoltageLevelExt.NodeBreakerViewExt nodeBreakerView = new VoltageLevelExt.NodeBreakerViewExt() { + private final MutableBoolean hasFictitiousP0 = new MutableBoolean(false); + private final MutableBoolean hasFictitiousQ0 = new MutableBoolean(false); private final TIntObjectMap fictitiousP0ByNode = TCollections.synchronizedMap(new TIntObjectHashMap<>()); private final TIntObjectMap fictitiousQ0ByNode = TCollections.synchronizedMap(new TIntObjectHashMap<>()); + @Override + public boolean hasFictitiousP0() { + return hasFictitiousP0.get(); + } + @Override public double getFictitiousP0(int node) { TDoubleArrayList fictP0 = fictitiousP0ByNode.get(node); @@ -659,6 +667,7 @@ public VoltageLevel.NodeBreakerView setFictitiousP0(int node, double p0) { if (Double.isNaN(p0)) { throw new ValidationException(voltageLevel, "undefined value cannot be set as fictitious p0"); } + hasFictitiousP0.setTrue(); TDoubleArrayList p0ByVariant = fictitiousP0ByNode.get(node); if (p0ByVariant == null) { int variantArraySize = getNetwork().getVariantManager().getVariantArraySize(); @@ -684,6 +693,11 @@ public VoltageLevel.NodeBreakerView setFictitiousP0(int node, double p0) { return this; } + @Override + public boolean hasFictitiousQ0() { + return hasFictitiousP0.get(); + } + @Override public double getFictitiousQ0(int node) { TDoubleArrayList fictQ0 = fictitiousQ0ByNode.get(node); @@ -698,6 +712,7 @@ public VoltageLevel.NodeBreakerView setFictitiousQ0(int node, double q0) { if (Double.isNaN(q0)) { throw new ValidationException(voltageLevel, "undefined value cannot be set as fictitious q0"); } + hasFictitiousQ0.setTrue(); TDoubleArrayList q0ByVariant = fictitiousQ0ByNode.get(node); if (q0ByVariant == null) { int variantArraySize = getNetwork().getVariantManager().getVariantArraySize(); From 26148a3cdb78b407590d30e9d39d93735ab1c9c9 Mon Sep 17 00:00:00 2001 From: PRABAKARAN Sylvestre Date: Tue, 3 Feb 2026 16:01:19 +0100 Subject: [PATCH 02/10] Remarks from review Signed-off-by: PRABAKARAN Sylvestre --- .../impl/NodeBreakerTopologyModel.java | 33 +++++++++++++++---- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/NodeBreakerTopologyModel.java b/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/NodeBreakerTopologyModel.java index 1424e3c3cb8..5568627278c 100644 --- a/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/NodeBreakerTopologyModel.java +++ b/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/NodeBreakerTopologyModel.java @@ -28,7 +28,6 @@ import gnu.trove.set.TIntSet; import gnu.trove.set.hash.TIntHashSet; import org.anarres.graphviz.builder.*; -import org.apache.commons.lang3.mutable.MutableBoolean; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -643,14 +642,24 @@ void removeSwitchFromTopology(String switchId, boolean notify) { private final VoltageLevelExt.NodeBreakerViewExt nodeBreakerView = new VoltageLevelExt.NodeBreakerViewExt() { - private final MutableBoolean hasFictitiousP0 = new MutableBoolean(false); - private final MutableBoolean hasFictitiousQ0 = new MutableBoolean(false); private final TIntObjectMap fictitiousP0ByNode = TCollections.synchronizedMap(new TIntObjectHashMap<>()); private final TIntObjectMap fictitiousQ0ByNode = TCollections.synchronizedMap(new TIntObjectHashMap<>()); @Override public boolean hasFictitiousP0() { - return hasFictitiousP0.get(); + if (fictitiousP0ByNode.isEmpty()) { + return false; + } + int variantIndex = getNetwork().getVariantIndex(); + for (int i = 0; i < fictitiousP0ByNode.size(); i++) { + TDoubleArrayList p0ByVariant = fictitiousP0ByNode.get(i); + if (p0ByVariant != null) { + if (p0ByVariant.get(variantIndex) != 0.0) { + return true; + } + } + } + return false; } @Override @@ -667,7 +676,6 @@ public VoltageLevel.NodeBreakerView setFictitiousP0(int node, double p0) { if (Double.isNaN(p0)) { throw new ValidationException(voltageLevel, "undefined value cannot be set as fictitious p0"); } - hasFictitiousP0.setTrue(); TDoubleArrayList p0ByVariant = fictitiousP0ByNode.get(node); if (p0ByVariant == null) { int variantArraySize = getNetwork().getVariantManager().getVariantArraySize(); @@ -695,7 +703,19 @@ public VoltageLevel.NodeBreakerView setFictitiousP0(int node, double p0) { @Override public boolean hasFictitiousQ0() { - return hasFictitiousP0.get(); + if (fictitiousQ0ByNode.isEmpty()) { + return false; + } + int variantIndex = getNetwork().getVariantIndex(); + for (int i = 0; i < fictitiousQ0ByNode.size(); i++) { + TDoubleArrayList q0ByVariant = fictitiousQ0ByNode.get(i); + if (q0ByVariant != null) { + if (q0ByVariant.get(variantIndex) != 0.0) { + return true; + } + } + } + return false; } @Override @@ -712,7 +732,6 @@ public VoltageLevel.NodeBreakerView setFictitiousQ0(int node, double q0) { if (Double.isNaN(q0)) { throw new ValidationException(voltageLevel, "undefined value cannot be set as fictitious q0"); } - hasFictitiousQ0.setTrue(); TDoubleArrayList q0ByVariant = fictitiousQ0ByNode.get(node); if (q0ByVariant == null) { int variantArraySize = getNetwork().getVariantManager().getVariantArraySize(); From 9f0777d6bcd96255c4af843da2bb316cb81b1f0c Mon Sep 17 00:00:00 2001 From: PRABAKARAN Sylvestre Date: Tue, 3 Feb 2026 16:23:57 +0100 Subject: [PATCH 03/10] Review from remarks and comments Signed-off-by: PRABAKARAN Sylvestre --- .../powsybl/iidm/network/VoltageLevel.java | 6 ++++++ .../impl/NodeBreakerTopologyModel.java | 20 ++++++++----------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/VoltageLevel.java b/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/VoltageLevel.java index 028052594a1..3760bb5beb5 100644 --- a/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/VoltageLevel.java +++ b/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/VoltageLevel.java @@ -400,6 +400,9 @@ public interface VoltageLevel extends Container { */ interface NodeBreakerView { + /** + * Returns true if any node has a non-zero fictitious active power injection. + */ default boolean hasFictitiousP0() { return false; } @@ -425,6 +428,9 @@ default NodeBreakerView setFictitiousP0(int node, double p0) { return this; } + /** + * Returns true if any node has a non-zero fictitious reactive power injection. + */ default boolean hasFictitiousQ0() { return false; } diff --git a/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/NodeBreakerTopologyModel.java b/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/NodeBreakerTopologyModel.java index 5568627278c..abc2e178172 100644 --- a/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/NodeBreakerTopologyModel.java +++ b/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/NodeBreakerTopologyModel.java @@ -651,12 +651,10 @@ public boolean hasFictitiousP0() { return false; } int variantIndex = getNetwork().getVariantIndex(); - for (int i = 0; i < fictitiousP0ByNode.size(); i++) { - TDoubleArrayList p0ByVariant = fictitiousP0ByNode.get(i); - if (p0ByVariant != null) { - if (p0ByVariant.get(variantIndex) != 0.0) { - return true; - } + for (int node : fictitiousP0ByNode.keys()) { + TDoubleArrayList p0ByVariant = fictitiousP0ByNode.get(node); + if (p0ByVariant != null && p0ByVariant.get(variantIndex) != 0.0) { + return true; } } return false; @@ -707,12 +705,10 @@ public boolean hasFictitiousQ0() { return false; } int variantIndex = getNetwork().getVariantIndex(); - for (int i = 0; i < fictitiousQ0ByNode.size(); i++) { - TDoubleArrayList q0ByVariant = fictitiousQ0ByNode.get(i); - if (q0ByVariant != null) { - if (q0ByVariant.get(variantIndex) != 0.0) { - return true; - } + for (int node : fictitiousQ0ByNode.keys()) { + TDoubleArrayList p0ByVariant = fictitiousQ0ByNode.get(node); + if (p0ByVariant != null && p0ByVariant.get(variantIndex) != 0.0) { + return true; } } return false; From 5a668ccc4ff6b23d349ba1d31f32435e2f6fa1e2 Mon Sep 17 00:00:00 2001 From: PRABAKARAN Sylvestre Date: Tue, 3 Feb 2026 16:40:21 +0100 Subject: [PATCH 04/10] Move from VoltageLevel API to VoltageLevelExt Signed-off-by: PRABAKARAN Sylvestre --- .../com/powsybl/iidm/network/VoltageLevel.java | 14 -------------- .../iidm/network/impl/CalculatedBusImpl.java | 2 +- .../powsybl/iidm/network/impl/VoltageLevelExt.java | 14 ++++++++++++++ 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/VoltageLevel.java b/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/VoltageLevel.java index 3760bb5beb5..b5561cc0d2b 100644 --- a/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/VoltageLevel.java +++ b/iidm/iidm-api/src/main/java/com/powsybl/iidm/network/VoltageLevel.java @@ -400,13 +400,6 @@ public interface VoltageLevel extends Container { */ interface NodeBreakerView { - /** - * Returns true if any node has a non-zero fictitious active power injection. - */ - default boolean hasFictitiousP0() { - return false; - } - /** * Returns the fictitious active power injection to the node if set, or 0. The value is in MW and uses the load sign convention (a positive value has the same effect as a load connected to the node) * A fictitious injection is meant to be considered as a load by simulators or exporters. It is typically used to represent the remainder of a state estimator. @@ -428,13 +421,6 @@ default NodeBreakerView setFictitiousP0(int node, double p0) { return this; } - /** - * Returns true if any node has a non-zero fictitious reactive power injection. - */ - default boolean hasFictitiousQ0() { - return false; - } - /** * Returns the fictitious reactive power injection to the node if set, or 0. The value is in MVar and uses the load sign convention (a positive value has the same effect as a load connected to the node) * A fictitious injection is meant to be considered as a load by simulators or exporters. It is typically used to represent the remainder of a state estimator. diff --git a/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/CalculatedBusImpl.java b/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/CalculatedBusImpl.java index 9b72fb2daee..93ada2b84a0 100644 --- a/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/CalculatedBusImpl.java +++ b/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/CalculatedBusImpl.java @@ -146,7 +146,7 @@ public double getQ() { @Override public double getFictitiousP0() { checkValidity(); - if (!voltageLevel.getNodeBreakerView().hasFictitiousP0()) { + if (voltageLevel.getNodeBreakerView().hasFictitiousP0()) { return 0.0; } return Networks.getNodes(id, voltageLevel, getBusFromTerminal) diff --git a/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/VoltageLevelExt.java b/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/VoltageLevelExt.java index 7c9d1636688..735aad9a24d 100644 --- a/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/VoltageLevelExt.java +++ b/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/VoltageLevelExt.java @@ -19,6 +19,20 @@ interface VoltageLevelExt extends VoltageLevel, MultiVariantObject, Validable { interface NodeBreakerViewExt extends NodeBreakerView { + /** + * Returns true if any node has a non-zero fictitious active power injection. + */ + default boolean hasFictitiousP0() { + return false; + } + + /** + * Returns true if any node has a non-zero fictitious reactive power injection. + */ + default boolean hasFictitiousQ0() { + return false; + } + } interface BusBreakerViewExt extends BusBreakerView { From 6d2143261ee971f3f98841772a88b5246a3c52a7 Mon Sep 17 00:00:00 2001 From: PRABAKARAN Sylvestre Date: Tue, 3 Feb 2026 16:47:46 +0100 Subject: [PATCH 05/10] Fix error Signed-off-by: PRABAKARAN Sylvestre --- .../java/com/powsybl/iidm/network/impl/CalculatedBusImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/CalculatedBusImpl.java b/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/CalculatedBusImpl.java index 93ada2b84a0..9b72fb2daee 100644 --- a/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/CalculatedBusImpl.java +++ b/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/CalculatedBusImpl.java @@ -146,7 +146,7 @@ public double getQ() { @Override public double getFictitiousP0() { checkValidity(); - if (voltageLevel.getNodeBreakerView().hasFictitiousP0()) { + if (!voltageLevel.getNodeBreakerView().hasFictitiousP0()) { return 0.0; } return Networks.getNodes(id, voltageLevel, getBusFromTerminal) From bac949d42c370c89da062a2483615236662403b4 Mon Sep 17 00:00:00 2001 From: PRABAKARAN Sylvestre Date: Tue, 3 Feb 2026 17:09:39 +0100 Subject: [PATCH 06/10] Remove duplication Signed-off-by: PRABAKARAN Sylvestre --- .../impl/NodeBreakerTopologyModel.java | 28 ++++++++----------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/NodeBreakerTopologyModel.java b/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/NodeBreakerTopologyModel.java index abc2e178172..8f3ac5f9b3d 100644 --- a/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/NodeBreakerTopologyModel.java +++ b/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/NodeBreakerTopologyModel.java @@ -645,21 +645,25 @@ void removeSwitchFromTopology(String switchId, boolean notify) { private final TIntObjectMap fictitiousP0ByNode = TCollections.synchronizedMap(new TIntObjectHashMap<>()); private final TIntObjectMap fictitiousQ0ByNode = TCollections.synchronizedMap(new TIntObjectHashMap<>()); - @Override - public boolean hasFictitiousP0() { - if (fictitiousP0ByNode.isEmpty()) { + private boolean hasFictitiousInjection(TIntObjectMap fictitiousInjectionsByNode) { + if (fictitiousInjectionsByNode.isEmpty()) { return false; } int variantIndex = getNetwork().getVariantIndex(); - for (int node : fictitiousP0ByNode.keys()) { - TDoubleArrayList p0ByVariant = fictitiousP0ByNode.get(node); - if (p0ByVariant != null && p0ByVariant.get(variantIndex) != 0.0) { + for (int node : fictitiousInjectionsByNode.keys()) { + TDoubleArrayList fictitiousInjectionByVariant = fictitiousInjectionsByNode.get(node); + if (fictitiousInjectionByVariant != null && fictitiousInjectionByVariant.get(variantIndex) != 0.0) { return true; } } return false; } + @Override + public boolean hasFictitiousP0() { + return hasFictitiousInjection(fictitiousP0ByNode); + } + @Override public double getFictitiousP0(int node) { TDoubleArrayList fictP0 = fictitiousP0ByNode.get(node); @@ -701,17 +705,7 @@ public VoltageLevel.NodeBreakerView setFictitiousP0(int node, double p0) { @Override public boolean hasFictitiousQ0() { - if (fictitiousQ0ByNode.isEmpty()) { - return false; - } - int variantIndex = getNetwork().getVariantIndex(); - for (int node : fictitiousQ0ByNode.keys()) { - TDoubleArrayList p0ByVariant = fictitiousQ0ByNode.get(node); - if (p0ByVariant != null && p0ByVariant.get(variantIndex) != 0.0) { - return true; - } - } - return false; + return hasFictitiousInjection(fictitiousQ0ByNode); } @Override From 4659b310ec5f96db1cf6952eee7ad8abe4f66d0d Mon Sep 17 00:00:00 2001 From: PRABAKARAN Sylvestre Date: Tue, 3 Feb 2026 17:24:20 +0100 Subject: [PATCH 07/10] remove default method Signed-off-by: PRABAKARAN Sylvestre --- .../com/powsybl/iidm/network/impl/VoltageLevelExt.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/VoltageLevelExt.java b/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/VoltageLevelExt.java index 735aad9a24d..4d2f8238094 100644 --- a/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/VoltageLevelExt.java +++ b/iidm/iidm-impl/src/main/java/com/powsybl/iidm/network/impl/VoltageLevelExt.java @@ -22,16 +22,12 @@ interface NodeBreakerViewExt extends NodeBreakerView { /** * Returns true if any node has a non-zero fictitious active power injection. */ - default boolean hasFictitiousP0() { - return false; - } + boolean hasFictitiousP0(); /** * Returns true if any node has a non-zero fictitious reactive power injection. */ - default boolean hasFictitiousQ0() { - return false; - } + boolean hasFictitiousQ0(); } From 8dab8bc7da3008573f20a801d4c039dbec3f4b69 Mon Sep 17 00:00:00 2001 From: PRABAKARAN Sylvestre Date: Tue, 3 Feb 2026 18:29:47 +0100 Subject: [PATCH 08/10] Add unit test Signed-off-by: PRABAKARAN Sylvestre --- .../NodeBreakerFictitiousInjectionTest.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 iidm/iidm-impl/src/test/java/com/powsybl/iidm/network/impl/NodeBreakerFictitiousInjectionTest.java diff --git a/iidm/iidm-impl/src/test/java/com/powsybl/iidm/network/impl/NodeBreakerFictitiousInjectionTest.java b/iidm/iidm-impl/src/test/java/com/powsybl/iidm/network/impl/NodeBreakerFictitiousInjectionTest.java new file mode 100644 index 00000000000..95e00867f83 --- /dev/null +++ b/iidm/iidm-impl/src/test/java/com/powsybl/iidm/network/impl/NodeBreakerFictitiousInjectionTest.java @@ -0,0 +1,26 @@ +package com.powsybl.iidm.network.impl; + +import com.powsybl.iidm.network.Bus; +import com.powsybl.iidm.network.Network; +import com.powsybl.iidm.network.test.NetworkTest1Factory; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class NodeBreakerFictitiousInjectionTest { + + @Test + void testHasFictitiousP0AndFictitiousQ0() { + Network network = NetworkTest1Factory.create(); + Bus bus = network.getVoltageLevel("voltageLevel1").getBusBreakerView().getBus("voltageLevel1_0"); + bus.setFictitiousP0(10); + bus.setFictitiousQ0(20); + assertTrue(((VoltageLevelImpl) network.getVoltageLevel("voltageLevel1")).getNodeBreakerView().hasFictitiousP0()); + assertTrue(((VoltageLevelImpl) network.getVoltageLevel("voltageLevel1")).getNodeBreakerView().hasFictitiousQ0()); + bus.setFictitiousP0(0.0); + bus.setFictitiousQ0(0.0); + assertFalse(((VoltageLevelImpl) network.getVoltageLevel("voltageLevel1")).getNodeBreakerView().hasFictitiousP0()); + assertFalse(((VoltageLevelImpl) network.getVoltageLevel("voltageLevel1")).getNodeBreakerView().hasFictitiousP0()); + } +} From 449e2c76816335e3aa1062ab594e186ab15bece7 Mon Sep 17 00:00:00 2001 From: PRABAKARAN Sylvestre Date: Tue, 3 Feb 2026 18:59:31 +0100 Subject: [PATCH 09/10] Add coverage Signed-off-by: PRABAKARAN Sylvestre --- .../NodeBreakerFictitiousInjectionTest.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/iidm/iidm-impl/src/test/java/com/powsybl/iidm/network/impl/NodeBreakerFictitiousInjectionTest.java b/iidm/iidm-impl/src/test/java/com/powsybl/iidm/network/impl/NodeBreakerFictitiousInjectionTest.java index 95e00867f83..ebbcb89f8b8 100644 --- a/iidm/iidm-impl/src/test/java/com/powsybl/iidm/network/impl/NodeBreakerFictitiousInjectionTest.java +++ b/iidm/iidm-impl/src/test/java/com/powsybl/iidm/network/impl/NodeBreakerFictitiousInjectionTest.java @@ -5,8 +5,7 @@ import com.powsybl.iidm.network.test.NetworkTest1Factory; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.*; public class NodeBreakerFictitiousInjectionTest { @@ -14,13 +13,20 @@ public class NodeBreakerFictitiousInjectionTest { void testHasFictitiousP0AndFictitiousQ0() { Network network = NetworkTest1Factory.create(); Bus bus = network.getVoltageLevel("voltageLevel1").getBusBreakerView().getBus("voltageLevel1_0"); + bus.setFictitiousP0(10); bus.setFictitiousQ0(20); - assertTrue(((VoltageLevelImpl) network.getVoltageLevel("voltageLevel1")).getNodeBreakerView().hasFictitiousP0()); - assertTrue(((VoltageLevelImpl) network.getVoltageLevel("voltageLevel1")).getNodeBreakerView().hasFictitiousQ0()); + VoltageLevelImpl vl = ((VoltageLevelImpl) network.getVoltageLevel("voltageLevel1")); + assertTrue(vl.getNodeBreakerView().hasFictitiousP0()); + assertTrue(vl.getNodeBreakerView().hasFictitiousQ0()); + assertEquals(10, bus.getFictitiousP0()); + assertEquals(20, bus.getFictitiousQ0()); + bus.setFictitiousP0(0.0); bus.setFictitiousQ0(0.0); - assertFalse(((VoltageLevelImpl) network.getVoltageLevel("voltageLevel1")).getNodeBreakerView().hasFictitiousP0()); - assertFalse(((VoltageLevelImpl) network.getVoltageLevel("voltageLevel1")).getNodeBreakerView().hasFictitiousP0()); + assertFalse(vl.getNodeBreakerView().hasFictitiousP0()); + assertFalse(vl.getNodeBreakerView().hasFictitiousQ0()); + assertEquals(0, bus.getFictitiousP0()); + assertEquals(0, bus.getFictitiousQ0()); } } From 9c956ec279e5278b55999e3da8494439ae6688d3 Mon Sep 17 00:00:00 2001 From: PRABAKARAN Sylvestre Date: Wed, 4 Feb 2026 10:24:53 +0100 Subject: [PATCH 10/10] Checkstyle Signed-off-by: PRABAKARAN Sylvestre --- .../iidm/network/impl/NodeBreakerFictitiousInjectionTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iidm/iidm-impl/src/test/java/com/powsybl/iidm/network/impl/NodeBreakerFictitiousInjectionTest.java b/iidm/iidm-impl/src/test/java/com/powsybl/iidm/network/impl/NodeBreakerFictitiousInjectionTest.java index ebbcb89f8b8..6d8a4fa0e38 100644 --- a/iidm/iidm-impl/src/test/java/com/powsybl/iidm/network/impl/NodeBreakerFictitiousInjectionTest.java +++ b/iidm/iidm-impl/src/test/java/com/powsybl/iidm/network/impl/NodeBreakerFictitiousInjectionTest.java @@ -16,7 +16,7 @@ void testHasFictitiousP0AndFictitiousQ0() { bus.setFictitiousP0(10); bus.setFictitiousQ0(20); - VoltageLevelImpl vl = ((VoltageLevelImpl) network.getVoltageLevel("voltageLevel1")); + VoltageLevelImpl vl = (VoltageLevelImpl) network.getVoltageLevel("voltageLevel1"); assertTrue(vl.getNodeBreakerView().hasFictitiousP0()); assertTrue(vl.getNodeBreakerView().hasFictitiousQ0()); assertEquals(10, bus.getFictitiousP0());