Skip to content

Commit 4ae0b48

Browse files
Merge branch 'main' into feature/current-sensor-skeleton
2 parents 1d149ac + c8865db commit 4ae0b48

File tree

4 files changed

+63
-15
lines changed

4 files changed

+63
-15
lines changed

power_grid_model_c/power_grid_model/include/power_grid_model/component/power_sensor.hpp

+9-9
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ class GenericPowerSensor : public Sensor {
6767
};
6868

6969
template <symmetry_tag power_sensor_symmetry_> class PowerSensor : public GenericPowerSensor {
70+
static constexpr double inv_base_power = 1.0 / base_power<power_sensor_symmetry_>;
71+
7072
public:
7173
using power_sensor_symmetry = power_sensor_symmetry_;
7274

@@ -78,22 +80,20 @@ template <symmetry_tag power_sensor_symmetry_> class PowerSensor : public Generi
7880

7981
explicit PowerSensor(PowerSensorInput<power_sensor_symmetry> const& power_sensor_input)
8082
: GenericPowerSensor{power_sensor_input},
81-
apparent_power_sigma_{power_sensor_input.power_sigma / base_power<power_sensor_symmetry>},
82-
p_sigma_{power_sensor_input.p_sigma / base_power<power_sensor_symmetry>},
83-
q_sigma_{power_sensor_input.q_sigma / base_power<power_sensor_symmetry>} {
83+
apparent_power_sigma_{power_sensor_input.power_sigma * inv_base_power},
84+
p_sigma_{power_sensor_input.p_sigma * inv_base_power},
85+
q_sigma_{power_sensor_input.q_sigma * inv_base_power} {
8486
set_power(power_sensor_input.p_measured, power_sensor_input.q_measured);
8587
};
8688

8789
UpdateChange update(PowerSensorUpdate<power_sensor_symmetry> const& update_data) {
88-
constexpr double scalar = 1.0 / base_power<power_sensor_symmetry>;
89-
9090
set_power(update_data.p_measured, update_data.q_measured);
9191

9292
if (!is_nan(update_data.power_sigma)) {
93-
apparent_power_sigma_ = update_data.power_sigma * scalar;
93+
apparent_power_sigma_ = update_data.power_sigma * inv_base_power;
9494
}
95-
update_real_value<power_sensor_symmetry>(update_data.p_sigma, p_sigma_, scalar);
96-
update_real_value<power_sensor_symmetry>(update_data.q_sigma, q_sigma_, scalar);
95+
update_real_value<power_sensor_symmetry>(update_data.p_sigma, p_sigma_, inv_base_power);
96+
update_real_value<power_sensor_symmetry>(update_data.q_sigma, q_sigma_, inv_base_power);
9797

9898
return {false, false};
9999
}
@@ -120,7 +120,7 @@ template <symmetry_tag power_sensor_symmetry_> class PowerSensor : public Generi
120120

121121
void set_power(RealValue<power_sensor_symmetry> const& p_measured,
122122
RealValue<power_sensor_symmetry> const& q_measured) {
123-
double const scalar = convert_direction() / base_power<power_sensor_symmetry>;
123+
double const scalar = convert_direction() * inv_base_power;
124124
RealValue<power_sensor_symmetry> ps = real(s_measured_);
125125
RealValue<power_sensor_symmetry> qs = imag(s_measured_);
126126
update_real_value<power_sensor_symmetry>(p_measured, ps, scalar);

power_grid_model_c/power_grid_model/include/power_grid_model/component/voltage_sensor.hpp

+6-5
Original file line numberDiff line numberDiff line change
@@ -75,19 +75,18 @@ template <symmetry_tag sym> class VoltageSensor : public GenericVoltageSensor {
7575
explicit VoltageSensor(VoltageSensorInput<sym> const& voltage_sensor_input, double u_rated)
7676
: GenericVoltageSensor{voltage_sensor_input},
7777
u_rated_{u_rated},
78-
u_sigma_{voltage_sensor_input.u_sigma / (u_rated_ * u_scale<sym>)},
79-
u_measured_{voltage_sensor_input.u_measured / (u_rated_ * u_scale<sym>)},
78+
u_sigma_{voltage_sensor_input.u_sigma * inv_u_norm()},
79+
u_measured_{voltage_sensor_input.u_measured * inv_u_norm()},
8080
u_angle_measured_{voltage_sensor_input.u_angle_measured} {};
8181

8282
UpdateChange update(VoltageSensorUpdate<sym> const& update_data) {
8383
assert(update_data.id == this->id() || is_nan(update_data.id));
84-
double const scalar = 1 / (u_rated_ * u_scale<sym>);
8584

86-
update_real_value<sym>(update_data.u_measured, u_measured_, scalar);
85+
update_real_value<sym>(update_data.u_measured, u_measured_, inv_u_norm());
8786
update_real_value<sym>(update_data.u_angle_measured, u_angle_measured_, 1.0);
8887

8988
if (!is_nan(update_data.u_sigma)) {
90-
u_sigma_ = update_data.u_sigma * scalar;
89+
u_sigma_ = update_data.u_sigma * inv_u_norm();
9190
}
9291

9392
return {false, false};
@@ -110,6 +109,8 @@ template <symmetry_tag sym> class VoltageSensor : public GenericVoltageSensor {
110109
RealValue<sym> u_measured_;
111110
RealValue<sym> u_angle_measured_;
112111

112+
constexpr auto inv_u_norm() const { return 1.0 / (u_rated_ * u_scale<sym>); }
113+
113114
bool has_angle() const {
114115
if constexpr (is_symmetric_v<sym>) {
115116
return !is_nan(u_angle_measured_);

tests/cpp_unit_tests/test_power_sensor.cpp

+29-1
Original file line numberDiff line numberDiff line change
@@ -571,6 +571,34 @@ TEST_CASE("Test power sensor") {
571571
CHECK(result.q_residual[2] != r_nan[2]);
572572
}
573573

574+
SUBCASE("Construction and update") {
575+
PowerSensorInput<symmetric_t> sym_power_sensor_input{.id = 7,
576+
.measured_object = 3,
577+
.measured_terminal_type =
578+
MeasuredTerminalType::branch_from,
579+
.power_sigma = 269258.24035672517,
580+
.p_measured = -2e5,
581+
.q_measured = -1e6,
582+
.p_sigma = 2.5e5,
583+
.q_sigma = 1e5};
584+
PowerSensorUpdate<symmetric_t> sym_power_sensor_update{.id = 7,
585+
.power_sigma = sym_power_sensor_input.power_sigma,
586+
.p_measured = sym_power_sensor_input.p_measured,
587+
.q_measured = sym_power_sensor_input.q_measured,
588+
.p_sigma = sym_power_sensor_input.p_sigma,
589+
.q_sigma = sym_power_sensor_input.q_sigma};
590+
591+
SymPowerSensor sym_power_sensor{sym_power_sensor_input};
592+
auto const orig_calc_param = sym_power_sensor.calc_param<symmetric_t>();
593+
594+
sym_power_sensor.update(sym_power_sensor_update);
595+
auto const updated_calc_param = sym_power_sensor.calc_param<symmetric_t>();
596+
597+
CHECK(orig_calc_param.value == updated_calc_param.value);
598+
CHECK(orig_calc_param.p_variance == updated_calc_param.p_variance);
599+
CHECK(orig_calc_param.q_variance == updated_calc_param.q_variance);
600+
}
601+
574602
SUBCASE("Update inverse - sym") {
575603
constexpr auto power_sigma = 1.0;
576604
constexpr auto p_measured = 2.0;
@@ -722,4 +750,4 @@ TEST_CASE("Test power sensor") {
722750
}
723751
}
724752
}
725-
} // namespace power_grid_model
753+
} // namespace power_grid_model

tests/cpp_unit_tests/test_voltage_sensor.cpp

+19
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,25 @@ TEST_CASE("Test voltage sensor") {
496496
}
497497
}
498498

499+
SUBCASE("Construction and update") {
500+
VoltageSensorInput<symmetric_t> sym_voltage_sensor_input{
501+
.id = 7, .measured_object = 3, .u_sigma = 1.0, .u_measured = 25000, .u_angle_measured = -0.2};
502+
VoltageSensorUpdate<symmetric_t> sym_voltage_sensor_update{.id = 7,
503+
.u_sigma = sym_voltage_sensor_input.u_sigma,
504+
.u_measured = sym_voltage_sensor_input.u_measured,
505+
.u_angle_measured =
506+
sym_voltage_sensor_input.u_angle_measured};
507+
508+
SymVoltageSensor sym_voltage_sensor{sym_voltage_sensor_input, 31250};
509+
auto const orig_calc_param = sym_voltage_sensor.calc_param<symmetric_t>();
510+
511+
sym_voltage_sensor.update(sym_voltage_sensor_update);
512+
auto const updated_calc_param = sym_voltage_sensor.calc_param<symmetric_t>();
513+
514+
CHECK(orig_calc_param.value == updated_calc_param.value);
515+
CHECK(orig_calc_param.variance == updated_calc_param.variance);
516+
}
517+
499518
SUBCASE("Update inverse - sym") {
500519
constexpr auto u_sigma = 1.0;
501520
constexpr auto u_measured = 2.0;

0 commit comments

Comments
 (0)