From 499705f03449c7394ba945443287c923694169a6 Mon Sep 17 00:00:00 2001 From: abdourahmanbarry Date: Wed, 26 Aug 2026 06:44:24 +0000 Subject: [PATCH 1/8] Refactor common microgrid code and update examples --- .../PowerElectronics/Microgrid/CMakeLists.txt | 5 + .../PowerElectronics/Microgrid/Microgrid.cpp | 161 +-------- .../MicrogridNetwork.hpp | 309 ++++++++++++++++++ .../ScaleMicrogrid/CMakeLists.txt | 9 + .../ScaleMicrogrid/ScaleMicrogrid.cpp | 166 +--------- .../ScaleMicrogridArbitrary.cpp | 171 +--------- 6 files changed, 368 insertions(+), 453 deletions(-) create mode 100644 examples/PowerElectronics/PowerElectronicsExamplesHelper/MicrogridNetwork.hpp diff --git a/examples/PowerElectronics/Microgrid/CMakeLists.txt b/examples/PowerElectronics/Microgrid/CMakeLists.txt index 6eae26be3..86dea6678 100644 --- a/examples/PowerElectronics/Microgrid/CMakeLists.txt +++ b/examples/PowerElectronics/Microgrid/CMakeLists.txt @@ -1,4 +1,9 @@ add_executable(microgrid Microgrid.cpp) + +target_include_directories( + microgrid + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/..) + target_link_libraries( microgrid GridKit::power_elec_disgen diff --git a/examples/PowerElectronics/Microgrid/Microgrid.cpp b/examples/PowerElectronics/Microgrid/Microgrid.cpp index dfd71a7e1..e20d9e5ac 100644 --- a/examples/PowerElectronics/Microgrid/Microgrid.cpp +++ b/examples/PowerElectronics/Microgrid/Microgrid.cpp @@ -1,21 +1,13 @@ #include -#include -#include -#include +#include #include -#include -#include - -#include -#include -#include -#include -#include -#include + #include #include #include +#include "Common/MicrogridNetwork.hpp" + int main(int /* argc */, char const** /* argv */) { /// @todo Needs to be modified. Some components are small relative to others thus @@ -28,139 +20,16 @@ int main(int /* argc */, char const** /* argv */) // Create model auto* sysmodel = new GridKit::PowerElectronicsModel(use_jac); - // Modeled after the problem in the paper - double RN = 1.0e4; - - // DG Params - static constexpr auto pi = std::numbers::pi_v; - - GridKit::DistributedGeneratorParameters parms1; - parms1.wb_ = 2.0 * pi * 50.0; - parms1.wc_ = 31.41; - parms1.mp_ = 9.4e-5; - parms1.Vn_ = 380.0; - parms1.nq_ = 1.3e-3; - parms1.F_ = 0.75; - parms1.Kiv_ = 420.0; - parms1.Kpv_ = 0.1; - parms1.Kic_ = 2.0e4; - parms1.Kpc_ = 15.0; - parms1.Cf_ = 5.0e-5; - parms1.rLf_ = 0.1; - parms1.Lf_ = 1.35e-3; - parms1.rLc_ = 0.03; - parms1.Lc_ = 0.35e-3; - - GridKit::DistributedGeneratorParameters parms2; - // Parameters from MATLAB Microgrid code for first DG - parms2.wb_ = 2.0 * pi * 50.0; - parms2.wc_ = 31.41; - parms2.mp_ = 12.5e-5; - parms2.Vn_ = 380.0; - parms2.nq_ = 1.5e-3; - parms2.F_ = 0.75; - parms2.Kiv_ = 390.0; - parms2.Kpv_ = 0.05; - parms2.Kic_ = 16.0e3; - parms2.Kpc_ = 10.5; - parms2.Cf_ = 50.0e-6; - parms2.rLf_ = 0.1; - parms2.Lf_ = 1.35e-3; - parms2.rLc_ = 0.03; - parms2.Lc_ = 0.35e-3; - - // Line params - double rline1 = 0.23; - double Lline1 = 0.1 / (2.0 * pi * 50.0); - - double rline2 = 0.35; - double Lline2 = 0.58 / (2.0 * pi * 50.0); - - double rline3 = 0.23; - double Lline3 = 0.1 / (2.0 * pi * 50.0); - - // load parms - double rload1 = 3.0; - double Lload1 = 2.0 / (2.0 * pi * 50.0); - - double rload2 = 2.0; - double Lload2 = 1.0 / (2.0 * pi * 50.0); - - using SignalNode = GridKit::PowerElectronics::SignalNode; - SignalNode dg_signal; - - sysmodel->addNode(&dg_signal); - - using Bus = GridKit::PowerElectronics::MicrogridBus; - Bus bus1; - Bus bus2; - Bus bus3; - Bus bus4; - - sysmodel->addNode(&bus1); - sysmodel->addNode(&bus2); - sysmodel->addNode(&bus3); - sysmodel->addNode(&bus4); - - // dg 1 - GridKit::DistributedGenerator* dg1 = new GridKit::DistributedGenerator( - 0, parms1, true, &dg_signal, &bus1); - sysmodel->addComponent(dg1); - - // dg 2 - GridKit::DistributedGenerator* dg2 = new GridKit::DistributedGenerator( - 1, parms1, false, &dg_signal, &bus2); - sysmodel->addComponent(dg2); - - // dg 3 - GridKit::DistributedGenerator* dg3 = new GridKit::DistributedGenerator( - 2, parms2, false, &dg_signal, &bus3); - sysmodel->addComponent(dg3); - - // dg 4 - GridKit::DistributedGenerator* dg4 = new GridKit::DistributedGenerator( - 3, parms2, false, &dg_signal, &bus4); - sysmodel->addComponent(dg4); - - // Lines - - // line 1 - GridKit::MicrogridLine* l1 = new GridKit::MicrogridLine( - 4, rline1, Lline1, &dg_signal, &bus1, &bus2); - sysmodel->addComponent(l1); - - // line 2 - GridKit::MicrogridLine* l2 = new GridKit::MicrogridLine( - 5, rline2, Lline2, &dg_signal, &bus2, &bus3); - sysmodel->addComponent(l2); - - // line 3 - GridKit::MicrogridLine* l3 = new GridKit::MicrogridLine( - 6, rline3, Lline3, &dg_signal, &bus3, &bus4); - sysmodel->addComponent(l3); - - // loads - - // load 1 - GridKit::MicrogridLoad* load1 = new GridKit::MicrogridLoad(7, rload1, Lload1, &dg_signal, &bus1); - sysmodel->addComponent(load1); - - // load 2 - GridKit::MicrogridLoad* load2 = new GridKit::MicrogridLoad(8, rload2, Lload2, &dg_signal, &bus3); - sysmodel->addComponent(load2); - - // Virtual PQ Buses - GridKit::MicrogridBusDQ* bus_para_1 = new GridKit::MicrogridBusDQ(9, RN, &bus1); - sysmodel->addComponent(bus_para_1); - - GridKit::MicrogridBusDQ* bus_para_2 = new GridKit::MicrogridBusDQ(10, RN, &bus2); - sysmodel->addComponent(bus_para_2); - - GridKit::MicrogridBusDQ* bus_para_3 = new GridKit::MicrogridBusDQ(11, RN, &bus3); - sysmodel->addComponent(bus_para_3); - - GridKit::MicrogridBusDQ* bus_para_4 = new GridKit::MicrogridBusDQ(12, RN, &bus4); - sysmodel->addComponent(bus_para_4); + // Build the four-generator microgrid network. + size_t N_size = 2; + GridKit::ScaleMicrogridNetwork network(N_size); + + GridKit::buildScaleMicrogridNetwork(network); + GridKit::assembleSystem(network, *sysmodel); + + // Generator parameters used to construct the initial conditions. + const auto& parms1 = network.DGParam_list[0]; + const auto& parms2 = network.DGParam_list[2]; sysmodel->allocate(); @@ -192,7 +61,7 @@ int main(int /* argc */, char const** /* argv */) } // since the intial P_com = 0 - y[dg_signal.getNodeConnection(0).idx_] = parms1.wb_; + y[network.dg_signal.getNodeConnection(0).idx_] = parms1.wb_; sysmodel->y().setDataUpdated(); sysmodel->yp().setDataUpdated(); diff --git a/examples/PowerElectronics/PowerElectronicsExamplesHelper/MicrogridNetwork.hpp b/examples/PowerElectronics/PowerElectronicsExamplesHelper/MicrogridNetwork.hpp new file mode 100644 index 000000000..84bc1b118 --- /dev/null +++ b/examples/PowerElectronics/PowerElectronicsExamplesHelper/MicrogridNetwork.hpp @@ -0,0 +1,309 @@ +// MicrogridNetwork.hpp + +#pragma once + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace GridKit +{ + + using index_type = size_t; + using real_type = double; + + using SignalNode = GridKit::PowerElectronics::SignalNode; + using Bus = GridKit::PowerElectronics::MicrogridBus; + using BusDQ = GridKit::MicrogridBusDQ; + using DGGenerator = GridKit::DistributedGenerator; + using Line = GridKit::MicrogridLine; + using Load = GridKit::MicrogridLoad; + using GenParams = GridKit::DistributedGeneratorParameters; + + /* + * Contains components and nodes that make up the scaled microgrid network. + * + * The network contains 2 * N_size IBRs and stores the physical components + * that make up the scale microgrid. + */ + struct ScaleMicrogridNetwork + { + size_t model_id_next; + size_t N_size; + SignalNode dg_signal; + std::vector buses; + std::vector busesDQ; + std::vector generators; + std::vector lines; + std::vector loads; + std::vector DGParam_list; + + ScaleMicrogridNetwork(size_t n_size) + : model_id_next(0), + N_size(n_size), + buses(2 * n_size), + busesDQ(2 * n_size, nullptr), + generators(2 * n_size, nullptr), + lines(2 * n_size, nullptr), + loads(2 * n_size, nullptr), + DGParam_list(2 * n_size) + { + } + }; + + /** + * @brief Construct all components of a scaled microgrid network. + * + * Builds a microgrid containing @c 2*N_size generators and buses connected + * in a chain by transmission lines. Loads are connected to every other bus, + * and a virtual DQ bus is associated with each physical bus. + * + * The first two generators use the reference generator parameter set, while + * all remaining generators use the second parameter set. Line parameters + * alternate along the network, and the first load uses a different parameter + * set from the remaining loads. + * + * The created components are stored in @p network and assigned unique model + * identifiers using @c network.model_id_next. + * + * @param[in,out] network Network in which the microgrid components are + * constructed and stored. + * + * @pre @c network.N_size is greater than zero. + * @pre The component storage in @p network has been sized consistently with + * @c network.N_size. + * + * @post @p network contains @c 2*N_size generators and virtual DQ buses. + * @post @p network contains @c 2*N_size-1 transmission lines connecting + * consecutive buses. + * @post @p network contains @c N_size loads connected to every other bus. + * @post @c network.DGParam_list contains the parameters associated with each + * generator. + * @post @c network.model_id_next is advanced for every component created. + * + * @note Components are dynamically allocated and their pointers are stored + * in the corresponding network component vectors. + */ + inline void buildScaleMicrogridNetwork(ScaleMicrogridNetwork& network) + { + size_t N_size = network.N_size; + + assert(N_size > 0); + // Every Bus has the same virtual resistance. This is due to numerical stability as mentioned in the paper. + real_type RN = 1.0e4; + + // DG Params Vector + // All DGs have the same set of parameters except for the first two. + GenParams DG_parms1; + DG_parms1.wb_ = 2.0 * M_PI * 50.0; + DG_parms1.wc_ = 31.41; + DG_parms1.mp_ = 9.4e-5; + DG_parms1.Vn_ = 380.0; + DG_parms1.nq_ = 1.3e-3; + DG_parms1.F_ = 0.75; + DG_parms1.Kiv_ = 420.0; + DG_parms1.Kpv_ = 0.1; + DG_parms1.Kic_ = 2.0e4; + DG_parms1.Kpc_ = 15.0; + DG_parms1.Cf_ = 5.0e-5; + DG_parms1.rLf_ = 0.1; + DG_parms1.Lf_ = 1.35e-3; + DG_parms1.rLc_ = 0.03; + DG_parms1.Lc_ = 0.35e-3; + + GenParams DG_parms2; + DG_parms2.wb_ = 2.0 * M_PI * 50.0; + DG_parms2.wc_ = 31.41; + DG_parms2.mp_ = 12.5e-5; + DG_parms2.Vn_ = 380.0; + DG_parms2.nq_ = 1.5e-3; + DG_parms2.F_ = 0.75; + DG_parms2.Kiv_ = 390.0; + DG_parms2.Kpv_ = 0.05; + DG_parms2.Kic_ = 16.0e3; + DG_parms2.Kpc_ = 10.5; + DG_parms2.Cf_ = 50.0e-6; + DG_parms2.rLf_ = 0.1; + DG_parms2.Lf_ = 1.35e-3; + DG_parms2.rLc_ = 0.03; + DG_parms2.Lc_ = 0.35e-3; + + network.DGParam_list.assign(2 * N_size, DG_parms2); + + // First two generators use parameters 1 + if (network.DGParam_list.size() >= 1) + { + network.DGParam_list[0] = DG_parms1; + } + if (network.DGParam_list.size() >= 2) + { + network.DGParam_list[1] = DG_parms1; + } + + // line vector params + // Every odd line has the same parameters and every even line has the same parameters + real_type rline1 = 0.23; + real_type Lline1 = 0.1 / (2.0 * M_PI * 50.0); + real_type rline2 = 0.35; + real_type Lline2 = 0.58 / (2.0 * M_PI * 50.0); + std::vector rline_list(2 * N_size - 1, 0.0); + std::vector Lline_list(2 * N_size - 1, 0.0); + for (index_type i = 0; i < rline_list.size(); i++) + { + rline_list[i] = (i % 2) ? rline2 : rline1; + Lline_list[i] = (i % 2) ? Lline2 : Lline1; + } + + // load parms + // Only the first load has the same paramaters. + real_type rload1 = 3.0; + real_type Lload1 = 2.0 / (2.0 * M_PI * 50.0); + real_type rload2 = 2.0; + real_type Lload2 = 1.0 / (2.0 * M_PI * 50.0); + + std::vector rload_list(N_size, rload2); + std::vector Lload_list(N_size, Lload2); + if (rload_list.size() >= 1) + { + rload_list[0] = rload1; + Lload_list[0] = Lload1; + } + + // Create the reference generator + auto* dg_ref = new DGGenerator(network.model_id_next++, + network.DGParam_list[0], + true, + &network.dg_signal, + &network.buses[0]); + + network.generators[0] = dg_ref; + + // Create the remaining generators. + for (index_type i = 1; i < 2 * N_size; i++) + { + auto* dg = new DGGenerator(network.model_id_next++, + network.DGParam_list[i], + false, + &network.dg_signal, + &network.buses[i]); + + network.generators[i] = dg; + } + + // // Create transmission lines between consecutive buses. + for (index_type i = 0; i < 2 * N_size - 1; i++) + { + auto* line_model = new Line(network.model_id_next++, + rline_list[i], + Lline_list[i], + &network.dg_signal, + &network.buses[i], + &network.buses[i + 1]); + + network.lines[i + 1] = line_model; + } + + // Create loads on every other bus. + for (index_type i = 0; i < N_size; i++) + { + auto* load_model = new Load(network.model_id_next++, + rload_list[i], + Lload_list[i], + &network.dg_signal, + &network.buses[2 * i]); + + network.loads[2 * i] = load_model; + } + + // Create and Add all the microgrid Virtual DQ Buses + for (index_type i = 0; i < 2 * N_size; i++) + { + auto* virDQbus_model = new BusDQ(network.model_id_next++, + RN, + &network.buses[i]); + + network.busesDQ[i] = virDQbus_model; + } + } + + /** + * @brief Assemble a scaled microgrid network into a power electronics model. + * + * Adds the signal node, physical buses, generators, transmission lines, + * loads, and virtual DQ buses stored in @p network to @p sys_model. + * + * This function does not construct or allocate any network components. The + * physical network must already have been created by + * buildScaleMicrogridNetwork(). + * + * @param[in] network Constructed scaled microgrid network whose components + * are added to the system model. + * @param[in,out] sys_model Power electronics model to which the network + * components and nodes are added. + * + * @pre @c network.N_size is greater than zero. + * @pre @p network has been constructed by buildScaleMicrogridNetwork(). + * @pre All component and node pointers referenced by @p network are valid. + * + * @post The signal node and all physical buses in @p network have been added + * to @p sys_model. + * @post All generators, transmission lines, loads, and virtual DQ buses in + * @p network have been added to @p sys_model. + * + * @note This function only assembles the network into the system model. It + * does not call PowerElectronicsModel::allocate(). + */ + inline void assembleSystem(ScaleMicrogridNetwork& network, GridKit::PowerElectronicsModel& sys_model) + { + size_t N_size = network.N_size; + + // Ensure minimum size requirement + assert(N_size > 0); + + // Add all bus nodes + sys_model.addNode(&network.dg_signal); + + for (size_t i = 0; i < 2 * N_size; i++) + { + sys_model.addNode(&network.buses[i]); + } + + // Add all generators + for (index_type i = 0; i < 2 * N_size; i++) + { + sys_model.addComponent(network.generators[i]); + } + + // Load all the Line components + for (index_type i = 1; i < 2 * N_size; i++) + { + sys_model.addComponent(network.lines[i]); + } + + // Load all the Load components + for (index_type i = 0; i < 2 * N_size; i++) + { + if (network.loads[i] != nullptr) + { + sys_model.addComponent(network.loads[i]); + } + } + + // Add all the microgrid Virtual DQ Buses + for (index_type i = 0; i < 2 * N_size; i++) + { + sys_model.addComponent(network.busesDQ[i]); + } + } +} // namespace GridKit diff --git a/examples/PowerElectronics/ScaleMicrogrid/CMakeLists.txt b/examples/PowerElectronics/ScaleMicrogrid/CMakeLists.txt index 0334a939b..6bee549d3 100644 --- a/examples/PowerElectronics/ScaleMicrogrid/CMakeLists.txt +++ b/examples/PowerElectronics/ScaleMicrogrid/CMakeLists.txt @@ -1,5 +1,14 @@ add_executable(scalemicrogrid ScaleMicrogrid.cpp) add_executable(scalemicrogridarbitrary ScaleMicrogridArbitrary.cpp) + +target_include_directories( + scalemicrogrid + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/..) + +target_include_directories( + scalemicrogridarbitrary + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/..) + target_link_libraries( scalemicrogrid GridKit::power_elec_disgen diff --git a/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogrid.cpp b/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogrid.cpp index cc8dc28ee..1e97cd56a 100644 --- a/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogrid.cpp +++ b/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogrid.cpp @@ -1,22 +1,14 @@ #include -#include -#include -#include #include -#include -#include - -#include -#include -#include -#include -#include -#include +#include + #include #include #include #include +#include "Common/MicrogridNetwork.hpp" + using index_type = size_t; using real_type = double; @@ -94,143 +86,11 @@ int test(index_type Nsize, real_type error_tol, bool debug_output) std::cout << "Using default Nsize = 8.\n"; } - // Modeled after the problem in the paper - // Every Bus has the same virtual resistance. This is due to the numerical stability as mentioned in the paper. - real_type RN = 1.0e4; - - // DG Params Vector - // All DGs have the same set of parameters except for the first two. - static constexpr auto pi = std::numbers::pi_v; - - GridKit::DistributedGeneratorParameters DG_parms1; - DG_parms1.wb_ = 2.0 * pi * 50.0; - DG_parms1.wc_ = 31.41; - DG_parms1.mp_ = 9.4e-5; - DG_parms1.Vn_ = 380.0; - DG_parms1.nq_ = 1.3e-3; - DG_parms1.F_ = 0.75; - DG_parms1.Kiv_ = 420.0; - DG_parms1.Kpv_ = 0.1; - DG_parms1.Kic_ = 2.0e4; - DG_parms1.Kpc_ = 15.0; - DG_parms1.Cf_ = 5.0e-5; - DG_parms1.rLf_ = 0.1; - DG_parms1.Lf_ = 1.35e-3; - DG_parms1.rLc_ = 0.03; - DG_parms1.Lc_ = 0.35e-3; - - GridKit::DistributedGeneratorParameters DG_parms2; - DG_parms2.wb_ = 2.0 * pi * 50.0; - DG_parms2.wc_ = 31.41; - DG_parms2.mp_ = 12.5e-5; - DG_parms2.Vn_ = 380.0; - DG_parms2.nq_ = 1.5e-3; - DG_parms2.F_ = 0.75; - DG_parms2.Kiv_ = 390.0; - DG_parms2.Kpv_ = 0.05; - DG_parms2.Kic_ = 16.0e3; - DG_parms2.Kpc_ = 10.5; - DG_parms2.Cf_ = 50.0e-6; - DG_parms2.rLf_ = 0.1; - DG_parms2.Lf_ = 1.35e-3; - DG_parms2.rLc_ = 0.03; - DG_parms2.Lc_ = 0.35e-3; - - std::vector> DGParams_list(2 * Nsize, DG_parms2); - - DGParams_list[0] = DG_parms1; - DGParams_list[1] = DG_parms1; - - // line vector params - // Every odd line has the same parameters and every even line has the same parameters - real_type rline1 = 0.23; - real_type Lline1 = 0.1 / (2.0 * pi * 50.0); - real_type rline2 = 0.35; - real_type Lline2 = 0.58 / (2.0 * pi * 50.0); - std::vector rline_list(2 * Nsize - 1, 0.0); - std::vector Lline_list(2 * Nsize - 1, 0.0); - for (index_type i = 0; i < rline_list.size(); i++) - { - rline_list[i] = (i % 2) ? rline2 : rline1; - Lline_list[i] = (i % 2) ? Lline2 : Lline1; - } - - // load parms - // Only the first load has the same paramaters. - real_type rload1 = 3.0; - real_type Lload1 = 2.0 / (2.0 * pi * 50.0); - real_type rload2 = 2.0; - real_type Lload2 = 1.0 / (2.0 * pi * 50.0); - - std::vector rload_list(Nsize, rload2); - std::vector Lload_list(Nsize, Lload2); - rload_list[0] = rload1; - Lload_list[0] = Lload1; - - using SignalNode = GridKit::PowerElectronics::SignalNode; - SignalNode dg_signal; - sys_model->addNode(&dg_signal); - - using Bus = GridKit::PowerElectronics::MicrogridBus; - std::unique_ptr[]> buses = std::make_unique[]>(2 * Nsize); - for (size_t i = 0; i < 2 * Nsize; i++) - { - buses[i] = std::make_unique(); - sys_model->addNode(buses[i].get()); - } - - // Create the reference DG - auto* dg_ref = new DistributedGenerator(0, - DGParams_list[0], - true, - &dg_signal, - buses[0].get()); - sys_model->addComponent(dg_ref); - - // Keep track of models and index location - index_type model_id = 1; - // Add all other DGs - for (index_type i = 1; i < 2 * Nsize; i++) - { - // current DG to add - auto* dg = new DistributedGenerator(model_id++, - DGParams_list[i], - false, - &dg_signal, - buses[i].get()); - sys_model->addComponent(dg); - } - - // Load all the Line compoenents - for (index_type i = 0; i < 2 * Nsize - 1; i++) - { - // line - auto* line_model = new MicrogridLine(model_id++, - rline_list[i], - Lline_list[i], - &dg_signal, - buses[i].get(), - buses[i + 1].get()); - sys_model->addComponent(line_model); - } - - // Load all the Load components - for (index_type i = 0; i < Nsize; i++) - { - auto* load_model = new MicrogridLoad(model_id++, - rload_list[i], - Lload_list[i], - &dg_signal, - buses[2 * i].get()); - sys_model->addComponent(load_model); - } + // Build and assemble the scaled microgrid network. + ScaleMicrogridNetwork network(Nsize); - // Add all the microgrid Virtual DQ Buses - for (index_type i = 0; i < 2 * Nsize; i++) - { - auto* virDQbus_model = new MicrogridBusDQ(model_id++, RN, buses[i].get()); - sys_model->addComponent(virDQbus_model); - } + buildScaleMicrogridNetwork(network); + assembleSystem(network, *sys_model); // allocate all the intial conditions sys_model->allocate(); @@ -253,13 +113,15 @@ int test(index_type Nsize, real_type error_tol, bool debug_output) // Create initial derivatives specifics generated in MATLAB for (index_type i = 0; i < 2 * Nsize; i++) { - yp[13 * i - 1 + 2] = DGParams_list[i].Vn_; - yp[13 * i - 1 + 4] = DGParams_list[i].Kpv_ * DGParams_list[i].Vn_; - yp[13 * i - 1 + 6] = (DGParams_list[i].Kpc_ * DGParams_list[i].Kpv_ * DGParams_list[i].Vn_) / DGParams_list[i].Lf_; + const auto& params = network.DGParam_list[i]; + + yp[13 * i - 1 + 2] = params.Vn_; + yp[13 * i - 1 + 4] = params.Kpv_ * params.Vn_; + yp[13 * i - 1 + 6] = (params.Kpc_ * params.Kpv_ * params.Vn_) / params.Lf_; } // since the intial P_com = 0, the set the intial vector to the reference frame - y[dg_signal.getNodeConnection(0).idx_] = DG_parms1.wb_; + y[network.dg_signal.getNodeConnection(0).idx_] = network.DGParam_list[0].wb_; sys_model->y().setDataUpdated(); sys_model->yp().setDataUpdated(); diff --git a/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogridArbitrary.cpp b/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogridArbitrary.cpp index a8ab6a4a1..c83ce2979 100644 --- a/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogridArbitrary.cpp +++ b/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogridArbitrary.cpp @@ -1,20 +1,13 @@ #include -#include -#include -#include #include -#include -#include -#include -#include -#include -#include #include #include #include #include +#include "Common/MicrogridNetwork.hpp" + using index_type = size_t; using real_type = double; @@ -79,149 +72,11 @@ int printMicrogridSystems(index_type N_size) return 1; } - // Modeled after the problem in the paper - // Every Bus has the same virtual resistance. This is due to numerical stability as mentioned in the paper. - real_type RN = 1.0e4; - - // DG Params Vector - // All DGs have the same set of parameters except for the first two. - static constexpr auto pi = std::numbers::pi_v; - - GridKit::DistributedGeneratorParameters DG_parms1; - DG_parms1.wb_ = 2.0 * pi * 50.0; - DG_parms1.wc_ = 31.41; - DG_parms1.mp_ = 9.4e-5; - DG_parms1.Vn_ = 380.0; - DG_parms1.nq_ = 1.3e-3; - DG_parms1.F_ = 0.75; - DG_parms1.Kiv_ = 420.0; - DG_parms1.Kpv_ = 0.1; - DG_parms1.Kic_ = 2.0e4; - DG_parms1.Kpc_ = 15.0; - DG_parms1.Cf_ = 5.0e-5; - DG_parms1.rLf_ = 0.1; - DG_parms1.Lf_ = 1.35e-3; - DG_parms1.rLc_ = 0.03; - DG_parms1.Lc_ = 0.35e-3; - - GridKit::DistributedGeneratorParameters DG_parms2; - DG_parms2.wb_ = 2.0 * pi * 50.0; - DG_parms2.wc_ = 31.41; - DG_parms2.mp_ = 12.5e-5; - DG_parms2.Vn_ = 380.0; - DG_parms2.nq_ = 1.5e-3; - DG_parms2.F_ = 0.75; - DG_parms2.Kiv_ = 390.0; - DG_parms2.Kpv_ = 0.05; - DG_parms2.Kic_ = 16.0e3; - DG_parms2.Kpc_ = 10.5; - DG_parms2.Cf_ = 50.0e-6; - DG_parms2.rLf_ = 0.1; - DG_parms2.Lf_ = 1.35e-3; - DG_parms2.rLc_ = 0.03; - DG_parms2.Lc_ = 0.35e-3; - - std::vector> DGParams_list(2 * N_size, DG_parms2); - - // First two generators use parameters 1 - if (DGParams_list.size() >= 1) - DGParams_list[0] = DG_parms1; - if (DGParams_list.size() >= 2) - DGParams_list[1] = DG_parms1; - - // line vector params - // Every odd line has the same parameters and every even line has the same parameters - real_type rline1 = 0.23; - real_type Lline1 = 0.1 / (2.0 * pi * 50.0); - real_type rline2 = 0.35; - real_type Lline2 = 0.58 / (2.0 * pi * 50.0); - std::vector rline_list(2 * N_size - 1, 0.0); - std::vector Lline_list(2 * N_size - 1, 0.0); - for (index_type i = 0; i < rline_list.size(); i++) - { - rline_list[i] = (i % 2) ? rline2 : rline1; - Lline_list[i] = (i % 2) ? Lline2 : Lline1; - } - - // load parms - // Only the first load has the same paramaters. - real_type rload1 = 3.0; - real_type Lload1 = 2.0 / (2.0 * pi * 50.0); - real_type rload2 = 2.0; - real_type Lload2 = 1.0 / (2.0 * pi * 50.0); - - std::vector rload_list(N_size, rload2); - std::vector Lload_list(N_size, Lload2); - if (rload_list.size() >= 1) - { - rload_list[0] = rload1; - Lload_list[0] = Lload1; - } - - using SignalNode = GridKit::PowerElectronics::SignalNode; - SignalNode dg_signal; - sys_model.addNode(&dg_signal); + // Build and assemble the scaled microgrid network. + ScaleMicrogridNetwork network(N_size); - using Bus = GridKit::PowerElectronics::MicrogridBus; - std::unique_ptr[]> buses = std::make_unique[]>(2 * N_size); - for (size_t i = 0; i < 2 * N_size; i++) - { - buses[i] = std::make_unique(); - sys_model.addNode(buses[i].get()); - } - - // Create the reference DG - auto* dg_ref = new DistributedGenerator(0, - DGParams_list[0], - true, - &dg_signal, - buses[0].get()); - sys_model.addComponent(dg_ref); - - // Keep track of models and index location - index_type model_id = 1; - // Add all other DGs - for (index_type i = 1; i < 2 * N_size; i++) - { - // current DG to add - auto* dg = new DistributedGenerator(model_id++, - DGParams_list[i], - false, - &dg_signal, - buses[i].get()); - sys_model.addComponent(dg); - } - - // Load all the Line components - for (index_type i = 0; i < 2 * N_size - 1; i++) - { - // line - auto* line_model = new MicrogridLine(model_id++, - rline_list[i], - Lline_list[i], - &dg_signal, - buses[i].get(), - buses[i + 1].get()); - sys_model.addComponent(line_model); - } - - // Load all the Load components - for (index_type i = 0; i < N_size; i++) - { - auto* load_model = new MicrogridLoad(model_id++, - rload_list[i], - Lload_list[i], - &dg_signal, - buses[2 * i].get()); - sys_model.addComponent(load_model); - } - - // Add all the microgrid Virtual DQ Buses - for (index_type i = 0; i < 2 * N_size; i++) - { - auto* virDQbus_model = new MicrogridBusDQ(model_id++, RN, buses[i].get()); - sys_model.addComponent(virDQbus_model); - } + buildScaleMicrogridNetwork(network); + assembleSystem(network, sys_model); // allocate all the initial conditions sys_model.allocate(); @@ -236,16 +91,22 @@ int printMicrogridSystems(index_type N_size) yp[i] = 0.0; } + //------------------------------------------------------------------- // Create Initial derivatives specifics generated in MATLAB + //------------------------------------------------------------------- for (index_type i = 0; i < 2 * N_size; i++) { - yp[13 * i - 1 + 3] = DGParams_list[i].Vn_; - yp[13 * i - 1 + 5] = DGParams_list[i].Kpv_ * DGParams_list[i].Vn_; - yp[13 * i - 1 + 7] = (DGParams_list[i].Kpc_ * DGParams_list[i].Kpv_ * DGParams_list[i].Vn_) / DGParams_list[i].Lf_; + const auto& params = network.DGParam_list[i]; + + yp[13 * i - 1 + 3] = params.Vn_; + yp[13 * i - 1 + 5] = params.Kpv_ * params.Vn_; + yp[13 * i - 1 + 7] = (params.Kpc_ * params.Kpv_ * params.Vn_) / params.Lf_; } + //--------------------------------------------------------------------------- // since the initial P_com = 0, set the initial vector to the reference frame - y[dg_signal.getNodeConnection(0).idx_] = DG_parms1.wb_; + //--------------------------------------------------------------------------- + y[network.dg_signal.getNodeConnection(0).idx_] = network.DGParam_list[0].wb_; sys_model.y().setDataUpdated(); sys_model.yp().setDataUpdated(); From 5ef772bebf7a3e432a64261905c8dd6ba9d9c8d8 Mon Sep 17 00:00:00 2001 From: abdourahmanbarry Date: Wed, 26 Aug 2026 08:39:34 +0000 Subject: [PATCH 2/8] Fixed include path for microgrid examples --- examples/PowerElectronics/Microgrid/Microgrid.cpp | 2 +- .../PowerElectronicsExamplesHelper/MicrogridNetwork.hpp | 2 -- examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogrid.cpp | 2 +- .../ScaleMicrogrid/ScaleMicrogridArbitrary.cpp | 3 +-- 4 files changed, 3 insertions(+), 6 deletions(-) diff --git a/examples/PowerElectronics/Microgrid/Microgrid.cpp b/examples/PowerElectronics/Microgrid/Microgrid.cpp index e20d9e5ac..86801715a 100644 --- a/examples/PowerElectronics/Microgrid/Microgrid.cpp +++ b/examples/PowerElectronics/Microgrid/Microgrid.cpp @@ -6,7 +6,7 @@ #include #include -#include "Common/MicrogridNetwork.hpp" +#include "PowerElectronicsExamplesHelper/MicrogridNetwork.hpp" int main(int /* argc */, char const** /* argv */) { diff --git a/examples/PowerElectronics/PowerElectronicsExamplesHelper/MicrogridNetwork.hpp b/examples/PowerElectronics/PowerElectronicsExamplesHelper/MicrogridNetwork.hpp index 84bc1b118..ada31a098 100644 --- a/examples/PowerElectronics/PowerElectronicsExamplesHelper/MicrogridNetwork.hpp +++ b/examples/PowerElectronics/PowerElectronicsExamplesHelper/MicrogridNetwork.hpp @@ -13,8 +13,6 @@ #include #include #include -#include -#include #include namespace GridKit diff --git a/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogrid.cpp b/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogrid.cpp index 1e97cd56a..fd8d5ecfd 100644 --- a/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogrid.cpp +++ b/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogrid.cpp @@ -7,7 +7,7 @@ #include #include -#include "Common/MicrogridNetwork.hpp" +#include "PowerElectronicsExamplesHelper/MicrogridNetwork.hpp" using index_type = size_t; using real_type = double; diff --git a/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogridArbitrary.cpp b/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogridArbitrary.cpp index c83ce2979..03e2f7891 100644 --- a/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogridArbitrary.cpp +++ b/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogridArbitrary.cpp @@ -1,12 +1,11 @@ #include #include -#include #include #include #include -#include "Common/MicrogridNetwork.hpp" +#include "PowerElectronicsExamplesHelper/MicrogridNetwork.hpp" using index_type = size_t; using real_type = double; From 135b0526f374ff033f6c696c60f85d61af6213ea Mon Sep 17 00:00:00 2001 From: abdourahmanbarry Date: Thu, 27 Aug 2026 19:21:23 +0000 Subject: [PATCH 3/8] Minor update to MicrogridNetwork.hpp implementation and microgrid examples --- .../PowerElectronics/Microgrid/Microgrid.cpp | 8 +- .../MicrogridNetwork.hpp | 296 +++++++++--------- .../ScaleMicrogrid/ScaleMicrogrid.cpp | 4 +- .../ScaleMicrogridArbitrary.cpp | 4 +- 4 files changed, 151 insertions(+), 161 deletions(-) diff --git a/examples/PowerElectronics/Microgrid/Microgrid.cpp b/examples/PowerElectronics/Microgrid/Microgrid.cpp index 86801715a..4f657dcf3 100644 --- a/examples/PowerElectronics/Microgrid/Microgrid.cpp +++ b/examples/PowerElectronics/Microgrid/Microgrid.cpp @@ -21,11 +21,9 @@ int main(int /* argc */, char const** /* argv */) auto* sysmodel = new GridKit::PowerElectronicsModel(use_jac); // Build the four-generator microgrid network. - size_t N_size = 2; - GridKit::ScaleMicrogridNetwork network(N_size); - - GridKit::buildScaleMicrogridNetwork(network); - GridKit::assembleSystem(network, *sysmodel); + size_t N_size = 2; + ScaleMicrogridNetwork network(N_size); + assembleSystem(network, *sysmodel); // Generator parameters used to construct the initial conditions. const auto& parms1 = network.DGParam_list[0]; diff --git a/examples/PowerElectronics/PowerElectronicsExamplesHelper/MicrogridNetwork.hpp b/examples/PowerElectronics/PowerElectronicsExamplesHelper/MicrogridNetwork.hpp index ada31a098..0ee1894fb 100644 --- a/examples/PowerElectronics/PowerElectronicsExamplesHelper/MicrogridNetwork.hpp +++ b/examples/PowerElectronics/PowerElectronicsExamplesHelper/MicrogridNetwork.hpp @@ -15,50 +15,46 @@ #include #include -namespace GridKit +/* + * Contains components and nodes that make up the scaled microgrid network. + * + * The network contains 2 * N_size IBRs and stores the physical components + * that make up the scale microgrid. + */ +template +struct ScaleMicrogridNetwork { - using index_type = size_t; - using real_type = double; - - using SignalNode = GridKit::PowerElectronics::SignalNode; - using Bus = GridKit::PowerElectronics::MicrogridBus; - using BusDQ = GridKit::MicrogridBusDQ; - using DGGenerator = GridKit::DistributedGenerator; - using Line = GridKit::MicrogridLine; - using Load = GridKit::MicrogridLoad; - using GenParams = GridKit::DistributedGeneratorParameters; - - /* - * Contains components and nodes that make up the scaled microgrid network. - * - * The network contains 2 * N_size IBRs and stores the physical components - * that make up the scale microgrid. - */ - struct ScaleMicrogridNetwork + using SignalNode = GridKit::PowerElectronics::SignalNode; + using Bus = GridKit::PowerElectronics::MicrogridBus; + using BusDQ = GridKit::MicrogridBusDQ; + using DGGenerator = GridKit::DistributedGenerator; + using Line = GridKit::MicrogridLine; + using Load = GridKit::MicrogridLoad; + using GenParams = GridKit::DistributedGeneratorParameters; + + size_t model_id_next; + size_t N_size; + SignalNode dg_signal; + std::vector buses; + std::vector busesDQ; + std::vector generators; + std::vector lines; + std::vector loads; + std::vector DGParam_list; + + ScaleMicrogridNetwork(size_t n_size) + : model_id_next(0), + N_size(n_size), + buses(2 * n_size), + busesDQ(2 * n_size, nullptr), + generators(2 * n_size, nullptr), + lines(2 * n_size, nullptr), + loads(2 * n_size, nullptr), + DGParam_list(2 * n_size) { - size_t model_id_next; - size_t N_size; - SignalNode dg_signal; - std::vector buses; - std::vector busesDQ; - std::vector generators; - std::vector lines; - std::vector loads; - std::vector DGParam_list; - - ScaleMicrogridNetwork(size_t n_size) - : model_id_next(0), - N_size(n_size), - buses(2 * n_size), - busesDQ(2 * n_size, nullptr), - generators(2 * n_size, nullptr), - lines(2 * n_size, nullptr), - loads(2 * n_size, nullptr), - DGParam_list(2 * n_size) - { - } - }; + buildScaleMicrogridNetwork(); + } /** * @brief Construct all components of a scaled microgrid network. @@ -93,14 +89,13 @@ namespace GridKit * @note Components are dynamically allocated and their pointers are stored * in the corresponding network component vectors. */ - inline void buildScaleMicrogridNetwork(ScaleMicrogridNetwork& network) + void buildScaleMicrogridNetwork() { - size_t N_size = network.N_size; - assert(N_size > 0); // Every Bus has the same virtual resistance. This is due to numerical stability as mentioned in the paper. - real_type RN = 1.0e4; + ScalarT RN = 1.0e4; + // TODO: add this as parameters // DG Params Vector // All DGs have the same set of parameters except for the first two. GenParams DG_parms1; @@ -137,27 +132,27 @@ namespace GridKit DG_parms2.rLc_ = 0.03; DG_parms2.Lc_ = 0.35e-3; - network.DGParam_list.assign(2 * N_size, DG_parms2); + DGParam_list.assign(2 * N_size, DG_parms2); // First two generators use parameters 1 - if (network.DGParam_list.size() >= 1) + if (DGParam_list.size() >= 1) { - network.DGParam_list[0] = DG_parms1; + DGParam_list[0] = DG_parms1; } - if (network.DGParam_list.size() >= 2) + if (DGParam_list.size() >= 2) { - network.DGParam_list[1] = DG_parms1; + DGParam_list[1] = DG_parms1; } // line vector params // Every odd line has the same parameters and every even line has the same parameters - real_type rline1 = 0.23; - real_type Lline1 = 0.1 / (2.0 * M_PI * 50.0); - real_type rline2 = 0.35; - real_type Lline2 = 0.58 / (2.0 * M_PI * 50.0); - std::vector rline_list(2 * N_size - 1, 0.0); - std::vector Lline_list(2 * N_size - 1, 0.0); - for (index_type i = 0; i < rline_list.size(); i++) + ScalarT rline1 = 0.23; + ScalarT Lline1 = 0.1 / (2.0 * M_PI * 50.0); + ScalarT rline2 = 0.35; + ScalarT Lline2 = 0.58 / (2.0 * M_PI * 50.0); + std::vector rline_list(2 * N_size - 1, 0.0); + std::vector Lline_list(2 * N_size - 1, 0.0); + for (IdxT i = 0; i < rline_list.size(); i++) { rline_list[i] = (i % 2) ? rline2 : rline1; Lline_list[i] = (i % 2) ? Lline2 : Lline1; @@ -165,13 +160,13 @@ namespace GridKit // load parms // Only the first load has the same paramaters. - real_type rload1 = 3.0; - real_type Lload1 = 2.0 / (2.0 * M_PI * 50.0); - real_type rload2 = 2.0; - real_type Lload2 = 1.0 / (2.0 * M_PI * 50.0); + ScalarT rload1 = 3.0; + ScalarT Lload1 = 2.0 / (2.0 * M_PI * 50.0); + ScalarT rload2 = 2.0; + ScalarT Lload2 = 1.0 / (2.0 * M_PI * 50.0); - std::vector rload_list(N_size, rload2); - std::vector Lload_list(N_size, Lload2); + std::vector rload_list(N_size, rload2); + std::vector Lload_list(N_size, Lload2); if (rload_list.size() >= 1) { rload_list[0] = rload1; @@ -179,129 +174,130 @@ namespace GridKit } // Create the reference generator - auto* dg_ref = new DGGenerator(network.model_id_next++, - network.DGParam_list[0], + auto* dg_ref = new DGGenerator(model_id_next++, + DGParam_list[0], true, - &network.dg_signal, - &network.buses[0]); + &dg_signal, + &buses[0]); - network.generators[0] = dg_ref; + generators[0] = dg_ref; // Create the remaining generators. - for (index_type i = 1; i < 2 * N_size; i++) + for (IdxT i = 1; i < 2 * N_size; i++) { - auto* dg = new DGGenerator(network.model_id_next++, - network.DGParam_list[i], + auto* dg = new DGGenerator(model_id_next++, + DGParam_list[i], false, - &network.dg_signal, - &network.buses[i]); + &dg_signal, + &buses[i]); - network.generators[i] = dg; + generators[i] = dg; } // // Create transmission lines between consecutive buses. - for (index_type i = 0; i < 2 * N_size - 1; i++) + for (IdxT i = 0; i < 2 * N_size - 1; i++) { - auto* line_model = new Line(network.model_id_next++, + auto* line_model = new Line(model_id_next++, rline_list[i], Lline_list[i], - &network.dg_signal, - &network.buses[i], - &network.buses[i + 1]); + &dg_signal, + &buses[i], + &buses[i + 1]); - network.lines[i + 1] = line_model; + lines[i + 1] = line_model; } // Create loads on every other bus. - for (index_type i = 0; i < N_size; i++) + for (IdxT i = 0; i < N_size; i++) { - auto* load_model = new Load(network.model_id_next++, + auto* load_model = new Load(model_id_next++, rload_list[i], Lload_list[i], - &network.dg_signal, - &network.buses[2 * i]); + &dg_signal, + &buses[2 * i]); - network.loads[2 * i] = load_model; + loads[2 * i] = load_model; } // Create and Add all the microgrid Virtual DQ Buses - for (index_type i = 0; i < 2 * N_size; i++) + for (IdxT i = 0; i < 2 * N_size; i++) { - auto* virDQbus_model = new BusDQ(network.model_id_next++, + auto* virDQbus_model = new BusDQ(model_id_next++, RN, - &network.buses[i]); + &buses[i]); - network.busesDQ[i] = virDQbus_model; + busesDQ[i] = virDQbus_model; } } +}; + +/** + * @brief Assemble a scaled microgrid network into a power electronics model. + * + * Adds the signal node, physical buses, generators, transmission lines, + * loads, and virtual DQ buses stored in @p network to @p sys_model. + * + * This function does not construct or allocate any network components. The + * physical network must already have been created by + * buildScaleMicrogridNetwork(). + * + * @param[in] network Constructed scaled microgrid network whose components + * are added to the system model. + * @param[in,out] sys_model Power electronics model to which the network + * components and nodes are added. + * + * @pre @c network.N_size is greater than zero. + * @pre @p network has been constructed by buildScaleMicrogridNetwork(). + * @pre All component and node pointers referenced by @p network are valid. + * + * @post The signal node and all physical buses in @p network have been added + * to @p sys_model. + * @post All generators, transmission lines, loads, and virtual DQ buses in + * @p network have been added to @p sys_model. + * + * @note This function only assembles the network into the system model. It + * does not call PowerElectronicsModel::allocate(). + */ +template +void assembleSystem(ScaleMicrogridNetwork& network, GridKit::PowerElectronicsModel& sys_model) +{ + size_t N_size = network.N_size; - /** - * @brief Assemble a scaled microgrid network into a power electronics model. - * - * Adds the signal node, physical buses, generators, transmission lines, - * loads, and virtual DQ buses stored in @p network to @p sys_model. - * - * This function does not construct or allocate any network components. The - * physical network must already have been created by - * buildScaleMicrogridNetwork(). - * - * @param[in] network Constructed scaled microgrid network whose components - * are added to the system model. - * @param[in,out] sys_model Power electronics model to which the network - * components and nodes are added. - * - * @pre @c network.N_size is greater than zero. - * @pre @p network has been constructed by buildScaleMicrogridNetwork(). - * @pre All component and node pointers referenced by @p network are valid. - * - * @post The signal node and all physical buses in @p network have been added - * to @p sys_model. - * @post All generators, transmission lines, loads, and virtual DQ buses in - * @p network have been added to @p sys_model. - * - * @note This function only assembles the network into the system model. It - * does not call PowerElectronicsModel::allocate(). - */ - inline void assembleSystem(ScaleMicrogridNetwork& network, GridKit::PowerElectronicsModel& sys_model) - { - size_t N_size = network.N_size; - - // Ensure minimum size requirement - assert(N_size > 0); + // Ensure minimum size requirement + assert(N_size > 0); - // Add all bus nodes - sys_model.addNode(&network.dg_signal); + // Add all bus nodes + sys_model.addNode(&network.dg_signal); - for (size_t i = 0; i < 2 * N_size; i++) - { - sys_model.addNode(&network.buses[i]); - } + for (size_t i = 0; i < 2 * N_size; i++) + { + sys_model.addNode(&network.buses[i]); + } - // Add all generators - for (index_type i = 0; i < 2 * N_size; i++) - { - sys_model.addComponent(network.generators[i]); - } + // Add all generators + for (IdxT i = 0; i < 2 * N_size; i++) + { + sys_model.addComponent(network.generators[i]); + } - // Load all the Line components - for (index_type i = 1; i < 2 * N_size; i++) - { - sys_model.addComponent(network.lines[i]); - } + // Load all the Line components + for (IdxT i = 1; i < 2 * N_size; i++) + { + sys_model.addComponent(network.lines[i]); + } - // Load all the Load components - for (index_type i = 0; i < 2 * N_size; i++) + // Load all the Load components + for (IdxT i = 0; i < 2 * N_size; i++) + { + if (network.loads[i] != nullptr) { - if (network.loads[i] != nullptr) - { - sys_model.addComponent(network.loads[i]); - } + sys_model.addComponent(network.loads[i]); } + } - // Add all the microgrid Virtual DQ Buses - for (index_type i = 0; i < 2 * N_size; i++) - { - sys_model.addComponent(network.busesDQ[i]); - } + // Add all the microgrid Virtual DQ Buses + for (IdxT i = 0; i < 2 * N_size; i++) + { + sys_model.addComponent(network.busesDQ[i]); } -} // namespace GridKit +} \ No newline at end of file diff --git a/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogrid.cpp b/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogrid.cpp index fd8d5ecfd..a277c0e42 100644 --- a/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogrid.cpp +++ b/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogrid.cpp @@ -87,9 +87,7 @@ int test(index_type Nsize, real_type error_tol, bool debug_output) } // Build and assemble the scaled microgrid network. - ScaleMicrogridNetwork network(Nsize); - - buildScaleMicrogridNetwork(network); + ScaleMicrogridNetwork network(Nsize); assembleSystem(network, *sys_model); // allocate all the intial conditions diff --git a/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogridArbitrary.cpp b/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogridArbitrary.cpp index 03e2f7891..dd94713f4 100644 --- a/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogridArbitrary.cpp +++ b/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogridArbitrary.cpp @@ -72,9 +72,7 @@ int printMicrogridSystems(index_type N_size) } // Build and assemble the scaled microgrid network. - ScaleMicrogridNetwork network(N_size); - - buildScaleMicrogridNetwork(network); + ScaleMicrogridNetwork network(N_size); assembleSystem(network, sys_model); // allocate all the initial conditions From 08983c848e5c943a6fa38953577f054c27d6e0c8 Mon Sep 17 00:00:00 2001 From: abdourahmanbarry Date: Thu, 27 Aug 2026 19:23:04 +0000 Subject: [PATCH 4/8] Apply pre-commit fixes --- .../PowerElectronicsExamplesHelper/MicrogridNetwork.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/PowerElectronics/PowerElectronicsExamplesHelper/MicrogridNetwork.hpp b/examples/PowerElectronics/PowerElectronicsExamplesHelper/MicrogridNetwork.hpp index 0ee1894fb..f9c642ac3 100644 --- a/examples/PowerElectronics/PowerElectronicsExamplesHelper/MicrogridNetwork.hpp +++ b/examples/PowerElectronics/PowerElectronicsExamplesHelper/MicrogridNetwork.hpp @@ -300,4 +300,4 @@ void assembleSystem(ScaleMicrogridNetwork& network, GridKit::Powe { sys_model.addComponent(network.busesDQ[i]); } -} \ No newline at end of file +} From 02557defef87b272b3d8c5d7bc62b9e747145932 Mon Sep 17 00:00:00 2001 From: abdourahmanbarry Date: Fri, 28 Aug 2026 00:05:36 +0000 Subject: [PATCH 5/8] Update comments and grid network builder --- .../PowerElectronics/Microgrid/Microgrid.cpp | 4 +- .../MicrogridNetwork.hpp | 41 ++++++++----------- 2 files changed, 18 insertions(+), 27 deletions(-) diff --git a/examples/PowerElectronics/Microgrid/Microgrid.cpp b/examples/PowerElectronics/Microgrid/Microgrid.cpp index 4f657dcf3..828145988 100644 --- a/examples/PowerElectronics/Microgrid/Microgrid.cpp +++ b/examples/PowerElectronics/Microgrid/Microgrid.cpp @@ -95,7 +95,7 @@ int main(int /* argc */, char const** /* argv */) bool all_internal_diff = true; bool all_external_alg = true; - const size_t num_node_vars = bus1.size() + bus2.size() + bus3.size() + bus4.size() + dg_signal.size(); + const size_t num_node_vars = network.buses[0].size() + network.buses[1].size() + network.buses[2].size() + network.buses[3].size() + network.dg_signal.size(); for (size_t i = 0; i < sysmodel->size() - num_node_vars; i++) { @@ -242,4 +242,4 @@ int main(int /* argc */, char const** /* argv */) delete sysmodel; return 0; -} +} \ No newline at end of file diff --git a/examples/PowerElectronics/PowerElectronicsExamplesHelper/MicrogridNetwork.hpp b/examples/PowerElectronics/PowerElectronicsExamplesHelper/MicrogridNetwork.hpp index f9c642ac3..35e1c63f3 100644 --- a/examples/PowerElectronics/PowerElectronicsExamplesHelper/MicrogridNetwork.hpp +++ b/examples/PowerElectronics/PowerElectronicsExamplesHelper/MicrogridNetwork.hpp @@ -49,7 +49,7 @@ struct ScaleMicrogridNetwork buses(2 * n_size), busesDQ(2 * n_size, nullptr), generators(2 * n_size, nullptr), - lines(2 * n_size, nullptr), + lines(2 * n_size - 1, nullptr), loads(2 * n_size, nullptr), DGParam_list(2 * n_size) { @@ -57,7 +57,7 @@ struct ScaleMicrogridNetwork } /** - * @brief Construct all components of a scaled microgrid network. + * @brief Construct all components of the scaled microgrid network. * * Builds a microgrid containing @c 2*N_size generators and buses connected * in a chain by transmission lines. Loads are connected to every other bus, @@ -68,26 +68,20 @@ struct ScaleMicrogridNetwork * alternate along the network, and the first load uses a different parameter * set from the remaining loads. * - * The created components are stored in @p network and assigned unique model - * identifiers using @c network.model_id_next. + * The created components are stored in this network and assigned unique model + * identifiers using @c model_id_next. * - * @param[in,out] network Network in which the microgrid components are - * constructed and stored. + * @pre @c N_size is greater than zero. * - * @pre @c network.N_size is greater than zero. - * @pre The component storage in @p network has been sized consistently with - * @c network.N_size. - * - * @post @p network contains @c 2*N_size generators and virtual DQ buses. - * @post @p network contains @c 2*N_size-1 transmission lines connecting + * @post The network contains @c 2*N_size generators and virtual DQ buses. + * @post The network contains @c 2*N_size-1 transmission lines connecting * consecutive buses. - * @post @p network contains @c N_size loads connected to every other bus. - * @post @c network.DGParam_list contains the parameters associated with each - * generator. - * @post @c network.model_id_next is advanced for every component created. + * @post The network contains @c N_size loads connected to every other bus. + * @post @c DGParam_list contains the parameters associated with each generator. + * @post @c model_id_next is advanced for every component created. * * @note Components are dynamically allocated and their pointers are stored - * in the corresponding network component vectors. + * in the corresponding component vectors. */ void buildScaleMicrogridNetwork() { @@ -194,7 +188,7 @@ struct ScaleMicrogridNetwork generators[i] = dg; } - // // Create transmission lines between consecutive buses. + // Create transmission lines between consecutive buses. for (IdxT i = 0; i < 2 * N_size - 1; i++) { auto* line_model = new Line(model_id_next++, @@ -204,7 +198,7 @@ struct ScaleMicrogridNetwork &buses[i], &buses[i + 1]); - lines[i + 1] = line_model; + lines[i] = line_model; } // Create loads on every other bus. @@ -237,9 +231,7 @@ struct ScaleMicrogridNetwork * Adds the signal node, physical buses, generators, transmission lines, * loads, and virtual DQ buses stored in @p network to @p sys_model. * - * This function does not construct or allocate any network components. The - * physical network must already have been created by - * buildScaleMicrogridNetwork(). + * This function does not construct or allocate any network components. * * @param[in] network Constructed scaled microgrid network whose components * are added to the system model. @@ -247,7 +239,6 @@ struct ScaleMicrogridNetwork * components and nodes are added. * * @pre @c network.N_size is greater than zero. - * @pre @p network has been constructed by buildScaleMicrogridNetwork(). * @pre All component and node pointers referenced by @p network are valid. * * @post The signal node and all physical buses in @p network have been added @@ -281,7 +272,7 @@ void assembleSystem(ScaleMicrogridNetwork& network, GridKit::Powe } // Load all the Line components - for (IdxT i = 1; i < 2 * N_size; i++) + for (IdxT i = 0; i < 2 * N_size - 1; i++) { sys_model.addComponent(network.lines[i]); } @@ -300,4 +291,4 @@ void assembleSystem(ScaleMicrogridNetwork& network, GridKit::Powe { sys_model.addComponent(network.busesDQ[i]); } -} +} \ No newline at end of file From 1d9e904a87fc3486135627d58df7aeb6ded25dbf Mon Sep 17 00:00:00 2001 From: abdourahmanbarry Date: Fri, 28 Aug 2026 00:06:51 +0000 Subject: [PATCH 6/8] Apply pre-commit fixes --- examples/PowerElectronics/Microgrid/Microgrid.cpp | 2 +- .../PowerElectronicsExamplesHelper/MicrogridNetwork.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/PowerElectronics/Microgrid/Microgrid.cpp b/examples/PowerElectronics/Microgrid/Microgrid.cpp index 828145988..6513d74ac 100644 --- a/examples/PowerElectronics/Microgrid/Microgrid.cpp +++ b/examples/PowerElectronics/Microgrid/Microgrid.cpp @@ -242,4 +242,4 @@ int main(int /* argc */, char const** /* argv */) delete sysmodel; return 0; -} \ No newline at end of file +} diff --git a/examples/PowerElectronics/PowerElectronicsExamplesHelper/MicrogridNetwork.hpp b/examples/PowerElectronics/PowerElectronicsExamplesHelper/MicrogridNetwork.hpp index 35e1c63f3..d7da59762 100644 --- a/examples/PowerElectronics/PowerElectronicsExamplesHelper/MicrogridNetwork.hpp +++ b/examples/PowerElectronics/PowerElectronicsExamplesHelper/MicrogridNetwork.hpp @@ -291,4 +291,4 @@ void assembleSystem(ScaleMicrogridNetwork& network, GridKit::Powe { sys_model.addComponent(network.busesDQ[i]); } -} \ No newline at end of file +} From 44e9da0a72e7d2e3918ff260ebffc0628f4f4452 Mon Sep 17 00:00:00 2001 From: abdourahmanbarry Date: Fri, 28 Aug 2026 19:18:22 +0000 Subject: [PATCH 7/8] Update cmake files and examples --- examples/PowerElectronics/CMakeLists.txt | 1 + examples/PowerElectronics/Microgrid/CMakeLists.txt | 7 ++----- examples/PowerElectronics/Microgrid/Microgrid.cpp | 2 +- .../PowerElectronicsExamplesHelper/CMakeLists.txt | 10 ++++++++++ .../PowerElectronics/ScaleMicrogrid/CMakeLists.txt | 14 ++++---------- .../ScaleMicrogrid/ScaleMicrogrid.cpp | 2 +- .../ScaleMicrogrid/ScaleMicrogridArbitrary.cpp | 2 +- 7 files changed, 20 insertions(+), 18 deletions(-) create mode 100644 examples/PowerElectronics/PowerElectronicsExamplesHelper/CMakeLists.txt diff --git a/examples/PowerElectronics/CMakeLists.txt b/examples/PowerElectronics/CMakeLists.txt index 2bf311e22..920e63e46 100644 --- a/examples/PowerElectronics/CMakeLists.txt +++ b/examples/PowerElectronics/CMakeLists.txt @@ -3,6 +3,7 @@ # - Slaven Peles #]] +add_subdirectory(PowerElectronicsExamplesHelper) add_subdirectory(DistributedGeneratorTest) if(TARGET SUNDIALS::idas) diff --git a/examples/PowerElectronics/Microgrid/CMakeLists.txt b/examples/PowerElectronics/Microgrid/CMakeLists.txt index 86dea6678..a919cd9cc 100644 --- a/examples/PowerElectronics/Microgrid/CMakeLists.txt +++ b/examples/PowerElectronics/Microgrid/CMakeLists.txt @@ -1,16 +1,13 @@ add_executable(microgrid Microgrid.cpp) -target_include_directories( - microgrid - PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/..) - target_link_libraries( microgrid GridKit::power_elec_disgen GridKit::power_elec_microline GridKit::power_elec_microload GridKit::solvers_dyn - GridKit::power_elec_microbusdq) + GridKit::power_elec_microbusdq + GridKit::power_elec_microgrid_network) add_test(NAME Microgrid COMMAND $) install(TARGETS microgrid RUNTIME DESTINATION bin) diff --git a/examples/PowerElectronics/Microgrid/Microgrid.cpp b/examples/PowerElectronics/Microgrid/Microgrid.cpp index 6513d74ac..cf828bf2d 100644 --- a/examples/PowerElectronics/Microgrid/Microgrid.cpp +++ b/examples/PowerElectronics/Microgrid/Microgrid.cpp @@ -6,7 +6,7 @@ #include #include -#include "PowerElectronicsExamplesHelper/MicrogridNetwork.hpp" +#include int main(int /* argc */, char const** /* argv */) { diff --git a/examples/PowerElectronics/PowerElectronicsExamplesHelper/CMakeLists.txt b/examples/PowerElectronics/PowerElectronicsExamplesHelper/CMakeLists.txt new file mode 100644 index 000000000..7d41b162e --- /dev/null +++ b/examples/PowerElectronics/PowerElectronicsExamplesHelper/CMakeLists.txt @@ -0,0 +1,10 @@ +add_library(power_elec_microgrid_network INTERFACE) + +add_library(GridKit::power_elec_microgrid_network ALIAS power_elec_microgrid_network) + +target_link_libraries( + power_elec_microgrid_network + INTERFACE GridKit::power_elec_disgen + GridKit::power_elec_microbusdq + GridKit::power_elec_microline + GridKit::power_elec_microload) \ No newline at end of file diff --git a/examples/PowerElectronics/ScaleMicrogrid/CMakeLists.txt b/examples/PowerElectronics/ScaleMicrogrid/CMakeLists.txt index 6bee549d3..277486306 100644 --- a/examples/PowerElectronics/ScaleMicrogrid/CMakeLists.txt +++ b/examples/PowerElectronics/ScaleMicrogrid/CMakeLists.txt @@ -1,21 +1,14 @@ add_executable(scalemicrogrid ScaleMicrogrid.cpp) add_executable(scalemicrogridarbitrary ScaleMicrogridArbitrary.cpp) -target_include_directories( - scalemicrogrid - PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/..) - -target_include_directories( - scalemicrogridarbitrary - PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/..) - target_link_libraries( scalemicrogrid GridKit::power_elec_disgen GridKit::power_elec_microline GridKit::power_elec_microload GridKit::solvers_dyn - GridKit::power_elec_microbusdq) + GridKit::power_elec_microbusdq + GridKit::power_elec_microgrid_network) target_link_libraries( scalemicrogridarbitrary @@ -23,7 +16,8 @@ target_link_libraries( GridKit::power_elec_microline GridKit::power_elec_microload GridKit::solvers_dyn - GridKit::power_elec_microbusdq) + GridKit::power_elec_microbusdq + GridKit::power_elec_microgrid_network) add_test(NAME ScaleMicrogrid COMMAND $) install(TARGETS scalemicrogrid RUNTIME DESTINATION bin) diff --git a/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogrid.cpp b/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogrid.cpp index a277c0e42..a0f3f0d1f 100644 --- a/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogrid.cpp +++ b/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogrid.cpp @@ -7,7 +7,7 @@ #include #include -#include "PowerElectronicsExamplesHelper/MicrogridNetwork.hpp" +#include using index_type = size_t; using real_type = double; diff --git a/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogridArbitrary.cpp b/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogridArbitrary.cpp index dd94713f4..f0488425f 100644 --- a/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogridArbitrary.cpp +++ b/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogridArbitrary.cpp @@ -5,7 +5,7 @@ #include #include -#include "PowerElectronicsExamplesHelper/MicrogridNetwork.hpp" +#include using index_type = size_t; using real_type = double; From 2fe4b2e642679e9da39e42f4c87d126d747027ac Mon Sep 17 00:00:00 2001 From: abdourahmanbarry Date: Fri, 28 Aug 2026 19:22:02 +0000 Subject: [PATCH 8/8] Apply pre-commit fixes --- .../PowerElectronicsExamplesHelper/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/PowerElectronics/PowerElectronicsExamplesHelper/CMakeLists.txt b/examples/PowerElectronics/PowerElectronicsExamplesHelper/CMakeLists.txt index 7d41b162e..d80aa95e8 100644 --- a/examples/PowerElectronics/PowerElectronicsExamplesHelper/CMakeLists.txt +++ b/examples/PowerElectronics/PowerElectronicsExamplesHelper/CMakeLists.txt @@ -7,4 +7,4 @@ target_link_libraries( INTERFACE GridKit::power_elec_disgen GridKit::power_elec_microbusdq GridKit::power_elec_microline - GridKit::power_elec_microload) \ No newline at end of file + GridKit::power_elec_microload)