1#ifndef STATE_SPACE_MODEL
2#define STATE_SPACE_MODEL
15#include "../../Elements/Element.h"
17#include "../../network.h"
97 std::vector<Element*> subelements; std::shared_ptr<Tree> parent;
107 : element(e), current_node(cur), root(r), parent(p) {
126 std::shared_ptr<Tree>
getParent()
const {
return parent; }
139 std::vector<Element*>
getPath()
const;
157 static std::vector<std::vector<Bus*>>
form_cutset_nodes(
const std::vector<Bus*>&,
158 const std::vector<std::pair<Bus*, Bus*>>&);
167 const std::vector<std::vector<Bus*>>&,
168 const std::map<
Bus*, std::vector<Element*>>&);
176 const std::vector<Element*>&);
184 static std::vector<std::vector<Element*>>
findLoops(
185 const std::vector<Bus*>&,
const std::map<
Bus*, std::vector<Element*>>&);
197 const Eigen::MatrixXd&
getA()
const {
return A; }
203 const Eigen::MatrixXd&
getC()
const {
return C; }
209 const Eigen::MatrixXd&
getBRaw()
const {
return B; }
215 const std::vector<InputMapping>&
getInputMap()
const {
return input_map; }
218 const std::vector<StateMapping>&
getStateMap()
const {
return state_map; }
221 const std::vector<OutputMapping>&
getOutputMap()
const {
return output_map; }
233 for (
const auto& m : input_map)
234 if (m.elementName == elementName && m.pinIndex == pin)
235 return m.bColumnIndex;
246 for (
const auto& m : state_map)
247 if (m.elementName == elementName && m.stateIndex == stateIdx)
263 const std::map<std::string, std::vector<MatrixXcd>>& elementStates)
const;
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>&);
274 Eigen::MatrixXd A, B, C, D;
275 Eigen::MatrixXd B_dqsym, D_dqsym;
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;
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;
294 std::vector<InputMapping> input_map;
295 std::vector<StateMapping> state_map;
296 std::vector<OutputMapping> output_map;
299 std::vector<InputGroup> input_groups;
303 void substituteParameters(SymEngine::DenseMatrix& matrix);
304 void buildMappings();
305 void expandBForDQsym();
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
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