From 329d59327bfa98b4d6a96ee6807a93740c6dbd40 Mon Sep 17 00:00:00 2001 From: Laurynas Jagutis Date: Wed, 17 Dec 2025 10:36:42 +0200 Subject: [PATCH 1/8] remove most of shared ptrs from math solver files Signed-off-by: Laurynas Jagutis --- .../iterative_current_pf_solver.hpp | 10 +++--- .../iterative_linear_se_solver.hpp | 10 +++--- .../math_solver/iterative_pf_solver.hpp | 23 +++++++------ .../math_solver/linear_pf_solver.hpp | 12 +++---- .../math_solver/math_solver.hpp | 4 +-- .../math_solver/newton_raphson_pf_solver.hpp | 6 ++-- .../math_solver/newton_raphson_se_solver.hpp | 14 ++++---- .../math_solver/short_circuit_solver.hpp | 8 ++--- tests/cpp_unit_tests/test_math_solver_se.hpp | 32 +++++++++---------- 9 files changed, 61 insertions(+), 58 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_current_pf_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_current_pf_solver.hpp index 191361cd3a..0ca15e2c53 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_current_pf_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_current_pf_solver.hpp @@ -90,7 +90,7 @@ class IterativeCurrentPFSolver : public IterativePFSolver& output) { make_flat_start(input, output.u); - auto const& sources_per_bus = *this->sources_per_bus_; + auto const& sources_per_bus = this->sources_per_bus_.get(); IdxVector const& bus_entry = y_bus.lu_diag(); // if Y bus is not up to date // re-build matrix and prefactorize Build y bus data with source admittance @@ -119,14 +119,14 @@ class IterativeCurrentPFSolver : public IterativePFSolver const& y_bus, PowerFlowInput const& input, ComplexValueVector const& u) { - std::vector const& load_gen_type = *this->load_gen_type_; + std::vector const& load_gen_type = this->load_gen_type_.get(); // set rhs to zero for iteration start std::fill(rhs_u_.begin(), rhs_u_.end(), ComplexValue{0.0}); // loop buses: i for (auto const& [bus_number, load_gens, sources] : - enumerated_zip_sequence(*this->load_gens_per_bus_, *this->sources_per_bus_)) { + enumerated_zip_sequence(this->load_gens_per_bus_.get(), this->sources_per_bus_.get())) { add_loads(load_gens, bus_number, input, load_gen_type, u); add_sources(sources, bus_number, y_bus, input); } @@ -197,11 +197,11 @@ class IterativeCurrentPFSolver : public IterativePFSolver const& input, ComplexValueVector& output_u) { - std::vector const& phase_shift = *this->phase_shift_; + std::vector const& phase_shift = this->phase_shift_.get(); // average u_ref of all sources DoubleComplex const u_ref = [&]() { DoubleComplex sum_u_ref = 0.0; - for (auto const& [bus, sources] : enumerated_zip_sequence(*this->sources_per_bus_)) { + for (auto const& [bus, sources] : enumerated_zip_sequence(this->sources_per_bus_.get())) { for (Idx const source : sources) { sum_u_ref += input.source[source] * std::exp(1.0i * -phase_shift[bus]); // offset phase shift } diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_linear_se_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_linear_se_solver.hpp index be5b3d1b8a..3f652918e5 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_linear_se_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_linear_se_solver.hpp @@ -75,9 +75,9 @@ template class IterativeLinearSESolver { static constexpr Idx bsr_block_size_ = is_symmetric_v ? 2 : 6; public: - IterativeLinearSESolver(YBus const& y_bus, std::shared_ptr topo_ptr) + IterativeLinearSESolver(YBus const& y_bus, MathModelTopology const& topo_ptr) : n_bus_{y_bus.size()}, - math_topo_{std::move(topo_ptr)}, + math_topo_{topo_ptr}, data_gain_(y_bus.nnz_lu()), x_rhs_(y_bus.size()), sparse_solver_{y_bus.shared_indptr_lu(), y_bus.shared_indices_lu(), y_bus.shared_diag_lu()}, @@ -111,7 +111,7 @@ template class IterativeLinearSESolver { sub_timer = Timer{log, LogEvent::initialize_voltages}; // TODO(mgovers): make scoped subtimers RealValue const mean_angle_shift = measured_values.mean_angle_shift(); for (Idx bus = 0; bus != n_bus_; ++bus) { - output.u[bus] = exp(1.0i * (mean_angle_shift + math_topo_->phase_shift[bus])); + output.u[bus] = exp(1.0i * (mean_angle_shift + math_topo_.phase_shift[bus])); } // loop to iterate @@ -155,7 +155,7 @@ template class IterativeLinearSESolver { Idx n_bus_; // shared topo data - std::shared_ptr math_topo_; + MathModelTopology const& math_topo_; // data for gain matrix std::vector> data_gain_; @@ -359,7 +359,7 @@ template class IterativeLinearSESolver { if (has_angle) { return 1.0; } - auto const& voltage = x_rhs_[math_topo_->slack_bus].u(); + auto const& voltage = x_rhs_[math_topo_.slack_bus].u(); auto const& voltage_a = [&voltage]() -> auto const& { if constexpr (is_symmetric_v) { return voltage; diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_pf_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_pf_solver.hpp index 04b3a9bf95..1f232a8b84 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_pf_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_pf_solver.hpp @@ -18,6 +18,9 @@ #include "../common/three_phase_tensor.hpp" #include "../common/timer.hpp" +#include +#include + namespace power_grid_model::math_solver { // solver @@ -81,22 +84,22 @@ template class IterativePFSolver { } void calculate_result(YBus const& y_bus, PowerFlowInput const& input, SolverOutput& output) { - detail::calculate_pf_result(y_bus, input, *sources_per_bus_, *load_gens_per_bus_, output, - [this](Idx i) { return (*load_gen_type_)[i]; }); + detail::calculate_pf_result(y_bus, input, sources_per_bus_.get(), load_gens_per_bus_.get(), output, + [this](Idx i) { return (load_gen_type_.get())[i]; }); } private: Idx n_bus_; - std::shared_ptr phase_shift_; - std::shared_ptr load_gens_per_bus_; - std::shared_ptr sources_per_bus_; - std::shared_ptr const> load_gen_type_; + std::reference_wrapper phase_shift_; + std::reference_wrapper load_gens_per_bus_; + std::reference_wrapper sources_per_bus_; + std::reference_wrapper const> load_gen_type_; IterativePFSolver(YBus const& y_bus, std::shared_ptr const& topo_ptr) : n_bus_{y_bus.size()}, - phase_shift_{topo_ptr, &topo_ptr->phase_shift}, - load_gens_per_bus_{topo_ptr, &topo_ptr->load_gens_per_bus}, - sources_per_bus_{topo_ptr, &topo_ptr->sources_per_bus}, - load_gen_type_{topo_ptr, &topo_ptr->load_gen_type} {} + phase_shift_{std::cref(topo_ptr->phase_shift)}, + load_gens_per_bus_{std::cref(topo_ptr->load_gens_per_bus)}, + sources_per_bus_{std::cref(topo_ptr->sources_per_bus)}, + load_gen_type_{std::cref(topo_ptr->load_gen_type)} {} }; } // namespace power_grid_model::math_solver diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/linear_pf_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/linear_pf_solver.hpp index 3dd49cfe27..08188c3a25 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/linear_pf_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/linear_pf_solver.hpp @@ -56,8 +56,8 @@ template class LinearPFSolver { LinearPFSolver(YBus const& y_bus, std::shared_ptr const& topo_ptr) : n_bus_{y_bus.size()}, - load_gens_per_bus_{topo_ptr, &topo_ptr->load_gens_per_bus}, - sources_per_bus_{topo_ptr, &topo_ptr->sources_per_bus}, + load_gens_per_bus_{std::cref(topo_ptr->load_gens_per_bus)}, + sources_per_bus_{std::cref(topo_ptr->sources_per_bus)}, mat_data_(y_bus.nnz_lu()), sparse_solver_{y_bus.shared_indptr_lu(), y_bus.shared_indices_lu(), y_bus.shared_diag_lu()}, perm_(n_bus_) {} @@ -92,8 +92,8 @@ template class LinearPFSolver { private: Idx n_bus_; // shared topo data - std::shared_ptr load_gens_per_bus_; - std::shared_ptr sources_per_bus_; + std::reference_wrapper load_gens_per_bus_; + std::reference_wrapper sources_per_bus_; // sparse linear equation ComplexTensorVector mat_data_; // sparse solver @@ -101,11 +101,11 @@ template class LinearPFSolver { BlockPermArray perm_; void prepare_matrix_and_rhs(YBus const& y_bus, PowerFlowInput const& input, SolverOutput& output) { - detail::prepare_linear_matrix_and_rhs(y_bus, input, *load_gens_per_bus_, *sources_per_bus_, output, mat_data_); + detail::prepare_linear_matrix_and_rhs(y_bus, input, load_gens_per_bus_.get(), sources_per_bus_.get(), output, mat_data_); } void calculate_result(YBus const& y_bus, PowerFlowInput const& input, SolverOutput& output) { - detail::calculate_pf_result(y_bus, input, *sources_per_bus_, *load_gens_per_bus_, output, + detail::calculate_pf_result(y_bus, input, sources_per_bus_.get(), load_gens_per_bus_.get(), output, [](Idx /*i*/) { return LoadGenType::const_y; }); } }; diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/math_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/math_solver.hpp index 75deca5994..0b12878e0f 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/math_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/math_solver.hpp @@ -152,7 +152,7 @@ template class MathSolver : public MathSolverBase { // construct model if needed if (!iterative_linear_se_solver_.has_value()) { Timer const timer{log, LogEvent::create_math_solver}; - iterative_linear_se_solver_.emplace(y_bus, topo_ptr_); + iterative_linear_se_solver_.emplace(y_bus, *topo_ptr_); } // call calculation @@ -164,7 +164,7 @@ template class MathSolver : public MathSolverBase { // construct model if needed if (!newton_raphson_se_solver_.has_value()) { Timer const timer{log, LogEvent::create_math_solver}; - newton_raphson_se_solver_.emplace(y_bus, topo_ptr_); + newton_raphson_se_solver_.emplace(y_bus, *topo_ptr_); } // call calculation diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_pf_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_pf_solver.hpp index a0f8790c34..2b9a86c3fa 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_pf_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_pf_solver.hpp @@ -230,7 +230,7 @@ class NewtonRaphsonPFSolver : public IterativePFSolver(y_bus, linear_mat_data); - detail::prepare_linear_matrix_and_rhs(y_bus, input, *this->load_gens_per_bus_, *this->sources_per_bus_, output, + detail::prepare_linear_matrix_and_rhs(y_bus, input, this->load_gens_per_bus_.get(), this->sources_per_bus_.get(), output, linear_mat_data); linear_sparse_solver.prefactorize_and_solve(linear_mat_data, linear_perm, output.u, output.u); @@ -244,13 +244,13 @@ class NewtonRaphsonPFSolver : public IterativePFSolver const& y_bus, PowerFlowInput const& input, ComplexValueVector const& u) { - std::vector const& load_gen_type = *this->load_gen_type_; + std::vector const& load_gen_type = this->load_gen_type_.get(); IdxVector const& bus_entry = y_bus.lu_diag(); prepare_matrix_and_rhs_from_network_perspective(y_bus, u, bus_entry); for (auto const& [bus_number, load_gens, sources] : - enumerated_zip_sequence(*this->load_gens_per_bus_, *this->sources_per_bus_)) { + enumerated_zip_sequence(this->load_gens_per_bus_.get(), this->sources_per_bus_.get())) { Idx const diagonal_position = bus_entry[bus_number]; add_loads(load_gens, bus_number, diagonal_position, input, load_gen_type); add_sources(sources, bus_number, diagonal_position, y_bus, input, u); diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_se_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_se_solver.hpp index f3e3d62a89..fbfd522d08 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_se_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_se_solver.hpp @@ -142,9 +142,9 @@ template class NewtonRaphsonSESolver { }; public: - NewtonRaphsonSESolver(YBus const& y_bus, std::shared_ptr topo_ptr) + NewtonRaphsonSESolver(YBus const& y_bus, MathModelTopology const& topo_ptr) : n_bus_{y_bus.size()}, - math_topo_{std::move(topo_ptr)}, + math_topo_{topo_ptr}, data_gain_(y_bus.nnz_lu()), delta_x_rhs_(y_bus.size()), x_(y_bus.size()), @@ -205,7 +205,7 @@ template class NewtonRaphsonSESolver { private: Idx n_bus_; // shared topo data - std::shared_ptr math_topo_; + MathModelTopology const& math_topo_; // data for gain matrix std::vector> data_gain_; @@ -225,7 +225,7 @@ template class NewtonRaphsonSESolver { for (Idx bus = 0; bus != n_bus_; ++bus) { auto& estimated_result = x_[bus]; - estimated_result.theta() = mean_angle_shift + math_topo_->phase_shift[bus]; + estimated_result.theta() = mean_angle_shift + math_topo_.phase_shift[bus]; if (measured_values.has_voltage(bus)) { if (measured_values.has_angle_measurement(bus)) { estimated_result.theta() = arg(measured_values.voltage(bus)); @@ -645,8 +645,8 @@ template class NewtonRaphsonSESolver { auto const abs_measured_v = cabs_or_real(measured_values.voltage(bus)); auto const delta_v = abs_measured_v - x_[bus].v(); - auto const virtual_angle_measurement_bus = measured_values.has_voltage(math_topo_->slack_bus) - ? math_topo_->slack_bus + auto const virtual_angle_measurement_bus = measured_values.has_voltage(math_topo_.slack_bus) + ? math_topo_.slack_bus : measured_values.first_voltage_measurement(); RealTensor w_theta{}; @@ -772,7 +772,7 @@ template class NewtonRaphsonSESolver { if (measured_values.has_angle()) { return 0.0; } - auto const& theta = x_[math_topo_->slack_bus].theta() + delta_x_rhs_[math_topo_->slack_bus].theta(); + auto const& theta = x_[math_topo_.slack_bus].theta() + delta_x_rhs_[math_topo_.slack_bus].theta(); if constexpr (is_symmetric_v) { return theta; } else { diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/short_circuit_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/short_circuit_solver.hpp index 4721d31374..3c78ae0036 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/short_circuit_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/short_circuit_solver.hpp @@ -26,7 +26,7 @@ template class ShortCircuitSolver { ShortCircuitSolver(YBus const& y_bus, std::shared_ptr const& topo_ptr) : n_bus_{y_bus.size()}, n_source_{topo_ptr->n_source()}, - sources_per_bus_{topo_ptr, &topo_ptr->sources_per_bus}, + sources_per_bus_{std::cref(topo_ptr->sources_per_bus)}, mat_data_(y_bus.nnz_lu()), sparse_solver_{y_bus.shared_indptr_lu(), y_bus.shared_indices_lu(), y_bus.shared_diag_lu()}, perm_{static_cast(n_bus_)} {} @@ -64,7 +64,7 @@ template class ShortCircuitSolver { Idx n_bus_; Idx n_source_; // shared topo data - std::shared_ptr sources_per_bus_; + std::reference_wrapper sources_per_bus_; // sparse linear equation ComplexTensorVector mat_data_; // sparse solver @@ -77,7 +77,7 @@ template class ShortCircuitSolver { IdxVector const& bus_entry = y_bus.lu_diag(); for (auto const& [bus_number, sources, faults] : - enumerated_zip_sequence(*sources_per_bus_, input.fault_buses)) { + enumerated_zip_sequence(sources_per_bus_.get(), input.fault_buses)) { Idx const diagonal_position = bus_entry[bus_number]; auto& diagonal_element = mat_data_[diagonal_position]; auto& u_bus = output.u_bus[bus_number]; @@ -226,7 +226,7 @@ template class ShortCircuitSolver { using enum FaultType; for (auto const& [bus_number, faults, sources] : - enumerated_zip_sequence(input.fault_buses, *sources_per_bus_)) { + enumerated_zip_sequence(input.fault_buses, sources_per_bus_.get())) { ComplexValue const x_bus_subtotal = output.u_bus[bus_number]; auto const infinite_admittance_fault_counter_bus = static_cast(infinite_admittance_fault_counter[bus_number]); diff --git a/tests/cpp_unit_tests/test_math_solver_se.hpp b/tests/cpp_unit_tests/test_math_solver_se.hpp index a26f1826c4..a579590ba2 100644 --- a/tests/cpp_unit_tests/test_math_solver_se.hpp +++ b/tests/cpp_unit_tests/test_math_solver_se.hpp @@ -316,7 +316,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - SE", SolverType, test_math_solver_ YBus const y_bus{topo_ptr, param_ptr}; SUBCASE("Test se with angle") { - SolverType solver{y_bus, topo_ptr}; + SolverType solver{y_bus, *topo_ptr}; auto log = get_logger(); auto const se_input = grid.se_input_angle(); @@ -326,7 +326,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - SE", SolverType, test_math_solver_ } SUBCASE("Test se without angle") { - SolverType solver{y_bus, topo_ptr}; + SolverType solver{y_bus, *topo_ptr}; auto log = get_logger(); auto const se_input = grid.se_input_no_angle(); @@ -336,7 +336,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - SE", SolverType, test_math_solver_ } SUBCASE("Test se with angle, const z") { - SolverType solver{y_bus, topo_ptr}; + SolverType solver{y_bus, *topo_ptr}; auto log = get_logger(); auto const se_input = grid.se_input_angle_const_z(); @@ -346,7 +346,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - SE", SolverType, test_math_solver_ } SUBCASE("Test se with angle and different power variances") { - SolverType solver{y_bus, topo_ptr}; + SolverType solver{y_bus, *topo_ptr}; auto log = get_logger(); auto se_input = grid.se_input_angle(); @@ -364,7 +364,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - SE", SolverType, test_math_solver_ auto topo_ptr = std::make_shared(grid.se_topo_current_sensors()); YBus const y_bus{topo_ptr, param_ptr}; SUBCASE("Test se with local angle current sensors") { - SolverType solver{y_bus, topo_ptr}; + SolverType solver{y_bus, *topo_ptr}; auto log = get_logger(); auto const se_input = grid.se_input_angle_current_sensors(AngleMeasurementType::local_angle); @@ -374,7 +374,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - SE", SolverType, test_math_solver_ } SUBCASE("Test se with global angle current sensors") { - SolverType solver{y_bus, topo_ptr}; + SolverType solver{y_bus, *topo_ptr}; auto log = get_logger(); auto const se_input = grid.se_input_angle_current_sensors(AngleMeasurementType::global_angle); @@ -423,7 +423,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - SE, zero variance test", SolverTyp se_input.source_status = {1}; se_input.measured_voltage = {{.value = 1.0, .variance = 1.0}}; - SolverType solver{y_bus_sym, topo_ptr}; + SolverType solver{y_bus_sym, *topo_ptr}; auto log = get_logger(); SolverOutput output; @@ -498,7 +498,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - SE, measurements", SolverType, tes auto topo_ptr = std::make_shared(topo); YBus const y_bus_sym{topo_ptr, param_ptr}; - SolverType solver{y_bus_sym, topo_ptr}; + SolverType solver{y_bus_sym, *topo_ptr}; output = run_state_estimation(solver, y_bus_sym, se_input, error_tolerance, num_iter, log); @@ -532,7 +532,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - SE, measurements", SolverType, tes auto topo_ptr = std::make_shared(topo); YBus const y_bus_sym{topo_ptr, param_ptr}; - SolverType solver{y_bus_sym, topo_ptr}; + SolverType solver{y_bus_sym, *topo_ptr}; SUBCASE("Local angle current sensor") { SUBCASE("No phase shift") { @@ -606,7 +606,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - SE, measurements", SolverType, tes auto param_ptr = std::make_shared const>(param); auto topo_ptr = std::make_shared(topo); YBus const y_bus_sym{topo_ptr, param_ptr}; - SolverType solver{y_bus_sym, topo_ptr}; + SolverType solver{y_bus_sym, *topo_ptr}; output = run_state_estimation(solver, y_bus_sym, se_input, error_tolerance, num_iter, log); @@ -638,7 +638,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - SE, measurements", SolverType, tes auto param_ptr = std::make_shared const>(param); auto topo_ptr = std::make_shared(topo); YBus const y_bus_sym{topo_ptr, param_ptr}; - SolverType solver{y_bus_sym, topo_ptr}; + SolverType solver{y_bus_sym, *topo_ptr}; output = run_state_estimation(solver, y_bus_sym, se_input, error_tolerance, num_iter, log); @@ -670,7 +670,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - SE, measurements", SolverType, tes auto param_ptr = std::make_shared const>(param); auto topo_ptr = std::make_shared(topo); YBus const y_bus_sym{topo_ptr, param_ptr}; - SolverType solver{y_bus_sym, topo_ptr}; + SolverType solver{y_bus_sym, *topo_ptr}; output = run_state_estimation(solver, y_bus_sym, se_input, error_tolerance, num_iter, log); @@ -702,7 +702,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - SE, measurements", SolverType, tes auto param_ptr = std::make_shared const>(param); auto topo_ptr = std::make_shared(topo); YBus const y_bus_sym{topo_ptr, param_ptr}; - SolverType solver{y_bus_sym, topo_ptr}; + SolverType solver{y_bus_sym, *topo_ptr}; output = run_state_estimation(solver, y_bus_sym, se_input, error_tolerance, num_iter, log); @@ -732,7 +732,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - SE, measurements", SolverType, tes auto param_ptr = std::make_shared const>(param); auto topo_ptr = std::make_shared(topo); YBus const y_bus_sym{topo_ptr, param_ptr}; - SolverType solver{y_bus_sym, topo_ptr}; + SolverType solver{y_bus_sym, *topo_ptr}; output = run_state_estimation(solver, y_bus_sym, se_input, error_tolerance, num_iter, log); @@ -766,7 +766,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - SE, measurements", SolverType, tes auto param_ptr = std::make_shared const>(param); auto topo_ptr = std::make_shared(topo); YBus const y_bus_sym{topo_ptr, param_ptr}; - SolverType solver{y_bus_sym, topo_ptr}; + SolverType solver{y_bus_sym, *topo_ptr}; output = run_state_estimation(solver, y_bus_sym, se_input, error_tolerance, num_iter, log); @@ -799,7 +799,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - SE, measurements", SolverType, tes auto param_ptr = std::make_shared const>(param); auto topo_ptr = std::make_shared(topo); YBus const y_bus_sym{topo_ptr, param_ptr}; - SolverType solver{y_bus_sym, topo_ptr}; + SolverType solver{y_bus_sym, *topo_ptr}; output = run_state_estimation(solver, y_bus_sym, se_input, error_tolerance, num_iter, log); From 051034d3dc0d455ffb1b12a4a09b756f8229d919 Mon Sep 17 00:00:00 2001 From: Laurynas Jagutis Date: Wed, 17 Dec 2025 11:14:04 +0200 Subject: [PATCH 2/8] adjust to reference wrapper Signed-off-by: Laurynas Jagutis --- .../math_solver/iterative_linear_se_solver.hpp | 6 +++--- .../math_solver/newton_raphson_se_solver.hpp | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_linear_se_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_linear_se_solver.hpp index 3f652918e5..10ed39beea 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_linear_se_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_linear_se_solver.hpp @@ -111,7 +111,7 @@ template class IterativeLinearSESolver { sub_timer = Timer{log, LogEvent::initialize_voltages}; // TODO(mgovers): make scoped subtimers RealValue const mean_angle_shift = measured_values.mean_angle_shift(); for (Idx bus = 0; bus != n_bus_; ++bus) { - output.u[bus] = exp(1.0i * (mean_angle_shift + math_topo_.phase_shift[bus])); + output.u[bus] = exp(1.0i * (mean_angle_shift + math_topo_.get().phase_shift[bus])); } // loop to iterate @@ -155,7 +155,7 @@ template class IterativeLinearSESolver { Idx n_bus_; // shared topo data - MathModelTopology const& math_topo_; + std::reference_wrapper math_topo_; // data for gain matrix std::vector> data_gain_; @@ -359,7 +359,7 @@ template class IterativeLinearSESolver { if (has_angle) { return 1.0; } - auto const& voltage = x_rhs_[math_topo_.slack_bus].u(); + auto const& voltage = x_rhs_[math_topo_.get().slack_bus].u(); auto const& voltage_a = [&voltage]() -> auto const& { if constexpr (is_symmetric_v) { return voltage; diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_se_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_se_solver.hpp index fbfd522d08..aeab51afdd 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_se_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_se_solver.hpp @@ -205,7 +205,7 @@ template class NewtonRaphsonSESolver { private: Idx n_bus_; // shared topo data - MathModelTopology const& math_topo_; + std::reference_wrapper math_topo_; // data for gain matrix std::vector> data_gain_; @@ -225,7 +225,7 @@ template class NewtonRaphsonSESolver { for (Idx bus = 0; bus != n_bus_; ++bus) { auto& estimated_result = x_[bus]; - estimated_result.theta() = mean_angle_shift + math_topo_.phase_shift[bus]; + estimated_result.theta() = mean_angle_shift + math_topo_.get().phase_shift[bus]; if (measured_values.has_voltage(bus)) { if (measured_values.has_angle_measurement(bus)) { estimated_result.theta() = arg(measured_values.voltage(bus)); @@ -645,8 +645,8 @@ template class NewtonRaphsonSESolver { auto const abs_measured_v = cabs_or_real(measured_values.voltage(bus)); auto const delta_v = abs_measured_v - x_[bus].v(); - auto const virtual_angle_measurement_bus = measured_values.has_voltage(math_topo_.slack_bus) - ? math_topo_.slack_bus + auto const virtual_angle_measurement_bus = measured_values.has_voltage(math_topo_.get().slack_bus) + ? math_topo_.get().slack_bus : measured_values.first_voltage_measurement(); RealTensor w_theta{}; @@ -772,7 +772,7 @@ template class NewtonRaphsonSESolver { if (measured_values.has_angle()) { return 0.0; } - auto const& theta = x_[math_topo_.slack_bus].theta() + delta_x_rhs_[math_topo_.slack_bus].theta(); + auto const& theta = x_[math_topo_.get().slack_bus].theta() + delta_x_rhs_[math_topo_.get().slack_bus].theta(); if constexpr (is_symmetric_v) { return theta; } else { From 7458b624a63875dd4dd90e4a34a2acce8576b488 Mon Sep 17 00:00:00 2001 From: Laurynas Jagutis Date: Mon, 5 Jan 2026 13:06:22 +0200 Subject: [PATCH 3/8] changes to sparse lu solver and measured values Signed-off-by: Laurynas Jagutis --- .../iterative_current_pf_solver.hpp | 2 +- .../iterative_linear_se_solver.hpp | 2 +- .../math_solver/linear_pf_solver.hpp | 2 +- .../math_solver/measured_values.hpp | 12 +++++----- .../math_solver/newton_raphson_pf_solver.hpp | 5 ++--- .../math_solver/newton_raphson_se_solver.hpp | 2 +- .../math_solver/short_circuit_solver.hpp | 2 +- .../math_solver/sparse_lu_solver.hpp | 22 +++++++++---------- .../cpp_unit_tests/test_sparse_lu_solver.cpp | 18 +++++++-------- 9 files changed, 33 insertions(+), 34 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_current_pf_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_current_pf_solver.hpp index 0ca15e2c53..7b3a0d62ad 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_current_pf_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_current_pf_solver.hpp @@ -83,7 +83,7 @@ class IterativeCurrentPFSolver : public IterativePFSolver const& y_bus, std::shared_ptr const& topo_ptr) : IterativePFSolver{y_bus, topo_ptr}, rhs_u_(y_bus.size()), - sparse_solver_{y_bus.shared_indptr_lu(), y_bus.shared_indices_lu(), y_bus.shared_diag_lu()} {} + sparse_solver_{y_bus.row_indptr_lu(), y_bus.col_indices_lu(), y_bus.lu_diag()} {} // Add source admittance to Y bus and set variable for prepared y bus to true void initialize_derived_solver(YBus const& y_bus, PowerFlowInput const& input, diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_linear_se_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_linear_se_solver.hpp index 10ed39beea..00382682f7 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_linear_se_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_linear_se_solver.hpp @@ -80,7 +80,7 @@ template class IterativeLinearSESolver { math_topo_{topo_ptr}, data_gain_(y_bus.nnz_lu()), x_rhs_(y_bus.size()), - sparse_solver_{y_bus.shared_indptr_lu(), y_bus.shared_indices_lu(), y_bus.shared_diag_lu()}, + sparse_solver_{y_bus.row_indptr_lu(), y_bus.col_indices_lu(), y_bus.lu_diag()}, perm_(y_bus.size()) {} SolverOutput run_state_estimation(YBus const& y_bus, StateEstimationInput const& input, diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/linear_pf_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/linear_pf_solver.hpp index 08188c3a25..18a4159330 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/linear_pf_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/linear_pf_solver.hpp @@ -59,7 +59,7 @@ template class LinearPFSolver { load_gens_per_bus_{std::cref(topo_ptr->load_gens_per_bus)}, sources_per_bus_{std::cref(topo_ptr->sources_per_bus)}, mat_data_(y_bus.nnz_lu()), - sparse_solver_{y_bus.shared_indptr_lu(), y_bus.shared_indices_lu(), y_bus.shared_diag_lu()}, + sparse_solver_{y_bus.row_indptr_lu(), y_bus.col_indices_lu(), y_bus.lu_diag()}, perm_(n_bus_) {} SolverOutput run_power_flow(YBus const& y_bus, PowerFlowInput const& input, Logger& log) { diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/measured_values.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/measured_values.hpp index d7ec747095..6d1bcce658 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/measured_values.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/measured_values.hpp @@ -36,7 +36,7 @@ template class MeasuredValues { public: // construct MeasuredValues(std::shared_ptr topo, StateEstimationInput const& input) - : math_topology_{std::move(topo)}, + : math_topology_{*topo}, bus_appliance_injection_(math_topology().n_bus()), idx_voltage_(math_topology().n_bus()), bus_injection_(math_topology().n_bus()), @@ -112,12 +112,12 @@ template class MeasuredValues { LoadGenSourceFlow calculate_load_gen_source(ComplexValueVector const& u, ComplexValueVector const& s) const { - std::vector> load_gen_flow(math_topology_->n_load_gen()); - std::vector> source_flow(math_topology_->n_source()); + std::vector> load_gen_flow(math_topology_.n_load_gen()); + std::vector> source_flow(math_topology_.n_source()); // loop all buses for (auto const& [bus, load_gens, sources] : - enumerated_zip_sequence(math_topology_->load_gens_per_bus, math_topology_->sources_per_bus)) { + enumerated_zip_sequence(math_topology_.load_gens_per_bus, math_topology_.sources_per_bus)) { // under-determined or exactly determined if (bus_injection_[bus].n_unmeasured_appliances > 0) { calculate_non_over_determined_injection(bus_injection_[bus].n_unmeasured_appliances, load_gens, sources, @@ -173,7 +173,7 @@ template class MeasuredValues { private: // cache topology - std::shared_ptr math_topology_; + MathModelTopology const& math_topology_; // flat arrays of all the relevant measurement for the main calculation // branch/shunt flow, bus voltage, injection flow @@ -214,7 +214,7 @@ template class MeasuredValues { // the lowest bus index with a voltage measurement Idx first_voltage_measurement_{}; - constexpr MathModelTopology const& math_topology() const { return *math_topology_; } + constexpr MathModelTopology const& math_topology() const { return math_topology_; } void process_bus_related_measurements(StateEstimationInput const& input) { /* diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_pf_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_pf_solver.hpp index 2b9a86c3fa..3bc644e16d 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_pf_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_pf_solver.hpp @@ -216,7 +216,7 @@ class NewtonRaphsonPFSolver : public IterativePFSolver, ComplexValue, ComplexValue>; ComplexTensorVector linear_mat_data(y_bus.nnz_lu()); - LinearSparseSolverType linear_sparse_solver{y_bus.shared_indptr_lu(), y_bus.shared_indices_lu(), - y_bus.shared_diag_lu()}; + LinearSparseSolverType linear_sparse_solver{y_bus.row_indptr_lu(), y_bus.col_indices_lu(), y_bus.lu_diag()}; typename LinearSparseSolverType::BlockPermArray linear_perm(y_bus.size()); detail::copy_y_bus(y_bus, linear_mat_data); diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_se_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_se_solver.hpp index aeab51afdd..2845b23408 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_se_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_se_solver.hpp @@ -148,7 +148,7 @@ template class NewtonRaphsonSESolver { data_gain_(y_bus.nnz_lu()), delta_x_rhs_(y_bus.size()), x_(y_bus.size()), - sparse_solver_{y_bus.shared_indptr_lu(), y_bus.shared_indices_lu(), y_bus.shared_diag_lu()}, + sparse_solver_{y_bus.row_indptr_lu(), y_bus.col_indices_lu(), y_bus.lu_diag()}, perm_(y_bus.size()) {} SolverOutput run_state_estimation(YBus const& y_bus, StateEstimationInput const& input, diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/short_circuit_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/short_circuit_solver.hpp index 3c78ae0036..c2591c3702 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/short_circuit_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/short_circuit_solver.hpp @@ -28,7 +28,7 @@ template class ShortCircuitSolver { n_source_{topo_ptr->n_source()}, sources_per_bus_{std::cref(topo_ptr->sources_per_bus)}, mat_data_(y_bus.nnz_lu()), - sparse_solver_{y_bus.shared_indptr_lu(), y_bus.shared_indices_lu(), y_bus.shared_diag_lu()}, + sparse_solver_{y_bus.row_indptr_lu(), y_bus.col_indices_lu(), y_bus.lu_diag()}, perm_{static_cast(n_bus_)} {} ShortCircuitSolverOutput run_short_circuit(YBus const& y_bus, ShortCircuitInput const& input) { diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/sparse_lu_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/sparse_lu_solver.hpp index 15b9d83033..c91f453291 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/sparse_lu_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/sparse_lu_solver.hpp @@ -200,14 +200,14 @@ template class SparseLUSolver { using BlockPermArray = typename entry_trait::BlockPermArray; static constexpr Idx max_iterative_refinement = 5; - SparseLUSolver(std::shared_ptr const& row_indptr, // indptr including fill-ins - std::shared_ptr col_indices, // indices including fill-ins - std::shared_ptr diag_lu) - : size_{static_cast(row_indptr->size()) - 1}, - nnz_{row_indptr->back()}, - row_indptr_{row_indptr}, - col_indices_{std::move(col_indices)}, - diag_lu_{std::move(diag_lu)} {} + SparseLUSolver(IdxVector const& row_indptr, // indptr including fill-ins + IdxVector const& col_indices, // indices including fill-ins + IdxVector const& diag_lu) + : size_{static_cast(row_indptr.size()) - 1}, + nnz_{row_indptr.back()}, + row_indptr_{&row_indptr}, + col_indices_{&col_indices}, + diag_lu_{&diag_lu} {} // solve with new matrix data, need to factorize first void @@ -407,9 +407,9 @@ template class SparseLUSolver { private: Idx size_; Idx nnz_; // number of non zeroes (in block) - std::shared_ptr row_indptr_; - std::shared_ptr col_indices_; - std::shared_ptr diag_lu_; + IdxVector const* row_indptr_; + IdxVector const* col_indices_; + IdxVector const* diag_lu_; // cache value for pivot perturbation for the factorize step bool has_pivot_perturbation_{false}; double matrix_norm_{}; diff --git a/tests/cpp_unit_tests/test_sparse_lu_solver.cpp b/tests/cpp_unit_tests/test_sparse_lu_solver.cpp index d1915de718..b516329c50 100644 --- a/tests/cpp_unit_tests/test_sparse_lu_solver.cpp +++ b/tests/cpp_unit_tests/test_sparse_lu_solver.cpp @@ -42,9 +42,9 @@ TEST_CASE("Test Sparse LU solver") { /// x x f /// x f x - auto row_indptr = std::make_shared(IdxVector{0, 3, 6, 9}); - auto col_indices = std::make_shared(IdxVector{0, 1, 2, 0, 1, 2, 0, 1, 2}); - auto diag_lu = std::make_shared(IdxVector{0, 4, 8}); + auto row_indptr = IdxVector{0, 3, 6, 9}; + auto col_indices = IdxVector{0, 1, 2, 0, 1, 2, 0, 1, 2}; + auto diag_lu = IdxVector{0, 4, 8}; SUBCASE("Scalar(double) calculation") { // [4 1 5 3 21 @@ -141,9 +141,9 @@ TEST_CASE("LU solver with ill-conditioned system") { // SUBCASE("Scalar variant") { - auto row_indptr = std::make_shared(IdxVector{0, 4, 8, 12, 16}); - auto col_indices = std::make_shared(IdxVector{0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3}); - auto diag_lu = std::make_shared(IdxVector{0, 5, 10, 15}); + auto row_indptr = IdxVector{0, 4, 8, 12, 16}; + auto col_indices = IdxVector{0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3}; + auto diag_lu = IdxVector{0, 5, 10, 15}; auto data = std::vector{ 0, 0, 0, -1, // row 0 0, -1, 0, 0, // row 1 @@ -169,9 +169,9 @@ TEST_CASE("LU solver with ill-conditioned system") { } SUBCASE("Block variant") { - auto row_indptr = std::make_shared(IdxVector{0, 2, 4}); - auto col_indices = std::make_shared(IdxVector{0, 1, 0, 1}); - auto diag_lu = std::make_shared(IdxVector{0, 3}); + auto row_indptr = IdxVector{0, 2, 4}; + auto col_indices = IdxVector{0, 1, 0, 1}; + auto diag_lu = IdxVector{0, 3}; auto data = std::vector{ {{0, 0}, {0, -1}}, // 0, 0 {{0, -1}, {0, 0}}, // 0, 1 From 4d6f41d0fc2e3390670e68d5b1dbb0922293027e Mon Sep 17 00:00:00 2001 From: Laurynas Jagutis Date: Mon, 5 Jan 2026 13:28:29 +0200 Subject: [PATCH 4/8] remove test includes Signed-off-by: Laurynas Jagutis --- .../power_grid_model/math_solver/iterative_pf_solver.hpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_pf_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_pf_solver.hpp index 1f232a8b84..6dc1e19bb1 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_pf_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_pf_solver.hpp @@ -18,9 +18,6 @@ #include "../common/three_phase_tensor.hpp" #include "../common/timer.hpp" -#include -#include - namespace power_grid_model::math_solver { // solver From a27b70b0647c46f6287156855b457c8cba8aae21 Mon Sep 17 00:00:00 2001 From: Laurynas Jagutis Date: Mon, 12 Jan 2026 11:54:23 +0200 Subject: [PATCH 5/8] add spans, remove multiple shared ptrs for mathmodeltopology, adjust test Signed-off-by: Laurynas Jagutis --- .../iterative_current_pf_solver.hpp | 2 +- .../math_solver/iterative_pf_solver.hpp | 10 ++--- .../math_solver/linear_pf_solver.hpp | 6 +-- .../math_solver/math_solver.hpp | 6 +-- .../math_solver/newton_raphson_pf_solver.hpp | 2 +- .../math_solver/sparse_lu_solver.hpp | 43 ++++++++++--------- tests/cpp_unit_tests/test_math_solver_pf.hpp | 10 ++--- 7 files changed, 40 insertions(+), 39 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_current_pf_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_current_pf_solver.hpp index 7b3a0d62ad..9f528c6b95 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_current_pf_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_current_pf_solver.hpp @@ -80,7 +80,7 @@ class IterativeCurrentPFSolver : public IterativePFSolver const& y_bus, std::shared_ptr const& topo_ptr) + IterativeCurrentPFSolver(YBus const& y_bus, MathModelTopology const& topo_ptr) : IterativePFSolver{y_bus, topo_ptr}, rhs_u_(y_bus.size()), sparse_solver_{y_bus.row_indptr_lu(), y_bus.col_indices_lu(), y_bus.lu_diag()} {} diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_pf_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_pf_solver.hpp index 6dc1e19bb1..1a401202ff 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_pf_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/iterative_pf_solver.hpp @@ -91,12 +91,12 @@ template class IterativePFSolver { std::reference_wrapper load_gens_per_bus_; std::reference_wrapper sources_per_bus_; std::reference_wrapper const> load_gen_type_; - IterativePFSolver(YBus const& y_bus, std::shared_ptr const& topo_ptr) + IterativePFSolver(YBus const& y_bus, MathModelTopology const& topo_ptr) : n_bus_{y_bus.size()}, - phase_shift_{std::cref(topo_ptr->phase_shift)}, - load_gens_per_bus_{std::cref(topo_ptr->load_gens_per_bus)}, - sources_per_bus_{std::cref(topo_ptr->sources_per_bus)}, - load_gen_type_{std::cref(topo_ptr->load_gen_type)} {} + phase_shift_{std::cref(topo_ptr.phase_shift)}, + load_gens_per_bus_{std::cref(topo_ptr.load_gens_per_bus)}, + sources_per_bus_{std::cref(topo_ptr.sources_per_bus)}, + load_gen_type_{std::cref(topo_ptr.load_gen_type)} {} }; } // namespace power_grid_model::math_solver diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/linear_pf_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/linear_pf_solver.hpp index 18a4159330..f56c28594d 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/linear_pf_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/linear_pf_solver.hpp @@ -54,10 +54,10 @@ template class LinearPFSolver { static constexpr auto is_iterative = false; - LinearPFSolver(YBus const& y_bus, std::shared_ptr const& topo_ptr) + LinearPFSolver(YBus const& y_bus, MathModelTopology const& topo_ptr) : n_bus_{y_bus.size()}, - load_gens_per_bus_{std::cref(topo_ptr->load_gens_per_bus)}, - sources_per_bus_{std::cref(topo_ptr->sources_per_bus)}, + load_gens_per_bus_{std::cref(topo_ptr.load_gens_per_bus)}, + sources_per_bus_{std::cref(topo_ptr.sources_per_bus)}, mat_data_(y_bus.nnz_lu()), sparse_solver_{y_bus.row_indptr_lu(), y_bus.col_indices_lu(), y_bus.lu_diag()}, perm_(n_bus_) {} diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/math_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/math_solver.hpp index 0b12878e0f..14d8aca72f 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/math_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/math_solver.hpp @@ -119,7 +119,7 @@ template class MathSolver : public MathSolverBase { Logger& log, YBus const& y_bus) { if (!newton_raphson_pf_solver_.has_value()) { Timer const timer{log, LogEvent::create_math_solver}; - newton_raphson_pf_solver_.emplace(y_bus, topo_ptr_); + newton_raphson_pf_solver_.emplace(y_bus, *topo_ptr_); } return newton_raphson_pf_solver_.value().run_power_flow(y_bus, input, err_tol, max_iter, log); } @@ -128,7 +128,7 @@ template class MathSolver : public MathSolverBase { Logger& log, YBus const& y_bus) { if (!linear_pf_solver_.has_value()) { Timer const timer{log, LogEvent::create_math_solver}; - linear_pf_solver_.emplace(y_bus, topo_ptr_); + linear_pf_solver_.emplace(y_bus, *topo_ptr_); } return linear_pf_solver_.value().run_power_flow(y_bus, input, log); } @@ -137,7 +137,7 @@ template class MathSolver : public MathSolverBase { Logger& log, YBus const& y_bus) { if (!iterative_current_pf_solver_.has_value()) { Timer const timer{log, LogEvent::create_math_solver}; - iterative_current_pf_solver_.emplace(y_bus, topo_ptr_); + iterative_current_pf_solver_.emplace(y_bus, *topo_ptr_); } return iterative_current_pf_solver_.value().run_power_flow(y_bus, input, err_tol, max_iter, log); } diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_pf_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_pf_solver.hpp index 3bc644e16d..dd6edbbf7d 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_pf_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_pf_solver.hpp @@ -211,7 +211,7 @@ class NewtonRaphsonPFSolver : public IterativePFSolver const& y_bus, std::shared_ptr const& topo_ptr) + NewtonRaphsonPFSolver(YBus const& y_bus, MathModelTopology const& topo_ptr) : IterativePFSolver{y_bus, topo_ptr}, data_jac_(y_bus.nnz_lu()), x_(y_bus.size()), diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/sparse_lu_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/sparse_lu_solver.hpp index c91f453291..518be6bf1e 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/sparse_lu_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/sparse_lu_solver.hpp @@ -11,6 +11,7 @@ #include #include +#include namespace power_grid_model::math_solver { @@ -200,14 +201,14 @@ template class SparseLUSolver { using BlockPermArray = typename entry_trait::BlockPermArray; static constexpr Idx max_iterative_refinement = 5; - SparseLUSolver(IdxVector const& row_indptr, // indptr including fill-ins - IdxVector const& col_indices, // indices including fill-ins - IdxVector const& diag_lu) + SparseLUSolver(std::span row_indptr, // indptr including fill-ins + std::span col_indices, // indices including fill-ins + std::span diag_lu) : size_{static_cast(row_indptr.size()) - 1}, nnz_{row_indptr.back()}, - row_indptr_{&row_indptr}, - col_indices_{&col_indices}, - diag_lu_{&diag_lu} {} + row_indptr_{row_indptr}, + col_indices_{col_indices}, + diag_lu_{diag_lu} {} // solve with new matrix data, need to factorize first void @@ -247,9 +248,9 @@ template class SparseLUSolver { double const perturb_threshold = epsilon_perturbation * matrix_norm_; // local reference - auto const& row_indptr = *row_indptr_; - auto const& col_indices = *col_indices_; - auto const& diag_lu = *diag_lu_; + auto const& row_indptr = row_indptr_; + auto const& col_indices = col_indices_; + auto const& diag_lu = diag_lu_; // lu matrix inplace std::vector& lu_matrix = data; @@ -407,9 +408,9 @@ template class SparseLUSolver { private: Idx size_; Idx nnz_; // number of non zeroes (in block) - IdxVector const* row_indptr_; - IdxVector const* col_indices_; - IdxVector const* diag_lu_; + std::span row_indptr_; + std::span col_indices_; + std::span diag_lu_; // cache value for pivot perturbation for the factorize step bool has_pivot_perturbation_{false}; double matrix_norm_{}; @@ -471,8 +472,8 @@ template class SparseLUSolver { } void calculate_residual(std::vector const& x) { - auto const& row_indptr = *row_indptr_; - auto const& col_indices = *col_indices_; + auto const& row_indptr = row_indptr_; + auto const& col_indices = col_indices_; auto const& original_matrix = original_matrix_.value(); auto const& rhs = rhs_.value(); auto& residual = residual_.value(); @@ -488,8 +489,8 @@ template class SparseLUSolver { } double iterate_and_backward_error(std::vector& x) { - auto const& row_indptr = *row_indptr_; - auto const& col_indices = *col_indices_; + auto const& row_indptr = row_indptr_; + auto const& col_indices = col_indices_; auto const& original_matrix = original_matrix_.value(); auto const& rhs = rhs_.value(); auto const& residual = residual_.value(); @@ -542,8 +543,8 @@ template class SparseLUSolver { // 2. sum all norms of the blocks per row, except the diagonal block // 3. take the maximum of all the sums matrix_norm_ = 0.0; - auto const& row_indptr = *row_indptr_; - auto const& col_indices = *col_indices_; + auto const& row_indptr = row_indptr_; + auto const& col_indices = col_indices_; for (Idx row = 0; row != size_; ++row) { // calculate the sum of the norms of the blocks in the row double row_norm = 0.0; @@ -572,9 +573,9 @@ template class SparseLUSolver { BlockPermArray const& block_perm_array, // pre-calculated permutation, const ref std::vector const& rhs, std::vector& x) const { // local reference - auto const& row_indptr = *row_indptr_; - auto const& col_indices = *col_indices_; - auto const& diag_lu = *diag_lu_; + auto const& row_indptr = row_indptr_; + auto const& col_indices = col_indices_; + auto const& diag_lu = diag_lu_; auto const& lu_matrix = data; // forward substitution with L diff --git a/tests/cpp_unit_tests/test_math_solver_pf.hpp b/tests/cpp_unit_tests/test_math_solver_pf.hpp index 5aa6513bb7..cd36d0e26a 100644 --- a/tests/cpp_unit_tests/test_math_solver_pf.hpp +++ b/tests/cpp_unit_tests/test_math_solver_pf.hpp @@ -89,7 +89,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - PF", SolverType, test_math_solver_ constexpr auto result_tolerance = SolverType::is_iterative ? 1e-12 : 0.15; // linear methods may be very inaccurate - SolverType solver{y_bus, topo_ptr}; + SolverType solver{y_bus, *topo_ptr}; NoLogger log; PowerFlowInput const pf_input = grid.pf_input(); @@ -98,7 +98,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - PF", SolverType, test_math_solver_ } SUBCASE("Test const z pf solver") { - SolverType solver{y_bus, topo_ptr}; + SolverType solver{y_bus, *topo_ptr}; NoLogger log; // const z @@ -113,7 +113,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - PF", SolverType, test_math_solver_ constexpr auto error_tolerance{std::numeric_limits::infinity()}; constexpr auto result_tolerance{0.15}; - SolverType solver{y_bus, topo_ptr}; + SolverType solver{y_bus, *topo_ptr}; NoLogger log; PowerFlowInput const pf_input = grid.pf_input(); @@ -121,7 +121,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - PF", SolverType, test_math_solver_ assert_output(output, grid.output_ref(), false, result_tolerance); } SUBCASE("Test not converge") { - SolverType solver{y_bus, topo_ptr}; + SolverType solver{y_bus, *topo_ptr}; NoLogger log; PowerFlowInput pf_input = grid.pf_input(); @@ -136,7 +136,7 @@ TEST_CASE_TEMPLATE_DEFINE("Test math solver - PF", SolverType, test_math_solver_ singular_param.branch_param[1] = BranchCalcParam{}; singular_param.shunt_param[0] = ComplexTensor{}; y_bus.update_admittance(std::make_shared const>(singular_param)); - SolverType solver{y_bus, topo_ptr}; + SolverType solver{y_bus, *topo_ptr}; NoLogger log; PowerFlowInput const pf_input = grid.pf_input(); From 44f7020760c64fb643b290c138ba64557122543e Mon Sep 17 00:00:00 2001 From: Laurynas Jagutis Date: Mon, 12 Jan 2026 11:59:06 +0200 Subject: [PATCH 6/8] formatting Signed-off-by: Laurynas Jagutis --- .../include/power_grid_model/math_solver/linear_pf_solver.hpp | 3 ++- .../power_grid_model/math_solver/newton_raphson_pf_solver.hpp | 4 ++-- .../power_grid_model/math_solver/newton_raphson_se_solver.hpp | 3 ++- .../include/power_grid_model/math_solver/sparse_lu_solver.hpp | 4 ++-- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/linear_pf_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/linear_pf_solver.hpp index f56c28594d..6317c714c8 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/linear_pf_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/linear_pf_solver.hpp @@ -101,7 +101,8 @@ template class LinearPFSolver { BlockPermArray perm_; void prepare_matrix_and_rhs(YBus const& y_bus, PowerFlowInput const& input, SolverOutput& output) { - detail::prepare_linear_matrix_and_rhs(y_bus, input, load_gens_per_bus_.get(), sources_per_bus_.get(), output, mat_data_); + detail::prepare_linear_matrix_and_rhs(y_bus, input, load_gens_per_bus_.get(), sources_per_bus_.get(), output, + mat_data_); } void calculate_result(YBus const& y_bus, PowerFlowInput const& input, SolverOutput& output) { diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_pf_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_pf_solver.hpp index dd6edbbf7d..e660ce5aca 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_pf_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_pf_solver.hpp @@ -229,8 +229,8 @@ class NewtonRaphsonPFSolver : public IterativePFSolver(y_bus, linear_mat_data); - detail::prepare_linear_matrix_and_rhs(y_bus, input, this->load_gens_per_bus_.get(), this->sources_per_bus_.get(), output, - linear_mat_data); + detail::prepare_linear_matrix_and_rhs(y_bus, input, this->load_gens_per_bus_.get(), + this->sources_per_bus_.get(), output, linear_mat_data); linear_sparse_solver.prefactorize_and_solve(linear_mat_data, linear_perm, output.u, output.u); // get magnitude and angle of start voltage diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_se_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_se_solver.hpp index 2845b23408..b8cd1297df 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_se_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/newton_raphson_se_solver.hpp @@ -772,7 +772,8 @@ template class NewtonRaphsonSESolver { if (measured_values.has_angle()) { return 0.0; } - auto const& theta = x_[math_topo_.get().slack_bus].theta() + delta_x_rhs_[math_topo_.get().slack_bus].theta(); + auto const& theta = + x_[math_topo_.get().slack_bus].theta() + delta_x_rhs_[math_topo_.get().slack_bus].theta(); if constexpr (is_symmetric_v) { return theta; } else { diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/sparse_lu_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/sparse_lu_solver.hpp index 518be6bf1e..ab3d834424 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/sparse_lu_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/sparse_lu_solver.hpp @@ -201,8 +201,8 @@ template class SparseLUSolver { using BlockPermArray = typename entry_trait::BlockPermArray; static constexpr Idx max_iterative_refinement = 5; - SparseLUSolver(std::span row_indptr, // indptr including fill-ins - std::span col_indices, // indices including fill-ins + SparseLUSolver(std::span row_indptr, // indptr including fill-ins + std::span col_indices, // indices including fill-ins std::span diag_lu) : size_{static_cast(row_indptr.size()) - 1}, nnz_{row_indptr.back()}, From 8c714f27e3da066131cc6d8544e14c9b995e7882 Mon Sep 17 00:00:00 2001 From: Laurynas Jagutis Date: Mon, 12 Jan 2026 12:09:53 +0200 Subject: [PATCH 7/8] remove space Signed-off-by: Laurynas Jagutis --- .../include/power_grid_model/math_solver/sparse_lu_solver.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/sparse_lu_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/sparse_lu_solver.hpp index ab3d834424..8ea7791cd8 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/sparse_lu_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/sparse_lu_solver.hpp @@ -201,7 +201,7 @@ template class SparseLUSolver { using BlockPermArray = typename entry_trait::BlockPermArray; static constexpr Idx max_iterative_refinement = 5; - SparseLUSolver(std::span row_indptr, // indptr including fill-ins + SparseLUSolver(std::span row_indptr, // indptr including fill-ins std::span col_indices, // indices including fill-ins std::span diag_lu) : size_{static_cast(row_indptr.size()) - 1}, From 77792234963b902467d279917479781734cbfc4c Mon Sep 17 00:00:00 2001 From: Laurynas Jagutis Date: Mon, 12 Jan 2026 12:38:01 +0200 Subject: [PATCH 8/8] remove shared ptr from short circuit solver, adjust tests Signed-off-by: Laurynas Jagutis --- .../math_solver/math_solver.hpp | 2 +- .../math_solver/short_circuit_solver.hpp | 6 ++-- .../math_solver/sparse_lu_solver.hpp | 2 +- tests/cpp_unit_tests/test_math_solver_sc.cpp | 28 +++++++++---------- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/math_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/math_solver.hpp index df88d97713..1fdb6696dc 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/math_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/math_solver.hpp @@ -87,7 +87,7 @@ template class MathSolver : public MathSolverBase { // construct model if needed if (!iec60909_sc_solver_.has_value()) { Timer const timer{log, LogEvent::create_math_solver}; - iec60909_sc_solver_.emplace(y_bus, topo_ptr_); + iec60909_sc_solver_.emplace(y_bus, *topo_ptr_); } // call calculation diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/short_circuit_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/short_circuit_solver.hpp index c2591c3702..3d2807a8df 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/short_circuit_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/short_circuit_solver.hpp @@ -23,10 +23,10 @@ template class ShortCircuitSolver { typename SparseLUSolver, ComplexValue, ComplexValue>::BlockPermArray; public: - ShortCircuitSolver(YBus const& y_bus, std::shared_ptr const& topo_ptr) + ShortCircuitSolver(YBus const& y_bus, MathModelTopology const& topo_ptr) : n_bus_{y_bus.size()}, - n_source_{topo_ptr->n_source()}, - sources_per_bus_{std::cref(topo_ptr->sources_per_bus)}, + n_source_{topo_ptr.n_source()}, + sources_per_bus_{std::cref(topo_ptr.sources_per_bus)}, mat_data_(y_bus.nnz_lu()), sparse_solver_{y_bus.row_indptr_lu(), y_bus.col_indices_lu(), y_bus.lu_diag()}, perm_{static_cast(n_bus_)} {} diff --git a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/sparse_lu_solver.hpp b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/sparse_lu_solver.hpp index 8ea7791cd8..ab3d834424 100644 --- a/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/sparse_lu_solver.hpp +++ b/power_grid_model_c/power_grid_model/include/power_grid_model/math_solver/sparse_lu_solver.hpp @@ -201,7 +201,7 @@ template class SparseLUSolver { using BlockPermArray = typename entry_trait::BlockPermArray; static constexpr Idx max_iterative_refinement = 5; - SparseLUSolver(std::span row_indptr, // indptr including fill-ins + SparseLUSolver(std::span row_indptr, // indptr including fill-ins std::span col_indices, // indices including fill-ins std::span diag_lu) : size_{static_cast(row_indptr.size()) - 1}, diff --git a/tests/cpp_unit_tests/test_math_solver_sc.cpp b/tests/cpp_unit_tests/test_math_solver_sc.cpp index 4b73fd5d1d..f7ad6d2a29 100644 --- a/tests/cpp_unit_tests/test_math_solver_sc.cpp +++ b/tests/cpp_unit_tests/test_math_solver_sc.cpp @@ -172,7 +172,7 @@ TEST_CASE("Short circuit solver") { SUBCASE("Test short circuit solver 3ph") { YBus const y_bus_asym{topo_sc_ptr, param_asym_ptr}; - ShortCircuitSolver solver{y_bus_asym, topo_sc_ptr}; + ShortCircuitSolver solver{y_bus_asym, *topo_sc_ptr}; auto sc_input = create_sc_test_input(three_phase, FaultPhase::abc, y_fault, vref, fault_buses); auto sc_output_ref = create_sc_test_output(three_phase, z_fault, z0, z0_0, vref, zref); auto output = solver.run_short_circuit(y_bus_asym, sc_input); @@ -185,7 +185,7 @@ TEST_CASE("Short circuit solver") { SUBCASE("Test short circuit solver 3ph solid fault") { YBus const y_bus_asym{topo_sc_ptr, param_asym_ptr}; - ShortCircuitSolver solver{y_bus_asym, topo_sc_ptr}; + ShortCircuitSolver solver{y_bus_asym, *topo_sc_ptr}; auto sc_input = create_sc_test_input(three_phase, FaultPhase::abc, y_fault_solid, vref, fault_buses); auto sc_output_ref = create_sc_test_output(three_phase, z_fault_solid, z0, z0_0, vref, zref); auto output = solver.run_short_circuit(y_bus_asym, sc_input); @@ -194,7 +194,7 @@ TEST_CASE("Short circuit solver") { SUBCASE("Test short circuit solver 3ph sym params") { YBus const y_bus_sym{topo_sc_ptr, param_sym_ptr}; - ShortCircuitSolver solver{y_bus_sym, topo_sc_ptr}; + ShortCircuitSolver solver{y_bus_sym, *topo_sc_ptr}; auto sc_input = create_sc_test_input(three_phase, FaultPhase::abc, y_fault, vref, fault_buses); auto sc_output_ref = create_sc_test_output(three_phase, z_fault, z0, z0_0, vref, zref); auto output = solver.run_short_circuit(y_bus_sym, sc_input); @@ -207,7 +207,7 @@ TEST_CASE("Short circuit solver") { SUBCASE("Test short circuit solver 3ph sym params solid fault") { YBus const y_bus_sym{topo_sc_ptr, param_sym_ptr}; - ShortCircuitSolver solver{y_bus_sym, topo_sc_ptr}; + ShortCircuitSolver solver{y_bus_sym, *topo_sc_ptr}; auto sc_input = create_sc_test_input(three_phase, FaultPhase::abc, y_fault_solid, vref, fault_buses); auto sc_output_ref = create_sc_test_output(three_phase, z_fault_solid, z0, z0_0, vref, zref); auto output = solver.run_short_circuit(y_bus_sym, sc_input); @@ -216,7 +216,7 @@ TEST_CASE("Short circuit solver") { SUBCASE("Test short circuit solver 1phg") { YBus const y_bus_asym{topo_sc_ptr, param_asym_ptr}; - ShortCircuitSolver solver{y_bus_asym, topo_sc_ptr}; + ShortCircuitSolver solver{y_bus_asym, *topo_sc_ptr}; auto sc_input = create_sc_test_input(single_phase_to_ground, FaultPhase::a, y_fault, vref, fault_buses); auto sc_output_ref = create_sc_test_output(single_phase_to_ground, z_fault, z0, z0_0, vref, zref); auto output = solver.run_short_circuit(y_bus_asym, sc_input); @@ -229,7 +229,7 @@ TEST_CASE("Short circuit solver") { SUBCASE("Test short circuit solver 1phg solid fault") { YBus const y_bus_asym{topo_sc_ptr, param_asym_ptr}; - ShortCircuitSolver solver{y_bus_asym, topo_sc_ptr}; + ShortCircuitSolver solver{y_bus_asym, *topo_sc_ptr}; auto sc_input = create_sc_test_input(single_phase_to_ground, FaultPhase::a, y_fault_solid, vref, fault_buses); auto sc_output_ref = create_sc_test_output(single_phase_to_ground, z_fault_solid, z0, z0_0, vref, zref); @@ -239,7 +239,7 @@ TEST_CASE("Short circuit solver") { SUBCASE("Test short circuit solver 2ph") { YBus const y_bus_asym{topo_sc_ptr, param_asym_ptr}; - ShortCircuitSolver solver{y_bus_asym, topo_sc_ptr}; + ShortCircuitSolver solver{y_bus_asym, *topo_sc_ptr}; auto sc_input = create_sc_test_input(two_phase, FaultPhase::bc, y_fault, vref, fault_buses); auto sc_output_ref = create_sc_test_output(two_phase, z_fault, z0, z0_0, vref, zref); auto output = solver.run_short_circuit(y_bus_asym, sc_input); @@ -251,7 +251,7 @@ TEST_CASE("Short circuit solver") { SUBCASE("Test short circuit solver 2ph solid fault") { YBus const y_bus_asym{topo_sc_ptr, param_asym_ptr}; - ShortCircuitSolver solver{y_bus_asym, topo_sc_ptr}; + ShortCircuitSolver solver{y_bus_asym, *topo_sc_ptr}; auto sc_input = create_sc_test_input(two_phase, FaultPhase::bc, y_fault_solid, vref, fault_buses); auto sc_output_ref = create_sc_test_output(two_phase, z_fault_solid, z0, z0_0, vref, zref); auto output = solver.run_short_circuit(y_bus_asym, sc_input); @@ -260,7 +260,7 @@ TEST_CASE("Short circuit solver") { SUBCASE("Test short circuit solver 2phg") { YBus const y_bus_asym{topo_sc_ptr, param_asym_ptr}; - ShortCircuitSolver solver{y_bus_asym, topo_sc_ptr}; + ShortCircuitSolver solver{y_bus_asym, *topo_sc_ptr}; auto sc_input = create_sc_test_input(two_phase_to_ground, FaultPhase::bc, y_fault, vref, fault_buses); auto sc_output_ref = create_sc_test_output(two_phase_to_ground, z_fault, z0, z0_0, vref, zref); auto output = solver.run_short_circuit(y_bus_asym, sc_input); @@ -273,7 +273,7 @@ TEST_CASE("Short circuit solver") { SUBCASE("Test short circuit solver 2phg solid") { YBus const y_bus_asym{topo_sc_ptr, param_asym_ptr}; - ShortCircuitSolver solver{y_bus_asym, topo_sc_ptr}; + ShortCircuitSolver solver{y_bus_asym, *topo_sc_ptr}; auto sc_input = create_sc_test_input(two_phase_to_ground, FaultPhase::bc, y_fault_solid, vref, fault_buses); auto sc_output_ref = create_sc_test_output(two_phase_to_ground, z_fault_solid, z0, z0_0, vref, zref); @@ -284,7 +284,7 @@ TEST_CASE("Short circuit solver") { SUBCASE("Test short circuit solver no faults") { YBus const y_bus_sym{topo_sc_ptr, param_sym_ptr}; YBus const y_bus_asym{topo_sc_ptr, param_asym_ptr}; - ShortCircuitSolver solver_asym{y_bus_asym, topo_sc_ptr}; + ShortCircuitSolver solver_asym{y_bus_asym, *topo_sc_ptr}; ShortCircuitInput sc_input; sc_input.source = {vref}; sc_input.fault_buses = {from_dense, {}, topo_sc_ptr->n_bus()}; @@ -292,7 +292,7 @@ TEST_CASE("Short circuit solver") { auto asym_output = solver_asym.run_short_circuit(y_bus_asym, sc_input); assert_sc_output(asym_output, asym_sc_output_ref); - ShortCircuitSolver solver_sym{y_bus_sym, topo_sc_ptr}; + ShortCircuitSolver solver_sym{y_bus_sym, *topo_sc_ptr}; auto sym_sc_output_ref = blank_sc_output(vref); auto sym_output = solver_sym.run_short_circuit(y_bus_sym, sc_input); assert_sc_output(sym_output, sym_sc_output_ref); @@ -319,8 +319,8 @@ TEST_CASE("Short circuit solver") { auto sym_param_comp_ptr = std::make_shared const>(sym_param_comp); YBus const y_bus_asym{topo_comp_ptr, asym_param_comp_ptr}; YBus const y_bus_sym{topo_comp_ptr, sym_param_comp_ptr}; - ShortCircuitSolver solver{y_bus_asym, topo_comp_ptr}; - ShortCircuitSolver sym_solver{y_bus_sym, topo_comp_ptr}; + ShortCircuitSolver solver{y_bus_asym, *topo_comp_ptr}; + ShortCircuitSolver sym_solver{y_bus_sym, *topo_comp_ptr}; DoubleComplex const if_comp = vref / (zref + z_fault); DoubleComplex const uf_comp = vref - if_comp * zref;