DPsim
SystemTopology.h
1 /* Copyright 2017-2021 Institute for Automation of Complex Power Systems,
2  * EONERC, RWTH Aachen University
3  *
4  * This Source Code Form is subject to the terms of the Mozilla Public
5  * License, v. 2.0. If a copy of the MPL was not distributed with this
6  * file, You can obtain one at https://mozilla.org/MPL/2.0/.
7  *********************************************************************************/
8 
9 #pragma once
10 
11 #include <algorithm>
12 #include <vector>
13 
14 #include <dpsim-models/SimNode.h>
15 #include <dpsim-models/SimPowerComp.h>
16 #include <dpsim-models/TopologicalPowerComp.h>
17 
18 #ifdef WITH_GRAPHVIZ
19 #include <dpsim-models/Graph.h>
20 #endif
21 
22 namespace CPS {
24 public:
25  using Ptr = std::shared_ptr<SystemTopology>;
26 
28  Matrix mFrequencies;
30  TopologicalNode::List mNodes;
32  IdentifiedObject::List mComponents;
35  IdentifiedObject::List mTearComponents;
37  std::map<TopologicalNode::Ptr, TopologicalPowerComp::List> mComponentsAtNode;
38 
39  // #### Deprecated ####
40  // Better use mFrequencies
45 
48 
51  SystemTopology(Real frequency)
52  : mFrequencies(initFrequency(frequency)), mSystemFrequency(frequency),
53  mSystemOmega(2 * PI * frequency) {}
54 
57  SystemTopology(Real frequency, IdentifiedObject::List components)
58  : SystemTopology(frequency) {
59  mComponents = components;
60  }
61 
63  SystemTopology(Real frequency, TopologicalNode::List nodes,
64  IdentifiedObject::List components)
65  : SystemTopology(frequency) {
66  addNodes(nodes);
67  addComponents(components);
68  componentsAtNodeList();
69  }
70 
72  SystemTopology(Real frequency, Matrix frequencies,
73  TopologicalNode::List nodes, IdentifiedObject::List components)
74  : mFrequencies(frequencies), mSystemFrequency(frequency),
75  mSystemOmega(2 * PI * frequency) {
76  addNodes(nodes);
77  addComponents(components);
78  componentsAtNodeList();
79  }
80 
81  Matrix initFrequency(Real frequency) const;
82 
84  void reset();
85 
86  // #### Add Objects to SystemTopology ####
87 
89  void addNode(TopologicalNode::Ptr topNode);
90 
92  void addNodeAt(TopologicalNode::Ptr topNode, UInt index);
93 
95  void addNodes(const TopologicalNode::List &topNodes);
96 
98  void addComponent(IdentifiedObject::Ptr component);
99 
101  template <typename VarType>
102  void connectComponentToNodes(typename SimPowerComp<VarType>::Ptr component,
103  typename SimNode<VarType>::List simNodes);
104 
105  void componentsAtNodeList();
106 
108  void addComponents(const IdentifiedObject::List &components);
109 
111  void initWithPowerflow(const SystemTopology &systemPF, CPS::Domain domain);
112 
114  void addTearComponent(IdentifiedObject::Ptr component);
115 
117  void addTearComponents(const IdentifiedObject::List &components);
118 
119  // #### Get Objects from SystemTopology ####
120 
122  template <typename Type> typename std::shared_ptr<Type> node(UInt index);
123 
125  template <typename Type>
126  typename std::shared_ptr<Type> node(std::string_view name);
127 
129  template <typename Type>
130  typename std::shared_ptr<Type> component(const String &name) {
131  for (auto comp : mComponents) {
132  if (comp->name() == name) {
133  auto comp2 = std::dynamic_pointer_cast<Type>(comp);
134  if (comp2)
135  return comp2;
136  else
137  return nullptr;
138  }
139  }
140  return nullptr;
141  }
142 
143  std::map<String, String, std::less<>> listIdObjects() const;
144 
145  // #### Operations on the SystemTopology ####
146 
148  void multiply(Int numberCopies);
149 
152  void removeComponent(const String &name);
153 
155  template <typename VarType>
156  int checkTopologySubnets(
157  std::unordered_map<typename CPS::SimNode<VarType>::Ptr, int> &subnet);
158 
160  template <typename VarType>
161  void splitSubnets(std::vector<CPS::SystemTopology> &splitSystems);
162 
163 #ifdef WITH_GRAPHVIZ
164  Graph::Graph topologyGraph();
165  String render();
166  void renderToFile(String filename);
167 #endif
168 
169 private:
170  template <typename VarType> void multiplyPowerComps(Int numberCopies);
171 };
172 } // namespace CPS
Real mSystemOmega
System angular frequency - omega.
void addNodes(const TopologicalNode::List &topNodes)
Add multiple nodes.
Real mSystemFrequency
System frequency.
IdentifiedObject::List mComponents
List of network components.
std::shared_ptr< Type > node(UInt index)
Returns TopologicalNode by index in node list.
void initWithPowerflow(const SystemTopology &systemPF, CPS::Domain domain)
Initialize nodes and SG power from PowerFlow.
void removeComponent(const String &name)
Remove system component.
void addNode(TopologicalNode::Ptr topNode)
Adds node and initializes frequencies.
void addTearComponent(IdentifiedObject::Ptr component)
Adds component and initializes frequencies.
TopologicalNode::List mNodes
List of network nodes.
std::shared_ptr< Type > component(const String &name)
Returns Component by name.
SystemTopology(Real frequency)
void reset()
Reset state of components.
void addNodeAt(TopologicalNode::Ptr topNode, UInt index)
Adds node at specified position and initializes frequencies.
void addComponents(const IdentifiedObject::List &components)
Add multiple components.
Matrix mFrequencies
List of considered network frequencies.
void connectComponentToNodes(typename SimPowerComp< VarType >::Ptr component, typename SimNode< VarType >::List simNodes)
Connect component to simNodes.
void addComponent(IdentifiedObject::Ptr component)
Adds component and initializes frequencies.
SystemTopology(Real frequency, Matrix frequencies, TopologicalNode::List nodes, IdentifiedObject::List components)
Standard constructor for multi frequency simulations.
SystemTopology(Real frequency, IdentifiedObject::List components)
SystemTopology(Real frequency, TopologicalNode::List nodes, IdentifiedObject::List components)
Standard constructor for single frequency simulations.
void multiply(Int numberCopies)
Copy the whole topology the given number of times and add the resulting components and nodes to the t...
IdentifiedObject::List mTearComponents
SystemTopology()
Do not use this constructor.
void addTearComponents(const IdentifiedObject::List &components)
Add multiple components.
std::map< TopologicalNode::Ptr, TopologicalPowerComp::List > mComponentsAtNode
Map of network components connected to network nodes.