DPsim
main.cpp
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 #include <iomanip>
10 
11 #include <pybind11/complex.h>
12 #include <pybind11/eigen.h>
13 #include <pybind11/functional.h>
14 #include <pybind11/iostream.h>
15 #include <pybind11/pybind11.h>
16 #include <pybind11/stl.h>
17 
18 #include <DPsim.h>
19 #include <dpsim-models/IdentifiedObject.h>
20 #include <dpsim/RealTimeSimulation.h>
21 #include <dpsim/Simulation.h>
22 
23 #include <dpsim-models/CSVReader.h>
24 
25 #include <dpsim/pybind/Attributes.h>
26 #include <dpsim/pybind/BaseComponents.h>
27 #include <dpsim/pybind/DPComponents.h>
28 #include <dpsim/pybind/EMTComponents.h>
29 #include <dpsim/pybind/SPComponents.h>
30 #include <dpsim/pybind/SignalComponents.h>
31 #include <dpsim/pybind/Utils.h>
32 
33 PYBIND11_DECLARE_HOLDER_TYPE(T, CPS::AttributePointer<T>);
34 
35 namespace py = pybind11;
36 using namespace pybind11::literals;
37 
38 PYBIND11_MODULE(dpsimpy, m) {
39  m.doc() = R"pbdoc(
40  DPsim Python bindings
41  -----------------------
42  The Python bindings provide access to most of the DPsim features implemented in C++.
43  It is possible to run powerflow, quasi-static, dynamic phasor and electromagnetic transient simulations
44  and to parameterize all components of the network from Python.
45  )pbdoc";
46 
47  //Enums
48  py::enum_<CPS::Logger::Level>(m, "LogLevel")
49  .value("trace", CPS::Logger::Level::trace)
50  .value("debug", CPS::Logger::Level::debug)
51  .value("info", CPS::Logger::Level::info)
52  .value("warn", CPS::Logger::Level::warn)
53  .value("err", CPS::Logger::Level::err)
54  .value("critical", CPS::Logger::Level::critical)
55  .value("off", CPS::Logger::Level::off);
56 
57  py::class_<CPS::Math>(m, "Math")
58  .def_static("single_phase_variable_to_three_phase",
60  .def_static("single_phase_parameter_to_three_phase",
62  .def_static("single_phase_power_to_three_phase",
64 
65  py::enum_<DPsim::Solver::Behaviour>(m, "SolverBehaviour")
66  .value("Initialization", DPsim::Solver::Behaviour::Initialization)
67  .value("Simulation", DPsim::Solver::Behaviour::Simulation);
68 
69  py::enum_<CPS::Domain>(m, "Domain")
70  .value("SP", CPS::Domain::SP)
71  .value("DP", CPS::Domain::DP)
72  .value("EMT", CPS::Domain::EMT);
73 
74  py::enum_<CPS::PhaseType>(m, "PhaseType")
75  .value("A", CPS::PhaseType::A)
76  .value("B", CPS::PhaseType::B)
77  .value("C", CPS::PhaseType::C)
78  .value("ABC", CPS::PhaseType::ABC)
79  .value("Single", CPS::PhaseType::Single);
80 
81  py::enum_<CPS::PowerflowBusType>(m, "PowerflowBusType")
82  .value("PV", CPS::PowerflowBusType::PV)
83  .value("PQ", CPS::PowerflowBusType::PQ)
84  .value("VD", CPS::PowerflowBusType::VD)
85  .value("None", CPS::PowerflowBusType::None);
86 
87  py::enum_<CPS::GeneratorType>(m, "GeneratorType")
88  .value("PVNode", CPS::GeneratorType::PVNode)
89  .value("TransientStability", CPS::GeneratorType::TransientStability)
90  .value("IdealVoltageSource", CPS::GeneratorType::IdealVoltageSource)
91  .value("SG3OrderVBR", CPS::GeneratorType::SG3OrderVBR)
92  .value("SG4OrderVBR", CPS::GeneratorType::SG4OrderVBR)
93  .value("SG5OrderVBR", CPS::GeneratorType::SG5OrderVBR)
94  .value("SG6aOrderVBR", CPS::GeneratorType::SG6aOrderVBR)
95  .value("SG6bOrderVBR", CPS::GeneratorType::SG6bOrderVBR)
96  .value("FullOrderVBR", CPS::GeneratorType::FullOrderVBR)
97  .value("FullOrder", CPS::GeneratorType::FullOrder)
98  .value("NONE", CPS::GeneratorType::None);
99 
100  py::enum_<DPsim::Solver::Type>(m, "Solver")
101  .value("MNA", DPsim::Solver::Type::MNA)
102  .value("DAE", DPsim::Solver::Type::DAE)
103  .value("NRP", DPsim::Solver::Type::NRP);
104 
105  py::enum_<DPsim::DirectLinearSolverImpl>(m, "DirectLinearSolverImpl")
106  .value("Undef", DPsim::DirectLinearSolverImpl::Undef)
107  .value("DenseLU", DPsim::DirectLinearSolverImpl::DenseLU)
108  .value("SparseLU", DPsim::DirectLinearSolverImpl::SparseLU)
109  .value("KLU", DPsim::DirectLinearSolverImpl::KLU)
110  .value("CUDADense", DPsim::DirectLinearSolverImpl::CUDADense)
111  .value("CUDASparse", DPsim::DirectLinearSolverImpl::CUDASparse)
112  .value("CUDAMagma", DPsim::DirectLinearSolverImpl::CUDAMagma);
113 
114  py::enum_<DPsim::SCALING_METHOD>(m, "scaling_method")
115  .value("no_scaling", DPsim::SCALING_METHOD::NO_SCALING)
116  .value("sum_scaling", DPsim::SCALING_METHOD::SUM_SCALING)
117  .value("max_scaling", DPsim::SCALING_METHOD::MAX_SCALING);
118 
119  py::enum_<DPsim::FILL_IN_REDUCTION_METHOD>(m, "fill_in_reduction_method")
120  .value("amd", DPsim::FILL_IN_REDUCTION_METHOD::AMD)
121  .value("amd_nv", DPsim::FILL_IN_REDUCTION_METHOD::AMD_NV)
122  .value("amd_ra", DPsim::FILL_IN_REDUCTION_METHOD::AMD_RA)
123  .value("colamd", DPsim::FILL_IN_REDUCTION_METHOD::COLAMD);
124 
125  py::enum_<DPsim::PARTIAL_REFACTORIZATION_METHOD>(
126  m, "partial_refactorization_method")
127  .value("no_partial_refactorization",
128  DPsim::PARTIAL_REFACTORIZATION_METHOD::NO_PARTIAL_REFACTORIZATION)
129  .value("factorization_path",
130  DPsim::PARTIAL_REFACTORIZATION_METHOD::FACTORIZATION_PATH)
131  .value("refactorization_restart",
132  DPsim::PARTIAL_REFACTORIZATION_METHOD::REFACTORIZATION_RESTART);
133 
134  py::enum_<DPsim::USE_BTF>(m, "use_btf")
135  .value("no_btf", DPsim::USE_BTF::NO_BTF)
136  .value("do_btf", DPsim::USE_BTF::DO_BTF);
137 
138  py::enum_<CPS::CSVReader::Mode>(m, "CSVReaderMode")
139  .value("AUTO", CPS::CSVReader::Mode::AUTO)
140  .value("MANUAL", CPS::CSVReader::Mode::MANUAL);
141 
142  py::enum_<CPS::CSVReader::DataFormat>(m, "CSVReaderFormat")
143  .value("HHMMSS", CPS::CSVReader::DataFormat::HHMMSS)
144  .value("SECONDS", CPS::CSVReader::DataFormat::SECONDS)
145  .value("HOURS", CPS::CSVReader::DataFormat::HOURS)
146  .value("MINUTES", CPS::CSVReader::DataFormat::MINUTES);
147 
148  m.attr("RMS3PH_TO_PEAK1PH") = RMS3PH_TO_PEAK1PH;
149  m.attr("PEAK1PH_TO_RMS3PH") = PEAK1PH_TO_RMS3PH;
150  m.attr("P_SNUB_TRANSFORMER") = P_SNUB_TRANSFORMER;
151  m.attr("Q_SNUB_TRANSFORMER") = Q_SNUB_TRANSFORMER;
152 
153  addAttributes(m);
154 
155  py::class_<DPsim::DirectLinearSolverConfiguration>(
156  m, "DirectLinearSolverConfiguration")
157  .def(py::init<>())
158  .def("set_fill_in_reduction_method",
159  &DPsim::DirectLinearSolverConfiguration::setFillInReductionMethod)
160  .def("set_scaling_method",
161  &DPsim::DirectLinearSolverConfiguration::setScalingMethod)
162  .def("set_partial_refactorization_method",
164  setPartialRefactorizationMethod)
165  .def("set_btf", &DPsim::DirectLinearSolverConfiguration::setBTF)
166  .def("get_scaling_method",
167  &DPsim::DirectLinearSolverConfiguration::getScalingMethod)
168  .def("get_fill_in_reduction_method",
169  &DPsim::DirectLinearSolverConfiguration::getFillInReductionMethod)
170  .def("get_partial_refactorization_method",
172  getPartialRefactorizationMethod)
173  .def("get_btf", &DPsim::DirectLinearSolverConfiguration::getBTF);
174 
175  py::class_<DPsim::Simulation>(m, "Simulation")
176  .def(py::init<std::string, CPS::Logger::Level>(), "name"_a,
177  "loglevel"_a = CPS::Logger::Level::off)
178  .def("name", &DPsim::Simulation::name)
179  .def("set_time_step", &DPsim::Simulation::setTimeStep)
180  .def("set_final_time", &DPsim::Simulation::setFinalTime)
181  .def("add_logger", &DPsim::Simulation::addLogger)
182  .def("set_system", &DPsim::Simulation::setSystem)
183  .def("run", &DPsim::Simulation::run)
184  .def("set_solver", &DPsim::Simulation::setSolverType)
185  .def("set_domain", &DPsim::Simulation::setDomain)
186  .def("start", &DPsim::Simulation::start)
187  .def("next", &DPsim::Simulation::next)
188  .def("stop", &DPsim::Simulation::stop)
189  .def("get_idobj_attr", &DPsim::Simulation::getIdObjAttribute, "comp"_a,
190  "attr"_a)
191  .def("add_interface", &DPsim::Simulation::addInterface, "interface"_a)
192  .def("log_idobj_attribute", &DPsim::Simulation::logIdObjAttribute,
193  "comp"_a, "attr"_a)
194  .def("log_attribute", &DPsim::Simulation::logAttribute, "name"_a,
195  "attr"_a)
196  .def("do_init_from_nodes_and_terminals",
197  &DPsim::Simulation::doInitFromNodesAndTerminals)
198  .def("do_system_matrix_recomputation",
199  &DPsim::Simulation::doSystemMatrixRecomputation)
200  .def("do_steady_state_init", &DPsim::Simulation::doSteadyStateInit)
201  .def("do_frequency_parallelization",
203  .def("set_tearing_components", &DPsim::Simulation::setTearingComponents)
204  .def("add_event", &DPsim::Simulation::addEvent)
205  .def("set_solver_component_behaviour",
207  .def("set_direct_solver_implementation",
208  &DPsim::Simulation::setDirectLinearSolverImplementation)
209  .def("set_direct_linear_solver_configuration",
210  &DPsim::Simulation::setDirectLinearSolverConfiguration)
211  .def("log_lu_times", &DPsim::Simulation::logLUTimes);
212 
213  py::class_<DPsim::RealTimeSimulation, DPsim::Simulation>(m,
214  "RealTimeSimulation")
215  .def(py::init<std::string, CPS::Logger::Level>(), "name"_a,
216  "loglevel"_a = CPS::Logger::Level::info)
217  .def("name", &DPsim::RealTimeSimulation::name)
218  .def("set_time_step", &DPsim::RealTimeSimulation::setTimeStep)
219  .def("set_final_time", &DPsim::RealTimeSimulation::setFinalTime)
220  .def("add_logger", &DPsim::RealTimeSimulation::addLogger)
221  .def("set_system", &DPsim::RealTimeSimulation::setSystem)
222  .def("run",
223  static_cast<void (DPsim::RealTimeSimulation::*)(CPS::Int startIn)>(
225  .def("set_solver", &DPsim::RealTimeSimulation::setSolverType)
226  .def("set_domain", &DPsim::RealTimeSimulation::setDomain);
227 
228  py::class_<CPS::SystemTopology, std::shared_ptr<CPS::SystemTopology>>(
229  m, "SystemTopology")
230  .def(py::init<CPS::Real, CPS::TopologicalNode::List,
231  CPS::IdentifiedObject::List>())
232  .def(py::init<CPS::Real, CPS::Matrix, CPS::TopologicalNode::List,
233  CPS::IdentifiedObject::List>())
234  .def(py::init<CPS::Real>())
237  .def("node", py::overload_cast<std::string_view>(
238  &DPsim::SystemTopology::node<CPS::TopologicalNode>))
239  .def("node", py::overload_cast<CPS::UInt>(
240  &DPsim::SystemTopology::node<CPS::TopologicalNode>))
241  .def("connect_component",
242  py::overload_cast<CPS::SimPowerComp<CPS::Real>::Ptr,
243  CPS::SimNode<CPS::Real>::List>(
244  &DPsim::SystemTopology::connectComponentToNodes<CPS::Real>))
245  .def("connect_component",
246  py::overload_cast<CPS::SimPowerComp<CPS::Complex>::Ptr,
247  CPS::SimNode<CPS::Complex>::List>(
248  &DPsim::SystemTopology::connectComponentToNodes<CPS::Complex>))
249  .def("component",
250  &DPsim::SystemTopology::component<CPS::TopologicalPowerComp>)
251  .def("add_tear_component", &DPsim::SystemTopology::addTearComponent)
252 #ifdef WITH_GRAPHVIZ
253  .def("_repr_svg_", &DPsim::SystemTopology::render)
254  .def("render_to_file", &DPsim::SystemTopology::renderToFile)
255 #endif
256  .def_readwrite("nodes", &DPsim::SystemTopology::mNodes)
257  .def_readwrite("components", &DPsim::SystemTopology::mComponents)
258  .def_readwrite("components_at_node",
260  .def_readonly("tear_components", &DPsim::SystemTopology::mTearComponents)
261  .def("list_idobjects", &DPsim::SystemTopology::listIdObjects)
262  .def("init_with_powerflow", &DPsim::SystemTopology::initWithPowerflow,
263  "systemPF"_a, "domain"_a);
264 
265  py::class_<DPsim::Interface, std::shared_ptr<DPsim::Interface>>(m,
266  "Interface");
267 
268  py::class_<DPsim::DataLogger, std::shared_ptr<DPsim::DataLogger>>(m, "Logger")
269  .def(py::init<std::string>())
270  .def_static("set_log_dir", &CPS::Logger::setLogDir)
271  .def_static("get_log_dir", &CPS::Logger::logDir)
272  .def("log_attribute",
273  py::overload_cast<const CPS::String &, CPS::AttributeBase::Ptr,
274  CPS::UInt, CPS::UInt>(
275  &DPsim::DataLogger::logAttribute),
276  "name"_a, "attr"_a, "max_cols"_a = 0, "max_rows"_a = 0)
278  .def("log_attribute",
279  py::overload_cast<const std::vector<CPS::String> &,
281  &DPsim::DataLogger::logAttribute),
282  "names"_a, "attr"_a)
284  .def(
285  "log_attribute",
286  [](DPsim::DataLogger &logger, const CPS::String &name,
287  const CPS::String &attr, const CPS::IdentifiedObject &comp,
288  CPS::UInt rowsMax, CPS::UInt colsMax) {
289  logger.logAttribute(name, comp.attribute(attr), rowsMax, colsMax);
290  },
291  "name"_a, "attr"_a, "comp"_a, "rows_max"_a = 0, "cols_max"_a = 0)
293  .def("log_attribute",
294  [](DPsim::DataLogger &logger, const std::vector<CPS::String> &names,
295  const CPS::String &attr, const CPS::IdentifiedObject &comp) {
296  logger.logAttribute(names, comp.attribute(attr));
297  });
298 
299  py::class_<CPS::IdentifiedObject, std::shared_ptr<CPS::IdentifiedObject>>(
300  m, "IdentifiedObject")
301  .def("name", &CPS::IdentifiedObject::name)
305  .def("attr", &CPS::IdentifiedObject::attribute, "name"_a)
306  .def("print_attribute_list", &printAttributes)
307  .def("print_attribute", &printAttribute, "attribute_name"_a)
308  .def("__str__", &getAttributeList);
309 
310 #ifdef WITH_CIM
311  py::class_<CPS::CIM::Reader>(m, "CIMReader")
312  .def(py::init<std::string, CPS::Logger::Level, CPS::Logger::Level>(),
313  "name"_a, "loglevel"_a = CPS::Logger::Level::info,
314  "comploglevel"_a = CPS::Logger::Level::off)
315  .def("loadCIM", (CPS::SystemTopology(CPS::CIM::Reader::*)(
316  CPS::Real, const std::list<CPS::String> &,
317  CPS::Domain, CPS::PhaseType, CPS::GeneratorType)) &
319 #endif
320 
321  py::class_<CPS::CSVReader>(m, "CSVReader")
322  .def(py::init<std::string, const std::string &,
323  std::map<std::string, std::string> &, CPS::Logger::Level>())
324  .def("assignLoadProfile", &CPS::CSVReader::assignLoadProfile);
325 
326  //Base Classes
327 
328  py::class_<CPS::TopologicalPowerComp,
329  std::shared_ptr<CPS::TopologicalPowerComp>, CPS::IdentifiedObject>(
330  m, "TopologicalPowerComp");
331  py::class_<CPS::SimPowerComp<CPS::Complex>,
332  std::shared_ptr<CPS::SimPowerComp<CPS::Complex>>,
333  CPS::TopologicalPowerComp>(m, "SimPowerCompComplex")
335  .def("set_intf_current", &CPS::SimPowerComp<CPS::Complex>::setIntfCurrent)
336  .def("set_intf_voltage", &CPS::SimPowerComp<CPS::Complex>::setIntfVoltage)
337  .def("get_terminal", &CPS::SimPowerComp<CPS::Complex>::terminal,
338  "index"_a);
339  py::class_<CPS::SimPowerComp<CPS::Real>,
340  std::shared_ptr<CPS::SimPowerComp<CPS::Real>>,
341  CPS::TopologicalPowerComp>(m, "SimPowerCompReal")
342  .def("connect", &CPS::SimPowerComp<CPS::Real>::connect)
343  .def("set_intf_current", &CPS::SimPowerComp<CPS::Real>::setIntfCurrent)
344  .def("set_intf_voltage", &CPS::SimPowerComp<CPS::Real>::setIntfVoltage)
345  .def("get_terminal", &CPS::SimPowerComp<CPS::Real>::terminal, "index"_a);
346  py::class_<CPS::TopologicalNode, std::shared_ptr<CPS::TopologicalNode>,
347  CPS::IdentifiedObject>(m, "TopologicalNode")
348  .def("initial_single_voltage",
349  &CPS::TopologicalNode::initialSingleVoltage,
350  "phase_type"_a = CPS::PhaseType::Single);
351 
352  py::class_<CPS::TopologicalTerminal,
353  std::shared_ptr<CPS::TopologicalTerminal>, CPS::IdentifiedObject>(
354  m, "TopologicalTerminal")
355  .def("set_power",
356  py::overload_cast<CPS::Complex>(&CPS::TopologicalTerminal::setPower))
357  .def("set_power", py::overload_cast<CPS::MatrixComp>(
358  &CPS::TopologicalTerminal::setPower));
359 
360  py::class_<CPS::SimTerminal<CPS::Complex>,
361  std::shared_ptr<CPS::SimTerminal<CPS::Complex>>,
362  CPS::TopologicalTerminal>(m, "SimTerminalComplex");
363  py::class_<CPS::SimTerminal<CPS::Real>,
364  std::shared_ptr<CPS::SimTerminal<CPS::Real>>,
365  CPS::TopologicalTerminal>(m, "SimTerminalReal");
366 
367  //Events
368  py::module mEvent = m.def_submodule("event", "events");
369  py::class_<DPsim::Event, std::shared_ptr<DPsim::Event>>(mEvent, "Event");
370  py::class_<DPsim::SwitchEvent, std::shared_ptr<DPsim::SwitchEvent>,
371  DPsim::Event>(mEvent, "SwitchEvent", py::multiple_inheritance())
372  .def(py::init<CPS::Real, const std::shared_ptr<CPS::Base::Ph1::Switch>,
373  CPS::Bool>());
374  py::class_<DPsim::SwitchEvent3Ph, std::shared_ptr<DPsim::SwitchEvent3Ph>,
375  DPsim::Event>(mEvent, "SwitchEvent3Ph", py::multiple_inheritance())
376  .def(py::init<CPS::Real, const std::shared_ptr<CPS::Base::Ph3::Switch>,
377  CPS::Bool>());
378 
379  //Components
380  py::module mBase = m.def_submodule("base", "base models");
381  addBaseComponents(mBase);
382 
383  py::module mDP = m.def_submodule("dp", "dynamic phasor models");
384  addDPComponents(mDP);
385 
386  py::module mEMT = m.def_submodule("emt", "electromagnetic-transient models");
387  addEMTComponents(mEMT);
388 
389  py::module mSP = m.def_submodule("sp", "static phasor models");
390  mSP.attr("SimNode") = mDP.attr("SimNode");
391  addSPComponents(mSP);
392 
393  py::module mSignal = m.def_submodule("signal", "signal models");
394  addSignalComponents(mSignal);
395 
396 #ifdef VERSION_INFO
397  m.attr("__version__") = VERSION_INFO;
398 #else
399  m.attr("__version__") = "dev";
400 #endif
401 }
SystemTopology loadCIM(Real systemFrequency, const fs::path &filename, Domain domain=Domain::DP, PhaseType phase=PhaseType::Single, GeneratorType genType=GeneratorType::None)
Parses data from CIM files into the CPS data structure.
Definition: Reader.cpp:209
void assignLoadProfile(SystemTopology &sys, Real start_time=-1, Real time_step=1, Real end_time=-1, CSVReader::Mode mode=CSVReader::Mode::AUTO, CSVReader::DataFormat format=CSVReader::DataFormat::SECONDS)
assign load profile to corresponding load object
Definition: CSVReader.cpp:479
AttributeBase::Ptr attribute(const String &name) const
Return pointer to an attribute.
static void setLogDir(String path)
Set env variable CPS_LOG_DIR and overwrite.
Definition: Logger.cpp:88
static Matrix singlePhasePowerToThreePhase(Real power)
To convert single phase power to symmetrical three phase.
Definition: MathUtils.cpp:217
static Matrix singlePhaseParameterToThreePhase(Real parameter)
To convert single phase parameters to symmetrical three phase ones.
Definition: MathUtils.cpp:211
static MatrixComp singlePhaseVariableToThreePhase(Complex var_1ph)
To convert single phase complex variables (voltages, currents) to symmetrical three phase ones.
Definition: MathUtils.cpp:205
Base class for all components that are transmitting power.
Definition: SimPowerComp.h:17
IdentifiedObject::List mComponents
List of network components.
void initWithPowerflow(const SystemTopology &systemPF, CPS::Domain domain)
Initialize nodes and SG power from PowerFlow.
void addTearComponent(IdentifiedObject::Ptr component)
Adds component and initializes frequencies.
TopologicalNode::List mNodes
List of network nodes.
void addComponents(const IdentifiedObject::List &components)
Add multiple components.
void addComponent(IdentifiedObject::Ptr component)
Adds component and initializes frequencies.
IdentifiedObject::List mTearComponents
std::map< TopologicalNode::Ptr, TopologicalPowerComp::List > mComponentsAtNode
Map of network components connected to network nodes.
Extending Simulation class by real-time functionality.
void doFrequencyParallelization(Bool value)
Compute phasors of different frequencies in parallel.
Definition: Simulation.h:212
void logLUTimes()
Write LU decomposition times measurements to log file.
Definition: Simulation.cpp:434
Real next()
Run until next time step.
Definition: Simulation.cpp:386
void setSolverAndComponentBehaviour(Solver::Behaviour behaviour)
set solver and component to initialization or simulation behaviour
Definition: Simulation.h:178
CPS::AttributeBase::Ptr getIdObjAttribute(const String &comp, const String &attr)
CHECK: Can these be deleted? getIdObjAttribute + "**attr =" should suffice.
Definition: Simulation.cpp:440
void start()
Start simulation without advancing in time.
Definition: Simulation.cpp:337
void doSteadyStateInit(Bool f)
activate steady state initialization
Definition: Simulation.h:220
void addEvent(Event::Ptr e)
Schedule an event in the simulation.
Definition: Simulation.h:245
void run()
Run simulation until total time is elapsed.
Definition: Simulation.cpp:395
void logAttribute(String name, CPS::AttributeBase::Ptr attr)
CHECK: Can we store the attribute name / UID intrinsically inside the attribute?
Definition: Simulation.cpp:468
void stop()
Stop simulation including scheduler and interfaces.
Definition: Simulation.cpp:366
void addLogger(DataLogger::Ptr logger)
Add a new data logger.
Definition: Simulation.h:247