diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2ab797092..2f775f950 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -22,6 +22,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Create JavaDoc with java 17 instead of java 8
- Let JavDoc pass, if there are warnings **ATTENTION:** Should be removed, when JavaDoc is fixed! (cf. Issue [#494](https://github.com/ie3-institute/PowerSystemDataModel/issues/494))
+### Changed
+- BREAKING: Transformer's no load susceptance needs to be zero or negative to pass model validation [#378](https://github.com/ie3-institute/PowerSystemDataModel/issues/378)
+ - All input data sets for version < 3.0.0 need to be altered!
+
## [2.1.0] - 2022-01-05
### Added
diff --git a/gradle/scripts/tests.gradle b/gradle/scripts/tests.gradle
index 44f17c2e0..78732aa55 100644
--- a/gradle/scripts/tests.gradle
+++ b/gradle/scripts/tests.gradle
@@ -1,7 +1,11 @@
test {
useJUnitPlatform()
testLogging {
- events "skipped", "failed", "passed"
+ events "skipped", "failed"
+ }
+
+ testLogging {
+ exceptionFormat "Full"
}
}
diff --git a/src/main/java/edu/ie3/datamodel/utils/validation/ConnectorValidationUtils.java b/src/main/java/edu/ie3/datamodel/utils/validation/ConnectorValidationUtils.java
index 0a924a365..4a0c35379 100644
--- a/src/main/java/edu/ie3/datamodel/utils/validation/ConnectorValidationUtils.java
+++ b/src/main/java/edu/ie3/datamodel/utils/validation/ConnectorValidationUtils.java
@@ -124,7 +124,7 @@ private static void checkTransformer2W(Transformer2WInput transformer2W) {
* - rSc is greater 0 (short circuit resistance)
* - xSc is greater 0 (short circuit impedance)
* - gM is greater/equal to 0 (no load conductance)
- * - bM is greater/equal to 0 (no load susceptance)
+ * - bM is less/equal to 0 (no load susceptance)
* - sRated is greater 0 (rated apparent power)
* - vRatedA is greater 0 (rated voltage at higher voltage terminal)
* - vRatedB is greater 0 (rated voltage at lower voltage terminal)
@@ -139,10 +139,7 @@ protected static void checkTransformer2WType(Transformer2WTypeInput transformer2
checkNonNull(transformer2WType, "a two winding transformer type");
detectNegativeQuantities(
new Quantity>[] {
- transformer2WType.getgM(),
- transformer2WType.getbM(),
- transformer2WType.getdPhi(),
- transformer2WType.getrSc()
+ transformer2WType.getgM(), transformer2WType.getdPhi(), transformer2WType.getrSc()
},
transformer2WType);
detectZeroOrNegativeQuantities(
@@ -153,6 +150,7 @@ protected static void checkTransformer2WType(Transformer2WTypeInput transformer2
transformer2WType.getxSc()
},
transformer2WType);
+ detectPositiveQuantities(new Quantity>[] {transformer2WType.getbM()}, transformer2WType);
checkVoltageMagnitudeChangePerTapPosition(transformer2WType);
checkMinimumTapPositionIsLowerThanMaximumTapPosition(transformer2WType);
checkNeutralTapPositionLiesBetweenMinAndMaxTapPosition(transformer2WType);
@@ -193,7 +191,7 @@ private static void checkTransformer3W(Transformer3WInput transformer3W) {
* - rScA, rScB, rScC are greater 0 (short circuit resistance in branches A,B,C)
* - xScA, xScB, xScC are greater 0 (short circuit impedance in branches A,B,C)
* - gM is greater/equal to 0 (no load conductance)
- * - bM is greater/equal to 0 (no load susceptance)
+ * - bM is less/equal to 0 (no load susceptance)
* - sRatedA, sRatedB, sRatedC are greater 0 (rated apparent power in branches A,B,C)
* - vRatedA, vRatedB, vRatedC are greater 0 (rated voltage at higher node A,B,C)
* - dV is between 0% and 100% (voltage magnitude increase per tap position
@@ -206,9 +204,7 @@ private static void checkTransformer3W(Transformer3WInput transformer3W) {
protected static void checkTransformer3WType(Transformer3WTypeInput transformer3WType) {
checkNonNull(transformer3WType, "a three winding transformer type");
detectNegativeQuantities(
- new Quantity>[] {
- transformer3WType.getgM(), transformer3WType.getbM(), transformer3WType.getdPhi()
- },
+ new Quantity>[] {transformer3WType.getgM(), transformer3WType.getdPhi()},
transformer3WType);
detectZeroOrNegativeQuantities(
new Quantity>[] {
@@ -220,6 +216,7 @@ protected static void checkTransformer3WType(Transformer3WTypeInput transformer3
transformer3WType.getxScA(), transformer3WType.getxScB(), transformer3WType.getxScC()
},
transformer3WType);
+ detectPositiveQuantities(new Quantity>[] {transformer3WType.getbM()}, transformer3WType);
checkVoltageMagnitudeChangePerTapPosition(transformer3WType);
checkMinimumTapPositionIsLowerThanMaximumTapPosition(transformer3WType);
checkNeutralTapPositionLiesBetweenMinAndMaxTapPosition(transformer3WType);
diff --git a/src/main/java/edu/ie3/datamodel/utils/validation/ValidationUtils.java b/src/main/java/edu/ie3/datamodel/utils/validation/ValidationUtils.java
index e59cf8265..a0fbe3848 100644
--- a/src/main/java/edu/ie3/datamodel/utils/validation/ValidationUtils.java
+++ b/src/main/java/edu/ie3/datamodel/utils/validation/ValidationUtils.java
@@ -186,6 +186,17 @@ protected static void detectZeroOrNegativeQuantities(
detectMalformedQuantities(
quantities, entity, predicate, "The following quantities have to be positive");
}
+ /**
+ * Goes through the provided quantities and reports those, that have positive value via
+ *
+ * @param quantities Array of quantities to check
+ * @param entity Unique entity holding the malformed quantities
+ */
+ protected static void detectPositiveQuantities(Quantity>[] quantities, UniqueEntity entity) {
+ Predicate> predicate = quantity -> quantity.getValue().doubleValue() > 0d;
+ detectMalformedQuantities(
+ quantities, entity, predicate, "The following quantities have to be negative");
+ }
/**
* Goes through the provided quantities and reports those, that do fulfill the given predicate via
diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy
index b553f6477..e439fe380 100644
--- a/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy
+++ b/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy
@@ -472,7 +472,7 @@ class InputEntityProcessorTest extends Specification {
"xScB" : "0.08",
"xScC" : "0.003",
"gM" : "40000.0",
- "bM" : "1000.0",
+ "bM" : "-1000.0",
"dV" : "1.5",
"dPhi" : "0.0",
"tapNeutr": "0",
diff --git a/src/test/groovy/edu/ie3/test/common/GridTestData.groovy b/src/test/groovy/edu/ie3/test/common/GridTestData.groovy
index f784a7719..ebaa42ba6 100644
--- a/src/test/groovy/edu/ie3/test/common/GridTestData.groovy
+++ b/src/test/groovy/edu/ie3/test/common/GridTestData.groovy
@@ -134,7 +134,7 @@ class GridTestData {
Quantities.getQuantity(0.08d, IMPEDANCE),
Quantities.getQuantity(0.003d, IMPEDANCE),
Quantities.getQuantity(40000d, ADMITTANCE),
- Quantities.getQuantity(1000d, ADMITTANCE),
+ Quantities.getQuantity(-1000d, ADMITTANCE),
Quantities.getQuantity(1.5d, DV_TAP),
Quantities.getQuantity(0d, DPHI_TAP),
0,
diff --git a/src/test/resources/testGridFiles/types/transformer_3_w_type_input.csv b/src/test/resources/testGridFiles/types/transformer_3_w_type_input.csv
index bb078edac..86d1e5fb3 100644
--- a/src/test/resources/testGridFiles/types/transformer_3_w_type_input.csv
+++ b/src/test/resources/testGridFiles/types/transformer_3_w_type_input.csv
@@ -1,2 +1,2 @@
uuid,b_m,d_phi,d_v,g_m,id,r_sc_a,r_sc_b,r_sc_c,s_rated_a,s_rated_b,s_rated_c,tap_max,tap_min,tap_neutr,v_rated_a,v_rated_b,v_rated_c,x_sc_a,x_sc_b,x_sc_c
-5b0ee546-21fb-4a7f-a801-5dbd3d7bb356,1000.0,0.0,1.5,40000.0,HöS-HS-MS_1,0.3,0.025,8.0E-4,120000.0,60000.0,40000.0,10,-10,0,380.0,110.0,20.0,1.0,0.08,0.003
+5b0ee546-21fb-4a7f-a801-5dbd3d7bb356,-1000.0,0.0,1.5,40000.0,HöS-HS-MS_1,0.3,0.025,8.0E-4,120000.0,60000.0,40000.0,10,-10,0,380.0,110.0,20.0,1.0,0.08,0.003