Harmony
HARMONic stabilitY assessment of PE-penetrated power systems
Loading...
Searching...
No Matches
State_Space_Model.h
Go to the documentation of this file.
1#ifndef STATE_SPACE_MODEL
2#define STATE_SPACE_MODEL
3
15#include "../../Elements/Element.h"
16#include "../../Bus.h"
17#include "../../network.h"
18
19class Network; class Element; class Bus;
20
24enum class SSMMode {
25 Standard,
26 DQsym
27};
28
40
45 std::string elementName;
48};
49
54 std::string busName;
57};
58
73
85public:
94 class Tree {
95 private:
96 Bus* root; Element* element; Bus* current_node;
97 std::vector<Element*> subelements; std::shared_ptr<Tree> parent;
98 public:
106 Tree(Element* e, Bus* cur, Bus* r, std::shared_ptr<Tree> p = nullptr)
107 : element(e), current_node(cur), root(r), parent(p) {
108 }
109
111 void addPathElement(Element* e) { subelements.push_back(e); }
112
114 Bus* getRoot() const { return root; }
115
117 Element* getElement() const { return element; }
118
120 Bus* getCurrentNode() const { return current_node; }
121
123 const std::vector<Element*>& getSubelements() const { return subelements; }
124
126 std::shared_ptr<Tree> getParent() const { return parent; }
127
133 bool containsNode(Bus* node) const;
134
139 std::vector<Element*> getPath() const;
140
145 std::string toString() const;
146 };
147
149 StateSpaceModel() = default;
150
157 static std::vector<std::vector<Bus*>> form_cutset_nodes(const std::vector<Bus*>&,
158 const std::vector<std::pair<Bus*, Bus*>>&);
159
166 static std::vector<std::vector<Element*>> form_cutsets(
167 const std::vector<std::vector<Bus*>>&,
168 const std::map<Bus*, std::vector<Element*>>&);
169
175 static std::map<Bus*, std::vector<Element*>> generateBusToElementsMap(
176 const std::vector<Element*>&);
177
184 static std::vector<std::vector<Element*>> findLoops(
185 const std::vector<Bus*>&, const std::map<Bus*, std::vector<Element*>>&);
186
193 void formState(Network* net, const std::vector<Bus*>& out,
195
197 const Eigen::MatrixXd& getA() const { return A; }
198
200 const Eigen::MatrixXd& getB() const { return mode_ == SSMMode::DQsym ? B_dqsym : B; }
201
203 const Eigen::MatrixXd& getC() const { return C; }
204
206 const Eigen::MatrixXd& getD() const { return mode_ == SSMMode::DQsym ? D_dqsym : D; }
207
209 const Eigen::MatrixXd& getBRaw() const { return B; }
210
212 SSMMode getMode() const { return mode_; }
213
215 const std::vector<InputMapping>& getInputMap() const { return input_map; }
216
218 const std::vector<StateMapping>& getStateMap() const { return state_map; }
219
221 const std::vector<OutputMapping>& getOutputMap() const { return output_map; }
222
224 const std::vector<InputGroup>& getInputGroups() const { return input_groups; }
225
232 int getInputIndex(const std::string& elementName, int pin = 0) const {
233 for (const auto& m : input_map)
234 if (m.elementName == elementName && m.pinIndex == pin)
235 return m.bColumnIndex;
236 return -1;
237 }
238
245 int getStateIndex(const std::string& elementName, int stateIdx = 0) const {
246 for (const auto& m : state_map)
247 if (m.elementName == elementName && m.stateIndex == stateIdx)
248 return m.aRowIndex;
249 return -1;
250 }
251
262 MatrixXcd buildInputVector(int nKeep,
263 const std::map<std::string, std::vector<MatrixXcd>>& elementStates) const;
264
266 void printMapping() const;
267
268private:
269 static void traverseForLoops(Bus*, Bus*, const std::vector<Bus*>&,
270 std::vector<std::vector<Element*>>&,
271 const std::map<Bus*, std::vector<Element*>>&,
272 std::shared_ptr<Tree>, const std::map<Bus*, int>&);
273
274 Eigen::MatrixXd A, B, C, D;
275 Eigen::MatrixXd B_dqsym, D_dqsym;
276
278
279 int number_switches = 0, number_independent_sources = 0;
280 int number_virtual_inputs = 0;
281 int number_nodes = 0, total_number_equations = 0;
282 int number_outputs = 0, number_state_variables = 0;
283
284 std::vector<Bus*> output;
285 std::unordered_map<Bus*, int> bus_indices;
286 std::unordered_map<Element*, int> element_indices;
287 std::map<Element*, std::vector<RCP<const Basic>>> symbols_bank;
288 std::map<Element*, std::vector<RCP<const Basic>>> virtual_input_bank;
289 std::vector<Element*> list_state_variables;
290 std::vector<Element*> list_independent_sources;
291 std::vector<Element*> list_virtual_input_providers;
292 std::vector<Element*> list_switches;
293
294 std::vector<InputMapping> input_map;
295 std::vector<StateMapping> state_map;
296 std::vector<OutputMapping> output_map;
297
298
299 std::vector<InputGroup> input_groups;
300
301
302 void finalizeCounts(Network*);
303 void substituteParameters(SymEngine::DenseMatrix& matrix);
304 void buildMappings();
305 void expandBForDQsym();
306};
307
308#endif
SSMMode
Matrix layout mode for input/output column grouping.
Definition State_Space_Model.h:24
@ DQsym
All B columns grouped in 3s (for DSSS phasor domain)
@ Standard
Raw pin-count columns in B (for eigenvalue/impedance analysis)
A network node connecting one or more element terminals.
Definition Bus.h:21
Orchestrates phasor-domain dynamic simulation of an AC/DC network.
Definition DQsym.h:64
Base class for multi-phase network elements with Y-parameters and MNA stamping hooks.
Definition Element.h:29
Root network model holding buses, elements, and AC/DC grid hierarchy.
Definition network.h:36
Spanning-tree node used during loop/cutset detection.
Definition State_Space_Model.h:94
void addPathElement(Element *e)
Appends an element to the path from root to this node.
Definition State_Space_Model.h:111
std::vector< Element * > getPath() const
Returns the full element path from root to this node.
Definition State_Space_Model.cpp:753
const std::vector< Element * > & getSubelements() const
Definition State_Space_Model.h:123
Bus * getRoot() const
Definition State_Space_Model.h:114
std::shared_ptr< Tree > getParent() const
Definition State_Space_Model.h:126
std::string toString() const
Returns a human-readable description of this tree node.
Definition State_Space_Model.cpp:767
Tree(Element *e, Bus *cur, Bus *r, std::shared_ptr< Tree > p=nullptr)
Constructs a tree node for graph traversal.
Definition State_Space_Model.h:106
Bus * getCurrentNode() const
Definition State_Space_Model.h:120
Element * getElement() const
Definition State_Space_Model.h:117
bool containsNode(Bus *node) const
Checks whether a bus appears anywhere in this subtree.
Definition State_Space_Model.cpp:761
Assembles and stores the linear state-space representation of a network.
Definition State_Space_Model.h:84
const Eigen::MatrixXd & getD() const
Definition State_Space_Model.h:206
SSMMode getMode() const
Definition State_Space_Model.h:212
static std::map< Bus *, std::vector< Element * > > generateBusToElementsMap(const std::vector< Element * > &)
Builds a bus-to-elements adjacency map.
Definition State_Space_Model.cpp:721
const std::vector< InputMapping > & getInputMap() const
Definition State_Space_Model.h:215
const std::vector< OutputMapping > & getOutputMap() const
Definition State_Space_Model.h:221
static std::vector< std::vector< Bus * > > form_cutset_nodes(const std::vector< Bus * > &, const std::vector< std::pair< Bus *, Bus * > > &)
Partitions buses into cutset node groups.
Definition State_Space_Model.cpp:631
const std::vector< InputGroup > & getInputGroups() const
Definition State_Space_Model.h:224
const std::vector< StateMapping > & getStateMap() const
Definition State_Space_Model.h:218
StateSpaceModel()=default
Default constructor; matrices are populated by formState().
const Eigen::MatrixXd & getBRaw() const
Definition State_Space_Model.h:209
int getStateIndex(const std::string &elementName, int stateIdx=0) const
Looks up the A-matrix row index for an element state.
Definition State_Space_Model.h:245
const Eigen::MatrixXd & getB() const
Definition State_Space_Model.h:200
static std::vector< std::vector< Element * > > findLoops(const std::vector< Bus * > &, const std::map< Bus *, std::vector< Element * > > &)
Finds fundamental loops in the network graph.
Definition State_Space_Model.cpp:733
static std::vector< std::vector< Element * > > form_cutsets(const std::vector< std::vector< Bus * > > &, const std::map< Bus *, std::vector< Element * > > &)
Maps cutset node groups to the elements that form each cutset.
Definition State_Space_Model.cpp:679
int getInputIndex(const std::string &elementName, int pin=0) const
Looks up the B-matrix column index for an element input pin.
Definition State_Space_Model.h:232
MatrixXcd buildInputVector(int nKeep, const std::map< std::string, std::vector< MatrixXcd > > &elementStates) const
Builds the input vector u from per-element state contributions.
Definition State_Space_Model.cpp:537
const Eigen::MatrixXd & getA() const
Definition State_Space_Model.h:197
const Eigen::MatrixXd & getC() const
Definition State_Space_Model.h:203
void formState(Network *net, const std::vector< Bus * > &out, SSMMode mode=SSMMode::Standard)
Assembles state-space matrices from a network.
Definition State_Space_Model.cpp:157
void printMapping() const
Prints input, state, and output index mappings to stdout.
Definition State_Space_Model.cpp:606
Per-source metadata for raw and DQsym B-column layout.
Definition State_Space_Model.h:65
Element * element
Definition State_Space_Model.h:66
int dqsymCols
After expansion: ceil to next multiple of 3.
Definition State_Space_Model.h:68
int dqsymStartCol
Start column in B_dqsym.
Definition State_Space_Model.h:70
int rawCols
Actual pin count (2 for DC, 3 for AC, 12 for MMC virtual)
Definition State_Space_Model.h:67
int rawStartCol
Start column in raw B.
Definition State_Space_Model.h:69
bool isVirtual
Definition State_Space_Model.h:71
Maps an element input pin to a column in the B matrix.
Definition State_Space_Model.h:32
int groupIndex
Which 3-column group (DQsym mode)
Definition State_Space_Model.h:37
int pinIndex
Pin within element (0-based)
Definition State_Space_Model.h:34
std::string elementName
Definition State_Space_Model.h:33
int bColumnIndex
Column in B (or B_dqsym)
Definition State_Space_Model.h:35
int phaseInGroup
0,1,2 within the group (DQsym mode)
Definition State_Space_Model.h:38
bool isVirtualInput
Definition State_Space_Model.h:36
Maps a bus output pin to a row in the C matrix.
Definition State_Space_Model.h:53
int pinIndex
Definition State_Space_Model.h:55
std::string busName
Definition State_Space_Model.h:54
int cRowIndex
Definition State_Space_Model.h:56
Maps an element state variable to a row in the A matrix.
Definition State_Space_Model.h:44
int stateIndex
Definition State_Space_Model.h:46
int aRowIndex
Definition State_Space_Model.h:47
std::string elementName
Definition State_Space_Model.h:45