From ad602a2b6ed7a41cc08678d1f3e6eeba20f94a90 Mon Sep 17 00:00:00 2001 From: Jerry Guo Date: Thu, 5 Jun 2025 09:27:58 +0200 Subject: [PATCH] core side Signed-off-by: Jerry Guo --- .../component/three_winding_transformer.hpp | 2 ++ .../power_grid_model/component/transformer.hpp | 5 +++-- .../component/transformer_utils.hpp | 5 +---- tests/cpp_unit_tests/test_transformer.cpp | 17 +++++++++++++++++ 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/component/three_winding_transformer.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/component/three_winding_transformer.hpp index 14b4efe2e2..04499f2ede 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/component/three_winding_transformer.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/component/three_winding_transformer.hpp @@ -119,6 +119,8 @@ class ThreeWindingTransformer : public Branch3 { constexpr IntS tap_min() const { return tap_min_; } constexpr IntS tap_max() const { return tap_max_; } constexpr IntS tap_nom() const { return tap_nom_; } + constexpr IntS clock_12() const { return clock_12_; } + constexpr IntS clock_13() const { return clock_13_; } // setter constexpr bool set_tap(IntS new_tap) { diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/component/transformer.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/component/transformer.hpp index 0be3c8c420..077127dee3 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/component/transformer.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/component/transformer.hpp @@ -63,8 +63,8 @@ class Transformer : public Branch { throw InvalidTransformerClock{id(), clock_}; } - // set clock to zero if it is 12 - clock_ = static_cast(clock_ % 12); + // handle periodic clock input -> in range [0, 11] + clock_ = static_cast((clock_ % 12 + 12) % 12); // check tap bounds tap_pos_ = tap_limit(tap_pos_); } @@ -82,6 +82,7 @@ class Transformer : public Branch { constexpr IntS tap_min() const { return tap_min_; } constexpr IntS tap_max() const { return tap_max_; } constexpr IntS tap_nom() const { return tap_nom_; } + constexpr IntS clock() const { return clock_; } // setter constexpr bool set_tap(IntS new_tap) { diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/component/transformer_utils.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/component/transformer_utils.hpp index d7f1a3d864..8e06450267 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/component/transformer_utils.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/component/transformer_utils.hpp @@ -45,7 +45,6 @@ constexpr double tap_adjust_impedance(double tap_pos, double tap_min, double tap constexpr bool is_valid_clock(IntS clock, WindingType winding_from, WindingType winding_to) { using enum WindingType; - bool const clock_in_range = 0 <= clock && clock <= 12; bool const clock_is_even = (clock % 2) == 0; bool const is_from_wye = winding_from == wye || winding_from == wye_n; @@ -53,9 +52,7 @@ constexpr bool is_valid_clock(IntS clock, WindingType winding_from, WindingType // even clock number is only possible when both sides are wye winding or both sides aren't // and conversely for odd clock number - bool const correct_clock_winding = (clock_is_even == (is_from_wye == is_to_wye)); - - return clock_in_range && correct_clock_winding; + return (clock_is_even == (is_from_wye == is_to_wye)); } // add tap diff --git a/tests/cpp_unit_tests/test_transformer.cpp b/tests/cpp_unit_tests/test_transformer.cpp index 06c92d0bb2..b120a4c049 100644 --- a/tests/cpp_unit_tests/test_transformer.cpp +++ b/tests/cpp_unit_tests/test_transformer.cpp @@ -161,6 +161,23 @@ TEST_CASE("Test transformer") { CHECK(vec[0].tap_pos() == 9); } + SUBCASE("periodic clock input") { + input.clock = 24; + Transformer trafo_24(input, 150.0e3, 10.0e3); + input.clock = 36; + Transformer trafo_36(input, 150.0e3, 10.0e3); + input.clock = -2; + Transformer trafo_m2(input, 150.0e3, 10.0e3); + CHECK(trafo_24.clock() == 0); + CHECK(trafo_36.clock() == 0); + CHECK(trafo_m2.clock() == 10); + + input.winding_to = WindingType::delta; + input.clock = 25; + Transformer trafo_25(input, 150.0e3, 10.0e3); + CHECK(trafo_25.clock() == 1); + } + SUBCASE("symmetric parameters") { for (size_t i = 0; i < 5; i++) { auto changed =