DPsim
Loading...
Searching...
No Matches
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
20#include <DPsimPy.h>
21
22PYBIND11_DECLARE_HOLDER_TYPE(T, CPS::AttributePointer<T>);
23
24namespace py = pybind11;
25using namespace pybind11::literals;
26
27PYBIND11_MODULE(dpsimpy, m) {
28 m.doc() = R"pbdoc(
29 DPsim Python bindings
30 -----------------------
31 The Python bindings provide access to most of the DPsim features implemented in C++.
32 It is possible to run powerflow, quasi-static, dynamic phasor and electromagnetic transient simulations
33 and to parameterize all components of the network from Python.
34 )pbdoc";
35
36 //Enums
37 py::enum_<CPS::Logger::Level>(m, "LogLevel")
38 .value("trace", CPS::Logger::Level::trace)
39 .value("debug", CPS::Logger::Level::debug)
40 .value("info", CPS::Logger::Level::info)
41 .value("warn", CPS::Logger::Level::warn)
42 .value("err", CPS::Logger::Level::err)
43 .value("critical", CPS::Logger::Level::critical)
44 .value("off", CPS::Logger::Level::off);
45
46 py::class_<CPS::Math>(m, "Math")
47 .def_static("single_phase_variable_to_three_phase",
49 .def_static("single_phase_parameter_to_three_phase",
51 .def_static("single_phase_power_to_three_phase",
53
54 py::enum_<DPsim::Solver::Behaviour>(m, "SolverBehaviour")
55 .value("Initialization", DPsim::Solver::Behaviour::Initialization)
56 .value("Simulation", DPsim::Solver::Behaviour::Simulation);
57
58 py::enum_<CPS::Domain>(m, "Domain")
59 .value("SP", CPS::Domain::SP)
60 .value("DP", CPS::Domain::DP)
61 .value("EMT", CPS::Domain::EMT);
62
63 py::enum_<CPS::PhaseType>(m, "PhaseType")
64 .value("A", CPS::PhaseType::A)
65 .value("B", CPS::PhaseType::B)
66 .value("C", CPS::PhaseType::C)
67 .value("ABC", CPS::PhaseType::ABC)
68 .value("Single", CPS::PhaseType::Single);
69
70 py::enum_<CPS::PowerflowBusType>(m, "PowerflowBusType")
71 .value("PV", CPS::PowerflowBusType::PV)
72 .value("PQ", CPS::PowerflowBusType::PQ)
73 .value("VD", CPS::PowerflowBusType::VD)
74 .value("None", CPS::PowerflowBusType::None);
75
76 py::enum_<CPS::GeneratorType>(m, "GeneratorType")
77 .value("PVNode", CPS::GeneratorType::PVNode)
78 .value("TransientStability", CPS::GeneratorType::TransientStability)
79 .value("IdealVoltageSource", CPS::GeneratorType::IdealVoltageSource)
80 .value("SG3OrderVBR", CPS::GeneratorType::SG3OrderVBR)
81 .value("SG4OrderVBR", CPS::GeneratorType::SG4OrderVBR)
82 .value("SG5OrderVBR", CPS::GeneratorType::SG5OrderVBR)
83 .value("SG6aOrderVBR", CPS::GeneratorType::SG6aOrderVBR)
84 .value("SG6bOrderVBR", CPS::GeneratorType::SG6bOrderVBR)
85 .value("FullOrderVBR", CPS::GeneratorType::FullOrderVBR)
86 .value("FullOrder", CPS::GeneratorType::FullOrder)
87 .value("NONE", CPS::GeneratorType::None);
88
89 py::enum_<DPsim::Solver::Type>(m, "Solver")
90 .value("MNA", DPsim::Solver::Type::MNA)
91 .value("DAE", DPsim::Solver::Type::DAE)
92 .value("NRP", DPsim::Solver::Type::NRP);
93
94 py::enum_<DPsim::DirectLinearSolverImpl>(m, "DirectLinearSolverImpl")
95 .value("Undef", DPsim::DirectLinearSolverImpl::Undef)
96 .value("DenseLU", DPsim::DirectLinearSolverImpl::DenseLU)
97 .value("SparseLU", DPsim::DirectLinearSolverImpl::SparseLU)
98 .value("KLU", DPsim::DirectLinearSolverImpl::KLU)
99 .value("CUDADense", DPsim::DirectLinearSolverImpl::CUDADense)
100 .value("CUDASparse", DPsim::DirectLinearSolverImpl::CUDASparse)
101 .value("CUDAMagma", DPsim::DirectLinearSolverImpl::CUDAMagma);
102
103 py::enum_<DPsim::SCALING_METHOD>(m, "scaling_method")
104 .value("no_scaling", DPsim::SCALING_METHOD::NO_SCALING)
105 .value("sum_scaling", DPsim::SCALING_METHOD::SUM_SCALING)
106 .value("max_scaling", DPsim::SCALING_METHOD::MAX_SCALING);
107
108 py::enum_<DPsim::FILL_IN_REDUCTION_METHOD>(m, "fill_in_reduction_method")
109 .value("amd", DPsim::FILL_IN_REDUCTION_METHOD::AMD)
110 .value("amd_nv", DPsim::FILL_IN_REDUCTION_METHOD::AMD_NV)
111 .value("amd_ra", DPsim::FILL_IN_REDUCTION_METHOD::AMD_RA)
112 .value("colamd", DPsim::FILL_IN_REDUCTION_METHOD::COLAMD);
113
114 py::enum_<DPsim::PARTIAL_REFACTORIZATION_METHOD>(
115 m, "partial_refactorization_method")
116 .value("no_partial_refactorization",
117 DPsim::PARTIAL_REFACTORIZATION_METHOD::NO_PARTIAL_REFACTORIZATION)
118 .value("factorization_path",
119 DPsim::PARTIAL_REFACTORIZATION_METHOD::FACTORIZATION_PATH)
120 .value("refactorization_restart",
121 DPsim::PARTIAL_REFACTORIZATION_METHOD::REFACTORIZATION_RESTART);
122
123 py::enum_<DPsim::USE_BTF>(m, "use_btf")
124 .value("no_btf", DPsim::USE_BTF::NO_BTF)
125 .value("do_btf", DPsim::USE_BTF::DO_BTF);
126
127 py::enum_<CPS::CSVReader::Mode>(m, "CSVReaderMode")
128 .value("AUTO", CPS::CSVReader::Mode::AUTO)
129 .value("MANUAL", CPS::CSVReader::Mode::MANUAL);
130
131 py::enum_<CPS::CSVReader::DataFormat>(m, "CSVReaderFormat")
132 .value("HHMMSS", CPS::CSVReader::DataFormat::HHMMSS)
133 .value("SECONDS", CPS::CSVReader::DataFormat::SECONDS)
134 .value("HOURS", CPS::CSVReader::DataFormat::HOURS)
135 .value("MINUTES", CPS::CSVReader::DataFormat::MINUTES);
136
137 m.attr("RMS3PH_TO_PEAK1PH") = RMS3PH_TO_PEAK1PH;
138 m.attr("PEAK1PH_TO_RMS3PH") = PEAK1PH_TO_RMS3PH;
139 m.attr("P_SNUB_TRANSFORMER") = P_SNUB_TRANSFORMER;
140 m.attr("Q_SNUB_TRANSFORMER") = Q_SNUB_TRANSFORMER;
141
142 addAttributes(m);
143
144 py::class_<DPsim::DirectLinearSolverConfiguration>(
145 m, "DirectLinearSolverConfiguration")
146 .def(py::init<>())
147 .def("set_fill_in_reduction_method",
148 &DPsim::DirectLinearSolverConfiguration::setFillInReductionMethod)
149 .def("set_scaling_method",
150 &DPsim::DirectLinearSolverConfiguration::setScalingMethod)
151 .def("set_partial_refactorization_method",
153 setPartialRefactorizationMethod)
154 .def("set_btf", &DPsim::DirectLinearSolverConfiguration::setBTF)
155 .def("get_scaling_method",
156 &DPsim::DirectLinearSolverConfiguration::getScalingMethod)
157 .def("get_fill_in_reduction_method",
158 &DPsim::DirectLinearSolverConfiguration::getFillInReductionMethod)
159 .def("get_partial_refactorization_method",
161 getPartialRefactorizationMethod)
162 .def("get_btf", &DPsim::DirectLinearSolverConfiguration::getBTF);
163
164 py::class_<DPsim::Simulation>(m, "Simulation")
165 .def(py::init<std::string, CPS::Logger::Level>(), "name"_a,
166 "loglevel"_a = CPS::Logger::Level::off)
167 .def("name", &DPsim::Simulation::name)
168 .def("set_time_step", &DPsim::Simulation::setTimeStep)
169 .def("set_final_time", &DPsim::Simulation::setFinalTime)
170 .def("add_logger", &DPsim::Simulation::addLogger)
171 .def("set_system", &DPsim::Simulation::setSystem)
172 .def("run", &DPsim::Simulation::run)
173 .def("set_solver", &DPsim::Simulation::setSolverType)
174 .def("set_domain", &DPsim::Simulation::setDomain)
175 .def("start", &DPsim::Simulation::start)
176 .def("next", &DPsim::Simulation::next)
177 .def("stop", &DPsim::Simulation::stop)
178 .def("get_idobj_attr", &DPsim::Simulation::getIdObjAttribute, "comp"_a,
179 "attr"_a)
180 .def("add_interface", &DPsim::Simulation::addInterface, "interface"_a)
181 .def("log_idobj_attribute", &DPsim::Simulation::logIdObjAttribute,
182 "comp"_a, "attr"_a)
183 .def("log_attribute", &DPsim::Simulation::logAttribute, "name"_a,
184 "attr"_a)
185 .def("do_init_from_nodes_and_terminals",
186 &DPsim::Simulation::doInitFromNodesAndTerminals)
187 .def("do_system_matrix_recomputation",
188 &DPsim::Simulation::doSystemMatrixRecomputation)
189 .def("do_steady_state_init", &DPsim::Simulation::doSteadyStateInit)
190 .def("do_frequency_parallelization",
192 .def("do_split_subnets", &DPsim::Simulation::doSplitSubnets)
193 .def("set_tearing_components", &DPsim::Simulation::setTearingComponents)
194 .def("add_event", &DPsim::Simulation::addEvent)
195 .def("set_solver_component_behaviour",
197 .def("set_direct_solver_implementation",
198 &DPsim::Simulation::setDirectLinearSolverImplementation)
199 .def("set_direct_linear_solver_configuration",
200 &DPsim::Simulation::setDirectLinearSolverConfiguration)
201 .def("log_lu_times", &DPsim::Simulation::logLUTimes);
202
203#ifdef WITH_RT
204 py::class_<DPsim::RealTimeSimulation, DPsim::Simulation>(m,
205 "RealTimeSimulation")
206 .def(py::init<std::string, CPS::Logger::Level>(), "name"_a,
207 "loglevel"_a = CPS::Logger::Level::info)
208 .def("name", &DPsim::RealTimeSimulation::name)
209 .def("set_time_step", &DPsim::RealTimeSimulation::setTimeStep)
210 .def("set_final_time", &DPsim::RealTimeSimulation::setFinalTime)
211 .def("add_logger", &DPsim::RealTimeSimulation::addLogger)
212 .def("set_system", &DPsim::RealTimeSimulation::setSystem)
213 .def("run",
214 static_cast<void (DPsim::RealTimeSimulation::*)(CPS::Int startIn)>(
216 .def("set_solver", &DPsim::RealTimeSimulation::setSolverType)
217 .def("set_domain", &DPsim::RealTimeSimulation::setDomain);
218#endif
219
220 py::class_<CPS::SystemTopology, std::shared_ptr<CPS::SystemTopology>>(
221 m, "SystemTopology")
222 .def(py::init<CPS::Real, CPS::TopologicalNode::List,
223 CPS::IdentifiedObject::List>())
224 .def(py::init<CPS::Real, CPS::Matrix, CPS::TopologicalNode::List,
225 CPS::IdentifiedObject::List>())
226 .def(py::init<CPS::Real>())
229 .def("node", py::overload_cast<std::string_view>(
231 .def("node", py::overload_cast<CPS::UInt>(
233 .def("connect_component",
234 py::overload_cast<CPS::SimPowerComp<CPS::Real>::Ptr,
235 CPS::SimNode<CPS::Real>::List>(
237 .def("connect_component",
238 py::overload_cast<CPS::SimPowerComp<CPS::Complex>::Ptr,
239 CPS::SimNode<CPS::Complex>::List>(
241 .def("component",
243 .def("add_tear_component", &DPsim::SystemTopology::addTearComponent)
244#ifdef WITH_GRAPHVIZ
245 .def("_repr_svg_", &DPsim::SystemTopology::render)
246 .def("render_to_file", &DPsim::SystemTopology::renderToFile)
247#endif
248 .def_readwrite("nodes", &DPsim::SystemTopology::mNodes)
249 .def_readwrite("components", &DPsim::SystemTopology::mComponents)
250 .def_readwrite("components_at_node",
252 .def_readonly("tear_components", &DPsim::SystemTopology::mTearComponents)
253 .def("list_idobjects", &DPsim::SystemTopology::listIdObjects)
254 .def("init_with_powerflow", &DPsim::SystemTopology::initWithPowerflow,
255 "systemPF"_a, "domain"_a)
256 .def("add_component", &DPsim::SystemTopology::addComponent)
257 .def("add_components", &DPsim::SystemTopology::addComponents)
258 .def("remove_component", &DPsim::SystemTopology::removeComponent);
259
260 py::class_<DPsim::Interface, std::shared_ptr<DPsim::Interface>>(m,
261 "Interface");
262
264 std::shared_ptr<DPsim::DataLoggerInterface>>(m,
265 "DataLoggerInterface")
266 .def("log_attribute",
267 py::overload_cast<const CPS::String &, CPS::AttributeBase::Ptr,
268 CPS::UInt, CPS::UInt>(
269 &DPsim::DataLoggerInterface::logAttribute),
270 "name"_a, "attr"_a, "max_cols"_a = 0, "max_rows"_a = 0)
272 .def("log_attribute",
273 py::overload_cast<const std::vector<CPS::String> &,
274 CPS::AttributeBase::Ptr>(
275 &DPsim::DataLoggerInterface::logAttribute),
276 "names"_a, "attr"_a)
278 .def("log_attribute",
280 const std::vector<CPS::String> &names, const CPS::String &attr,
281 const CPS::IdentifiedObject &comp) {
282 logger.logAttribute(names, comp.attribute(attr));
283 });
284
286 std::shared_ptr<DPsim::DataLogger>>(m, "Logger")
287 .def(py::init<std::string>())
288 .def_static("set_log_dir", &CPS::Logger::setLogDir)
289 .def_static("get_log_dir", &CPS::Logger::logDir)
290 .def("log_attribute",
291 py::overload_cast<const CPS::String &, CPS::AttributeBase::Ptr,
292 CPS::UInt, CPS::UInt>(
293 &DPsim::DataLogger::logAttribute),
294 "name"_a, "attr"_a, "max_cols"_a = 0, "max_rows"_a = 0)
296 .def("log_attribute",
297 py::overload_cast<const std::vector<CPS::String> &,
298 CPS::AttributeBase::Ptr>(
299 &DPsim::DataLogger::logAttribute),
300 "names"_a, "attr"_a)
302 .def(
303 "log_attribute",
304 [](DPsim::DataLogger &logger, const CPS::String &name,
305 const CPS::String &attr, const CPS::IdentifiedObject &comp,
306 CPS::UInt rowsMax, CPS::UInt colsMax) {
307 logger.logAttribute(name, comp.attribute(attr), rowsMax, colsMax);
308 },
309 "name"_a, "attr"_a, "comp"_a, "rows_max"_a = 0, "cols_max"_a = 0)
311 .def("log_attribute",
312 [](DPsim::DataLogger &logger, const std::vector<CPS::String> &names,
313 const CPS::String &attr, const CPS::IdentifiedObject &comp) {
314 logger.logAttribute(names, comp.attribute(attr));
315 });
316#ifdef WITH_RT
318 std::shared_ptr<DPsim::RealTimeDataLogger>>(m,
319 "RealTimeDataLogger")
320
321 .def(py::init([](py::object filename, DPsim::Real final_time,
322 DPsim::Real time_step) {
323 py::object fspath =
324 py::module_::import("os").attr("fspath")(filename);
325 std::string s = py::cast<std::string>(fspath);
326 std::filesystem::path p(s);
327 return std::make_shared<DPsim::RealTimeDataLogger>(p, final_time,
328 time_step);
329 }),
330 "filename"_a, "final_time"_a, "time_step"_a)
331
332 .def(py::init([](py::object filename, std::size_t row_number) {
333 py::object fspath =
334 py::module_::import("os").attr("fspath")(filename);
335 std::string s = py::cast<std::string>(fspath);
336 std::filesystem::path p(s);
337 return std::make_shared<DPsim::RealTimeDataLogger>(p, row_number);
338 }),
339 "filename"_a, "row_number"_a)
340
341 .def("log_attribute",
342 py::overload_cast<const CPS::String &, CPS::AttributeBase::Ptr,
343 CPS::UInt, CPS::UInt>(
344 &DPsim::DataLoggerInterface::logAttribute),
345 "name"_a, "attr"_a, "max_cols"_a = 0, "max_rows"_a = 0)
346
347 .def("log_attribute",
348 py::overload_cast<const std::vector<CPS::String> &,
349 CPS::AttributeBase::Ptr>(
350 &DPsim::DataLoggerInterface::logAttribute),
351 "names"_a, "attr"_a)
352
353 .def(
354 "log_attribute",
355 [](DPsim::RealTimeDataLogger &logger, const CPS::String &name,
356 const CPS::String &attr, const CPS::IdentifiedObject &comp,
357 CPS::UInt rowsMax, CPS::UInt colsMax) {
358 logger.logAttribute(name, comp.attribute(attr), rowsMax, colsMax);
359 },
360 "name"_a, "attr"_a, "comp"_a, "rows_max"_a = 0, "cols_max"_a = 0)
361
362 .def(
363 "log_attribute",
364 [](DPsim::RealTimeDataLogger &logger,
365 const std::vector<CPS::String> &names, const CPS::String &attr,
366 const CPS::IdentifiedObject &comp) {
367 logger.logAttribute(names, comp.attribute(attr));
368 },
369 "names"_a, "attr"_a, "comp"_a);
370#endif
371
372 py::class_<CPS::IdentifiedObject, std::shared_ptr<CPS::IdentifiedObject>>(
373 m, "IdentifiedObject")
374 .def("name", &CPS::IdentifiedObject::name)
378 .def("attr", &CPS::IdentifiedObject::attribute, "name"_a)
379 .def("print_attribute_list", &printAttributes)
380 .def("print_attribute", &printAttribute, "attribute_name"_a)
381 .def("__str__", &getAttributeList);
382
383#ifdef WITH_CIM
384 py::class_<CPS::CIM::Reader>(m, "CIMReader")
385 .def(py::init<std::string, CPS::Logger::Level, CPS::Logger::Level>(),
386 "name"_a, "loglevel"_a = CPS::Logger::Level::info,
387 "comploglevel"_a = CPS::Logger::Level::off)
388 .def("loadCIM", (CPS::SystemTopology(CPS::CIM::Reader::*)(
389 CPS::Real, const std::list<CPS::String> &,
390 CPS::Domain, CPS::PhaseType, CPS::GeneratorType)) &
392#endif
393
394 py::class_<CPS::CSVReader>(m, "CSVReader")
395 .def(py::init<std::string, const std::string &,
396 std::map<std::string, std::string> &, CPS::Logger::Level>())
397 .def("assignLoadProfile", &CPS::CSVReader::assignLoadProfile);
398
399 //Base Classes
400
401 py::class_<CPS::TopologicalPowerComp,
402 std::shared_ptr<CPS::TopologicalPowerComp>, CPS::IdentifiedObject>(
403 m, "TopologicalPowerComp");
404 py::class_<CPS::SimPowerComp<CPS::Complex>,
405 std::shared_ptr<CPS::SimPowerComp<CPS::Complex>>,
406 CPS::TopologicalPowerComp>(m, "SimPowerCompComplex")
408 .def("set_intf_current", &CPS::SimPowerComp<CPS::Complex>::setIntfCurrent)
409 .def("set_intf_voltage", &CPS::SimPowerComp<CPS::Complex>::setIntfVoltage)
410 .def("get_terminal", &CPS::SimPowerComp<CPS::Complex>::terminal,
411 "index"_a);
412 py::class_<CPS::SimPowerComp<CPS::Real>,
413 std::shared_ptr<CPS::SimPowerComp<CPS::Real>>,
414 CPS::TopologicalPowerComp>(m, "SimPowerCompReal")
416 .def("set_intf_current", &CPS::SimPowerComp<CPS::Real>::setIntfCurrent)
417 .def("set_intf_voltage", &CPS::SimPowerComp<CPS::Real>::setIntfVoltage)
418 .def("get_terminal", &CPS::SimPowerComp<CPS::Real>::terminal, "index"_a);
419 py::class_<CPS::TopologicalNode, std::shared_ptr<CPS::TopologicalNode>,
420 CPS::IdentifiedObject>(m, "TopologicalNode")
421 .def("initial_single_voltage",
422 &CPS::TopologicalNode::initialSingleVoltage,
423 "phase_type"_a = CPS::PhaseType::Single);
424
425 py::class_<CPS::TopologicalTerminal,
426 std::shared_ptr<CPS::TopologicalTerminal>, CPS::IdentifiedObject>(
427 m, "TopologicalTerminal")
428 .def("set_power",
429 py::overload_cast<CPS::Complex>(&CPS::TopologicalTerminal::setPower))
430 .def("set_power", py::overload_cast<CPS::MatrixComp>(
431 &CPS::TopologicalTerminal::setPower));
432
433 py::class_<CPS::SimTerminal<CPS::Complex>,
434 std::shared_ptr<CPS::SimTerminal<CPS::Complex>>,
435 CPS::TopologicalTerminal>(m, "SimTerminalComplex");
436 py::class_<CPS::SimTerminal<CPS::Real>,
437 std::shared_ptr<CPS::SimTerminal<CPS::Real>>,
438 CPS::TopologicalTerminal>(m, "SimTerminalReal");
439
440 //Events
441 py::module mEvent = m.def_submodule("event", "events");
442 py::class_<DPsim::Event, std::shared_ptr<DPsim::Event>>(mEvent, "Event");
443 py::class_<DPsim::SwitchEvent, std::shared_ptr<DPsim::SwitchEvent>,
444 DPsim::Event>(mEvent, "SwitchEvent", py::multiple_inheritance())
445 .def(py::init<CPS::Real, const std::shared_ptr<CPS::Base::Ph1::Switch>,
446 CPS::Bool>());
447 py::class_<DPsim::SwitchEvent3Ph, std::shared_ptr<DPsim::SwitchEvent3Ph>,
448 DPsim::Event>(mEvent, "SwitchEvent3Ph", py::multiple_inheritance())
449 .def(py::init<CPS::Real, const std::shared_ptr<CPS::Base::Ph3::Switch>,
450 CPS::Bool>());
451
452 //Components
453 py::module mBase = m.def_submodule("base", "base models");
454 addBaseComponents(mBase);
455
456 py::module mDP = m.def_submodule("dp", "dynamic phasor models");
457 addDPComponents(mDP);
458
459 py::module mEMT = m.def_submodule("emt", "electromagnetic-transient models");
460 addEMTComponents(mEMT);
461
462 py::module mSP = m.def_submodule("sp", "static phasor models");
463 mSP.attr("SimNode") = mDP.attr("SimNode");
464 addSPComponents(mSP);
465
466 py::module mSignal = m.def_submodule("signal", "signal models");
467 addSignalComponents(mSignal);
468
469#ifdef VERSION_INFO
470 m.attr("__version__") = VERSION_INFO;
471#else
472 m.attr("__version__") = "dev";
473#endif
474}
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:211
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
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.
static Matrix singlePhaseParameterToThreePhase(Real parameter)
To convert single phase parameters to symmetrical three phase ones.
static MatrixComp singlePhaseVariableToThreePhase(Complex var_1ph)
To convert single phase complex variables (voltages, currents) to symmetrical three phase ones.
SimTerminal< VarType >::Ptr terminal(UInt index)
Get pointer to Terminal.
void connect(typename SimNode< VarType >::List nodes)
Sets all nodes and checks for nominal number of Nodes for this Component.
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 addTearComponent(IdentifiedObject::Ptr component)
Adds component and initializes frequencies.
std::shared_ptr< Type > component(const String &name)
Returns Component by name.
TopologicalNode::List mNodes
List of network nodes.
void addComponents(const IdentifiedObject::List &components)
Add multiple components.
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.
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 run(const Timer::StartClock::duration &startIn=std::chrono::seconds(1))
void doFrequencyParallelization(Bool value)
Compute phasors of different frequencies in parallel.
Definition Simulation.h:211
void logLUTimes()
Write LU decomposition times measurements to log file.
Real next()
Run until next time step.
void addLogger(DataLoggerInterface::Ptr logger)
Add a new data logger.
Definition Simulation.h:249
void setSolverAndComponentBehaviour(Solver::Behaviour behaviour)
set solver and component to initialization or simulation behaviour
Definition Simulation.h:177
CPS::AttributeBase::Ptr getIdObjAttribute(const String &comp, const String &attr)
CHECK: Can these be deleted? getIdObjAttribute + "**attr =" should suffice.
void start()
Start simulation without advancing in time.
void doSteadyStateInit(Bool f)
activate steady state initialization
Definition Simulation.h:222
void addEvent(Event::Ptr e)
Schedule an event in the simulation.
Definition Simulation.h:247
void run()
Run simulation until total time is elapsed.
void logAttribute(String name, CPS::AttributeBase::Ptr attr)
CHECK: Can we store the attribute name / UID intrinsically inside the attribute?
void stop()
Stop simulation including scheduler and interfaces.